SSブログ

beagleboard を触ろう - UART [組み込みソフト]



beagleboard は RS232 コネクタを持っていて、PC のシリアルコンソール (Teraterm 等) と通信できるのはご存じの通りです。
OMAP3530 の内部デバイスである UART モジュールから出ている信号線が、RS232 ポートに繋がっています。

UART モジュールには、UART1/UART2/UART3 の 3つが装備されています。
回路図を見ると、RS232 に結線されているのは UART3 であることが分かります。
x-loader が初期化しているのも UART3 でしたね。

同じく回路図を見てみると、UART3 からの UART3_TX と UART3_RX 信号が RS232 ポートに繋がっているのが分かりますが、UART3_CTS / UART3_RTS は死んでいることが分かります。

uart3_signal.png

CTS / RTS は、ハードウェアフロー制御を行う際に使われる信号で、この信号を使ってデータを取りこぼさないようにしています。
CTS / RTS が使えないので、beagleboard では、ハードウェアフロー制御はできません。

さっきから UART モジュールと言っていますが、このモジュールは UART のみではなく、IrDA / CIR としても使えます。
UART として使うか、IrDA として使うか、CIR として使うか、レジスタに設定値を書き込んでモードを決定します。
使ったことがないのでよく分かりませんが、IrDA / CIR は赤外線通信のためのデバイスです。

UART モジュールを S/W 的観点から絵にすると、こんな感じです。

uart_reg.png

THR が送信用のレジスタです。
このレジスタに 1バイトのデータを書くと、UART_TX から 1ビットずつデータを送信してくれます。
逆に、RHR が受信用のレジスタです。
このレジスタから 1バイトのデータを読むと、UART_RX から 1ビットずつ受信したデータを取得できます。
もちろん、実際に TX/RX を流れているデータをそのまま読み書きするわけではなくて、8N1 等のデータフォーマットに従って、実データのみを読み書きできます。

THR / RHR の裏には、64バイト分の FIFO が控えています。
FIFO はメモリの一種です。名前の通り、先に書いたものが先に読みだされる、特殊なメモリです。
データをたくさん送信する場合、THR に次々書き込んだデータは送信 FIFO に貯められます。
貯められたデータは、UART モジュールによって自動的に排出されます。
逆に、データを次々に受信する場合、UART_RX から受信したデータは、受信 FIFO に貯められます。
CPU (とか DMA とか) が RHR レジスタを読み出すことにより、受信 FIFO に貯められたデータが読み出されていきます。
CPU が RHR を読み出してくれなくても、受信したデータを FIFO に貯めることができるので、データを取りこぼさずに済みます。
しかし、受信 FIFO がフルの時、さらにデータを受信すると、さすがにデータを取りこぼしてしまいます。
これを防ぐにはフロー制御するしかないですが、普通はフロー制御なしでやっているように思います。
beagleboard の場合、ハードウェアフロー制御ができないので、やるとしたらソフトウェアフロー制御ですね。

なお、FIFO は無効にすることもできます。
この場合は、送信データを連続して THR に書き込むことはできなくなりますし、データを受信したら、すぐに RHR から読み出さなくてはなりません。
実際には、FIFO をバイパスするわけではなくて、FIFO の位置 0 だけが使われるようになるみたいです。

THR, RHR レジスタ以外にもいくつかレジスタがあります。
割り込みを使わないなら、設定系レジスタで動作モードを決定し、データ送受信の際には、ステータスレジスタでデータ送受信可能かチェックしながら THR/RHR を読み書きするような使い方になります。

UART モジュールの詳細な使い方は、OMAP35x TRM (Technical Reference Manual) に載っています。
"UART/IrDA/CIR Basic Programming Model" の節です。
ここでは、それを参考にしつつ、x-loader がやっていることを見ていきましょう。

