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

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

initial

File size: 11.1 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 * Copyright (C) 2005-2007 by Y.D.K.Co.,LTD Technologies company
10 *
11 * 上記著作権者
12は,以下の (1)〜(4) の条件か,Free Software Foundation
13 * によってå…
14¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
15 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
16 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
17å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
18 * 利用と呼ぶ)することを無償で許諾する.
19 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
20 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
21 * スコード中に含まれていること.
22 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
23 * 用できる形で再é…
24å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
25å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
26 * 者
27マニュアルなど)に,上記の著作権表示,この利用条件および下記
28 * の無保証規定を掲載すること.
29 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
30 * 用できない形で再é…
31å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
32 * と.
33 * (a) 再é…
34å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
35マニュアルなど)に,上記の著
36 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
37 * (b) 再é…
38å¸ƒã®å½¢æ…
39‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
40 * 報告すること.
41 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
42 * 害からも,上記著作権者
43およびTOPPERSプロジェクトをå…
44è²¬ã™ã‚‹ã“と.
45 *
46 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
47お
48 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
49 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
50 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
51 *
52 * @(#) $Id: ns9360.c,v 1.2 2007/05/21 01:33:50 honda Exp $
53 */
54
55/*
56 * 内
57部機能用ドライバ
58 */
59#include <s_services.h>
60#include <ns9360.h>
61
62/*
63 * 内
64部UART用 簡易SIOドライバ
65 */
66
67/*
68 * シリアルI/Oポート初期化ブロック
69 */
70const SIOPINIB siopinib_table[TNUM_SIOP] = {
71 {
72 /* UART Channel A */
73 (VP)SC1SRA_REG , (VP)SC1FIFO_REG , (VP)SC1CRA_REG , (VP)SC1CRB_REG
74 ,(VP)SC1RCT_REG , (VP)SC1RBT_REG , (VP)SC1BRG_REG
75 ,(SCCRA_CE | SCCRA_WLS | SCCRA_DTR | SCCRA_RTS)
76 ,0x08000000
77 ,0x80000008
78 ,0x80000008
79 ,(0xC0140000 | 7) /* 29.4912MHz /2/8 = 115200*16 */
80 ,BBBI_S1TX , BBBI_S1RX
81 }
82#if TNUM_SIOP >= 2
83 ,
84 {
85 /* UART Channel C */
86 (VP)SC3SRA_REG , (VP)SC3FIFO_REG , (VP)SC3CRA_REG , (VP)SC3CRB_REG
87 ,(VP)SC3RCT_REG ,(VP)SC3RBT_REG , (VP)SC3BRG_REG
88 ,(SCCRA_CE | SCCRA_WLS | SCCRA_DTR | SCCRA_RTS)
89 ,0x08000000
90 ,0x80000008
91 ,0x80000008
92 ,(0xC0140000 | 7) /* 29.4912MHz /2/8 = 115200*16 */
93 ,BBBI_S3TX , BBBI_S3RX
94 }
95#endif
96 };
97
98/*
99 * シリアルI/Oポート管理ブロックのエリア
100 */
101SIOPCB siopcb_table[TNUM_SIOP];
102
103/*
104 * システム出力用シリアルポート情
105å ±
106 */
107SIOPCB *sys_siopcb;
108
109
110/*
111 * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
112 */
113#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1))
114#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))
115
116
117/*
118 * 文字を受信したか?
119 */
120Inline BOOL
121uart_getready(SIOPCB *siopcb)
122{
123 VW dt;
124
125 if(0 != siopcb->rxfdb)
126 return TRUE;
127
128 dt = sil_rew_mem((VP)siopcb->siopinib->pSraReg);
129 return(dt &(SCSRA_RFS | SCSRA_RRDY));
130}
131
132/*
133 * 文字を送信できるか?
134 */
135Inline BOOL
136uart_putready(SIOPCB *siopcb)
137{
138 return(sil_rew_mem((VP)siopcb->siopinib->pSraReg)&(SCSRA_TRDY | SCSRA_THALF | SCSRA_TEMPTY));
139}
140
141/*
142 * 受信した文字の取り出し
143 */
144Inline UB
145uart_getchar(SIOPCB *siopcb)
146{
147 UW dt;
148
149 if(0 == siopcb->rxfdb)
150 {
151 siopcb->rxfdb = (sil_rew_mem((VP)siopcb->siopinib->pSraReg) >> 20) & 0x03;
152 if(0 == siopcb->rxfdb)
153 siopcb->rxfdb = 4;
154
155 siopcb->rxbuf = sil_rew_mem((VP)siopcb->siopinib->pFifoReg);
156 }
157 --(siopcb->rxfdb);
158 dt = (siopcb->rxbuf >> 24) & 0xff;
159 siopcb->rxbuf <<= 8;
160
161 return (UB)dt;
162
163}
164
165/*
166 * 送信する文字の書き込み
167 */
168Inline void
169uart_putchar(SIOPCB *siopcb, UB c)
170{
171 sil_wrb_mem((VP)siopcb->siopinib->pFifoReg, (VB)c);
172}
173
174/*
175 * 送信割込み許可
176 */
177Inline void
178uart_enable_send(SIOPCB *siopcb)
179{
180 sil_wrw_mem((VP)BBBIE_REG,sil_rew_mem((VP)BBBIE_REG) | siopcb->siopinib->BbbiTx);
181}
182
183/*
184 * 送信割込み禁止
185 */
186Inline void
187uart_disable_send(SIOPCB *siopcb)
188{
189 sil_wrw_mem((VP)BBBIE_REG,sil_rew_mem((VP)BBBIE_REG) & ~siopcb->siopinib->BbbiTx);
190}
191
192/*
193 * 受信割込み許可
194 */
195Inline void
196uart_enable_rcv(SIOPCB *siopcb)
197{
198 sil_wrw_mem((VP)BBBIE_REG,sil_rew_mem((VP)BBBIE_REG) | siopcb->siopinib->BbbiRx);
199}
200
201/*
202 * 受信割込み禁止
203 */
204Inline void
205uart_disable_rcv(SIOPCB *siopcb)
206{
207 sil_wrw_mem((VP)BBBIE_REG,sil_rew_mem((VP)BBBIE_REG) & ~siopcb->siopinib->BbbiRx);
208}
209
210
211
212/*
213 * カーネル起動時のログ出力用の初期化
214 */
215void
216uart_init(ID siopid){
217 SIOPCB *siopcb;
218
219 uart_initialize();
220
221 siopcb = get_siopcb(siopid);
222
223 sys_siopcb = siopcb;
224
225 /* UART Initialize */
226 sil_wrw_mem((VP)siopcb->siopinib->pCraReg,(VW)siopcb->siopinib->CraData);
227 sil_wrw_mem((VP)siopcb->siopinib->pCrbReg,(VW)siopcb->siopinib->CrbData);
228 sil_wrw_mem((VP)siopcb->siopinib->pRctReg,(VW)0);
229
230 /* Set bound rate */
231 sil_wrw_mem((VP)siopcb->siopinib->pBrgReg,siopcb->siopinib->BrgData);
232}
233
234
235/*
236 * オンチップのUARTからのポーリング出力
237 */
238void
239uart_putc(char c)
240{
241 UW buf_level;
242
243 do{
244 buf_level = sil_rew_mem((VP)sys_siopcb->siopinib->pSraReg) & SCSRA_TRDY;
245 }while(buf_level == 0);
246
247 sil_wrb_mem((VP)sys_siopcb->siopinib->pFifoReg,(VW)c);
248}
249
250/*
251 * SIOドライバの初期化ルーチン
252 */
253void
254uart_initialize()
255{
256 SIOPCB *siopcb;
257 UINT i;
258
259 /*
260 * シリアルI/Oポート管理ブロックの初期化
261 */
262 for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) {
263 siopcb->siopinib = &(siopinib_table[i]);
264 siopcb->openflag = FALSE;
265 siopcb->sendflag = FALSE;
266 siopcb->rxfdb = 0;
267 siopcb->rxbuf = 0;
268 siopcb->siopid = i;
269 }
270}
271
272/*
273 * オープンしているポートがあるか
274 */
275BOOL
276uart_openflag(ID siopid)
277{
278 return(siopcb_table[siopid].openflag);
279}
280
281
282/*
283 * シリアルI/Oポートのオープン
284 */
285SIOPCB *
286uart_opn_por(ID siopid, VP_INT exinf)
287{
288 SIOPCB *siopcb;
289 const SIOPINIB *siopinib;
290 UW n;
291
292 siopcb = get_siopcb(siopid);
293 siopinib = siopcb->siopinib;
294
295 /* UART Initialize */
296 sil_wrw_mem((VP)siopinib->pCraReg,(VW)siopinib->CraData);
297 sil_wrw_mem((VP)siopinib->pCrbReg,(VW)siopinib->CrbData);
298 sil_wrw_mem((VP)siopinib->pRctReg,(VW)siopinib->RctData);
299 sil_wrw_mem((VP)siopinib->pRbtReg,(VW)siopinib->RbtData);
300
301 /* Set bound rate */
302 sil_wrw_mem((VP)siopinib->pBrgReg,siopinib->BrgData);
303
304 /* 受信RcvRdy,FIFO=Half、送信TxEmpty,FIFO-Half割込み許可 */
305 n = sil_rew_mem((VP)siopinib->pCraReg);
306 n &= (~(SCCRA_RIE | SCCRA_TIC));
307 n |= (0xe00 | 0x0c);
308 sil_wrw_mem((VP)siopinib->pCraReg,(VW)n);
309
310 /* BBUS割込み許可 */
311 sil_wrw_mem((VP)BBBIE_REG,sil_rew_mem((VP)BBBIE_REG) | siopinib->BbbiRx);
312 sil_wrw_mem((VP)INT_CFG8_11_REG,sil_rew_mem((VP)INT_CFG8_11_REG)|0x80000000);
313
314 siopcb->exinf = exinf;
315 siopcb->getready = siopcb->putready = FALSE;
316 siopcb->openflag = TRUE;
317 siopcb->rxfdb = 0;
318 siopcb->rxbuf = 0;
319
320 return(siopcb);
321}
322
323/*
324 * シリアルI/Oポートのクローズ
325 */
326void
327uart_cls_por(SIOPCB *siopcb)
328{
329 siopcb->openflag = FALSE;
330}
331
332/*
333 * シリアルI/Oポートへの文字送信
334 */
335BOOL
336uart_snd_chr(SIOPCB *siopcb, char c)
337{
338 if (uart_putready(siopcb)){
339 uart_putchar(siopcb, c);
340 return(TRUE);
341 }
342 return(FALSE);
343}
344
345/*
346 * シリアルI/Oポートからの文字受信
347 */
348INT
349uart_rcv_chr(SIOPCB *siopcb)
350{
351 if (uart_getready(siopcb)) {
352 return((INT)(UB) uart_getchar(siopcb));
353 }
354 return(-1);
355}
356
357/*
358 * シリアルI/Oポートからのコールバックの許可
359 */
360void
361uart_ena_cbr(SIOPCB *siopcb, UINT cbrtn)
362{
363 switch (cbrtn) {
364 case SIO_ERDY_SND:
365 uart_enable_send(siopcb);
366 break;
367 case SIO_ERDY_RCV:
368 uart_enable_rcv(siopcb);
369 break;
370 }
371}
372
373
374/*
375 * シリアルI/Oポートからのコールバックの禁止
376 */
377void
378uart_dis_cbr(SIOPCB *siopcb, UINT cbrtn)
379{
380 switch (cbrtn) {
381 case SIO_ERDY_SND:
382 uart_disable_send(siopcb);
383 break;
384 case SIO_ERDY_RCV:
385 uart_disable_rcv(siopcb);
386 break;
387 }
388}
389
390
391/*
392 * シリアルI/Oポートに対する送信割込み処理
393 */
394static void
395uart_Txisr_siop(SIOPCB *siopcb)
396{
397 /*
398 * 送信可能コールバックルーチンを呼び出す.
399 */
400 uart_ierdy_snd(siopcb->exinf);
401}
402
403/*
404 * シリアルI/Oポートに対する受信割込み処理
405 */
406static void
407uart_Rxisr_siop(SIOPCB *siopcb)
408{
409 /*
410 * 受信通知コールバックルーチンを呼び出す.
411 * 最大4文字(32bit)受信しているのでここでå…
412¨å—信文字を処理する
413 */
414 while(1)
415 {
416 uart_ierdy_rcv(siopcb->exinf);
417 if(0 == siopcb->rxfdb)
418 break; /* 受信済みキャラクタなし */
419 }
420}
421
422
423/*
424 * SIOのTx割込みサービスルーチン
425 */
426void
427uart_Tx_isr()
428{
429 uart_Txisr_siop(&(siopcb_table[0]));
430}
431
432/*
433 * SIOのRx割込みサービスルーチン
434 */
435void
436uart_Rx_isr()
437{
438 uart_Rxisr_siop(&(siopcb_table[0]));
439 sil_wrw_mem((VP)siopcb_table[0].siopinib->pSraReg ,
440 sil_rew_mem((VP)siopcb_table[0].siopinib->pSraReg) );
441}
442
443/*
444 * SIO2のTx割込みサービスルーチン
445 */
446void
447uart2_Tx_isr()
448{
449 uart_Txisr_siop(&(siopcb_table[1]));
450}
451
452/*
453 * SIO2のRx割込みサービスルーチン
454 */
455void
456uart2_Rx_isr()
457{
458 uart_Rxisr_siop(&(siopcb_table[1]));
459 sil_wrw_mem((VP)siopcb_table[1].siopinib->pSraReg ,
460 sil_rew_mem((VP)siopcb_table[1].siopinib->pSraReg) );
461}
462
463
464/*
465 * SIOの割込み許可ルーチン
466 */
467void
468uart_TxRx_Enable(ID siopid)
469{
470 sil_wrw_mem((VP)BBBIE_REG,
471 sil_rew_mem((VP)BBBIE_REG) | siopcb_table[siopid].siopinib->BbbiTx
472 | siopcb_table[siopid].siopinib->BbbiRx);
473}
474
475/*
476 * SIOの割込み禁止ルーチン
477 */
478void
479uart_TxRx_Disable(ID siopid)
480{
481 sil_wrw_mem((VP)BBBIE_REG,
482 sil_rew_mem((VP)BBBIE_REG) & ~(siopcb_table[siopid].siopinib->BbbiTx
483 | siopcb_table[siopid].siopinib->BbbiRx) );
484}
485
486/*
487 * 現在のシリアルポートの取得
488 */
489ID
490uart_get_id(SIOPCB *siopcb)
491{
492 return(siopcb->siopid);
493}
494
Note: See TracBrowser for help on using the repository browser.