Как GPIO отображается в памяти?

Я недавно просматривал драйвер GPIO для pi2, я нашел пространство пользователя pi2 GPIO lib (например, RPi.GPIO 0.5.11 из python) /dev/mem для BCM2708 (начинается с 0x20000000, а GPIO начинается с 0x200000 соответственно) для отображения области памяти пространства пользователя для обработки GPIO. Но я нашел drivers/gpio в Linux исходное дерево предназначено для обработки /sys/class/gpio/*, Я не нашел ничего похожего на сопоставление портов ввода / вывода, как request_io_region а также __io_remap, Мой вопрос: как GPIO для BCM2708 отображается в памяти? Есть другой драйвер? И могу ли я справиться с GPIO просто R&W, чтобы /sys/class/gpio/*?

2 ответа

Решение

Я не нашел ничего похожего на сопоставление портов ввода / вывода, как request_io_region и __io_remap.

ARM не имеет пространства порта ввода / вывода. Все периферийные регистры назначаются адресам в области памяти.

Как GPIO для BCM2708 отображается в памяти?

GPIO обычно реализуются как периферия управляющих регистров, и GPIO в BCM2835 RPi следует этому соглашению. Этот набор контрольного регистра может иметь другое имя; например, Atmel называет эти регистры периферийным устройством параллельного ввода / вывода (PIO).

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

IOW нет единого бита, который можно прочитать и записать, который соответствует GPIO. Для GPIO в специальном регистре должен быть бит для извлечения входного уровня. Есть бит в другом регистре, чтобы установить высокий уровень выхода GPIO, и бит в другом регистре, чтобы установить низкий уровень выхода GPIO.

Есть другой драйвер?

Да. Драйвер pinctrl (управление контактами) является более низким уровнем (то есть ближе к HW), чем GPIO. Это слой pinctrl, который управляет мультиплексированием выводов (т. Е. Используется ли вывод для периферийной функции или в качестве GPIO).
Драйвер pinctrl для SoC (например, drivers/pinctrl/pinctrl-bcm2835.c) здесь вы найдете devm_ioremap_resources () (которая, в свою очередь, вызывает devm_request_mem_region() и devm_ioremap ()) для блока регистров GPIO.

И могу ли я работать с GPIO просто с помощью R&W в /sys/class/gpio/*?

Да. интерфейс sysfs предназначен для доступа к тем контактам, которые не назначены периферийным устройствам.

ДОПОЛНЕНИЕ
Интерфейс sysfs GPIO имеет ограниченные возможности.
Очевидно, есть библиотеки пользовательского пространства для доступа к дополнительным атрибутам выводов (например, включение нагрузочного или понижающего резистора), которые обычно находятся в домене драйвера pinctrl. Обычно такие библиотеки обращаются к аппаратным регистрам PIO напрямую через psuedo-файл /dev/mem. Имейте в виду, что такие методы не являются безопасными и могут мешать работе других драйверов устройств.

Этот ответ не может быть "на четвереньках", так как он просто предоставляет базовый адрес GPIO для Raspberry Pi 2 против как.

Несмотря на это, Raspbian OS на Raspberry Pi 2 предоставляет базовый адрес в 0x3f20,0000,

$ dmesg -H 
[  +0.000749] gpiomem-bcm2835 3f200000.gpiomem: Initialised: Registers at 0x3f200000

Пример сырой сборки ARMv7 с использованием вышеуказанного базового адреса через mmmap позвоните, чтобы мигать светодиод ACT на Raspberry Pi 2 указан в ссылке ниже.

https://github.com/InfinitelyManic/Raspberry-Pi-2

Другие вопросы по тегам