Я изо всех сил пытаюсь читать (и записывать) в регистры HW из пространства пользователя Linux. Цель состоит в том, чтобы настроить некоторые выводы GPIO и иметь возможность устанавливать и считывать эти выводы.
В соответствии со спецификацией процессора (imx27 от Freescale) физический адрес для банка регистров, контролирующего GPIO, равен 0x10015000
Я предположил, что я мог бы использовать что-то вроде этого:
unsigned long *gpio;
fd = open("/dev/mem", O_RDWR);
gpio = (unsigned long *) mmap(0, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x10015000);
Теперь я ожидал, что смогу читать и устанавливать данные в регистры процессора. Проблема в том, что не имеет значения, в каком месте я читаю, я всегда получаю 0.
Например, регистр в физическом местоположении 0x10015220 содержит регистр, показывающий, какие выводы находятся в нас как GPIO. По умолчанию это 0xFFFFFFFF. Читая этот регистр, я ожидал получить что-то отличное от 0:
printf("PTC_GIUS: 0x%08lX\n", gpio[0x220]);
дает PTC_GIUS: 0x00000000
.
Куда я иду не так?