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

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

initial

File size: 10.2 KB
RevLine 
[26]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-2004 by Industrial Technology Institute,
9 * Miyagi Prefectural Government, JAPAN
10 * Copyright (C) 2002-2004 by Hokkaido Industrial Research Institute, JAPAN
11 * Copyright (C) 2006 by GJ Business Division RICOH COMPANY,LTD. 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$
55 */
56
57/*
58 * SH7047内
59蔵シリアルコミュニケーションインターフェイスSCI用 簡易ドライバ
60 */
61
62#include <s_services.h>
63#include "sh7047.h"
64#include "sh7047scif.h"
65
66/*
67 * シリアルI/Oポート初期化ブロック
68 */
69static const SIOPINIB siopinib_table[TNUM_PORT] = {
70 {
71 (IOREG_SCI_BASE+IOREG_SCI_WINDOW*1),
72 (IOREG_INTC_BASE+IOREG_IPRI_OFFSET),
73 9,
74 ISR_SCR3_SHIFT
75 },
76 {
77 (IOREG_SCI_BASE+IOREG_SCI_WINDOW*2),
78 (IOREG_INTC_BASE+IOREG_IPRI_OFFSET),
79 8,
80 ISR_SCR4_SHIFT
81 }
82};
83
84/*
85 * シリアルI/Oポート管理ブロックのエリア
86 * ID = 1 をSCI3に対応させている.
87 */
88SIOPCB siopcb_table[TNUM_PORT];
89
90/*
91 * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
92 */
93#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1))
94#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))
95
96/*
97 * 文字を受信できるか?
98 */
99Inline BOOL
100sh7047scif_getready (SIOPCB * siopcb)
101{
102 /* レシーブデータレジスタフル・フラグのチェック */
103 return (sil_reb_mem((VP)(siopcb->siopinib->cntrl+IOREG_SSR_OFFSET)) & SSR_RDRF);
104}
105
106/*
107 * 文字を送信できるか?
108 */
109Inline BOOL
110sh7047scif_putready (SIOPCB * siopcb)
111{
112 /* トランスミットFIFOデータレジスタエンプティ・フラグのチェック */
113 return (sil_reb_mem((VP)(siopcb->siopinib->cntrl+IOREG_SSR_OFFSET)) & SSR_TDRE);
114}
115
116/*
117 * 受信した文字の取り出し
118 */
119Inline char
120sh7047scif_getchar (SIOPCB * siopcb)
121{
122 VB data;
123
124 data = sil_reb_mem((VP)(siopcb->siopinib->cntrl+IOREG_RDR_OFFSET));
125 /* レシーブデータレジスタフル・フラグのクリア */
126 sil_wrb_mem((VP)(siopcb->siopinib->cntrl+IOREG_SSR_OFFSET),
127 sil_reb_mem((VP)(siopcb->siopinib->cntrl+IOREG_SSR_OFFSET)) & ~SSR_RDRF);
128 return data;
129}
130
131/*
132 * 送信する文字の書込み
133 */
134Inline void
135sh7047scif_putchar (SIOPCB * siopcb, char c)
136{
137 sil_wrb_mem((VP)(siopcb->siopinib->cntrl+IOREG_TDR_OFFSET), c);
138 /* トランスミットFIFOデータレジスタエンプティ・フラグのクリア */
139 sil_wrb_mem((VP)(siopcb->siopinib->cntrl+IOREG_SSR_OFFSET),
140 sil_reb_mem((VP)(siopcb->siopinib->cntrl+IOREG_SSR_OFFSET)) & ~SSR_TDRE);
141}
142
143/*
144 * SIOドライバの初期化ルーチン
145 */
146void
147sh7047scif_initialize ()
148{
149 SIOPCB *siopcb;
150 UINT i;
151
152 /*
153 * シリアルI/Oポート管理ブロックの初期化
154 */
155 for (siopcb = siopcb_table, i = 0; i < TNUM_PORT; siopcb++, i++) {
156 siopcb->siopinib = &siopinib_table[i];
157 siopcb->openflag = FALSE;
158 }
159}
160
161/*
162 * オープンしているポートはあるか?
163 */
164BOOL
165sh7047scif_openflag (ID siopid)
166{
167 if(siopcb_table[INDEX_SIOP(siopid)].openflag)
168 return TRUE;
169 sil_dly_nse(sh2scif_DELAY*4); /* Wait for Banner */
170 return FALSE;
171}
172
173/*
174 * シリアルI/Oポートのオープン
175 */
176SIOPCB *
177sh7047scif_opn_por (ID siopid, VP_INT exinf)
178{
179 SIOPCB *siopcb;
180 UW base;
181 unsigned char dummy;
182
183 siopcb = get_siopcb (siopid);
184 base = siopcb->siopinib->cntrl;
185 /* 送受信停止 */
186 sil_wrb_mem((VP)(base+IOREG_SCR_OFFSET),
187 sil_reb_mem((VP)(base+IOREG_SCR_OFFSET)) & ~(SCR_TE | SCR_RE));
188 /* モードレジスタの設定 */
189 sil_wrb_mem((VP)(base+IOREG_SMR_OFFSET), DEFAULT_SMR);
190 /* ボーレートの設定 */
191 sil_wrb_mem((VP)(base+IOREG_BRR_OFFSET), DEFAULT_BRR);
192
193 sil_dly_nse(sh2scif_DELAY);
194 /* 送受信、受信割込み許可 */
195 sil_wrb_mem((VP)(base+IOREG_SCR_OFFSET), SCR_RIE|SCR_TE|SCR_RE);
196 dummy = sil_reb_mem((VP)(base+IOREG_SSR_OFFSET)); /* Dummy read */
197 /* 割込みコントローラの設定 */
198 sil_wrb_mem((VP)(base+IOREG_SSR_OFFSET), SSR_TDRE); /* Clear error flags */
199 siopcb->exinf = exinf;
200 siopcb->openflag = TRUE;
201 return(siopcb);
202}
203
204/*
205 * シリアルI/Oポートのクローズ
206 */
207void
208sh7047scif_cls_por (SIOPCB * siopcb)
209{
210 /* 送受信停止、割込み禁止 */
211 sil_wrb_mem((VP)(siopcb->siopinib->cntrl+IOREG_SCR_OFFSET),
212 sil_reb_mem((VP)(siopcb->siopinib->cntrl+IOREG_SCR_OFFSET)) & ~(SCR_TIE|SCR_RIE|SCR_TE|SCR_RE));
213
214 siopcb->openflag = FALSE;
215}
216
217/*
218 * シリアルI/Oポートへの文字送信
219 */
220BOOL
221sh7047scif_snd_chr (SIOPCB * siopcb, char c)
222{
223 if (sh7047scif_putready (siopcb)) {
224 sh7047scif_putchar (siopcb, c);
225 return (TRUE);
226 }
227 return (FALSE);
228}
229
230/*
231 * シリアルI/Oポートからの文字受信
232 */
233INT
234sh7047scif_rcv_chr (SIOPCB * siopcb)
235{
236 if (sh7047scif_getready (siopcb)) {
237 return ((INT) (UB) sh7047scif_getchar (siopcb));
238 }
239 return (-1);
240}
241
242/*
243 * シリアルI/Oポートからのコールバック許可
244 */
245void
246sh7047scif_ena_cbr (SIOPCB * siopcb, UINT cbrtn)
247{
248 UW base = siopcb->siopinib->cntrl;
249
250 switch (cbrtn) {
251 case SIO_ERDY_SND: /* 送信割込み要求を許可 */
252 sil_wrb_mem((VP)(base+IOREG_SCR_OFFSET), sil_reb_mem((VP)(base+IOREG_SCR_OFFSET)) | SCR_TIE);
253 break;
254 case SIO_ERDY_RCV: /* 受信割込み要求を許可 */
255 sil_wrb_mem((VP)(base+IOREG_SCR_OFFSET), sil_reb_mem((VP)(base+IOREG_SCR_OFFSET)) | SCR_RIE);
256 break;
257 default:
258 break;
259 }
260}
261
262/*
263 * シリアルI/Oポートからのコールバック禁止
264 */
265void
266sh7047scif_dis_cbr (SIOPCB * siopcb, UINT cbrtn)
267{
268 UW base = siopcb->siopinib->cntrl;
269
270 switch (cbrtn) {
271 case SIO_ERDY_SND: /* 送信割込み要求を禁止 */
272 sil_wrb_mem((VP)(base+IOREG_SCR_OFFSET), sil_reb_mem((VP)(base+IOREG_SCR_OFFSET)) & ~SCR_TIE);
273 break;
274 case SIO_ERDY_RCV: /* 受信割込み要求を禁止 */
275 sil_wrb_mem((VP)(base+IOREG_SCR_OFFSET), sil_reb_mem((VP)(base+IOREG_SCR_OFFSET)) & ~SCR_RIE);
276 break;
277 default:
278 break;
279 }
280}
281
282/*
283 * シリアルI/Oポートに対する送信割込み処理
284 */
285Inline void
286sh7047scif_isr_siop_out (SIOPCB * siopcb)
287{
288 VB scr0 = sil_reb_mem((VP)(siopcb->siopinib->cntrl+IOREG_SCR_OFFSET));
289
290 if ((scr0 & SCR_TIE) != 0 && sh7047scif_putready (siopcb)) {
291 /*
292 * 送信通知コールバックルーチンを呼び出す.
293 */
294 sh7047scif_ierdy_snd (siopcb->exinf);
295 }
296}
297
298/*
299 * シリアルI/Oポートに対する受信割込み処理
300 */
301Inline void
302sh7047scif_isr_siop_in (SIOPCB * siopcb)
303{
304 VB scr0 = sil_reb_mem((VP)(siopcb->siopinib->cntrl+IOREG_SCR_OFFSET));
305
306 if ((scr0 & SCR_RIE) != 0 && sh7047scif_getready (siopcb)) {
307 /*
308 * 受信通知コールバックルーチンを呼び出す.
309 */
310 sh7047scif_ierdy_rcv (siopcb->exinf);
311 }
312}
313
314/*
315 * SIO送信割込みサービスルーチン(SCI3用)
316 */
317void
318sh7047scif3_isr_out ()
319{
320 if (siopcb_table[0].openflag) {
321 sh7047scif_isr_siop_out (&(siopcb_table[0]));
322 }
323}
324
325/*
326 * SIO送信割込みサービスルーチン(SCI4用)
327 */
328void
329sh7047scif4_isr_out ()
330{
331 if (siopcb_table[1].openflag) {
332 sh7047scif_isr_siop_out (&(siopcb_table[1]));
333 }
334}
335
336/*
337 * SIO受信割込みサービスルーチン(SCI3用)
338 */
339void
340sh7047scif3_isr_in ()
341{
342 if (siopcb_table[0].openflag) {
343 sh7047scif_isr_siop_in (&(siopcb_table[0]));
344 }
345}
346
347/*
348 * SIO受信割込みサービスルーチン(SCI4用)
349 */
350void
351sh7047scif4_isr_in ()
352{
353 if (siopcb_table[1].openflag) {
354 sh7047scif_isr_siop_in (&(siopcb_table[1]));
355 }
356}
357
358/*
359 * SIO受信エラー割込みサービスルーチン(SCI3用)
360 */
361void
362sh7047scif3_isr_error (void)
363{
364 UW base = siopcb_table[0].siopinib->cntrl;
365
366 if (siopcb_table[0].openflag) {
367 sil_wrb_mem((VP)(base+IOREG_SSR_OFFSET), sil_reb_mem((VP)(base+IOREG_SSR_OFFSET)) & ~(SSR_OPER|SSR_FER|SSR_PER));
368 }
369}
370
371/*
372 * SIO受信エラー割込みサービスルーチン(SCI4用)
373 */
374void
375sh7047scif4_isr_error (void)
376{
377 UW base = siopcb_table[1].siopinib->cntrl;
378
379 if (siopcb_table[1].openflag) {
380 sil_wrb_mem((VP)(base+IOREG_SSR_OFFSET), sil_reb_mem((VP)(base+IOREG_SSR_OFFSET)) & ~(SSR_OPER|SSR_FER|SSR_PER));
381 }
382}
383
384
Note: See TracBrowser for help on using the repository browser.