3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
9 * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
10 * によって公表されている GNU General Public License の Version 2 に記
11 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
12 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
24 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
26 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
31 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
33 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
34 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
36 * @(#) $Id: fdc37c935a.c,v 1.1 2009/01/31 05:27:37 suikan Exp $
40 * スーパI/O FDC37C935A 用ドライバ
43 #include <s_services.h>
44 #include <fdc37c935a.h>
55 sil_wrh_mem((VP)SMSC_CONFIG_PORT, (0x55 << 8));
56 sil_wrh_mem((VP)SMSC_CONFIG_PORT, (0x55 << 8));
62 smsc_config_write(0x22, (smsc_config_read(0x22) | 0x10));
64 smsc_config_write(0x07, 0x04);
66 smsc_config_write(0x30, 0x01);
67 /* Set SCI0 Base Address */
68 smsc_config_write(0x60, (SMSC_SCI0_BASE_ADDR & 0xff00) >> 8);
69 smsc_config_write(0x61, (SMSC_SCI0_BASE_ADDR & 0xff));
71 smsc_config_write(0x70, 0x04);
77 sil_wrh_mem((VP)SMSC_CONFIG_PORT, (0xAA << 8));
82 * スーパーI/O(FDC37C935A)用 簡易SIOドライバ
88 typedef struct sio_port_initialization_block {
95 struct sio_port_control_block {
96 const SIOPINIB *siopinib; /* シリアルI/Oポート初期化ブロック */
97 VP_INT exinf; /* 拡張情報 */
98 BOOL openflag; /* オープン済みフラグ */
99 BOOL sendflag; /* 送信割込みイネーブルフラグ */
100 BOOL getready; /* 文字を受信した状態 */
101 BOOL putready; /* 文字を送信できる状態 */
107 const SIOPINIB siopinib_table[TNUM_SIOP] = {{}};
110 * シリアルI/Oポート管理ブロックのエリア
112 SIOPCB siopcb_table[TNUM_SIOP];
116 * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
118 #define INDEX_SIOP(siopid) ((UINT)((siopid) - 1))
119 #define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))
126 smsc_sci0_getready(SIOPCB *siopcb)
128 return(((sil_reh_mem((VP)SMSC_SCI0_LSR) >> 8) & 0x01) != 0);
135 smsc_sci0_putready(SIOPCB *siopcb)
137 return(((sil_reh_mem((VP)SMSC_SCI0_LSR) >> 8) & 0x60) != 0);
144 smsc_sci0_getchar(SIOPCB *siopcb)
146 return (sil_reh_mem((VP)SMSC_SCI0_RBR) >> 8);
153 smsc_sci0_putchar(SIOPCB *siopcb, char c)
155 sil_wrh_mem((VP)SMSC_SCI0_THR, c << 8);
162 smsc_sci0_enable_send(SIOPCB *siopcb)
165 sil_wrh_mem((VP)SMSC_SCI0_IER,
166 (((sil_reh_mem((VP)SMSC_SCI0_IER) >> 8) | 0x02) << 8));
173 smsc_sci0_disable_send(SIOPCB *siopcb)
175 sil_wrh_mem((VP)SMSC_SCI0_IER,
176 (((sil_reh_mem((VP)SMSC_SCI0_IER) >> 8) & ~0x02) << 8));
183 smsc_sci0_enable_rcv(SIOPCB *siopcb)
186 sil_wrh_mem((VP)SMSC_SCI0_IER,
187 (((sil_reh_mem((VP)SMSC_SCI0_IER) >> 8) | 0x01) << 8));
194 smsc_sci0_disable_rcv(SIOPCB *siopcb)
196 sil_wrh_mem((VP)SMSC_SCI0_IER,
197 (((sil_reh_mem((VP)SMSC_SCI0_IER) >> 8) & ~0x01) << 8));
206 * 1ポートしかないため,あまり意味はない
209 smsc_sci0_initialize()
215 * シリアルI/Oポート管理ブロックの初期化
217 for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) {
218 siopcb->siopinib = &(siopinib_table[i]);
219 siopcb->openflag = FALSE;
220 siopcb->sendflag = FALSE;
228 fdc37c935a_init(void)
233 sil_wrh_mem((VP)SMSC_SCI0_LCR, 0x83 << 8);
236 sil_wrh_mem((VP)SMSC_SCI0_DLL, ((SMSC_SCI0_BPS & 0x00ff) << 8));
237 sil_wrh_mem((VP)SMSC_SCI0_DLM, ((SMSC_SCI0_BPS >> 8) << 8));
239 /* BIT7 = 0 Divisor Latch BIT6 = 0 No Break : BIT3 = 0 NoParity
240 : BIT2 = 0 1Stopbit : BIT1,0 = {1.1} 8bitData */
241 sil_wrh_mem((VP)SMSC_SCI0_LCR, 0x03 << 8);
243 /* Do not use FIFO */
244 sil_wrh_mem((VP)SMSC_SCI0_FCR, 0x0000);
247 dummy = sil_reh_mem((VP)SMSC_SCI0_RBR);
248 dummy = sil_reh_mem((VP)SMSC_SCI0_LSR);
255 smsc_sci0_openflag(void)
257 return(siopcb_table[0].openflag);
264 smsc_sci0_opn_por(ID siopid, VP_INT exinf)
267 const SIOPINIB *siopinib;
270 siopcb = get_siopcb(siopid);
271 siopinib = siopcb->siopinib;
275 /* Enable Receive Data Interrupt */
276 sil_wrh_mem((VP)SMSC_SCI0_IER, (0x01 << 8));
277 sil_wrh_mem((VP)SMSC_SCI0_MCR, 0x08 << 8);
280 * MS7729RSE01では,一度送信割込みを発生させておかないと割込み
281 * レベル16の割込みが発生してしまい正しく動作しない.
284 sil_wrh_mem((VP)SMSC_SCI0_IER,
285 (((sil_reh_mem((VP)SMSC_SCI0_IER) >> 8) | 0x02) << 8));
287 sil_wrh_mem((VP)SMSC_SCI0_IER,
288 (((sil_reh_mem((VP)SMSC_SCI0_IER) >> 8) & ~0x02) << 8));
290 siopcb->exinf = exinf;
291 siopcb->getready = siopcb->putready = FALSE;
292 siopcb->openflag = TRUE;
301 smsc_sci0_cls_por(SIOPCB *siopcb)
303 sil_wrh_mem((VP)SMSC_SCI0_IER, 0x00); /* 割込みの禁止 */
304 siopcb->openflag = FALSE;
308 * シリアルI/Oポートへのポーリングでの出力
311 fdc37c935a_pol_putc(char c)
313 while(((sil_reh_mem((VP)SMSC_SCI0_LSR) >> 8) & 0x60) == 0)
316 sil_wrh_mem((VP)SMSC_SCI0_THR, c << 8);
323 smsc_sci0_snd_chr(SIOPCB *siopcb, char c)
325 if (smsc_sci0_putready(siopcb)){
326 smsc_sci0_putchar(siopcb, c);
336 smsc_sci0_rcv_chr(SIOPCB *siopcb)
338 if (smsc_sci0_getready(siopcb)) {
339 return((INT)(UB) smsc_sci0_getchar(siopcb));
346 * シリアルI/Oポートからのコールバックの許可
349 smsc_sci0_ena_cbr(SIOPCB *siopcb, UINT cbrtn)
354 smsc_sci0_enable_send(siopcb);
357 smsc_sci0_enable_rcv(siopcb);
363 * シリアルI/Oポートからのコールバックの禁止
366 smsc_sci0_dis_cbr(SIOPCB *siopcb, UINT cbrtn)
370 smsc_sci0_disable_send(siopcb);
373 smsc_sci0_disable_rcv(siopcb);
379 * シリアルI/Oポートに対する割込み処理
382 smsc_sci0_isr_siop(SIOPCB *siopcb)
384 if (smsc_sci0_getready(siopcb)) {
386 * 受信通知コールバックルーチンを呼び出す.
388 smsc_sci0_ierdy_rcv(siopcb->exinf);
390 if (smsc_sci0_putready(siopcb)) {
392 * 送信可能コールバックルーチンを呼び出す.
394 smsc_sci0_ierdy_snd(siopcb->exinf);
404 smsc_sci0_isr_siop(&(siopcb_table[0]));