source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/h8-renesas/hw_serial.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) 2000-2004 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2001-2007 by Industrial Technology Institute,
9 * Miyagi Prefectural Government, JAPAN
10 * Copyright (C) 2001-2004 by Dep. of Computer Science and Engineering
11 * Tomakomai National College of Technology, 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: hw_serial.c,v 1.7 2007/03/23 07:58:33 honda Exp $
55 */
56
57/*
58 * ターゲット依存シリアルI/Oモジュール(H8用)
59 * ・ポートが 1本の場合は HWPORT1_ADDRに指定されたポートを使用し、
60 * 2本の場合は、HWPORT1_ADDRをユーザ用、HWPORT2_ADDRをコンソール
61 * 出力として使用する。
62 * HWPORTx_ADDRは ターゲット依存の sys_config.h中で指定する。
63 * ・å…
64±é€šéƒ¨ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã«ã‚ˆã£ã¦ã€XON/XOFFフロー制御が行わ
65 * れているので、信号線はTxDとRxDの2本でよい
66 */
67
68#include "jsp_kernel.h"
69#include <hw_serial.h>
70
71/*
72 * シリアルポートの初期化ブロック
73 */
74static const SIOPINIB siopinib_table[TNUM_PORT] = {
75 {
76 (UB*)SCI_PORT1_BASE,
77 SCI_PORT1_BAUD_RATE,
78 {
79 (UB*)SCI_PORT1_IPR,
80 SCI_PORT1_IPR_BIT,
81 SCI_PORT1_IPM
82 },
83 SCI_PORT1_SMR
84 }
85
86#if TNUM_PORT == 2u
87 ,{
88 (UB*)SCI_PORT2_BASE,
89 SCI_PORT2_BAUD_RATE,
90 {
91 (UB*)SCI_PORT2_IPR,
92 SCI_PORT2_IPR_BIT,
93 SCI_PORT2_IPM
94 },
95 SCI_PORT2_SMR
96 }
97#endif /* of #if TNUM_PORT == 2u */
98
99};
100
101
102/*
103 * シリアルポートの制御ブロック
104 */
105SIOPCB siopcb_table[TNUM_PORT];
106
107/*
108 * SIO ID から管理ブロックへの変換
109 */
110Inline SIOPINIB*
111get_siopinib(ID sioid)
112{
113 UINT index = INDEX_SIO(sioid);
114
115 assert(index < TNUM_PORT);
116
117 return(&(siopinib_table[index]));
118}
119
120/*
121 * ボーレートからBRRレジスタの設定値への変換
122 *  演算の途中でオーバーフローしないようUW型を用いている
123 */
124Inline UB
125baud_to_brr(UW baud)
126{
127 UB brr;
128
129 if (baud > 38400ul) {
130 brr = (UB)(((CPU_CLOCK+(16ul*baud)) / (32ul*baud))-1ul);
131 } else {
132 brr = (UB)((CPU_CLOCK / (32ul*baud))-1ul);
133 }
134 return brr;
135}
136
137/*
138 * ボーレート設定後の待
139ち時間[nsec]を求めるマクロ
140 *  演算の途中でオーバーフローしないようUW型にキャストしている
141 */
142#define SCI_SETUP_TIME(b) (((1000000ul / (b)) + 1ul) * 1000ul)
143
144/*
145 * SCI の初期化
146 */
147void
148SCI_initialize (ID sioid)
149{
150 const SIOPINIB *inib = get_siopinib(sioid);
151
152 assert(inib != (SIOPINIB*)NULL);
153 SCI_cls_por(inib->base);
154
155 sil_wrb_mem((VP)(inib->base + H8SMR), (VB)(inib->smr_init));
156
157 /* ボーレート設定 */
158 sil_wrb_mem((VP)(inib->base + H8BRR), (VB)baud_to_brr(inib->baudrate));
159
160 /* 割込み禁止とクロックソースの選択 */
161 h8_anb_reg(inib->base + H8SCR,
162 (UB)~(H8SCR_TIE | H8SCR_RIE | H8SCR_MPIE | H8SCR_TEIE |
163 H8SCR_CKE1 | H8SCR_CKE0 ));
164
165 /* ボーレートの設定後、1ビット分待
166たなければならない。*/
167 sil_dly_nse_long(SCI_SETUP_TIME(inib->baudrate));
168
169 /* エラーフラグをクリア */
170 h8_anb_reg(inib->base + H8SSR, (UB)~(H8SSR_ORER | H8SSR_FER | H8SSR_PER));
171
172 /*
173 * プライオリティレベルの設定
174 * 本当は割込みコントローラ依存部分を分離すべき
175 */
176 define_int_plevel(&(inib->irc));
177
178 /* 受信割り込みと送信割込みの許可はシリアル I/O で行う */
179 /* 送受信許可 */
180
181 h8_orb_reg(inib->base + H8SCR, (UB)(H8SCR_TE | H8SCR_RE));
182}
183
184/*
185 * SCI のクローズ
186 */
187void
188SCI_cls_por (UB *base)
189{
190 UB ssr;
191
192 /* TDRE が 1 になるまで待
193つ */
194 do {
195 ssr = sil_reb_mem((VP)(base + H8SSR));
196 ssr &= H8SSR_TDRE;
197 } while(ssr == 0u);
198
199 /* 11ビット送信分待
200つ。*/
201 /*
202 * 要検討:約1.2msec空回りするので、他の処理にCPUを
203 *     譲った方が得策だが、非タスクコンテキストで
204 *     呼ばれる可能性があるので、そのままにしている。
205 */
206 sil_dly_nse_long(SCI_SETUP_TIME(H8_MIN_BAUD_RATE)*11ul);
207
208 /* 送受信停止 */
209 h8_anb_reg(base + H8SCR,
210 (UB)(~(H8SCR_TIE | H8SCR_RIE | H8SCR_TE | H8SCR_RE)));
211}
212
213/*
214 * SCI_in_handler -- SCI å…
215¥åŠ›å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©
216 */
217void
218SCI_in_handler(ID sioid)
219{
220 SIOPCB *pcb = get_siopcb(sioid);
221 UB status = sil_reb_mem((VP)(pcb->inib->base + H8SSR));
222 UB flag = (UB)(status & (H8SSR_ORER | H8SSR_FER | H8SSR_PER));
223
224 if (flag != 0) {
225
226 /* エラー処理 */
227
228 /* エラーフラグをクリア */
229 sil_wrb_mem((VP)(pcb->inib->base + H8SSR),
230 (VB)(status & ~(H8SSR_ORER | H8SSR_FER | H8SSR_PER)));
231 }
232
233 flag = (UB)(status & H8SSR_RDRF);
234 if (flag != 0) {
235 if (pcb->openflag == TRUE) {
236 /* 受信可能コールバックルーチンを呼出す。*/
237 SCI_ierdy_rcv(pcb->exinf);
238 } else {
239 sil_wrb_mem((VP)(pcb->inib->base + H8SSR), (VB)(status & ~H8SSR_RDRF));
240 }
241 }
242}
243
244/*
245 * SCI_out_handler -- SCI 出力割込みハンドラ
246 */
247void
248SCI_out_handler(ID sioid)
249{
250 SIOPCB *pcb;
251
252 pcb = get_siopcb(sioid);
253 if (pcb->openflag == TRUE) {
254 /* 送信可能コールバックルーチンを呼出す。*/
255 SCI_ierdy_snd(pcb->exinf);
256 }
257}
258
259#ifdef H8_CFG_SCI_ERR_HANDLER
260
261/*
262 * SCI_err_handler -- SCI エラーå…
263¥åŠ›å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©
264 */
265void
266SCI_err_handler(ID sioid)
267{
268 SIOPCB *pcb;
269 UB status;
270
271 pcb = get_siopcb(sioid);
272 status = sil_reb_mem((VP)(pcb->inib->base + H8SSR));
273 if (status & (H8SSR_ORER | H8SSR_FER | H8SSR_PER)) {
274
275 /* エラー処理 */
276
277 /* エラーフラグをクリア */
278 sil_wrb_mem((VP)(pcb->inib->base + H8SSR),
279 status & ~(H8SSR_ORER | H8SSR_FER | H8SSR_PER));
280 }
281}
282
283#endif /* of #ifdef H8_CFG_SCI_ERR_HANDLER */
284
285/*
286 * sio_initialize -- シリアルポートドライバの初期化
287 */
288void
289sio_initialize(void)
290{
291 INT ix;
292
293 /* SIO 管理ブロックの初期化 */
294 for (ix = 0; ix < TNUM_PORT; ix++) {
295 siopcb_table[ix].inib = &siopinib_table[ix];
296 siopcb_table[ix].openflag = FALSE;
297 }
298}
299
300/*
301 * sio_ena_cbr -- シリアル I/O からのコールバックの許可
302 */
303void
304sio_ena_cbr(SIOPCB *pcb, UINT cbrtn)
305{
306 switch (cbrtn) {
307 case SIO_ERDY_SND:
308 SCI_enable_send(pcb);
309 break;
310 case SIO_ERDY_RCV:
311 SCI_enable_recv(pcb);
312 break;
313 default:
314 assert(FALSE);
315 }
316}
317
318/*
319 * sio_dis_cbr -- シリアル I/O からのコールバックの禁止
320 */
321void
322sio_dis_cbr(SIOPCB *pcb, UINT cbrtn)
323{
324 switch (cbrtn) {
325 case SIO_ERDY_SND:
326 SCI_disable_send(pcb);
327 break;
328 case SIO_ERDY_RCV:
329 SCI_disable_recv(pcb);
330 break;
331 default:
332 assert(FALSE);
333 }
334}
335
336/*
337 * SCI 割り込み
338 */
339void
340sio_in_handler (void)
341{
342 SCI_in_handler(SCI_PORTID1);
343}
344
345void
346sio_out_handler (void)
347{
348 SCI_out_handler(SCI_PORTID1);
349}
350
351#ifdef H8_CFG_SCI_ERR_HANDLER
352
353void
354sio_err_handler (void)
355{
356 SCI_err_handler(SCI_PORTID1);
357}
358
359#endif /* of #ifdef H8_CFG_SCI_ERR_HANDLER */
360
361#if TNUM_PORT >= 2u
362
363void
364sio_in2_handler (void)
365{
366 SCI_in_handler(SCI_PORTID2);
367}
368
369void
370sio_out2_handler (void)
371{
372 SCI_out_handler(SCI_PORTID2);
373}
374
375#ifdef H8_CFG_SCI_ERR_HANDLER
376
377void
378sio_err2_handler (void)
379{
380 SCI_err_handler(SCI_PORTID2);
381}
382
383#endif /* of #ifdef H8_CFG_SCI_ERR_HANDLER */
384
385#endif /* of #if TNUM_PORT >= 2u */
Note: See TracBrowser for help on using the repository browser.