source: asp3_wo_tecs/trunk/arch/arm_gcc/rza1/scif.c@ 307

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

gr-peach依存部の追加

File size: 19.6 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) 2001-2011 by Industrial Technology Institute,
9 * Miyagi Prefectural Government, 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: scif.c 2758 2016-03-10 15:15:26Z ertl-honda $
56 */
57
58/*
59 * RZ/A1用 簡易SIOドライバ
60 */
61#include <sil.h>
62#include "target_syssvc.h"
63#include "rza1.h"
64#include "scif.h"
65
66/*
67 * 各レジスタのオフセット
68 */
69#define REG_SCSMR 0x00 /* シリアルモードレジスタ, 16bit */
70#define REG_SCBRR 0x04 /* ビットレートレジスタ, 8bit */
71#define REG_SCSCR 0x08 /* シリアルコントロールレジスタ, 16bit */
72#define REG_SCFTDR 0x0C /* 送信FIFOデータレジスタ, 8bit */
73#define REG_SCFSR 0x10 /* シリアルステータスレジスタ, 16bit */
74#define REG_SCFRDR 0x14 /* 受信FIFOデータレジスタ, 8bit */
75#define REG_SCFCR 0x18 /* FIFOコントロールレジスタ, 16bit */
76#define REG_SCFDR 0x1C /* FIFOデータカウントレジスタ, 16bit */
77#define REG_SCSPTR 0x20 /* シリアルポートレジスタ, 16bit */
78#define REG_SCLSR 0x24 /* ラインステータスレジスタ, 16bit */
79#define REG_SCEMR 0x28 /* シリアル拡張モードレジスタ, 16bit */
80
81/*
82 * 各レジスタの設定値
83 */
84#define SCSMR_SYNC 0x0080 /* 1:クロック同期式モード */
85#define SCSMR_7BIT 0x0040 /* 1:7ビットデータ */
86#define SCSMR_PARITY 0x0020 /* 1:パリティ付加 */
87#define SCSMR_ODD 0x0010 /* 1:奇数パリティ */
88#define SCSMR_2STOP 0x0008 /* 1:2ストッピビット */
89#define SCSMR_CKS1 0x0000 /* 00:P1clock / 1 */
90#define SCSMR_CKS4 0x0001 /* 01:P1clock / 4 */
91#define SCSMR_CKS16 0x0002 /* 10:P1clock / 16 */
92#define SCSMR_CKS64 0x0003 /* 11:P1clock / 64 */
93
94#define SCSCR_TIE 0x0080 /* 1:送信割り込み許可 */
95#define SCSCR_RIE 0x0040 /* 1:受信割り込み,受信エラー割り込み,ブレーク割り込み許可 */
96#define SCSCR_TE 0x0020 /* 1:送信許可 */
97#define SCSCR_RE 0x0010 /* 1:受信許可 */
98#define SCSCR_REIE 0x0008 /* 1:受信エラー割り込み,ブレーク割り込み許可 */
99#define SCSCR_INTCLK 0x0000 /* 00:内
100部クロック,CKS端子は無視(調歩同期式の場合) */
101
102#define SCFSR_PER_MASK 0xF000 /* パリティエラー数抽出マスク */
103#define SCFSR_PER_SHIFT 12 /* パリティエラー数抽出右シフト数 */
104#define SCFSR_FER_MASK 0x0F00 /* フレーミングエラー数抽出マスク */
105#define SCFSR_FER_SHIFT 8 /* フレーミングエラー数抽出右シフト数 */
106#define SCFSR_ER 0x0080 /* 1:受信エラー */
107#define SCFSR_TEND 0x0040 /* 1:送信完了 */
108#define SCFSR_TDFE 0x0020 /* 1:送信FIFOデータエンプティ */
109#define SCFSR_BRK 0x0010 /* 1:ブレーク検出 */
110#define SCFSR_FER 0x0008 /* 1:フレーミングエラー検出 */
111#define SCFSR_PER 0x0004 /* 1:パリティエラー検出 */
112#define SCFSR_RDF 0x0002 /* 1:受信FIFOデータフル */
113#define SCFSR_DR 0x0001 /* 1:受信データレディ */
114
115#define SCFCR_RSTRG_15 0x0000 /* RTS#出力アクティブトリガ:15 */
116#define SCFCR_RSTRG_1 0x0100 /* RTS#出力アクティブトリガ:1 */
117#define SCFCR_RSTRG_4 0x0200 /* RTS#出力アクティブトリガ:4 */
118#define SCFCR_RSTRG_6 0x0300 /* RTS#出力アクティブトリガ:6 */
119#define SCFCR_RSTRG_8 0x0400 /* RTS#出力アクティブトリガ:8 */
120#define SCFCR_RSTRG_10 0x0500 /* RTS#出力アクティブトリガ:10 */
121#define SCFCR_RSTRG_12 0x0600 /* RTS#出力アクティブトリガ:12 */
122#define SCFCR_RSTRG_14 0x0700 /* RTS#出力アクティブトリガ:14 */
123#define SCFCR_RTRG_1 0x0000 /* 受信FIFOデータ数トリガ:1(調歩同期式の場合) */
124#define SCFCR_RTRG_4 0x0040 /* 受信FIFOデータ数トリガ:4(調歩同期式の場合) */
125#define SCFCR_RTRG_8 0x0080 /* 受信FIFOデータ数トリガ:8(調歩同期式の場合) */
126#define SCFCR_RTRG_14 0x00C0 /* 受信FIFOデータ数トリガ:14(調歩同期式の場合) */
127#define SCFCR_TTRG_8 0x0000 /* 送信FIFOデータ数トリガ:8(調歩同期式の場合) */
128#define SCFCR_TTRG_4 0x0010 /* 送信FIFOデータ数トリガ:4(調歩同期式の場合) */
129#define SCFCR_TTRG_2 0x0020 /* 送信FIFOデータ数トリガ:2(調歩同期式の場合) */
130#define SCFCR_TTRG_0 0x0030 /* 送信FIFOデータ数トリガ:0(調歩同期式の場合) */
131#define SCFCR_MCE 0x0008 /* CTS#,RTS#許可 */
132#define SCFCR_TFRST 0x0004 /* 1:送信FIFOデータレジスタリセット */
133#define SCFCR_RFRST 0x0002 /* 1:受信FIFOデータレジスタリセット */
134#define SCFCR_LOOP 0x0001 /* 1:ループバックテスト */
135
136#define SCFDR_T_MASK 0x1F00 /* 未送信データ数抽出マスク */
137#define SCFDR_T_SHIFT 8 /* 未送信データ数抽出右シフト数 */
138#define SCFDR_R_MASK 0x001F /* 受信データ数抽出マスク */
139#define SCFDR_R_SHIFT 0 /* 受信データ数抽出右シフト数 */
140
141#define SCLSR_ORER 0x0001 /* 1:オーバーランエラー */
142
143#define SCEMR_BGDM 0x0080 /* 1:ボーレートジェネレータ倍速モード */
144#define SCEMR_ABCS16 0x0000 /* ビットレートの16倍の基本クロックで動作 */
145#define SCEMR_ABCS8 0x0001 /* ビットレートの8倍の基本クロックで動作 */
146
147/*
148 * シリアルI/Oポート初期化ブロックの定義
149 */
150typedef struct sio_port_initialization_block {
151 uint16_t *port; /* シリアルポートのベースレジスタ */
152 uint32_t bps_setting; /* ボーレートの設定値 */
153} SIOPINIB;
154
155/*
156 * シリアルI/Oポート管理ブロックの定義
157 */
158struct sio_port_control_block {
159 const SIOPINIB *p_siopinib; /* シリアルI/Oポート初期化ブロック */
160 intptr_t exinf; /* 拡張情
161å ± */
162 bool_t openflag; /* オープン済みフラグ */
163 bool_t sendflag; /* 送信割込みイネーブルフラグ */
164 bool_t getready; /* 文字を受信した状æ…
165‹ */
166 bool_t putready; /* 文字を送信できる状æ…
167‹ */
168 bool_t is_initialized; /* デバイス初期化済みフラグ */
169};
170
171/*
172 * シリアルI/Oポート初期化ブロック
173 */
174static const SIOPINIB siopinib_table[TNUM_SIOP] = {
175 {
176 (uint16_t *)(SCIF0_BASE),
177 UART1_BPS_SETTING,
178 },
179#if TNUM_SIOP > 1
180 {
181 (uint16_t *)(SCIF1_BASE),
182 UART2_BPS_SETTING,
183 },
184#endif /* TNUM_SIOP > 1 */
185#if TNUM_SIOP > 2
186 {
187 (uint16_t *)(SCIF2_BASE),
188 UART3_BPS_SETTING,
189 },
190#endif /* TNUM_SIOP > 2 */
191#if TNUM_SIOP > 3
192 {
193 (uint16_t *)(SCIF3_BASE),
194 UART4_BPS_SETTING,
195 },
196#endif /* TNUM_SIOP > 3*/
197#if TNUM_SIOP > 4
198 {
199 (uint16_t *)(SCIF4_BASE),
200 UART5_BPS_SETTING,
201 },
202#endif /* TNUM_SIOP > 4*/
203#if TNUM_SIOP > 5
204 {
205 (uint16_t *)(SCIF5_BASE),
206 UART6_BPS_SETTING,
207 },
208#endif /* TNUM_SIOP > 5*/
209#if TNUM_SIOP > 6
210 {
211 (uint16_t *)(SCIF6_BASE),
212 UART7_BPS_SETTING,
213 },
214#endif /* TNUM_SIOP > 6*/
215#if TNUM_SIOP > 7
216 {
217 (uint16_t *)(SCIF7_BASE),
218 UART8_BPS_SETTING,
219 },
220#endif /* TNUM_SIOP > 7*/
221};
222
223/*
224 * シリアルI/Oポート管理ブロックのエリア
225 */
226static SIOPCB siopcb_table[TNUM_SIOP];
227
228/*
229 * シリアルI/OポートIDから管理ブロックを取り出すためのマクロ
230 */
231#define INDEX_SIOP(siopid) ((uint_t)((siopid) - 1))
232#define get_siopcb(siopid) (&(siopcb_table[INDEX_SIOP(siopid)]))
233#define get_siopinib(siopid) (&(siopinib_table[INDEX_SIOP(siopid)]))
234
235/*
236 * 管理ブロックへのポインタからシリアルI/OポートIDを取り出すためのマクロ
237 */
238#define SIOPID(p_siopcb) ((ID)((p_siopcb) - siopcb_table))
239
240/*
241 * 文字を受信したか?
242 */
243Inline bool_t scif_getready(SIOPCB *p_siopcb)
244{
245 uint16_t fsrval;
246 uint16_t lsrval;
247
248 fsrval = sil_reh_mem((uint16_t *)((uint8_t *)p_siopcb->p_siopinib->port + REG_SCFSR));
249 lsrval = sil_reh_mem((uint16_t *)((uint8_t *)p_siopcb->p_siopinib->port + REG_SCLSR));
250 if (fsrval & (SCFSR_ER | SCFSR_BRK)) {
251 fsrval = fsrval & ~(SCFSR_ER | SCFSR_BRK);
252 sil_wrh_mem((uint16_t *)((uint8_t *)p_siopcb->p_siopinib->port + REG_SCFSR), fsrval);
253 }
254 if (lsrval & SCLSR_ORER) {
255 lsrval = lsrval & ~SCLSR_ORER;
256 sil_wrh_mem((uint16_t *)((uint8_t *)p_siopcb->p_siopinib->port + REG_SCLSR), lsrval);
257 }
258 if (fsrval & SCFSR_RDF) {
259 return true;
260 }
261 return false;
262}
263
264/*
265 * 文字を送信できるか?
266 */
267Inline bool_t scif_putready(SIOPCB *p_siopcb)
268{
269 uint16_t fsrval;
270
271 fsrval = sil_reh_mem((uint16_t *)((uint8_t *)p_siopcb->p_siopinib->port + REG_SCFSR));
272 if (fsrval & SCFSR_TDFE) {
273 return true;
274 }
275 return false;
276}
277
278/*
279 * 受信した文字の取出し
280 */
281Inline bool_t scif_getchar(SIOPCB *p_siopcb, char *rxdata)
282{
283 uint16_t fsrval;
284 uint16_t lsrval;
285 uint8_t read_data;
286
287 fsrval = sil_reh_mem((uint16_t *)((uint8_t *)p_siopcb->p_siopinib->port + REG_SCFSR));
288 lsrval = sil_reh_mem((uint16_t *)((uint8_t *)p_siopcb->p_siopinib->port + REG_SCLSR));
289 if (fsrval & (SCFSR_ER | SCFSR_BRK)) {
290 fsrval = fsrval & ~(SCFSR_ER | SCFSR_BRK);
291 sil_wrh_mem((uint16_t *)((uint8_t *)p_siopcb->p_siopinib->port + REG_SCFSR), fsrval);
292 }
293 if (lsrval & SCLSR_ORER) {
294 lsrval = lsrval & ~SCLSR_ORER;
295 sil_wrh_mem((uint16_t *)((uint8_t *)p_siopcb->p_siopinib->port + REG_SCLSR), lsrval);
296 }
297 if (fsrval & SCFSR_RDF) {
298 read_data = sil_reb_mem((uint8_t *)p_siopcb->p_siopinib->port + REG_SCFRDR);
299 fsrval = fsrval & ~SCFSR_RDF;
300 sil_wrh_mem((uint16_t *)((uint8_t *)p_siopcb->p_siopinib->port + REG_SCFSR), fsrval);
301 *rxdata = (char)read_data;
302 return true;
303 }
304 return false;
305}
306
307/*
308 * 送信する文字の書込み
309 */
310Inline void scif_putchar(SIOPCB *p_siopcb, char c)
311{
312 sil_wrb_mem((uint8_t *)p_siopcb->p_siopinib->port + REG_SCFTDR, c);
313 sil_wrh_mem((uint16_t *)((uint8_t *)p_siopcb->p_siopinib->port + REG_SCFSR), ~(SCFSR_TEND | SCFSR_TDFE));
314}
315
316/*
317 * 送信割込み許可
318 */
319Inline void scif_enable_send(SIOPCB *p_siopcb)
320{
321 uint16_t scrval;
322
323 scrval = sil_reh_mem((uint16_t *)((uint8_t *)p_siopcb->p_siopinib->port + REG_SCSCR));
324 scrval |= SCSCR_TIE;
325 sil_wrh_mem((uint16_t *)((uint8_t *)p_siopcb->p_siopinib->port + REG_SCSCR), scrval);
326}
327
328/*
329 * 送信割込み禁止
330 */
331Inline void scif_disable_send(SIOPCB *p_siopcb)
332{
333 uint16_t scrval;
334
335 scrval = sil_reh_mem((uint16_t *)((uint8_t *)p_siopcb->p_siopinib->port + REG_SCSCR));
336 scrval = scrval & ~SCSCR_TIE;
337 sil_wrh_mem((uint16_t *)((uint8_t *)p_siopcb->p_siopinib->port + REG_SCSCR), scrval);
338}
339
340
341/*
342 * 受信割込み許可
343 */
344Inline void scif_enable_rcv(SIOPCB *p_siopcb)
345{
346 uint16_t scrval;
347
348 scrval = sil_reh_mem((uint16_t *)((uint8_t *)p_siopcb->p_siopinib->port + REG_SCSCR));
349 scrval |= SCSCR_RIE;
350 sil_wrh_mem((uint16_t *)((uint8_t *)p_siopcb->p_siopinib->port + REG_SCSCR), scrval);
351}
352
353/*
354 * 受信割込み禁止
355 */
356Inline void
357scif_disable_rcv(SIOPCB *p_siopcb)
358{
359 uint16_t scrval;
360
361 scrval = sil_reh_mem((uint16_t *)((uint8_t *)p_siopcb->p_siopinib->port + REG_SCSCR));
362 scrval = scrval & ~SCSCR_RIE;
363 sil_wrh_mem((uint16_t *)((uint8_t *)p_siopcb->p_siopinib->port + REG_SCSCR), scrval);
364}
365
366/*
367 * SIOドライバの初期化
368 */
369void scif_initialize(void)
370{
371 SIOPCB *p_siopcb;
372 uint_t i;
373
374 /*
375 * シリアルI/Oポート管理ブロックの初期化
376 */
377 for (p_siopcb = siopcb_table, i = 0; i < TNUM_SIOP; p_siopcb++, i++) {
378 p_siopcb->p_siopinib = &(siopinib_table[i]);
379 p_siopcb->openflag = false;
380 p_siopcb->sendflag = false;
381 }
382}
383
384
385/*
386 * ハードウェアの初期化処理
387 */
388static int scif_init_siopinib(const SIOPINIB *p_siopinib)
389{
390 uint16_t fsrval;
391 uint8_t brrval;
392
393 fsrval = RZA1_CLK_P1 / (32 * p_siopinib->bps_setting) - 1;
394 if (fsrval > 255) return 1;
395 brrval = (uint8_t)fsrval;
396
397 sil_wrh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCSCR), 0);
398 sil_wrh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCFCR), SCFCR_TFRST | SCFCR_RFRST);
399 (void)sil_reh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCFSR));
400 (void)sil_reh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCLSR));
401 sil_wrh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCFSR), 0);
402 sil_wrh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCLSR), 0);
403 sil_wrh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCSCR), SCSCR_INTCLK);
404 sil_wrh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCSMR), SCSMR_CKS1); /* 8N1, P1clock/1 */
405 sil_wrh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCEMR), 0);
406 sil_wrb_mem((uint8_t *)p_siopinib->port + REG_SCBRR, brrval);
407 sil_wrh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCFCR), SCFCR_RSTRG_15 | SCFCR_RTRG_1 | SCFCR_TTRG_8);
408 sil_wrh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCSCR), SCSCR_TE | SCSCR_RE | SCSCR_INTCLK);
409 while (sil_reh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCFSR)) & SCFSR_RDF) {
410 (void)sil_reb_mem((uint8_t *)p_siopinib->port + REG_SCFRDR);
411 sil_wrh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCFSR), ~SCFSR_RDF);
412 }
413 sil_wrh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCFSR), 0);
414 return 0;
415}
416
417
418/*
419 * カーネル起動時のバーナ出力用の初期化
420 */
421void
422scif_init(ID siopid)
423{
424 SIOPCB *p_siopcb = get_siopcb(siopid);
425 const SIOPINIB *p_siopinib = get_siopinib(siopid);
426 /* この時点では、p_siopcb->p_siopinibは初期化されていない */
427
428 if (!(p_siopcb->is_initialized)) {
429 scif_init_siopinib(p_siopinib);
430 p_siopcb->is_initialized = true;
431 }
432}
433
434/*
435 * ポートnがオープン済みか?(ポートIDが引数)
436 */
437bool_t
438scif_openflag_id(ID siopid)
439{
440 return(get_siopcb(siopid)->openflag);
441}
442
443/*
444 * ポートnがオープン済みか?
445 * (「シリアルI/Oポート管理ブロック」のå…
446ˆé ­ç•ªåœ°ãŒå¼•æ•°ï¼‰
447 */
448bool_t
449scif_openflag_cb(SIOPCB *p_siopcb)
450{
451 return(p_siopcb->openflag);
452}
453
454/*
455 * ポートIDの取得
456 */
457ID
458scif_get_siopid(SIOPCB *p_siopcb)
459{
460 return(SIOPID(p_siopcb));
461}
462
463/*
464 * シリアルI/Oポートのオープン
465 */
466SIOPCB *
467scif_opn_por(ID siopid, intptr_t exinf)
468{
469 SIOPCB *p_siopcb;
470 const SIOPINIB *p_siopinib;
471
472 p_siopcb = get_siopcb(siopid);
473 p_siopinib = p_siopcb->p_siopinib;
474
475 /*
476 * ハードウェアの初期化
477 *  既に初期化している場合は、二重に初期化しない。
478 */
479 if (!(p_siopcb->is_initialized)) {
480 scif_init_siopinib(p_siopinib);
481 p_siopcb->is_initialized = true;
482 }
483
484 p_siopcb->exinf = exinf;
485 p_siopcb->getready = p_siopcb->putready = false;
486 p_siopcb->openflag = true;
487
488 return(p_siopcb);
489}
490
491/*
492 * シリアルI/Oポートのクローズ
493 */
494void
495scif_cls_por(SIOPCB *p_siopcb)
496{
497 sil_wrh_mem(p_siopcb->p_siopinib->port + REG_SCSCR, 0);
498}
499
500
501/*
502 * シリアルI/Oポートへのポーリングでの出力
503 */
504void
505scif_pol_putc(char c, ID siopid)
506{
507 const SIOPINIB *p_siopinib;
508 uint16_t fsrval;
509 SIL_PRE_LOC;
510
511 p_siopinib = get_siopinib(siopid);
512
513 while(1) {
514 /*
515 * リエントラントにするため、å…
516¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
517‹ã«ã™ã‚‹ã€‚
518 */
519 SIL_LOC_INT();
520
521 fsrval = sil_reh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCFSR));
522 if (fsrval & SCFSR_TDFE) {
523 sil_wrb_mem((uint8_t *)p_siopinib->port + REG_SCFTDR, c);
524 sil_wrh_mem((uint16_t *)((uint8_t *)p_siopinib->port + REG_SCFSR), ~(SCFSR_TEND | SCFSR_TDFE));
525 /*
526 * リターンする前にå…
527¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯ãƒ•ãƒ©ã‚°ã‚’å…
528ƒã®çŠ¶æ…
529‹ã«æˆ»ã™ã€‚
530 */
531 SIL_UNL_INT();
532 return;
533 } else {
534 /*
535 * ここでå…
536¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯ã‚’解除して、割込みを受け付ける。
537 */
538 SIL_UNL_INT();
539 }
540 }
541}
542
543
544/*
545 * シリアルI/Oポートへの文字送信
546 */
547bool_t
548scif_snd_chr(SIOPCB *p_siopcb, char c)
549{
550 if (scif_putready(p_siopcb)){
551 scif_putchar(p_siopcb, c);
552 return(true);
553 }
554 return(false);
555}
556
557/*
558 * シリアルI/Oポートからの文字受信
559 */
560int_t
561scif_rcv_chr(SIOPCB *p_siopcb)
562{
563 char rxdata;
564 if (scif_getready(p_siopcb)) {
565 if (scif_getchar(p_siopcb, &rxdata)) {
566 return((int_t)rxdata);
567 }
568 }
569 return(-1);
570}
571
572/*
573 * シリアルI/Oポートからのコールバックの許可
574 */
575void
576scif_ena_cbr(SIOPCB *p_siopcb, uint_t cbrtn)
577{
578 switch (cbrtn) {
579 case SIO_RDY_SND:
580 scif_enable_send(p_siopcb);
581 break;
582 case SIO_RDY_RCV:
583 scif_enable_rcv(p_siopcb);
584 break;
585 }
586}
587
588/*
589 * シリアルI/Oポートからのコールバックの禁止
590 */
591void
592scif_dis_cbr(SIOPCB *p_siopcb, uint_t cbrtn)
593{
594 switch (cbrtn) {
595 case SIO_RDY_SND:
596 scif_disable_send(p_siopcb);
597 break;
598 case SIO_RDY_RCV:
599 scif_disable_rcv(p_siopcb);
600 break;
601 }
602}
603
604/*
605 * SIOの割込みサービスルーチン
606 */
607void
608scif_tx_isr(ID siopid)
609{
610 SIOPCB *p_siopcb = get_siopcb(siopid);
611
612 if (scif_putready(p_siopcb)) {
613 scif_irdy_snd(p_siopcb->exinf);
614 }
615}
616
617
618/*
619 * SIOの割込みサービスルーチン
620 */
621void
622scif_rx_isr(ID siopid)
623{
624 SIOPCB *p_siopcb = get_siopcb(siopid);
625 while (scif_getready(p_siopcb)) {
626 scif_irdy_rcv(p_siopcb->exinf);
627 }
628}
Note: See TracBrowser for help on using the repository browser.