[388] | 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) 2006-2015 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: tSerialPortMain.c 388 2019-05-22 11:25:18Z coas-nagasima $
|
---|
| 56 | */
|
---|
| 57 |
|
---|
| 58 | /*
|
---|
| 59 | * ã·ãªã¢ã«ã¤ã³ã¿ãã§ã¼ã¹ãã©ã¤ã
|
---|
| 60 | */
|
---|
| 61 |
|
---|
| 62 | #include <kernel.h>
|
---|
| 63 | #include "tSerialPortMain_tecsgen.h"
|
---|
| 64 | #include <t_syslog.h>
|
---|
| 65 |
|
---|
| 66 | /*
|
---|
| 67 | * ããã¼å¶å¾¡ã«é¢é£ããå®æ°ã¨ãã¯ã
|
---|
| 68 | */
|
---|
| 69 | #define FC_STOP '\023' /* ã³ã³ããã¼ã«-S */
|
---|
| 70 | #define FC_START '\021' /* ã³ã³ããã¼ã«-Q */
|
---|
| 71 |
|
---|
| 72 | #define BUFCNT_STOP(bufsz) ((bufsz) * 3 / 4) /* STOPãéãåºæºæåæ° */
|
---|
| 73 | #define BUFCNT_START(bufsz) ((bufsz) / 2) /* STARTãéãåºæºæåæ° */
|
---|
| 74 |
|
---|
| 75 | /*
|
---|
| 76 | * ãã¤ã³ã¿ã®ã¤ã³ã¯ãªã¡ã³ã
|
---|
| 77 | */
|
---|
| 78 | #define INC_PTR(ptr, bufsz) do { \
|
---|
| 79 | if (++(ptr) == (bufsz)) { \
|
---|
| 80 | (ptr) = 0; \
|
---|
| 81 | } \
|
---|
| 82 | } while (false)
|
---|
| 83 |
|
---|
| 84 | /*
|
---|
| 85 | * ãµã¼ãã¹ã³ã¼ã«å¼åºããã¯ã
|
---|
| 86 | *
|
---|
| 87 | * ãµã¼ãã¹ã³ã¼ã«å¼åºããå«ãå¼expãè©ä¾¡ãï¼è¿å¤ãã¨ã©ã¼ï¼è² ã®å¤ï¼ã®å ´
|
---|
| 88 | * åã«ã¯ï¼ercã«ercd_expãè©ä¾¡ããå¤ã代å
|
---|
| 89 | ¥ãï¼error_exitã«gotoããï¼
|
---|
| 90 | */
|
---|
| 91 | #define SVC(exp, ercd_exp) do { \
|
---|
| 92 | if ((exp) < 0) { \
|
---|
| 93 | ercd = (ercd_exp); \
|
---|
| 94 | goto error_exit; \
|
---|
| 95 | } \
|
---|
| 96 | } while (false)
|
---|
| 97 |
|
---|
| 98 | /*
|
---|
| 99 | * E_SYSã¨ã©ã¼ã®çæ
|
---|
| 100 | */
|
---|
| 101 | static ER
|
---|
| 102 | gen_ercd_sys(CELLCB *p_cellcb)
|
---|
| 103 | {
|
---|
| 104 | VAR_errorFlag = true;
|
---|
| 105 | return(E_SYS);
|
---|
| 106 | }
|
---|
| 107 |
|
---|
| 108 | /*
|
---|
| 109 | * å¾
|
---|
| 110 | ã¡ã«å
|
---|
| 111 | ¥ããµã¼ãã¹ã³ã¼ã«ããã®ã¨ã©ã¼ã®å¤æ
|
---|
| 112 | */
|
---|
| 113 | static ER
|
---|
| 114 | gen_ercd_wait(ER rercd, CELLCB *p_cellcb)
|
---|
| 115 | {
|
---|
| 116 | switch (MERCD(rercd)) {
|
---|
| 117 | case E_RLWAI:
|
---|
| 118 | case E_DLT:
|
---|
| 119 | case E_RASTER:
|
---|
| 120 | return(rercd);
|
---|
| 121 | default:
|
---|
| 122 | VAR_errorFlag = true;
|
---|
| 123 | return(E_SYS);
|
---|
| 124 | }
|
---|
| 125 | }
|
---|
| 126 |
|
---|
| 127 | /*
|
---|
| 128 | * ã·ãªã¢ã«ãã¼ãã®ãªã¼ãã³ï¼åãå£é¢æ°ï¼
|
---|
| 129 | */
|
---|
| 130 | ER
|
---|
| 131 | eSerialPort_open(CELLIDX idx)
|
---|
| 132 | {
|
---|
| 133 | CELLCB *p_cellcb;
|
---|
| 134 | ER ercd;
|
---|
| 135 |
|
---|
| 136 | if (sns_dpn()) { /* ã³ã³ããã¹ãã®ãã§ã㯠*/
|
---|
| 137 | return(E_CTX);
|
---|
| 138 | }
|
---|
| 139 | if (!VALID_IDX(idx)) {
|
---|
| 140 | return(E_ID); /* ãã¼ãçªå·ã®ãã§ã㯠*/
|
---|
| 141 | }
|
---|
| 142 | p_cellcb = GET_CELLCB(idx);
|
---|
| 143 |
|
---|
| 144 | SVC(dis_dsp(), gen_ercd_sys(p_cellcb));
|
---|
| 145 | if (VAR_openFlag) { /* ãªã¼ãã³æ¸ã¿ãã®ãã§ã㯠*/
|
---|
| 146 | ercd = E_OBJ;
|
---|
| 147 | }
|
---|
| 148 | else {
|
---|
| 149 | /*
|
---|
| 150 | * å¤æ°ã®åæå
|
---|
| 151 | */
|
---|
| 152 | VAR_ioControl = (IOCTL_ECHO | IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV);
|
---|
| 153 |
|
---|
| 154 | VAR_receiveReadPointer = 0U;
|
---|
| 155 | VAR_receiveWritePointer = 0U;
|
---|
| 156 | VAR_receiveCount = 0U;
|
---|
| 157 | VAR_receiveFlowControl = '\0';
|
---|
| 158 | VAR_receiveStopped = false;
|
---|
| 159 |
|
---|
| 160 | VAR_sendReadPointer = 0U;
|
---|
| 161 | VAR_sendWritePointer = 0U;
|
---|
| 162 | VAR_sendCount = 0U;
|
---|
| 163 | VAR_sendStopped = false;
|
---|
| 164 |
|
---|
| 165 | /*
|
---|
| 166 | * ãã以éï¼å²è¾¼ã¿ãç¦æ¢ããï¼
|
---|
| 167 | */
|
---|
| 168 | if (loc_cpu() < 0) {
|
---|
| 169 | ercd = E_SYS;
|
---|
| 170 | goto error_exit_enadsp;
|
---|
| 171 | }
|
---|
| 172 |
|
---|
| 173 | /*
|
---|
| 174 | * ãã¼ãã¦ã§ã¢ä¾åã®ãªã¼ãã³å¦ç
|
---|
| 175 | */
|
---|
| 176 | cSIOPort_open();
|
---|
| 177 |
|
---|
| 178 | /*
|
---|
| 179 | * åä¿¡éç¥ã³ã¼ã«ããã¯ã許å¯ããï¼
|
---|
| 180 | */
|
---|
| 181 | cSIOPort_enableCBR(SIOReceiveReady);
|
---|
| 182 | VAR_openFlag = true;
|
---|
| 183 | VAR_errorFlag = false;
|
---|
| 184 |
|
---|
| 185 | if (unl_cpu() < 0) {
|
---|
| 186 | VAR_errorFlag = true;
|
---|
| 187 | ercd = E_SYS;
|
---|
| 188 | goto error_exit_enadsp;
|
---|
| 189 | }
|
---|
| 190 | ercd = E_OK;
|
---|
| 191 | }
|
---|
| 192 |
|
---|
| 193 | error_exit_enadsp:
|
---|
| 194 | SVC(ena_dsp(), gen_ercd_sys(p_cellcb));
|
---|
| 195 |
|
---|
| 196 | error_exit:
|
---|
| 197 | return(ercd);
|
---|
| 198 | }
|
---|
| 199 |
|
---|
| 200 | /*
|
---|
| 201 | * ã·ãªã¢ã«ãã¼ãã®ã¯ãã¼ãºï¼åãå£é¢æ°ï¼
|
---|
| 202 | */
|
---|
| 203 | ER
|
---|
| 204 | eSerialPort_close(CELLIDX idx)
|
---|
| 205 | {
|
---|
| 206 | CELLCB *p_cellcb;
|
---|
| 207 | ER ercd;
|
---|
| 208 | bool_t eflag = false;
|
---|
| 209 |
|
---|
| 210 | if (sns_dpn()) { /* ã³ã³ããã¹ãã®ãã§ã㯠*/
|
---|
| 211 | return(E_CTX);
|
---|
| 212 | }
|
---|
| 213 | if (!VALID_IDX(idx)) {
|
---|
| 214 | return(E_ID); /* ãã¼ãçªå·ã®ãã§ã㯠*/
|
---|
| 215 | }
|
---|
| 216 | p_cellcb = GET_CELLCB(idx);
|
---|
| 217 |
|
---|
| 218 | SVC(dis_dsp(), gen_ercd_sys(p_cellcb));
|
---|
| 219 | if (!VAR_openFlag) { /* ãªã¼ãã³æ¸ã¿ãã®ãã§ã㯠*/
|
---|
| 220 | ercd = E_OBJ;
|
---|
| 221 | }
|
---|
| 222 | else {
|
---|
| 223 | /*
|
---|
| 224 | * ãã¼ãã¦ã§ã¢ä¾åã®ã¯ãã¼ãºå¦ç
|
---|
| 225 | */
|
---|
| 226 | if (loc_cpu() < 0) {
|
---|
| 227 | eflag = true;
|
---|
| 228 | }
|
---|
| 229 | cSIOPort_close();
|
---|
| 230 | VAR_openFlag = false;
|
---|
| 231 | if (unl_cpu() < 0) {
|
---|
| 232 | eflag = true;
|
---|
| 233 | }
|
---|
| 234 |
|
---|
| 235 | /*
|
---|
| 236 | * ã»ããã©ã®åæå
|
---|
| 237 | */
|
---|
| 238 | if (cSendSemaphore_initialize() < 0) {
|
---|
| 239 | eflag = true;
|
---|
| 240 | }
|
---|
| 241 | if (cReceiveSemaphore_initialize() < 0) {
|
---|
| 242 | eflag = true;
|
---|
| 243 | }
|
---|
| 244 |
|
---|
| 245 | /*
|
---|
| 246 | * ã¨ã©ã¼ã³ã¼ãã®è¨å®
|
---|
| 247 | */
|
---|
| 248 | if (eflag) {
|
---|
| 249 | ercd = gen_ercd_sys(p_cellcb);
|
---|
| 250 | }
|
---|
| 251 | else {
|
---|
| 252 | ercd = E_OK;
|
---|
| 253 | }
|
---|
| 254 | }
|
---|
| 255 | SVC(ena_dsp(), gen_ercd_sys(p_cellcb));
|
---|
| 256 |
|
---|
| 257 | error_exit:
|
---|
| 258 | return(ercd);
|
---|
| 259 | }
|
---|
| 260 |
|
---|
| 261 | /*
|
---|
| 262 | * ã·ãªã¢ã«ãã¼ãã¸ã®æåéä¿¡
|
---|
| 263 | *
|
---|
| 264 | * p_cellcbã§æå®ãããSIOãã¼ãã«å¯¾ãã¦ï¼æåcãéä¿¡ããï¼æåãéä¿¡
|
---|
| 265 | * ã¬ã¸ã¹ã¿ã«ãããå ´åã«ã¯trueãè¿ãï¼ããã§ãªãå ´åã«ã¯ï¼éä¿¡ã¬ã¸ã¹
|
---|
| 266 | * ã¿ã空ãããã¨ãéç¥ããã³ã¼ã«ããã¯é¢æ°ã許å¯ãï¼falseãè¿ãï¼ãã®
|
---|
| 267 | * é¢æ°ã¯ï¼CPUããã¯ç¶æ
|
---|
| 268 | ã§å¼ã³åºãããï¼
|
---|
| 269 | */
|
---|
| 270 | Inline bool_t
|
---|
| 271 | serialPort_sendChar(CELLCB *p_cellcb, char c)
|
---|
| 272 | {
|
---|
| 273 | if (cSIOPort_putChar(c)) {
|
---|
| 274 | return(true);
|
---|
| 275 | }
|
---|
| 276 | else {
|
---|
| 277 | cSIOPort_enableCBR(SIOSendReady);
|
---|
| 278 | return(false);
|
---|
| 279 | }
|
---|
| 280 | }
|
---|
| 281 |
|
---|
| 282 | /*
|
---|
| 283 | * ã·ãªã¢ã«ãã¼ãã¸ã®1æåéä¿¡
|
---|
| 284 | */
|
---|
| 285 | static ER_BOOL
|
---|
| 286 | serialPort_writeChar(CELLCB *p_cellcb, char c)
|
---|
| 287 | {
|
---|
| 288 | bool_t buffer_full;
|
---|
| 289 | ER ercd, rercd;
|
---|
| 290 |
|
---|
| 291 | /*
|
---|
| 292 | * LFã®åã«CRãéä¿¡ããï¼
|
---|
| 293 | */
|
---|
| 294 | if (c == '\n' && (VAR_ioControl & IOCTL_CRLF) != 0U) {
|
---|
| 295 | /*
|
---|
| 296 | * 以ä¸ã®ã³ã¼ãã¯å帰å¼åºãã«ãªã£ã¦ãããï¼å¼æ°cã'\n'ã®å ´åã«
|
---|
| 297 | * å¼æ°cã'\r'ã¨ãã¦å¼ã³åºããã¨ããï¼ãã®å帰å¼åºãã¯2åç®ã®
|
---|
| 298 | * å¼ã³åºãã§å¿
|
---|
| 299 | ãæ¢ã¾ãï¼
|
---|
| 300 | */
|
---|
| 301 | SVC(rercd = serialPort_writeChar(p_cellcb, '\r'), rercd);
|
---|
| 302 | if ((bool_t) rercd) {
|
---|
| 303 | SVC(rercd = cSendSemaphore_wait(),
|
---|
| 304 | gen_ercd_wait(rercd, p_cellcb));
|
---|
| 305 | }
|
---|
| 306 | }
|
---|
| 307 |
|
---|
| 308 | SVC(loc_cpu(), gen_ercd_sys(p_cellcb));
|
---|
| 309 | if (VAR_sendCount == 0U && !VAR_sendStopped
|
---|
| 310 | && serialPort_sendChar(p_cellcb, c)) {
|
---|
| 311 | /*
|
---|
| 312 | * SIOã®éä¿¡ã¬ã¸ã¹ã¿ã«æåãå
|
---|
| 313 | ¥ãããã¨ã«æåããå ´åï¼
|
---|
| 314 | */
|
---|
| 315 | buffer_full = false;
|
---|
| 316 | }
|
---|
| 317 | else {
|
---|
| 318 | /*
|
---|
| 319 | * éä¿¡ãããã¡ã«æåãå
|
---|
| 320 | ¥ããï¼
|
---|
| 321 | */
|
---|
| 322 | VAR_sendBuffer[VAR_sendWritePointer] = c;
|
---|
| 323 | INC_PTR(VAR_sendWritePointer, ATTR_sendBufferSize);
|
---|
| 324 | VAR_sendCount++;
|
---|
| 325 | buffer_full = (VAR_sendCount == ATTR_sendBufferSize);
|
---|
| 326 | }
|
---|
| 327 |
|
---|
| 328 | SVC(unl_cpu(), gen_ercd_sys(p_cellcb));
|
---|
| 329 | ercd = (ER_BOOL) buffer_full;
|
---|
| 330 |
|
---|
| 331 | error_exit:
|
---|
| 332 | return(ercd);
|
---|
| 333 | }
|
---|
| 334 |
|
---|
| 335 | /*
|
---|
| 336 | * ã·ãªã¢ã«ãã¼ãã¸ã®æååéä¿¡ï¼åãå£é¢æ°ï¼
|
---|
| 337 | */
|
---|
| 338 | ER_UINT
|
---|
| 339 | eSerialPort_write(CELLIDX idx, const char *buffer, uint_t length)
|
---|
| 340 | {
|
---|
| 341 | CELLCB *p_cellcb;
|
---|
| 342 | bool_t buffer_full;
|
---|
| 343 | uint_t wricnt = 0U;
|
---|
| 344 | ER ercd, rercd;
|
---|
| 345 |
|
---|
| 346 | if (sns_dpn()) { /* ã³ã³ããã¹ãã®ãã§ã㯠*/
|
---|
| 347 | return(E_CTX);
|
---|
| 348 | }
|
---|
| 349 | if (!VALID_IDX(idx)) { /* ãã¼ãçªå·ã®ãã§ã㯠*/
|
---|
| 350 | return(E_ID);
|
---|
| 351 | }
|
---|
| 352 |
|
---|
| 353 | p_cellcb = GET_CELLCB(idx);
|
---|
| 354 | if (!VAR_openFlag) { /* ãªã¼ãã³æ¸ã¿ãã®ãã§ã㯠*/
|
---|
| 355 | return(E_OBJ);
|
---|
| 356 | }
|
---|
| 357 | if (VAR_errorFlag) { /* ã¨ã©ã¼ç¶æ
|
---|
| 358 | ãã®ãã§ã㯠*/
|
---|
| 359 | return(E_SYS);
|
---|
| 360 | }
|
---|
| 361 |
|
---|
| 362 | buffer_full = true; /* ã«ã¼ãã®1åãã¯wai_semãã */
|
---|
| 363 | while (wricnt < length) {
|
---|
| 364 | if (buffer_full) {
|
---|
| 365 | SVC(rercd = cSendSemaphore_wait(),
|
---|
| 366 | gen_ercd_wait(rercd, p_cellcb));
|
---|
| 367 | }
|
---|
| 368 | SVC(rercd = serialPort_writeChar(p_cellcb, *buffer++), rercd);
|
---|
| 369 | wricnt++;
|
---|
| 370 | buffer_full = (bool_t) rercd;
|
---|
| 371 | }
|
---|
| 372 | if (!buffer_full) {
|
---|
| 373 | SVC(cSendSemaphore_signal(), gen_ercd_sys(p_cellcb));
|
---|
| 374 | }
|
---|
| 375 | ercd = E_OK;
|
---|
| 376 |
|
---|
| 377 | error_exit:
|
---|
| 378 | return(wricnt > 0U ? (ER_UINT) wricnt : ercd);
|
---|
| 379 | }
|
---|
| 380 |
|
---|
| 381 | /*
|
---|
| 382 | * ã·ãªã¢ã«ãã¼ãããã®1æååä¿¡
|
---|
| 383 | */
|
---|
| 384 | static bool_t
|
---|
| 385 | serialPort_readChar(CELLCB *p_cellcb, char *p_c)
|
---|
| 386 | {
|
---|
| 387 | bool_t buffer_empty;
|
---|
| 388 | ER ercd;
|
---|
| 389 |
|
---|
| 390 | SVC(loc_cpu(), gen_ercd_sys(p_cellcb));
|
---|
| 391 |
|
---|
| 392 | /*
|
---|
| 393 | * åä¿¡ãããã¡ããæåãåãåºãï¼
|
---|
| 394 | */
|
---|
| 395 | *p_c = VAR_receiveBuffer[VAR_receiveReadPointer];
|
---|
| 396 | INC_PTR(VAR_receiveReadPointer, ATTR_receiveBufferSize);
|
---|
| 397 | VAR_receiveCount--;
|
---|
| 398 | buffer_empty = (VAR_receiveCount == 0U);
|
---|
| 399 |
|
---|
| 400 | /*
|
---|
| 401 | * STARTãéä¿¡ããï¼
|
---|
| 402 | */
|
---|
| 403 | if (VAR_receiveStopped && VAR_receiveCount
|
---|
| 404 | <= BUFCNT_START(ATTR_receiveBufferSize)) {
|
---|
| 405 | if (!serialPort_sendChar(p_cellcb, FC_START)) {
|
---|
| 406 | VAR_receiveFlowControl = FC_START;
|
---|
| 407 | }
|
---|
| 408 | VAR_receiveStopped = false;
|
---|
| 409 | }
|
---|
| 410 |
|
---|
| 411 | SVC(unl_cpu(), gen_ercd_sys(p_cellcb));
|
---|
| 412 | ercd = (ER_BOOL) buffer_empty;
|
---|
| 413 |
|
---|
| 414 | error_exit:
|
---|
| 415 | return(ercd);
|
---|
| 416 | }
|
---|
| 417 |
|
---|
| 418 | /*
|
---|
| 419 | * ã·ãªã¢ã«ãã¼ãããã®æåååä¿¡ï¼åãå£é¢æ°ï¼
|
---|
| 420 | */
|
---|
| 421 | ER_UINT
|
---|
| 422 | eSerialPort_read(CELLIDX idx, char *buffer, uint_t length, TMO tmout)
|
---|
| 423 | {
|
---|
| 424 | CELLCB *p_cellcb;
|
---|
| 425 | bool_t buffer_empty;
|
---|
| 426 | uint_t reacnt = 0U;
|
---|
| 427 | char c = '\0'; /* ã³ã³ãã¤ã©ã®è¦åãææ¢ããããã«åæåãã */
|
---|
| 428 | ER ercd, rercd;
|
---|
| 429 |
|
---|
| 430 | if (sns_dpn()) { /* ã³ã³ããã¹ãã®ãã§ã㯠*/
|
---|
| 431 | return(E_CTX);
|
---|
| 432 | }
|
---|
| 433 | if (!VALID_IDX(idx)) { /* ãã¼ãçªå·ã®ãã§ã㯠*/
|
---|
| 434 | return(E_ID);
|
---|
| 435 | }
|
---|
| 436 |
|
---|
| 437 | p_cellcb = GET_CELLCB(idx);
|
---|
| 438 | if (!VAR_openFlag) { /* ãªã¼ãã³æ¸ã¿ãã®ãã§ã㯠*/
|
---|
| 439 | return(E_OBJ);
|
---|
| 440 | }
|
---|
| 441 | if (VAR_errorFlag) { /* ã¨ã©ã¼ç¶æ
|
---|
| 442 | ãã®ãã§ã㯠*/
|
---|
| 443 | return(E_SYS);
|
---|
| 444 | }
|
---|
| 445 |
|
---|
| 446 | buffer_empty = true; /* ã«ã¼ãã®1åãã¯wai_semãã */
|
---|
| 447 | while (reacnt < length) {
|
---|
| 448 | if (buffer_empty) {
|
---|
| 449 | rercd = cReceiveSemaphore_waitTimeout(tmout);
|
---|
| 450 | if (rercd == E_TMOUT)
|
---|
| 451 | return E_TMOUT;
|
---|
| 452 | if (rercd < 0) {
|
---|
| 453 | gen_ercd_wait(rercd, p_cellcb);
|
---|
| 454 | ercd = rercd;
|
---|
| 455 | goto error_exit;
|
---|
| 456 | }
|
---|
| 457 | }
|
---|
| 458 | SVC(rercd = serialPort_readChar(p_cellcb, &c), rercd);
|
---|
| 459 | *buffer++ = c;
|
---|
| 460 | reacnt++;
|
---|
| 461 | buffer_empty = (bool_t) rercd;
|
---|
| 462 |
|
---|
| 463 | /*
|
---|
| 464 | * ã¨ã³ã¼ããã¯å¦çï¼
|
---|
| 465 | */
|
---|
| 466 | if ((VAR_ioControl & IOCTL_ECHO) != 0U) {
|
---|
| 467 | SVC(rercd = cSendSemaphore_wait(),
|
---|
| 468 | gen_ercd_wait(rercd, p_cellcb));
|
---|
| 469 | SVC(rercd = serialPort_writeChar(p_cellcb, c), rercd);
|
---|
| 470 | if (!((bool_t) rercd)) {
|
---|
| 471 | SVC(cSendSemaphore_signal(), gen_ercd_sys(p_cellcb));
|
---|
| 472 | }
|
---|
| 473 | }
|
---|
| 474 | }
|
---|
| 475 | if (!buffer_empty) {
|
---|
| 476 | SVC(cReceiveSemaphore_signal(), gen_ercd_sys(p_cellcb));
|
---|
| 477 | }
|
---|
| 478 | ercd = E_OK;
|
---|
| 479 |
|
---|
| 480 | error_exit:
|
---|
| 481 | return(reacnt > 0U ? (ER_UINT) reacnt : ercd);
|
---|
| 482 | }
|
---|
| 483 |
|
---|
| 484 | /*
|
---|
| 485 | * ã·ãªã¢ã«ãã¼ãã®å¶å¾¡ï¼åãå£é¢æ°ï¼
|
---|
| 486 | */
|
---|
| 487 | ER
|
---|
| 488 | eSerialPort_control(CELLIDX idx, uint_t ioctl)
|
---|
| 489 | {
|
---|
| 490 | CELLCB *p_cellcb;
|
---|
| 491 |
|
---|
| 492 | if (sns_dpn()) { /* ã³ã³ããã¹ãã®ãã§ã㯠*/
|
---|
| 493 | return(E_CTX);
|
---|
| 494 | }
|
---|
| 495 | if (!VALID_IDX(idx)) {
|
---|
| 496 | return(E_ID); /* ãã¼ãçªå·ã®ãã§ã㯠*/
|
---|
| 497 | }
|
---|
| 498 |
|
---|
| 499 | p_cellcb = GET_CELLCB(idx);
|
---|
| 500 | if (!VAR_openFlag) { /* ãªã¼ãã³æ¸ã¿ãã®ãã§ã㯠*/
|
---|
| 501 | return(E_OBJ);
|
---|
| 502 | }
|
---|
| 503 | if (VAR_errorFlag) { /* ã¨ã©ã¼ç¶æ
|
---|
| 504 | ãã®ãã§ã㯠*/
|
---|
| 505 | return(E_SYS);
|
---|
| 506 | }
|
---|
| 507 |
|
---|
| 508 | VAR_ioControl = ioctl;
|
---|
| 509 | return(E_OK);
|
---|
| 510 | }
|
---|
| 511 |
|
---|
| 512 | /*
|
---|
| 513 | * ã·ãªã¢ã«ãã¼ãç¶æ
|
---|
| 514 | ã®åç
|
---|
| 515 | §ï¼åãå£é¢æ°ï¼
|
---|
| 516 | */
|
---|
| 517 | ER
|
---|
| 518 | eSerialPort_refer(CELLIDX idx, T_SERIAL_RPOR* pk_rpor)
|
---|
| 519 | {
|
---|
| 520 | CELLCB *p_cellcb;
|
---|
| 521 |
|
---|
| 522 | if (sns_dpn()) { /* ã³ã³ããã¹ãã®ãã§ã㯠*/
|
---|
| 523 | return(E_CTX);
|
---|
| 524 | }
|
---|
| 525 | if (!VALID_IDX(idx)) {
|
---|
| 526 | return(E_ID); /* ãã¼ãçªå·ã®ãã§ã㯠*/
|
---|
| 527 | }
|
---|
| 528 |
|
---|
| 529 | p_cellcb = GET_CELLCB(idx);
|
---|
| 530 | if (!VAR_openFlag) { /* ãªã¼ãã³æ¸ã¿ãã®ãã§ã㯠*/
|
---|
| 531 | return(E_OBJ);
|
---|
| 532 | }
|
---|
| 533 | if (VAR_errorFlag) { /* ã¨ã©ã¼ç¶æ
|
---|
| 534 | ãã®ãã§ã㯠*/
|
---|
| 535 | return(E_SYS);
|
---|
| 536 | }
|
---|
| 537 |
|
---|
| 538 | pk_rpor->reacnt = VAR_receiveCount;
|
---|
| 539 | pk_rpor->wricnt = VAR_sendCount;
|
---|
| 540 | return(E_OK);
|
---|
| 541 | }
|
---|
| 542 |
|
---|
| 543 | /*
|
---|
| 544 | * ã·ãªã¢ã«ãã¼ãããã®éä¿¡å¯è½ã³ã¼ã«ããã¯ï¼åãå£é¢æ°ï¼
|
---|
| 545 | */
|
---|
| 546 | void
|
---|
| 547 | eiSIOCBR_readySend(CELLIDX idx)
|
---|
| 548 | {
|
---|
| 549 | CELLCB *p_cellcb;
|
---|
| 550 |
|
---|
| 551 | assert(VALID_IDX(idx));
|
---|
| 552 | p_cellcb = GET_CELLCB(idx);
|
---|
| 553 | if (VAR_receiveFlowControl != '\0') {
|
---|
| 554 | /*
|
---|
| 555 | * START/STOP ãéä¿¡ããï¼
|
---|
| 556 | */
|
---|
| 557 | (void) cSIOPort_putChar(VAR_receiveFlowControl);
|
---|
| 558 | VAR_receiveFlowControl = '\0';
|
---|
| 559 | }
|
---|
| 560 | else if (!VAR_sendStopped && VAR_sendCount > 0U) {
|
---|
| 561 | /*
|
---|
| 562 | * éä¿¡ãããã¡ä¸ããæåãåãåºãã¦éä¿¡ããï¼
|
---|
| 563 | */
|
---|
| 564 | (void) cSIOPort_putChar(VAR_sendBuffer[VAR_sendReadPointer]);
|
---|
| 565 | INC_PTR(VAR_sendReadPointer, ATTR_sendBufferSize);
|
---|
| 566 | if (VAR_sendCount == ATTR_sendBufferSize) {
|
---|
| 567 | if (ciSendSemaphore_signal() < 0) {
|
---|
| 568 | VAR_errorFlag = true;
|
---|
| 569 | }
|
---|
| 570 | }
|
---|
| 571 | VAR_sendCount--;
|
---|
| 572 | }
|
---|
| 573 | else {
|
---|
| 574 | /*
|
---|
| 575 | * éä¿¡ãã¹ãæåããªãå ´åã¯ï¼éä¿¡å¯è½ã³ã¼ã«ããã¯ãç¦æ¢ããï¼
|
---|
| 576 | */
|
---|
| 577 | cSIOPort_disableCBR(SIOSendReady);
|
---|
| 578 | }
|
---|
| 579 | }
|
---|
| 580 |
|
---|
| 581 | /*
|
---|
| 582 | * ã·ãªã¢ã«ãã¼ãããã®åä¿¡éç¥ã³ã¼ã«ããã¯ï¼åãå£é¢æ°ï¼
|
---|
| 583 | */
|
---|
| 584 | void
|
---|
| 585 | eiSIOCBR_readyReceive(CELLIDX idx)
|
---|
| 586 | {
|
---|
| 587 | CELLCB *p_cellcb;
|
---|
| 588 | char c;
|
---|
| 589 |
|
---|
| 590 | assert(VALID_IDX(idx));
|
---|
| 591 | p_cellcb = GET_CELLCB(idx);
|
---|
| 592 | c = (char) cSIOPort_getChar();
|
---|
| 593 | if ((VAR_ioControl & IOCTL_FCSND) != 0U && c == FC_STOP) {
|
---|
| 594 | /*
|
---|
| 595 | * éä¿¡ãä¸æåæ¢ããï¼éä¿¡ä¸ã®æåã¯ãã®ã¾ã¾éä¿¡ããï¼
|
---|
| 596 | */
|
---|
| 597 | VAR_sendStopped = true;
|
---|
| 598 | }
|
---|
| 599 | else if (VAR_sendStopped && (c == FC_START
|
---|
| 600 | || (VAR_ioControl & IOCTL_FCANY) != 0U)) {
|
---|
| 601 | /*
|
---|
| 602 | * éä¿¡ãåéããï¼
|
---|
| 603 | */
|
---|
| 604 | VAR_sendStopped = false;
|
---|
| 605 | if (VAR_sendCount > 0U) {
|
---|
| 606 | c = VAR_sendBuffer[VAR_sendReadPointer];
|
---|
| 607 | if (serialPort_sendChar(p_cellcb, c)) {
|
---|
| 608 | INC_PTR(VAR_sendReadPointer, ATTR_sendBufferSize);
|
---|
| 609 | if (VAR_sendCount == ATTR_sendBufferSize) {
|
---|
| 610 | if (ciSendSemaphore_signal() < 0) {
|
---|
| 611 | VAR_errorFlag = true;
|
---|
| 612 | }
|
---|
| 613 | }
|
---|
| 614 | VAR_sendCount--;
|
---|
| 615 | }
|
---|
| 616 | }
|
---|
| 617 | }
|
---|
| 618 | else if ((VAR_ioControl & IOCTL_FCSND) != 0U && c == FC_START) {
|
---|
| 619 | /*
|
---|
| 620 | * éä¿¡ã«å¯¾ãã¦ããã¼å¶å¾¡ãã¦ããå ´åï¼START ã¯æ¨ã¦ãï¼
|
---|
| 621 | */
|
---|
| 622 | }
|
---|
| 623 | else if (VAR_receiveCount == ATTR_receiveBufferSize) {
|
---|
| 624 | /*
|
---|
| 625 | * ãããã¡ãã«ã®å ´åï¼åä¿¡ããæåãæ¨ã¦ãï¼
|
---|
| 626 | */
|
---|
| 627 | }
|
---|
| 628 | else {
|
---|
| 629 | /*
|
---|
| 630 | * åä¿¡ããæåãåä¿¡ãããã¡ã«å
|
---|
| 631 | ¥ããï¼
|
---|
| 632 | */
|
---|
| 633 | VAR_receiveBuffer[VAR_receiveWritePointer] = c;
|
---|
| 634 | INC_PTR(VAR_receiveWritePointer, ATTR_receiveBufferSize);
|
---|
| 635 | if (VAR_receiveCount == 0U) {
|
---|
| 636 | if (ciReceiveSemaphore_signal() < 0) {
|
---|
| 637 | VAR_errorFlag = true;
|
---|
| 638 | }
|
---|
| 639 | }
|
---|
| 640 | VAR_receiveCount++;
|
---|
| 641 |
|
---|
| 642 | /*
|
---|
| 643 | * STOPãéä¿¡ããï¼
|
---|
| 644 | */
|
---|
| 645 | if ((VAR_ioControl & IOCTL_FCRCV) != 0U && !VAR_receiveStopped
|
---|
| 646 | && VAR_receiveCount >= BUFCNT_STOP(ATTR_receiveBufferSize)) {
|
---|
| 647 | if (!serialPort_sendChar(p_cellcb, FC_STOP)) {
|
---|
| 648 | VAR_receiveFlowControl = FC_STOP;
|
---|
| 649 | }
|
---|
| 650 | VAR_receiveStopped = true;
|
---|
| 651 | }
|
---|
| 652 | }
|
---|
| 653 | }
|
---|
| 654 |
|
---|
| 655 | /*
|
---|
| 656 | * ã·ãªã¢ã«ã¤ã³ã¿ãã§ã¼ã¹ãã©ã¤ãããã®æªéä¿¡æåã®ååºã
|
---|
| 657 | */
|
---|
| 658 | bool_t
|
---|
| 659 | enSerialPortManage_getChar(CELLIDX idx, char *p_c)
|
---|
| 660 | {
|
---|
| 661 | CELLCB *p_cellcb;
|
---|
| 662 |
|
---|
| 663 | if (VALID_IDX(idx)) { /* ãã¼ãçªå·ã®ãã§ã㯠*/
|
---|
| 664 | p_cellcb = GET_CELLCB(idx);
|
---|
| 665 | if (VAR_openFlag) { /* ãªã¼ãã³æ¸ã¿ãã®ãã§ã㯠*/
|
---|
| 666 | if (VAR_sendCount > 0U) {
|
---|
| 667 | *p_c = VAR_sendBuffer[VAR_sendReadPointer];
|
---|
| 668 | INC_PTR(VAR_sendReadPointer, ATTR_sendBufferSize);
|
---|
| 669 | VAR_sendCount--;
|
---|
| 670 | return(true);
|
---|
| 671 | }
|
---|
| 672 | }
|
---|
| 673 | }
|
---|
| 674 | return(false);
|
---|
| 675 | }
|
---|