0

在正常情况下,SPI 设备驱动程序与 SPI 控制器通信,以便能够读取/写入真实的 SPI 设备,该设备通过 Clk、MOSI.MISO 和 CS(芯片选择)连接到 SPI 控制器。

如果 SPI 控制器没有足够的 CS 线,我们有一个通过 SPI 连接的 CPLD 设备来增加 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 必须通过另一个 SPI 设备的 CPLD 路由到预期设备。

我的难题是如何实现这样的 SPI MUX,它会在每次驱动程序想要访问通过 CPLD 连接的设备时执行 CS 的路由。以及如何将此 SPI MUX 驱动程序连接到各个驱动程序。

我试图在内核代码中找到一些帮助,但只找到了可以直接调用 SPI Master 功能的设备驱动程序。任何人都可以为此提供任何指示。

4

0 回答 0