source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/v850/cq_d70f3716gc/hw_serial.h@ 26

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

initial

File size: 8.9 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 *
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 * ターゲット依存シリアルI/Oモジュール(D70F3716GC 内
55蔵非同期シリアルch0用)
56 * データフォーマットは8bit data, non-parity, 1stop-bit固定
57 */
58
59#ifndef _HW_SERIAL_H_
60#define _HW_SERIAL_H_
61
62#include <s_services.h>
63
64/*
65 * シリアルポートの初期化ブロック
66 */
67
68typedef struct sio_port_initialization_block {
69} SIOPINIB;
70
71/*
72 * シリアルポートの制御ブロック
73 */
74typedef struct sio_port_control_block {
75 const SIOPINIB *inib; /* 初期化ブロック */
76 VP_INT exinf; /* 拡張情
77å ± */
78 BOOL openflag; /* オープン済みフラグ */
79 int port_id; /* ポート番号(0〜) */
80} SIOPCB;
81
82extern SIOPCB siopcb_table[TNUM_PORT];
83
84/*
85 * SIO ID から管理ブロックへの変換マクロ
86 */
87
88#define INDEX_SIO(sioid) ((UINT)((sioid) - 1))
89#define get_siopcb(sioid) (&(siopcb_table[INDEX_SIO(sioid)]))
90
91/*
92 * コールバックルーチンの識別番号
93 */
94
95#define SIO_ERDY_SND 1u /* 送信可能コールバック */
96#define SIO_ERDY_RCV 2u /* 受信通知コールバック */
97
98
99/*
100 * シリアルポートのハードウェア依存情
101報の定義
102 */
103
104#define SERIAL_PORT (CONSOLE_PORTID-1) /* システムのポート番号 */
105#define SERIAL_INT_PRIORITY 3 /* 割り込み優å…
106ˆåº¦ */
107#define SERIAL_CLKDIV 0x01 /* clk = fxx/2 */
108#define SERIAL_COMPAREVALUE 0x82 /* 38400bps */
109//#define SERIAL_CLKDIV 0x00 /* clk = fxx/1 */
110//#define SERIAL_COMPAREVALUE 0x57 /* 115200bps */
111
112
113#define FLG_RECEIVED 1
114
115extern volatile unsigned int _serial_flag;
116
117
118/*
119 * シリアルI/Oの割込みハンドラのベクタ番号
120 */
121#define INHNO_SERIAL_IN (0x31)
122#define INHNO_SERIAL_OUT (0x32)
123
124/*
125 * 低レベルポート情
126報管理ブロックの初期値
127 */
128
129#define NUM_PORT 1 /* サポートするシリアルポートの数 */
130
131/*
132 * シリアルI/Oポートの初期化
133 */
134Inline BOOL
135hw_port_initialize(int port_id)
136{
137#ifndef DEBUGGER
138 while( (sil_reb_mem((VP)UA0STR) & 0x80) ) ;
139
140 /* 非同期シリアル通信路の初期化 */
141
142 /* ポートを開ける */
143 if (port_id == 0) {
144 sil_wrh_mem((VP)PMC3, sil_reh_mem((VP)PMC3) | 0x0003);
145 sil_wrh_mem((VP)PFC3, sil_reh_mem((VP)PFC3) & ~0x0003);
146 sil_wrb_mem((VP)PFCE3L, 0x0000);
147 } else {
148
149 }
150
151 /* ボーレート発生器の初期化 */
152 sil_wrb_mem((VP)UA0CTL1, SERIAL_CLKDIV);
153 sil_wrb_mem((VP)UA0CTL2, SERIAL_COMPAREVALUE);
154
155 sil_wrb_mem((VP)UA0CTL0, 0x80); /* enable ASIO */
156
157 __asm("nop; nop");
158
159 /* パリティなし・8ビット・ストップ1ビット・LSBファースト */
160 sil_wrb_mem((VP)UA0CTL0, sil_reb_mem((VP)UA0CTL0) | 0x12);
161
162 __asm("nop; nop");
163
164 sil_wrb_mem((VP)UA0CTL0, sil_reb_mem((VP)UA0CTL0) | 0x60); /* Tx, Rx enable */
165
166 /* 割込み制御 */
167 sil_wrb_mem((VP)UA0RIC, SERIAL_INT_PRIORITY);
168 sil_wrb_mem((VP)UA0TIC, SERIAL_INT_PRIORITY);
169#endif
170 return(FALSE);
171}
172
173/*
174 * シリアルI/Oポートの終了
175 */
176Inline void
177hw_port_terminate(int port_id)
178{
179 sil_wrb_mem((VP)UA0RIC, sil_reb_mem((VP)UA0RIC) | 0x40);
180 sil_wrb_mem((VP)UA0TIC, sil_reb_mem((VP)UA0TIC) | 0x40);
181
182 sil_wrb_mem((VP)UA0CTL0, 0x10); /* Tx, Rx disable */
183}
184
185/*
186 * シリアルポート割込みサービスルーチン(前方参ç…
187§ï¼‰
188 */
189extern void serial_handler_in(int portid);
190extern void serial_handler_out(int portid);
191
192/*
193 * 文字を受信したか?
194 */
195Inline BOOL
196hw_port_getready(int port_id)
197{
198 return ((_serial_flag & FLG_RECEIVED) != 0);
199}
200
201
202/*
203 * 文字を送信できるか?
204 */
205Inline BOOL
206hw_port_putready(int port_id)
207{
208 return ((sil_reb_mem((VP)UA0STR) & 0x80) == 0);
209}
210
211
212/*
213 * 受信した文字の取り出し
214 */
215Inline unsigned char
216hw_port_getchar(int port_id)
217{
218 _serial_flag &= ~FLG_RECEIVED;
219 return sil_reb_mem((VP)UA0RX);
220}
221
222/*
223 * 送信する文字の書き込み
224 */
225Inline void
226hw_port_putchar(int port_id, unsigned char c)
227{
228 sil_wrb_mem((VP)UA0TX, c);
229}
230
231/*
232 * 送信する文字の書き込み(送信可能になるまで待
233つ)
234 */
235Inline void
236hw_port_wait_putchar(int port_id, unsigned char c)
237{
238 while( !hw_port_putready(port_id) ) ;
239 hw_port_putchar(port_id, c);
240}
241
242/*
243 * 送信制御関数
244 */
245Inline void
246hw_port_sendstart(int port_id)
247{
248}
249
250Inline void
251hw_port_sendstop(int port_id)
252{
253}
254
255extern void sio_ierdy_rcv(VP_INT exinf);
256extern void sio_ierdy_snd(VP_INT exinf);
257
258Inline void
259hw_port_handler_in(int port_id)
260{
261 UB tmp;
262
263 if((sil_reb_mem((VP)UA0STR) & 0x07) == 0) {
264 _serial_flag |= FLG_RECEIVED;
265 sio_ierdy_rcv(siopcb_table[port_id].exinf);
266 } else {
267 /* エラーがあればデータを破棄 */
268 tmp = sil_reb_mem((VP)UA0RX);
269 }
270}
271
272Inline void
273hw_port_handler_out(int port_id)
274{
275 if(hw_port_putready(port_id)) {
276 sio_ierdy_snd(siopcb_table[port_id].exinf);
277 }
278}
279
280/***********************************************************************************/
281
282/*
283 * sio_initialize -- シリアルポートドライバの初期化
284 */
285Inline void
286sio_initialize (void)
287{
288 int ix;
289
290 /* SIO 管理ブロックの初期化 */
291 for (ix = TNUM_PORT; ix -- > 0; ) {
292 siopcb_table[ix].openflag = FALSE;
293 }
294}
295
296/*
297 * sio_opn_por -- ポートのオープン
298 */
299Inline SIOPCB *
300sio_opn_por(ID sioid, VP_INT exinf)
301{
302 SIOPCB *pcb;
303
304 pcb = get_siopcb(sioid);
305 pcb->inib = NULL;
306 pcb->exinf = exinf;
307 pcb->openflag = TRUE;
308 pcb->port_id = sioid-1;
309 hw_port_initialize(pcb->port_id);
310 return pcb;
311}
312
313/*
314 * sio_snd_chr -- 文字送信
315 */
316Inline BOOL
317sio_snd_chr(SIOPCB *pcb, INT chr)
318{
319#if 0
320 if (hw_port_putready(pcb->port_id)) {
321 hw_port_putchar(pcb->port_id, (UB)chr);
322 return TRUE;
323 } else {
324 return FALSE;
325 }
326#else
327 /* 本来は、↑のようにするべきだが、 */
328 /* syslog出力が止まってしまうため、 */
329 /* 暫定処置 */
330 while(!hw_port_putready(pcb->port_id)) ;
331 hw_port_putchar(pcb->port_id, (UB)chr);
332 return TRUE;
333#endif
334}
335
336/*
337 * sio_rcv_chr -- 文字受信
338 */
339Inline INT
340sio_rcv_chr(SIOPCB *pcb)
341{
342 if (hw_port_getready(pcb->port_id))
343 return hw_port_getchar(pcb->port_id);
344 else
345 return -1;
346}
347
348/*
349 * sio_ena_cbr -- シリアル I/O からのコールバックの許可
350 */
351Inline void
352sio_ena_cbr(SIOPCB *pcb, UINT cbrtn)
353{
354}
355
356/*
357 * sio_dis_cbr -- シリアル I/O からのコールバックの禁止
358 */
359Inline void
360sio_dis_cbr(SIOPCB *pcb, UINT cbrtn)
361{
362}
363
364/*
365 * sio_cls_por -- ポートのクローズ
366 */
367Inline void
368sio_cls_por(SIOPCB *pcb)
369{
370 sio_dis_cbr(pcb, SIO_ERDY_SND);
371 sio_dis_cbr(pcb, SIO_ERDY_RCV);
372 pcb->openflag = FALSE;
373}
374
375Inline void
376sio_in_handler(void)
377{
378 hw_port_handler_in(0);
379}
380
381Inline void
382sio_out_handler(void)
383{
384 hw_port_handler_out(0);
385}
386
387
388#endif /* _HW_SERIAL_H_ */
Note: See TracBrowser for help on using the repository browser.