k.sato
2023年7月12日 11時34分
佐藤と申します。
お世話になっております。
uart5からシリアル通信(RS-485)を行えることを確認したいです。
Armadillo-640製品マニュアル Armadillo Base OS 対応
https://manual.atmark-techno.com/armadillo-640/armadillo-640_product_ma…
上記の10.1.CUI アプリケーションを開発する
にシリアル通信を追加して[App run on Armadillo] を実行する
方法がありましたら教えていただけませんか?
以上、よろしくお願い致します。
コメント
k.sato
マルティネ様
佐藤です。
回答ありがとうございます。
>add_devices /dev/ttymxc4
を追加しdev.swu を再生成してArmadilloに書き込みました。
cat /etc/atmark/container/python_app.conf
で追記されていることを確認しました。
[App run on Armadillo] を実行すると下記のエラーが出ました。
Starting 'python_app' python_app 0ef312c78b06bad30f1a2e38cea6d6ee41ef1ca9c5b879bc3155bc28f199c41f Traceback (most recent call last): File "/vol_app/src/main.py", line 10, in <module> import serial ModuleNotFoundError: No module named 'serial' * ターミナルはタスクで再利用されます、閉じるには任意のキーを押してください。
ATDE上?vscode上?でpyserialなどをインストールしなければなりませんか?
どのコマンドをどこで入力すればよいですか?
at_dominique.m…
佐藤さん、
マルティネです。
> [App run on Armadillo] を実行すると下記のエラーが出ました。
>
> Starting 'python_app' > python_app > 0ef312c78b06bad30f1a2e38cea6d6ee41ef1ca9c5b879bc3155bc28f199c41f > Traceback (most recent call last): > File "/vol_app/src/main.py", line 10, in <module> > import serial > ModuleNotFoundError: No module named 'serial' > * ターミナルはタスクで再利用されます、閉じるには任意のキーを押してください。 >
> ATDE上?vscode上?でpyserialなどをインストールしなければなりませんか?
> どのコマンドをどこで入力すればよいですか?
実行しているのは Armadillo に転送したコンテナなので、コンテナにインストールしてください。
具体的に、vscode プロジェクトの container/packages.txt に debian のパッケージを追加すれば、次にコンテナを生成するときにインストールされます。
pyserial は python3-serial のパッケージですね。
packages.txt 編集後に再び「Generate development SWU」から実行して、コンテナを「リビルドしますか?」の質問に「y」を答えてからまた SWU の更新でコンテナが更新されます。
よろしくお願いします。
k.sato
k.sato
at_dominique.m…
佐藤さん、
マルティネです。
> 続けて受信の確認をしているのですが下記のようにしても
>
> result = ser.readline() > print(result) >
>
> ファイルに出力したところ受信データが書き込まれていました。
> vscodeのターミナルやデバッグコンソールに出力する方法がありましたら
> 教えていただけませんか?
「App run on Armadillo」でアプリケーションを起動した後にコンテナのログ出力を表示しつづく実装になっているはずですが、出力が表示されてないですか?
すでに試した場合は申し訳ないですが、ser.readline() の前(コードの最初のところ)に何か print 命令を追加してみてください。
App run on Armadillo でだめでしたら、デバグコンソールにログインして「podman logs -f python_app」でコンテナのログを表示できます、そこに python のアプリケーションの出力があるはずです。(ctrl+C で停止します)
よろしくお願いします
k.sato
マルティネ様
佐藤です。
> 「App run on Armadillo」でアプリケーションを起動した後にコンテナのログ出力を表示しつづく実装になっているはずですが、出力が表示されてないですか?
> すでに試した場合は申し訳ないですが、ser.readline() の前(コードの最初のところ)に何か print 命令を追加してみてください。
vscodeのターミナルには表示されていません。
先頭でprint命令を追加しても表示しません。
ただ受信を続けていると時間がたってから
ターミナルに受信データがまとめて出力されます。
> App run on Armadillo でだめでしたら、デバグコンソールにログインして「podman logs -f python_app」でコンテナのログを表示できます、そこに python のアプリケーションの出力があるはずです。(ctrl+C で停止します)
Armadilloにuart1からログインして「podman logs -f python_app」を入力しましたが
ここもターミナルと同じタイミングでまとめて出力されているようでした。
at_dominique.m…
佐藤さん、
マルティネです。
> > App run on Armadillo でだめでしたら、デバグコンソールにログインして「podman logs -f python_app」でコンテナのログを表示できます、そこに python のアプリケーションの出力があるはずです。(ctrl+C で停止します)
> Armadilloにuart1からログインして「podman logs -f python_app」を入力しましたが
> ここもターミナルと同じタイミングでまとめて出力されているようでした。
なるほど、バッファリングされますね。
vscode のターミナルと uart1 のコンソールで同じタイミングになりますので、python からの出力が直接に buffering されていると思います。
すみません、今まで shell のプロジェクトで試していましたが python では確かにただ print() で表示するとまとめて出力されますね。お手数をおかけしました。
解決方法が二つあります、以下のどれかを実行してください:
- print 関数に flush の任意引数がありますので、すぐにみたい時に「print("message message", flush=True)
」で出力をすぐに表示できます
- python のバッファリングするかどうかの判断に「出力がターミナルの場合にすぐ表示します」の仕組みがありますので、コンテナのコンフィグファイル(swu/python_ap/etc/atmark/containers/python_app.conf) に 「add_args -t
」を追加することでコンテナに tty を渡せます。そうすると自動的に毎回表示されます。
このコンフィグの更新は再び「Generate development swu」とそのインストールが必要です
これは少し意外ですので、今度の更新で -t オプションをデフォルトに設定しようと思います(新しいプロジェクトを作らないと影響ありません)。ご連絡をいただいて助かります。
よろしくお願いします。
k.sato
マルティネ様
佐藤です。
> - python のバッファリングするかどうかの判断に「出力がターミナルの場合にすぐ表示します」の仕組みがありますので、コンテナのコンフィグファイル(swu/python_ap/etc/atmark/containers/python_app.conf) に 「add_args -t
」を追加することでコンテナに tty を渡せます。そうすると自動的に毎回表示されます。
> このコンフィグの更新は再び「Generate development swu」とそのインストールが必要です
こちらの方法で無事ターミナルにデバッグ出力されるようになりました。
ありがとうございました。
続けて聞いてもよいのかわかりませんが
RS485の送受信の切替ピンはGPIO制御で行うことになりますか?
●Armadillo-640:pythonでGPIO制御
https://armadillo.atmark-techno.com/blog/615/4300
上記のブログを参考にして下記のように組んでみました。
# GPIO export export = '/sys/class/gpio/export' # RS-485 DE/RE pin output re_de = '/sys/class/gpio/gpio23' # GPIO export with open(export, "w") as f: print('23', file=f) # GPIO output with open(f'{re_de}/direction', "w") as f: print('out', file=f) print("main loop start") while True: # GPIO DE with open(f'{re_de}/value', "w") as f: print('1', file=f) # uart5 send data = "hello" enc = 'shift-jis' ser.write(bytes(data, enc)) # GPIO RE with open(f'{re_de}/value', "w") as f: print('0', file=f)
dev.swuを書き込みArmadilloが起動したときは問題ないのですが、
「App run on Armadillo」でデバッグを開始すると下記のエラーが出ます。
Traceback (most recent call last): File "/vol_app/src/main.py", line 168, in <module> rs485() File "/vol_app/src/main.py", line 112, in rs485 print('23', file=f) OSError: [Errno 16] Device or resource busy
指定箇所をコメントアウトするとデバッグ動作できるようになります。
何か設定が足りないのでしょうか?
解決方法を教えていただけませんか?
at_dominique.m…
佐藤さん、
マルティネです。
> 「App run on Armadillo」でデバッグを開始すると下記のエラーが出ます。
> Traceback (most recent call last): > File "/vol_app/src/main.py", line 168, in <module> > rs485() > File "/vol_app/src/main.py", line 112, in rs485 > print('23', file=f) > OSError: [Errno 16] Device or resource busy
> 指定箇所をコメントアウトするとデバッグ動作できるようになります。
> 何か設定が足りないのでしょうか?
「App run on armadillo」を実行するとアプリケーションを再び起動させますので、
プログラムを何回か実行しても成功するように書かないといけません。
今回のエラーは、「/sys/class/gpio/export」にすでに export されている gpio を再び export しようとするときのエラーですので、
「/sys/class/gpio/gpio23」が存在しないときだけに export させてください。
(ちなみに、sysfs を使うことで問題がありませんが、gpiod を使うと export などが不要になったインタフェースなので、よろしければ試してみてください。頻繁に変更する場合はおすすめします。
pin は gpiochip + chip内の pin で指定しますので、今回は gpiochip0 / 23 ですね、 https://manual.atmark-techno.com/armadillo-640/armadillo-640_product_ma… に書いている様に add_devices で /dev/gpiochip0 をコンテナに提供する必要があります。
検索してみたら https://blog.goediy.com/?p=1650 に python で使う説明がありました)
よろしくお願いします
k.sato
マルティネ様
佐藤です。
> 今回のエラーは、「/sys/class/gpio/export」にすでに export されている gpio を再び export しようとするときのエラーですので、
> 「/sys/class/gpio/gpio23」が存在しないときだけに export させてください。
そうか「/sys/class/gpio/gpio23」のディレクトリで確認すればよかったのですね。
「/sys/class/gpio/export」のファイルを開いて確認しようとして
PermissionError: [Errno 13] Permission denied: '/sys/class/gpio/export'
となり、権限をどうしようかと思っていました。
> pin は gpiochip + chip内の pin で指定しますので、今回は gpiochip0 / 23 ですね、 https://manual.atmark-techno.com/armadillo-640/armadillo-640_product_ma… に書いている様に add_devices で /dev/gpiochip0 をコンテナに提供する必要があります。
> 検索してみたら https://blog.goediy.com/?p=1650 に python で使う説明がありました)
ありがとうございます。
10.2.4. 入出力デバイスを扱うは見ていたのですがpythonでどう使うかわからずにいました。
# DE_RE を出力に設定 chip = gpiod.Chip('gpiochip0', gpiod.Chip.OPEN_BY_NAME) pa1 = chip.get_line(23) pa1.request(consumer='foo', type=gpiod.LINE_REQ_DIR_OUT) print("main loop start") while True: # GPIO DE pa1.set_value(1) # uart5 send data = "hello" enc = 'shift-jis' ser.write(bytes(data, enc)) # GPIO RE pa1.set_value(0)
上記とすることで送受信切替ピンの制御は出来るようになったのですが、
送信が完了する前にDEピンが落ちるようになりました。
この状態は正しいのでしょうか?
ディレイを入れるしかないですか?
ファイル | ファイルの説明 |
---|---|
sysfs のTXとDEの波形.png | |
gpiod のTXとDEの波形.png |
at_dominique.m…
佐藤さん、
マルティネです。
> そうか「/sys/class/gpio/gpio23」のディレクトリで確認すればよかったのですね。
> 「/sys/class/gpio/export」のファイルを開いて確認しようとして
>
> PermissionError: [Errno 13] Permission denied: '/sys/class/gpio/export' >
> となり、権限をどうしようかと思っていました。
/sys/class/gpio/export は書き込み専用(--w------) なのでリードで開けれません。
gpio23 は隣のファイルなので、「os.file.exists('/sys/class/gpio/gpio23')
」などで確認できると思います。
> 10.2.4. 入出力デバイスを扱うは見ていたのですがpythonでどう使うかわからずにいました。
gpio はよく使われてますので例をたした方がいいかもしれないですね…ちょっと考えてみます。
> # DE_RE を出力に設定 > chip = gpiod.Chip('gpiochip0', gpiod.Chip.OPEN_BY_NAME) > pa1 = chip.get_line(23) > pa1.request(consumer='foo', type=gpiod.LINE_REQ_DIR_OUT) > > print("main loop start") > while True: > # GPIO DE > pa1.set_value(1) > > # uart5 send > data = "hello" > enc = 'shift-jis' > ser.write(bytes(data, enc)) > > # GPIO RE > pa1.set_value(0)
> 上記とすることで送受信切替ピンの制御は出来るようになったのですが、
> 送信が完了する前にDEピンが落ちるようになりました。
>
> この状態は正しいのでしょうか?
> ディレイを入れるしかないですか?
正しいには見えないですね… sysfs の方で制御すると sysfs で時間がかかってしましいますのでディレイがありますが、恐らく偶然だと思います。
これも serial のバッファリングでしょうか? ser.write()
の後に ser.flush()
を足してみてください。
よろしくお願いします。
k.sato
マルティネ様
佐藤です。
>これも serial のバッファリングでしょうか? ser.write() の後に ser.flush() を足してみてください。
ser.flush()を追加して確認したところ、添付ファイルのように
送信完了後にDEが1秒以上保持されるようになってしまいました。
何か他の対策を教えていただけませんか?
よろしくお願い致します。
ファイル | ファイルの説明 |
---|---|
ser.flush後のDEの波形.png |
at_dominique.m…
佐藤さん、
> >これも serial のバッファリングでしょうか? ser.write() の後に ser.flush() を足してみてください。
>
> ser.flush()を追加して確認したところ、添付ファイルのように
> 送信完了後にDEが1秒以上保持されるようになってしまいました。
>
> 何か他の対策を教えていただけませんか?
ser.flush() の待つ時間が長いですね、ご確認ありがとうございました。
少し手間かかりますが、そうなってしまうと python からではなく uart のドライバに RS485 の RTS ピンを任せた方がいいかもしれません。
以下の手順で確認してみたところ、タイミングよく(TX 出力前後の 100us 程度)で assert されています。
1/ カーネルソース取得: https://armadillo.atmark-techno.com/resources/software/armadillo-640/ab… からソースをダウンロードして、 ATDE に展開します。
2/ ソースツリーに arch/arm/boot/dts/armadillo-640-customize.dts ファイルを新に作って、以下の内容を保存します。
/dts-v1/; /plugin/; #include <dt-bindings/gpio/gpio.h> #include "imx6ull-pinfunc.h" &uart5 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_uart5>; status = "okay"; fsl,uart-has-rtscts; rs485-rts-on-send; rts-gpios = <&gpio1 23 GPIO_ACTIVE_HIGH>; linux,rs485-enabled-at-boot-time; }; &iomuxc { pinctrl_uart5: uart5grp { fsl,pins = < MX6UL_PAD_UART5_TX_DATA__UART5_DCE_TX 0x00008 MX6UL_PAD_UART5_RX_DATA__UART5_DCE_RX 0x1b0b1 MX6UL_PAD_UART2_RTS_B__GPIO1_IO23 0x00008 >; }; };
3/ 以下のコマンドで dtbo (device tree overlay) を生成します
# Armadillo 640 でも、IoT Gateway A6E の defconfig を使います atde$ make ARCH=arm armadillo-iotg-a6e_defconfig atde$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- armadillo-640-customize.dtbo DTC arch/arm/boot/dts/armadillo-640-customize.dtbo
4/ arch/arm/boot/dts/armadillo-640-customize.dtbo を Armadillo の /boot にコピーして、overlays.txt でロードするようにして、永続化させます。
armadillo# mount /dev/sda1 /mnt armadillo# cp /mnt/armadillo-640-customize.dtbo /boot # /boot/overlays.txt がすでに存在した場合はスペースで別けて追加してください e.g. fdt_overlays=foo.dtbo armadillo-640-customize.dtbo armadillo# vi /boot/overlays.txt fdt_overlays=armadillo-640-customize.dtbo # 保存して、ABOS のアップデートでも dtbo を保存するために swupdate_preserve_files の -p オプションで /etc/swupdate_preserve_files に追加させます armadillo# persist_file -pv /boot/armadillo-640-customize.dtbo /boot/overlays.txt '/boot/armadillo-640-customize.dtbo' -> '/mnt/boot/armadillo-640-customize.dtbo' Added "/boot/armadillo-640-customize.dtbo" to /etc/swupdate_preserve_files '/boot/overlays.txt' -> '/mnt/boot/overlays.txt'
(この作業は swu でもできます。必要でしたら ATDE の /usr/share/mkswu/examples/dtb_overlay.desc を参考にしてください)
5/ 再起動して、起動ログに「Applying fdt overlay: armadillo-640-customize.dtbo」が表示されることを確認します
そこで python コードから gpiod のコードを削除して(gpio の直接制御できなくなります)、今まで通りに ser.write() で書き込みすれば rts が自動的に制御されるはずです。
よろしくおねがいします。
k.sato
マルティネ様
佐藤です。
ドライバでの対応方法ありがとうございます。
無事添付ファイルのようにDE/REピンが動作するようになりました。
# /boot/overlays.txt がすでに存在した場合はスペースで別けて追加してください e.g. fdt_overlays=foo.dtbo armadillo-640-customize.dtbo armadillo# vi /boot/overlays.txt fdt_overlays=armadillo-640-customize.dtbo
また上記の修正なのですが、
今後spiの動作確認をするため「at-dtweb」でspiのピン配置を行っていました。
armadillo:~# cat /boot/overlays.txt fdt_overlays=armadillo-640-lcd70ext-l00.dtbo armadillo-640-customize.dtbo armadillo-640-at-dtweb.dtbo
この場合、上記のように「armadillo-640-at-dtweb.dtbo」の前に入れないと
「/dev/ttymxc4」のエラーが出ていたのですが、この対応で問題ありませんか?
よろしくお願い致します。
ファイル | ファイルの説明 |
---|---|
uartドライバによるDEの波形.png |
at_dominique.m…
佐藤さん、
マルティネです。
> armadillo:~# cat /boot/overlays.txt > fdt_overlays=armadillo-640-lcd70ext-l00.dtbo armadillo-640-customize.dtbo armadillo-640-at-dtweb.dtbo
> この場合、上記のように「armadillo-640-at-dtweb.dtbo」の前に入れないと
> 「/dev/ttymxc4」のエラーが出ていたのですが、この対応で問題ありませんか?
armadillo-640-at-dtweb.dtbo にも uart5 の設定がありますので、悪影響ありますね…
(at-dtweb に uart5 の pin を設定しなければ、別のところで pin が使われる可能性があるので uart5 が無効化されます。at-dtweb に uart5 を選んだ場合は uart5 が有効になりますが、rts ピンの設定はできないため別のファイルで対応させていただきました)
overlay の仕組みとして、編集してない rts-gpio の部分はそのまま残りますが、pinctrl の uart5grp がまるごと上書きされてしまいますので armadillo-640-customize.dtbo を後に残した方がいいと思います。
エラーについてもう少し提供していただけますでしょうか?
また、以下のコマンドでエラーが発生した際の最終的な dtb を取得していただければ幸いです。
# メモリ上で fdtdump コマンドをインストールします。ネットワーク接続が必要です。 armadillo:~# apk add dtc # dtb を取得します。/mnt に USB メモリをマウントした想定です。 armadillo:~# fdtdump /sys/firmware/fdt > /mnt/fdt.txt
よろしくお願いします。
k.sato
マルティネ様
佐藤です。
>> 「/dev/ttymxc4」のエラーが出ていたのですが、
「/boot/overlays.txt」内の.dtboの入れ替えで動いたので
エラーのログをとっておらずザックリとした報告になり申し訳ありません。
at-dtwebでの設定は添付ファイルのようになっています。
uart1:コンソール出力用
uart5:RS-485通信用
ecspi1:SPI通信用
armadillo:~# cat /boot/overlays.txt fdt_overlays=armadillo-640-lcd70ext-l00.dtbo armadillo-640-at-dtweb.dtbo armadillo-640-customize.dtbo
再度、上記のように「/boot/overlays.txt」を修正し reboot したところ起動ログで下記のようになりました。
| * Starting avahi-daemon ...chronyd | * Starting chronyd ... [ ok ] [ ok ] Starting 'my_container' sshd | * Starting sshd ... [ ok ] abos-web | * Starting abos-web ... [ ok ] [ ok ] podman-atmark |my_container podman-atmark |679a1c48dc3a6ab9499e4ee131f7f655d98484523d4252ec7bff3077cb38fe75 podman-atmark |error: device /dev/ttymxc4 does not exist podman-atmark | * Could not start all containers podman-atmark | [ !! ] podman-atmark | * ERROR: podman-atmark failed to start local | * Starting local ... [ ok ] Welcome to Alpine Linux 3.17 Kernel 5.10.185-0-at on an armv7l (/dev/ttymxc0) armadillo login:
また、教えていただいた fdtdump コマンドのインストールですが失敗してしまいます。
armadillo:~# apk add dtc fetch https://download.atmark-techno.com/alpine/v3.17/atmark/armv7/APKINDEX.tar.gz ERROR: https://download.atmark-techno.com/alpine/v3.17/atmark: temporary error (try again later) WARNING: Ignoring https://download.atmark-techno.com/alpine/v3.17/atmark: No such file or directory fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/main/armv7/APKINDEX.tar.gz ERROR: https://dl-cdn.alpinelinux.org/alpine/v3.17/main: temporary error (try again later) WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.17/main: No such file or directory fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/community/armv7/APKINDEX.tar.gz ERROR: https://dl-cdn.alpinelinux.org/alpine/v3.17/community: temporary error (try again later) WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.17/community: No such file or directory WARNING: The repository tag for world dependency 'abos-base@atmark' does not exist WARNING: The repository tag for world dependency 'abos-web@atmark' does not exist WARNING: The repository tag for world dependency 'atmark-wwan-utils@atmark' does not exist WARNING: The repository tag for world dependency 'buttond@atmark' does not exist WARNING: The repository tag for world dependency 'emmc-sref@atmark' does not exist WARNING: The repository tag for world dependency 'libubootenv@atmark' does not exist WARNING: The repository tag for world dependency 'linux-at-a6@atmark' does not exist WARNING: The repository tag for world dependency 'modemmanager@atmark' does not exist WARNING: The repository tag for world dependency 'se05x-tools@atmark' does not exist WARNING: The repository tag for world dependency 'swupdate@atmark' does not exist ERROR: Not committing changes due to missing repository tags. Use --force-broken-world to override. armadillo:~#
># メモリ上で fdtdump コマンドをインストールします。ネットワーク接続が必要です。
armadilloにログインしたところで行ったのですが
私のメモリ上という認識が間違っているのでしょうか?
よろしくお願い致します。
ファイル | ファイルの説明 |
---|---|
at-dtweb.png |
at_dominique.m…
佐藤さん、
> at-dtwebでの設定は添付ファイルのようになっています。
> uart1:コンソール出力用
> uart5:RS-485通信用
> ecspi1:SPI通信用
詳細ありがとうございます。
> また、教えていただいた fdtdump コマンドのインストールですが失敗してしまいます。
>
> armadillo:~# apk add dtc > fetch https://download.atmark-techno.com/alpine/v3.17/atmark/armv7/APKINDEX.tar.gz > ERROR: https://download.atmark-techno.com/alpine/v3.17/atmark: temporary error (try again later) > WARNING: Ignoring https://download.atmark-techno.com/alpine/v3.17/atmark: No such file or directory > fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/main/armv7/APKINDEX.tar. >[...] > WARNING: The repository tag for world dependency 'swupdate@atmark' does not exist > ERROR: Not committing changes due to missing repository tags. Use --force-broken-world to override. > armadillo:~# >
> ># メモリ上で fdtdump コマンドをインストールします。ネットワーク接続が必要です。
> armadilloにログインしたところで行ったのですが
> 私のメモリ上という認識が間違っているのでしょうか?
メモリ上(というのは tmpfs である overlayfs) のインストール手順として間違ってませんが、ネットワーク接続されたないか時間が設定されてない時のエラーですね。
その場合は /sys/firmware/fdt をコピーするだけで、fdtdump を ATDE にでも実行できますが、教えた設定で再現できましたので大丈夫です。
本当のエラーメッセージはファイルが存在しないメッセージよりだいぶ前、起動ログの最初のところに表示されていました:
[ 1.040165] imx6ul-pinctrl 20e0000.pinctrl: pin MX6UL_PAD_UART2_RTS_B already requested by 20e0000.pinctrl; cannot claim for 21f4000.serial [ 1.052811] imx6ul-pinctrl 20e0000.pinctrl: pin-40 (21f4000.serial) status -22 [ 1.060093] imx6ul-pinctrl 20e0000.pinctrl: could not request pin 40 (MX6UL_PAD_UART2_RTS_B) from group uart5grp on device 20e0000.pinctrl [ 1.072663] imx-uart 21f4000.serial: Error applying setting, reverse things back
at-dtweb は別の pinctrl のグループで gpio1 pin23 を設定しているため、後で serial ドライバの処理で pin を有効にできなくて結果として /dev/ttymxc4 が作成されないことになります。
at-dtweb の dtbo を後にすることで、pinctrl の uart5grp が上書きされて問題がなくなりますが、今朝書いた様にその pin の設定が正しくないです。
at-dtweb 側で pinctrl を編集するのは想定されてないので、そちらで編集する場合は設定編集する度に作成された dts ファイルを編集した上で dtbo を再生成させてインストールすることになりますので、必要になったら逆に at-dtweb が作成した dts の必要な部分を customize の dts にコピーした方がいいと思います… が、確認したところ、at-dtweb で使われている gpio1 pin23 の設定をそのまま使えると思います。
(幸いなことに同じ MX6UL_PAD_UART2_RTS_B__GPIO1_IO23 の mux 選択になっていました。 armadillo-640-customize との違いは「software input on」(使わないため無影響)と drive strength と speed の差だけです。at-dtweb の方の信号が強く制御されているだけです。)
なので、今動いてる順番で使っても大丈夫だと思いますが、後で困らないため customize の dts から iomuxc の部分を削除した方がいいかもしれません。
お手数をおかけしますが、よろしくお願いします。
k.sato
マルティネ様
佐藤です。
> なので、今動いてる順番で使っても大丈夫だと思いますが、後で困らないため customize の dts から iomuxc の部分を削除した方がいいかもしれません。
&iomuxc { pinctrl_uart5: uart5grp { fsl,pins = < MX6UL_PAD_UART5_TX_DATA__UART5_DCE_TX 0x00008 MX6UL_PAD_UART5_RX_DATA__UART5_DCE_RX 0x1b0b1 MX6UL_PAD_UART2_RTS_B__GPIO1_IO23 0x00008 >; }; };
armadillo-640-customize.dtsから上記を削除し、
/boot/overlays.txtの順番を下記に戻してもエラーは発生せず、
正常にTXピンとDEピンが動作していることを確認できました。
fdt_overlays=armadillo-640-lcd70ext-l00.dtbo armadillo-640-at-dtweb.dtbo armadillo-640-customize.dtbo
ありがとうございました。
at_dominique.m…
2023年7月12日 12時56分
佐藤さん
お世話になっています、
マルティネです。
> uart5からシリアル通信(RS-485)を行えることを確認したいです。
>
> Armadillo-640製品マニュアル Armadillo Base OS 対応
>
> 上記の10.1.CUI アプリケーションを開発する
> にシリアル通信を追加して[App run on Armadillo] を実行する
> 方法がありましたら教えていただけませんか?
Armadillo-640 Armadillo Base OS では uart5 はデフォルトで有効になっていて、 Armadillo OS から /dev/ttymxc4 でアクセスできます。
コンテナで使用する場合はコンテナに提供する必要がありますので、
CUI の vscode プロジェクトの swu/ディレクトリのしたに
[shellかpython]_app/etc/atmark/containers/[shellかpython]_app.conf
を編集する必要があります。以下の行を追加してください(どこでもいいです):
他のコンテナの制限はそちらで管理できます。
その後に再び「Generate development swu」で dev.swu を再生成して、再びインストールすれば再起動の後に自分のアプリケーションで /dev/ttymxc4 を操作できるようになります。
よろしくお願いします