Armadilloフォーラム

Armadillo-640 UART2 のハードウェアフロー制御について

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
コメント

溝渕です。

> 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を参考にして追加してください。

溝渕様

ご回答ありがとうございます。
ご指摘の通り確かにその通りでした。

その後Openしてから受信(read)しないようにし評価を行い
uart-has-rtsctsを付けたところ、問題なく動作するようになりました。

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