Armadilloフォーラム

Armadillo-X1 SPI通信

seltec032

2023年4月14日 15時32分

お世話になります、大隅と申します。

ECSPI2をスレーブモードに設定してADCデータを受信するまでに至りました。
サンプリング周期が10kHzまでは、sin波信号も正しく入力しています。
但し、サンプリング周波数を20kHz以上(50usec周期)にすると、データを取りこぼしているようです。

DMA又は割込みを使用して40kHzサンプリングに対応できるようにしたいと考えております。

DMAを使用した実例が以下のフォーラムにありましたので、参考にして組み込んでみました。
https://armadillo.atmark-techno.com/forum/armadillo/3160

下の2行を追加しました。(ECSPI2受信のみ動作)
dmas = <&sdma 2 7 1>; /* Add */
dma-names = "rx"; /* Add */

===========================================
&ecspi2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_ecspi2>;
dmas = <&sdma 2 7 1>; /* Add */
dma-names = "rx"; /* Add */
fsl,spi-num-chipselects = <1>;
cs-gpios = <&gpio4 23 GPIO_ACTIVE_HIGH>;
status = "okay";

spi@0 {
compatible = "spidev";
spi-max-frequency = <1000000>;
reg = <0>;
};
};
============================================

ビルドでは、ノーエラーとなりましたが、起動ログを見ると"dma setup error"とありました。

mtd: partition "reserved" extends beyond the end of device "30bb0000.qspi" -- size truncated to 0xec0000
spi_imx 30830000.ecspi: dma setup error -19, use pio
spidev spi1.0: buggy DT: spidev listed directly in DT

SPI受信はしますが、DMAは動作していないようです。
"/proc/interrupts"は空でした。

>> DMAが動作しているかどうかは、どうすれば判断できるのでしょうか?

>"/proc/interrupts"を読み出して、sdmaの割り込みが入っていることを確認す
>ると良いと思います。

DMAを使用する為の設定方法に問題があるのでしょうか?

DMA転送でなくても、割込み処理でデータを受信する方法もあるかと思いますが、
割込み処理に対応する設定方法を教えてください。
やはり、DeviceTreeで設定するのでしょうか?
DeviceTreeの設定例があればご教授願います。

コメント

at_akihito.irie

2023年4月18日 11時32分

入江です。

> spi_imx 30830000.ecspi: dma setup error -19, use pio

> dmas = <&sdma 2 7 1>; /* Add */
> dma-names = "rx"; /* Add */

SDMAを使用する場合は、"rx"だけでなく"tx"も指定する必要があります。
なので、一例ですがdtsにて上記部分を以下のように修正した上でお試し頂けますでしょうか。

	dmas = <&sdma 2 7 1>, <&sdma 3 7 2>;
	dma-names = "rx", "tx";

また、DMAとは直接関係ありませんが、

> spidev spi1.0: buggy DT: spidev listed directly in DT

については以下のフォーラムを参照してください。
https://armadillo.atmark-techno.com/forum/armadillo/9521

seltec032

2023年4月19日 11時39分

入江様
お世話になります、大隅です。

dmas = <&sdma 2 7 1>;
dma-names = "rx";
これを以下に変更しました。
dmas = <&sdma 2 7 1>, <&sdma 3 7 2>;
dma-names = "rx", "tx";

起動時のログに変化が見られました。
【変更前】
mtd: partition "reserved" extends beyond the end of device "30bb0000.qspi" -- size truncated to 0xec0000
spi_imx 30830000.ecspi: dma setup error -19, use pio
spidev spi1.0: buggy DT: spidev listed directly in DT
------------[ cut here ]------------

【変更後】
mtd: partition "reserved" extends beyond the end of device "30bb0000.qspi" -- size truncated to 0xec0000
spidev spi1.0: buggy DT: spidev listed directly in DT
------------[ cut here ]------------

これでデータをサンプリングしましたが、データ取りこぼしの症状は
DMAの使用を追加する前と変わりませんでした。

>"/proc/interrupts"を読み出して、sdmaの割り込みが入っていることを確認す
>ると良いと思います。

アプリを終了させて"/proc/interrupts"は存在しますが、
サイズ:0でしたので、DMAは動作していなかった?

DMAが動作していたのであれば、アプリを終了させても"/proc/interrupts"には
DMA割込みの記録が残っていると考えてよいのでしょうか?

