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

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

initial

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