source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/armv4/ezarm7/lpc2214.c@ 26

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

initial

File size: 9.2 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 * Copyright (C) 2005- by Monami software, LP.
9 *
10 * 上記著作権者
11は,以下の (1)〜(4) の条件か,Free Software Foundation
12 * によってå…
13¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
14 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
15 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
16å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
17 * 利用と呼ぶ)することを無償で許諾する.
18 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
19 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
20 * スコード中に含まれていること.
21 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
22 * 用できる形で再é…
23å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
24å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
25 * 者
26マニュアルなど)に,上記の著作権表示,この利用条件および下記
27 * の無保証規定を掲載すること.
28 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
29 * 用できない形で再é…
30å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
31 * と.
32 * (a) 再é…
33å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
34マニュアルなど)に,上記の著
35 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
36 * (b) 再é…
37å¸ƒã®å½¢æ…
38‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
39 * 報告すること.
40 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
41 * 害からも,上記著作権者
42およびTOPPERSプロジェクトをå…
43è²¬ã™ã‚‹ã“と.
44 *
45 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
46お
47 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
48 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
49 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
50 *
51 * @(#) $Id$
52 */
53
54/*
55 * LPC2214 内
56部機能用ドライバ
57 */
58#include <s_services.h>
59#include <lpc2214.h>
60
61/*
62 * 内
63部UART用 簡易SIOドライバ
64 */
65
66/*
67 * シリアルI/Oポート初期化ブロック
68 */
69typedef struct sio_port_initialization_block {
70
71} SIOPINIB;
72
73/*
74 * シリアルI/Oポート管理ブロック
75 */
76struct sio_port_control_block {
77 const SIOPINIB *siopinib; /* シリアルI/Oポート初期化ブロック */
78 VP_INT exinf; /* 拡張情
79å ± */
80 BOOL openflag; /* オープン済みフラグ */
81 BOOL sendflag; /* 送信割込みイネーブルフラグ */
82 BOOL getready; /* 文字を受信した状æ…
83‹ */
84 BOOL putready; /* 文字を送信できる状æ…
85‹ */
86};
87
88/*
89 * シリアルI/Oポート初期化ブロック
90 */
91const SIOPINIB siopinib_table[TNUM_SIOP] = {{}};
92
93/*
94 * シリアルI/Oポート管理ブロックのエリア
95 */
96SIOPCB siopcb_table[TNUM_SIOP];
97
98/*
99 * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
100 */
101#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1))
102#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))
103
104
105/*
106 * 文字を受信したか?
107 */
108Inline BOOL
109uart_getready(SIOPCB *siopcb)
110{
111 return (sil_rew_mem(UART_LSR) & 0x01) != 0;
112}
113
114/*
115 * 文字を送信できるか?
116 */
117Inline BOOL
118uart_putready(SIOPCB *siopcb)
119{
120 return (sil_rew_mem(UART_LSR) & 0x20) != 0;
121}
122
123/*
124 * 受信した文字の取り出し
125 */
126Inline UB
127uart_getchar(SIOPCB *siopcb)
128{
129 return (UB)sil_rew_mem(UART_RBR);
130}
131
132/*
133 * 送信する文字の書き込み
134 */
135void
136uart_putchar(SIOPCB *siopcb, UB c)
137{
138 sil_wrw_mem(UART_THR, (VW)c);
139}
140
141/*
142 * 送信割込み許可
143 */
144Inline void
145uart_enable_send(SIOPCB *siopcb)
146{
147 VW wbits;
148 wbits = sil_rew_mem(UART_IER);
149 wbits |= UART_INT_T;
150 sil_wrw_mem(UART_IER,wbits);
151}
152
153/*
154 * 送信割込み禁止
155 */
156Inline void
157uart_disable_send(SIOPCB *siopcb)
158{
159 VW wbits;
160 wbits = sil_rew_mem(UART_IER);
161 wbits &= ~UART_INT_T;
162 sil_wrw_mem(UART_IER,wbits);
163}
164
165/*
166 * 受信割込み許可
167 */
168Inline void
169uart_enable_rcv(SIOPCB *siopcb)
170{
171 VW wbits;
172 wbits = sil_rew_mem(UART_IER);
173 wbits |= UART_INT_R;
174 sil_wrw_mem(UART_IER,wbits);
175}
176
177/*
178 * 受信割込み禁止
179 */
180Inline void
181uart_disable_rcv(SIOPCB *siopcb)
182{
183 VW wbits;
184 wbits = sil_rew_mem(UART_IER);
185 wbits &= ~UART_INT_R;
186 sil_wrw_mem(UART_IER,wbits);
187}
188
189
190
191/*
192 * カーネル起動時のログ出力用の初期化
193 */
194void
195uart_init(void){
196 UW wbits;
197 UH devisor;
198
199#if 0
200 /*
201 * GP34〜41 を FFUART として利用
202 */
203 wbits = sil_rew_mem(GPIO_GAFR0_y);
204 wbits = (wbits & 0xfff0000f) | 0x000a9550;
205 sil_wrw_mem(GPIO_GAFR0_y, wbits);
206
207 /*
208 * TXD, RTS/RTS を出力にする
209 */
210 wbits = sil_rew_mem(GPIO_GPDR_y);
211 wbits = (wbits & 0xfffffc7f) | 0x00000380;
212 sil_wrw_mem(GPIO_GPDR_y, wbits);
213
214 /*
215 * RS232C ドライバハードウェアのイネーブル
216 */
217 wbits = sil_rew_mem(CQ_PXA250_CONFIG);
218 wbits |= 0x200;
219 sil_wrw_mem(CQ_PXA250_CONFIG, wbits);
220#endif
221
222 /*
223 * UART_BPS が14以下のとき、
224 * 演算結果がオーバフローする。
225 * 実際にそんな数値にすることは
226 * ありえないが念のため。
227 */
228#if (UART_BPS < 15)
229#error UART_BPS is too small or undefined.
230#endif
231
232 devisor = 921600 / UART_BPS;
233
234 sil_wrw_mem(UART_LCR, 0x80);
235 sil_wrw_mem(UART_DLL, devisor & 0xff);
236 sil_wrw_mem(UART_DLH, (devisor >> 8) & 0xff);
237 sil_wrw_mem(UART_LCR, 0x3);
238 sil_wrw_mem(UART_FCR, 0x1);
239 sil_wrw_mem(UART_MCR, 0x3);
240 sil_wrw_mem(UART_IER, 0x40);
241}
242
243
244/*
245 * オンチップのUARTからのポーリング出力
246 */
247void
248uart_putc(char c)
249{
250 UW buf_level;
251
252 while((sil_rew_mem(UART_LSR) & 0x20) == 0) {
253 /* spin lock */
254 }
255
256 sil_wrw_mem(UART_THR,(VW)c);
257}
258
259/*
260 * SIOドライバの初期化ルーチン
261 * 1ポートしかないため,あまり意味はない
262 */
263void
264uart_initialize()
265{
266 SIOPCB *siopcb;
267 UINT i;
268
269 /*
270 * シリアルI/Oポート管理ブロックの初期化
271 */
272 for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) {
273 siopcb->siopinib = &(siopinib_table[i]);
274 siopcb->openflag = FALSE;
275 siopcb->sendflag = FALSE;
276 }
277}
278
279/*
280 * オープンしているポートがあるか
281 */
282BOOL
283uart_openflag(void)
284{
285 return(siopcb_table[0].openflag);
286}
287
288
289/*
290 * シリアルI/Oポートのオープン
291 */
292SIOPCB *
293uart_opn_por(ID siopid, VP_INT exinf)
294{
295 SIOPCB *siopcb;
296 const SIOPINIB *siopinib;
297
298 siopcb = get_siopcb(siopid);
299 siopinib = siopcb->siopinib;
300
301 uart_init();
302
303 siopcb->exinf = exinf;
304 siopcb->getready = siopcb->putready = FALSE;
305 siopcb->openflag = TRUE;
306
307 /* clear FIFO TxThr = 0 RxThr = 1*/
308 sil_wrw_mem(UART_FCR,(VW)(UART_FCR_TC | UART_FCR_RC));
309
310 /* set interrupt */
311 sil_wrw_mem(UART_IER, 0x42);
312
313 return(siopcb);
314}
315
316/*
317 * シリアルI/Oポートのクローズ
318 */
319void
320uart_cls_por(SIOPCB *siopcb)
321{
322 siopcb->openflag = FALSE;
323}
324
325/*
326 * シリアルI/Oポートへの文字送信
327 */
328BOOL
329uart_snd_chr(SIOPCB *siopcb, char c)
330{
331 if (uart_putready(siopcb)){
332 uart_putchar(siopcb, c);
333 return(TRUE);
334 }
335 return(FALSE);
336}
337
338/*
339 * シリアルI/Oポートからの文字受信
340 */
341INT
342uart_rcv_chr(SIOPCB *siopcb)
343{
344 if (uart_getready(siopcb)) {
345 return((INT)(UB) uart_getchar(siopcb));
346 }
347 return(-1);
348}
349
350/*
351 * シリアルI/Oポートからのコールバックの許可
352 */
353void
354uart_ena_cbr(SIOPCB *siopcb, UINT cbrtn)
355{
356 switch (cbrtn) {
357 case SIO_ERDY_SND:
358 uart_enable_send(siopcb);
359 break;
360 case SIO_ERDY_RCV:
361 uart_enable_rcv(siopcb);
362 break;
363 }
364}
365
366
367/*
368 * シリアルI/Oポートからのコールバックの禁止
369 */
370void
371uart_dis_cbr(SIOPCB *siopcb, UINT cbrtn)
372{
373 switch (cbrtn) {
374 case SIO_ERDY_SND:
375 uart_disable_send(siopcb);
376 break;
377 case SIO_ERDY_RCV:
378 uart_disable_rcv(siopcb);
379 break;
380 }
381}
382
383
384
385/*
386 * シリアルI/Oポートに対する割込み処理
387 */
388static void
389uart_isr_siop(SIOPCB *siopcb)
390{
391 if (uart_getready(siopcb)) {
392 /*
393 * 受信通知コールバックルーチンを呼び出す.
394 */
395 uart_ierdy_rcv(siopcb->exinf);
396 }
397 if (uart_putready(siopcb)) {
398 /*
399 * 送信可能コールバックルーチンを呼び出す.
400 */
401 uart_ierdy_snd(siopcb->exinf);
402 }
403}
404
405
406/*
407 * SIOの割込みサービスルーチン
408 */
409void
410uart_isr()
411{
412 sil_wrw_mem((VP *)0xe002800c, 0x40000000);
413
414 uart_isr_siop(&(siopcb_table[0]));
415}
416
Note: See TracBrowser for help on using the repository browser.