Понадобилось на imx233 прикрутить тачскрин - spi аппаратный на разъеме естественно не доступен, но зато Павел предусмотрительно завел его на свободные/доступные пины gpio. Так как изобретать велосипед не хотелось при живом драйвере в ядре для ads7843 - нужно было эмулировать spi контроллер на gpio что linux умеет из коробки. Для этого нужны совсем небольшие усилия:
1 включить поддержку spi bitbang
Location:
-> Device Drivers
-> SPI support (SPI [=y])
Selects: SPI_BITBANG
2 В описании платы (board файл) задать gpio для эмулируемого контроллера, например для imx233:
и прописать это устройство:
Все - наш новоиспеченный контроллер spi готов к работе - при этом определено для него только 1 устройство (.num_chipselect = 1,) и его идентификатор шины - 3 (.id = 3,)
Для примера - тачскрин описан в таблице ведомых устройств таким образом:
для полноты картины остальные данные которые относятся к драйверу тачскрина:
тут irq задается не очень прямым методом - но подругому у меня не получилось так как у imx233 gpio_to_irq не является константой и ее нельзя присвоить статически при описании ads7843 при инициализации массива.
PS драйвер из коробки работает со всеми утилитами tslib, из прикладных программ опробовал его с qt - никаких проблем не заметил. Немножко пришлось подправить драйвер ads7846.c - в обработчике прерываний закоментить проверку условий
// if (likely(get_pendown_state(ts))) {
// if (!ts->irq_disabled) {
возможно это imx233 специфичный ход - на других контроллерах я не проверял иначе не всегда работает подавление дребезга контакта(debounce) заходящего на irq.
отличная работа! все как обычно - просто и доходчиво расписано.
Саш, при случае, потести под иксами - вдруг заведется нормально..
Как я понял используется 3 пина под SPI + 1 пин под прерывание, т.е. есть шанс его запустить на МНУКе?
Что значит вдруг ? :) Я почти уверен что все будет ок - это же из ванильного ядра драйвер, причем достаточно старый/проверенный.
Да - cs можно не заводить а просто сделать его на устройстве "всегда выбрано", остаются miso, mosi, clk и penirq от ads7843. При этом вместо .controller_data = (void *) PINID_SSP1_DATA2, /* это описан gpio-пин для cs */ подставить константу SPI_GPIO_NO_CHIPSELECT
Теоретически должно работать на любой платформе где есть поддержка gpio в ядре, практически - на imx233 с пол пинка завелся - больше возились с пониманием/устранением
причин дребезга от ads7843 по линии penirq и неприятными последствиями этого.
попробовал прикрутить вышеописанную радость к МНУКу, сходу получил пару обломов
- не нашел как у NUC950 дефайнятся пины, т.е. у 9260 есть понятие AT91_GPIO_PA25, у iMX - типа PINID_GPMI_RDY1
в принципе, в брюшке драйвера есть место где можно настроить пины штатными средствами, но драйверу все равно надо как-то втолковать - чем надо шевелить для работы..
и второе, при попытке просто прописать твои начальные строки, при сборке вылетает ошибка unknown field 'num_chipselect' specified..
в хидере присутствуют #define <linux/spi/spi.h>
#define <linux/spi/spi_bitbang.h>
В инете есть очень удобные ресурсы для типа этого http://lxr.free-electrons.com/ident
с помощью которых очень удобно бродить по коду и находить практически все. В данном случае нужно добавить хидер
#include <linux/spi/spi_gpio.h>
PS что это за ужас ? :)
>>#define<< <linux/spi/spi.h>
день прошел зря - выхлоп ноль :-/
перед тем, как браться за паяльник решил пробовать на МНУКе поднять это хозяйство в теории..
сейчас логи не показать - в общем итоге драйвер ads7846 зарегистрировался на spi, вроде даже шина SPI делала телодвижения успешно по регистрации, но вот spi_bitbang не регится ни в какую
то ли последовательность загрузки неправильная, то ли еще не хватает чего то объявить..
впечатление, что проще выкусить обращения драйвера по SPI и наклеить свой bitbang
зы есть стойкое подозрение, что если поднять драйвер на 9260.. то все заработает :-/
Драйвер там называется spi_gpio и потом движение на шине slave устройство создать ну никак не может, только мастер, так что делай выводы :)
PS Посмотрел в свежем 34 ядре вроде для мнуков всего полно, чего нет давно можно было дописать/перенести со старого ядра - чего вы им не пользуеетесь ?
не, про физическую шину вообще нет речи
при запуске идет активизация spi.c, серия каких-то невнятных регистраций и тишина
чуть раньше запускается регистрация драйвера ads7846 и тишина
я не великий спец, но вероятно алгоритм должен быть такой - на spi.c навешивается spi_bitbang и образует шину SPI, а уж потом запускается _probe драйвера
полно - это только на первый взгляд. из носителей "из коробки" есть только сетевой адаптер..
процесс переноса достаточно мутный и сложный :-/