Armadilloフォーラム

RS485 のカーネルコンフィグについて(Armadillo-640)

rfujigaya

2021年10月7日 19時38分

お世話になっております。藤ヶ谷です。

Armadillo-640 の UART2 を使って、RS-485 にて機器との通信をしようとしています。
Armadillo と機器との間には、こちらで製作した拡張ボード(RS-422/RS-485 インターフェース IC)があり、
Armadillo の全二重通信を RS-485 の半二重通信に変換しています。

Armadillo から拡張ボードの DE 端子に繋いでおり、GPIO でソフトウェアで HI/LO を切り替えて送信制御をしておりましたが、
送信した後、機器から Armadillo への返答データがうまく受信できない場合があり解決策を探しています。
まさに別スレッドの「RS485の半二重シリアル通信について(https://armadillo.atmark-techno.com/forum/armadillo/6759)」と同じ状況ですので、
そちらのスレッドと同じように UART ドライバの RS485 機能を試したくカーネルをビルドしたのですが、送信ができていない状態です。

デバイスツリーを次の通り変更したのですが、適切な内容となっていますでしょうか?

<armadillo-640.dts>  ※標準の dts ファイルに下記の記載を追記

&uart2 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_uart2>;
 
	rts-gpios = <&gpio4 7 GPIO_ACTIVE_HIGH>;
 
	rs485-rts-active-high;
	rs485-enabled-at-boot-time;
 
	status = "okay";
};
 
(・・略・・)
 
&iomuxc {
 
	(・・略・・)
 
	pinctrl_uart2: uart2grp {
		fsl,pins = <
			MX6UL_PAD_UART2_TX_DATA__UART2_DCE_TX 0x00008
			MX6UL_PAD_UART2_RX_DATA__UART2_DCE_RX 0x1b0b1
			MX6UL_PAD_NAND_DATA05__GPIO4_IO07 0x00008
		>;
	};
 
	(・・略・・)
 
};

※ CON9-26 を拡張ボードの DE および !RE に接続しています。

※ 今回の回路構成では CTS に相当する端子を接続していませんので、
  uart-has-rtscts は指定せず、RE 用のピン設定も不要との認識ですが合ってますでしょうか?
  念のため「fsl,uart-has-rtscts;」を追加して確認してもみましたが、
  何回か送信処理した後、Armadillo 側のプログラムが応答なしとなりました。

※ 上記スレッドでは、DMA の無効化パッチの言及がありますが、
  こちらの件でもパッチの効果はありそうでしょうか?
  ベースの imx.c が異なっているようで適用できておりません。

よろしくお願いいたします。

コメント

入江です。

> デバイスツリーを次の通り変更したのですが、適切な内容となっていますでしょうか?

DEがactive highならば、rs485-rts-on-sendが必要であり、
DEがactive lowならば、rs485-rts-after-sendが必要です。

> ※ 今回の回路構成では CTS に相当する端子を接続していませんので、
>   uart-has-rtscts は指定せず、RE 用のピン設定も不要との認識ですが合ってますでしょうか?

uart-has-rtsctsは必要です。

> ※ 上記スレッドでは、DMA の無効化パッチの言及がありますが、
>   こちらの件でもパッチの効果はありそうでしょうか?
>   ベースの imx.c が異なっているようで適用できておりません。

そちらは、linux-4.9-atの不具合であり、Armadillo-640で使用している
linux-4.14-atでは問題ありませんので、パッチを適用して頂く必要はありま
せん。

お世話になります。藤ヶ谷です。
ご返答ありがとうございます。

dts ファイルを修正してみましたが、やはり送信できませんでした。
プログラムでエラーとなったため、次の手順でも確認しましたが Armadillo から送信されていないように見えますがいかがでしょうか?

 
<確認内容>
・通信設定

# stty -F /dev/ttymxc1 raw -echo 19200 cs8 parenb -parodd -cstopb crtscts

・データ送信

