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

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

initial

File size: 8.7 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-2006 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2005-2006 by Logic Research Co., Ltd.
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 */
52
53/*
54 * FRK_ADuC 内
55部機能用ドライバ
56 */
57
58#include <s_services.h>
59#include "frk_aduc.h"
60
61
62/*
63 * シリアルI/Oポート初期化ブロック
64 */
65const SIOPINIB siopinib_table[TNUM_SIOP] = {
66 {(VP)COMRX, (VP)COMDIV0, (VP)COMDIV1,
67 (VP)COMIEN0, (VP)COMIID0, (VP)COMCON0,
68 (VP)COMSTA0, IRQ_UART}
69};
70
71
72/*
73 * シリアルI/Oポート管理ブロックのエリア
74 */
75SIOPCB siopcb_table[TNUM_SIOP];
76
77
78
79/*
80 * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
81 */
82#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1))
83#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))
84
85
86
87/*
88 * 文字を受信したか?
89 */
90Inline BOOL
91uart_getready(SIOPCB *siopcb)
92{
93 return(((sil_rew_mem((VP)(siopcb->siopinib->line_status)) & COMSTA0_DR)!=0));
94}
95
96
97/*
98 * 文字を送信できるか?
99 */
100Inline BOOL
101uart_putready(SIOPCB *siopcb)
102{
103 return((sil_rew_mem((VP)(siopcb->siopinib->line_status)) & COMSTA0_TEMT)!=0);
104}
105
106
107/*
108 * 受信した文字の取り出し
109 */
110Inline UB
111uart_getchar(SIOPCB *siopcb)
112{
113 return(sil_rew_mem((VP)(siopcb->siopinib->uart_data)));
114}
115
116
117/*
118 * 送信する文字の書き込み
119 */
120Inline void
121uart_putchar(SIOPCB *siopcb, UB c)
122{
123 sil_wrw_mem((VP)(siopcb->siopinib->uart_data), c);
124}
125
126
127/*
128 * 送信割込み許可
129 */
130Inline void
131uart_enable_send(SIOPCB *siopcb)
132{
133 sil_wrw_mem((VP)(siopcb->siopinib->int_enable),
134 (sil_rew_mem((VP)(siopcb->siopinib->int_enable)) | COMIEN0_ETBEI));
135}
136
137
138/*
139 * 送信割込み禁止
140 */
141Inline void
142uart_disable_send(SIOPCB *siopcb)
143{
144 sil_wrw_mem((VP)(siopcb->siopinib->int_enable),
145 (sil_rew_mem((VP)(siopcb->siopinib->int_enable)) & ~COMIEN0_ETBEI));
146}
147
148
149/*
150 * 受信割込み許可
151 */
152Inline void
153uart_enable_rcv(SIOPCB *siopcb)
154{
155 sil_wrw_mem((VP)(siopcb->siopinib->int_enable),
156 (sil_rew_mem((VP)(siopcb->siopinib->int_enable)) | COMIEN0_ERBFI));
157}
158
159/*
160 * 受信割込み禁止
161 */
162Inline void
163uart_disable_rcv(SIOPCB *siopcb)
164{
165 sil_wrw_mem((VP)(siopcb->siopinib->int_enable),
166 (sil_rew_mem((VP)(siopcb->siopinib->int_enable)) & ~COMIEN0_ERBFI));
167}
168
169
170
171/*
172 * カーネル起動時のログ出力用の初期化
173 */
174void
175init_uart(void){
176 /* Disable Interrupt */
177 sil_wrw_mem((VP)COMIEN0, 0);
178 /* 9600bps */
179 sil_wrw_mem((VP)COMCON0, COMCON0_DLAB);
180 sil_wrw_mem((VP)COMDIV0, COMDIV0_BR9600);
181 sil_wrw_mem((VP)COMDIV1, COMDIV1_BR9600);
182 /* 8Data, 1Stop, No Parity */
183 sil_wrw_mem((VP)COMCON0, (COMCON0_STOP|COMCON0_WLS_8b));
184 /* Enabel Receive Interrupt */
185 sil_wrw_mem((VP)COMIEN0, (COMIEN0_ERBFI|COMIEN0_ETBEI));
186}
187
188
189/*
190 * オンチップのUARTからのポーリング出力
191 */
192void
193uart_putc(char c)
194{
195 int i;
196
197 while((sil_rew_mem((VP)COMSTA0) & COMSTA0_TEMT)!=COMSTA0_TEMT);
198
199 sil_wrw_mem((VP)COMTX, (VW)c);
200}
201
202
203/*
204 * SIOドライバの初期化ルーチン
205 * 1ポートしかないため,あまり意味はない
206 */
207void
208uart_initialize()
209{
210 SIOPCB *siopcb;
211 UINT i;
212
213 /*
214 * シリアルI/Oポート管理ブロックの初期化
215 */
216 for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) {
217 siopcb->siopinib = &(siopinib_table[i]);
218 siopcb->openflag = FALSE;
219 siopcb->sendflag = FALSE;
220 }
221}
222
223
224/*
225 * オープンしているポートがあるか
226 */
227BOOL
228uart_openflag(void)
229{
230 return(siopcb_table[0].openflag);
231}
232
233
234/*
235 * シリアルI/Oポートのオープン
236 */
237SIOPCB *
238uart_opn_por(ID siopid, VP_INT exinf)
239{
240 int i;
241
242 SIOPCB *siopcb;
243 const SIOPINIB *siopinib;
244
245 siopcb = get_siopcb(siopid);
246 siopinib = siopcb->siopinib;
247
248 /* Disable Interrupt */
249 sil_wrw_mem((VP)siopinib->int_enable, 0);
250 /* 9600bps */
251 sil_wrw_mem((VP)siopinib->line_control, COMCON0_DLAB);
252 sil_wrw_mem((VP)siopinib->divisor_lo, COMDIV0_BR9600);
253 sil_wrw_mem((VP)siopinib->divisor_hi, COMDIV1_BR9600);
254
255 /* 8Data, 1Stop, No Parity */
256 sil_wrw_mem((VP)siopinib->line_control, (COMCON0_STOP|COMCON0_WLS_8b));
257
258 /*
259 * 割込み関連の設定
260 */
261 sil_wrw_mem((VP)siopinib->int_enable, (COMIEN0_ERBFI|COMIEN0_ETBEI)); /* Enable Interrupt */
262 sil_wrw_mem((VP)IRQEN, siopinib->irq_bit); /*Enable interrupt register*/
263
264 siopcb->exinf = exinf;
265 siopcb->getready = siopcb->putready = FALSE;
266 siopcb->openflag = TRUE;
267
268 return(siopcb);
269}
270
271
272/*
273 * シリアルI/Oポートのクローズ
274 */
275void
276uart_cls_por(SIOPCB *siopcb)
277{
278 sil_wrw_mem((VP)(siopcb->siopinib->line_control),
279 (sil_rew_mem((VP)(siopcb->siopinib->line_control))|COMCON0_BRK)); /* Disable Interrupt */
280
281 siopcb->openflag = FALSE;
282}
283
284
285/*
286 * シリアルI/Oポートへの文字送信
287 */
288BOOL
289uart_snd_chr(SIOPCB *siopcb, char c)
290{
291 if (uart_putready(siopcb)){
292 uart_putchar(siopcb, c);
293 return(TRUE);
294 }
295 return(FALSE);
296}
297
298
299/*
300 * シリアルI/Oポートからの文字受信
301 */
302INT
303uart_rcv_chr(SIOPCB *siopcb)
304{
305 if (uart_getready(siopcb)) {
306 return((INT)(UB) uart_getchar(siopcb));
307 }
308 return(-1);
309}
310
311/*
312 * シリアルI/Oポートからのコールバックの許可
313 */
314void
315uart_ena_cbr(SIOPCB *siopcb, UINT cbrtn)
316{
317 switch (cbrtn) {
318 case SIO_ERDY_SND:
319 uart_enable_send(siopcb);
320 break;
321 case SIO_ERDY_RCV:
322 uart_enable_rcv(siopcb);
323 break;
324 }
325}
326
327
328/*
329 * シリアルI/Oポートからのコールバックの禁止
330 */
331void
332uart_dis_cbr(SIOPCB *siopcb, UINT cbrtn)
333{
334 switch (cbrtn) {
335 case SIO_ERDY_SND:
336 uart_disable_send(siopcb);
337 break;
338 case SIO_ERDY_RCV:
339 uart_disable_rcv(siopcb);
340 break;
341 }
342}
343
344
345/*
346 * シリアルI/Oポートに対する割込み処理
347 */
348static void
349uart_isr_siop(SIOPCB *siopcb)
350{
351 volatile UW iid;
352
353 if (uart_getready(siopcb)) {
354 /*
355 * 受信通知コールバックルーチンを呼び出す.
356 */
357 uart_ierdy_rcv(siopcb->exinf);
358 }
359 if (uart_putready(siopcb)) {
360 iid = sil_rew_mem((VP)COMIID0);
361 /*
362 * 送信可能コールバックルーチンを呼び出す.
363 */
364 uart_ierdy_snd(siopcb->exinf);
365 }
366}
367
368
369/*
370 * SIOの割込みサービスルーチン
371 */
372void
373uart_isr()
374{
375 uart_isr_siop(&(siopcb_table[0]));
376}
377
Note: See TracBrowser for help on using the repository browser.