Как 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 указан в ссылке ниже.