source: asp3_gr_sakura/trunk/arch/rx630_gcc/tSCIF.c@ 317

Last change on this file since 317 was 317, checked in by coas-nagasima, 7 years ago

GR-SAKURA向けASP3を追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 8.4 KB
Line 
1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2006-2016 by Embedded and Real-Time Systems Laboratory
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 * Copyright (C) 2017 by Cores Co., Ltd. Japan
9 *
10 * 上記著作権者
11は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
12 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13 * 変・再é…
14å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
15 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * スコード中に含まれていること.
18 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19 * 用できる形で再é…
20å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
21å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
22 * 者
23マニュアルなど)に,上記の著作権表示,この利用条件および下記
24 * の無保証規定を掲載すること.
25 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
26 * 用できない形で再é…
27å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
28 * と.
29 * (a) 再é…
30å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
31マニュアルなど)に,上記の著
32 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
33 * (b) 再é…
34å¸ƒã®å½¢æ…
35‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
36 * 報告すること.
37 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
38 * 害からも,上記著作権者
39およびTOPPERSプロジェクトをå…
40è²¬ã™ã‚‹ã“と.
41 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
42 * 由に基づく請求からも,上記著作権者
43およびTOPPERSプロジェクトを
44 * å…
45è²¬ã™ã‚‹ã“と.
46 *
47 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
48お
49 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
50 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
51 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
52 * の責任を負わない.
53 *
54 * $Id: tSCIF.c 317 2017-08-03 13:14:26Z coas-nagasima $
55 */
56
57/*
58 * FIFO内
59蔵シリアルコミュニケーションインタフェース用 簡易SIOドライバ
60 */
61
62#include <sil.h>
63#include "tSCIF_tecsgen.h"
64#include "scif.h"
65
66/*
67 * プリミティブな送信/受信関数
68 */
69
70/*
71 * 受信バッファに文字があるか?
72 */
73Inline bool_t
74scif_getready(CELLCB *p_cellcb)
75{
76 /*
77 * 受信フラグがONのときのみ受信バッファから文字を取得する.
78 * これは, ポーリング受信に対応するためである.
79 * しかし, RX600シリーズでは受信フラグがないこと, システムサービス
80 * では受信割込みの中からしかデータを受信しに来ないことから, 常に
81 * 受信バッファから文字を取得する.
82 */
83 return true;
84}
85
86/*
87 * 送信バッファに空きがあるか?
88 */
89Inline bool_t
90scif_putready(CELLCB *p_cellcb)
91{
92 if((sil_reb_mem(SCI_SSR(ATTR_baseAddress)) & SCI_SSR_TEND_BIT) != 0){
93 return(true);
94 }
95 return(false);
96}
97
98/*
99 * 送信する文字の書込み
100 */
101Inline void
102scif_putchar(CELLCB *p_cellcb, char c)
103{
104 sil_wrb_mem(SCI_TDR(ATTR_baseAddress), c);
105}
106
107/*
108 * シリアルI/Oポートのオープン
109 */
110void
111eSIOPort_open(CELLIDX idx)
112{
113 CELLCB *p_cellcb = GET_CELLCB(idx);
114 uint_t cnt, brr, clk;
115 volatile uint8_t i;
116
117 if (VAR_initialized) {
118 /*
119 * 既に初期化している場合は、二重に初期化しない.
120 */
121 return;
122 }
123
124 cnt = (FREQ_PCLK * 1000) / (16 * ATTR_baudRate);
125 if (cnt < 512)
126 clk = 0;
127 else if (cnt < 4 * 512)
128 clk = 1;
129 else if (cnt < 16 * 512)
130 clk = 2;
131 else if (cnt < 64 * 512)
132 clk = 3;
133 else
134 return;
135
136 brr = cnt / (1 << (2 * clk));
137 brr = (brr / 2) + (brr % 2) - 1;
138
139 /*
140 * SCIドライバの初期化ルーチン
141 */
142
143 /*
144 * 割り込み要求å…
145ˆãƒ¬ã‚¸ã‚¹ã‚¿ã®è¨­å®š(ISELRi)
146 *
147 * リセット値と同じ値を設定することになるため,
148 * 処理は省略する.
149 */
150
151 /*
152 * モジュールストップ機能の設定
153 */
154 sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA502); /* 書込み許可 */
155 sil_wrw_mem(SYSTEM_MSTPCRB_ADDR,
156 sil_rew_mem(SYSTEM_MSTPCRB_ADDR) & ~SCI_MSTPCRB_BIT(ATTR_baseAddress));
157 sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA500); /* 書込み禁止 */
158
159 /* 送受信禁止, SCKn端子はå…
160¥å‡ºåŠ›ãƒãƒ¼ãƒˆã¨ã—て使用 */
161 sil_wrb_mem(SCI_SCR(ATTR_baseAddress), 0x00U);
162
163 /* クロック選択ビット(SMR.CKS[1:0]ビットを設定) */
164 sil_wrb_mem(SCI_SMR(ATTR_baseAddress),
165 (sil_reb_mem(SCI_SMR(ATTR_baseAddress)) & ~0x03) | clk);
166
167 /* SMRに送信/ 受信フォーマットを設定) */
168 sil_wrb_mem(SCI_SMR(ATTR_baseAddress),
169 sil_reb_mem(SCI_SMR(ATTR_baseAddress)) & (~SCI_SMR_FLG_ENABLE));
170
171 /* ビットレートを設定 */
172 sil_wrb_mem(SCI_BRR(ATTR_baseAddress), brr);
173
174 /* ビット期間(基本クロック16サイクルの期間が1ビット期間となる) */
175 for(i = 0; i < 16; i++) { }
176
177 /* 送受信許可 */
178 sil_wrb_mem(SCI_SCR(ATTR_baseAddress),
179 (sil_reb_mem(SCI_SCR(ATTR_baseAddress)) | SCI_SCR_FLG_ENABLE));
180
181 VAR_initialized = true;
182}
183
184/*
185 * シリアルI/Oポートのクローズ
186 */
187void
188eSIOPort_close(CELLIDX idx)
189{
190 CELLCB *p_cellcb = GET_CELLCB(idx);
191
192 /*
193 * UART停止
194 */
195 sil_wrb_mem(SCI_SCR(ATTR_baseAddress), 0x00U);
196}
197
198/*
199 * シリアルI/Oポートへの文字送信
200 */
201bool_t
202eSIOPort_putChar(CELLIDX idx, char c)
203{
204 CELLCB *p_cellcb = GET_CELLCB(idx);
205
206 if (scif_putready(p_cellcb)){
207 scif_putchar(p_cellcb, c);
208 return(true);
209 }
210 return(false);
211}
212
213/*
214 * シリアルI/Oポートからの文字受信
215 */
216int_t
217eSIOPort_getChar(CELLIDX idx)
218{
219 CELLCB *p_cellcb = GET_CELLCB(idx);
220 uint8_t reg;
221 int_t c = -1;
222
223 /* オーバランエラーチェック */ /* ZZZ */
224 reg = sil_reb_mem(SCI_SSR(ATTR_baseAddress));
225 while((reg & SCI_SSR_ORER_BIT) != 0) {
226 sil_wrb_mem(SCI_SSR(ATTR_baseAddress), reg & ~SCI_SSR_ORER_BIT);
227 reg = sil_reb_mem(SCI_SSR(ATTR_baseAddress));
228 }
229
230 /*
231 * 受信フラグがONのときのみ受信バッファから文字を取得する.
232 * これは, ポーリング受信に対応するためである.
233 * しかし, RX600シリーズでは受信フラグがないこと, システムサービス
234 * では受信割込みの中からしかデータを受信しに来ないことから, 常に
235 * 受信バッファから文字を取得する.
236 */
237 c = (int)(sil_reb_mem(SCI_RDR(ATTR_baseAddress)));
238
239 return c;
240}
241
242/*
243 * シリアルI/Oポートからのコールバックの許可
244 */
245void
246eSIOPort_enableCBR(CELLIDX idx, uint_t cbrtn)
247{
248 CELLCB *p_cellcb = GET_CELLCB(idx);
249
250 switch (cbrtn) {
251 case SIO_RDY_SND:
252 sil_wrb_mem(SCI_SCR(ATTR_baseAddress),
253 (sil_reb_mem(SCI_SCR(ATTR_baseAddress)) | SCI_SCR_TEIE_BIT));
254 break;
255 case SIO_RDY_RCV:
256 sil_wrb_mem(SCI_SCR(ATTR_baseAddress),
257 (sil_reb_mem(SCI_SCR(ATTR_baseAddress)) | SCI_SCR_RIE_BIT));
258 break;
259 default:
260 assert(1);
261 break;
262 }
263}
264
265/*
266 * シリアルI/Oポートからのコールバックの禁止
267 */
268void
269eSIOPort_disableCBR(CELLIDX idx, uint_t cbrtn)
270{
271 CELLCB *p_cellcb = GET_CELLCB(idx);
272
273 switch (cbrtn) {
274 case SIO_RDY_SND:
275 sil_wrb_mem(SCI_SCR(ATTR_baseAddress),
276 (sil_reb_mem(SCI_SCR(ATTR_baseAddress)) & (~SCI_SCR_TEIE_BIT)));
277 break;
278 case SIO_RDY_RCV:
279 sil_wrb_mem(SCI_SCR(ATTR_baseAddress),
280 (sil_reb_mem(SCI_SCR(ATTR_baseAddress)) & (~SCI_SCR_RIE_BIT)));
281 break;
282 default:
283 assert(1);
284 break;
285 }
286}
287
288/*
289 * シリアルI/Oポートに対する受信割込み処理
290 */
291void
292eiRxISR_main(CELLIDX idx)
293{
294 CELLCB *p_cellcb = GET_CELLCB(idx);
295
296 if (scif_getready(p_cellcb)) {
297 /*
298 * 受信通知コールバックルーチンを呼び出す.
299 */
300 ciSIOCBR_readyReceive();
301 }
302}
303
304/*
305 * シリアルI/Oポートに対する送信割込み処理
306 */
307void
308eiTxISR_main(CELLIDX idx)
309{
310 CELLCB *p_cellcb = GET_CELLCB(idx);
311
312 if (scif_putready(p_cellcb)) {
313 /*
314 * 送信可能コールバックルーチンを呼び出す.
315 */
316 ciSIOCBR_readySend();
317 }
318}
Note: See TracBrowser for help on using the repository browser.