source: anotherchoice/tags/jsp-1.4.4-full-UTF8/pdic/simple_sio/fdc37c935a.c@ 26

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

initial

File size: 10.1 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 *
9 * 上記著作権者
10は,以下の (1)〜(4) の条件か,Free Software Foundation
11 * によってå…
12¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
13 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
14 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
16 * 利用と呼ぶ)することを無償で許諾する.
17 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
18 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
19 * スコード中に含まれていること.
20 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
21 * 用できる形で再é…
22å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
23å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
24 * 者
25マニュアルなど)に,上記の著作権表示,この利用条件および下記
26 * の無保証規定を掲載すること.
27 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
28 * 用できない形で再é…
29å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
30 * と.
31 * (a) 再é…
32å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
33マニュアルなど)に,上記の著
34 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
35 * (b) 再é…
36å¸ƒã®å½¢æ…
37‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
38 * 報告すること.
39 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
40 * 害からも,上記著作権者
41およびTOPPERSプロジェクトをå…
42è²¬ã™ã‚‹ã“と.
43 *
44 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
45お
46 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
47 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
48 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
49 *
50 * @(#) $Id: fdc37c935a.c,v 1.3 2005/11/12 15:00:43 honda Exp $
51 */
52
53/*
54 * スーパI/O FDC37C935A 用ドライバ
55 */
56
57#include <s_services.h>
58#include <fdc37c935a.h>
59
60/*
61 * 初期化
62 */
63void
64smsc_init(void)
65{
66 /*
67 * Enter Config mode
68 */
69 sil_wrh_mem((VP)SMSC_CONFIG_PORT, (0x55 << 8));
70 sil_wrh_mem((VP)SMSC_CONFIG_PORT, (0x55 << 8));
71
72 /*
73 * Init SCI0
74 */
75 /* Power on */
76 smsc_config_write(0x22, (smsc_config_read(0x22) | 0x10));
77 /* Select SCI0 */
78 smsc_config_write(0x07, 0x04);
79 /* Enable SCI0 */
80 smsc_config_write(0x30, 0x01);
81 /* Set SCI0 Base Address */
82 smsc_config_write(0x60, (SMSC_SCI0_BASE_ADDR & 0xff00) >> 8);
83 smsc_config_write(0x61, (SMSC_SCI0_BASE_ADDR & 0xff));
84 /* IRQ4 */
85 smsc_config_write(0x70, 0x04);
86
87
88 /*
89 * Exit Config mode
90 */
91 sil_wrh_mem((VP)SMSC_CONFIG_PORT, (0xAA << 8));
92}
93
94
95/*
96 * スーパーI/O(FDC37C935A)用 簡易SIOドライバ
97 */
98
99/*
100 * シリアルI/Oポート初期化ブロック
101 */
102typedef struct sio_port_initialization_block {
103
104} SIOPINIB;
105
106/*
107 * シリアルI/Oポート管理ブロック
108 */
109struct sio_port_control_block {
110 const SIOPINIB *siopinib; /* シリアルI/Oポート初期化ブロック */
111 VP_INT exinf; /* 拡張情
112å ± */
113 BOOL openflag; /* オープン済みフラグ */
114 BOOL sendflag; /* 送信割込みイネーブルフラグ */
115 BOOL getready; /* 文字を受信した状æ…
116‹ */
117 BOOL putready; /* 文字を送信できる状æ…
118‹ */
119};
120
121/*
122 * シリアルI/Oポート初期化ブロック
123 */
124const SIOPINIB siopinib_table[TNUM_SIOP] = {{}};
125
126/*
127 * シリアルI/Oポート管理ブロックのエリア
128 */
129SIOPCB siopcb_table[TNUM_SIOP];
130
131
132/*
133 * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
134 */
135#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1))
136#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))
137
138
139/*
140 * 文字を受信したか?
141 */
142Inline BOOL
143smsc_sci0_getready(SIOPCB *siopcb)
144{
145 return(((sil_reh_mem((VP)SMSC_SCI0_LSR) >> 8) & 0x01) != 0);
146}
147
148/*
149 * 文字を送信できるか?
150 */
151Inline BOOL
152smsc_sci0_putready(SIOPCB *siopcb)
153{
154 return(((sil_reh_mem((VP)SMSC_SCI0_LSR) >> 8) & 0x60) != 0);
155}
156
157/*
158 * 受信した文字の取り出し
159 */
160Inline char
161smsc_sci0_getchar(SIOPCB *siopcb)
162{
163 return (sil_reh_mem((VP)SMSC_SCI0_RBR) >> 8);
164}
165
166/*
167 * 送信する文字の書き込み
168 */
169Inline void
170smsc_sci0_putchar(SIOPCB *siopcb, char c)
171{
172 sil_wrh_mem((VP)SMSC_SCI0_THR, c << 8);
173}
174
175/*
176 * 送信割込み許可
177 */
178Inline void
179smsc_sci0_enable_send(SIOPCB *siopcb)
180{
181
182 sil_wrh_mem((VP)SMSC_SCI0_IER,
183 (((sil_reh_mem((VP)SMSC_SCI0_IER) >> 8) | 0x02) << 8));
184}
185
186/*
187 * 送信割込み禁止
188 */
189Inline void
190smsc_sci0_disable_send(SIOPCB *siopcb)
191{
192 sil_wrh_mem((VP)SMSC_SCI0_IER,
193 (((sil_reh_mem((VP)SMSC_SCI0_IER) >> 8) & ~0x02) << 8));
194}
195
196/*
197 * 受信割込み許可
198 */
199Inline void
200smsc_sci0_enable_rcv(SIOPCB *siopcb)
201{
202
203 sil_wrh_mem((VP)SMSC_SCI0_IER,
204 (((sil_reh_mem((VP)SMSC_SCI0_IER) >> 8) | 0x01) << 8));
205}
206
207/*
208 * 受信割込み禁止
209 */
210Inline void
211smsc_sci0_disable_rcv(SIOPCB *siopcb)
212{
213 sil_wrh_mem((VP)SMSC_SCI0_IER,
214 (((sil_reh_mem((VP)SMSC_SCI0_IER) >> 8) & ~0x01) << 8));
215}
216
217
218
219
220
221/*
222 * SIOドライバの初期化ルーチン
223 * 1ポートしかないため,あまり意味はない
224 */
225void
226smsc_sci0_initialize()
227{
228 SIOPCB *siopcb;
229 UINT i;
230
231 /*
232 * シリアルI/Oポート管理ブロックの初期化
233 */
234 for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) {
235 siopcb->siopinib = &(siopinib_table[i]);
236 siopcb->openflag = FALSE;
237 siopcb->sendflag = FALSE;
238 }
239}
240
241/*
242 * 割込み以外の初期化
243 */
244void
245fdc37c935a_init(void)
246{
247 volatile UH dummy;
248
249 /* BIT7 = 1 */
250 sil_wrh_mem((VP)SMSC_SCI0_LCR, 0x83 << 8);
251
252 /* Set BPS */
253 sil_wrh_mem((VP)SMSC_SCI0_DLL, ((SMSC_SCI0_BPS & 0x00ff) << 8));
254 sil_wrh_mem((VP)SMSC_SCI0_DLM, ((SMSC_SCI0_BPS >> 8) << 8));
255
256 /* BIT7 = 0 Divisor Latch BIT6 = 0 No Break : BIT3 = 0 NoParity
257 : BIT2 = 0 1Stopbit : BIT1,0 = {1.1} 8bitData */
258 sil_wrh_mem((VP)SMSC_SCI0_LCR, 0x03 << 8);
259
260 /* Do not use FIFO */
261 sil_wrh_mem((VP)SMSC_SCI0_FCR, 0x0000);
262
263 /* Clear Status */
264 dummy = sil_reh_mem((VP)SMSC_SCI0_RBR);
265 dummy = sil_reh_mem((VP)SMSC_SCI0_LSR);
266}
267
268/*
269 * オープンしているポートがあるか
270 */
271BOOL
272smsc_sci0_openflag(void)
273{
274 return(siopcb_table[0].openflag);
275}
276
277/*
278 * シリアルI/Oポートのオープン
279 */
280SIOPCB *
281smsc_sci0_opn_por(ID siopid, VP_INT exinf)
282{
283 SIOPCB *siopcb;
284 const SIOPINIB *siopinib;
285
286
287 siopcb = get_siopcb(siopid);
288 siopinib = siopcb->siopinib;
289
290 fdc37c935a_init();
291
292 /* Enable Receive Data Interrupt */
293 sil_wrh_mem((VP)SMSC_SCI0_IER, (0x01 << 8));
294 sil_wrh_mem((VP)SMSC_SCI0_MCR, 0x08 << 8);
295
296 /*
297 * MS7729RSE01では,一度送信割込みを発生させておかないと割込み
298 * レベル16の割込みが発生してしまい正しく動作しない.
299 */
300 /* 送信割り込み要求を許可 */
301 sil_wrh_mem((VP)SMSC_SCI0_IER,
302 (((sil_reh_mem((VP)SMSC_SCI0_IER) >> 8) | 0x02) << 8));
303 /* 送信割り込み要求を禁止 */
304 sil_wrh_mem((VP)SMSC_SCI0_IER,
305 (((sil_reh_mem((VP)SMSC_SCI0_IER) >> 8) & ~0x02) << 8));
306
307 siopcb->exinf = exinf;
308 siopcb->getready = siopcb->putready = FALSE;
309 siopcb->openflag = TRUE;
310
311 return(siopcb);
312}
313
314/*
315 * シリアルI/Oポートのクローズ
316 */
317void
318smsc_sci0_cls_por(SIOPCB *siopcb)
319{
320 sil_wrh_mem((VP)SMSC_SCI0_IER, 0x00); /* 割込みの禁止 */
321 siopcb->openflag = FALSE;
322}
323
324/*
325 * シリアルI/Oポートへのポーリングでの出力
326 */
327void
328fdc37c935a_pol_putc(char c)
329{
330 while(((sil_reh_mem((VP)SMSC_SCI0_LSR) >> 8) & 0x60) == 0)
331 ;
332
333 sil_wrh_mem((VP)SMSC_SCI0_THR, c << 8);
334}
335
336/*
337 * シリアルI/Oポートへの文字送信
338 */
339BOOL
340smsc_sci0_snd_chr(SIOPCB *siopcb, char c)
341{
342 if (smsc_sci0_putready(siopcb)){
343 smsc_sci0_putchar(siopcb, c);
344 return(TRUE);
345 }
346 return(FALSE);
347}
348
349/*
350 * シリアルI/Oポートからの文字受信
351 */
352INT
353smsc_sci0_rcv_chr(SIOPCB *siopcb)
354{
355 if (smsc_sci0_getready(siopcb)) {
356 return((INT)(UB) smsc_sci0_getchar(siopcb));
357 }
358 return(-1);
359}
360
361
362/*
363 * シリアルI/Oポートからのコールバックの許可
364 */
365void
366smsc_sci0_ena_cbr(SIOPCB *siopcb, UINT cbrtn)
367{
368
369 switch (cbrtn) {
370 case SIO_ERDY_SND:
371 smsc_sci0_enable_send(siopcb);
372 break;
373 case SIO_ERDY_RCV:
374 smsc_sci0_enable_rcv(siopcb);
375 break;
376 }
377}
378
379/*
380 * シリアルI/Oポートからのコールバックの禁止
381 */
382void
383smsc_sci0_dis_cbr(SIOPCB *siopcb, UINT cbrtn)
384{
385 switch (cbrtn) {
386 case SIO_ERDY_SND:
387 smsc_sci0_disable_send(siopcb);
388 break;
389 case SIO_ERDY_RCV:
390 smsc_sci0_disable_rcv(siopcb);
391 break;
392 }
393}
394
395/*
396 * シリアルI/Oポートに対する割込み処理
397 */
398static void
399smsc_sci0_isr_siop(SIOPCB *siopcb)
400{
401 if (smsc_sci0_getready(siopcb)) {
402 /*
403 * 受信通知コールバックルーチンを呼び出す.
404 */
405 smsc_sci0_ierdy_rcv(siopcb->exinf);
406 }
407 if (smsc_sci0_putready(siopcb)) {
408 /*
409 * 送信可能コールバックルーチンを呼び出す.
410 */
411 smsc_sci0_ierdy_snd(siopcb->exinf);
412 }
413}
414
415/*
416 * SIOの割込みサービスルーチン
417 */
418void
419smsc_sci0_isr()
420{
421 smsc_sci0_isr_siop(&(siopcb_table[0]));
422}
Note: See TracBrowser for help on using the repository browser.