Интегрирует драйвер расширителя I2C-to-GPIO в ядро, но не видит GPIO

Я собираю 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 (я не могу экспортировать некоторые из них, поскольку некоторые из них в настоящее время используются другими драйверами, но я могу экспортировать многие из них). Как вы думаете, в чем может быть проблема?


person JoeG    schedule 04.04.2018    source источник
comment
Возможно, вам может понадобиться работать с существующим и подключенным оборудованием? В противном случае вам понадобится виртуальная машина с эмулируемой моделью такого устройства.   -  person 0andriy    schedule 05.04.2018
comment
Спасибо за ответ. Проверим это. Я также пытаюсь увидеть, где в ядре я могу также расширить свои GPIO (например, gpio-exynos4.c). Еще раз благодарим за отзыв. Надеюсь, скоро обновлю.   -  person JoeG    schedule 05.04.2018
comment
Я попробовал, но, к сожалению, безуспешно. Дело в том, что я даже не могу экспортировать GPIO за пределами 287. Если я наберу echo 300 ›/ sys / class / gpio / export, я ничего не увижу. Итак, я просто пытаюсь экспортировать любой GPIO за пределами 287. Я думаю, что мне нужно расширить свои GPIO в ядре, как упоминалось выше. Думаю, это решит проблему. Как увеличить количество GPIO, распознаваемых ядром? Похоже, игра с ARCH_NR_GPIOS у меня не работает.   -  person JoeG    schedule 05.04.2018
comment
У вас действительно подключено реальное оборудование? Какие инструменты из проекта libgpiod показывают вам (ах, хорошо, у вас слишком старое ядро, поэтому проверьте в этом случае / sys / class / gpio / ...)?   -  person 0andriy    schedule 12.05.2018
comment
Я подключил устройство к подходящей шине i2c в то время. В то время у меня не было установленных инструментов i2cdetect, поэтому я не мог убедиться, что я действительно подключен к правильной шине i2c. Есть около 15 автобусов i2c. Так что, возможно, меня подключили не к той шине. Теперь у меня есть инструменты i2cdetect. Однако я снял свою настройку, поэтому сейчас я не могу это проверить. Но я считаю, что вы правы в отношении подключения оборудования. Я просмотрел код и увидел функции проверки, указывающие на то, что ядро ​​проверяет устройство, если оно присутствует.   -  person JoeG    schedule 15.05.2018
comment
Я надеюсь, позже протестирую, но в настоящее время я решил использовать uC вместо расширителя GPIO (поскольку мне нужны другие функции). Но опять же, я считаю, что вы правы в отношении устройства, которое необходимо подключить к системе во время процесса загрузки (как я полагаю, когда вызывается функция проверки).   -  person JoeG    schedule 15.05.2018
comment
Собственно это зависит от того, как вы пронумеруете устройство. При запуске ядра вы всегда можете модифицировать драйвер и привязать любое устройство i2c на шине к этому драйверу (конечно, вы должны быть уверены, что устройство подключено и драйвер совместим с ним).   -  person 0andriy    schedule 15.05.2018
comment
Это правда. У меня был драйвер, связанный с определенной шиной в файле моей платы (а не в дереве устройств, поскольку моя версия ядра старше). Но ты прав. Я забыл, что могу просто привязать устройство i2c на любой шине, на которой оно находится, к соответствующему драйверу. Поэтому мне не нужно беспокоиться о том, на какой шине я нахожусь (если я могу найти устройство), и я могу привязать устройство к драйверу в любое время (а не только во время загрузки). Спасибо за эту информацию!   -  person JoeG    schedule 15.05.2018
comment
Я думаю, что следующие вопросы Q и A могут быть очень важны для моего вопроса, размещенного здесь: stackoverflow.com/questions/37168540/   -  person JoeG    schedule 15.05.2018
comment
Да, и эта статья: lwn.net/Articles/143397   -  person 0andriy    schedule 15.05.2018
comment
Большой! Еще раз спасибо 0andriy за вашу помощь!   -  person JoeG    schedule 15.05.2018