Armadilloフォーラム

Armadillo-IoT A6:UART1による通信について

sho_oikawa

2021年8月5日 13時28分

お世話になっております。
及川と申します。

URL(https://armadillo.atmark-techno.com/forum/armadillo/9188)と製品マニュアルの内容を
参考にUART1を有効化し、そのDTBやカーネルを更新したのですが、
[/dev/ttymxc0]が表示されません。
[/dev/ttymxc1], [/dev/ttymxc2]は出現しているのですが、これのどちらかでしょうか。
もしくは別途出現させる方法があるのでしょうか。

また、開発環境中の[at-dtweb]のピン番号とマルチプレクス表の番号が異なっていると思われ、
若干混乱しました。。。
可能でしたらどちらかで統一いただけると助かります。

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

コメント

at_mitsuhiro.yoshida

2021年8月5日 14時48分

吉田です。

カーネル at35 に対して、 at-dtweb 2.5.2 で uart1 を有効にし生成した dtsi を使用して
ビルドした armadillo-iotg-a6-at-dtweb.dtb を適用し
/dev/ttymxc0 が出現することは確認いたしました。

生成された armadillo-iotg-a6-expansion-interface.dtsi を添付いただけますでしょうか。
また、お手数ですがどのような環境で動作確認されているのかをご記載いただけますでしょうか。
- C1 か U1 モデルか
- カーネルバージョン
- ブート手段(eMMC / SD / USB)
- 使用しているのあれば、適用しているインストールディスクイメージのバージョン
- 使用している at-dtweb のバージョン、ATDE8 上以下のコマンドで確認できます。

dpkg -l | grep at-dtweb

> また、開発環境中の[at-dtweb]のピン番号とマルチプレクス表の番号が異なっていると思われ、
> 若干混乱しました。。。
> 可能でしたらどちらかで統一いただけると助かります。

ご指摘ありがとうございます。
at-dtweb を修正したいと思います。

よろしくお願いします。

sho_oikawa

2021年8月5日 15時20分

お世話になります。
及川です。

吉田様、確認いただきましてありがとうございます。

> 生成された armadillo-iotg-a6-expansion-interface.dtsi を添付いただけますでしょうか。
> また、お手数ですがどのような環境で動作確認されているのかをご記載いただけますでしょうか。
> - C1 か U1 モデルか
 U1モデルとなります。

> - カーネルバージョン
 linux-v4.14-at34を基に作成しています。
 armadillo上の[uname -r]でも[4.14-at34]と表示されました。

> - ブート手段(eMMC / SD / USB)
 ブートはeMMCとなっています。イメージ上書きの時にUSBを使用しています。

> - 使用しているのあれば、適用しているインストールディスクイメージのバージョン
 インストールディスクは自作です。ベースは[at-debian-builder-v2.1.1]です。
 自作とはいえ、現状はほぼ変更点なしです。

> - 使用している at-dtweb のバージョン、ATDE8 上以下のコマンドで確認できます。
 at-dtwebは2.5.2となっております。

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

ファイル ファイルの説明
armadillo-iotg-a6-expansion-interface_dtsi.txt

at_mitsuhiro.yoshida

2021年8月5日 15時49分

吉田です。

DTB の更新手順を確認したいのですが、
いただいた文章から推測しますと、

(1) USB ブートで起動
(2) ATDE8 から Armadillo へビルドした armadillo-iotg-a6-at-dtweb.dtb を転送
(3) 以下の手順で DTB を更新

[armadillo ~]# mount /dev/mmcblk0p2 /mnt
[armadillo ~]# cp armadillo-iotg-a6-at-dtweb.dtb /mnt/boot/a640.dtb
[armadillo ~]# umount /mnt

(4) 電源オフ
(5) eMMC ブートで起動

の手順となりますでしょうか。

sho_oikawa

2021年8月5日 17時25分

お世話になります。
及川です。

更新手順についてですが、
(1)[make-install-disk-image-v1.2.0]を用いて、
 用意したカーネル、ブートローダ、DTBなどをまとめてビルドし、
 [install-disk-sd-aiota6-YYYYMMDD.tar.gz]を作成。
(2)空のUSBにddコマンドで書込み
(3)電源断したArmadilloに差し込み、ボタンを押下しながら立ち上げ、USBによる書き込みを実施。

の流れを取っていました。

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

at_mitsuhiro.yoshida

2021年8月5日 17時57分

吉田です。

手順のご連絡ありがとうございます。
同様の手順にて、確認を実施しました。

(1) make-install-disk-image v1.2.0 で以下のバイナリを使用してインストールディスクイメージを作成。
u-boot: v2018.03-at9
カーネル: at35
DTB: armadillo-iotg-a6-at-dtweb.dtb
ユーザーランド: v20210531

(2) USB メモリに dd コマンドで書き込み

(3) USB ブートで Armadillo へのインストールを実施。

(4) eMMC ブートで Armadillo を起動

したところ、/dev/ttymxc0 が出現しております。

お手数ですが、ご利用の DTB や各種手順の再度ご確認をお願いします。

sho_oikawa

2021年8月5日 19時35分

お世話になります。
及川です。

手順として教えていただいた手順と
ほぼ同じようにやってみましたが、/dev/ttymxc0が出ません。
教えていただいた手順と違う点としてはブートローダがat8となっているくらいで、
カーネルもat35に上げ、ユーザーランドも独自のものでなく、v20210531のものを用いりましたが、
それでも対象のデバイスが出ませんでした。
他に何か確認すべき点はありますでしょうか。。。

追加できる情報としてはU1モデルの中でも開発用のキットということはあります。

> (1) make-install-disk-image v1.2.0 で以下のバイナリを使用してインストールディスクイメージを作成。
> u-boot: v2018.03-at9
> カーネル: at35
> DTB: armadillo-iotg-a6-at-dtweb.dtb
> ユーザーランド: v20210531
>
> (2) USB メモリに dd コマンドで書き込み
>
> (3) USB ブートで Armadillo へのインストールを実施。
>
> (4) eMMC ブートで Armadillo を起動
>
> したところ、/dev/ttymxc0 が出現しております。
>
> お手数ですが、ご利用の DTB や各種手順の再度ご確認をお願いします。

ファイル ファイルの説明
ls.txt

at_mitsuhiro.yoshida

2021年8月6日 8時49分

吉田です。

https://qiita.com/spicemanjp/items/5054e536442248aad87c
に DTB から DTS にする手順がありますので、
ご利用の armadillo-iotg-a6-at-dtweb.dtb の中に
UART1 の記述が含まれているか確認する手はあるかと思います。

sho_oikawa

2021年8月6日 11時35分

お世話になります。
及川です。

dtsの内容を確認したところ、内部にはuart1の内容がありませんでした。

改めて見直したところ、根本的な所で勘違いしておりまして、
[at-dtweb]で対応したdtbは[armadillo-iotg-a6-at-dtweb.dtb]を使用する必要があると気づかず、
通常の[armadillo-iotg-a6.dtb]を用いておりました。

変更後のdtbを用いたところ無事[ttymxc0]が表示されました。
ご対応いただきありがとうございました。

> 吉田です。
>
> https://qiita.com/spicemanjp/items/5054e536442248aad87c
> に DTB から DTS にする手順がありますので、
> ご利用の armadillo-iotg-a6-at-dtweb.dtb の中に
> UART1 の記述が含まれているか確認する手はあるかと思います。

sho_oikawa

2021年8月6日 13時47分

お世話になります。
及川です。

UART1を用いてシリアル通信を行う予定なのですが、
この部分はデフォルトで全二重、半二重のどちらでしょうか。

切り替えが可能だとすると、https://armadillo.atmark-techno.com/forum/armadillo/1444
のようにスイッチ押下状態で立ち上げたあとの画面で
設定を実施するということでしよいでしょうか。

もしその場合、記載にあった
[setenv console=ttymxc1,115200 mxc_uart.rs485_uart1=0x13,0,0]
の内容において、[mxc_uart.rs485_uart1]にあたる記載をどのように変更すればよいか
お教えいただきたいです。

お手数ではございますが、よろしくお願いいたします。

at_mitsuhiro.yoshida

2021年8月6日 15時24分

吉田です。

拡張ピンの uart1 は uart としての使用が可能で、 RS-485 としては使用できません。
RS-485 を利用したい場合は、
Armadillo-IoT ゲートウェイ A6 U1 モデル用 拡張 I/O ボード 01
https://armadillo.atmark-techno.com/option-products/OP-AG61-EXT01-00
を使用する方法や、USB RS-485 変換を利用する手段があります。

sho_oikawa

2021年8月6日 18時53分

お世話になります。
及川です。

吉田様
回答いただきありがとうございます。

Linuxでの全二重通信の経験が無く、
認識に誤りがあるかもしれませんがご容赦ください。

RS-485による通信を行うわけではなく、UARTでの通信を行いたく思っております。
参考とさせていただいたURLではRS-485について全/半二重の切り替えを行っておりましたので、
UARTでもそのような設定が必要かと思った次第です。

今回はUARTの[/dev/ttymxc0]に対してC言語のread, write関数を用いて
全二重通信を行いたく思っています。
・read関数で待ちつつ、送る内容があれば任意のタイミングでwrite関数で送信する
・readで受信した内容があれば、その内容に応じてwrite関数で返答を送信する
といったことが目標です。

次の何点かをお教えいただけると助かります。

①read, writeを[/dev/ttymxc0]に行うことで通信可能でしょうか。
 また、read関数を用いる際に対象のデバイスをopenし、readの待機を行う傍らで
 別スレッドから対象のデバイスをopenし、writeで書き込みを行うことは可能でしょうか。
 (同時にopenがそもそも可能でしょうか。。。)
②C言語でなく、コマンドによって対象のデバイスの内容を読み込み、書込みする方法などはあるでしょうか。
③全二重、半二重共に関連デバイスファイルは[/dev/ttymxc0]のみでしょうか。

以上、お力添えいただければ幸いです。
よろしくお願いいたします。

at_koseki

2021年8月10日 23時19分

古関です。

RS232C、UARTでは規格上、TxD/RxDを使った全二重通信しかできません。

以下のWebサイト等を見てみてUART, RS232C, RS485, シリアル通信
全二重、半二重、などに関して調べてみてください。
https://www.lineeye.co.jp/html/term_tanko.html
https://ja.na4.teamsupport.com/knowledgeBase/17794746

RS485は規格上、全二重、半二重どちらもあります。

> Armadillo-IoT ゲートウェイ A6 U1 モデル用 拡張 I/O ボード 01
> https://armadillo.atmark-techno.com/option-products/OP-AG61-EXT01-00
こちらの製品はArmadillo-IoT A6のUART1に
RS485のトランシーバーを接続し、RS485通信できるようにした製品です。

> ①read, writeを[/dev/ttymxc0]に行うことで通信可能でしょうか。
はい。open/read/writeすることで通信可能です。

>  また、read関数を用いる際に対象のデバイスをopenし、readの待機を行う傍らで
>  別スレッドから対象のデバイスをopenし、writeで書き込みを行うことは可能でしょうか。
>  (同時にopenがそもそも可能でしょうか。。。)
c言語からなら多重にopenも別スレッドからのread/writeもできると思いますが、
プログラミングの難易度はそこそこあがります。

また、もし差し支えなければ教えていただきたいのですが、
uartで通信したい対向機を教えていただけますでしょうか?
何が具体的に制御したいモノが分かった方が、適切なサポートができそうです。

> ②C言語でなく、コマンドによって対象のデバイスの内容を読み込み、書込みする方法などはあるでしょうか。

対向機のデバイスが文字列制御な対話型なら
minicomやcu等のターミナルソフトで動かせます。

ワンライナーのコマンドでやりたいなら
sttyでシリアルに関する設定を実行し、
(stty、項目が多くて結構むずかしいです)

読み書きしたい内容が文字列なのであれば、
cat /dev/ttymxc0 でread
echo "hogehoge" > /dev/ttymxc0 でwrite

バイナリなのであれば、
hexdump /dev/ttymxc0 でread
echo -e "\xAA\xBB\xCC\xDD\xEE" > /dev/ttymxc0 でwrite

等でできるとおもいます。

> ③全二重、半二重共に関連デバイスファイルは[/dev/ttymxc0]のみでしょうか。
シリアル通信に関するデバイスファイルは/dev/tty****ですね。
c言語からなら、open, read/write. ioctl, termiosなどで制御できます。

sho_oikawa

2021年8月23日 11時11分

お世話になっております。
及川です。

古関様、回答いただきありがとうございます。
反応が遅くなりすみません。

> > ①read, writeを[/dev/ttymxc0]に行うことで通信可能でしょうか。
> はい。open/read/writeすることで通信可能です。

open/closeとマルチスレッドによってファイルの読み書きができました。
ありがとうございます。

> > ②C言語でなく、コマンドによって対象のデバイスの内容を読み込み、書込みする方法などはあるでしょうか。
>
> 対向機のデバイスが文字列制御な対話型なら
> minicomやcu等のターミナルソフトで動かせます。

今回はとりあえずCにて通信を行うことができました。
今後の参考とさせて頂きます。

> > ③全二重、半二重共に関連デバイスファイルは[/dev/ttymxc0]のみでしょうか。
> シリアル通信に関するデバイスファイルは/dev/tty****ですね。
> c言語からなら、open, read/write. ioctl, termiosなどで制御できます。

termiosやopen, read/writeを用いて対象のデバイスファイルと通信することができました。

以上、ありがとうございました。