takamura.eiji
2025年7月10日 15時50分
==========
製品型番:AG9130-C03D0
Debian/ABOSバージョン:v3.21.3-at.14
==========
コンテナからRS485インターフェイスを利用して対向機とデータの送受信を行なうアプリケーションを開発したいと考えております。
A9Eのマニュアルの「3.6.10.4. ソフトウェア仕様」にデバイスファイルは「/dev/ttyrpmsg1」との記載があり、
こちらを利用するとの認識でおりますが、「3.6.10.5. 使用方法」の「図3.112」、「図3.113」にある例をそのまま実行したところエラーになってしまいます。
(A9E に root でログインして実行しました)
armadillo:~# podman pull docker.io/alpine
Trying to pull docker.io/library/alpine:latest...
Getting image source signatures
Writing manifest to image destination
2abc5e83407155714f171c293f197e1310176959e106f8ad63ffa2e7e9635d4a
armadillo:~# vi /etc/atmark/containers/serial_example.conf
armadillo:~# cat /etc/atmark/containers/serial_example.conf
set_image docker.io/alpine
set_command sleep infinity
add_devices /dev/ttyrpmsg1
armadillo:~# podman_start serial_example
Starting 'serial_example'
41db37ca1619d0e1b6c51a16e58a5f3b78ea3376579f1bd041fb8b320c88c1ba
armadillo:~# podman exec -it serial_example sh
/ # setserial -a /dev/ttyrpmsg1
setserial: can't get serial info: Not a tty
なおホスト OS でも setserial がありますが、実行してみると同様のエラーとなります。
armadillo:~# setserial -a /dev/ttyrpmsg1
setserial: can't get serial info: Not a tty
マニュアル記載のように現在の設定を確認することができないのですが原因は判りますでしょうか?
現在、作業が止まってしまっており早急な回答をお願いいたします。
コメント
takamura.eiji
回答頂きありがとうございます。
G3Lで実績のあるC言語のRS485アプリケーションをA9Eに移植しており、
取り急ぎ、コンテナ上で「/dev/ttyrpmsg1」のRS485初期化を実施してみたところioctl()でエラーとなってしまいました。
該当部分のソースコードは下記となりますが、これはioctl (TIOCGSERIAL)の未実装が原因でしょうか?
また、
未実装が原因で下記が実行できない場合ですが、代替方法はありますか?
================================================
#include
#include
#include
#include
#include
#include
#define TIOCSRS485 0x542F
int fdRS485;
void openRS485()
{
struct termios tio;
struct serial_rs485 rs485conf;
fdRS485 = open("/dev/ttyrpmsg1", O_RDWR);
if (fdRS485 < 0) {
return;
}
memset(&tio, 0x00, sizeof(tio));
memset(&rs485conf, 0x00, sizeof(rs485conf));
if (tcgetattr(fdRS485, &tio) != 0) {
close(fdRS485);
return;
}
cfmakeraw(&tio);
tio.c_cflag |= CREAD | CLOCAL | CS8;
tio.c_cflag &= ~PARENB;
tio.c_cc[VTIME] = 0;
tio.c_cc[VMIN] = 1;
if (cfsetspeed(&tio, B9600) != 0) {
close(fdRS485);
return;
}
if (tcsetattr(fdRS485, TCSANOW, &tio) != 0) {
close(fdRS485);
return;
}
rs485conf.flags |= SER_RS485_ENABLED;
rs485conf.flags |= SER_RS485_RTS_ON_SEND;
rs485conf.flags &= ~(SER_RS485_RTS_AFTER_SEND);
rs485conf.delay_rts_before_send = 0;
rs485conf.delay_rts_after_send = 20;
rs485conf.flags &= ~(SER_RS485_RX_DURING_TX);
if (ioctl (fdRS485, TIOCSRS485, &rs485conf) < 0) {
return;
}
}
================================================
代替方法が無い場合、追加で質問致します。
> 今後のアップデートに失敗している ioctl (TIOCGSERIAL) を実装します。
次期OSは、いつ頃リリースの予定でしょうか?
また、過去のバージョンで上記が動作可能なバージョンがあれば教えてください。
以上、よろしくお願いいたします。
at_dominique.m…
マルティネです。
> 該当部分のソースコードは下記となりますが、これはioctl (TIOCGSERIAL)の未実装が原因でしょうか?
TIOCSRS485 も対応してないですね…
こちらはもうすこし手間が必要ですので、すぐには実装できません。
Armadillo IoT A9E の LPUART0 (ttyrpmsg1) の RS485 対応は m33 コア側で実装していて、linux から簡単に操作できない状態です。
> 未実装が原因で下記が実行できない場合ですが、代替方法はありますか?
デフォルト状態でも RS485 は設定されています(Linux カーネルソースの arch/arm64/boot/dts/freescale/armadillo_iotg_a9e.dts: https://github.com/atmark-techno/linux-5.10-at/blob/master/arch/arm64/b… )
lpuart0 { compatible = "fsl,imx-rpmsg-tty-serial"; port_type = <TTY_TYPE_LPUART>; uart_index = <LPUART0>; rs485_flags = <(LPUART_RS485_ENABLED | LPUART_RS485_DE_ON_SEND)>; rs485_de_gpio = <PIN_PTA17>; suspend_wakeup_gpio = <PIN_PTA15>; /* rx pin selected in iomuxc */ };
ピンの変更は customize.dtbo で対応できますが、タイミングの変更(delay_rts_after_send等)は現状対応できない状態です。申し訳ございません。
こちらの設定は G3L から引き継いたものということでしたら、一旦設定せずに使ってみてください。
どうしても変更は必要な場合は m33側に実行している m33-firmware-at の変更で対応可能だと考えていますが、そういう変更はサポートできないのであまり推奨できません。
>> 今後のアップデートに失敗している ioctl (TIOCGSERIAL) を実装します。
>
> 次期OSは、いつ頃リリースの予定でしょうか?
TIOCGSERIAL だけでしたら今月末にでも実装できると思いますが、今の返事ではたりなさそうですので一旦社内に確認させてください。
> また、過去のバージョンで上記が動作可能なバージョンがあれば教えてください。
申し訳ございません、ありません。
不具合ではなく、(NXP から頂いたコードも含めて)未実装のは問題ですので、過去のバージョンでも動作しません。
① TIOCSRS485 の ioctl を一旦外して、デフォルトの rs485 設定で試してください。
② だめしたら対応方法を考えますので少し時間をください。
お手数ですが、よろしくお願いします。
takamura.eiji
takamura.eiji
マルティネ さま
> ①TIOCSRS485 の ioctl を一旦外して、デフォルトの rs485 設定で試してください。
こちらを試しましたが、全く動かない訳では無さそうですが期待動作(=G3Lの動作)ではありません。
送信と受信確認用のサンプルコード(ioctlはコメントアウトしてます)を添付します。
それぞれの実行結果は以下でした。
■受信検証結果
・受信データ
0x30 0x31 0x32
・A9Eサンプル実行時の出力結果
30
31
32
・期待する出力(G3L時の動作)
30 31 32
■送信検証結果
・A9Eサンプル実行時の送信結果
hello0
hello1
hello2
hello3
hello4
h
ello5
h
ello6
h
ello7
he
llo8
hel
lo9
・期待する送信(G3L時の動作)
hello0
hello1
hello2
hello3
hello4
hello5
hello6
hello7
hello8
hello9
→ read(受信)は複数データを外からプログラム側に送信しても、1バイト受信するごとに read のブロッキングが解除されるような動作になっている。
→ write(送信) はデータが途切れて送信される。
これらの結果は、ioctl (TIOCGSERIAL) 未実装が原因ですか?
それとも使い方の問題でしょうか?
以上、宜しくお願い致します。
ファイル | ファイルの説明 |
---|---|
write.c | RS485送信検証用サンプル |
read.c | RS485受信検証用サンプル |
takamura.eiji
at_dominique.m…
マルティネです。
> → read(受信)は複数データを外からプログラム側に送信しても、1バイト受信するごとに read のブロッキングが解除されるような動作になっている。
>
> → write(送信) はデータが途切れて送信される。
>
> これらの結果は、ioctl (TIOCGSERIAL) 未実装が原因ですか?
> それとも使い方の問題でしょうか?
ドライバの違いで挙動が変わりましたが、TIOCGSERIAL とは関係ありません。
不具合でもないと考えています。
RS485としては「メッセージ」という概念がなくて、ユーザースペースの一つの read() で受信するバッファーは一つの write() と同じ長さになる保証はありません。
受信中の read() を起こすタイミングはドライバーが勝手に決めていいもので、Armadillo IoT A9E の場合は一文字を受信してから 1ms を待って受けた分をすぐ処理するようになっていて、9600 baud ですとほぼ確実に1文字ずつになってしまいますね…
効率悪いといえば悪いですので baud rate によってそのタイミングを変更するか idle になるまでを待つ処理を実装してもいいと思いますが、保証は全くないので、これはプログラムでなにかのプロとコーロを決めて、例えば改行まで読み込むか長さを送ってその長さを読み込む等の処理が必要となります。
送信に関してはすみません、G3L ではなく Armadillo IoT A6E と比較しましたが再現できませんでした(A6E側が helloX まで一気に読み込んでいて、念の為オシロスコープで波形を比べましたが idle に戻らずちゃんと送信されています)が、こちらも同じく化けてるわけではなくおそらくタイミングの差だと思いますので、こちらも対向機が対応するべきです。
こちらの試験は市販の対向機で発生した問題でしょうか?
お手数ですがアプリケーションでの対応が必要になるかと思います。
受信の際に文字をまとめるかどうかは、他のドライバーを確認してからまた返事します。
よろしくお願いします
at_dominique.m…
マルティネです。
> 受信の際に文字をまとめるかどうかは、他のドライバーを確認してからまた返事します。
こちらですが、termios の VTIME 設定で 0.0x 秒を待ってから read() のデータをまとめて受信できるようにできるはずですが、設定しても影響なかったのでこれもなにかドライバの実装がたりないかもしれません。
今月末のアップデートに間に合わないかもしれませんが8月末までにドライバを見直してまとめて受信できるようになります。
お手数ですがそれまではやっぱり連続の read() でバッファーに文字を追加する形でお願いします
よろしくお願いします
takamura.eiji
at_mizo
溝渕です。
現在見えている問題の解決には恐らくなりませんが、今月(2025/7)末のアップデートでドライバのアップデートを行います。
元々tty driverとして実装されていたのをuart driverに変更する事で、利用できなかったいくつかのtty ioctl commandに対応しました。これにより、製品マニュアルに記載の操作は可能になります。
RS485設定については変わらずsystem callから実行する事はできません。また、VTIME等の設定も反映されません。
今週中にリリース予定ではありますが、現状のリリース候補のパッチを添付しておきます。
ファイル | ファイルの説明 |
---|---|
0001-serial-imx_rpmsg-change-tty-driver-to-uart-driver.patch |
at_dominique.m…
2025年7月10日 17時40分
takamura.eijiさん
お世話になています、
マルティネです。
> A9Eのマニュアルの「3.6.10.4. ソフトウェア仕様」にデバイスファイルは「/dev/ttyrpmsg1」との記載があり、
> こちらを利用するとの認識でおりますが、「3.6.10.5. 使用方法」の「図3.112」、「図3.113」にある例をそのまま実行したところエラーになってしまいます。
> (A9E に root でログインして実行しました)
>
> マニュアル記載のように現在の設定を確認することができないのですが原因は判りますでしょうか?
> 現在、作業が止まってしまっており早急な回答をお願いいたします。
大変申し訳ございません、ドライバーの実装漏れですがマニュアルの確認不足でもあります。
今後のアップデートに失敗している ioctl (TIOCGSERIAL) を実装します。
それまでは setserial コマンドを利用できませんが、tty としては利用できますので、tty の設定は stty 等をご利用ください。
よろしくお願いします。