source: EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/rza1/tSCIF.c@ 429

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

ASP3, TINET, mbed を更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 8.2 KB
Line 
1/*
2 * TOPPERS Software
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 *
5 * Copyright (C) 2006-2019 by Embedded and Real-Time Systems Laboratory
6 * Graduate School of Information Science, Nagoya Univ., JAPAN
7 *
8 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
9 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
10 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
11 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
12 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
13 * スコード中に含まれていること.
14 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
15 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
16 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
17 * の無保証規定を掲載すること.
18 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
19 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
20 * と.
21 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
22 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
23 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
24 * 報告すること.
25 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
26 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
27 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
28 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
29 * 免責すること.
30 *
31 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
33 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
34 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
35 * の責任を負わない.
36 *
37 * $Id$
38 */
39
40/*
41 * FIFO内蔵シリアルコミュニケーションインタフェース用 簡易SIOドライバ
42 */
43
44#include <sil.h>
45#include "tSCIF_tecsgen.h"
46#include "scif.h"
47
48/*
49 * プリミティブな送信/受信関数
50 */
51
52/*
53 * 受信バッファに文字があるか?
54 */
55Inline bool_t
56scif_getready(CELLCB *p_cellcb)
57{
58 uint16_t fsr;
59 uint16_t lsr;
60
61 fsr = sil_reh_mem(SCIF_SCFSR(ATTR_baseAddress));
62 lsr = sil_reh_mem(SCIF_SCLSR(ATTR_baseAddress));
63 if ((fsr & (SCIF_SCFSR_ER|SCIF_SCFSR_BRK)) != 0U) {
64 fsr &= ~(SCIF_SCFSR_ER|SCIF_SCFSR_BRK);
65 sil_wrh_mem(SCIF_SCFSR(ATTR_baseAddress), fsr);
66 }
67 if ((lsr & SCIF_SCLSR_ORER) != 0U) {
68 lsr &= ~(SCIF_SCLSR_ORER);
69 sil_wrh_mem(SCIF_SCLSR(ATTR_baseAddress), lsr);
70 }
71 return((fsr & SCIF_SCFSR_RDF) != 0U);
72}
73
74/*
75 * 送信バッファに空きがあるか?
76 */
77Inline bool_t
78scif_putready(CELLCB *p_cellcb)
79{
80 uint16_t fsr;
81
82 fsr = sil_reh_mem(SCIF_SCFSR(ATTR_baseAddress));
83 return((fsr & SCIF_SCFSR_TDFE) != 0U);
84}
85
86/*
87 * 受信した文字の取出し
88 */
89Inline bool_t
90scif_getchar(CELLCB *p_cellcb, char *p_c)
91{
92 uint16_t fsr;
93 uint16_t lsr;
94
95 fsr = sil_reh_mem(SCIF_SCFSR(ATTR_baseAddress));
96 lsr = sil_reh_mem(SCIF_SCLSR(ATTR_baseAddress));
97 if ((fsr & (SCIF_SCFSR_ER|SCIF_SCFSR_BRK)) != 0U) {
98 fsr &= ~(SCIF_SCFSR_ER|SCIF_SCFSR_BRK);
99 sil_wrh_mem(SCIF_SCFSR(ATTR_baseAddress), fsr);
100 }
101 if ((lsr & SCIF_SCLSR_ORER) != 0U) {
102 lsr &= ~(SCIF_SCLSR_ORER);
103 sil_wrh_mem(SCIF_SCLSR(ATTR_baseAddress), lsr);
104 }
105 if ((fsr & SCIF_SCFSR_RDF) != 0U) {
106 *p_c = (char) sil_reb_mem(SCIF_SCFRDR(ATTR_baseAddress));
107 fsr &= ~(SCIF_SCFSR_RDF);
108 sil_wrh_mem(SCIF_SCFSR(ATTR_baseAddress), fsr);
109 return(true);
110 }
111 return(false);
112}
113
114/*
115 * 送信する文字の書込み
116 */
117Inline void
118scif_putchar(CELLCB *p_cellcb, char c)
119{
120 sil_wrb_mem(SCIF_SCFTDR(ATTR_baseAddress), c);
121 sil_wrh_mem(SCIF_SCFSR(ATTR_baseAddress),
122 (uint16_t) ~(SCIF_SCFSR_TEND|SCIF_SCFSR_TDFE));
123}
124
125/*
126 * シリアルI/Oポートのオープン
127 */
128void
129eSIOPort_open(CELLIDX idx)
130{
131 CELLCB *p_cellcb = GET_CELLCB(idx);
132 uint_t brr;
133
134 if (!VAR_opened) {
135 /*
136 * 既にオープンしている場合は、二重にオープンしない.
137 */
138 brr = SCIF_CLK / (32 * ATTR_baudRate) - 1;
139 assert(brr <= 255);
140
141 sil_wrh_mem(SCIF_SCSCR(ATTR_baseAddress), 0U);
142 sil_wrh_mem(SCIF_SCFCR(ATTR_baseAddress),
143 SCIF_SCFCR_TFRST|SCIF_SCFCR_RFRST);
144 (void) sil_reh_mem(SCIF_SCFSR(ATTR_baseAddress));
145 (void) sil_reh_mem(SCIF_SCLSR(ATTR_baseAddress));
146 sil_wrh_mem(SCIF_SCFSR(ATTR_baseAddress), 0U);
147 sil_wrh_mem(SCIF_SCLSR(ATTR_baseAddress), 0U);
148 sil_wrh_mem(SCIF_SCSCR(ATTR_baseAddress), SCIF_SCSCR_INTCLK);
149 sil_wrh_mem(SCIF_SCSMR(ATTR_baseAddress),
150 SCIF_SCSMR_ASYNC|ATTR_mode|SCIF_SCSMR_CKS1);
151 sil_wrh_mem(SCIF_SCEMR(ATTR_baseAddress), 0U);
152 sil_wrb_mem(SCIF_SCBRR(ATTR_baseAddress), (uint8_t) brr);
153 sil_wrh_mem(SCIF_SCFCR(ATTR_baseAddress),
154 SCIF_SCFCR_RSTRG_15|SCIF_SCFCR_RTRG_1|SCIF_SCFCR_TTRG_8);
155 sil_wrh_mem(SCIF_SCSCR(ATTR_baseAddress),
156 SCIF_SCSCR_TE|SCIF_SCSCR_RE|SCIF_SCSCR_INTCLK);
157
158 while ((sil_reh_mem(SCIF_SCFSR(ATTR_baseAddress)) & SCIF_SCFSR_RDF)
159 != 0U) {
160 (void) sil_reb_mem(SCIF_SCFRDR(ATTR_baseAddress));
161 sil_wrh_mem(SCIF_SCFSR(ATTR_baseAddress),
162 (uint16_t) ~(SCIF_SCFSR_RDF));
163 }
164 sil_wrh_mem(SCIF_SCFSR(ATTR_baseAddress), 0U);
165
166 VAR_opened = true;
167 }
168}
169
170/*
171 * シリアルI/Oポートのクローズ
172 */
173void
174eSIOPort_close(CELLIDX idx)
175{
176 CELLCB *p_cellcb = GET_CELLCB(idx);
177
178 if (VAR_opened) {
179 sil_wrh_mem(SCIF_SCSCR(ATTR_baseAddress), 0U);
180
181 VAR_opened = false;
182 }
183}
184
185/*
186 * シリアルI/Oポートへの文字送信
187 */
188bool_t
189eSIOPort_putChar(CELLIDX idx, char c)
190{
191 CELLCB *p_cellcb = GET_CELLCB(idx);
192
193 if (scif_putready(p_cellcb)){
194 scif_putchar(p_cellcb, c);
195 return(true);
196 }
197 return(false);
198}
199
200/*
201 * シリアルI/Oポートからの文字受信
202 */
203int_t
204eSIOPort_getChar(CELLIDX idx)
205{
206 CELLCB *p_cellcb = GET_CELLCB(idx);
207 char c;
208
209 if (scif_getready(p_cellcb)) {
210 if (scif_getchar(p_cellcb, &c)) {
211 return((int_t) c);
212 }
213 }
214 return(-1);
215}
216
217/*
218 * シリアルI/Oポートからのコールバックの許可
219 */
220void
221eSIOPort_enableCBR(CELLIDX idx, uint_t cbrtn)
222{
223 CELLCB *p_cellcb = GET_CELLCB(idx);
224 uint16_t scr;
225
226 scr = sil_reh_mem(SCIF_SCSCR(ATTR_baseAddress));
227 switch (cbrtn) {
228 case SIOSendReady:
229 scr |= SCIF_SCSCR_TIE;
230 break;
231 case SIOReceiveReady:
232 scr |= SCIF_SCSCR_RIE;
233 break;
234 }
235 sil_wrh_mem(SCIF_SCSCR(ATTR_baseAddress), scr);
236}
237
238/*
239 * シリアルI/Oポートからのコールバックの禁止
240 */
241void
242eSIOPort_disableCBR(CELLIDX idx, uint_t cbrtn)
243{
244 CELLCB *p_cellcb = GET_CELLCB(idx);
245 uint16_t scr;
246
247 scr = sil_reh_mem(SCIF_SCSCR(ATTR_baseAddress));
248 switch (cbrtn) {
249 case SIOSendReady:
250 scr &= ~(SCIF_SCSCR_TIE);
251 break;
252 case SIOReceiveReady:
253 scr &= ~(SCIF_SCSCR_RIE);
254 break;
255 }
256 sil_wrh_mem(SCIF_SCSCR(ATTR_baseAddress), scr);
257}
258
259/*
260 * シリアルI/Oポートに対する受信割込み処理
261 */
262void
263eiRxISR_main(CELLIDX idx)
264{
265 CELLCB *p_cellcb = GET_CELLCB(idx);
266
267 if (scif_getready(p_cellcb)) {
268 /*
269 * 受信通知コールバックルーチンを呼び出す.
270 */
271 ciSIOCBR_readyReceive();
272 }
273}
274
275/*
276 * シリアルI/Oポートに対する送信割込み処理
277 */
278void
279eiTxISR_main(CELLIDX idx)
280{
281 CELLCB *p_cellcb = GET_CELLCB(idx);
282
283 if (scif_putready(p_cellcb)) {
284 /*
285 * 送信可能コールバックルーチンを呼び出す.
286 */
287 ciSIOCBR_readySend();
288 }
289}
290
291/*
292 * SIOドライバの終了処理
293 */
294void
295eTerminate_main(CELLIDX idx)
296{
297 CELLCB *p_cellcb = GET_CELLCB(idx);
298
299 if (VAR_opened) {
300 /*
301 * 送信FIFOが空になるまで待つ
302 */
303 while ((sil_reh_mem(SCIF_SCFSR(ATTR_baseAddress))
304 & SCIF_SCFSR_TEND) == 0U) ;
305 /*
306 * ポートのクローズ
307 */
308 eSIOPort_close(idx);
309 }
310}
Note: See TracBrowser for help on using the repository browser.