source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/tms320c54x/c5402dsk/tl16c550cfn.c@ 26

Last change on this file since 26 was 26, checked in by ykominami, 10 years ago

initial

File size: 7.3 KB
Line 
1/*
2 * TOPPERS/JSP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 *
9 * 上記著作権者
10は,以下の (1)〜(4) の条件か,Free Software Foundation
11 * によってå…
12¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
13 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
14 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
16 * 利用と呼ぶ)することを無償で許諾する.
17 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
18 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
19 * スコード中に含まれていること.
20 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
21 * 用できる形で再é…
22å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
23å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
24 * 者
25マニュアルなど)に,上記の著作権表示,この利用条件および下記
26 * の無保証規定を掲載すること.
27 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
28 * 用できない形で再é…
29å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
30 * と.
31 * (a) 再é…
32å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
33マニュアルなど)に,上記の著
34 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
35 * (b) 再é…
36å¸ƒã®å½¢æ…
37‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
38 * 報告すること.
39 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
40 * 害からも,上記著作権者
41およびTOPPERSプロジェクトをå…
42è²¬ã™ã‚‹ã“と.
43 *
44 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
45お
46 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
47 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
48 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
49 *
50 * @(#) $Id: tl16c550cfn.c,v 1.4 2003/12/19 10:03:31 honda Exp $
51 */
52
53/*
54 * TL16c550cfn 用ドライバ
55 */
56
57#include <s_services.h>
58#include "tl16c550cfn.h"
59
60/*
61 * カーネル起動時用の初期化(sys_putcを使用するため)
62 */
63void
64uart_init(void)
65{
66 /* FIFOを有効にし、受信送信FIFOをクリア、
67 * トリガレベル=1(受信送信å…
68±é€šï¼‰
69 * 8データ、1ストップビット、no parity
70 */
71 UART_FCR = (FCR_FIFO | FCR_RFRST | FCR_TFRST | FIFO_TRIG);
72 UART_LCR = 0x03;
73 /* ボーレートレジスタにアクセス */
74 UART_LCR |= LCR_DLAB;
75 UART_DLL = UART_BAUD_RATE;
76 UART_DLM = UART_BAUD_RATE >> 8;
77 /* BAUD RATE設定終了 */
78 UART_LCR &= ~LCR_DLAB;
79 UART_SCR = UART_LSR;
80}
81
82/*
83 * シリアルI/Oポート初期化ブロック
84 */
85const SIOPINIB siopinib_table[TNUM_SIOP] = {0};
86
87/*
88 * シリアルI/Oポート管理ブロックのエリア
89 */
90SIOPCB siopcb_table[TNUM_SIOP];
91
92/*
93 * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
94 */
95#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1))
96#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))
97
98/*
99 * 文字を受信したか?
100 */
101Inline BOOL
102uart_getready(SIOPCB *siopcb)
103{
104 return((UART_LSR & LSR_DR) != 0);
105}
106
107/*
108 * 文字を送信できるか?
109 */
110Inline BOOL
111uart_putready(SIOPCB *siopcb)
112{
113 return((UART_LSR & LSR_THRE) != 0);
114}
115
116/*
117 * 受信した文字の取出し
118 */
119Inline char
120uart_getchar(SIOPCB *siopcb)
121{
122 return((char) UART_RBR);
123}
124
125/*
126 * 送信する文字の書込み
127 */
128Inline void
129uart_putchar(SIOPCB *siopcb, char c)
130{
131 UART_THR = (UB) c;
132}
133
134/*
135 * 送信割込み許可
136 */
137Inline void
138uart_enable_send(SIOPCB *siopcb)
139{
140 UART_IER |= IER_TIE;
141}
142
143/*
144 * 送信割込み禁止
145 */
146Inline void
147uart_disable_send(SIOPCB *siopcb)
148{
149 UART_IER &= ~IER_TIE;
150}
151
152/*
153 * 受信割込み許可
154 */
155Inline void
156uart_enable_rcv(SIOPCB *siopcb)
157{
158 UART_IER = IER_RIE;
159}
160
161/*
162 * 受信割込み禁止
163 */
164Inline void
165uart_disable_rcv(SIOPCB *siopcb)
166{
167 UART_IER &= ~IER_RIE;
168}
169
170/*
171 * SIOドライバの初期化ルーチン
172 */
173void
174uart_initialize()
175{
176 SIOPCB *siopcb;
177 UINT i;
178
179 /*
180 * シリアルI/Oポート管理ブロックの初期化
181 */
182 for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) {
183 siopcb->siopinib = &(siopinib_table[i]);
184 siopcb->openflag = FALSE;
185 }
186}
187
188/*
189 * オープンしているポートがあるか
190 */
191BOOL
192uart_openflag(void)
193{
194 return(siopcb_table[0].openflag);
195}
196
197
198
199/*
200 * シリアルI/Oポートのオープン
201 */
202SIOPCB *
203uart_opn_por(ID siopid, VP_INT exinf)
204{
205 SIOPCB *siopcb;
206
207 siopcb = get_siopcb(siopid);
208
209 /* FIFOを有効にし、受信送信FIFOをクリア、
210 * トリガレベル=1(受信送信å…
211±é€šï¼‰
212 * 8データ、1ストップビット、no parity
213 */
214 UART_FCR = (FCR_FIFO | FCR_RFRST | FCR_TFRST | FIFO_TRIG);
215 UART_LCR = 0x03;
216 /* ボーレートレジスタにアクセス */
217 UART_LCR |= LCR_DLAB;
218 UART_DLL = UART_BAUD_RATE;
219 UART_DLM = UART_BAUD_RATE >> 8;
220 /* BAUD RATE設定終了 */
221 UART_LCR &= ~LCR_DLAB;
222 /* エラーフラグをクリア */
223 UART_SCR = UART_LSR;
224 UART_IER = IER_RIE; /* 受信割り込み許可 */
225
226 siopcb->exinf = exinf;
227 siopcb->openflag = TRUE;
228 siopcb->getready = siopcb->putready = FALSE;
229
230 return(siopcb);
231}
232
233/*
234 * シリアルI/Oポートのクローズ
235 */
236void
237uart_cls_por(SIOPCB *siopcb)
238{
239 /* 送信受信割り込み要求禁止 */
240 UART_IER = 0;
241
242 siopcb->openflag = FALSE;
243}
244
245/*
246 * シリアルI/Oポートへの文字送信
247 */
248BOOL
249uart_snd_chr(SIOPCB *siopcb, char chr)
250{
251 if (uart_putready(siopcb)) {
252 uart_putchar(siopcb, chr);
253 return(TRUE);
254 }
255 return(FALSE);
256}
257
258/*
259 * シリアルI/Oポートからの文字受信
260 */
261INT
262uart_rcv_chr(SIOPCB *siopcb)
263{
264 if (uart_getready(siopcb)) {
265 return((INT)(UB) uart_getchar(siopcb));
266 }
267 return(-1);
268}
269
270/*
271 * シリアルI/Oポートからのコールバックの許可
272 */
273void
274uart_ena_cbr(SIOPCB *siopcb, UINT cbrtn)
275{
276 switch (cbrtn) {
277 case SIO_ERDY_SND:
278 uart_enable_send(siopcb);
279 break;
280 case SIO_ERDY_RCV:
281 uart_enable_rcv(siopcb);
282 break;
283 }
284}
285
286/*
287 * シリアルI/Oポートからのコールバックの禁止
288 */
289void
290uart_dis_cbr(SIOPCB *siopcb, UINT cbrtn)
291{
292 switch (cbrtn) {
293 case SIO_ERDY_SND:
294 uart_disable_send(siopcb);
295 break;
296 case SIO_ERDY_RCV:
297 uart_disable_rcv(siopcb);
298 break;
299 }
300}
301
302/*
303 * シリアルI/Oポートに対する割込み処理
304 */
305static void
306uart_isr_siop(SIOPCB *siopcb)
307{
308 if (uart_getready(siopcb)) {
309 /*
310 * 受信通知コールバックルーチンを呼び出す.
311 */
312 uart_ierdy_rcv(siopcb->exinf);
313 }
314 if (uart_putready(siopcb)) {
315 /*
316 * 送信可能コールバックルーチンを呼び出す.
317 */
318 uart_ierdy_snd(siopcb->exinf);
319 }
320}
321
322/*
323 * SIOの割込みサービスルーチン
324 */
325void
326uart_isr()
327{
328 if (siopcb_table[0].openflag) {
329 uart_isr_siop(&(siopcb_table[0]));
330 }
331}
Note: See TracBrowser for help on using the repository browser.