在正常情况下,spi设备驱动程序与SPI控制器通信,以便能够读取/写入真实SPI设备,该设备通过Clk,MOSI.MISO和CS(芯片选择)连接到SPI控制器。
如果SPI控制器没有足够的CS线,我们有一个通过SPI连接的CPLD器件有16个CS线。因为每个设备都有一个驱动程序,我想实现一个SPI Mux,以便通过CPLD连接的设备是可加入的。
CPLD有两条CS线路,一条用于选择CPLD设备本身,另一条用于将其路由到与其连接的其他设备。 另一个CLK,MOSI,MISO来自SPI Controller。 作为标准,可以在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转发到目标设备。
我的Dillema是如何实现这样一个SPI MUX,它可以在每次决定驱动程序想要访问通过CPLD连接的设备时进行CS的路由。以及如何将SPI MUX驱动程序连接到各个驱动程序。
我试图在内核代码中找到一些帮助,但发现只能直接调用SPI Master功能的设备驱动程序。 任何人都可以给出任何指针。