source: ssp_qb_r5f100le_cs/trunk/syssvc/serial.c@ 93

Last change on this file since 93 was 93, checked in by nmir-saito, 9 years ago

add Combined package of SSP kernel for QB-R5F100LE-TB(RL78 processor)

File size: 15.7 KB
Line 
1/*
2 * TOPPERS/SSP Kernel
3 * Smallest Set Profile Kernel
4 *
5 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
6 * Toyohashi Univ. of Technology, JAPAN
7 * Copyright (C) 2006-2008 by Embedded and Real-Time Systems Laboratory
8 * Graduate School of Information Science, Nagoya Univ., JAPAN
9 * Copyright (C) 2010-2012 by Meika Sugimoto
10 * Copyright (C) 2015 by Naoki Saito
11 * Nagoya Municipal Industrial Research Institute, JAPAN
12 *
13 * ã‹L’˜ìŒ ŽÒ‚́CˆÈ‰º‚Ì(1)`(4)‚ÌðŒ‚ð–ž‚½‚·ê‡‚ÉŒÀ‚èC–{ƒ\ƒtƒgƒEƒF
14 * ƒAi–{ƒ\ƒtƒgƒEƒFƒA‚ð‰ü•Ï‚µ‚½‚à‚Ì‚ðŠÜ‚ށDˆÈ‰º“¯‚¶j‚ðŽg—pE•¡»E‰ü
15 * •ÏEÄ”z•ziˆÈ‰ºC—˜—p‚ƌĂԁj‚·‚邱‚Ƃ𖳏ž‚Å‹–‘ø‚·‚éD
16 * (1) –{ƒ\ƒtƒgƒEƒFƒA‚ðƒ\[ƒXƒR[ƒh‚ÌŒ`‚Å—˜—p‚·‚éê‡‚ɂ́Cã‹L‚Ì’˜ì
17 * Œ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’肪C‚»‚Ì‚Ü‚Ü‚ÌŒ`‚Ń\[
18 * ƒXƒR[ƒh’†‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚邱‚ƁD
19 * (2) –{ƒ\ƒtƒgƒEƒFƒA‚ðCƒ‰ƒCƒuƒ‰ƒŠŒ`Ž®‚ȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
20 * —p‚Å‚«‚éŒ`‚ōĔz•z‚·‚éê‡‚ɂ́CÄ”z•z‚É”º‚¤ƒhƒLƒ…
21ƒƒ“ƒgi—˜—p
22 * ŽÒƒ}ƒjƒ…
23ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L
24 * ‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
25 * (3) –{ƒ\ƒtƒgƒEƒFƒA‚ðC‹@Ší‚É‘g‚ݍž‚ނȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
26 * —p‚Å‚«‚È‚¢Œ`‚ōĔz•z‚·‚éê‡‚ɂ́CŽŸ‚Ì‚¢‚¸‚ê‚©‚ÌðŒ‚ð–ž‚½‚·‚±
27 * ‚ƁD
28 * (a) Ä”z•z‚É”º‚¤ƒhƒLƒ…
29ƒƒ“ƒgi—˜—pŽÒƒ}ƒjƒ…
30ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜
31 * ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
32 * (b) Ä”z•z‚ÌŒ`‘Ô‚ðC•Ê‚É’è‚ß‚é•û–@‚É‚æ‚Á‚āCTOPPERSƒvƒƒWƒFƒNƒg‚É
33 * •ñ‚·‚邱‚ƁD
34 * (4) –{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚é‚¢‚©‚Ȃ鑹
35 * ŠQ‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD
36 * ‚Ü‚½C–{ƒ\ƒtƒgƒEƒFƒA‚̃†[ƒU‚Ü‚½‚̓Gƒ“ƒhƒ†[ƒU‚©‚ç‚Ì‚¢‚©‚Ȃ闝
37 * —R‚ÉŠî‚­¿‹‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð
38 * –Ɛӂ·‚邱‚ƁD
39 *
40 * –{ƒ\ƒtƒgƒEƒFƒA‚́C–³•ÛØ‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Å‚ ‚éDã‹L’˜ìŒ ŽÒ‚¨
41 * ‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚́C–{ƒ\ƒtƒgƒEƒFƒA‚ÉŠÖ‚µ‚āC“Á’è‚ÌŽg—p–Ú“I
42 * ‚ɑ΂·‚é“K‡«‚àŠÜ‚߂āC‚¢‚©‚È‚é•ÛØ‚às‚í‚È‚¢D‚Ü‚½C–{ƒ\ƒtƒgƒEƒF
43 * ƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚½‚¢‚©‚Ȃ鑹ŠQ‚ÉŠÖ‚µ‚Ä‚àC‚»
44 * ‚̐ӔC‚𕉂í‚È‚¢D
45 */
46
47/*
48 * ƒVƒŠƒAƒ‹ƒCƒ“ƒ^ƒtƒF[ƒXƒhƒ‰ƒCƒo
49 */
50
51#include <kernel.h>
52#include "target_syssvc.h"
53#include "target_serial.h"
54#include "serial.h"
55#include "kernel_cfg.h"
56
57/*
58 * ƒoƒbƒtƒ@ƒTƒCƒY‚̃fƒtƒHƒ‹ƒg’l‚ƃoƒbƒtƒ@‚Ì’è‹`
59 */
60#ifndef SERIAL_RCV_BUFSZ1
61#define SERIAL_RCV_BUFSZ1 64 /* ƒ|[ƒg1‚ÌŽóMƒoƒbƒtƒ@ƒTƒCƒY */
62#endif /* SERIAL_RCV_BUFSZ1 */
63
64#ifndef SERIAL_SND_BUFSZ1
65#define SERIAL_SND_BUFSZ1 256 /* ƒ|[ƒg1‚Ì‘—Mƒoƒbƒtƒ@ƒTƒCƒY */
66#endif /* SERIAL_SND_BUFSZ1 */
67
68static char rcv_buffer1[SERIAL_RCV_BUFSZ1];
69static char snd_buffer1[SERIAL_SND_BUFSZ1];
70
71#if TNUM_PORT >= 2 /* ƒ|[ƒg2‚ÉŠÖ‚·‚é’è‹` */
72
73#ifndef SERIAL_RCV_BUFSZ2
74#define SERIAL_RCV_BUFSZ2 64 /* ƒ|[ƒg2‚ÌŽóMƒoƒbƒtƒ@ƒTƒCƒY */
75#endif /* SERIAL_RCV_BUFSZ2 */
76
77#ifndef SERIAL_SND_BUFSZ2
78#define SERIAL_SND_BUFSZ2 64 /* ƒ|[ƒg2‚Ì‘—Mƒoƒbƒtƒ@ƒTƒCƒY */
79#endif /* SERIAL_SND_BUFSZ2 */
80
81static char rcv_buffer2[SERIAL_RCV_BUFSZ2];
82static char snd_buffer2[SERIAL_SND_BUFSZ2];
83
84#endif /* TNUM_PORT >= 2 */
85
86#if TNUM_PORT >= 3 /* ƒ|[ƒg3‚ÉŠÖ‚·‚é’è‹` */
87
88#ifndef SERIAL_RCV_BUFSZ3
89#define SERIAL_RCV_BUFSZ3 64 /* ƒ|[ƒg3‚ÌŽóMƒoƒbƒtƒ@ƒTƒCƒY */
90#endif /* SERIAL_RCV_BUFSZ3 */
91
92#ifndef SERIAL_SND_BUFSZ3
93#define SERIAL_SND_BUFSZ3 64 /* ƒ|[ƒg3‚Ì‘—Mƒoƒbƒtƒ@ƒTƒCƒY */
94#endif /* SERIAL_SND_BUFSZ3 */
95
96static char rcv_buffer3[SERIAL_RCV_BUFSZ3];
97static char snd_buffer3[SERIAL_SND_BUFSZ3];
98
99#endif /* TNUM_PORT >= 3 */
100
101/*
102 * ƒVƒŠƒAƒ‹ƒ|[ƒg‰Šú‰»ƒuƒƒbƒN
103 */
104typedef struct serial_port_initialization_block {
105 uint_t rcv_bufsz; /* ŽóMƒoƒbƒtƒ@ƒTƒCƒY */
106 char *rcv_buffer; /* ŽóMƒoƒbƒtƒ@ */
107 uint_t snd_bufsz; /* ‘—Mƒoƒbƒtƒ@ƒTƒCƒY */
108 char *snd_buffer; /* ‘—Mƒoƒbƒtƒ@ */
109} SPINIB;
110
111static const SPINIB spinib_table[TNUM_PORT] = {
112 { SERIAL_RCV_BUFSZ1, rcv_buffer1,
113 SERIAL_SND_BUFSZ1, snd_buffer1 },
114#if TNUM_PORT >= 2
115 { SERIAL_RCV_BUFSZ2, rcv_buffer2,
116 SERIAL_SND_BUFSZ2, snd_buffer2 },
117#endif /* TNUM_PORT >= 2 */
118#if TNUM_PORT >= 3
119 { SERIAL_RCV_BUFSZ3, rcv_buffer3,
120 SERIAL_SND_BUFSZ3, snd_buffer3 },
121#endif /* TNUM_PORT >= 3 */
122};
123
124/*
125 * ƒVƒŠƒAƒ‹ƒ|[ƒgŠÇ—ƒuƒƒbƒN
126 */
127typedef struct serial_port_control_block {
128 const SPINIB *p_spinib; /* ƒVƒŠƒAƒ‹ƒ|[ƒg‰Šú‰»ƒuƒƒbƒN */
129 SIOPCB *p_siopcb; /* ƒVƒŠƒAƒ‹I/Oƒ|[ƒgŠÇ—ƒuƒƒbƒN */
130 bool_t openflag; /* ƒI[ƒvƒ“Ï‚݃tƒ‰ƒO */
131 bool_t errorflag; /* ƒGƒ‰[ƒtƒ‰ƒO */
132 uint_t ioctl; /* “®ì§Œä‚̐ݒè’l */
133
134 uint_t rcv_read_ptr; /* ŽóMƒoƒbƒtƒ@“Ǐo‚µƒ|ƒCƒ“ƒ^ */
135 uint_t rcv_write_ptr; /* ŽóMƒoƒbƒtƒ@‘ž‚݃|ƒCƒ“ƒ^ */
136 uint_t rcv_count; /* ŽóMƒoƒbƒtƒ@’†‚Ì•¶Žš” */
137
138 uint_t snd_read_ptr; /* ‘—Mƒoƒbƒtƒ@“Ǐo‚µƒ|ƒCƒ“ƒ^ */
139 uint_t snd_write_ptr; /* ‘—Mƒoƒbƒtƒ@‘ž‚݃|ƒCƒ“ƒ^ */
140 uint_t snd_count; /* ‘—Mƒoƒbƒtƒ@’†‚Ì•¶Žš” */
141} SPCB;
142
143static SPCB spcb_table[TNUM_PORT];
144
145/*
146 * ƒVƒŠƒAƒ‹ƒ|[ƒgID‚©‚çƒVƒŠƒAƒ‹ƒ|[ƒgŠÇ—ƒuƒƒbƒN‚ðŽæ‚èo‚·‚½‚߂̃}ƒNƒ
147 */
148#define INDEX_PORT(portid) ((uint_t)((portid) - 1))
149#define get_spcb(portid) (&(spcb_table[INDEX_PORT(portid)]))
150
151/*
152 * ƒ|ƒCƒ“ƒ^‚̃Cƒ“ƒNƒŠƒƒ“ƒg
153 */
154#define INC_PTR(ptr, bufsz) { if (++(ptr) == (bufsz)) { (ptr) = 0; }}
155
156/*
157 * ƒT[ƒrƒXƒR[ƒ‹ŒÄo‚µƒ}ƒNƒ
158 *
159 * ƒT[ƒrƒXƒR[ƒ‹ŒÄo‚µ‚ðŠÜ‚ÞŽ®exp‚ð•]‰¿‚µC•Ô’l‚ªƒGƒ‰[i•‰‚Ì’lj‚̏ê
160 * ‡‚ɂ́Cerc‚Éercd_exp‚ð•]‰¿‚µ‚½’l‚ð‘ã“ü‚µCerror_exit‚Égoto‚·‚éD
161 */
162#define SVC(exp, ercd_exp) \
163 { if ((exp) < 0) { ercd = (ercd_exp); goto error_exit; }}
164
165/*
166 * E_SYSƒGƒ‰[‚̐¶¬
167 */
168static ER
169gen_ercd_sys(SPCB *p_spcb)
170{
171 p_spcb->errorflag = true;
172 return(E_SYS);
173}
174
175
176/*
177 * ƒVƒŠƒAƒ‹ƒCƒ“ƒ^ƒtƒF[ƒXƒhƒ‰ƒCƒo‚̏‰Šú‰»ƒ‹[ƒ`ƒ“
178 */
179void
180serial_initialize(intptr_t exinf)
181{
182 uint_t i;
183 SPCB *p_spcb;
184
185 for (i = 0; i < TNUM_PORT; i++) {
186 p_spcb = &(spcb_table[i]);
187 p_spcb->p_spinib = &(spinib_table[i]);
188 p_spcb->openflag = false;
189 }
190}
191
192/*
193 * ƒVƒŠƒAƒ‹ƒCƒ“ƒ^[ƒtƒF[ƒXƒhƒ‰ƒCƒo‚̏I—¹ƒ‹[ƒ`ƒ“
194 */
195
196void
197serial_terminate(intptr_t exinf)
198{
199 uint_t i;
200 SPCB *p_spcb;
201
202 /* ƒoƒbƒtƒ@‚ÉŽc‚Á‚Ä‚¢‚é‘S‚Ä‚Ì•¶Žš‚ðo—Í‚·‚é */
203 for (i = 0; i < TNUM_PORT; i++) {
204 p_spcb = &(spcb_table[i]);
205
206 while(p_spcb->snd_count != 0U)
207 {
208 if(sio_snd_chr(p_spcb->p_siopcb,
209 p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr]) == true)
210 {
211 INC_PTR(p_spcb->snd_read_ptr, p_spcb->p_spinib->snd_bufsz);
212 p_spcb->snd_count--;
213 }
214 }
215 }
216
217}
218
219/*
220 * ƒVƒŠƒAƒ‹ƒ|[ƒg‚̃I[ƒvƒ“iƒT[ƒrƒXƒR[ƒ‹j
221 */
222ER
223serial_opn_por(ID portid)
224{
225 SPCB *p_spcb;
226 ER ercd;
227
228 if (sns_dpn()) { /* ƒRƒ“ƒeƒLƒXƒg‚̃`ƒFƒbƒN */
229 return(E_CTX);
230 }
231 if (!(1 <= portid && portid <= TNUM_PORT)) {
232 return(E_ID); /* ƒ|[ƒg”ԍ†‚̃`ƒFƒbƒN */
233 }
234 p_spcb = get_spcb(portid);
235
236 SVC(dis_dsp(), gen_ercd_sys(p_spcb));
237 if (p_spcb->openflag) { /* ƒI[ƒvƒ“Ï‚Ý‚©‚̃`ƒFƒbƒN */
238 ercd = E_OBJ;
239 }
240 else {
241 /*
242 * •Ï”‚̏‰Šú‰»
243 */
244 p_spcb->ioctl = (IOCTL_ECHO | IOCTL_CRLF);
245
246 p_spcb->rcv_read_ptr = p_spcb->rcv_write_ptr = 0U;
247 p_spcb->rcv_count = 0U;
248
249 p_spcb->snd_read_ptr = p_spcb->snd_write_ptr = 0U;
250 p_spcb->snd_count = 0U;
251
252 /*
253 * ‚±‚êˆÈ~CŠ„ž‚Ý‚ð‹ÖŽ~‚·‚éD
254 */
255 if (loc_cpu() < 0) {
256 ercd = E_SYS;
257 goto error_exit_enadsp;
258 }
259
260 /*
261 * ƒn[ƒhƒEƒFƒAˆË‘¶‚̃I[ƒvƒ“ˆ—
262 */
263 p_spcb->p_siopcb = sio_opn_por(portid, (intptr_t) p_spcb);
264
265 /*
266 * ŽóM’Ê’mƒR[ƒ‹ƒoƒbƒN‚ð‹–‰Â‚·‚éD
267 */
268 sio_ena_cbr(p_spcb->p_siopcb, SIO_RDY_RCV);
269 p_spcb->openflag = true;
270 p_spcb->errorflag = false;
271
272 if (unl_cpu() < 0) {
273 p_spcb->errorflag = true;
274 ercd = E_SYS;
275 goto error_exit_enadsp;
276 }
277 ercd = E_OK;
278 }
279
280 error_exit_enadsp:
281 SVC(ena_dsp(), gen_ercd_sys(p_spcb));
282
283 error_exit:
284 return(ercd);
285}
286
287/*
288 * ƒVƒŠƒAƒ‹ƒ|[ƒg‚̃Nƒ[ƒYiƒT[ƒrƒXƒR[ƒ‹j
289 */
290ER
291serial_cls_por(ID portid)
292{
293 SPCB *p_spcb;
294 ER ercd;
295 bool_t eflag = false;
296
297 if (sns_dpn()) { /* ƒRƒ“ƒeƒLƒXƒg‚̃`ƒFƒbƒN */
298 return(E_CTX);
299 }
300 if (!(1 <= portid && portid <= TNUM_PORT)) {
301 return(E_ID); /* ƒ|[ƒg”ԍ†‚̃`ƒFƒbƒN */
302 }
303 p_spcb = get_spcb(portid);
304
305 SVC(dis_dsp(), gen_ercd_sys(p_spcb));
306 if (!(p_spcb->openflag)) { /* ƒI[ƒvƒ“Ï‚Ý‚©‚̃`ƒFƒbƒN */
307 ercd = E_OBJ;
308 }
309 else {
310 /*
311 * ƒn[ƒhƒEƒFƒAˆË‘¶‚̃Nƒ[ƒYˆ—
312 */
313 if (loc_cpu() < 0) {
314 eflag = true;
315 }
316 sio_cls_por(p_spcb->p_siopcb);
317 p_spcb->openflag = false;
318 if (unl_cpu() < 0) {
319 eflag = true;
320 }
321
322 /*
323 * ƒGƒ‰[ƒR[ƒh‚̐ݒè
324 */
325 if (eflag) {
326 ercd = gen_ercd_sys(p_spcb);
327 }
328 else {
329 ercd = E_OK;
330 }
331 }
332 SVC(ena_dsp(), gen_ercd_sys(p_spcb));
333
334 error_exit:
335 return(ercd);
336}
337
338/*
339 * ƒVƒŠƒAƒ‹ƒ|[ƒg‚Ö‚Ì•¶Žš‘—M
340 *
341 * p_spcb‚ÅŽw’肳‚ê‚éƒVƒŠƒAƒ‹I/Oƒ|[ƒg‚ɑ΂µ‚āC•¶Žšc‚𑗐M‚·‚éD•¶Žš
342 * ‚𑗐MƒŒƒWƒXƒ^‚É‚¢‚ꂽê‡‚É‚Ítrue‚ð•Ô‚·D‚»‚¤‚Å‚È‚¢ê‡‚ɂ́C‘—M
343 * ƒŒƒWƒXƒ^‚ª‹ó‚¢‚½‚±‚Æ‚ð’Ê’m‚·‚éƒR[ƒ‹ƒoƒbƒNŠÖ”‚ð‹–‰Â‚µCfalse‚ð•Ô‚·D
344 * ‚±‚̊֐”‚́CCPUƒƒbƒNó‘ԂŌĂяo‚³‚ê‚éD
345 */
346Inline bool_t
347serial_snd_chr(SPCB *p_spcb, char c)
348{
349 if (sio_snd_chr(p_spcb->p_siopcb, c)) {
350 return(true);
351 }
352 else {
353 sio_ena_cbr(p_spcb->p_siopcb, SIO_RDY_SND);
354 return(false);
355 }
356}
357
358/*
359 * ƒVƒŠƒAƒ‹ƒ|[ƒg‚Ö‚Ì1•¶Žš‘—M
360 * Žw’肳‚ꂽ•¶Žš‚Ì‘—M‚ðŽŽ‚Ý‚é.
361 * ƒfƒoƒCƒX‚Ö‚Ì‘—M‚ª¬Œ÷‚µ‚½ê‡‚Ü‚½‚̓oƒbƒtƒ@‚É‹ó‚«‚ª‚ ‚èŠi”[‚Å‚«‚½ê‡‚Í false,
362 * ƒoƒbƒtƒ@‚ªƒtƒ‹‚ÅŠi”[‚Å‚«‚È‚©‚Á‚½ê‡‚Í true ‚ð•Ô‚·D
363 * ‚»‚êˆÈŠO‚̃Gƒ‰[‚ª”­¶‚µ‚½ê‡‚Í ER Œ^‚̃Gƒ‰[ƒR[ƒh‚ð•Ô‚·D
364 */
365static ER_BOOL
366serial_wri_chr(SPCB *p_spcb, char c)
367{
368 bool_t buffer_full;
369 ER ercd, rercd;
370
371 /*
372 * LF‚Ì‘O‚ÉCR‚𑗐M‚·‚éD
373 * ‚½‚¾‚µC1•¶ŽšˆÈ‰º‚Ì‹ó‚«‚µ‚©‚È‚¢ê‡‚̓oƒbƒtƒ@ƒtƒ‹‚Æ‚Ý‚È‚µC‘—M‚µ‚È‚¢D
374 */
375 if (c == '\n' && (p_spcb->ioctl & IOCTL_CRLF) != 0U) {
376 if(p_spcb->snd_count + 1U < p_spcb->p_spinib->snd_bufsz) {
377 SVC(rercd = serial_wri_chr(p_spcb, '\r'), rercd);
378 }
379 else {
380 return (ER_BOOL) true;
381 }
382 }
383
384 SVC(loc_cpu(), gen_ercd_sys(p_spcb));
385 if ((p_spcb->snd_count == 0U) && serial_snd_chr(p_spcb, c)) {
386 /*
387 * ƒVƒŠƒAƒ‹I/OƒfƒoƒCƒX‚Ì‘—MƒŒƒWƒXƒ^‚É•¶Žš‚ð“ü‚ê‚邱‚Ƃɐ¬Œ÷‚µ
388 * ‚½ê‡D
389 */
390 buffer_full = false;
391 }
392 else {
393 /*
394 * ‹ó‚«‚ª‚ ‚ê‚΁C‘—Mƒoƒbƒtƒ@‚É•¶Žš‚ð“ü‚ê‚éD
395 * ‹ó‚«‚ª‚È‚¢ê‡C‘—M‚µ‚È‚¢D
396 */
397 if(p_spcb->snd_count < p_spcb->p_spinib->snd_bufsz) {
398 p_spcb->p_spinib->snd_buffer[p_spcb->snd_write_ptr] = c;
399 INC_PTR(p_spcb->snd_write_ptr, p_spcb->p_spinib->snd_bufsz);
400 p_spcb->snd_count++;
401 buffer_full = false;
402 }
403 else {
404 buffer_full = true;
405 }
406 }
407
408 SVC(unl_cpu(), gen_ercd_sys(p_spcb));
409 ercd = (ER_BOOL) buffer_full;
410
411 error_exit:
412 return(ercd);
413}
414
415bool_t
416serial_rcvbuf_empty(SPCB *p_spcb)
417{
418 return (p_spcb->rcv_count == 0u);
419}
420
421/*
422 * ƒVƒŠƒAƒ‹ƒ|[ƒg‚Ö‚Ì•¶Žš—ñ‘—MiƒT[ƒrƒXƒR[ƒ‹j
423 */
424ER_UINT
425serial_wri_dat(ID portid, const char *buf, uint_t len)
426{
427 SPCB *p_spcb;
428 bool_t buffer_full;
429 uint_t wricnt = 0U;
430 ER ercd, rercd;
431
432 if (sns_dpn()) { /* ƒRƒ“ƒeƒLƒXƒg‚̃`ƒFƒbƒN */
433 return(E_CTX);
434 }
435 if (!(1 <= portid && portid <= TNUM_PORT)) {
436 return(E_ID); /* ƒ|[ƒg”ԍ†‚̃`ƒFƒbƒN */
437 }
438
439 p_spcb = get_spcb(portid);
440 if (!(p_spcb->openflag)) { /* ƒI[ƒvƒ“Ï‚Ý‚©‚̃`ƒFƒbƒN */
441 return(E_OBJ);
442 }
443 if (p_spcb->errorflag) { /* ƒGƒ‰[ó‘Ô‚©‚̃`ƒFƒbƒN */
444 return(E_SYS);
445 }
446
447 /*
448 * len ‚Ü‚Å1•¶Žš‚¸‚‘—M‚ðŽŽ‚Ý‚éD
449 * “r’†‚Ńoƒbƒtƒ@ƒtƒ‹‚É‚È‚Á‚½‚ç’†’f‚·‚éD
450 */
451 SVC((rercd = dis_dsp()) , rercd);
452 for(wricnt = 0U; wricnt < len; wricnt++) {
453 SVC(rercd = serial_wri_chr(p_spcb, *buf++), rercd);
454 buffer_full = (bool_t)rercd;
455 if(buffer_full) {
456 break;
457 }
458 }
459 SVC((rercd = ena_dsp()) , rercd);
460
461 ercd = E_OK;
462 error_exit:
463 return(wricnt > 0U ? (ER_UINT) wricnt : ercd);
464}
465
466/*
467 * ƒVƒŠƒAƒ‹ƒ|[ƒg‚©‚ç‚Ì1•¶ŽšŽóM
468 * •¶Žš‚ÌŽóM‚ðŽŽ‚Ý‚é.
469 * ƒoƒbƒtƒ@‚Ƀf[ƒ^‚ª‘¶Ý‚µCŽæ“¾‚Å‚«‚½ê‡‚Í false,
470 * ƒoƒbƒtƒ@‚ª‹ó‚Ŏ擾‚Å‚«‚È‚©‚Á‚½ê‡‚Í true ‚ð•Ô‚·D
471 * ‚»‚êˆÈŠO‚̃Gƒ‰[‚ª”­¶‚µ‚½ê‡‚Í ER Œ^‚̃Gƒ‰[ƒR[ƒh‚ð•Ô‚·D
472 */
473static ER_BOOL
474serial_rea_chr(SPCB *p_spcb, char *p_c)
475{
476 bool_t buffer_empty;
477 ER ercd;
478
479 SVC(loc_cpu(), gen_ercd_sys(p_spcb));
480
481 /*
482 * ƒf[ƒ^‚ª‘¶Ý‚·‚ê‚΁CŽóMƒoƒbƒtƒ@‚©‚當Žš‚ðŽæ‚èo‚·D
483 * ‚È‚¯‚ê‚ÎŽæ‚èo‚³‚È‚¢D
484 */
485 if(p_spcb->rcv_count > 0U) {
486 *p_c = p_spcb->p_spinib->rcv_buffer[p_spcb->rcv_read_ptr];
487 INC_PTR(p_spcb->rcv_read_ptr, p_spcb->p_spinib->rcv_bufsz);
488 p_spcb->rcv_count--;
489 buffer_empty = false;
490 }
491 else {
492 buffer_empty = true;
493 }
494
495 SVC(unl_cpu(), gen_ercd_sys(p_spcb));
496 ercd = (ER_BOOL) buffer_empty;
497
498 error_exit:
499 return(ercd);
500}
501
502/*
503 * ƒVƒŠƒAƒ‹ƒ|[ƒg‚©‚ç‚Ì•¶Žš—ñŽóMiƒT[ƒrƒXƒR[ƒ‹j
504 */
505ER_UINT
506serial_rea_dat(ID portid, char *buf, uint_t len)
507{
508 SPCB *p_spcb;
509 bool_t buffer_empty;
510 uint_t reacnt = 0U;
511 char c = '\0'; /* ƒRƒ“ƒpƒCƒ‰‚ÌŒx‚ð—}Ž~‚·‚邽‚߂ɏ‰Šú‰»‚·‚é */
512 ER ercd, rercd;
513
514 if (sns_dpn()) { /* ƒRƒ“ƒeƒLƒXƒg‚̃`ƒFƒbƒN */
515 return(E_CTX);
516 }
517 if (!(1 <= portid && portid <= TNUM_PORT)) {
518 return(E_ID); /* ƒ|[ƒg”ԍ†‚̃`ƒFƒbƒN */
519 }
520
521 p_spcb = get_spcb(portid);
522 if (!(p_spcb->openflag)) { /* ƒI[ƒvƒ“Ï‚Ý‚©‚̃`ƒFƒbƒN */
523 return(E_OBJ);
524 }
525 if (p_spcb->errorflag) { /* ƒGƒ‰[ó‘Ô‚©‚̃`ƒFƒbƒN */
526 return(E_SYS);
527 }
528
529 /*
530 * len ‚Ü‚ÅŽóM‚ðŽŽ‚Ý‚éD
531 * ƒoƒbƒtƒ@‚ª‹ó‚œǂݏo‚¹‚È‚©‚Á‚½ê‡‚Í’†’f‚·‚é
532 */
533 SVC((rercd = dis_dsp()) , rercd);
534 for(reacnt = 0U; reacnt < len; reacnt++) {
535 SVC(rercd = serial_rea_chr(p_spcb, &c), rercd);
536 buffer_empty = (bool_t)rercd;
537
538 if(buffer_empty) {
539 break;
540 }
541 else {
542 /*
543 * ƒGƒR[ƒoƒbƒNˆ—D
544 */
545 if ((p_spcb->ioctl & IOCTL_ECHO) != 0U) {
546 SVC(rercd = serial_wri_chr(p_spcb, c), rercd);
547 }
548 *buf++ = c;
549 }
550 }
551 SVC((rercd = ena_dsp()) , rercd);
552
553 ercd = E_OK;
554 error_exit:
555 return(reacnt > 0U ? (ER_UINT) reacnt : ercd);
556}
557
558/*
559 * ƒVƒŠƒAƒ‹ƒ|[ƒg‚̐§ŒäiƒT[ƒrƒXƒR[ƒ‹j
560 */
561ER
562serial_ctl_por(ID portid, uint_t ioctl)
563{
564 SPCB *p_spcb;
565
566 if (sns_dpn()) { /* ƒRƒ“ƒeƒLƒXƒg‚̃`ƒFƒbƒN */
567 return(E_CTX);
568 }
569 if (!(1 <= portid && portid <= TNUM_PORT)) {
570 return(E_ID); /* ƒ|[ƒg”ԍ†‚̃`ƒFƒbƒN */
571 }
572
573 p_spcb = get_spcb(portid);
574 if (!(p_spcb->openflag)) { /* ƒI[ƒvƒ“Ï‚Ý‚©‚̃`ƒFƒbƒN */
575 return(E_OBJ);
576 }
577 if (p_spcb->errorflag) { /* ƒGƒ‰[ó‘Ô‚©‚̃`ƒFƒbƒN */
578 return(E_SYS);
579 }
580
581 p_spcb->ioctl = ioctl;
582 return(E_OK);
583}
584
585/*
586 * ƒVƒŠƒAƒ‹ƒ|[ƒg‚©‚ç‚Ì‘—M‰Â”\ƒR[ƒ‹ƒoƒbƒN
587 */
588void
589sio_irdy_snd(intptr_t exinf)
590{
591 SPCB *p_spcb;
592
593 p_spcb = (SPCB *) exinf;
594
595 if (p_spcb->snd_count > 0U) {
596 /*
597 * ‘—Mƒoƒbƒtƒ@’†‚©‚當Žš‚ðŽæ‚èo‚µ‚Ä‘—M‚·‚éD
598 */
599 (void) sio_snd_chr(p_spcb->p_siopcb,
600 p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr]);
601 INC_PTR(p_spcb->snd_read_ptr, p_spcb->p_spinib->snd_bufsz);
602 p_spcb->snd_count--;
603 }
604 else {
605 /*
606 * ‘—M‚·‚ׂ«•¶Žš‚ª‚È‚¢ê‡‚́C‘—M‰Â”\ƒR[ƒ‹ƒoƒbƒN‚ð‹ÖŽ~‚·‚éD
607 */
608 sio_dis_cbr(p_spcb->p_siopcb, SIO_RDY_SND);
609 }
610}
611
612/*
613 * ƒVƒŠƒAƒ‹ƒ|[ƒg‚©‚ç‚ÌŽóM’Ê’mƒR[ƒ‹ƒoƒbƒN
614 */
615void
616sio_irdy_rcv(intptr_t exinf)
617{
618 SPCB *p_spcb;
619 char c;
620
621 p_spcb = (SPCB *) exinf;
622 c = (char) sio_rcv_chr(p_spcb->p_siopcb);
623
624 if (p_spcb->rcv_count != p_spcb->p_spinib->rcv_bufsz) {
625 /*
626 * ŽóM‚µ‚½•¶Žš‚ðŽóMƒoƒbƒtƒ@‚É“ü‚ê‚éD
627 * ƒoƒbƒtƒ@ƒtƒ‹‚̏ꍇCŽóM‚µ‚½•¶Žš‚ðŽÌ‚Ä‚éD
628 */
629 p_spcb->p_spinib->rcv_buffer[p_spcb->rcv_write_ptr] = c;
630 INC_PTR(p_spcb->rcv_write_ptr, p_spcb->p_spinib->rcv_bufsz);
631 p_spcb->rcv_count++;
632 }
633}
634
635/*
636 * ƒVƒŠƒAƒ‹ƒCƒ“ƒ^ƒtƒF[ƒXƒhƒ‰ƒCƒo‚©‚ç‚Ì–¢‘—M•¶Žš‚ÌŽæo‚µ
637 */
638bool_t
639serial_get_chr(ID portid, char *p_c)
640{
641 SPCB *p_spcb;
642
643 if (1 <= portid && portid <= TNUM_PORT) { /* ƒ|[ƒg”ԍ†‚̃`ƒFƒbƒN */
644 p_spcb = get_spcb(portid);
645 if (p_spcb->openflag) { /* ƒI[ƒvƒ“Ï‚Ý‚©‚̃`ƒFƒbƒN */
646 if (p_spcb->snd_count > 0U) {
647 *p_c = p_spcb->p_spinib->snd_buffer[p_spcb->snd_read_ptr];
648 INC_PTR(p_spcb->snd_read_ptr, p_spcb->p_spinib->snd_bufsz);
649 p_spcb->snd_count--;
650 return(true);
651 }
652 }
653 }
654 return(false);
655}
Note: See TracBrowser for help on using the repository browser.