Использование GPIO (светодиодов) для доски

Пытаюсь поднять кастомную плату с OMAP L132. Почти каждый раз что-то падает перед серийным дисплеем после «загрузки ядра». Я не мог понять причину сбоя из log_buf (выводы printk), поэтому я пытался (и до сих пор пытаюсь) использовать светодиоды, которые у меня есть. на борту. Светодиоды подключены через GPIO. Насколько я понимаю, ядро ​​​​не может напрямую обращаться к физической памяти, и мне нужно пройти какое-то сопоставление с виртуальным адресом ядра. Однако, когда я пытаюсь настроить GPIO в функции start_kernel, происходит сбой. ioremap(...), сбой gpio_direction_output(...) с ошибкой относительно SLUB (невозможно выделить узел памяти -1; SLUB: Genslabs=11, HWalign=32, Order=0-3, MinObjects=0, ЦП=1, узлы=1) Я просто пытаюсь получить доступ к регистрам для управления GPIO, какую инициализацию я здесь пропустил? Какова самая ранняя точка, к которой GPIO может получить доступ в ядре? Должен ли я инициализировать что-то в uboot для этого?

Заранее спасибо, Арье


person ariebarie    schedule 30.11.2014    source источник


Ответы (2)


по-видимому, есть некоторая инициализация, которую необходимо пройти, прежде чем к регистрам GPIO (или любому регистру) можно будет легко получить доступ. перед вызовом функции rest_init нет проблем с инициализацией и игрой с этими регистрами.

person ariebarie    schedule 03.12.2014

Прежде всего, я бы порекомендовал вам изучить механизм ядра "earlyprintk", он должен помочь. Если в вашем случае это неприменимо, читайте дальше.

Если вы хотите управлять GPIO напрямую через регистры (например, в приложении на «голом железе», т. е. без использования фреймворка GPIO ядра), вам следует сделать следующее:

  1. Включите часы для вашего модуля GPIO (см. главу «Питание, сброс и управление часами» в вашем TRM)
  2. Настройте мультиплексоры контактов, чтобы контакты (которые вы подключили к своим светодиодам) были подключены к модулю GPIO (см. «Модуль управления» в вашем TRM)
  3. Поскольку ядро ​​работает только с виртуальными адресами, вам необходимо получить виртуальные адреса для ваших регистров GPIO с помощью функции ioremap().
  4. Теперь вы сможете использовать макросы iowrite32() и ioread32() для взаимодействия с виртуальными адресами регистров GPIO, которые вы переназначили на предыдущем шаге.

AFAIR, описанную выше процедуру можно найти в главе GPIO (точнее, в подразделе «Руководство по программированию») в TRM для вашей SoC.

Если вы хотите использовать инфраструктуру GPIO ядра, вам также необходимо сначала убедиться, что часы и мультиплексоры настроены правильно. Затем вы должны найти драйвер GPIO для вашего SoC (примерно так: http://lxr.free-electrons.com/source/drivers/gpio/gpio-omap.c) и включите его в своей конфигурации (возможно, он должен быть включен по умолчанию, если вы используете defconfig для своей платы). Теперь вы можете использовать функции инфраструктуры GPIO только тогда, когда ваш драйвер GPIO загружен. Драйвер "gpio-omap" проверяется в postcore_initcall (это уровень 2), поэтому вы можете начать использовать его только со следующего уровня initcall. AFAIU, в вашем случае этого недостаточно, потому что вы пытаетесь отладить ядро ​​​​на самых ранних уровнях initcall.

person Sam Protsenko    schedule 15.02.2015