source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/armv4/at91sam7s/at91sam7s.c@ 26

Last change on this file since 26 was 26, checked in by ykominami, 12 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) 2003 by Advanced Data Controls, Corp
9 * Copyright (C) 2004 by Embedded and Real-Time Systems Laboratory
10 * Graduate School of Information Science, Nagoya Univ., 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/*
59 * At91sam7s 内
60部機能用ドライバ
61 */
62#include <s_services.h>
63#include <at91sam7s.h>
64
65#define BAUDRATE 115200
66
67/*
68 * シリアルI/Oポート初期化ブロック
69 */
70const SIOPINIB siopinib_table[TNUM_SIOP] = {
71 {(VP)(TADR_DBGU_BASE), (VP)(TADR_PIO_BASE+TOFF_PIO_PDR),
72 (VP)0,
73 (VW)((1<<9)|(1<<10)), 0
74 }
75#if TNUM_SIOP >= 2
76 ,
77 {(VP)(TADR_US_BASE+US_WINDOW), (VP)(TADR_PIO_BASE+TOFF_PIO_PDR),
78 (VP)(TADR_PMC_BASE+TOFF_PMC_PCER),
79 (VW)((1<<21)|(1<<22)), 1<<IRQ_US1_PID
80 }
81
82#endif /* TNUM_SIOP >= 2 */
83};
84
85
86/*
87 * シリアルI/Oポート管理ブロックのエリア
88 */
89SIOPCB siopcb_table[TNUM_SIOP];
90
91
92/*
93 * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
94 */
95#define INDEX_SIOP(siopid) ((UINT)((siopid) - 1))
96#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))
97
98
99/*
100 * 文字を受信したか?
101 */
102Inline BOOL
103uart_getready(SIOPCB *siopcb)
104{
105 return(((sil_rew_mem((VP)(siopcb->siopinib->uart_base+TOFF_US_CSR)) & US_RXRDY)!=0));
106}
107
108/*
109 * 文字を送信できるか?
110 */
111Inline BOOL
112uart_putready(SIOPCB *siopcb)
113{
114 return((sil_rew_mem((VP)(siopcb->siopinib->uart_base+TOFF_US_CSR)) & US_TXEMPTY)!=0);
115}
116
117/*
118 * 受信した文字の取り出し
119 */
120Inline UB
121uart_getchar(SIOPCB *siopcb)
122{
123 return(sil_rew_mem((VP)(siopcb->siopinib->uart_base+TOFF_US_RHR)));
124}
125
126/*
127 * 送信する文字の書き込み
128 */
129Inline void
130uart_putchar(SIOPCB *siopcb, UB c)
131{
132 sil_wrw_mem((VP)(siopcb->siopinib->uart_base+TOFF_US_THR),c);
133}
134
135/*
136 * 送信割込み許可
137 */
138Inline void
139uart_enable_send(SIOPCB *siopcb)
140{
141 sil_wrw_mem((VP)(siopcb->siopinib->uart_base+TOFF_US_IER), 1<<1);
142}
143
144/*
145 * 送信割込み禁止
146 */
147Inline void
148uart_disable_send(SIOPCB *siopcb)
149{
150 sil_wrw_mem((VP)(siopcb->siopinib->uart_base+TOFF_US_IDR), 1<<1);
151}
152
153
154/*
155 * 受信割込み許可
156 */
157Inline void
158uart_enable_rcv(SIOPCB *siopcb)
159{
160 sil_wrw_mem((VP)(siopcb->siopinib->uart_base+TOFF_US_IER), 1<<0);
161}
162
163/*
164 * 受信割込み禁止
165 */
166Inline void
167uart_disable_rcv(SIOPCB *siopcb)
168{
169 sil_wrw_mem((VP)(siopcb->siopinib->uart_base+TOFF_US_IDR), 1<<0);
170}
171
172/*
173 * SIOドライバの初期化ルーチン
174 * 1ポートしかないため,あまり意味はない
175 */
176void
177uart_initialize()
178{
179 SIOPCB *siopcb;
180 UINT i;
181
182 /*
183 * シリアルI/Oポート管理ブロックの初期化
184 */
185 for (siopcb = siopcb_table, i = 0; i < TNUM_SIOP; siopcb++, i++) {
186 siopcb->siopinib = &(siopinib_table[i]);
187 siopcb->openflag = FALSE;
188 siopcb->sendflag = FALSE;
189 }
190}
191
192/*
193 * オープンしているポートがあるか
194 */
195BOOL
196uart_openflag(void)
197{
198 return(siopcb_table[0].openflag);
199}
200
201/*
202 * シリアルI/Oポートのオープン
203 */
204SIOPCB *
205uart_opn_por(ID siopid, VP_INT exinf)
206{
207 unsigned int baud = ((MCK * 10) / (BAUDRATE * 16));
208
209 SIOPCB *siopcb;
210 const SIOPINIB *siopinib;
211
212 siopcb = get_siopcb(siopid);
213 siopinib = siopcb->siopinib;
214
215 /*
216 * Wait をå…
217¥ã‚Œã‚‹ï¼Ž
218 */
219 sil_dly_nse(5000);
220
221 if(siopinib->pmc_pcer)
222 sil_wrw_mem((VP)siopinib->pmc_pcer, siopinib->irq_bit);
223 /* Disable Interrupt */
224 sil_wrw_mem((VP)(siopinib->uart_base+TOFF_US_IDR), 0xFFFFFFFF);
225 sil_wrw_mem((VP)(siopinib->uart_base+TOFF_US_CR), (US_RSTRX|US_RSTTX|US_RXDIS|US_TXDIS));
226 sil_wrw_mem((VP)(siopinib->uart_base+TOFF_PDC_RCR), 0);
227 sil_wrw_mem((VP)(siopinib->uart_base+TOFF_PDC_TCR), 0);
228 sil_wrw_mem((VP)siopinib->linectrl_pdr, siopinib->pdr_bit);
229 /* 8Data, 1Stop, No Parity */
230 sil_wrw_mem((VP)(siopinib->uart_base+TOFF_US_MR), (US_CLKS_MCK|US_CHRL_8|US_PAR_NO|US_NBSTOP_1|US_CHMODE_NORMAL));
231 /* 115200bps */
232 if((baud % 10) >= 5)
233 sil_wrw_mem((VP)(siopinib->uart_base+TOFF_US_BRGR), (baud/10)+1);
234 else
235 sil_wrw_mem((VP)(siopinib->uart_base+TOFF_US_BRGR), (baud/10));
236
237 /*
238 * 割込み関連の設定
239 */
240 if(siopinib->pmc_pcer){
241 sil_wrw_mem((VP)(siopinib->uart_base+TOFF_US_TTGR), 0);
242 sil_wrw_mem((VP)(siopinib->uart_base+TOFF_US_CR), US_TXEN|US_RXEN);
243 sil_wrw_mem((VP)(siopinib->uart_base+TOFF_US_IER), 1<<0);
244 }
245 else{
246 /* クロックイネーブル */
247 sil_wrw_mem((VP)(TADR_PMC_BASE+TOFF_PMC_PCER), (1<<IRQ_TC2_PID));
248 /* タイマ停止 */
249 sil_wrw_mem((VP)(TADR_TC_BASE+TC_WINDOW*2+TOFF_TC_CCR), TC_CLKDIS);
250 sil_wrw_mem((VP)(TADR_TC_BASE+TC_WINDOW*2+TOFF_TC_IDR), 0xFFFFFFFF);
251 /* カウント値をセット */
252 sil_wrw_mem((VP)(TADR_TC_BASE+TC_WINDOW*2+TOFF_TC_CMR), TC_CLKS_MCK8); /* 47,923,200Hz/8=5,990,400Hz */
253 sil_wrw_mem((VP)(TADR_TC_BASE+TC_WINDOW*2+TOFF_TC_CMR), sil_rew_mem((VP)(TADR_TC_BASE+TC_WINDOW*2+TOFF_TC_CMR)) | TC_WAVESEL10);
254 sil_wrw_mem((VP)(TADR_TC_BASE+TC_WINDOW*2+TOFF_TC_RC), 59900); /* 10ms */
255 /* 割込みのクリア */
256 sil_wrw_mem((VP)(TADR_TC_BASE+TC_WINDOW*2+TOFF_TC_IER), TC_CPCS);
257 /* カウントスタート */
258 sil_wrw_mem((VP)(TADR_TC_BASE+TC_WINDOW*2+TOFF_TC_CCR), (TC_CLKEN|TC_SWTRG));
259
260 sil_wrw_mem((VP)(siopinib->uart_base+TOFF_US_CR), US_TXEN|US_RXEN);
261 }
262 sil_rew_mem((VP)(siopinib->uart_base+TOFF_US_RHR));
263
264 siopcb->exinf = exinf;
265 siopcb->getready = siopcb->putready = FALSE;
266 siopcb->openflag = TRUE;
267
268 return(siopcb);
269}
270
271
272
273/*
274 * シリアルI/Oポートのクローズ
275 */
276void
277uart_cls_por(SIOPCB *siopcb)
278{
279 const SIOPINIB *siopinib;
280
281 siopinib = siopcb->siopinib;
282 sil_wrw_mem((VP)(siopinib->uart_base+TOFF_US_CR), US_RSTRX|US_RSTTX|US_RXDIS|US_TXDIS);
283 siopcb->openflag = FALSE;
284}
285
286/*
287 * シリアルI/Oポートへの文字送信
288 */
289BOOL
290uart_snd_chr(SIOPCB *siopcb, char c)
291{
292 if(siopcb->siopinib->pmc_pcer == 0){
293 while(!uart_putready(siopcb));
294 uart_putchar(siopcb, c);
295 return(TRUE);
296 }
297 else if (uart_putready(siopcb)){
298 uart_putchar(siopcb, c);
299 return(TRUE);
300 }
301 return(FALSE);
302}
303
304/*
305 * シリアルI/Oポートからの文字受信
306 */
307INT
308uart_rcv_chr(SIOPCB *siopcb)
309{
310 if (uart_getready(siopcb)) {
311 return((INT)(UB) uart_getchar(siopcb));
312 }
313 return(-1);
314}
315
316/*
317 * シリアルI/Oポートからのコールバックの許可
318 */
319void
320uart_ena_cbr(SIOPCB *siopcb, UINT cbrtn)
321{
322 switch (cbrtn) {
323 case SIO_ERDY_SND:
324 uart_enable_send(siopcb);
325 break;
326 case SIO_ERDY_RCV:
327 uart_enable_rcv(siopcb);
328 break;
329 }
330}
331
332
333/*
334 * シリアルI/Oポートからのコールバックの禁止
335 */
336void
337uart_dis_cbr(SIOPCB *siopcb, UINT cbrtn)
338{
339 switch (cbrtn) {
340 case SIO_ERDY_SND:
341 uart_disable_send(siopcb);
342 break;
343 case SIO_ERDY_RCV:
344 uart_disable_rcv(siopcb);
345 break;
346 }
347}
348
349
350
351/*
352 * シリアルI/Oポートに対する割込み処理
353 */
354static void
355uart_isr_siop(SIOPCB *siopcb)
356{
357 if (uart_getready(siopcb)) {
358 /*
359 * 受信通知コールバックルーチンを呼び出す.
360 */
361 uart_ierdy_rcv(siopcb->exinf);
362 }
363 if (uart_putready(siopcb)) {
364 /*
365 * 送信可能コールバックルーチンを呼び出す.
366 */
367 uart_ierdy_snd(siopcb->exinf);
368 }
369}
370
371
372/*
373 * SIOの割込みサービスルーチン
374 */
375void
376int_timer2()
377{
378 SIOPCB *siopcb = &(siopcb_table[0]);
379
380 sil_rew_mem((VP)(TADR_TC_BASE+TC_WINDOW*2+TOFF_TC_SR));
381 if (uart_getready(siopcb)) {
382 /*
383 * 受信通知コールバックルーチンを呼び出す.
384 */
385 uart_ierdy_rcv(siopcb->exinf);
386 }
387}
388
389#if TNUM_SIOP >= 2
390void
391uart_isr1()
392{
393 uart_isr_siop(&(siopcb_table[1]));
394}
395#endif
Note: See TracBrowser for help on using the repository browser.