source: asp3_wo_tecs/trunk/target/blueninja_gcc/tSIOPortTargetMain.c@ 302

Last change on this file since 302 was 302, checked in by ertl-honda, 7 years ago

TECSレスのASP3の開発のため以下のtrunkからコピー
http://dev.toppers.jp/svn/asp3/branches/WO_TECS-3.C.0

File size: 11.9 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) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2005-2016 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 * 上記著作権者
12は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
13 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
14 * 変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
16 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
17 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
18 * スコード中に含まれていること.
19 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
20 * 用できる形で再é…
21å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
22å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
23 * 者
24マニュアルなど)に,上記の著作権表示,この利用条件および下記
25 * の無保証規定を掲載すること.
26 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
27 * 用できない形で再é…
28å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
29 * と.
30 * (a) 再é…
31å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
32マニュアルなど)に,上記の著
33 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
34 * (b) 再é…
35å¸ƒã®å½¢æ…
36‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
37 * 報告すること.
38 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
39 * 害からも,上記著作権者
40およびTOPPERSプロジェクトをå…
41è²¬ã™ã‚‹ã“と.
42 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
43 * 由に基づく請求からも,上記著作権者
44およびTOPPERSプロジェクトを
45 * å…
46è²¬ã™ã‚‹ã“と.
47 *
48 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
49お
50 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
51 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
52 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
53 * の責任を負わない.
54 *
55 * @(#) $Id: target_serial.c 301 2015-01-07 04:57:01Z ertl-ishikawa $
56 */
57
58/* #[<PREAMBLE>]#
59 * #[<...>]# から #[</...>]# で囲まれたコメントは編集しないでください
60 * tecsmerge によるマージに使用されます
61 *
62 * 属性アクセスマクロ #_CAAM_#
63 * opnflg bool_t VAR_opnflg
64 *
65 * 呼び口関数 #_TCPF_#
66 * call port: ciSIOCBR signature: siSIOCBR context:task
67 * void ciSIOCBR_readySend( );
68 * void ciSIOCBR_readyReceive( );
69 * call port: cInterruptRequest signature: sInterruptRequest context:task
70 * ER cInterruptRequest_disable( );
71 * ER cInterruptRequest_enable( );
72 *
73 * #[</PREAMBLE>]# */
74
75/* プロトタイプ宣言や変数の定義をここに書きます #_PAC_# */
76#include "tSIOPortTargetMain_tecsgen.h"
77#include <t_syslog.h>
78#include "tz1000.h"
79
80#ifndef E_OK
81#define E_OK 0 /* success */
82#define E_ID (-18) /* illegal ID */
83#endif
84
85/* 受け口関数 #_TEPF_# */
86/* #[<ENTRY_PORT>]# eSIOPort
87 * entry port: eSIOPort
88 * signature: sSIOPort
89 * context: task
90 * #[</ENTRY_PORT>]# */
91
92/* #[<ENTRY_FUNC>]# eSIOPort_open
93 * name: eSIOPort_open
94 * global_name: tSIOPortTargetMain_eSIOPort_open
95 * oneway: false
96 * #[</ENTRY_FUNC>]# */
97/*
98 * シリアルI/Oポートのオープン
99 */
100/* SIOPCB *sio_opn_por(ID siopid, intptr_t exinf) */
101void
102eSIOPort_open(CELLIDX idx)
103{
104 CELLCB *p_cellcb;
105 bool_t opnflg;
106 if (VALID_IDX(idx)) {
107 p_cellcb = GET_CELLCB(idx);
108 }
109 else {
110 /* エラー処理コードをここに記述します */
111 } /* end if VALID_IDX(idx) */
112
113 /* ここに処理本体を記述します #_TEFB_# */
114 /*
115 * オープンしたポートがあるかをopnflgに読んでおく.
116 */
117 opnflg = VAR_opnflg;
118
119 if (!opnflg) {
120 /*
121 * UART1ハードウェアの初期化はtarget_initialize
122 * で一部実施済み
123 * 割込み要因マスク(UARTIMSC)はå…
124¨ç¦æ­¢çŠ¶æ…
125‹
126 */
127 /*
128 * UART1_UARTIFLSの設定
129 * 受信割込み頻度:受信FIFOのx%以上がFULL状æ…
130‹ã§å‰²è¾¼ã¿ã‚’起こす
131 * 現状1/8に設定
132 * 送信割込み頻度:送信FIFOのx%以上がEMPTY状æ…
133‹ã§å‰²è¾¼ã¿ã‚’起こす
134 * 現状7/8に設定
135 */
136 sil_wrw_mem(UARTIFLS(UART1_BASE), (UARTIFLS_RX_1 | UARTIFLS_TX_14));
137 /*
138 * 割込み要求のクリア
139 * UART1_UARTICR のå…
140¨è¦å› ã‚’クリア
141 */
142 sil_wrw_mem(UARTICR(UART1_BASE), (UARTICR_TXIC | UARTICR_RXIC));
143 while ((sil_rew_mem(UARTFR(UART1_BASE)) & UARTFR_TXFF) == UARTFR_TXFF);
144 sil_wrw_mem(UARTDR(UART1_BASE), (uint32_t)('\0'));
145
146 VAR_opnflg = true;
147 }
148}
149
150/* #[<ENTRY_FUNC>]# eSIOPort_close
151 * name: eSIOPort_close
152 * global_name: tSIOPortTargetMain_eSIOPort_close
153 * oneway: false
154 * #[</ENTRY_FUNC>]# */
155/*
156 * シリアルI/Oポートのクローズ
157 */
158/* void sio_cls_por(SIOPCB *p_siopcb) */
159void
160eSIOPort_close(CELLIDX idx)
161{
162 CELLCB *p_cellcb;
163 if (VALID_IDX(idx)) {
164 p_cellcb = GET_CELLCB(idx);
165 }
166 else {
167 /* エラー処理コードをここに記述します */
168 } /* end if VALID_IDX(idx) */
169
170 /* ここに処理本体を記述します #_TEFB_# */
171 if (!VAR_opnflg) {
172 cInterruptRequest_disable();
173 }
174
175}
176
177/* #[<ENTRY_FUNC>]# eSIOPort_putChar
178 * name: eSIOPort_putChar
179 * global_name: tSIOPortTargetMain_eSIOPort_putChar
180 * oneway: false
181 * #[</ENTRY_FUNC>]# */
182/*
183 * シリアルI/Oポートへの文字送信
184 */
185/* bool_t sio_snd_chr(SIOPCB *p_siopcb, char c) */
186bool_t
187eSIOPort_putChar(CELLIDX idx, char c)
188{
189 CELLCB *p_cellcb;
190 if (VALID_IDX(idx)) {
191 p_cellcb = GET_CELLCB(idx);
192 }
193 else {
194 /* エラー処理コードをここに記述します */
195 } /* end if VALID_IDX(idx) */
196
197 /* ここに処理本体を記述します #_TEFB_# */
198 if ((sil_rew_mem(UARTFR(UART1_BASE)) & UARTFR_TXFF) != UARTFR_TXFF) {
199 /*
200 * 送信FIFOがFullでないならば
201 * DRに書き込む
202 */
203 sil_wrw_mem(UARTDR(UART1_BASE), (uint32_t)((uint8_t)(c)));
204 return(true);
205 }
206 else {
207 return(false);
208 }
209}
210
211/* #[<ENTRY_FUNC>]# eSIOPort_getChar
212 * name: eSIOPort_getChar
213 * global_name: tSIOPortTargetMain_eSIOPort_getChar
214 * oneway: false
215 * #[</ENTRY_FUNC>]# */
216/*
217 * シリアルI/Oポートからの文字受信
218 */
219/* int_t sio_rcv_chr(SIOPCB *p_siopcb) */
220int_t
221eSIOPort_getChar(CELLIDX idx)
222{
223 CELLCB *p_cellcb;
224 int_t c = -1;
225 if (VALID_IDX(idx)) {
226 p_cellcb = GET_CELLCB(idx);
227 }
228 else {
229 /* エラー処理コードをここに記述します */
230 } /* end if VALID_IDX(idx) */
231
232 /* ここに処理本体を記述します #_TEFB_# */
233 if ((sil_rew_mem(UARTFR(UART1_BASE)) & UARTFR_RXFE) != UARTFR_RXFE) {
234 /*
235 * 受信FIFOが空でないならば
236 * DRを読む
237 */
238 c = (int_t)(sil_rew_mem(UARTDR(UART1_BASE)) & 0xFF);
239 }
240 return(c);
241
242}
243
244/* #[<ENTRY_FUNC>]# eSIOPort_enableCBR
245 * name: eSIOPort_enableCBR
246 * global_name: tSIOPortTargetMain_eSIOPort_enableCBR
247 * oneway: false
248 * #[</ENTRY_FUNC>]# */
249/*
250 * シリアルI/Oポートからのコールバックの許可
251 */
252/* void sio_ena_cbr(SIOPCB *p_siopcb, uint_t cbrtn) */
253void
254eSIOPort_enableCBR(CELLIDX idx, uint_t cbrtn)
255{
256 CELLCB *p_cellcb;
257 if (VALID_IDX(idx)) {
258 p_cellcb = GET_CELLCB(idx);
259 }
260 else {
261 /* エラー処理コードをここに記述します */
262 } /* end if VALID_IDX(idx) */
263
264 /* ここに処理本体を記述します #_TEFB_# */
265 switch (cbrtn) {
266 case SIOReceiveReady:
267 /* 受信割込みの許可 */
268 sil_orw(UARTIMSC(UART1_BASE), UARTIMSC_RXIM);
269 break;
270 case SIOSendReady:
271 /* 送信割込みの許可 */
272 sil_orw(UARTIMSC(UART1_BASE), UARTIMSC_TXIM);
273 break;
274 }
275}
276
277/* #[<ENTRY_FUNC>]# eSIOPort_disableCBR
278 * name: eSIOPort_disableCBR
279 * global_name: tSIOPortTargetMain_eSIOPort_disableCBR
280 * oneway: false
281 * #[</ENTRY_FUNC>]# */
282/*
283 * シリアルI/Oポートからのコールバックの禁止
284 */
285/* void sio_dis_cbr(SIOPCB *p_siopcb, uint_t cbrtn) */
286void
287eSIOPort_disableCBR(CELLIDX idx, uint_t cbrtn)
288{
289 CELLCB *p_cellcb;
290 if (VALID_IDX(idx)) {
291 p_cellcb = GET_CELLCB(idx);
292 }
293 else {
294 /* エラー処理コードをここに記述します */
295 } /* end if VALID_IDX(idx) */
296
297 /* ここに処理本体を記述します #_TEFB_# */
298 switch (cbrtn) {
299 case SIOReceiveReady:
300 /* 受信割込みの禁止 */
301 sil_andw(UARTIMSC(UART1_BASE), ~UARTIMSC_RXIM);
302 break;
303 case SIOSendReady:
304 /* 送信割込みの禁止 */
305 sil_andw(UARTIMSC(UART1_BASE), ~UARTIMSC_TXIM);
306 break;
307 }
308}
309
310/* #[<ENTRY_PORT>]# eInitialize
311 * entry port: eInitialize
312 * signature: sRoutineBody
313 * context: task
314 * #[</ENTRY_PORT>]# */
315
316/* #[<ENTRY_FUNC>]# eInitialize_main
317 * name: eInitialize_main
318 * global_name: tSIOPortTargetMain_eInitialize_main
319 * oneway: false
320 * #[</ENTRY_FUNC>]# */
321/*
322 * SIOドライバの初期化
323 */
324/* void sio_initialize(intptr_t exinf) */
325void
326eInitialize_main(CELLIDX idx)
327{
328 CELLCB *p_cellcb;
329 if (VALID_IDX(idx)) {
330 p_cellcb = GET_CELLCB(idx);
331 }
332 else {
333 /* エラー処理コードをここに記述します */
334 } /* end if VALID_IDX(idx) */
335
336 /* ここに処理本体を記述します #_TEFB_# */
337 VAR_opnflg = false;
338
339}
340
341/* #[<ENTRY_PORT>]# eTerminate
342 * entry port: eTerminate
343 * signature: sRoutineBody
344 * context: task
345 * #[</ENTRY_PORT>]# */
346
347/* #[<ENTRY_FUNC>]# eTerminate_main
348 * name: eTerminate_main
349 * global_name: tSIOPortTargetMain_eTerminate_main
350 * oneway: false
351 * #[</ENTRY_FUNC>]# */
352void
353eTerminate_main(CELLIDX idx)
354{
355 CELLCB *p_cellcb;
356 if (VALID_IDX(idx)) {
357 p_cellcb = GET_CELLCB(idx);
358 }
359 else {
360 /* エラー処理コードをここに記述します */
361 } /* end if VALID_IDX(idx) */
362
363 /* ここに処理本体を記述します #_TEFB_# */
364}
365
366/* #[<ENTRY_PORT>]# eiISRBody
367 * entry port: eiISRBody
368 * signature: siHandlerBody
369 * context: non-task
370 * #[</ENTRY_PORT>]# */
371
372/* #[<ENTRY_FUNC>]# eiISRBody_main
373 * name: eiISRBody_main
374 * global_name: tSIOPortTargetMain_eiISRBody_main
375 * oneway: false
376 * #[</ENTRY_FUNC>]# */
377/*
378 * SIOの割込みサービスルーチン
379 */
380/* void sio_isr(intptr_t exinf) */
381void
382eiISRBody_main(CELLIDX idx)
383{
384 CELLCB *p_cellcb;
385 if (VALID_IDX(idx)) {
386 p_cellcb = GET_CELLCB(idx);
387 }
388 else {
389 /* エラー処理コードをここに記述します */
390 } /* end if VALID_IDX(idx) */
391
392 /* ここに処理本体を記述します #_TEFB_# */
393 /*
394 * 割込み要求のクリア
395 * UART1_UARTICR のå…
396¨è¦å› ã‚’クリア
397 */
398 sil_wrw_mem(UARTICR(UART1_BASE), (UARTICR_TXIC | UARTICR_RXIC));
399
400 if ((sil_rew_mem(UARTFR(UART1_BASE)) & UARTFR_RXFE) != UARTFR_RXFE) {
401 /*
402 * 受信FIFOが空でないならば
403 * 受信通知コールバックルーチンを呼び出す.
404 */
405 ciSIOCBR_readyReceive();
406 }
407 if ((sil_rew_mem(UARTFR(UART1_BASE)) & UARTFR_TXFF) != UARTFR_TXFF) {
408 /*
409 * 送信FIFOがFullでないならば
410 * 送信可能コールバックルーチンを呼び出す.
411 */
412 ciSIOCBR_readySend();
413 }
414}
415
416/* #[<POSTAMBLE>]#
417 * これより下に非受け口関数を書きます
418 * #[</POSTAMBLE>]#*/
Note: See TracBrowser for help on using the repository browser.