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: st16c2550.c,v 1.1 2009/01/31 05:27:37 suikan Exp $
40 * ST16C2550 用 簡易SIOドライバ
42 #include <s_services.h>
43 #include <st16c2550.h>
48 #define ST16C_RHR 0x00 /* H LCR bit7=0 Read */
49 #define ST16C_THR 0x00 /* H LCR bit7=0 Write */
50 #define ST16C_DLL 0x00 /* H LCR bit7=1 */
51 #define ST16C_IER 0x02 /* H LCR bit7=0 */
52 #define ST16C_DLM 0x02 /* H LCR bit7=1 */
53 #define ST16C_ISR 0x04 /* H Read */
54 #define ST16C_FCR 0x04 /* H Write */
55 #define ST16C_LCR 0x06 /* H */
56 #define ST16C_MCR 0x08 /* H */
57 #define ST16C_LSR 0x0a /* H Read */
58 #define ST16C_MSR 0x0c /* H Read */
59 #define ST16C_SPR 0x0e /* H */
61 #define ISR_TX 0x02 /* 送信割り込み発生 */
62 #define IER_TX 0x02 /* 送信割り込み許可 */
63 #define ISR_RX 0x01 /* 受信割り込み発生 */
64 #define IER_RX 0x01 /* 受信割り込み許可 */
66 #define LCR_DL_MODE 0x80 /* Divisor Enable */
67 #define LCR_VAL 0x03 /* 8bit,1stop,Noparity,No break */
68 #define FCR_FIFO_DISABLE 0x00
70 #define LSR_RX_DATA_READY 0x01
71 #define LSR_TX_EMPTY 0x20
73 #define MCR_INT_ENABLE 0x08
77 * 4 = (7372800Hz)/(115200*16)
88 const SIOPINIB siopinib_table[TNUM_SIOP] = {
89 {ST16C_CHB, LCR_VAL, DLM_VAL, DLL_VAL, PINTER_PINT7E},
91 {ST16C_CHA, LCR_VAL, DLM_VAL, DLL_VAL, PINTER_PINT6E},
92 #endif /* TNUM_SIOP > 2 */
96 * シリアルI/Oポート初期化ブロックの取出し
98 #define INDEX_SIOPINIB(siopid) ((UINT)((siopid) - 1))
99 #define get_siopinib(siopid) (&(siopinib_table[INDEX_SIOPINIB(siopid)]))
103 * シリアルI/Oポート管理ブロックのエリア
105 SIOPCB siopcb_table[TNUM_SIOP];
108 * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
110 #define INDEX_SIOP(siopid) ((UINT)((siopid) - 1))
111 #define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))
114 st16c_write(UW addr, UW offset, UB val)
116 sil_wrh_mem((VP)(addr + offset),val);
120 st16c_read(UW addr, UW offset)
122 return(sil_reh_mem((VP)(addr + offset)));
130 st16c_getready(SIOPCB *siopcb)
134 status = st16c_read(siopcb->siopinib->reg_base, ST16C_LSR);
136 return((status & LSR_RX_DATA_READY));
143 st16c_putready(SIOPCB *siopcb)
147 status = st16c_read(siopcb->siopinib->reg_base, ST16C_LSR);
149 return (status & LSR_TX_EMPTY);
156 st16c_getchar(SIOPCB *siopcb)
158 return(st16c_read(siopcb->siopinib->reg_base,ST16C_RHR));
165 st16c_putchar(SIOPCB *siopcb, UB c)
167 st16c_write(siopcb->siopinib->reg_base, ST16C_THR, c);
174 st16c_enable_send(SIOPCB *siopcb)
176 st16c_write(siopcb->siopinib->reg_base, ST16C_IER,
177 (st16c_read(siopcb->siopinib->reg_base,ST16C_IER) | IER_TX));
184 st16c_disable_send(SIOPCB *siopcb)
186 st16c_write(siopcb->siopinib->reg_base, ST16C_IER,
187 (st16c_read(siopcb->siopinib->reg_base, ST16C_IER) & ~IER_TX));
195 st16c_enable_rcv(SIOPCB *siopcb)
197 st16c_write(siopcb->siopinib->reg_base, ST16C_IER,
198 (st16c_read(siopcb->siopinib->reg_base,ST16C_IER) | IER_RX));
205 st16c_disable_rcv(SIOPCB *siopcb)
207 st16c_write(siopcb->siopinib->reg_base, ST16C_IER,
208 (st16c_read(siopcb->siopinib->reg_base, ST16C_IER) & ~IER_RX));
217 st16c2550_initialize()
223 * シリアルI/Oポート管理ブロックの初期化
225 for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) {
226 siopcb->siopinib = &(siopinib_table[i]);
227 siopcb->openflag = FALSE;
228 siopcb->sendflag = FALSE;
237 st16c2550_init_siopinib(const SIOPINIB *siopinib)
243 st16c_write(siopinib->reg_base, ST16C_LCR,
244 (st16c_read(siopinib->reg_base, ST16C_LCR) | LCR_DL_MODE));
245 st16c_write(siopinib->reg_base, ST16C_DLL, siopinib->dll_val);
246 st16c_write(siopinib->reg_base, ST16C_DLM, siopinib->dlm_val);
247 /* Divisor Disable */
248 st16c_write(siopinib->reg_base, ST16C_LCR,
249 (st16c_read(siopinib->reg_base, ST16C_LCR) & ~LCR_DL_MODE));
252 st16c_write(siopinib->reg_base, ST16C_LCR, siopinib->lcr_val);
255 st16c_write(siopinib->reg_base, ST16C_FCR, FCR_FIFO_DISABLE);
258 st16c_write(siopinib->reg_base, ST16C_IER, 0x00);
263 * カーネル起動時のバーナー出力用の初期化
269 st16c2550_init_siopinib(get_siopinib(1));
271 st16c2550_init_siopinib(get_siopinib(2));
272 #endif /* TNUM_SIOP > 2 */
280 st16c2550_openflag(void)
283 return(siopcb_table[0].openflag);
284 #else /* TNUM_SIOP < 2 */
285 return(siopcb_table[0].openflag || siopcb_table[1].openflag);
286 #endif /* TNUM_SIOP < 2 */
294 st16c2550_opn_por(ID siopid, VP_INT exinf)
297 const SIOPINIB *siopinib;
299 siopcb = get_siopcb(siopid);
300 siopinib = siopcb->siopinib;
305 st16c2550_init_siopinib(siopcb->siopinib);
308 st16c_write(siopcb->siopinib->reg_base, ST16C_IER, IER_RX);
311 st16c_write(siopcb->siopinib->reg_base, ST16C_MCR, MCR_INT_ENABLE);
313 siopcb->exinf = exinf;
314 siopcb->getready = siopcb->putready = FALSE;
315 siopcb->openflag = TRUE;
324 st16c2550_cls_por(SIOPCB *siopcb)
327 st16c_write(siopcb->siopinib->reg_base, ST16C_IER, 0x00);
328 siopcb->openflag = FALSE;
333 * シリアルI/Oポートへのポーリングでの出力
336 st16c2550_pol_putc(char c, ID siopid)
338 const SIOPINIB *siopinib;
340 siopinib = get_siopinib(siopid);
342 while((st16c_read(siopinib->reg_base, ST16C_LSR) & LSR_TX_EMPTY)
345 st16c_write(siopinib->reg_base, ST16C_THR, c);
353 st16c2550_snd_chr(SIOPCB *siopcb, char c)
355 if (st16c_putready(siopcb)){
356 st16c_putchar(siopcb, c);
366 st16c2550_rcv_chr(SIOPCB *siopcb)
368 if (st16c_getready(siopcb)) {
369 return((INT)(UB) st16c_getchar(siopcb));
379 * シリアルI/Oポートからのコールバックの許可
382 st16c2550_ena_cbr(SIOPCB *siopcb, UINT cbrtn)
387 st16c_enable_send(siopcb);
390 st16c_enable_rcv(siopcb);
396 * シリアルI/Oポートからのコールバックの禁止
399 st16c2550_dis_cbr(SIOPCB *siopcb, UINT cbrtn)
403 st16c_disable_send(siopcb);
406 st16c_disable_rcv(siopcb);
412 * シリアルI/Oポートに対する割込み処理
415 st16c2550_isr_siop(SIOPCB *siopcb)
417 if (st16c_getready(siopcb)) {
419 * 受信通知コールバックルーチンを呼び出す.
421 st16c2550_ierdy_rcv(siopcb->exinf);
423 if (st16c_putready(siopcb)) {
425 * 送信可能コールバックルーチンを呼び出す.
427 st16c2550_ierdy_snd(siopcb->exinf);
437 st16c2550_isr_siop(&(siopcb_table[0]));