source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/cfv2/mcfuart.c@ 26

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

initial

File size: 10.3 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 * Copyright (C) 2007 by KURUSUGAWA Electronics Industry Inc, JAPAN
12 * Copyright (C) 2008 by Takahisa Yokota
13 *
14 * 上記著作権者
15は,以下の (1)〜(4) の条件か,Free Software Foundation
16 * によってå…
17¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
18 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
19 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
20å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
21 * 利用と呼ぶ)することを無償で許諾する.
22 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
23 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
24 * スコード中に含まれていること.
25 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
26 * 用できる形で再é…
27å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
28å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
29 * 者
30マニュアルなど)に,上記の著作権表示,この利用条件および下記
31 * の無保証規定を掲載すること.
32 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
33 * 用できない形で再é…
34å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
35 * と.
36 * (a) 再é…
37å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
38マニュアルなど)に,上記の著
39 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
40 * (b) 再é…
41å¸ƒã®å½¢æ…
42‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
43 * 報告すること.
44 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
45 * 害からも,上記著作権者
46およびTOPPERSプロジェクトをå…
47è²¬ã™ã‚‹ã“と.
48 *
49 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
50お
51 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
52 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
53 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
54 *
55 * @(#) $Id: mcfuart.c,v 1.3 2005/07/06 00:45:07 honda Exp $
56 */
57
58/*
59 * COLDFIRE内
60蔵UART用 簡易ドライバ
61 */
62
63#include <s_services.h>
64#include "mcfuart.h"
65
66/*
67 * シリアルI/Oポート管理ブロックの定義
68 */
69/* å…
70¥å‡ºåŠ›ãƒãƒ¼ãƒˆã®è¨­å®šã¯sys_config.c */
71/* 割込みベクタ番号の設定はhw_serial.h */
72/* 管理ブロックの設定はmcfuart.c */
73
74#ifndef GDB_STUB
75
76const SIOPINIB siopinib_table[TNUM_PORT] = {
77 {IPSBAR + 0x00000200, BRR9600, 0x0, 0x27}, /* UART0 */
78#if TNUM_PORT >= 2
79 {IPSBAR + 0x00000240, BRR9600, 0x0, 0x27}, /* UART1 */
80#endif /* TNUM_PORT >= 2 */
81};
82
83#else /* GDB_STUB */
84
85const SIOPINIB siopinib_table[TNUM_PORT] = {
86 {IPSBAR + 0x00000200, BRR9600, 0x0, 6}, /* SCIF2 */
87};
88
89#endif /* GDB_STUB */
90
91#if defined(TTM)
92/*
93 * シリアルI/Oポート管理ブロックの定義
94 *  2chサポートに拡張する場合は初期値用のデータも含める
95 */
96struct sio_port_control_block
97{
98 VP_INT exinf; /* 拡張情
99å ± */
100 BOOL openflag; /* オープン済みフラグ */
101};
102#endif
103/*
104 * シリアルI/Oポート管理ブロックのエリア
105 */
106static SIOPCB siopcb_table[TNUM_PORT];
107
108/*
109 * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
110 */
111#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1))
112#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))
113
114/*
115 * 文字を受信できるか?
116 */
117Inline BOOL
118mcfuart_getready (SIOPCB * siopcb)
119{
120 return (sil_reb_mem((VB *) (siopcb->siopinib->reg_base + MCF_UART_USR)) & MCF_UART_USR_RXRDY);
121}
122
123/*
124 * 文字を送信できるか?
125 */
126Inline BOOL
127mcfuart_putready (SIOPCB * siopcb)
128{
129 /* Wait until space is available in the FIFO */
130 return (sil_reb_mem((VB*)(siopcb->siopinib->reg_base + MCF_UART_USR)) & MCF_UART_USR_TXRDY);
131}
132
133/*
134 * 受信した文字の取出し
135 */
136Inline char
137mcfuart_getchar (SIOPCB * siopcb)
138{
139 VB data;
140 data = sil_reb_mem ((VB*)(siopcb->siopinib->reg_base + MCF_UART_URB));
141 return data;
142}
143
144/*
145 * 送信する文字の書込み
146 */
147Inline void
148mcfuart_putchar (SIOPCB * siopcb, char c)
149{
150 /* Send the character */
151 sil_wrb_mem ((VB*)(siopcb->siopinib->reg_base + MCF_UART_UTB), c);
152}
153
154/*
155 * SIOドライバの初期化ルーチン
156 */
157void
158mcfuart_initialize ()
159{
160 SIOPCB *siopcb;
161 UINT i;
162 /*
163 * シルアルI/Oポート管理ブロックの初期化
164 */
165 for (siopcb = siopcb_table, i = 0; i < TNUM_PORT; siopcb++, i++) {
166 siopcb->openflag = FALSE;
167 siopcb->siopinib = (&siopinib_table[i]);
168 }
169}
170
171/*
172 * オープンしているポートがあるか?
173 */
174BOOL
175mcfuart_openflag (ID siopid)
176{
177 return (siopcb_table[siopid -1].openflag);
178}
179
180/*
181 * シリアルI/Oポートのオープン
182 */
183SIOPCB *
184mcfuart_opn_por (ID siopid, VP_INT exinf)
185{
186 volatile int i;
187 SIOPCB *siopcb = get_siopcb(siopid);
188 // 送信停止
189 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + MCF_UART_UCR), (VB) (MCF_UART_UCR_MISC_RR));
190 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + MCF_UART_UCR), (VB) (MCF_UART_UCR_MISC_RT));
191 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + MCF_UART_UCR), (VB) (MCF_UART_UCR_MISC_RRC));
192
193 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + MCF_UART_UMR1), 0x93);
194 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + MCF_UART_UMR2), 0x07);
195 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + MCF_UART_UCSR), 0xDD);
196
197 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + MCF_UART_UBG1), (VB) (siopcb->siopinib->brr >> 8));
198 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + MCF_UART_UBG2), (VB) (siopcb->siopinib->brr & 0x00ff));
199
200 /* 割込み許可 */
201 siopcb->imr = (VB)MCF_UART_UIMR_RXRDY;
202 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + MCF_UART_UIMR), (VB) (siopcb->imr));
203
204 /* 送受信許可 */
205 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + MCF_UART_UCR), (VB) (MCF_UART_UCR_TC_EN | MCF_UART_UCR_RC_EN));
206
207 siopcb->exinf = exinf;
208 siopcb->openflag = TRUE;
209 if (siopcb->siopinib->reg_base == (IPSBAR + 0x00000200)) {
210 sil_wrw_mem ((VW*)MCF_INTC_IMRL(MCF_INTC0), sil_rew_mem((VW*)MCF_INTC_IMRL(MCF_INTC0)) & (~(1 << (TBIT_GP0))));
211 } else if (siopcb->siopinib->reg_base == (IPSBAR + 0x00000240)) {
212 sil_wrw_mem ((VW*)MCF_INTC_IMRL(MCF_INTC0), sil_rew_mem((VW*)MCF_INTC_IMRL(MCF_INTC0)) & (~(1 << (TBIT_GP1))));
213 }
214 for (i = 0; i < 1000;i++);
215 return (siopcb);
216}
217
218/*
219 * シリアルI/Oポートのクローズ
220 */
221void
222mcfuart_cls_por (SIOPCB * siopcb)
223{
224 /* 送受信禁止 */
225 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + MCF_UART_UCSR),
226 (VB) (MCF_UART_UCR_TC_DIS | MCF_UART_UCR_RC_DIS));
227 /* 割込み禁止 */
228 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + MCF_UART_UIMR), 0);
229 if (siopcb->siopinib->reg_base == (IPSBAR + 0x00000200)) {
230 sil_wrw_mem (MCF_INTC_IMRL(MCF_INTC0), sil_rew_mem(MCF_INTC_IMRL(MCF_INTC0)) | (1 << TBIT_GP0));
231 } else if (siopcb->siopinib->reg_base == (IPSBAR + 0x00000240)) {
232 sil_wrw_mem (MCF_INTC_IMRL(MCF_INTC0), sil_rew_mem(MCF_INTC_IMRL(MCF_INTC0)) | (1 << TBIT_GP1));
233 }
234 siopcb->openflag = FALSE;
235}
236
237/*
238 * シリアルI/Oポートへの文字送信
239 */
240BOOL
241mcfuart_snd_chr (SIOPCB * siopcb, char c)
242{
243 if (mcfuart_putready (siopcb)) {
244 mcfuart_putchar (siopcb, c);
245 return (TRUE);
246 }
247 return (FALSE);
248}
249
250/*
251 * シリアルI/Oポートからの文字受信
252 */
253INT
254mcfuart_rcv_chr (SIOPCB * siopcb)
255{
256 if (mcfuart_getready (siopcb)) {
257 return ((INT) (UB) mcfuart_getchar (siopcb));
258 }
259 return (-1);
260}
261
262/*
263 * シリアルI/Oポートからのコールバックの許可
264 */
265void
266mcfuart_ena_cbr (SIOPCB * siopcb, UINT cbrtn)
267{
268 switch (cbrtn) {
269 case SIO_ERDY_SND: /* 送信割り込み要求を許可 */
270 siopcb->imr |= MCF_UART_UIMR_TXRDY;
271 break;
272 case SIO_ERDY_RCV: /* 受信割り込み要求を許可 */
273 siopcb->imr |= MCF_UART_UIMR_RXRDY;
274 break;
275 }
276 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + MCF_UART_UIMR), siopcb->imr);
277}
278
279/*
280 * シリアルI/Oポートからのコールバックの禁止
281 */
282void
283mcfuart_dis_cbr (SIOPCB * siopcb, UINT cbrtn)
284{
285 switch (cbrtn) {
286 case SIO_ERDY_SND: /* 送信割り込み要求を禁止 */
287 siopcb->imr &= ~MCF_UART_UIMR_TXRDY;
288 break;
289 case SIO_ERDY_RCV: /* 受信割り込み要求を禁止 */
290 siopcb->imr &= ~MCF_UART_UIMR_RXRDY;
291 break;
292 }
293 sil_wrb_mem ((VB *) (siopcb->siopinib->reg_base + MCF_UART_UIMR), siopcb->imr);
294}
295
296/*
297 * ポーリングによる文字の送信
298 */
299void
300mcfuart_putc_pol (ID portid, char c)
301{
302 while (!mcfuart_putready (&siopcb_table[portid - 1]));
303 mcfuart_putchar (&siopcb_table[portid - 1], c);
304}
305
306/*
307 * シリアルI/Oポートに対する送信割込み処理
308 */
309Inline void
310mcfuart_isr_siop (SIOPCB * siopcb)
311{
312 VB uisr = sil_reb_mem ((VB *) (siopcb->siopinib->reg_base + MCF_UART_UISR));
313 uisr &= siopcb->imr;
314 if ((uisr & MCF_UART_UISR_TXRDY) && mcfuart_putready (siopcb)) {
315 /*
316 * 送信通知コールバックルーチンを呼び出す.
317 */
318 mcfuart_ierdy_snd (siopcb->exinf);
319 }
320 else if ((uisr & MCF_UART_UISR_RXRDY) && mcfuart_getready (siopcb)) {
321 /*
322 * 送信通知コールバックルーチンを呼び出す.
323 */
324 mcfuart_ierdy_rcv (siopcb->exinf);
325 }
326}
327
328/* 割り込み検出 */
329void
330mcfuart_isr (void)
331{
332 if (siopcb_table[0].openflag) {
333 mcfuart_isr_siop (get_siopcb (1));
334 }
335}
336
337#if TNUM_PORT >= 2
338/* 割り込み検出 */
339void
340mcfuart_isr2 (void)
341{
342
343 if (siopcb_table[1].openflag) {
344 mcfuart_isr_siop (get_siopcb (2));
345 }
346}
347#endif
Note: See TracBrowser for help on using the repository browser.