他にアドバイスがあればお願いします。

at_akihito.irie

2023年4月19日 13時16分

入江です。

> アプリを終了させて"/proc/interrupts"は存在しますが、
> サイズ:0でしたので、DMAは動作していなかった?

アプリ(おそらくSPI通信を行なうアプリケーション?)終了後の以下のコマンド実行時の出力を頂けますか?

[armadillo]# cat /proc/interrupts

seltec032

2023年4月19日 13時44分

お世話になります、大隅です。
コマンド実行後の出力です。宜しくお願いします。
==============================================
atmark@armadillo:~$ cat /proc/interrupts
CPU0 CPU1
17: 3280 3222 GIC-0 29 Level arch_timer
18: 0 0 GIC-0 30 Level arch_timer
21: 1911 2944 GPCV2 55 Edge i.MX Timer Tick
36: 0 0 GPCV2 78 Edge 30280000.wdog
37: 0 0 GPCV2 49 Edge imx_thermal
39: 0 0 GPCV2 19 Edge rtc alarm
40: 0 0 GPCV2 20 Edge snvs-secvio
41: 0 0 GPCV2 4 Edge 30370000.snvs:snvs-powerkey
43: 55088 0 GPCV2 32 Edge 30830000.ecspi
44: 206 0 GPCV2 38 Edge 30a50000.i2c
45: 851 0 GPCV2 30 Edge 30a70000.serial
46: 0 0 GPCV2 43 Edge 30b10000.usb
47: 27 0 GPCV2 40 Edge 30b30000.usb
48: 4981 0 GPCV2 24 Edge mmc2
49: 0 0 GPCV2 2 Edge sdma
50: 5624 0 GPCV2 102 Edge 30bf0000.ethernet
51: 0 0 GPCV2 100 Edge 30bf0000.ethernet
52: 0 0 GPCV2 101 Edge 30bf0000.ethernet
53: 0 0 GPCV2 103 Edge 30bf0000.ethernet
55: 0 0 GPCV2 88 Edge imx-mu
57: 1 0 GPCV2 107 Edge 30bb0000.qspi
62: 0 0 gpio-mxc 2 Edge SW1
73: 0 0 gpio-mxc 13 Edge bmic_rtc_irq, bmic_adc_irq
284: 2 0 GPCV2 105 Edge 30901000.jr0
285: 0 0 GPCV2 106 Edge 30902000.jr1
286: 0 0 GPCV2 114 Edge 30903000.jr2
IPI0: 0 0 CPU wakeup interrupts
IPI1: 245 486 Timer broadcast interrupts
IPI2: 7940 13793 Rescheduling interrupts
IPI3: 64 141 Function call interrupts
IPI4: 0 0 CPU stop interrupts
IPI5: 1110 2486 IRQ work interrupts
IPI6: 0 0 completion interrupts
Err: 0
============================================
43: 55088 0 GPCV2 32 Edge 30830000.ecspi
これが、ECSPIのDMA割込みという事でしょうか?

seltec032

2023年4月21日 17時11分

> お世話になります、大隅です。

DeviceTreeに以下を追加した時と追加しない時で、SPI受信を実験しました。
dmas = <&sdma 2 7 1>, <&sdma 3 7 2>;
dma-names = "rx", "tx";

DMA使用の設定の有無に関わらず、ほぼ同じ値となっています。
でーたの取りこぼし現象も変化は無いようです。
設定によりDMAは動作していると言えるのでしょうか?

43: 14420 0 GPCV2 32 Edge 30830000.ecspi

サンプリング周波数:44.1kHz、約20秒間データ受信
44100*20/64=13781 ≒ 14420
64word毎に上がった割込み回数を示しているように見えます。

データ欠落とは、添付のグラフのような状態です。(赤丸で囲んだ箇所)
サンプリング周波数を44.1kHzを1/4の11kHzで受信すると、欠落は発生しません。

何かアドバイスがあればお願いします。

ファイル ファイルの説明
DMA使用.log DeviceTreeniDMA使用を登録した場合
DMA未使用.log DeviceTreeniDMA使用を登録しない場合
AD入力データ44.1kHz_1kHz(20230419)PRIO_-10.pdf 44.1kHzサンプリングデータ(赤丸箇所がデータ欠落)