Armadillo-x1 eCSPI4の利用について

お世話になります。hattadkと申します。

現在、linux-4.9-x1-at9 にてSPI通信を行おうとしております。
https://users.atmark-techno.com/forum/armadillo/3952
こちらを参考にさせていただき、/dev/spidev3.0 が作成されることまでは確認できたのですが

https://users.atmark-techno.com/blog/615/2577
こちらの、[7.SPIの使い方]を参考にさせていただきサンプルプログラムを作成し実行したところ

adc_mcp3204: mcp3204_read - Invalid argument

と表示され停止してしまいます。
詳細を確認したところ、mcp3204.c内の
ret = ioctl(adc->fd, SPI_IOC_MESSAGE(1), &tr);
こちらにて -1 が返ってきているということまで分かりましたが、それ以降、色々と調べているのですがうまく動作させることができません。

お忙しいところ恐縮ですが、何か設定、調査すべき点等のご助言を頂戴できたら幸いです。

製品: 
Armadillo-X1

大塩です。

> お世話になります。hattadkと申します。
>
> 現在、linux-4.9-x1-at9 にてSPI通信を行おうとしております。
> https://users.atmark-techno.com/forum/armadillo/3952
> こちらを参考にさせていただき、/dev/spidev3.0 が作成されることまでは確認できたのですが
>
> https://users.atmark-techno.com/blog/615/2577
> こちらの、[7.SPIの使い方]を参考にさせていただきサンプルプログラムを作成し実行したところ
>
> adc_mcp3204: mcp3204_read - Invalid argument
>
> と表示され停止してしまいます。
> 詳細を確認したところ、mcp3204.c内の
> ret = ioctl(adc->fd, SPI_IOC_MESSAGE(1), &tr);
> こちらにて -1 が返ってきているということまで分かりましたが、それ以降、色々と調べているのですがうまく動作させることができません。
>
> お忙しいところ恐縮ですが、何か設定、調査すべき点等のご助言を頂戴できたら幸いです。

実行時に「mcp3204_open」処理が完了しているためmcp3204の接続は出来ていると思いますが
念のためmcp3204との接続をご確認いただけますでしょうか。

またエラー発生時、「errno」変数にエラー番号が格納されるため、エラー番号をご確認いただけますでしょうか。
エラー番号に対応するエラー内容はArmadilloの「/usr/include/asm-generic/errno-base.h」と以下URLで確認可能です。
・man page IOCTL
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/ioctl.2.html

ご返答いただき有難うございます。

また、回答が遅くなり申し訳ございませんでした。

> 実行時に「mcp3204_open」処理が完了しているためmcp3204の接続は出来ていると思いますが
> 念のためmcp3204との接続をご確認いただけますでしょうか。
承知いたしました。

> またエラー発生時、「errno」変数にエラー番号が格納されるため、エラー番号をご確認いただけますでしょうか。
> エラー番号に対応するエラー内容はArmadilloの「/usr/include/asm-generic/errno-base.h」と以下URLで確認可能です。
> ・man page IOCTL
> https://linuxjm.osdn.jp/html/LDP_man-pages/man2/ioctl.2.html
こちらもあわせて確認させていただき、またこちらへ投稿させていただきます。

尾藤です。

ご参考にされているサンプルプログラムの
> ret = ioctl(adc->fd, SPI_IOC_MESSAGE(1), &tr);
の引数である
        struct spi_ioc_transfer tr;
について、
Linux-4.9では、
tx_nbits
rx_nbits
という要素が追加になっているようです。

ついては、mcp3204.cの
        /* 転送設定をセットする */
        tr.tx_buf = (unsigned long)tx;
        tr.rx_buf = (unsigned long)rx;
        tr.len = ARRAY_SIZE(tx);
        tr.delay_usecs = MCP3204_SPI_DELAY_USECS;
        tr.speed_hz = MCP3204_SPI_SPEED_HZ;
        tr.bits_per_word = MCP3204_SPI_BITS;
        tr.cs_change = 0;
の下に
        tr.tx_nbits = 0;
        tr.rx_nbits = 0;
を追加して確認しましたところ、MCP3204から値を取得することができました。

補足)
**_nbitsは、SPIモードのSINGLE、DUAL、QUADを指定するもののようです。
上記の設定ではSINGLEにしてます。

参考にしたサイト)
https://github.com/rm-hull/spidev-test/blob/master/spidev_test.c
https://linuxtv.org/downloads/v4l-dvb-internals/device-drivers/API-struct-spi-transfer.html

返答いただき、有難うございました。

また、フォーラムの確認が遅くなり返信が遅くなってしまいまして申し訳ございませんでした。
実は当方もその内容にたどりつけまして、正常にSPI通信ができるようになりました。
あとヘッダファイルを確認したところ、linux-4.9では tx_nbits と rx_nbits の2件以外に
pad というものも追加されておりましたので、当方はそちらも追加して通信確認を行いました。

お忙しいところご対応いただき、有難うございました。
今後ともよろしくお願いいたします。

> 尾藤です。
>
> ご参考にされているサンプルプログラムの
> > ret = ioctl(adc->fd, SPI_IOC_MESSAGE(1), &tr);
> の引数である
> struct spi_ioc_transfer tr;
> について、
> Linux-4.9では、
> tx_nbits
> rx_nbits
> という要素が追加になっているようです。
>
> ついては、mcp3204.cの
> /* 転送設定をセットする */
> tr.tx_buf = (unsigned long)tx;
> tr.rx_buf = (unsigned long)rx;
> tr.len = ARRAY_SIZE(tx);
> tr.delay_usecs = MCP3204_SPI_DELAY_USECS;
> tr.speed_hz = MCP3204_SPI_SPEED_HZ;
> tr.bits_per_word = MCP3204_SPI_BITS;
> tr.cs_change = 0;
> の下に
> tr.tx_nbits = 0;
> tr.rx_nbits = 0;
> を追加して確認しましたところ、MCP3204から値を取得することができました。
>
> 補足)
> **_nbitsは、SPIモードのSINGLE、DUAL、QUADを指定するもののようです。
> 上記の設定ではSINGLEにしてます。
>
> 参考にしたサイト)
> https://github.com/rm-hull/spidev-test/blob/master/spidev_test.c
> https://linuxtv.org/downloads/v4l-dvb-internals/device-drivers/API-struct-spi-transfer.html