source: anotherchoice/tags/jsp-1.4.4-full-UTF8/config/m16c-renesas/oaks16_mini/serial_mini.c@ 26

Last change on this file since 26 was 26, checked in by ykominami, 12 years ago

initial

File size: 8.0 KB
Line 
1/*
2 * TOPPERS/JSP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just 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) 2003-2004 by Ryosuke Takeuchi
9 * Platform Development Center RICOH COMPANY,LTD. JAPAN
10 *
11 * 上記著作権者
12は,Free Software Foundation によってå…
13¬è¡¨ã•ã‚Œã¦ã„ã‚‹
14 * GNU General Public License の Version 2 に記述されている条件か,以
15 * 下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェア(本ソフトウェ
16 * アを改変したものを含む.以下同じ)を使用・複製・改変・再é…
17å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
18 * 利用と呼ぶ)することを無償で許諾する.
19 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
20 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
21 * スコード中に含まれていること.
22 * (2) 本ソフトウェアを再利用可能なバイナリコード(リロケータブルオブ
23 * ジェクトファイルやライブラリなど)の形で利用する場合には,利用
24 * に伴うドキュメント(利用者
25マニュアルなど)に,上記の著作権表示,
26 * この利用条件および下記の無保証規定を掲載すること.
27 * (3) 本ソフトウェアを再利用不可能なバイナリコードの形または機器に組
28 * み込んだ形で利用する場合には,次のいずれかの条件を満たすこと.
29 * (a) 利用に伴うドキュメント(利用者
30マニュアルなど)に,上記の著作
31 * 権表示,この利用条件および下記の無保証規定を掲載すること.
32 * (b) 利用の形æ…
33‹ã‚’,別に定める方法によって,上記著作権者
34に報告する
35 * こと.
36 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
37 * 害からも,上記著作権者
38をå…
39è²¬ã™ã‚‹ã“と.
40 *
41 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
42は,
43 * 本ソフトウェアに関して,その適用可能性も含めて,いかなる保証も行わ
44 * ない.また,本ソフトウェアの利用により直接的または間接的に生じたい
45 * かなる損害に関しても,その責任を負わない.
46 *
47 * @(#) $Id: serial_mini.c,v 1.4 2007/01/05 02:33:59 honda Exp $
48 */
49
50/*
51 * シリアルインタフェースドライバ
52 */
53
54#include <t_services.h>
55#include <serial.h>
56#include <hw_serial.h>
57#include "kernel_id.h"
58
59/*
60 * シリアルポート管理ブロックの定義
61 */
62
63#define SERIAL_BUFSZ 9 /* シリアルインタフェース用バッファのサイズ */
64
65typedef struct serial_queue_block {
66 BOOL openflag; /* オープン済みフラグ */
67 UH base; /* hardware port base address */
68 ID rsemid; /* receive semaphore id */
69 ID ssemid; /* send semaphore id */
70 char head; /* queue head */
71 char tail; /* queue tail */
72 char size; /* バッファサイズ */
73 char buffer[SERIAL_BUFSZ]; /* バッファエリア */
74} SQUE;
75
76static SQUE in_queue[TNUM_SIOP] ={
77 FALSE, TADR_SFR_UART0_BASE, SERIAL_RCV_SEM1, SERIAL_SND_SEM1, 0, 0, SERIAL_BUFSZ, "",
78 FALSE, TADR_SFR_UART1_BASE, SERIAL_RCV_SEM2, SERIAL_SND_SEM2, 0, 0, SERIAL_BUFSZ, ""
79};
80
81/*
82 * シリアルポート管理ブロックの定義と初期化
83 */
84
85#define get_sque(portid) (&(in_queue[portid-1]))
86
87/*
88 * SFR UARTの初期化
89 */
90Inline void
91SFR_uart_initialize(ID portid)
92{
93 SQUE *q;
94 VB *ip = (VB*)(TADR_SFR_INT_BASE+TADR_SFR_S0RIC_OFFSET);
95
96 q = get_sque(portid);
97 /* 送受信モードレジスタの初期化 */
98 sil_wrb_mem((VP)(q->base+TADR_SFR_UMR_OFFSET), MR_DEF);
99 /* 送信制御レジスタの初期化 */
100 sil_wrb_mem((VP)(q->base+TADR_SFR_UC0_OFFSET), C0_DEF);
101 /* 転送速度レジスタの初期化 */
102 sil_wrb_mem((VP)(q->base+TADR_SFR_UBRG_OFFSET), BRG1_DEF);
103 /* 割込みレベルの設定 */
104 set_ic_ilvl((VP)(ip + ((INT)portid-1)*2), RB_LEVEL);
105 sil_wrb_mem((VP)(q->base+TADR_SFR_UC1_OFFSET), C1R_DEF);
106 sil_reb_mem((VP)(q->base+TADR_SFR_URB_OFFSET)); /* ダミーデータ受信 */
107 sil_reb_mem((VP)(q->base+TADR_SFR_URB_OFFSET)); /* ダミーデータ受信 */
108 q->openflag = TRUE;
109}
110
111/*
112 * SQUEの受信バッファからサイズを取り出す
113 */
114Inline int
115queue_size(SQUE *q)
116{
117 int size = q->head - q->tail;
118 if(size < 0)
119 size += q->size;
120 return size;
121}
122
123/*
124 * シリアルインタフェースドライバの起動
125 */
126void
127serial_initialize(VP_INT exinf)
128{
129 SFR_uart_initialize(LOGTASK_PORTID);
130}
131
132/*
133 * シリアルポートのオープン
134 */
135ER
136serial_opn_por(ID portid)
137{
138 SQUE *q;
139 VB *ip=(VB*)(TADR_SFR_INT_BASE+TADR_SFR_S0RIC_OFFSET);
140 ER ercd;
141
142 if (!(1 <= portid && portid <= TNUM_SIOP)) {
143 return(E_ID); /* ポート番号のチェック */
144 }
145 q = get_sque(portid);
146
147 _syscall(loc_cpu());
148 if (q->openflag) { /* オープン済みかのチェック */
149 ercd = E_OBJ;
150 }
151 else {
152 SFR_uart_initialize(portid);
153 ercd = E_OK;
154 }
155 _syscall(unl_cpu());
156 return(ercd);
157}
158
159/*
160 * シリアルポートのクローズ
161 */
162ER
163serial_cls_por(ID portid)
164{
165 SQUE *q;
166 VB *ip=(VB*)(TADR_SFR_INT_BASE+TADR_SFR_S0RIC_OFFSET);
167 ER ercd;
168
169 if (!(1 <= portid && portid <= TNUM_SIOP)) {
170 return(E_ID); /* ポート番号のチェック */
171 }
172 q = get_sque(portid);
173
174 _syscall(loc_cpu());
175 if (!(q->openflag)) { /* オープン済みかのチェック */
176 ercd = E_OBJ;
177 }
178 else {
179 set_ic_ilvl((VP)(ip + ((INT)portid-1)*2), 0);
180 sil_wrb_mem((VP)(q->base+TADR_SFR_UC1_OFFSET), C1S_DEF);
181 q->openflag = FALSE;
182 ercd = E_OK;
183 }
184 _syscall(unl_cpu());
185 return(ercd);
186}
187
188/*
189 * シリアルポートへの送信
190 */
191
192ER_UINT
193serial_wri_dat(ID portid, char *buf, UINT len)
194{
195 SQUE *q;
196 unsigned int i;
197 unsigned char c;
198
199 if (!(1 <= portid && portid <= TNUM_SIOP)) {
200 return(E_ID); /* ポート番号のチェック */
201 }
202
203 q = get_sque(portid);
204 if (!(q->openflag)) { /* オープン済みかのチェック */
205 return(E_OBJ);
206 }
207
208 wai_sem(q->ssemid);
209 for (i = 0; i < len; i++) {
210 while((sil_reb_mem((VP)(q->base+TADR_SFR_UC1_OFFSET)) & 0x2) == 0);
211 sil_wrb_mem((VP)(q->base+TADR_SFR_UTB_OFFSET), *buf++);
212 }
213 sig_sem(q->ssemid);
214 return(len);
215}
216
217/*
218 * シリアルポートからの受信
219 */
220
221ER_UINT
222serial_rea_dat(ID portid, char *buf, UINT len)
223{
224 SQUE *q;
225 UINT i;
226
227 if (!(1 <= portid && portid <= TNUM_SIOP)) {
228 return(E_ID); /* ポート番号のチェック */
229 }
230
231 q = get_sque(portid);
232 if (!(q->openflag)) { /* オープン済みかのチェック */
233 return(E_OBJ);
234 }
235
236 for (i = 0; i < len; i++) {
237 if (queue_size(q) == 0)
238 wai_sem(q->rsemid);
239 else
240 pol_sem(q->rsemid);
241 _syscall(loc_cpu());
242 *buf++ = q->buffer[q->tail++];
243 if (q->tail >= q->size) {
244 q->tail = 0;
245 }
246 _syscall(unl_cpu());
247 }
248 return(len);
249}
250
251/*
252 * シリアルポートの制御
253 */
254ER
255serial_ctl_por(ID portid, UINT ioctl)
256{
257 return(E_OK);
258}
259
260/*
261 * シリアルポート状æ…
262‹ã®å‚ç…
263§
264 */
265ER
266serial_ref_por(ID portid, T_SERIAL_RPOR *pk_rpor)
267{
268 SQUE *q;
269
270 if (sns_ctx()) { /* コンテキストのチェック */
271 return(E_CTX);
272 }
273 if (!(1 <= portid && portid <= TNUM_SIOP)) {
274 return(E_ID); /* ポート番号のチェック */
275 }
276
277 q = get_sque(portid);
278 if (!(q->openflag)) { /* オープン済みかのチェック */
279 return(E_OBJ);
280 }
281
282 pk_rpor->reacnt = queue_size(q);
283 pk_rpor->wricnt = 0;
284 return(E_OK);
285}
286
287/*
288 * シリアルポート割込みサービスルーチン
289 */
290
291void
292serial_handler_in(ID portid)
293{
294 SQUE *q;
295 int rdata; /* 受信バッファ */
296
297 q = get_sque(portid);
298 if (queue_size(q) < q->size) {
299 rdata = sil_reb_mem((VP)(q->base+TADR_SFR_URB_OFFSET)); /* データ受信 */
300 q->buffer[q->head++] = rdata;
301 if (q->head >= q->size)
302 q->head = 0;
303 isig_sem(q->rsemid);
304 }
305}
306
307/*
308 * 割込みハンドラ
309 */
310
311void
312serial_in_handler1(void)
313{
314 serial_handler_in(1);
315}
316
317void
318serial_in_handler2(void)
319{
320 serial_handler_in(2);
321}
322
Note: See TracBrowser for help on using the repository browser.