source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/sh2/sh7615scif.c@ 26

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

initial

File size: 13.2 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) 2000-2003 by Industrial Technology Institute,
9 * Miyagi Prefectural Government, JAPAN
10 * Copyright (C) 2002-2004 by Hokkaido Industrial Research Institute, JAPAN
11 *
12 * 上記著作権者
13は,以下の (1)〜(4) の条件か,Free Software Foundation
14 * によってå…
15¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
16 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
17 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
18å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
19 * 利用と呼ぶ)することを無償で許諾する.
20 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
21 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
22 * スコード中に含まれていること.
23 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
24 * 用できる形で再é…
25å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
26å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
27 * 者
28マニュアルなど)に,上記の著作権表示,この利用条件および下記
29 * の無保証規定を掲載すること.
30 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
31 * 用できない形で再é…
32å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
33 * と.
34 * (a) 再é…
35å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
36マニュアルなど)に,上記の著
37 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
38 * (b) 再é…
39å¸ƒã®å½¢æ…
40‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
41 * 報告すること.
42 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
43 * 害からも,上記著作権者
44およびTOPPERSプロジェクトをå…
45è²¬ã™ã‚‹ã“と.
46 *
47 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
48お
49 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
50 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
51 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
52 *
53 * @(#) $Id: sh7615scif.c,v 1.3 2005/07/06 00:45:07 honda Exp $
54 */
55
56/*
57 * SH2内
58蔵シリアルコミュニケーションインタフェースSCIF用 簡易ドライバ
59 */
60
61#include <s_services.h>
62#include "sh7615scif.h"
63
64/*
65 * シリアルI/Oポート管理ブロックの定義
66 */
67/* å…
68¥å‡ºåŠ›ãƒãƒ¼ãƒˆã®è¨­å®šã¯sys_config.c */
69/* 割込みベクタ番号の設定はhw_serial.h */
70/* 管理ブロックの設定はsh7615scif.c */
71
72#ifndef GDB_STUB
73
74const SIOPINIB siopinib_table[TNUM_PORT] = {
75 {0xfffffcc0, BRR9600, 0x0, 6}, /* SCIF1 */
76#if TNUM_PORT >= 2
77 {0xfffffce0, BRR9600, 0x0, 6}, /* SCIF2 */
78#endif /* TNUM_PORT >= 2 */
79};
80
81#else /* GDB_STUB */
82
83const SIOPINIB siopinib_table[TNUM_PORT] = {
84 {0xfffffce0, BRR9600, 0x0, 6}, /* SCIF2 */
85};
86
87#endif /* GDB_STUB */
88
89#if defined(TTM)
90/*
91 * シリアルI/Oポート管理ブロックの定義
92 *  2chサポートに拡張する場合は初期値用のデータも含める
93 */
94struct sio_port_control_block
95{
96 VP_INT exinf; /* 拡張情
97å ± */
98 BOOL openflag; /* オープン済みフラグ */
99};
100#endif
101/*
102 * シリアルI/Oポート管理ブロックのエリア
103 */
104static SIOPCB siopcb_table[TNUM_PORT];
105
106/*
107 * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
108 */
109#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1))
110#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))
111
112/*
113 * 文字を受信できるか?
114 */
115Inline BOOL
116sh2scif_getready (SIOPCB * siopcb)
117{
118 /* レシーブデータレジスタフル・フラグのチェック */
119 return (sil_reh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SC1SSR)) &
120 SC1SSR_RDRF);
121}
122
123/*
124 * 文字を送信できるか?
125 */
126Inline BOOL
127sh2scif_putready (SIOPCB * siopcb)
128{
129 /* トランスミットFIFOデータレジスタエンプティ・フラグのチェック */
130 return (sil_reh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SC1SSR)) &
131 SC1SSR_TDFE);
132}
133
134/*
135 * 受信した文字の取出し
136 */
137Inline char
138sh2scif_getchar (SIOPCB * siopcb)
139{
140 VB data;
141
142 data = sil_reb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCFRDR));
143 /* レシーブデータレジスタフル・フラグのクリア */
144 sil_wrh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SC1SSR),
145 sil_reh_mem ((VH *) (siopcb->siopinib->reg_base +
146 SCIF_SC1SSR)) & ~SC1SSR_RDRF);
147 return data;
148}
149
150/*
151 * 送信する文字の書込み
152 */
153Inline void
154sh2scif_putchar (SIOPCB * siopcb, char c)
155{
156 /* トランスミットFIFOデータレジスタエンプティ・フラグのクリア */
157 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCFTDR), c);
158 sil_wrh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SC1SSR),
159 sil_reh_mem ((VH *) (siopcb->siopinib->reg_base +
160 SCIF_SC1SSR)) & ~SC1SSR_TDFE);
161}
162
163/*
164 * SIOドライバの初期化ルーチン
165 */
166void
167sh2scif_initialize ()
168{
169 SIOPCB *siopcb;
170 UINT i;
171
172 /*
173 * シルアルI/Oポート管理ブロックの初期化
174 */
175 for (siopcb = siopcb_table, i = 0; i < TNUM_PORT; siopcb++, i++) {
176 siopcb->openflag = FALSE;
177 siopcb->siopinib = (&siopinib_table[i]);
178 }
179}
180
181/*
182 * オープンしているポートがあるか?
183 */
184BOOL
185sh2scif_openflag (ID siopid)
186{
187 return (siopcb_table[siopid - 1].openflag);
188}
189
190/*
191 * シリアルI/Oポートのオープン
192 */
193SIOPCB *
194sh2scif_opn_por (ID siopid, VP_INT exinf)
195{
196 SIOPCB *siopcb;
197
198 siopcb = get_siopcb (siopid);
199
200 /* 送受信停止 */
201 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCSCR),
202 sil_reb_mem ((VB *) (siopcb->siopinib->reg_base +
203 SCIF_SCSCR)) & ~(SCSCR_TE | SCSCR_RE));
204
205 /* SCIデータå…
206¥å‡ºåŠ›ãƒãƒ¼ãƒˆã®è¨­å®š */
207 /* ピンアサイン */
208 /* sys_initializeで設定 */
209
210 /* FIFOの初期化 */
211 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCFCR),
212 (VB) (SCFCR_TFRST | SCFCR_RFRST));
213
214 /* 送受信フォーマット */
215 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCSMR), 0x00);
216 /* 調歩同期式 */
217 /* 8ビット、パリティなし */
218 /* ストップビットレングス:1 */
219 /* クロックセレクト */
220
221 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCBRR), (VB) siopcb->siopinib->brr); /* ボーレート設定 */
222
223
224 /*
225 * ボーレートの設定後、1カウント分待
226たなければならない。
227 */
228 sil_dly_nse (sh2scif_DELAY); /* 値はsh1と同じ */
229
230 /* FIFOの設定 */
231 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCFCR), 0x00);
232
233 /* エラーフラグをクリア */
234 sil_wrh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SC1SSR),
235 sil_reh_mem ((VH *) (siopcb->siopinib->reg_base +
236 SCIF_SC1SSR)) & ~SC1SSR_ER);
237
238 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCSCR),
239 (VB) (SCSCR_RIE | SCSCR_TE | SCSCR_RE));
240
241 siopcb->exinf = exinf;
242 siopcb->openflag = TRUE;
243 return (siopcb);
244}
245
246/*
247 * シリアルI/Oポートのクローズ
248 */
249void
250sh2scif_cls_por (SIOPCB * siopcb)
251{
252 /* 送受信停止、割込み禁止 */
253 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCSCR),
254 (VB) ~ (SCSCR_TIE | SCSCR_RIE | SCSCR_TE | SCSCR_RE));
255
256 siopcb->openflag = FALSE;
257}
258
259/*
260 * シリアルI/Oポートへの文字送信
261 */
262BOOL
263sh2scif_snd_chr (SIOPCB * siopcb, char c)
264{
265 if (sh2scif_putready (siopcb)) {
266 sh2scif_putchar (siopcb, c);
267 return (TRUE);
268 }
269 return (FALSE);
270}
271
272/*
273 * シリアルI/Oポートからの文字受信
274 */
275INT
276sh2scif_rcv_chr (SIOPCB * siopcb)
277{
278 if (sh2scif_getready (siopcb)) {
279 return ((INT) (UB) sh2scif_getchar (siopcb));
280 }
281 return (-1);
282}
283
284/*
285 * シリアルI/Oポートからのコールバックの許可
286 */
287void
288sh2scif_ena_cbr (SIOPCB * siopcb, UINT cbrtn)
289{
290 switch (cbrtn) {
291 case SIO_ERDY_SND: /* 送信割り込み要求を許可 */
292 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCSCR),
293 sil_reb_mem ((VB *) (siopcb->siopinib->reg_base +
294 SCIF_SCSCR)) | SCSCR_TIE);
295 break;
296 case SIO_ERDY_RCV: /* 受信割り込み要求を許可 */
297 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCSCR),
298 sil_reb_mem ((VB *) (siopcb->siopinib->reg_base +
299 SCIF_SCSCR)) | SCSCR_RIE);
300 break;
301 }
302}
303
304/*
305 * シリアルI/Oポートからのコールバックの禁止
306 */
307void
308sh2scif_dis_cbr (SIOPCB * siopcb, UINT cbrtn)
309{
310 switch (cbrtn) {
311 case SIO_ERDY_SND: /* 送信割り込み要求を禁止 */
312 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCSCR),
313 sil_reb_mem ((VB *) (siopcb->siopinib->reg_base +
314 SCIF_SCSCR)) & ~SCSCR_TIE);
315 break;
316 case SIO_ERDY_RCV: /* 受信割り込み要求を禁止 */
317 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCSCR),
318 sil_reb_mem ((VB *) (siopcb->siopinib->reg_base +
319 SCIF_SCSCR)) & ~SCSCR_RIE);
320 break;
321 }
322}
323
324/*
325 * シリアルI/Oポートに対する送信割込み処理
326 */
327Inline void
328sh2scif_isr_siop_out (SIOPCB * siopcb)
329{
330 VB scr0 = sil_reb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCSCR));
331
332 if ((scr0 & SCSCR_TIE) != 0 && sh2scif_putready (siopcb)) {
333 /*
334 * 送信通知コールバックルーチンを呼び出す.
335 */
336 sh2scif_ierdy_snd (siopcb->exinf);
337 }
338}
339
340/*
341 * シリアルI/Oポートに対する受信割込み処理
342 */
343Inline void
344sh2scif_isr_siop_in (SIOPCB * siopcb)
345{
346 VB scr0 = sil_reb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCSCR));
347
348 if ((scr0 & SCSCR_RIE) != 0 && sh2scif_getready (siopcb)) {
349 /*
350 * 受信通知コールバックルーチンを呼び出す.
351 */
352 sh2scif_ierdy_rcv (siopcb->exinf);
353 }
354}
355
356/*
357 * シリアルI/Oポートに対する受信エラー割込み処理
358 */
359Inline void
360sh2scif_isr_siop_err (SIOPCB * siopcb)
361{
362 /* エラーフラグをクリア */
363 sil_wrh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SC1SSR),
364 sil_reh_mem ((VH *) (siopcb->siopinib->reg_base +
365 SCIF_SC1SSR)) & ~SC1SSR_ER);
366 /* FIFOの初期化 */
367 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCFCR),
368 (VB) SCFCR_RFRST);
369 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + SCIF_SCFCR), 0x30);
370}
371
372/* ブレーク検出処理 */
373/* フラグをリセットする */
374Inline void
375sh2scif_isr_siop_brk (SIOPCB * siopcb)
376{
377 /* フラグをクリア */
378 sil_wrh_mem ((VH *) (siopcb->siopinib->reg_base + SCIF_SC1SSR),
379 sil_reh_mem ((VH *) (siopcb->siopinib->reg_base +
380 SCIF_SC1SSR)) & ~SC1SSR_BRK);
381}
382
383/*
384 * SCI送信割込みサービスルーチン sh1と同じ
385 *
386 *  SH1内
387蔵のSCIでは割込み番号が送受信別、チャネル別に分かれているので、
388 *  SCI0の送信割込み以外でこのルーチンが呼ばれることはない
389 *
390 */
391void
392sh2scif_isr_out ()
393{
394 if (siopcb_table[0].openflag) {
395 sh2scif_isr_siop_out (get_siopcb (1));
396 }
397}
398
399/*
400 * SCI受信割込みサービスルーチン sh1と同じ
401 *
402 *  SH1内
403蔵のSCIでは割込み番号が送受信別、チャネル別に分かれているので、
404 *  SCI0の受信割込み以外でこのルーチンが呼ばれることはない
405 *
406 */
407void
408sh2scif_isr_in ()
409{
410 if (siopcb_table[0].openflag) {
411 sh2scif_isr_siop_in (get_siopcb (1));
412 }
413}
414
415/*
416 * SIO受信エラー割込みサービスルーチン sh1と同じ
417 *
418 *  SH1内
419蔵のSCIでは割込み番号がチャネル別に分かれているので、
420 *  SCI0の受信エラー割込み以外でこのルーチンが呼ばれることはない
421 *  
422 *  エラー処理自体はエラーフラグのクリアのみにとどめている。
423 *    ・オーバーランエラー
424 *    ・フレーミングエラー
425 *    ・パリティエラー
426 */
427void
428sh2scif_isr_error (void)
429{
430
431 if (siopcb_table[0].openflag) {
432 sh2scif_isr_siop_err (get_siopcb (1));
433 }
434}
435
436/* ブレーク検出 */
437void
438sh2scif_isr_brk (void)
439{
440
441 if (siopcb_table[0].openflag) {
442 sh2scif_isr_siop_brk (get_siopcb (1));
443 }
444}
445
446/*
447 * ポーリングによる文字の送信
448 */
449void
450sh2scif_putc_pol (ID portid, char c)
451{
452 while (!sh2scif_putready (&siopcb_table[portid - 1]));
453 sh2scif_putchar (&siopcb_table[portid - 1], c);
454}
455
456#if TNUM_PORT >= 2
457/*
458 * SCI受信割込みサービスルーチン
459 *
460 */
461void
462sh2scif_isr2_in (void)
463{
464 if (siopcb_table[1].openflag) {
465 sh2scif_isr_siop_in (get_siopcb (2));
466 }
467}
468
469/*
470 * SCI送信割込みサービスルーチン
471 *
472 */
473void
474sh2scif_isr2_out (void)
475{
476 if (siopcb_table[1].openflag) {
477 sh2scif_isr_siop_out (get_siopcb (2));
478 }
479}
480
481/*
482 * SCI受信エラー割込みサービスルーチン
483 */
484void
485sh2scif_isr2_error (void)
486{
487 if (siopcb_table[1].openflag) {
488 sh2scif_isr_siop_err (get_siopcb (2));
489 }
490}
491
492/* ブレーク検出 */
493void
494sh2scif_isr2_brk (void)
495{
496
497 if (siopcb_table[1].openflag) {
498 sh2scif_isr_siop_brk (get_siopcb (2));
499 }
500}
501#endif /* of #if TNUM_PORT >= 2 */
Note: See TracBrowser for help on using the repository browser.