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

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

initial

File size: 10.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) 2005 by Embedded and Real-Time Systems Laboratory
7 * Graduate School of Information Science, Nagoya Univ., 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: nios2.c,v 1.6 2005/07/17 14:24:04 honda Exp $
51 */
52
53/*
54 * Nios2 標準ペリフェラル用ドライバ
55 */
56#include <s_services.h>
57#include <nios2.h>
58
59
60/*
61 * UART 用 簡易ドライバ
62 */
63
64/*
65 * シリアルI/Oポート初期化ブロック
66 */
67const SIOPINIB siopinib_table[TNUM_SIOP] = {{}};
68
69/*
70 * シリアルI/Oポート管理ブロックのエリア
71 */
72SIOPCB siopcb_table[TNUM_SIOP];
73
74/*
75 * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
76 */
77#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1))
78#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))
79
80#ifdef USE_JTAG_UART
81/*
82 * JTAG_UART はステータスとデータを同時に取得するため,ステータスを
83 * チェックするとデータを読み込んでしまう.そのため,uart_getready()
84 * を実行した後のデータをå…
85¥ã‚Œã‚‹ï¼Ž
86 */
87UB jtag_uart_buf = -1;
88#endif /* USE_JTAG_UART */
89
90/*
91 * 文字を受信したか?
92 */
93Inline BOOL
94uart_getready(SIOPCB *siopcb)
95{
96#ifndef USE_JTAG_UART
97 return((sil_rew_mem((VP)UART_STATUS) &
98 UART_STATUS_RRDY) != 0);
99#else
100 UW tmp = sil_rew_mem((VP)JTAG_UART_DATA);
101 jtag_uart_buf = (UB)tmp;
102 return ((tmp & JTAG_UART_DATA_RVALID) != 0);
103#endif /* USE_JTAG_UART */
104}
105
106/*
107 * 文字を送信できるか?
108 */
109Inline BOOL
110uart_putready(SIOPCB *siopcb)
111{
112#ifndef USE_JTAG_UART
113 return((sil_rew_mem((VP)UART_STATUS) & UART_STATUS_TRDY) != 0);
114#else
115 return((sil_rew_mem(
116 (VP)JTAG_UART_CONTROL) & JTAG_UART_CONTROL_WSAPCE) > 0);
117#endif /* USE_JTAG_UART */
118}
119
120/*
121 * 受信した文字の取り出し
122 */
123Inline UB
124uart_getchar(SIOPCB *siopcb)
125{
126#ifndef USE_JTAG_UART
127 return((UB)(sil_rew_mem((VP)UART_RXDATA)));
128#else
129 return((UB)(sil_rew_mem((VP)JTAG_UART_DATA)));
130#endif /* USE_JTAG_UART */
131}
132
133/*
134 * 送信する文字の書き込み
135 */
136Inline void
137uart_putchar(SIOPCB *siopcb, UB c)
138{
139#ifndef USE_JTAG_UART
140 sil_wrw_mem((VP)UART_TXDATA, c);
141#else
142 sil_wrw_mem((VP)JTAG_UART_DATA,c);
143#endif /* USE_JTAG_UART */
144}
145
146/*
147 * 送信制御関数
148 */
149/*
150 * 送信割込み許可
151 */
152Inline void
153uart_enable_send(SIOPCB *siopcb)
154{
155#ifndef USE_JTAG_UART
156 sil_wrw_mem((VP)UART_CONTROL,
157 sil_rew_mem((VP)UART_CONTROL)|UART_CONTROL_ITRD);
158#else
159 sil_wrw_mem((VP)JTAG_UART_CONTROL,
160 sil_rew_mem((VP)JTAG_UART_CONTROL)|JTAG_UART_CONTROL_WIE);
161#endif /* USE_JTAG_UART */
162}
163
164/*
165 * 送信割込み禁止
166 */
167Inline void
168uart_disable_send(SIOPCB *siopcb)
169{
170#ifndef USE_JTAG_UART
171 sil_wrw_mem((VP)UART_CONTROL,
172 sil_rew_mem((VP)UART_CONTROL)&~UART_CONTROL_ITRD);
173#else
174 sil_wrw_mem((VP)JTAG_UART_CONTROL,
175 sil_rew_mem((VP)JTAG_UART_CONTROL)&~JTAG_UART_CONTROL_WIE);
176#endif /* USE_JTAG_UART */
177}
178
179/*
180 * 受信制御関数
181 */
182/*
183 * 受信割込み許可
184 */
185Inline void
186uart_enable_rcv(SIOPCB *siopcb)
187{
188#ifndef USE_JTAG_UART
189 sil_wrw_mem((VP)UART_CONTROL,
190 sil_rew_mem((VP)UART_CONTROL)|UART_STATUS_RRDY);
191#else
192 sil_wrw_mem((VP)JTAG_UART_CONTROL,
193 sil_rew_mem((VP)JTAG_UART_CONTROL)|JTAG_UART_CONTROL_RIE);
194#endif /* USE_JTAG_UART */
195}
196
197/*
198 * 受信割込み禁止
199 */
200Inline void
201uart_disable_rcv(SIOPCB *siopcb)
202{
203#ifndef USE_JTAG_UART
204 sil_wrw_mem((VP)UART_CONTROL,
205 sil_rew_mem((VP)UART_CONTROL)&~UART_STATUS_RRDY);
206#else
207 sil_wrw_mem((VP)JTAG_UART_CONTROL,
208 sil_rew_mem((VP)JTAG_UART_CONTROL)&~JTAG_UART_CONTROL_RIE);
209#endif /* USE_JTAG_UART */
210}
211
212
213/*
214 * SIOドライバの初期化ルーチン
215 * 1ポートしかないため,あまり意味はない
216 */
217void
218uart_initialize()
219{
220 SIOPCB *siopcb;
221 UINT i;
222
223 /*
224 * シリアルI/Oポート管理ブロックの初期化
225 */
226 for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) {
227 siopcb->siopinib = &(siopinib_table[i]);
228 siopcb->openflag = FALSE;
229 siopcb->sendflag = FALSE;
230 }
231}
232
233
234SIOPCB *
235uart_opn_por(ID siopid, VP_INT exinf){
236
237 SIOPCB *siopcb;
238 const SIOPINIB *siopinib;
239
240 siopcb = get_siopcb(siopid);
241 siopinib = siopcb->siopinib;
242
243#ifndef USE_JTAG_UART
244// sil_wrw_mem(UART_DIVISOR, UART_DIVISOR_VAL);
245 sil_wrw_mem((VP)UART_STATUS, 0x00);
246
247 /*
248 * 受信割り込み許可
249 */
250 sil_wrw_mem((VP)UART_CONTROL, UART_STATUS_RRDY);
251#else
252 sil_wrw_mem((VP)JTAG_UART_CONTROL,JTAG_UART_CONTROL_RIE);
253#endif /* USE_JTAG_UART */
254
255 siopcb->exinf = exinf;
256 siopcb->getready = siopcb->putready = FALSE;
257 siopcb->openflag = TRUE;
258
259 return(siopcb);
260}
261
262
263void
264uart_cls_por(SIOPCB *siopcb){
265#ifndef USE_JTAG_UART
266 /* 割込み禁止 */
267 sil_wrw_mem((VP)UART_CONTROL, 0x00);
268#else
269 sil_wrw_mem((VP)JTAG_UART_CONTROL,0x00);
270#endif /* USE_JTAG_UART */
271 siopcb->openflag = FALSE;
272 siopcb->sendflag = FALSE;
273}
274
275
276
277/*
278 * シリアルI/Oポートへの文字送信
279 */
280BOOL
281uart_snd_chr(SIOPCB *siopcb, INT chr)
282{
283 if(uart_putready(siopcb)){
284 uart_putchar(siopcb, (UB) chr);
285 return(TRUE);
286 }
287 return(FALSE);
288}
289
290/*
291 * シリアルI/Oポートからの文字受信
292 */
293INT
294uart_rcv_chr(SIOPCB *siopcb)
295{
296#ifndef USE_JTAG_UART
297 if (uart_getready(siopcb)) {
298 return((INT)(UB) uart_getchar(siopcb));
299 }
300 return(-1);
301#else
302 UB tmp;
303
304 if (jtag_uart_buf != -1) {
305 tmp = jtag_uart_buf;
306 jtag_uart_buf = -1;
307 return tmp;
308 }
309 return(-1);
310#endif /* USE_JTAG_UART */
311}
312
313
314/*
315 * シリアルI/Oポートからのコールバックの許可
316 */
317void
318uart_ena_cbr(SIOPCB *siopcb, UINT cbrtn)
319{
320 switch (cbrtn) {
321 case SIO_ERDY_SND:
322 uart_enable_send(siopcb);
323 break;
324 case SIO_ERDY_RCV:
325 uart_enable_rcv(siopcb);
326 break;
327 }
328
329}
330
331
332/*
333 * シリアルI/Oポートからのコールバックの禁止
334 */
335void
336uart_dis_cbr(SIOPCB *siopcb, UINT cbrtn)
337{
338 switch (cbrtn) {
339 case SIO_ERDY_SND:
340 uart_disable_send(siopcb);
341 break;
342 case SIO_ERDY_RCV:
343 uart_disable_rcv(siopcb);
344 break;
345 }
346}
347
348
349/*
350 * シリアルI/Oポートに対する割込み処理
351 */
352static void
353uart_isr_siop(SIOPCB *siopcb)
354{
355 if (uart_getready(siopcb)) {
356 /*
357 * 受信通知コールバックルーチンを呼び出す.
358 */
359 uart_ierdy_rcv(siopcb->exinf);
360 }
361
362 if (uart_putready(siopcb)) {
363 /*
364 * 送信可能コールバックルーチンを呼び出す.
365 */
366 uart_ierdy_snd(siopcb->exinf);
367 }
368}
369
370
371/*
372 * SIOの割込みサービスルーチン
373 */
374void
375uart_isr()
376{
377 if (siopcb_table[0].openflag) {
378 uart_isr_siop(&(siopcb_table[0]));
379 }
380}
381
Note: See TracBrowser for help on using the repository browser.