mmap и доступ к регистрам конфигурации GPIO в процессоре ARM - PullRequest
4 голосов
/ 09 октября 2009

Я изо всех сил пытаюсь читать (и записывать) в регистры 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.

Куда я иду не так?

Ответы [ 3 ]

4 голосов
/ 09 октября 2009

mmap на /dev/mem должно работать. Вы пытались запустить свой код от имени пользователя root? Возможно, некоторые меры безопасности не позволяют вашей программе получить доступ к адресному пространству. Также убедитесь, что вы передали правильный физический адрес вашего GPIO-Space.

Подход, который вы использовали, работает на моей ARM-плате Cortex-A8 под Linux без проблем.

Если вы не можете заставить его работать, вы ничего не можете сделать, кроме как найти или написать драйвер устройства для gpio (его написание не , что hard btw.)

Если повезет, кто-то уже сделал это для вас. Существует ли в вашей файловой системе узел с именем /dev/gpio? Если так, у вас уже есть водитель.

Поиск в Google по номеру /dev/gpio даст вам полную информацию о том, как его использовать. Вы также можете найти источник простого драйвера gpio, который вы можете изменить в соответствии со своими потребностями.

2 голосов
/ 27 сентября 2011

Кроме того, если вы используете исходный код ядра с 2009 года и далее, вам следует открыть /dev/mem с установленным флагом O_SYNC, если вы хотите, чтобы доступ к вашей памяти не кэшировался.

1 голос
/ 23 июня 2011

Если вы используете последнюю версию ядра Linux, возможно, он блокирует доступ к устройству /dev/mem. Доступ в режиме пользователя к этому устройству устарел и опасен. Он используется главным образом для доступа в видеопамяти в пользовательском режиме в X. Во встроенных проектах может быть полезно иметь доступ к оборудованию с отображенной памятью (например, GPIO).

Проверьте флаги компиляции ядра на CONFIG_STRICT_DEVMEM или другие флаги, которые ограничивают доступ к /dev/mem. Возможно, по ошибке был заблокирован доступ к этому диапазону памяти.

Однако, как упомянул Нильс, лучшее решение - найти модуль gpio для iMX27 или написать свой собственный.

...