Armadilloフォーラム

Armadillo-640のSPI追加

kdhiro

2021年5月13日 10時03分

お世話になります。
Armadillo-640内蔵のSPIを使えるようにするため、下記の手順で進めて参りました。

 ・at-dtwebでECSPI3とUART1を追加し、ビルド
 ・boot起動画面にspiの項目が表示されるのを確認
  [ 0.998815] spi_imx 2010000.ecspi: dma setup error -19, use pio
  [ 1.005859] spi_imx 2010000.ecspi: probed

過去のフォーラム「Armadillo-640へのSPIおよびCANの追加方法」が参考になると
思いますが、なかなか理解が及びません。次の手順として、menuconfigの編集と
いうことになるのでしょうか(デバイスドライバの有効)?

ファイル ファイルの説明
bootログ.txt
コメント

at_akihito.irie

2021年5月13日 18時29分

入江です。

お使いのSPIスレーブデバイス(対向機)について教えて頂くことは可能でしょうか。

SPIスレーブデバイスのデバイスドライバがLinuxカーネルのソースコード内に
含まれているかどうかでこの後の動きは変わります。

以上、よろしくお願いいたします。

> 入江です。
>
> お使いのSPIスレーブデバイス(対向機)について教えて頂くことは可能でしょうか。
>
> SPIスレーブデバイスのデバイスドライバがLinuxカーネルのソースコード内に
> 含まれているかどうかでこの後の動きは変わります。
>
> 以上、よろしくお願いいたします。
>

ありがとうございます。
SPIスレーブデバイス ですが、7セグメントLED表示器になります。
確認お願い致します!

ファイル ファイルの説明
OSL10564-74HC595 -X.PDF

at_akihito.irie

2021年5月14日 15時34分

入江です。

Linuxカーネルソースコード内にお使いのデバイスのドライバは無いようです。

この場合、専用のドライバを新規に作成しても良いのですが、spidevという汎
用のspiドライバを使うのが手軽ですのでそちらをおすすめします。

spidevドライバーを使用すると、デバイスファイルインターフェースを経由し
て、ユーザーランドで動作するアプリケーションプログラムからデバイスの制
御をおこなうことができます。

具体的な手順としましては、at-dtwebでSPI(とUART1)を有効にしてSaveした後、
以下のコマンドを実行してカーネルコンフィグレーションを変更します。

[ATDE]$ make ARCH=arm armadillo-640_defconfig
[ATDE]$ make ARCH=arm menuconfig

有効にするコンフィグレーションは以下のとおりです。

Device Drivers  --->
    [*] SPI support --->
        [*] User mode SPI device driver support <- これを有効化

また、お客様の方で有効にしているコンフィグレーションがあればここで有効にしてください。

その後、以下のコマンドを実行してカーネルをビルドし、カーネルイメージと
dtbが生成されていることを確認してください。

[ATDE]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x82000000 uImage
[ATDE]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
 
[ATDE]$ ls arch/arm/boot/uImage
arch/arm/boot/uImage
[ATDE]$ ls arch/arm/boot/dts/armadillo-640-at-dtweb.dtb
arch/arm/boot/dts/armadillo-640-at-dtweb.dtb

書き込んだ後にArmadilloを起動すると、/dev/spidevN.M(N, Mは0以上の数値
文字)デバイスファイルが生成されます。
そのデバイスファイルに対して、open/close/read/write/ioctlシステムコー
ルを発行することで、SPIデバイスの制御を行うことができます。

詳細は調べて頂くか、ドキュメントが以下にありますのでご参照ください。
https://github.com/atmark-techno/linux-4.14-at/blob/master/Documentatio…

> 入江です。
>
> Linuxカーネルソースコード内にお使いのデバイスのドライバは無いようです。
>
> この場合、専用のドライバを新規に作成しても良いのですが、spidevという汎
> 用のspiドライバを使うのが手軽ですのでそちらをおすすめします。
>
> spidevドライバーを使用すると、デバイスファイルインターフェースを経由し
> て、ユーザーランドで動作するアプリケーションプログラムからデバイスの制
> 御をおこなうことができます。
>
> 具体的な手順としましては、at-dtwebでSPI(とUART1)を有効にしてSaveした後、
> 以下のコマンドを実行してカーネルコンフィグレーションを変更します。
>
>

> [ATDE]$ make ARCH=arm armadillo-640_defconfig
> [ATDE]$ make ARCH=arm menuconfig
> 

>
> 有効にするコンフィグレーションは以下のとおりです。
>
>

> Device Drivers  --->
>     [*] SPI support --->
>         [*] User mode SPI device driver support <- これを有効化
> 

>
> また、お客様の方で有効にしているコンフィグレーションがあればここで有効にしてください。
>
> その後、以下のコマンドを実行してカーネルをビルドし、カーネルイメージと
> dtbが生成されていることを確認してください。
>
>