# echo -n "20" >/dev/ttymxc1

 ⇒ コマンド実行後、数秒ブロックされてシェルに応答が戻る。
・送信バイト数を確認

# cat /proc/tty/driver/IMX-uart
serinfo:1.0 driver revision:
0: uart:IMX mmio:0x02020000 irq:18 tx:7369 rx:1 brk:1 RTS|DTR|DSR|CD
1: uart:IMX mmio:0x021E8000 irq:52 tx:0 rx:0 DSR|CD
2: uart:IMX mmio:0x021EC000 irq:53 tx:0 rx:0
4: uart:IMX mmio:0x021F4000 irq:54 tx:0 rx:0 DSR|CD

 ⇒ ttymxc1 の tx は 0 のまま変わらず。
 ⇒ 送信されていないように見受けられます。

※ echo -n "20" >/dev/ttymxc1 が実行されている間に
  IMX-uart を確認すると、フラグが DTR|DSR|CD となっており、
  コマンドが終了するとまた、DSR|CD に戻ります。

※ echo コマンドが実行されている間も終了した後も、
  CON9-26 の電圧をテスターで測ったところ LO(0V 付近)のままのようです。

 
<armadillo-640.dts(修正後)>  ※標準の dts ファイルに下記の記載を追記

&uart2 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_uart2>;
 
	uart-has-rtscts;
	rts-gpios = <&gpio4 7 GPIO_ACTIVE_HIGH>;
 
	rs485-rts-active-high;
	rs485-enabled-at-boot-time;
	rs485-rts-on-send;
 
	status = "okay";
};
 
(・・略・・)
 
&iomuxc {
 
	(・・略・・)
 
	pinctrl_uart2: uart2grp {
		fsl,pins = <
			MX6UL_PAD_UART2_TX_DATA__UART2_DCE_TX 0x00008
			MX6UL_PAD_UART2_RX_DATA__UART2_DCE_RX 0x1b0b1
			MX6UL_PAD_NAND_DATA05__GPIO4_IO07 0x00008
		>;
	};
 
	(・・略・・)
 
};

 
>> ※ 上記スレッドでは、DMA の無効化パッチの言及がありますが、
>>   こちらの件でもパッチの効果はありそうでしょうか?
>>   ベースの imx.c が異なっているようで適用できておりません。

>そちらは、linux-4.9-atの不具合であり、Armadillo-640で使用している
>linux-4.14-atでは問題ありませんので、パッチを適用して頂く必要はありま
>せん。
DMA のパッチ不要の旨承知いたしました。

入江です。

原因究明のため、お使いのArmadilloに書き込んでいるdtbファイルを送って
いただけますでしょうか。

[armadillo]# ls /boot/a640.dtb  <-こちらを送ってください。

よろしくお願いいたします。

お世話になっております。藤ヶ谷です。

a640.dtb を添付いたします。
お手数をおかけしますがよろしくお願いします。

ファイル ファイルの説明
a640.dtb

入江です。

sttyでcrtsctsを無効にした上で動作確認していただけますでしょうか。

お世話になっております。藤ヶ谷です。

通信設定を次の通り、「crtscts」の指定を削除しましたところ、送信・受信ともにできました。
ありがとうございました。

・通信設定

# stty -F /dev/ttymxc1 raw -echo 19200 cs8 parenb -parodd -cstopb

・送信バイト数を確認

# cat /proc/tty/driver/IMX-uart
serinfo:1.0 driver revision:
0: uart:IMX mmio:0x02020000 irq:18 tx:7433 rx:1 brk:1 RTS|DTR|DSR|CD
1: uart:IMX mmio:0x021E8000 irq:52 tx:280 rx:105 DSR|CD
2: uart:IMX mmio:0x021EC000 irq:53 tx:0 rx:0
4: uart:IMX mmio:0x021F4000 irq:54 tx:0 rx:0 DSR|CD

 ⇒ ttymxc1 の tx、rx 共にカウントされている。
   相手先機器でも受信インジケータが点灯しており、想定通りの通信ができていることを確認できました。