Armadilloフォーラム

SPIインタフェースのMSIOF1,MSIOF2の同時使用時のカーネルコンフィグレーション方法

higashi.urachan

2015年12月7日 12時11分

いつも大変お世話になっております。
西菱電機 東浦と申します。

Armadillo-840のSPIインタフェースのMSIOF1,MSIOF2を同時に使用し通信を行うアプリケーションの
設計をしております。

製品マニュアルや過去のFAQ等を確認させて戴きましたがMSIOF1に関しては情報が有るのですが、
MSIOF2を有効にする方法に関しての情報が見当たらず、色々とカーネルのコンフィグレーション等を
変更しつつ/devにMSIOF2のデバイスファイルが生成されないか等をトライアンドエラーで行っては見
たのですが、/dev/spidev1.1が生成される事はありませんでした。
/dev/spidev1.1生成するためのカーネルコンフィルレーションはどの様に設定すれば宜しいのでしょうか?

また、それぞれのSPIには2つのデバイスを接続しCSで制御を行う予定ですが(MSIOF1は、MSIOF1_SS1
とMSIOF_TSYNC(PORT73) MSIOF2は、MSIOF2_SS1とMSIOF2_TSYNC)を用いる予定です。
カーネルコンフィグレーションのUser mode SPI device[CS:PORT73]を有効にした場合、MSIOF_TSYNC
の制御はドライバが行うと考えておりますが、MSIOF_SS1の制御はGPIO経由での制御を行う必要がある
のでしょうか?

これらの質問に関しましてご教授戴きたく、宜しくお願い致します。

コメント

higashi.urachan

2015年12月8日 20時27分

いつも大変お世話になっております。
西菱電機 東浦と申します。

自己フォローです。(全然解決はしておりませんが・・・・)
board-armadillo840.cの/* SPI.MSIOF */以降のコードの改造を行うことにより対応出来ると
社内の方より情報を貰い対応を始めております。
ソースを追いかけている内に色々と不明点が出てきましたのでご存じの方が居られましたら
ご教授戴けると幸いです。

デバイスファイル名を生成していると考えている構造体「msiof1_board_info」とハードのリソ
ース情報を持つ構造体「sh_msiof1_device」がOS内部でどうやって紐付けているのか判り
ません。
構造体「msiof1_board_info」のbus_numと構造体「sh_msiof1_device」のidで紐付けを行っ
ているのでしょうか?
(下記の様に構造体を変更し、GPIO_PORT67関連の処理を追加すれば、チップセレクトが
動作すると考えているのですが・・・・Armadillo-800シリーズ 60ピン/100ピンコネクタ ピッチ
変換基板を手配中で確認出来ない状況です。)

static struct spi_board_info __maybe_unused msiof1_board_info[] __initdata = {
    /* this is inplementation dependent. */
    {
        .modalias       = "spidev",
        .controller_data    = (void *)GPIO_PORT73,
        .max_speed_hz       = 1000000,
        .bus_num            = 1,
        .chip_select        = 0,
    },
    {
        .modalias       = "spidev",
        .controller_data    = (void *)GPIO_PORT67,
        .max_speed_hz       = 1000000,
        .bus_num            = 1,
        .chip_select        = 1,
    }
};

あと、大元のソースにCS信号の初期化処理として下記の記述があるのですが、
gpio_direction_output(GPIO_PORT73, 0);

CS信号がLOWアクティブの場合には
gpio_direction_output(GPIO_PORT73, 1);

と変更する必要があるのでしょうか?

以上、宜しくお願い致します。

at_kojiro.yamada

2015年12月10日 15時14分

> デバイスファイル名を生成していると考えている構造体「msiof1_board_info」とハードのリソ
> ース情報を持つ構造体「sh_msiof1_device」がOS内部でどうやって紐付けているのか判り
> ません。
> 構造体「msiof1_board_info」のbus_numと構造体「sh_msiof1_device」のidで紐付けを行っ
> ているのでしょうか?

はい。

linux-3.4-at/drivers/spi/spi-sh-msiof.c::sh_msiof_spi_probe()
の668行目でpdevのidをbus_numに代入し(pdevにはsh_msiof1_deviceへのポインタが入ります)、
linux-3.4-at/drivers/spi/spi.c::spi_match_master_to_boardinfo()
でbus_numが一致するspi_board_infoと紐付けされます。

関連ソース
- linux-3.4-at/arch/arm/mach-shmobile/board-armadillo840.c
- linux-3.4-at/drivers/spi/spi-bitbang.c
- linux-3.4-at/drivers/spi/spi.c
- linux-3.4-at/drivers/spi/spi-sh-msiof.c

コールグラフ
sh_msiof_spi_probe()
spi_bitbang_start()
spi_register_master()
spi_match_master_to_boardinfo()

spi_register_board_info()
spi_match_master_to_boardinfo()

> あと、大元のソースにCS信号の初期化処理として下記の記述があるのですが、
> gpio_direction_output(GPIO_PORT73, 0);
>
> CS信号がLOWアクティブの場合には
> gpio_direction_output(GPIO_PORT73, 1);
>
> と変更する必要があるのでしょうか?

申し訳ありません。
ここはバグですね。

SPIのCS信号はLowアクティブですので、
接続するデバイスのCS信号は全てHighにしておくべきです。

gpio_direction_output(GPIO_PORT73, 1);
としてください。

at_kojiro.yamada様

いつも大変お世話になっております。
西菱電機 東浦です。

お忙しい中ご回答戴きありがとうございました。

Armadillo-800シリーズ 60ピン/100ピンコネクタ ピッチ変換基板を入手後に動作確認を行いたいと
思います。
動作確認中に不明点等が自己解決出来ない場合には再度質問させて戴きます。

以上、宜しくお願い致します。