s.sato
2020年10月30日 10時13分
お世話になります。
https://armadillo.atmark-techno.com/forum/armadillo/7824
でUARTに関して質問をさせていただいた者です。
UART2のハードウェアフロー制御に関して追加で質問させていただきたく、別スレッドで質問させていただきました。
現在Armadillo-640 UART2にてハードウェアフロー制御を使う通信を試みています。
Armadillo-640が受信側で、外部装置が送信を115200bpsで行っています。
デバイスツリーを書き換えUART2を使えるようにし、UART2を使った通信自体はできるようになりましたが
CTS_B(i.MX 6ULLはこのピンが出力?)ピンを観測するとHレベルのまま固定となっています。
RTS_Bも念のため観測していますがHレベルのまま固定です。
Armadillo-640上で受信するプログラムを起動せず、ほおっておけばCTS_BがHレベルになり、
受信プログラムを起動しバッファからデータを取り出せばCTS_BがLレベルになると思ったのですが
意図通り動きません。
恐れ入りますが下に各種情報を記載しますので、
何かおかしな点がありましたらご指摘いただけないでしょうか?
■ 使用しているピン情報
CN PIN NAME --------------------------- CON14 3 UART2_TX_DATA 4 UART2_RX_DATA CON9 1 UART2_CTS_B 2 UART2_RTS_B
■ armadillo-640.dts の編集・ビルド・dtb書き換え
以下の記述を追加
&uart2 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_uart2>; status = "okay"; }; (途中略) 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_UART2_RTS_B__UART2_DCE_RTS 0x1b0b1 MX6UL_PAD_UART2_CTS_B__UART2_DCE_CTS 0x00008 >; };
https://manual.atmark-techno.com/armadillo-640/armadillo-640_product_ma…
に従いビルド
[PC ~/linux-v4.14-at[version]]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x82000000 uImage [PC ~/linux-v4.14-at[version]]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
https://manual.atmark-techno.com/armadillo-640/armadillo-640_product_ma…
に従い、dtbの書き換え。
[armadillo ~]# mount /dev/mmcblk0p2 /mnt [armadillo ~]# cp armadillo-640-v4.14-at[version].dtb /mnt/boot/a640.dtb [armadillo ~]# umount /mnt
■ 受信側Cソースコード設定部
ハードウェアフロー制御を使用するためにCRTSCTSを設定しています。
#define SERIAL_PORT "/dev/ttymxc1" int baudrate = B115200; // UARTデバイスオープン fd = open(SERIAL_PORT, O_RDONLY); /* デバイスをオープンする */ if (fd < 0) { return -1; } tcgetattr(fd, &oldtio); newtio = oldtio; // 以下CRTSCTSでハードウェアフロー制御を有効に newtio.c_cflag = CS8 | CLOCAL | CREAD | CRTSCTS; cfsetispeed( &newtio, baudrate ); cfmakeraw(&newtio); tcsetattr( fd, TCSANOW, &newtio );
よろしくお願いいたします。
ファイル | ファイルの説明 |
---|---|
armadillo-640.dts |
コメント
s.sato
at_mizo
2020年10月30日 10時27分
溝渕です。
> Armadillo-640上で受信するプログラムを起動せず、ほおっておけばCTS_BがHレベルになり、
> 受信プログラムを起動しバッファからデータを取り出せばCTS_BがLレベルになると思ったのですが
> 意図通り動きません。
プログラムを起動していない(uart2がopenされていない)状態では、i.MXはデー
タを受信しません。その為、ハードウェアフロー制御が働くことはありません。
> &uart2 {
> pinctrl-names = "default";
> pinctrl-0 = <&pinctrl_uart2>;
> status = "okay";
> };
uart2には、"uart-has-rtscts"プロパティが必要です。uart3を参考にして追加してください。