diff options
| -rw-r--r-- | exynos4412_gpios.c | 75 | ||||
| -rw-r--r-- | exynos4412_gpios.h | 15 | ||||
| -rw-r--r-- | exynos4412_gpios_data.c | 41 | ||||
| -rw-r--r-- | exynos4412_gpios_data.h | 7 | ||||
| -rw-r--r-- | main.c | 88 | ||||
| -rw-r--r-- | memory.c | 171 | ||||
| -rw-r--r-- | memory.h | 7 | ||||
| -rw-r--r-- | modem_gpios_data.c | 15 | ||||
| -rw-r--r-- | modem_gpios_data.h | 7 | ||||
| -rw-r--r-- | tests.c | 74 | ||||
| -rw-r--r-- | tests.h | 5 |
11 files changed, 262 insertions, 243 deletions
diff --git a/exynos4412_gpios.c b/exynos4412_gpios.c index e9b4b2f..9da5e41 100644 --- a/exynos4412_gpios.c +++ b/exynos4412_gpios.c @@ -25,44 +25,9 @@ #include "exynos4412_gpios.h" #include "exynos4412_gpios_data.h" -void *mmap_gpio_hardware_blocks(int debug, char *devmem, int fd, - size_t page_size) +int dump_gpio_infos(int debug, struct memory_mapping *memory_mapping, + char *bank, uint32_t gpio_offset) { - uint32_t base_addr; - uint32_t *virt_addr; - off_t len; - int rc; - - /* GPIO_right: base_addr: 0x11000000 len: 0x400000 - * GPIO_left: base_addr: 0x11400000 len: 0x400000 - */ - base_addr = 0x11000000u; - len = 0x800000; - - /* virt_addr points to the beining of the file, so to the physical - * address 0 - */ - virt_addr = mmap(0, len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, - base_addr); - if (virt_addr == MAP_FAILED) { - rc = errno; - printf("mmap on %s failed with error %d: %s\n", - devmem, rc, strerror(rc)); - errno = rc; - return NULL; - } - - if (debug) - printf("%s: mapped address 0 @ %p\n", __func__, virt_addr); - - return virt_addr; -} - -int dump_gpio_infos(int debug, char *devmem, int fd, size_t page_size, - void *gpio_hardware_blocks_addr, char *bank, - uint32_t gpio_offset) -{ - uint32_t *addr; int rc; int i = 0; off_t offset = 0; @@ -78,18 +43,11 @@ int dump_gpio_infos(int debug, char *devmem, int fd, size_t page_size, } - addr = gpio_hardware_blocks_addr + offset; - - if (debug) { - printf("%s: Mapped at %p\n", __func__, addr); - print_gpio_banks_data(); - } - printf("%s: %s[%d]: {\n", __func__, bank, gpio_offset); for (i=0; i< sizeof(gpio_registers) / sizeof (char*); i++) { rc = decode_gpio_data(debug, bank, gpio_offset, - gpio_registers[i], addr); + gpio_registers[i], memory_mapping); if (rc == -1) { rc = errno; printf("%s:" @@ -97,14 +55,13 @@ int dump_gpio_infos(int debug, char *devmem, int fd, size_t page_size, " bank=%s," " gpio_offset=%d," " gpio_register_name=%s," - " addr=%p);" + " memory_mapping);" " failed with with error %d: %s\n", __func__, debug, bank, gpio_offset, gpio_registers[i], - addr, rc, strerror(rc)); return -1; } @@ -116,11 +73,9 @@ int dump_gpio_infos(int debug, char *devmem, int fd, size_t page_size, return 0; } -int gpio_get_direction(int debug, char *devmem, int fd, size_t page_size, - void *gpio_hardware_blocks_addr, +int gpio_get_direction(int debug, struct memory_mapping *memory_mapping, char *bank, uint32_t gpio_offset) { - uint32_t *addr; int rc; int err; off_t offset = 0; @@ -133,16 +88,14 @@ int gpio_get_direction(int debug, char *devmem, int fd, size_t page_size, return -1; } - addr = gpio_hardware_blocks_addr + offset; - - rc = decode_gpio_data(debug, bank, gpio_offset, "con", addr); + rc = decode_gpio_data(debug, bank, gpio_offset, "con", memory_mapping); if (rc == -1) err = errno; if(debug) printf("%s: decode_gpio_data(debug=%d, bank=%s, gpio_offset=%d," - " gpio_register_name=%s, addr=%p);\n", - __func__, debug, bank, gpio_offset, "con", addr); + " gpio_register_name=%s, memory_mapping);\n", + __func__, debug, bank, gpio_offset, "con"); if (rc == -1) { printf("%s: decode_gpio_data failed with error %d: %s\n", @@ -153,11 +106,9 @@ int gpio_get_direction(int debug, char *devmem, int fd, size_t page_size, return rc; } -int gpio_get_output_value(int debug, char *devmem, int fd, size_t page_size, - void *gpio_hardware_blocks_addr, +int gpio_get_output_value(int debug, struct memory_mapping *memory_mapping, char *bank, uint32_t gpio_offset) { - uint32_t *addr; int rc; off_t offset = 0; @@ -172,25 +123,21 @@ int gpio_get_output_value(int debug, char *devmem, int fd, size_t page_size, if (debug) printf("%s: offset for %s: 0x%lx\n\n", __func__, bank, offset); - addr = gpio_hardware_blocks_addr + offset; - rc = decode_gpio_data(debug, bank, gpio_offset, - "dat", addr); + "dat", memory_mapping); if (rc == -1) { rc = errno; printf("%s:" " decode_gpio_data(debug=%d," " bank=%s," " gpio_offset=%d," - " gpio_register_name=%s," - " addr=%p);" + " gpio_register_name=%s, memory_mapping);" " failed with with error %d: %s\n", __func__, debug, bank, gpio_offset, "dat", - addr, rc, strerror(rc)); return -1; } diff --git a/exynos4412_gpios.h b/exynos4412_gpios.h index 754aab0..a62dca1 100644 --- a/exynos4412_gpios.h +++ b/exynos4412_gpios.h @@ -20,17 +20,14 @@ #include <stdint.h> -int dump_gpio_infos(int debug, char *devmem, int fd, size_t page_size, - void *gpio_hardware_blocks_addr, char *bank, - uint32_t gpio_offset); -int gpio_get_direction(int debug, char *devmem, int fd, size_t page_size, - void *gpio_hardware_blocks_addr, +#include "memory.h" + +int dump_gpio_infos(int debug, struct memory_mapping *memory_mapping, + char *bank, uint32_t gpio_offset); +int gpio_get_direction(int debug, struct memory_mapping *memory_mapping, char *bank, uint32_t gpio_offset); -int gpio_get_output_value(int debug, char *devmem, int fd, size_t page_size, - void *gpio_hardware_blocks_addr, +int gpio_get_output_value(int debug, struct memory_mapping *memory_mapping, char *bank, uint32_t gpio_offset); -void *mmap_gpio_hardware_blocks(int debug, char *devmem, int fd, - size_t page_size); #endif /* EXYNOS4412_GPIOS_H */ diff --git a/exynos4412_gpios_data.c b/exynos4412_gpios_data.c index ac2f77d..deed252 100644 --- a/exynos4412_gpios_data.c +++ b/exynos4412_gpios_data.c @@ -379,13 +379,14 @@ void print_gpio_banks_data(void) } int decode_gpio_data(int debug, char *bank, uint32_t gpio_offset, - char* gpio_register_name, uint32_t *virt_addr) + char* gpio_register_name, + struct memory_mapping *memory_mapping) { struct gpio_bank_data *gpio_bank_data; struct gpio_register_data *gpio_register_data; - - uint32_t *addr; - uint32_t register_value; + unsigned int addr; + unsigned int register_value; + int rc; gpio_bank_data = get_gpio_bank_data(bank); if (gpio_bank_data == NULL) { @@ -399,12 +400,28 @@ int decode_gpio_data(int debug, char *bank, uint32_t gpio_offset, return -1; } - addr = virt_addr + gpio_bank_data->offset + gpio_register_data->offset; - register_value = *virt_addr; + addr = get_gpio_register_offset(debug, bank, gpio_register_name); + if (addr == -1) { + printf("%s: get_gpio_register_offset failed with error %d\n", + __func__, addr); + return -1; + } + + if (debug) + printf("%s: register address: 0x%llx\n", + __func__, (long long int)addr); + + rc = read_word(debug, memory_mapping, addr, ®ister_value); + if (rc == -1) { + rc = errno; + printf("%s: read_word failed with error %d: %s\n", + __func__, rc, strerror(rc)); + return -1; + } if (debug) - printf("%s: %s: offset 0x%x value: 0x%x\n", __func__, bank, - addr - virt_addr, register_value); + printf("%s: %s @ 0x%x = 0x%x\n", __func__, bank, + addr, register_value); return gpio_register_data->get_value(register_value, gpio_offset); } @@ -427,7 +444,6 @@ off_t get_gpio_register_offset(int debug, char *gpio_bank_name, { struct gpio_bank_data *gpio_bank_data; struct gpio_register_data *gpio_register_data; - off_t gpio_hardware_block_offset = 0; off_t offset = 0; gpio_bank_data = get_gpio_bank_data(gpio_bank_name); @@ -448,10 +464,9 @@ off_t get_gpio_register_offset(int debug, char *gpio_bank_name, return -1; } - if (gpio_bank_data->base == 0x11400000) - gpio_hardware_block_offset = 0x400000; - - offset = gpio_hardware_block_offset + gpio_bank_data->offset + gpio_register_data->offset; + offset = gpio_bank_data->base + \ + gpio_bank_data->offset + \ + gpio_register_data->offset; return offset; } diff --git a/exynos4412_gpios_data.h b/exynos4412_gpios_data.h index c66ae8b..267b045 100644 --- a/exynos4412_gpios_data.h +++ b/exynos4412_gpios_data.h @@ -18,6 +18,8 @@ #ifndef EXYNOS4412_GPIOS_DATA_H #define EXYNOS4412_GPIOS_DATA_H +#include "memory.h" + struct gpio_bank_data { char *name; uint32_t nr_gpios; @@ -86,14 +88,13 @@ enum gpio_power_down { }; int decode_gpio_data(int debug, char *bank, uint32_t gpio_offset, - char* gpio_register_name, uint32_t *virt_addr); + char* gpio_register_name, + struct memory_mapping *memory_mapping); int get_bank_gpio_numbers(int debug, char *gpio_bank_name); struct gpio_bank_data *get_gpio_bank_data(char *bank); off_t get_gpio_register_offset(int debug, char *gpio_bank_name, char *register_name); char *gpio_data_str(char* gpio_register_name, uint32_t register_value); -void *mmap_gpio_bank(int debug, char *devmem, int fd, size_t page_size, - char *bank); void print_gpio_banks_data(void); #endif /* EXYNOS4412_GPIOS_DATA_H */ @@ -29,6 +29,7 @@ #include "compatible_devices.h" #include "exynos4412_gpios.h" #include "exynos4412_gpios_data.h" +#include "memory.h" #include "modem_gpios_data.h" #include "tests.h" @@ -51,13 +52,11 @@ int usage(char* progname) return 0; } -int dump_flash_gpio_status(int debug, char* devmem, int fd, size_t page_size, - void *gpio_hardware_blocks_addr) +int dump_flash_gpio_status(int debug, struct memory_mapping *memory_mapping) { int rc; - rc = dump_gpio_infos(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr, "gpj1", 1); + rc = dump_gpio_infos(debug, memory_mapping, "gpj1", 1); if (rc == -1) { printf("dump_gpio_infos failed with error %d\n", rc); @@ -68,13 +67,11 @@ int dump_flash_gpio_status(int debug, char* devmem, int fd, size_t page_size, return 0; } -int dump_flash_gps_status(int debug, char* devmem, int fd, size_t page_size, - void *gpio_hardware_blocks_addr) +int dump_flash_gps_status(int debug, struct memory_mapping *memory_mapping) { int rc; - rc = dump_gpio_infos(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr, "gpl2", 1); + rc = dump_gpio_infos(debug, memory_mapping, "gpl2", 1); if (rc == -1) { printf("dump_gpio_infos failed with error %d\n", rc); @@ -82,8 +79,7 @@ int dump_flash_gps_status(int debug, char* devmem, int fd, size_t page_size, return EX_UNAVAILABLE; } - rc = dump_gpio_infos(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr, "gpl2", 2); + rc = dump_gpio_infos(debug, memory_mapping, "gpl2", 2); if (rc == -1) { printf("dump_gpio_infos failed with error %d\n", rc); @@ -94,8 +90,8 @@ int dump_flash_gps_status(int debug, char* devmem, int fd, size_t page_size, return 0; } -int dump_gpio_bank_status(int debug, char* devmem, int fd, size_t page_size, - void *gpio_hardware_blocks_addr, char* bank) +int dump_gpio_bank_status(int debug, struct memory_mapping *memory_mapping, + char* bank) { int i; int nr_gpios; @@ -112,8 +108,7 @@ int dump_gpio_bank_status(int debug, char* devmem, int fd, size_t page_size, } for (i=0; i < nr_gpios; i++) { - rc = dump_gpio_infos(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr, bank, i); + rc = dump_gpio_infos(debug, memory_mapping, bank, i); if (rc == -1) { printf("dump_gpio_infos failed with error %d\n", rc); @@ -127,13 +122,10 @@ int dump_gpio_bank_status(int debug, char* devmem, int fd, size_t page_size, int main(int argc, char *argv[]) { - int fd = 0; - int rc = 0; - int debug = 0; + struct memory_mapping *memory_mapping; - char *devmem = "/dev/mem"; - size_t page_size = 4096; - void *gpio_hardware_blocks_addr; + int debug = 1; + int rc; assert(argc >= 1); @@ -147,21 +139,6 @@ int main(int argc, char *argv[]) return 0; } - /* - * TODO: check if root or tell the user to become root in case or - * access error - */ - - fd = open(devmem, O_RDWR | O_SYNC); - if (fd == -1) { - rc = errno; - printf("Opening %s failed with error %d: %s\n", - devmem, rc, strerror(rc)); - - /* TODO: return more precise error */ - return EX_UNAVAILABLE; - } - if (strcmp("flash", argv[1]) && strcmp("gpl1", argv[1]) && strcmp("gpl2", argv[1]) && @@ -173,45 +150,36 @@ int main(int argc, char *argv[]) return EX_USAGE; } - gpio_hardware_blocks_addr = mmap_gpio_hardware_blocks(debug, devmem, fd, - page_size); - if (gpio_hardware_blocks_addr == NULL) { - /* mmap_gpio_bank already prints an error */ - goto end; + rc = init_memory_mapping(debug, &memory_mapping); + if (rc == -1) { + printf("%s: init_memory_mapping failed with error %d\n", + __func__, rc); + return EX_UNAVAILABLE; } if (argc == 2 && !strcmp("flash", argv[1])) { - return dump_flash_gpio_status(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr); + return dump_flash_gpio_status(debug, memory_mapping); } else if (argc == 2 && !strcmp("gpl1", argv[1])) { - return dump_gpio_bank_status(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr, "gpl1"); + return dump_gpio_bank_status(debug, memory_mapping, "gpl1"); } else if (argc == 2 && !strcmp("gpl2", argv[1])) { - return dump_gpio_bank_status(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr, "gpl2"); + return dump_gpio_bank_status(debug, memory_mapping, "gpl2"); } else if (argc == 2 && !strcmp("gps", argv[1])) { - return dump_flash_gps_status(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr); + return dump_flash_gps_status(debug, memory_mapping); } else if (argc == 2 && !strcmp("gpy0", argv[1])) { - return dump_gpio_bank_status(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr, "gpy0"); + return dump_gpio_bank_status(debug, memory_mapping, "gpy0"); } else if (argc == 2 && !strcmp("modem", argv[1])) { - return dump_modem_gpio_infos(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr); + return dump_modem_gpio_infos(debug, memory_mapping); } else if (argc == 2 && !strcmp("test", argv[1])) { - return run_tests(debug, devmem, fd, page_size, gpio_hardware_blocks_addr); + return run_tests(debug, memory_mapping); } else { usage(argv[0]); return EX_USAGE; } -end: - rc = close(fd); - if (rc == -1) { - rc = errno; - printf("Closing %s failed with error %d: %s\n", - devmem, rc, strerror(rc)); - /* TODO: return more precise error */ + rc = exit_memory_mapping(debug, memory_mapping); + if (rc == -1) { + printf("%s: exit_memory_mapping failed with error %d\n", + __func__, rc); return EX_UNAVAILABLE; } @@ -15,10 +15,12 @@ * along with this program. If not, see <https://www.gnu.org/licenses/>. */ +#include <assert.h> #include <errno.h> #include <fcntl.h> #include <stdbool.h> #include <stdio.h> +#include <stdlib.h> #include <string.h> #include <unistd.h> @@ -27,30 +29,55 @@ #include "memory.h" +struct gpio_block { + off_t mmap_phys_base; + off_t *mmap_virt_base; + off_t mmap_length; +}; + struct memory_mapping { - unsigned int *mmap_phys_base; - unsigned int *mmap_virt_base; - unsigned int mmap_length; + struct gpio_block gpio_left; + struct gpio_block gpio_right; }; -static bool addr_is_valid(struct memory_mapping *memory_mapping, - unsigned int *addr) +static bool addr_is_gpioleft(struct memory_mapping *memory_mapping, off_t addr) +{ + if (addr < memory_mapping->gpio_left.mmap_phys_base) + return false; + + if (addr > (memory_mapping->gpio_left.mmap_phys_base + + memory_mapping->gpio_left.mmap_length)) + return false; + + return true; +} + +static bool addr_is_gpioright(struct memory_mapping *memory_mapping, off_t addr) { - if (addr < memory_mapping->mmap_phys_base) + if (addr < memory_mapping->gpio_right.mmap_phys_base) return false; - if (addr > (memory_mapping->mmap_phys_base + memory_mapping->mmap_length)) + if (addr > (memory_mapping->gpio_right.mmap_phys_base + + memory_mapping->gpio_right.mmap_length)) return false; return true; } -int init_memory_mapping(int debug, struct memory_mapping *memory_mapping, - off_t addr, size_t length) +int init_memory_mapping(int debug, struct memory_mapping **memory_mapping_pp) { int fd; int rc; char *devmem = "/dev/mem"; + struct memory_mapping *memory_mapping; + + memory_mapping = malloc(sizeof(struct memory_mapping)); + if (memory_mapping == NULL) { + rc = errno; + printf("%s: malloc failed with error %d: %s\n", + __func__, rc, strerror(rc)); + return -1; + } fd = open(devmem, O_RDWR | O_SYNC); if (fd == -1) { @@ -60,15 +87,40 @@ int init_memory_mapping(int debug, struct memory_mapping *memory_mapping, return -1; } - memory_mapping->mmap_virt_base = mmap(0, length, PROT_READ|PROT_WRITE, - MAP_SHARED, fd, addr); - if (memory_mapping->mmap_virt_base == MAP_FAILED) { + memory_mapping->gpio_right.mmap_phys_base = 0x11000000UL; + memory_mapping->gpio_right.mmap_length = 0x400000UL; + + memory_mapping->gpio_right.mmap_virt_base = mmap( + 0, + memory_mapping->gpio_right.mmap_length, + PROT_READ|PROT_WRITE, + MAP_SHARED, fd, + memory_mapping->gpio_right.mmap_phys_base); + + if (memory_mapping->gpio_right.mmap_virt_base == MAP_FAILED) { rc = errno; printf("%s: mmap on %s failed with error %d: %s\n", __func__, devmem, rc, strerror(rc)); return -1; } + memory_mapping->gpio_left.mmap_phys_base = 0x11400000UL; + memory_mapping->gpio_left.mmap_length = 0x400000UL; + + memory_mapping->gpio_left.mmap_virt_base = mmap( + 0, + memory_mapping->gpio_left.mmap_length, + PROT_READ|PROT_WRITE, + MAP_SHARED, fd, + memory_mapping->gpio_left.mmap_phys_base); + + if (memory_mapping->gpio_left.mmap_virt_base == MAP_FAILED) { + rc = errno; + printf("%s: mmap on %s failed with error %d: %s\n", + __func__, devmem, rc, strerror(rc)); + return -1; + } + rc = close(fd); if (rc == -1) { rc = errno; @@ -77,28 +129,101 @@ int init_memory_mapping(int debug, struct memory_mapping *memory_mapping, return -1; } - if (debug) - printf("%s: mapped address 0 @ %p\n", __func__, - memory_mapping->mmap_virt_base); + *memory_mapping_pp = memory_mapping; + + if (debug) { + printf("%s: %s(%p) mapped at %p. Length: %p\n", + __func__, + "gpio_right", + (void*)memory_mapping->gpio_right.mmap_phys_base, + (void*)memory_mapping->gpio_right.mmap_virt_base, + (void*)memory_mapping->gpio_right.mmap_length); + printf("%s: %s(%p) mapped at %p. Length: %p\n", + __func__, + "gpio_left", + (void*)memory_mapping->gpio_left.mmap_phys_base, + (void*)memory_mapping->gpio_left.mmap_virt_base, + (void*)memory_mapping->gpio_left.mmap_length); + } + return 0; +} + + +int exit_memory_mapping(int debug, struct memory_mapping *memory_mapping) +{ + int rc; + + rc = munmap(memory_mapping->gpio_right.mmap_virt_base, + memory_mapping->gpio_right.mmap_length); + if (rc == -1) { + rc = errno; + printf("%s: munmap of %s failed with error %d: %s\n", + __func__, "gpio_right", rc, strerror(rc)); + return -1; + } + + rc = munmap(memory_mapping->gpio_left.mmap_virt_base, + memory_mapping->gpio_left.mmap_length); + if (rc == -1) { + rc = errno; + printf("%s: munmap of %s failed with error %d: %s\n", + __func__, "gpio_left", rc, strerror(rc)); + return -1; + } + + free(memory_mapping); return 0; } -int read_word(int debug, struct memory_mapping *memory_mapping, - unsigned int addr, unsigned int *result) +off_t *phys_to_virt(int debug, struct memory_mapping *memory_mapping, off_t phys_addr) { - unsigned int *virt_addr; + off_t offset = 0; + + if (addr_is_gpioleft(memory_mapping, phys_addr)) { + /* we mmap with mmap_phys_base as offset, and the resulting + * virtual address points directly at mmap_phys_base + */ + offset = phys_addr - memory_mapping->gpio_left.mmap_phys_base; + + if (debug) + printf("%s: addrress %p is valid. Offset: %p\n", + __func__, (void*)phys_addr, (void*)offset); + + return memory_mapping->gpio_left.mmap_virt_base + offset; + } else if (addr_is_gpioright(memory_mapping, phys_addr)) { + /* we mmap with mmap_phys_base as offset, and the resulting + * virtual address points directly at mmap_phys_base + */ + offset = phys_addr - memory_mapping->gpio_right.mmap_phys_base; + + if (debug) + printf("%s: addrress %p is valid. Offset: %p\n", + __func__, (void*)phys_addr, (void*)offset); + + return memory_mapping->gpio_right.mmap_virt_base + offset; + } else { + printf("%s: failed: invalid address %p\n", + __func__, (void*)phys_addr); + errno = EDOM; + return 0; + } +} - if (!addr_is_valid(memory_mapping, (unsigned int *)addr)) - return -EDOM; +int read_word(int debug, struct memory_mapping *memory_mapping, + off_t addr, unsigned int *result) +{ + off_t *virt_addr; - virt_addr = memory_mapping->mmap_virt_base + addr; + virt_addr = phys_to_virt(debug, memory_mapping, addr); + if (virt_addr == NULL) + return -1; *result = *virt_addr; if (debug) - printf("%s: debug=%d, addr=0x%x, result=0x%x\n", - __func__, debug, addr, *result); + printf("%s: addr=0x%llx, result=0x%x\n", + __func__, (long long int)addr, *result); return 0; } @@ -20,9 +20,10 @@ struct memory_mapping; -int init_memory_mapping(int debug, struct memory_mapping *memory_mapping, - off_t addr, size_t length); +int init_memory_mapping(int debug, struct memory_mapping **memory_mapping_pp); +int exit_memory_mapping(int debug, struct memory_mapping *memory_mapping); + int read_word(int debug, struct memory_mapping *memory_mapping, - unsigned int addr, unsigned int *result); + off_t addr, unsigned int *result); #endif /* MEMORY_H */ diff --git a/modem_gpios_data.c b/modem_gpios_data.c index 208f11f..c14dece 100644 --- a/modem_gpios_data.c +++ b/modem_gpios_data.c @@ -21,6 +21,7 @@ #include <sysexits.h> #include "exynos4412_gpios.h" +#include "memory.h" #include "modem_gpios_data.h" struct modem_gpio_data modem_gpio_datas[] = { @@ -126,9 +127,8 @@ struct modem_gpio_data *get_modem_gpio_data_by_dt_name(char *dt_name) return NULL; } -int dump_modem_gpio_infos_by_dt_name(int debug, char *devmem, int fd, - size_t page_size, - void *gpio_hardware_blocks_addr, +int dump_modem_gpio_infos_by_dt_name(int debug, + struct memory_mapping *memory_mapping, char *dt_name) { struct modem_gpio_data *modem_gpio_data; @@ -137,15 +137,13 @@ int dump_modem_gpio_infos_by_dt_name(int debug, char *devmem, int fd, if (modem_gpio_data == NULL) return -1; - return dump_gpio_infos(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr, + return dump_gpio_infos(debug, memory_mapping, modem_gpio_data->bank, modem_gpio_data->gpio_offset); } -int dump_modem_gpio_infos(int debug, char* devmem, int fd, size_t page_size, - void *gpio_hardware_blocks_addr) +int dump_modem_gpio_infos(int debug, struct memory_mapping *memory_mapping) { int i = 0; @@ -158,8 +156,7 @@ int dump_modem_gpio_infos(int debug, char* devmem, int fd, size_t page_size, printf("%s: dump_gpio_infos: %s\n", __func__, modem_gpio_datas[i].dt_gpio_name); - rc = dump_gpio_infos(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr, + rc = dump_gpio_infos(debug, memory_mapping, modem_gpio_datas[i].bank, modem_gpio_datas[i].gpio_offset); diff --git a/modem_gpios_data.h b/modem_gpios_data.h index 0e8a3dd..18f34bf 100644 --- a/modem_gpios_data.h +++ b/modem_gpios_data.h @@ -31,11 +31,8 @@ struct modem_gpio_data { char *dt_gpio_name; }; -int dump_modem_gpio_infos(int debug, char* devmem, int fd, size_t page_size, - void *gpio_hardware_blocks_addr); -int dump_modem_gpio_infos_by_dt_name(int debug, char *devmem, int fd, - size_t page_size, - void *gpio_hardware_blocks_addr, +int dump_modem_gpio_infos(int debug, struct memory_mapping *memory_mapping); +int dump_modem_gpio_infos_by_dt_name(int debug, struct memory_mapping *memory_mapping, char *dt_name); #endif /* MODEM_GPIOS_DATA_H */ @@ -29,6 +29,7 @@ #include "exynos4412_gpios.h" #include "exynos4412_gpios_data.h" +#include "memory.h" #include "tests.h" static int run_command(int debug, char *command) @@ -59,9 +60,8 @@ static int run_command(int debug, char *command) } } -static int test_output_value_with_libgpiod(int debug, char *devmem, int fd, - size_t page_size, - void *gpio_hardware_blocks_addr, +static int test_output_value_with_libgpiod(int debug, + struct memory_mapping *memory_mapping, char *bank, int gpio_offset) { char *gpioset_high_command; @@ -83,13 +83,9 @@ static int test_output_value_with_libgpiod(int debug, char *devmem, int fd, free(gpioset_high_command); - rc = gpio_get_direction(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr, - bank, gpio_offset); + rc = gpio_get_direction(debug, memory_mapping, bank, gpio_offset); assert (rc == GPIO_OUTPUT); - rc = gpio_get_output_value(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr, - bank, gpio_offset); + rc = gpio_get_output_value(debug, memory_mapping, bank, gpio_offset); assert (rc == GPIO_VALUE_HIGH); rc = asprintf(&gpioset_low_command, "gpioset %s %d=0", bank, @@ -104,14 +100,10 @@ static int test_output_value_with_libgpiod(int debug, char *devmem, int fd, rc = run_command(debug, gpioset_low_command); assert(rc == 0); - rc = gpio_get_direction(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr, - bank, gpio_offset); + rc = gpio_get_direction(debug, memory_mapping, bank, gpio_offset); assert (rc == GPIO_OUTPUT); - rc = gpio_get_output_value(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr, - bank, gpio_offset); + rc = gpio_get_output_value(debug, memory_mapping, bank, gpio_offset); assert (rc == GPIO_VALUE_LOW); free(gpioset_low_command); @@ -119,9 +111,8 @@ static int test_output_value_with_libgpiod(int debug, char *devmem, int fd, return 0; } -static int test_flash_with_devmem2(int debug, char *devmem, int fd, - size_t page_size, - void *gpio_hardware_blocks_addr) +static int test_flash_with_devmem2(int debug, + struct memory_mapping *memory_mapping) { int rc; @@ -141,9 +132,7 @@ static int test_flash_with_devmem2(int debug, char *devmem, int fd, /* GPJ1CON[4:7] with bit 4 to 7 at 0 => 0xnn0n (n == don't care) */ rc = run_command(debug, "devmem2 0x11400260 w 0x2000"); assert(rc == 0); - rc = gpio_get_direction(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr, - "gpj1", 1); + rc = gpio_get_direction(debug, memory_mapping, "gpj1", 1); assert (rc == GPIO_INPUT); printf("[ OK ] devmem2 GPIO input test\n"); @@ -153,9 +142,7 @@ static int test_flash_with_devmem2(int debug, char *devmem, int fd, /* GPJ1CON[4:7] with bit 1 @ 1 and the rest at 0 => 1<<5 == 0x20 */ rc = run_command(debug, "devmem2 0x11400260 w 0x2020"); assert(rc == 0); - rc = gpio_get_direction(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr, - "gpj1", 1); + rc = gpio_get_direction(debug, memory_mapping, "gpj1", 1); assert (rc == GPIO_OUTPUT); printf("[ OK ] devmem2 GPIO output test\n"); @@ -165,9 +152,7 @@ static int test_flash_with_devmem2(int debug, char *devmem, int fd, printf(" Starting devmem2 GPIO output low test\n"); rc = run_command(debug, "devmem2 0x11400264 w 0"); assert(rc == 0); - rc = gpio_get_output_value(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr, - "gpj1", 1); + rc = gpio_get_output_value(debug, memory_mapping, "gpj1", 1); assert (rc == GPIO_VALUE_LOW); printf("[ OK ] devmem2 GPIO output low test\n"); @@ -177,9 +162,7 @@ static int test_flash_with_devmem2(int debug, char *devmem, int fd, printf(" Starting devmem2 GPIO output high test\n"); rc = run_command(debug, "devmem2 0x11400264 w 2"); assert(rc == 0); - rc = gpio_get_output_value(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr, - "gpj1", 1); + rc = gpio_get_output_value(debug, memory_mapping, "gpj1", 1); assert (rc == GPIO_VALUE_HIGH); printf("[ OK ] devmem2 GPIO output high test\n"); @@ -189,9 +172,7 @@ static int test_flash_with_devmem2(int debug, char *devmem, int fd, printf(" Starting devmem2 GPIO output low test\n"); rc = run_command(debug, "devmem2 0x11400264 w 0"); assert(rc == 0); - rc = gpio_get_output_value(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr, - "gpj1", 1); + rc = gpio_get_output_value(debug, memory_mapping, "gpj1", 1); assert (rc == GPIO_VALUE_LOW); printf("[ OK ] devmem2 GPIO output low test\n"); @@ -199,9 +180,8 @@ static int test_flash_with_devmem2(int debug, char *devmem, int fd, } -static int test_direction_with_libgpiod(int debug, char *devmem, int fd, - size_t page_size, - void *gpio_hardware_blocks_addr, +static int test_direction_with_libgpiod(int debug, + struct memory_mapping *memory_mapping, char *bank, int gpio_offset) { char *gpioget_command; @@ -222,9 +202,7 @@ static int test_direction_with_libgpiod(int debug, char *devmem, int fd, free(gpioget_command); - rc = gpio_get_direction(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr, - bank, gpio_offset); + rc = gpio_get_direction(debug, memory_mapping, bank, gpio_offset); assert (rc == GPIO_INPUT); rc = asprintf(&gpioset_command, "gpioset %s %d=1", bank, @@ -239,9 +217,7 @@ static int test_direction_with_libgpiod(int debug, char *devmem, int fd, rc = run_command(debug, gpioset_command); assert(rc == 0); - rc = gpio_get_direction(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr, - bank, gpio_offset); + rc = gpio_get_direction(debug, memory_mapping, bank, gpio_offset); assert (rc == GPIO_OUTPUT); free(gpioset_command); @@ -249,8 +225,7 @@ static int test_direction_with_libgpiod(int debug, char *devmem, int fd, return 0; } -int run_tests(int debug, char *devmem, int fd, size_t page_size, - void *gpio_hardware_blocks_addr) +int run_tests(int debug, struct memory_mapping *memory_mapping) { bool has_devmem2; bool has_gpioget; @@ -261,14 +236,10 @@ int run_tests(int debug, char *devmem, int fd, size_t page_size, has_gpioset = device_has_gpioset(debug); if (has_gpioget && has_gpioset) { - test_direction_with_libgpiod(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr, - "gpj1", 1); + test_direction_with_libgpiod(debug, memory_mapping, "gpj1", 1); printf("[ OK ] libgpiod GPIO direction test\n"); - test_output_value_with_libgpiod(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr, - "gpj1", 1); + test_output_value_with_libgpiod(debug, memory_mapping, "gpj1", 1); printf("[ OK ] libgpiod GPIO output value test\n"); } else { if (!has_gpioget) @@ -281,8 +252,7 @@ int run_tests(int debug, char *devmem, int fd, size_t page_size, } if (has_devmem2) { - test_flash_with_devmem2(debug, devmem, fd, page_size, - gpio_hardware_blocks_addr); + test_flash_with_devmem2(debug, memory_mapping); } else { printf("[ !! ] devmem2 not found: skipping" " devmem2 direction and output tests\n"); @@ -20,7 +20,8 @@ #include <stddef.h> -int run_tests(int debug, char *devmem, int fd, size_t page_size, - void *gpio_hardware_blocks_addr); +#include "memory.h" + +int run_tests(int debug, struct memory_mapping *memory_mapping); #endif /* TESTS_H */ |
