source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/m32c-renesas/oaks32/sfruart.c@ 26

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

initial

File size: 10.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 * Copyright (C) 2003-2004 by Platform Development Center
9 * RICOH COMPANY,LTD. JAPAN
10 * Copyright (C) 2003-2004 by Naoki Saito
11 * Nagoya Municipal Industrial Research Institute, JAPAN
12 *
13 * 上記著作権者
14は,以下の (1)〜(4) の条件か,Free Software Foundation
15 * によってå…
16¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
17 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
18 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
19å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
20 * 利用と呼ぶ)することを無償で許諾する.
21 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
22 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
23 * スコード中に含まれていること.
24 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
25 * 用できる形で再é…
26å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
27å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
28 * 者
29マニュアルなど)に,上記の著作権表示,この利用条件および下記
30 * の無保証規定を掲載すること.
31 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
32 * 用できない形で再é…
33å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
34 * と.
35 * (a) 再é…
36å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
37マニュアルなど)に,上記の著
38 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
39 * (b) 再é…
40å¸ƒã®å½¢æ…
41‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
42 * 報告すること.
43 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
44 * 害からも,上記著作権者
45およびTOPPERSプロジェクトをå…
46è²¬ã™ã‚‹ã“と.
47 *
48 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
49お
50 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
51 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
52 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
53 *
54 * @(#) $Id: sfruart.c,v 1.4 2005/11/24 12:41:23 honda Exp $
55 */
56
57/*
58 * OAKS32 UART用シリアルI/Oモジュール
59 */
60#include <s_services.h>
61#include "oaks32.h"
62#include <sfruart.h>
63
64/*
65 * デバイスオープンのリトライカウント
66 *
67 * 500回リトライすれば、十分に終了する.
68 */
69#define SFRUART_COUNT 500
70
71/*
72 * シリアルコントロールレジスタの設定値
73 */
74#define MR_DEF 0x05 /* 内
75部クロック、非同期、8ビット、パリティなし、スリープなし */
76#define MR_DISABLE_DEF 0x00 /* シリアルモジュール無効 */
77#define C0_DEF 0x10 /* RTS/CTS未使用, カウントソースf1, 送信割込み要因は「送信バッファ空」 */
78#define C1_DEF 0x00 /* シリアル送受信禁止 */
79#define BRG1_DEF 48 /* 30000000/{(UxBRG+1)*16} = 38400 */
80#define BRG2_DEF 97 /* 30000000/{(UxBRG+1)*16} = 19200 */
81
82#define TB_LEVEL 4 /* 送信割込みレベル */
83#define RB_LEVEL 5 /* 受信割込みレベル */
84#define DISABLE_LEVEL 0 /* 割込み禁止レベル */
85
86/*
87 * シリアルI/Oポート初期化ブロックの定義
88 */
89typedef struct sio_port_initialization_block {
90 UH cntrl_addr; /* 制御レジスタの番地 */
91 UH tic_addr; /* 送信割込み制御レジスタの番地 */
92 UH ric_addr; /* 受信割込み制御レジスタの番地 */
93
94 UB mr_def; /* デフォルトの設定値 (MR) */
95 UB c0_def; /* デフォルトの設定値 (C0) */
96 UB brg_def; /* デフォルトの設定値 (BRG) */
97} SIOPINIB;
98
99/*
100 * シリアルI/Oポート管理ブロックの定義
101 */
102typedef struct sio_port_control_block {
103 const SIOPINIB *siopinib; /* シリアルI/Oポート初期化ブロック */
104 VP_INT exinf; /* 拡張情
105å ± */
106 UB uc1; /* 送受信制御レジスタUiC1の設定値 */
107};
108
109/*
110 * シリアルI/Oポート初期化ブロック
111 *
112 * ID = 1 をuart0,ID = 2 をuart1に対応させている.
113 */
114static const SIOPINIB siopinib_table[TNUM_SIOP] = {
115 { TADR_SFR_UART0_BASE, (TADR_SFR_INT_BASE+TADR_SFR_S0TIC_OFFSET),
116 (TADR_SFR_INT_BASE+TADR_SFR_S0RIC_OFFSET), MR_DEF, C0_DEF, BRG1_DEF },
117#if TNUM_SIOP>1
118 { TADR_SFR_UART1_BASE, (TADR_SFR_INT_BASE+TADR_SFR_S1TIC_OFFSET),
119 (TADR_SFR_INT_BASE+TADR_SFR_S1RIC_OFFSET), MR_DEF, C0_DEF, BRG1_DEF }
120#endif
121};
122
123/*
124 * シリアルI/Oポート管理ブロックのエリア
125 */
126static SIOPCB siopcb_table[TNUM_SIOP];
127
128/*
129 * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
130 */
131#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1))
132#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))
133
134/*
135 * SIOドライバの初期化ルーチン
136 */
137void
138sfruart_initialize(void)
139{
140 SIOPCB *siopcb;
141 UINT i;
142
143 /*
144 * シリアルI/Oポート管理ブロックの初期化
145 */
146 for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) {
147 siopcb->siopinib = &(siopinib_table[i]);
148 siopcb->uc1 = C1_DEF;
149 /*
150 * 明示的にポートを不活性化しておく
151 */
152 /* 割り込み禁止 */
153 sil_wrb_mem((VP)(siopcb->siopinib->tic_addr), DISABLE_LEVEL);
154 sil_wrb_mem((VP)(siopcb->siopinib->ric_addr), DISABLE_LEVEL);
155 /* 送受信禁止 */
156 sil_wrb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET), siopcb->uc1);
157 }
158}
159
160/*
161 * シリアルI/Oポートのオープン
162 */
163SIOPCB *
164sfruart_opn_por(ID siopid, VP_INT exinf)
165{
166 SIOPCB *siopcb;
167 const SIOPINIB *siopinib;
168 int i;
169
170 siopcb = get_siopcb(siopid);
171 siopinib = siopcb->siopinib;
172
173 /* 送受信禁止 */
174 sil_wrb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET),
175 sil_reb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET))&~(TBIT_UiC1_TE | TBIT_UiC1_RE));
176
177 /* ポート設定(動作モード、通信速度) */
178 sil_wrb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_UMR_OFFSET), siopinib->mr_def);
179 sil_wrb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_UC0_OFFSET), siopinib->c0_def);
180 sil_wrb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_UBRG_OFFSET), siopinib->brg_def);
181
182 /*
183 * シリアル割込みの設定
184 */
185 sil_wrb_mem((VP)(siopinib->tic_addr), TB_LEVEL);
186 sil_wrb_mem((VP)(siopinib->ric_addr), RB_LEVEL);
187
188 /* オープン時はコールバック禁止 */
189 sil_wrb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET), siopcb->uc1);
190
191 /*
192 * ダミーデータ受信
193 */
194 sil_reb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_URB_OFFSET));
195 sil_reb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_URB_OFFSET));
196
197 for(i = 0 ; i < SFRUART_COUNT ; i++){ /* オープン時送信READYまで待
198ち */
199 if(sil_reb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET)) & TBIT_UiC1_TI)
200 break;
201 }
202
203 siopcb->exinf = exinf;
204 return(siopcb);
205}
206
207/*
208 * シリアルI/Oポートのクローズ
209 */
210void
211sfruart_cls_por(SIOPCB *siopcb)
212{
213 const SIOPINIB *siopinib;
214
215 siopinib = siopcb->siopinib;
216
217 /* 割り込み禁止 */
218 sil_wrb_mem((VP)(siopinib->tic_addr), DISABLE_LEVEL);
219 sil_wrb_mem((VP)(siopinib->ric_addr), DISABLE_LEVEL);
220
221 /* 送受信禁止 */
222 siopcb->uc1 = C1_DEF;
223 sil_wrb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET), siopcb->uc1);
224
225 /* シリアルモジュールを無効にする */
226 sil_wrb_mem((VP)(siopinib->cntrl_addr+TADR_SFR_UMR_OFFSET), MR_DISABLE_DEF);
227}
228
229/*
230 * シリアルI/Oポートへの文字送信
231 */
232BOOL
233sfruart_snd_chr(SIOPCB *siopcb, char c)
234{
235 if(sil_reb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET)) & TBIT_UiC1_TI){
236 sil_wrb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_UTB_OFFSET), c);
237 return(TRUE);
238 }
239 return(FALSE);
240}
241
242/*
243 * シリアルI/Oポートからの文字受信
244 */
245INT
246sfruart_rcv_chr(SIOPCB *siopcb)
247{
248 if(sil_reb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET)) & TBIT_UiC1_RI){
249 return((INT)sil_reb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_URB_OFFSET)));
250 }
251 return(-1);
252}
253
254/*
255 * シリアルI/Oポートからのコールバックの許可
256 */
257void
258sfruart_ena_cbr(SIOPCB *siopcb, UINT cbrtn)
259{
260 switch (cbrtn) {
261 case SIO_ERDY_SND:
262 siopcb->uc1 |= TBIT_UiC1_TE;
263 sil_wrb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET), siopcb->uc1);
264 break;
265 case SIO_ERDY_RCV:
266 siopcb->uc1 |= TBIT_UiC1_RE;
267 sil_wrb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET), siopcb->uc1);
268 break;
269 default:
270 break;
271 }
272}
273
274/*
275 * シリアルI/Oポートからのコールバックの禁止
276 */
277void
278sfruart_dis_cbr(SIOPCB *siopcb, UINT cbrtn)
279{
280 switch (cbrtn) {
281 case SIO_ERDY_SND:
282 siopcb->uc1 &= ~TBIT_UiC1_TE;
283 sil_wrb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET), siopcb->uc1);
284 break;
285 case SIO_ERDY_RCV:
286 siopcb->uc1 &= ~TBIT_UiC1_RE;
287 sil_wrb_mem((VP)(siopcb->siopinib->cntrl_addr+TADR_SFR_UC1_OFFSET), siopcb->uc1);
288 break;
289 default:
290 break;
291 }
292}
293
294/*
295 * uart0からの受信割込み
296 */
297void serial_in_handler1(void)
298{
299 SIOPCB *siopcb = &siopcb_table[0];
300 if((siopcb->uc1 & TBIT_UiC1_RE) != 0) {
301 /*
302 * 受信通知コールバックルーチンを呼び出す.
303 */
304 sfruart_ierdy_rcv(siopcb->exinf);
305 }
306}
307
308/*
309 * uart0からの送信割込み
310 */
311void serial_out_handler1(void)
312{
313 SIOPCB *siopcb = &siopcb_table[0];
314
315 if((siopcb->uc1 & TBIT_UiC1_TE) != 0) {
316 /*
317 * 送信可能コールバックルーチンを呼び出す.
318 */
319 sfruart_ierdy_snd(siopcb->exinf);
320 }
321}
322
323#if TNUM_SIOP > 1
324/*
325 * uart1からの受信割込み
326 */
327void serial_in_handler2(void)
328{
329 SIOPCB *siopcb = &siopcb_table[1];
330 if((siopcb->uc1 & TBIT_UiC1_RE) != 0){
331 /*
332 * 受信通知コールバックルーチンを呼び出す.
333 */
334 sfruart_ierdy_rcv(siopcb->exinf);
335 }
336}
337
338/*
339 * uart1からの送信割込み
340 */
341void serial_out_handler2(void)
342{
343 SIOPCB *siopcb = &siopcb_table[1];
344 if((siopcb->uc1 & TBIT_UiC1_TE) != 0) {
345 /*
346 * 送信可能コールバックルーチンを呼び出す.
347 */
348 sfruart_ierdy_snd(siopcb->exinf);
349 }
350}
351#endif
Note: See TracBrowser for help on using the repository browser.