source: azure_iot_hub/trunk/asp3_dcre/arch/rx630_gcc/tSCIF.c@ 388

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

Azure IoT Hub Device C SDK を使ったサンプルの追加

  • 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.5 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 388 2019-05-22 11:25:18Z 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#include "target_kernel_impl.h"
66
67/*
68 * プリミティブな送信/受信関数
69 */
70
71/*
72 * 受信バッファに文字があるか?
73 */
74Inline bool_t
75scif_getready(CELLCB *p_cellcb)
76{
77 /*
78 * 受信フラグがONのときのみ受信バッファから文字を取得する.
79 * これは, ポーリング受信に対応するためである.
80 * しかし, RX600シリーズでは受信フラグがないこと, システムサービス
81 * では受信割込みの中からしかデータを受信しに来ないことから, 常に
82 * 受信バッファから文字を取得する.
83 */
84 return true;
85}
86
87/*
88 * 送信バッファに空きがあるか?
89 */
90Inline bool_t
91scif_putready(CELLCB *p_cellcb)
92{
93 if((sil_reb_mem(SCI_SSR(ATTR_baseAddress)) & SCI_SSR_TEND_BIT) != 0){
94 return(true);
95 }
96 return(false);
97}
98
99/*
100 * 送信する文字の書込み
101 */
102Inline void
103scif_putchar(CELLCB *p_cellcb, char c)
104{
105 sil_wrb_mem(SCI_TDR(ATTR_baseAddress), c);
106}
107
108/*
109 * シリアルI/Oポートのオープン
110 */
111void
112eSIOPort_open(CELLIDX idx)
113{
114 CELLCB *p_cellcb = GET_CELLCB(idx);
115 uint_t cnt, brr, clk;
116 volatile uint8_t i;
117
118 if (VAR_initialized) {
119 /*
120 * 既に初期化している場合は、二重に初期化しない.
121 */
122 return;
123 }
124
125 cnt = (FREQ_PCLK * 1000) / (16 * ATTR_baudRate);
126 if (cnt < 512)
127 clk = 0;
128 else if (cnt < 4 * 512)
129 clk = 1;
130 else if (cnt < 16 * 512)
131 clk = 2;
132 else if (cnt < 64 * 512)
133 clk = 3;
134 else
135 return;
136
137 brr = cnt / (1 << (2 * clk));
138 brr = (brr / 2) + (brr % 2) - 1;
139
140 /*
141 * SCIドライバの初期化ルーチン
142 */
143
144 /*
145 * 割り込み要求å…
146ˆãƒ¬ã‚¸ã‚¹ã‚¿ã®è¨­å®š(ISELRi)
147 *
148 * リセット値と同じ値を設定することになるため,
149 * 処理は省略する.
150 */
151
152 /*
153 * モジュールストップ機能の設定
154 */
155 sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA502); /* 書込み許可 */
156 sil_wrw_mem(SYSTEM_MSTPCRB_ADDR,
157 sil_rew_mem(SYSTEM_MSTPCRB_ADDR) & ~SCI_MSTPCRB_BIT(ATTR_baseAddress));
158 sil_wrh_mem(SYSTEM_PRCR_ADDR, (uint16_t)0xA500); /* 書込み禁止 */
159
160 /* 送受信禁止, SCKn端子はå…
161¥å‡ºåŠ›ãƒãƒ¼ãƒˆã¨ã—て使用 */
162 sil_wrb_mem(SCI_SCR(ATTR_baseAddress), 0x00U);
163
164 /* クロック選択ビット(SMR.CKS[1:0]ビットを設定) */
165 sil_wrb_mem(SCI_SMR(ATTR_baseAddress),
166 (sil_reb_mem(SCI_SMR(ATTR_baseAddress)) & ~0x03) | clk);
167
168 /* SMRに送信/ 受信フォーマットを設定) */
169 sil_wrb_mem(SCI_SMR(ATTR_baseAddress),
170 sil_reb_mem(SCI_SMR(ATTR_baseAddress)) & (~SCI_SMR_FLG_ENABLE));
171
172 /* ビットレートを設定 */
173 sil_wrb_mem(SCI_BRR(ATTR_baseAddress), brr);
174
175 /* ビット期間(基本クロック16サイクルの期間が1ビット期間となる) */
176 for(i = 0; i < 16; i++) { }
177
178 /* 送受信許可 */
179 sil_wrb_mem(SCI_SCR(ATTR_baseAddress),
180 (sil_reb_mem(SCI_SCR(ATTR_baseAddress)) | SCI_SCR_FLG_ENABLE));
181
182 VAR_initialized = true;
183}
184
185/*
186 * シリアルI/Oポートのクローズ
187 */
188void
189eSIOPort_close(CELLIDX idx)
190{
191 CELLCB *p_cellcb = GET_CELLCB(idx);
192
193 /*
194 * UART停止
195 */
196 sil_wrb_mem(SCI_SCR(ATTR_baseAddress), 0x00U);
197}
198
199/*
200 * シリアルI/Oポートへの文字送信
201 */
202bool_t
203eSIOPort_putChar(CELLIDX idx, char c)
204{
205 CELLCB *p_cellcb = GET_CELLCB(idx);
206
207 if (scif_putready(p_cellcb)){
208 scif_putchar(p_cellcb, c);
209 return(true);
210 }
211 return(false);
212}
213
214/*
215 * シリアルI/Oポートからの文字受信
216 */
217int_t
218eSIOPort_getChar(CELLIDX idx)
219{
220 CELLCB *p_cellcb = GET_CELLCB(idx);
221 uint8_t reg;
222 int_t c = -1;
223
224 /* オーバランエラーチェック */ /* ZZZ */
225 reg = sil_reb_mem(SCI_SSR(ATTR_baseAddress));
226 while((reg & SCI_SSR_ORER_BIT) != 0) {
227 sil_wrb_mem(SCI_SSR(ATTR_baseAddress), reg & ~SCI_SSR_ORER_BIT);
228 reg = sil_reb_mem(SCI_SSR(ATTR_baseAddress));
229 }
230
231 /*
232 * 受信フラグがONのときのみ受信バッファから文字を取得する.
233 * これは, ポーリング受信に対応するためである.
234 * しかし, RX600シリーズでは受信フラグがないこと, システムサービス
235 * では受信割込みの中からしかデータを受信しに来ないことから, 常に
236 * 受信バッファから文字を取得する.
237 */
238 c = (int)(sil_reb_mem(SCI_RDR(ATTR_baseAddress)));
239
240 return c;
241}
242
243/*
244 * シリアルI/Oポートからのコールバックの許可
245 */
246void
247eSIOPort_enableCBR(CELLIDX idx, uint_t cbrtn)
248{
249 CELLCB *p_cellcb = GET_CELLCB(idx);
250
251 switch (cbrtn) {
252 case SIO_RDY_SND:
253 sil_wrb_mem(SCI_SCR(ATTR_baseAddress),
254 (sil_reb_mem(SCI_SCR(ATTR_baseAddress)) | SCI_SCR_TEIE_BIT));
255 break;
256 case SIO_RDY_RCV:
257 sil_wrb_mem(SCI_SCR(ATTR_baseAddress),
258 (sil_reb_mem(SCI_SCR(ATTR_baseAddress)) | SCI_SCR_RIE_BIT));
259 break;
260 default:
261 assert(1);
262 break;
263 }
264}
265
266/*
267 * シリアルI/Oポートからのコールバックの禁止
268 */
269void
270eSIOPort_disableCBR(CELLIDX idx, uint_t cbrtn)
271{
272 CELLCB *p_cellcb = GET_CELLCB(idx);
273
274 switch (cbrtn) {
275 case SIO_RDY_SND:
276 sil_wrb_mem(SCI_SCR(ATTR_baseAddress),
277 (sil_reb_mem(SCI_SCR(ATTR_baseAddress)) & (~SCI_SCR_TEIE_BIT)));
278 break;
279 case SIO_RDY_RCV:
280 sil_wrb_mem(SCI_SCR(ATTR_baseAddress),
281 (sil_reb_mem(SCI_SCR(ATTR_baseAddress)) & (~SCI_SCR_RIE_BIT)));
282 break;
283 default:
284 assert(1);
285 break;
286 }
287}
288
289/*
290 * シリアルI/Oポートに対する受信割込み処理
291 */
292void
293eiRxISR_main(CELLIDX idx)
294{
295 CELLCB *p_cellcb = GET_CELLCB(idx);
296
297 if (scif_getready(p_cellcb)) {
298 /*
299 * 受信通知コールバックルーチンを呼び出す.
300 */
301 ciSIOCBR_readyReceive();
302 }
303}
304
305/*
306 * シリアルI/Oポートに対する送信割込み処理
307 */
308void
309eiTxISR_main(CELLIDX idx)
310{
311 CELLCB *p_cellcb = GET_CELLCB(idx);
312
313 if (scif_putready(p_cellcb)) {
314 /*
315 * 送信可能コールバックルーチンを呼び出す.
316 */
317 ciSIOCBR_readySend();
318 }
319}
Note: See TracBrowser for help on using the repository browser.