通常のシナリオでは、spi デバイス ドライバーは SPI コントローラーと通信して、Clk、MOSI.MISO、および CS (チップ セレクト) を使用して SPI コントローラーに接続されている実際の SPI デバイスとの間で読み取り/書き込みを行うことができます。
SPI コントローラーに十分な CS ラインがない場合は、SPI 経由で CPLD デバイスを接続して、16 の CS ラインを追加します。すべてのデバイスには 1 つのドライバーがあるため、CPLD 経由で接続されたデバイスにアクセスできるように SPI Mux を実装したいと考えています。
CPLD には 2 つの CS ラインがあり、1 つは CPLD デバイス自体を選択するためのもので、もう 1 つは接続されている別のデバイスにルーティングするためのものです。他の 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 を介して目的のデバイスにルーティングする必要があるため、これらの要素にフックされたドライバーは実際のデバイスに書き込むことができません。
私のディレマは、ドライバーが CPLD 経由で接続されたデバイスにアクセスするたびに CS のルーティングを行うような SPI MUX を実現する方法です。また、この SPI MUX ドライバーを個々のドライバーにフックする方法についても説明します。
カーネル コードでヘルプを見つけようとしましたが、SPI マスター機能を直接呼び出すことができるデバイス ドライバーしか見つかりませんでした。誰でもこれについて何か指針を与えることができますか?