0

通常のシナリオでは、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 マスター機能を直接呼び出すことができるデバイス ドライバーしか見つかりませんでした。誰でもこれについて何か指針を与えることができますか?

4

0 に答える 0