x-loader による UART の初期化は、NS16550_init() という関数で行っています。
23: void NS16550_init (NS16550_t com_port, int baud_divisor)
24: {
25: 	com_port->ier = 0x00;
26: #ifdef CONFIG_OMAP
27: 	com_port->mdr1 = 0x7;   /* mode select reset TL16C750*/
28: #endif
29: 	com_port->lcr = LCR_BKSE | LCRVAL;
30: 	com_port->dll = baud_divisor & 0xff;
31: 	com_port->dlm = (baud_divisor >> 8) & 0xff;
32: 	com_port->lcr = LCRVAL;
33: 	com_port->mcr = MCRVAL;
34:  	com_port->fcr = FCRVAL;
35: #if defined(CONFIG_OMAP)
36: 	com_port->mdr1 = 0;	/* select uart mode */
37: #endif
38: }


com_port は、UART3 レジスタのベースアドレスである 0x49020000 が渡されてきます。
また、CONFIG_OMAP は 1 になっています。

25: UART のすべての割り込みを無効にする
27: UART-IrDA-CIR モードを無効にする
29: Configuration mode A に移行
30: ボーレートを 115200 bps に設定
31: ボーレートを 115200 bps に設定
32: データフォーマットを 8N1 に設定し、かつ Operational mode に移行
33: よく分からん (^^;
34: FIFO を有効化して送受信 FIFO ともクリアー
36: UART 16x モードに設定

ここでちょっと注意すべきことが。
dll とか dlm (OMAP35x TRM では DLM ではなく、DLH) とかは、通常はアクセスできないレジスタです。
Configuration mode を変更することによって、初めてアクセスできるようになります。
L29 の lcr への書き込みを行って Configuration mode A に移行することによって、dll, dlm にアクセスできるようになります。
L32 の lcr への書き込みを行って Operational mode に移行すると、dll, dlm はもう見えません。

データ送受信関数は、以下の通りです。
51: void NS16550_putc (NS16550_t com_port, char c)
52: {
53: 	while ((com_port->lsr & LSR_THRE) == 0);
54: 	com_port->thr = c;
55: }

57: char NS16550_getc (NS16550_t com_port)
58: {
59: 	while ((com_port->lsr & LSR_DR) == 0);
60: 	return (com_port->rbr);
61: }


53: LSR レジスタの TX_FIFO_E ビットをチェック
54: THR レジスタに 1バイト書き込み

59: LSR レジスタの RX_FIFO_E ビットをチェック
60: RHR レジスタに 1バイト書き込み

TX_FIFO_E ビットは、送信 FIFO が空だと 1 が立ちます。
NS16550_putc() は、FIFO が空になるのを待って、データを THR に書き込んでいるんですね。
これだと送信 FIFO の意味はまったくありませんが、まあ x-loader では起動メッセージを出すのにちょっと使っているだけなので、よいのでしょう (^^;

RX_FIFO_E ビットは、受信 FIFO にデータが存在すると 1 が立ちます。

THR, RHR は、同じアドレスにマップされています。
0x49020000 に書き込むと THR へのアクセス、0x49020000 から読み出すと RHR へのアクセスということになります。

・・・

x-loader の UART 制御は、いわゆるポーリングモードですよねえ。
UART モジュールは割り込みを上げることが出来るので、割り込みモードで使用することが出来ますし、また DMA チャネルも持っているので、DMA を使った送受信も可能です。

そちらも見てみないといけないですねえ。
nice!(0)  コメント(2)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 2

DennisAmeve


1000ква Ктп типа Сэндвич Ктп 10/25/0.23ква Ктп 10/10/0, КТП КОМПЛЕКТНЫЕ ТРАНСФОРМАТОРНЫЕ ПОДСТАНЦИИ москва, Производство ктп москва и другое на нашем специализированном сайте: http://sviloguzov.ru/ - Вам сюда!
by DennisAmeve (2019-04-10 14:40) 

DennisAmeve


2ктпн160ква Распредустройство6-10кв Ктп Т/к 1000ква Распредустройство 0, КТП КОМПЛЕКТНЫЕ ТРАНСФОРМАТОРНЫЕ ПОДСТАНЦИИ москва, Производство ктп москва и не только на: http://sviloguzov.ru/ - Это то, что Вам нужно!
by DennisAmeve (2019-04-14 16:45) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。