реализовать драйвер SPI MUX в Linux

В обычном сценарии драйвер устройства spi взаимодействует с контроллером SPI, чтобы иметь возможность читать/записывать на/с реального устройства SPI, которое подключено к контроллеру SPI с помощью Clk, MOSI.MISO и CS (выбор микросхемы).

если у контроллера SPI недостаточно линий CS, у нас есть устройство CPLD, подключенное через SPI, чтобы иметь еще 16 линий CS. Поскольку у каждого устройства есть один драйвер для него, я хотел бы реализовать SPI Mux, чтобы устройства, подключенные через CPLD, были доступны.

CPLD имеет две линии CS, одну для выбора самого устройства CPLD, а другую для маршрутизации к другим подключенным к нему устройствам. другие CLK, MOSI, MISO поступают от контроллера SPI. стандартно можно добавить информацию об устройстве intp spi_board_info

    static struct spi_board_info spi_board_cpld_main_mux_info[] =
    {
        {   /* main board cpld cs */
            .modalias    = "cpld_gpio", //device driver for CPLD
            .platform_data   = &cpld_gpio_main_pdata,
            .controller_data = (void *)GPIO59_SPI2_FRM,
            .max_speed_hz    = 13000000,
            .bus_num     =2,
            .chip_select     = 0,
            .mode        = SPI_MODE_0,
        },
        {
            /* Suzuka connected over CPLD main  card */
            .modalias = "suzuka",
            //.platform_data = &main_cpld_gpio_pdata,
            .controller_data = (void *)25,
            .max_speed_hz = 1000000,
            .bus_num = 2,
            .chip_select = 1, /* chip select line denoting the gpio_cs on CPLD */
            .mode = SPI_MODE_0,
        },
        {
            /* some SPI device connected over CPLD main  card */
            .modalias = "spidevice1",//or some another driver
            //.platform_data = &aux_cpld_gpio_pdata,
            .controller_data = (void *)25,
            .max_speed_hz = 1000000,
            .bus_num = 2,
            .chip_select = 2, /* chip select line denoting the gpio_cs on CPLD */
            .mode = SPI_MODE_0,
        }   
    };

Но драйвер, подключенный к этим элементам, не может записывать на реальные устройства, поскольку CS должен быть маршрутизирован к предполагаемому устройству через CPLD, которое является другим устройством SPI.

Моя проблема заключается в том, как реализовать такой SPI MUX, который будет выполнять маршрутизацию CS каждый раз, когда драйвер decive хочет получить доступ к устройствам, подключенным через CPLD. а также как подключить этот драйвер SPI MUX к отдельным драйверам.

Я попытался найти помощь в коде ядра, но нашел только драйверы устройств, которые могли напрямую вызывать функции SPI Master. Может ли кто-нибудь дать какой-либо указатель для этого.


person Amiy    schedule 08.02.2013    source источник
comment
Я не вижу способа сделать это без замены драйверов устройств, напрямую взаимодействующих с SPI, на те, которые знают о вашем MUX. А эти вам, вероятно, придется писать самим, основываясь на оригиналах. Вам действительно нужен SPI на этих устройствах? С I2C было бы намного проще...   -  person Fabio Ceconello    schedule 01.03.2013
comment
См.: stackoverflow.com/questions/14053535/, что аналогично.   -  person artless noise    schedule 02.03.2013
comment
Большинство драйверов поддерживают выбор микросхемы GPIO; через отрицательное значение выбора чипа. Они будут вызывать GPIO функции Linux. Напишите обработчик GPIO, который обращается к CPLD и обращается к мультиплексору. Не нужно переделывать драйверы SPI.   -  person artless noise    schedule 02.03.2013