このエントリーをはてなブックマークに追加

Armadillo-420でのRTS/CTS制御について

お世話になっております。須藤です。

Armadillo-420においてUART3or5のRTS/CTSピンをioctl関数で制御したいです。

下記URLを参考に下部のように制御を試みたところ、
CTSピンに対して設定がされていないようです。
#ioctlは正常終了しています
 https://users.atmark-techno.com/node/1908
 https://users.atmark-techno.com/node/1354

ちなみに直接レジスタに書き込むと値は更新されているようですが
CTSピンから何も出力されません。
#Armadillo-420ではRTS:in CTS:out という理解です

RTS/CTSピンはどのように制御したらよいでしょうか?

===

int arg;
// CTSピンの状態取得
ioctl(fd, TIOCMGET, &arg);

// CTSピンのセット
arg |= TIOCM_CTS;
ioctl(fd, TIOCMSET, &arg);

// CTSピンのクリア
arg &= ~TIOCM_CTS;
ioctl(fd, TIOCMGET, &arg);

===

以上、よろしくお願いいたします。

製品: 

  • Armadillo-420

> #Armadillo-420ではRTS:in CTS

> #Armadillo-420ではRTS:in CTS:out という理解です

i.MX257を採用しているArmadillo-420では、
CTS/RTS 信号は一般的な UART の信号と名前が逆なので、
RTS : in, CTS : out ですが、

device driverで RTS/CTS の信号名の違いを吸収しており、
ioctl(TIOCMGET/TIOCMSET)利用の際には
RTS : out, CTS : in として扱います。

> RTS/CTSピンはどのように制御したらよいでしょうか?

arg |= TIOCM_RTS;
ioctl(fd, TIOCMSET, &arg);

arg &= ~TIOCM_RTS;
ioctl(fd, TIOCMGET, &arg);

で制御できないでしょうか?

/dev/ttymxc* を close() すると RTS信号(CTSピン)が High になるので
信号をLowにしておきたい間は、/dev/ttymxc* を open() したままにしてください。

■TIOCMSETで制御できない場合

TIOCMSETで制御できないのであれば、
カーネルコンフィギュレーションで UART5 の HW flow control が有効になっ
ていないのかもしれません。

Armadillo-440上で以下のようにコマンドを実行すると、
UART5 の HW flow control が有効かどうか確かめることができます。
# 以下のログは有効な時のものです。

[root@armadillo440-0 (ttymxc1) ~]# zcat /proc/config.gz | grep -i uart5
CONFIG_ARMADILLO4X0_UART5_CON9=y
CONFIG_ARMADILLO4X0_UART5_HW_FLOW_CON9=y
CONFIG_ARMADILLO4X0_CON9_4_UART5_RXD=y
CONFIG_ARMADILLO4X0_CON9_6_UART5_TXD=y
CONFIG_ARMADILLO4X0_CON9_12_UART5_RTS=y
CONFIG_ARMADILLO4X0_CON9_14_UART5_CTS=y

UART5 の HW flow control を有効にするには
カーネルコンフィギュレーションで以下の項目にチェックを入れます。

  System Type  --->
    Freescale i.MX support  --->
      Armadillo-400 Board options  --->
        [*] Enable UART5 at CON9
        [*]   Enable UART5 HW flow control at CON9