[Armadillo:05356] Re: Armadillo-420のシリアル通信における正確なボーレートについて
nakai
email@hidden
2010年 6月 23日 (水) 11:36:31 JST
nakaiです。
Armadillo-420が使用しているUARTコントローラは、
i.MX25内蔵のものです。
このコントローラでのボーレート設定は、リファレンスマニュアル[1]の
46.4.6 Binary Rate Multiplier (BRM)
に記載があります。
[1]
http://cache.freescale.com/files/dsp/doc/ref_manual/IMX25RM.pdf?fpsp=1&WT_TYPE=Reference%20Manuals&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=pdf&WT_ASSET=Documentation
実際にボーレートの算出を行うソースは、
linux-2.6.26-at/drivers/serial/mxc_uart.c::mxcuart_set_termios
です。
さて、実際に設定する値ですが、以下のようなパッチをあてて確認してみました。
{{{
diff --git a/drivers/serial/mxc_uart.c b/drivers/serial/mxc_uart.c
index c596c83..a602bb9 100644
--- a/drivers/serial/mxc_uart.c
+++ b/drivers/serial/mxc_uart.c
@@ -1424,6 +1424,7 @@ static void mxcuart_set_termios(struct uart_port *port,
num = (u_int) n64 - 1;
denom = 0x7fff;
}
+ printk("ref: %d, ubir: %d, ubmr: %d\n", umxc->port.uartclk, num, denom);
writel(num, umxc->port.membase + MXC_UARTUBIR);
writel(denom, umxc->port.membase + MXC_UARTUBMR);
}}}
● 115200
stty -F /dev/ttymxc4 115200
ref: 120000000, ubir: 502, ubmr: 32767
設定値: 115127
● 921600
stty -F /dev/ttymxc4 921600
ref: 120000000, ubir: 4026, ubmr: 32767
設定値: 921707
● 1152000
stty -F /dev/ttymxc4 1152000
ref: 120000000, ubir: 5032, ubmr: 32767
設定値: 1151962
● 4000000
stty -F /dev/ttymxc4 4000000
ref: 120000000, ubir: 17475, ubmr: 32767
設定値: 3999938
他のボーレートについては、パッチをあてて確認してみてください。
計算式は、リファレンスマニュアル Egn. 46-3にあるように、
BaudRate = RefFreq / (16 * ((UBMR + 1) / (UBIR + 1)))
です。
Myoukan Kiyohito さんは書きました:
> 明官です。
>
> nakai様、返信ありがとうございます。
>
> 説明不足で申し訳ありません。再度質問させてください。
>
> ボーレートはクロックによって計算することができ、算出したボーレートと
> 設定したボーレートには誤差があると思います。
> #以下のページを参考にしています(ページ中央あたり)
> #http://spectrum123.at.infoseek.co.jp/serial/serial_1/serial_1.htm
>
> 知りたいことは、Armadillo-420のクロックでの算出ボーレートですので、
> ご教示いただけると幸いです。
>
> 目的はArmadillo-420と接続する機器との間のボーレート誤差を調べることです。
>
>
>> また、他のボーレートについては、
>> ioctl設定時にinvalid argmentが返るようです。
>> stty -F /dev/ttymxc4 2000000
>> stty: invalid argument `2000000'
>>
>> これは、クロックソースから指定のボーレートを作り出せないために
>> エラーが返るようです。
>
> 上記のようにありましたが、現在、シリアル通信のテストを行っており、
> その際にプログラムでボーレートの設定を1M,2M,3M,4Mとしているのですが、
> 1M,2M,3Mでもエラーは出ていません。
> <ソース抜粋>
> fd = open(SERIAL_PORT, O_RDWR | O_NOCTTY);
> newtio.c_cflag = B2000000 | CS8 | CLOCAL | CREAD; ← 1M,2M,3M,4Mを設定している
> tc = tcsetattr(fd,TCSANOW,&newtio); ← エラー(tc=-1)にはなりません
> if(tc == -1){
> return -1;
> }
> <接続>
> ・Armadello-420を2台使用
> ・シリアルインターフェース2(ttymxc2)とシリアルインターフェース3(ttymxc4)を
> クロスで接続
> <動作>
> ・パケット数と受信時間によりボーレートを計算したところ、誤差はあるものの
> 設定したボーレートに近い値になる
>
> 以上、よろしくお願いいたします。
>
>> -----Original Message-----
>> From: email@hidden
>> [mailto:email@hidden] On Behalf Of nakai
>> Sent: Tuesday, June 22, 2010 9:07 PM
>> To: Armadillo series general discussion list
>> Subject: [Armadillo:05354] Re: Armadillo-420のシリアル通信における正確なボーレ
>> ートについて
>>
>> nakaiです。
>>
>> Armadillo-420の高ボーレート設定につきまして、
>> 弊社で標準のカーネルで動作を確認しているものは、
>> 921600, 1152000, 4000000
>> です。
>>
>> stty -F /dev/ttymxc4 [baudrate]
>> のように設定後、
>> echo Z > /dev/ttymxc4
>> として実際の波形を確認したところ、
>> 上記3設定については問題ない周波数で出力できているようです。
>>
>> また、他のボーレートについては、
>> ioctl設定時にinvalid argmentが返るようです。
>> stty -F /dev/ttymxc4 2000000
>> stty: invalid argument `2000000'
>>
>> これは、クロックソースから指定のボーレートを作り出せないために
>> エラーが返るようです。
>>
>> _______________________________________________
>> armadillo mailing list
>> email@hidden
>> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
>
> _______________________________________________
> armadillo mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
>
armadillo メーリングリストの案内