source: asp3_wo_tecs/trunk/target/blueninja_gcc/target_serial.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: 8.1 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-2014 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/*
59 * シリアルI/Oデバイス(SIO)ドライバ(BlueNinja用)
60 */
61
62#include "kernel/kernel_impl.h"
63#include <t_syslog.h>
64#include "target_serial.h"
65#include "tz1000.h"
66
67/*
68 * TODO:
69 * 現状ではUART1のみをサポートしている.
70 * 今後,Bluetoothの利用などにより
71 * サポートするシリアルポートが増えた
72 * 場合の拡張のためにSIOPINIBを残しておく
73 */
74/*
75 * シリアルI/Oポート初期化ブロックの定義
76 */
77typedef struct sio_port_initialization_block {
78 INTNO intno;
79} SIOPINIB;
80
81/*
82 * シリアルI/Oポート管理ブロックの定義
83 */
84struct sio_port_control_block {
85 const SIOPINIB *p_siopinib; /* シリアルI/Oポート初期化ブロック */
86 intptr_t exinf; /* 拡張情
87å ± */
88 bool_t opnflg; /* オープン済みフラグ */
89};
90
91/*
92 * シリアルI/Oポート初期化ブロック
93 */
94const SIOPINIB siopinib_table[TNUM_SIOP] = {
95 {(INTNO)INTNO_SIO}
96};
97
98/*
99 * シリアルI/Oポート管理ブロックのエリア
100 */
101SIOPCB siopcb_table[TNUM_SIOP];
102
103/*
104 * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
105 */
106#define INDEX_SIOP(siopid) ((uint_t)((siopid) - 1))
107#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))
108
109/*
110 * SIOドライバの初期化
111 */
112void
113sio_initialize(intptr_t exinf)
114{
115 SIOPCB *p_siopcb;
116 uint_t i;
117
118 /*
119 * シリアルI/Oポート管理ブロックの初期化
120 */
121 for (p_siopcb = siopcb_table, i = 0; i < TNUM_SIOP; p_siopcb++, i++) {
122 p_siopcb->p_siopinib = &(siopinib_table[i]);
123 p_siopcb->opnflg = false;
124 }
125}
126
127
128/*
129 * シリアルI/Oポートのオープン
130 */
131SIOPCB *
132sio_opn_por(ID siopid, intptr_t exinf)
133{
134 SIOPCB *p_siopcb;
135 bool_t opnflg;
136
137 p_siopcb = get_siopcb(siopid);
138
139 /*
140 * オープンしたポートがあるかをopnflgに読んでおく.
141 */
142 opnflg = p_siopcb->opnflg;
143
144 if (!opnflg) {
145 p_siopcb->exinf = exinf;
146
147 /*
148 * UART1ハードウェアの初期化はtarget_initialize
149 * で一部実施済み
150 * 割込み要因マスク(UARTIMSC)はå…
151¨ç¦æ­¢çŠ¶æ…
152‹
153 */
154 /*
155 * UART1_UARTIFLSの設定
156 * 受信割込み頻度:受信FIFOのx%以上がFULL状æ…
157‹ã§å‰²è¾¼ã¿ã‚’起こす
158 * 現状1/8に設定
159 * 送信割込み頻度:送信FIFOのx%以上がEMPTY状æ…
160‹ã§å‰²è¾¼ã¿ã‚’起こす
161 * 現状7/8に設定
162 */
163 sil_wrw_mem(UARTIFLS(UART1_BASE), (UARTIFLS_RX_1 | UARTIFLS_TX_14));
164 /*
165 * 割込み要求のクリア
166 * UART1_UARTICR のå…
167¨è¦å› ã‚’クリア
168 */
169 sil_wrw_mem(UARTICR(UART1_BASE), (UARTICR_TXIC | UARTICR_RXIC));
170
171 p_siopcb->opnflg = true;
172 }
173
174 return(p_siopcb);
175}
176
177/*
178 * シリアルI/Oポートのクローズ
179 */
180void
181sio_cls_por(SIOPCB *p_siopcb)
182{
183 /*
184 * シリアルI/O割込みをマスクする.
185 */
186 if (!(p_siopcb->opnflg)) {
187 dis_int(p_siopcb->p_siopinib->intno);
188 }
189}
190
191/*
192 * SIOの割込みサービスルーチン
193 */
194void
195sio_isr(intptr_t exinf)
196{
197 SIOPCB *p_siopcb;
198
199 p_siopcb = get_siopcb(exinf);
200
201 /*
202 * 割込み要求のクリア
203 * UART1_UARTICR のå…
204¨è¦å› ã‚’クリア
205 */
206 sil_wrw_mem(UARTICR(UART1_BASE), (UARTICR_TXIC | UARTICR_RXIC));
207
208 if ((sil_rew_mem(UARTFR(UART1_BASE)) & UARTFR_RXFE) != UARTFR_RXFE) {
209 /*
210 * 受信FIFOが空でないならば
211 * 受信通知コールバックルーチンを呼び出す.
212 */
213 sio_irdy_rcv(p_siopcb->exinf);
214 }
215 if ((sil_rew_mem(UARTFR(UART1_BASE)) & UARTFR_TXFF) != UARTFR_TXFF) {
216 /*
217 * 送信FIFOがFullでないならば
218 * 送信可能コールバックルーチンを呼び出す.
219 */
220 sio_irdy_snd(p_siopcb->exinf);
221 }
222}
223
224/*
225 * シリアルI/Oポートへの文字送信
226 */
227bool_t
228sio_snd_chr(SIOPCB *p_siopcb, char c)
229{
230 if ((sil_rew_mem(UARTFR(UART1_BASE)) & UARTFR_TXFF) != UARTFR_TXFF) {
231 /*
232 * 送信FIFOがFullでないならば
233 * DRに書き込む
234 */
235 sil_wrw_mem(UARTDR(UART1_BASE), (uint32_t)((uint8_t)(c)));
236 return(true);
237 }
238 else {
239 return(false);
240 }
241}
242
243/*
244 * シリアルI/Oポートからの文字受信
245 */
246int_t
247sio_rcv_chr(SIOPCB *p_siopcb)
248{
249 int_t c = -1;
250 if ((sil_rew_mem(UARTFR(UART1_BASE)) & UARTFR_RXFE) != UARTFR_RXFE) {
251 /*
252 * 受信FIFOが空でないならば
253 * DRを読む
254 */
255 c = (int_t)(sil_rew_mem(UARTDR(UART1_BASE)) & 0xFF);
256 }
257 return(c);
258}
259
260/*
261 * シリアルI/Oポートからのコールバックの許可
262 */
263void
264sio_ena_cbr(SIOPCB *p_siopcb, uint_t cbrtn)
265{
266 switch (cbrtn) {
267 case SIO_RDY_RCV:
268 /* 受信割込みの許可 */
269 sil_orw(UARTIMSC(UART1_BASE), UARTIMSC_RXIM);
270 break;
271 case SIO_RDY_SND:
272 /* 送信割込みの許可 */
273 sil_orw(UARTIMSC(UART1_BASE), UARTIMSC_TXIM);
274 break;
275 }
276}
277
278/*
279 * シリアルI/Oポートからのコールバックの禁止
280 */
281void
282sio_dis_cbr(SIOPCB *p_siopcb, uint_t cbrtn)
283{
284 switch (cbrtn) {
285 case SIO_RDY_RCV:
286 /* 受信割込みの禁止 */
287 sil_andw(UARTIMSC(UART1_BASE), ~UARTIMSC_RXIM);
288 break;
289 case SIO_RDY_SND:
290 /* 送信割込みの禁止 */
291 sil_andw(UARTIMSC(UART1_BASE), ~UARTIMSC_TXIM);
292 break;
293 }
294}
Note: See TracBrowser for help on using the repository browser.