source: asp3_tinet_ecnl_arm/trunk/asp3_dcre/arch/arm_gcc/rza1/tSCIF.c@ 352

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

arm向けASP3版ECNLを追加

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