> [ATDE]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x82000000 uImage
> [ATDE]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
> 
> [ATDE]$ ls arch/arm/boot/uImage
> arch/arm/boot/uImage
> [ATDE]$ ls arch/arm/boot/dts/armadillo-640-at-dtweb.dtb
> arch/arm/boot/dts/armadillo-640-at-dtweb.dtb
> 

>
> 書き込んだ後にArmadilloを起動すると、/dev/spidevN.M(N, Mは0以上の数値
> 文字)デバイスファイルが生成されます。
> そのデバイスファイルに対して、open/close/read/write/ioctlシステムコー
> ルを発行することで、SPIデバイスの制御を行うことができます。
>
> 詳細は調べて頂くか、ドキュメントが以下にありますのでご参照ください。
> https://github.com/atmark-techno/linux-4.14-at/blob/master/Documentatio…
>

丁寧な解説、ありがとうございます!
spidevにて進めて参ります!

すみません。準備が整い、カーネルコンフィグレーションを実施したのですが、
下記エラーが出てしまいました。root権限でも実施しましたが、同様なエラーでした。

atmark@atde7:~/linux-v4.14-at32$ make ARCH=arm armadillo-640_deconfig
make[1]: *** ターゲット 'armadillo-640_deconfig' を make するルールがありません. 中止.
Makefile:522: ターゲット 'armadillo-640_deconfig' のレシピで失敗しました
make: *** [armadillo-640_deconfig] エラー 2

menuconfig画面でSPI(user mode)をYで有効にした後、Save選択し、
そのままOKを押して大丈夫でしょうか?

at_akihito.irie

2021年5月18日 9時59分

大丈夫です。

先に説明したSPIのコンフィギュレーションが全て有効になっていることは確認してください。

> 大丈夫です。
>
> 先に説明したSPIのコンフィギュレーションが全て有効になっていることは確認してください。

有効を確認し、カーネルビルド→Armadillo-640のDTBの書き換え後、rebootを行いました。
devフォルダを確認しましたが、デバイスファイルが生成されていないようです・・・。

> > 大丈夫です。
> >
> > 先に説明したSPIのコンフィギュレーションが全て有効になっていることは確認してください。
>
> 有効を確認し、カーネルビルド→Armadillo-640のDTBの書き換え後、rebootを行いました。
> devフォルダを確認しましたが、デバイスファイルが生成されていないようです・・・。

ファイル ファイルの説明
rebootログ.txt rebootログを添付します。

at_akihito.irie

2021年5月18日 10時48分

入江です。

> 有効を確認し、カーネルビルド→Armadillo-640のDTBの書き換え後、rebootを行いました。
> devフォルダを確認しましたが、デバイスファイルが生成されていないようです・・・。

uImage(カーネルイメージ)は書き換えましたか?

> 入江です。
>
> > 有効を確認し、カーネルビルド→Armadillo-640のDTBの書き換え後、rebootを行いました。
> > devフォルダを確認しましたが、デバイスファイルが生成されていないようです・・・。
>
> uImage(カーネルイメージ)は書き換えましたか?
>
uImageもmakeコマンドで書き換えて、日付が変わっていることも確認しました。

640製品マニュアルの11.2.2 Linuxカーネルイメージの書き換えはしていませんでしたので、
これをすればよいということですよね。(11.2.3 DTBの書き換えしかしていませんので。)

> 640製品マニュアルの11.2.2 Linuxカーネルイメージの書き換えはしていませんでしたので、
> これをすればよいということですよね。(11.2.3 DTBの書き換えしかしていませんので。)

確認です。uImageは下記ファイルでよろしいでしょうか?
/home/atmark/linux-v4.14-at32/arch/arm/boot/uImage

at_akihito.irie

2021年5月18日 12時56分

> 確認です。uImageは下記ファイルでよろしいでしょうか?
> /home/atmark/linux-v4.14-at32/arch/arm/boot/uImage

はい。その通りです。

> > 確認です。uImageは下記ファイルでよろしいでしょうか?
> > /home/atmark/linux-v4.14-at32/arch/arm/boot/uImage
>
> はい。その通りです。

ありがとうございます! /dev/spidev2.0ファイルの生成を確認致しました!

python3でSPI通信のソースコードを作成したのですが、spi.open(0,0)部分で下記エラーが出ました。
ちなみに、DTBの書き換え(ECSPI3->ECSPI4)も実行しており、Spiファイルがspidev3.0に変わっていました。
原因が分からなく、ご助言を頂きたく。

spi.open(0,0)
FileNotFoundError: [Errno 2] No such file or directory

> python3でSPI通信のソースコードを作成したのですが、spi.open(0,0)部分で下記エラーが出ました。
> ちなみに、DTBの書き換え(ECSPI3->ECSPI4)も実行しており、Spiファイルがspidev3.0に変わっていました。
> 原因が分からなく、ご助言を頂きたく。
>
> spi.open(0,0)
> FileNotFoundError: [Errno 2] No such file or directory
>
spidev3.0の場合、下記のようにすればよいでしょうか?
spi.open(3,0)

ありがとうございます!
無事にSPIデバイスの制御ができるようになりました!

少しづつ、開発環境に慣れてきました!ありがとうございます!