Я собираю LineageOS 14.1 из исходников и интегрирую драйвер расширителя GPIO PCF857x в свое ядро Linux (версия ~ 3.2 Linux). Сам драйвер (pcf857x.c, pcf857x.h) уже включен в ядро. Поэтому мне просто нужно настроить его, чтобы указать мой конкретный расширитель GPIO (PCF8574). Поскольку он построен на более старой версии ядра Linux, я использую файл платы для установки этого драйвера.
/* PCF8574 GPIO expander platform data */
static struct pcf857x_platform_data pcf857x_data[] = {
{
.gpio_base = 300,
},
};
/* I2C1 */
static struct i2c_board_info i2c_devs1[] __initdata = {
{
I2C_BOARD_INFO("pcf857x", 0x20),
.type = "pcf8574",
.platform_data = &pcf857x_data[0],
},
};
Когда я в конце концов прошиваю сборку LineageOS на свое оборудование (Samsung Galaxy S2 AT&T i777, который работает на Exynos4210 SoC), я вижу, что устройство зарегистрировано на соответствующей шине I2C по правильному адресу (I2C1 на 0x20). Однако я не вижу зарегистрированных GPIO. На данный момент я еще не подключил свой расширитель к своей шине I2C1, но я думаю, что я все еще смогу увидеть зарегистрированные GPIO. В частности, я должен увидеть зарегистрированный GPIO 300-307 (так как это 8-битный расширитель). Но я этого не делаю.
GPIO, которые я вижу на оборудовании через "cat / sys / kernel / debug / gpio", находятся в диапазоне от 0 до 287. Поскольку я не хочу конфликтовать с какими-либо физическими GPIO, я выбрал GPIO моего расширителя вне этого диапазона (300+). Я считаю, что отчасти проблема заключается в том, что GPIO вне этого диапазона не существуют. Когда я пытаюсь экспортировать GPIO 300, ничего не происходит (echo 300> / sys / class / gpio / export). В ядре есть макрос «ARCH_NR_GPIOS», который определяет общее количество GPIO (как встроенных / SoC GPIO, так и других, например, на расширителях GPIO). Я пытался увеличить этот ARCH_NR_GPIOS несколько раз, даже до 1000 в какой-то момент. Но я все еще не могу экспортировать ничего, кроме исходных GPIO 0-287 (я не могу экспортировать некоторые из них, поскольку некоторые из них в настоящее время используются другими драйверами, но я могу экспортировать многие из них). Как вы думаете, в чем может быть проблема?
libgpiod
показывают вам (ах, хорошо, у вас слишком старое ядро, поэтому проверьте в этом случае / sys / class / gpio / ...)? - person 0andriy   schedule 12.05.2018