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
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 等をご利用ください。
よろしくお願いします。