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

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

initial

File size: 10.5 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-2010 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.12 2007/03/23 07:22:15 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#include <h8_sil.h>
71
72/*
73 * ボーレートを1ビット分の時間[nsec]に変換するマクロ
74 *  演算の途中でオーバーフローしないようlong型定数を用いている
75 */
76#define BAUD_TO_NSEC(b) (UINT)(((1000000ul / (b)) + 1ul) * 1000ul)
77
78/*
79 * ボーレートをBRRの値に変換するマクロ
80 */
81#define H8BRR_RATE(b) (((b)>38400)?((UB)(((CPU_CLOCK+(16*(b)))/(32*(b)))-1))\
82 :((UB)((CPU_CLOCK/(32*(b)))-1)))
83
84/*
85 * シリアルポートの初期化ブロック
86 */
87
88static const SIOPINIB siopinib_table[TNUM_PORT] = {
89 {
90 SYSTEM_SCI,
91 SYSTEM_BAUD_RATE,
92 {
93 (UB*)SYSTEM_SCI_IPR,
94 SYSTEM_SCI_IP_BIT,
95 SYSTEM_SCI_IPM
96 },
97 SYSTEM_SCI_SMR
98 }
99
100#if TNUM_PORT >= 2
101 ,{
102 USER_SCI,
103 USER_BAUD_RATE,
104 {
105 (UB*)USER_SCI_IPR,
106 USER_SCI_IP_BIT,
107 USER_SCI_IPM
108 },
109 USER_SCI_SMR
110 }
111#endif /* of #if TNUM_PORT >= 2 */
112
113#if TNUM_PORT >= 3
114 ,{
115 USER2_SCI,
116 USER2_BAUD_RATE,
117 {
118 (UB*)USER2_SCI_IPR,
119 USER2_SCI_IP_BIT,
120 USER2_SCI_IPM
121 },
122 USER2_SCI_SMR
123 }
124#endif /* of #if TNUM_PORT >= 3 */
125
126};
127
128
129/*
130 * シリアルポートの制御ブロック
131 */
132
133SIOPCB siopcb_table[TNUM_PORT];
134
135/*
136 * SIO ID から管理ブロックへの変換マクロ
137 */
138
139#define get_siopinib(sioid) (&(siopinib_table[INDEX_SIO(sioid)]))
140
141/*
142 * SCI の初期化
143 */
144
145void
146SCI_initialize (ID sioid)
147{
148 const SIOPINIB *inib;
149
150 inib = get_siopinib(sioid);
151 SCI_cls_por(inib->base);
152 /*
153 * モード設定
154 *  ・調歩同期式
155 *  ・キャラクタ長
156 *  ・パリティ
157 *  ・ストップビット長
158 *  ・クロック選択
159 */
160 sil_wrb_mem((VP)(inib->base + H8SMR), inib->smr_init);
161
162 /* ボーレート設定 */
163 sil_wrb_mem((VP)(inib->base + H8BRR), H8BRR_RATE(inib->baudrate));
164
165 /* 割込み禁止とクロックソースの選択 */
166 h8_anb_reg((UB *)(inib->base + H8SCR),
167 (UB)~(H8SCR_TIE | H8SCR_RIE | H8SCR_MPIE |
168 H8SCR_TEIE | H8SCR_CKE1 | H8SCR_CKE0 ));
169
170 /* ボーレートの設定後、1ビット分待
171たなければならない。*/
172 sil_dly_nse(BAUD_TO_NSEC(inib->baudrate));
173
174 /* エラーフラグをクリア */
175 h8_anb_reg((UB *)(inib->base + H8SSR),
176 ~(H8SSR_ORER | H8SSR_FER | H8SSR_PER));
177
178 /*
179 * プライオリティレベルの設定
180 * 本当は割込みコントローラ依存部分を分離すべき
181 */
182 define_int_plevel(&(inib->irc));
183
184 /* 受信割り込みと送信割込みの許可はシリアル I/O で行う */
185 /* 送受信許可 */
186 h8_orb_reg((VP)(inib->base + H8SCR), (H8SCR_TE | H8SCR_RE));
187}
188
189/*
190 * SCI のクローズ
191 */
192
193void
194SCI_cls_por (UW base)
195{
196#ifndef HEW_SIMULATOR
197 /* TDRE が 1 になるまで待
198つ */
199 while ((sil_reb_mem((VP)(base + H8SSR)) & H8SSR_TDRE) == 0)
200 ;
201
202 /* 11ビット送信分待
203つ。*/
204 sil_dly_nse(11*BAUD_TO_NSEC(H8_MIN_BAUD_RATE));
205#endif /* HEW_SIMULATOR */
206 /* 送受信停止 */
207 h8_anb_reg((UB *)(base + H8SCR),
208 (UB)~(H8SCR_TIE | H8SCR_RIE | H8SCR_TE | H8SCR_RE));
209}
210
211/*
212 * SCI_in_handler -- SCI å…
213¥åŠ›å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©
214 */
215
216void
217SCI_in_handler(ID sioid)
218{
219 SIOPCB *pcb;
220 VP p_ssr;
221 UB status;
222
223 pcb = get_siopcb(sioid);
224 p_ssr = (VP)(pcb->inib->base + H8SSR);
225 status = sil_reb_mem(p_ssr);
226
227#if 0 /* コメントアウト */
228 /*
229 * SIOエラー割込みサービスルーチンだけでなく
230 * ここでもエラーチェックを行っている理由は
231 * 以下のシーケンスを想定しているため。
232 * (レアケースのため、コメントアウトしている。)
233 *
234 * 1.シリアル受信割込み(正常)が発生し、割込みハンドラが起動される。
235 * 2.割込み処理中に多重割込みがå…
236¥ã‚Šã€ã‚·ãƒªã‚¢ãƒ«å—信処理が保留される。
237 *    例:タイマ割込み
238 * 3.さらにデータを受信し、例えば、オーバランエラーが発生
239 * 4.2の割込み処理が終了し、1の割込み処理に戻る。
240 *   この際、シリアルのエラーフラグが立った状æ…
241‹ã§ã€
242 *   正常ケースの受信割込みの割込みハンドラが実行される。
243 */
244 if (status & (H8SSR_ORER | H8SSR_FER | H8SSR_PER)) {
245
246 /* エラー処理 */
247
248 /* エラーフラグをクリア */
249 sil_wrb_mem(p_ssr,
250 status & ~(H8SSR_ORER | H8SSR_FER | H8SSR_PER));
251 }
252#endif
253
254 if (status & H8SSR_RDRF) {
255 if (pcb->openflag) {
256 /* 受信可能コールバックルーチンを呼出す。*/
257 SCI_ierdy_rcv(pcb->exinf);
258 } else {
259 sil_wrb_mem(p_ssr, status & ~H8SSR_RDRF);
260 }
261 }
262}
263
264/*
265 * SCI_out_handler -- SCI 出力割込みハンドラ
266 */
267
268void
269SCI_out_handler(ID sioid)
270{
271 SIOPCB *pcb;
272
273 pcb = get_siopcb(sioid);
274 if (pcb->openflag) {
275 /* 送信可能コールバックルーチンを呼出す。*/
276 SCI_ierdy_snd(pcb->exinf);
277 }
278}
279
280#ifdef H8_CFG_SCI_ERR_HANDLER
281
282/*
283 * SCI_err_handler -- SCI エラーå…
284¥åŠ›å‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©
285 */
286
287void
288SCI_err_handler(ID sioid)
289{
290 SIOPCB *pcb;
291 VP p_ssr;
292 UB status;
293
294 pcb = get_siopcb(sioid);
295 p_ssr = (VP)(pcb->inib->base + H8SSR);
296 status = sil_reb_mem(p_ssr);
297 if (status & (H8SSR_ORER | H8SSR_FER | H8SSR_PER)) {
298
299 /* エラー処理 */
300
301 /* エラーフラグをクリア */
302 sil_wrb_mem(p_ssr,
303 status & ~(H8SSR_ORER | H8SSR_FER | H8SSR_PER));
304 }
305}
306
307#endif /* of #ifdef H8_CFG_SCI_ERR_HANDLER */
308
309/*
310 * sio_initialize -- シリアルポートドライバの初期化
311 */
312
313void
314sio_initialize (void)
315{
316 int ix;
317
318 /* SIO 管理ブロックの初期化 */
319 for (ix = TNUM_PORT; ix -- > 0; ) {
320 siopcb_table[ix].inib = &siopinib_table[ix];
321 siopcb_table[ix].openflag = FALSE;
322 }
323}
324
325/*
326 * sio_ena_cbr -- シリアル I/O からのコールバックの許可
327 */
328
329void
330sio_ena_cbr(SIOPCB *pcb, UINT cbrtn)
331{
332 switch (cbrtn) {
333 case SIO_ERDY_SND:
334 SCI_enable_send(pcb);
335 break;
336 case SIO_ERDY_RCV:
337 SCI_enable_recv(pcb);
338 break;
339 }
340}
341
342/*
343 * sio_dis_cbr -- シリアル I/O からのコールバックの禁止
344 */
345
346void
347sio_dis_cbr(SIOPCB *pcb, UINT cbrtn)
348{
349 switch (cbrtn) {
350 case SIO_ERDY_SND:
351 SCI_disable_send(pcb);
352 break;
353 case SIO_ERDY_RCV:
354 SCI_disable_recv(pcb);
355 break;
356 }
357}
358
359/*
360 * SCI 割り込み
361 */
362
363void
364sio_in_handler (void)
365{
366 SCI_in_handler(1);
367}
368
369void
370sio_out_handler (void)
371{
372 SCI_out_handler(1);
373}
374
375#ifdef H8_CFG_SCI_ERR_HANDLER
376
377void
378sio_err_handler (void)
379{
380 SCI_err_handler(1);
381}
382
383#endif /* of #ifdef H8_CFG_SCI_ERR_HANDLER */
384
385#if TNUM_PORT >= 2
386
387void
388sio_in2_handler (void)
389{
390 SCI_in_handler(2);
391}
392
393void
394sio_out2_handler (void)
395{
396 SCI_out_handler(2);
397}
398
399#ifdef H8_CFG_SCI_ERR_HANDLER
400
401void
402sio_err2_handler (void)
403{
404 SCI_err_handler(2);
405}
406
407#endif /* of #ifdef H8_CFG_SCI_ERR_HANDLER */
408#endif /* of #if TNUM_PORT >= 2 */
409
410#if TNUM_PORT >= 3
411
412void
413sio_in3_handler (void)
414{
415 SCI_in_handler(3);
416}
417
418void
419sio_out3_handler (void)
420{
421 SCI_out_handler(3);
422}
423
424#ifdef H8_CFG_SCI_ERR_HANDLER
425
426void
427sio_err3_handler (void)
428{
429 SCI_err_handler(3);
430}
431
432#endif /* of #ifdef H8_CFG_SCI_ERR_HANDLER */
433
434#endif /* of #if TNUM_PORT >= 3 */
435
Note: See TracBrowser for help on using the repository browser.