source: asp3_tinet_ecnl_rx/trunk/asp3_dcre/arch/rx630_gcc/tSCIF.c@ 337

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

ASP3版ECNLを追加

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