source: asp3_tinet_ecnl_rx/trunk/ntshell/src/tSIOPortNTShellMain.c@ 387

Last change on this file since 387 was 387, checked in by coas-nagasima, 5 years ago

ファイルディスクリプタ処理を更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 6.3 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-2018 by Embedded and Real-Time Systems Laboratory
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 *
9 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
10 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
11 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
12 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
13 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
14 * スコード中に含まれていること.
15 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
16 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
17 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
18 * の無保証規定を掲載すること.
19 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
20 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
21 * と.
22 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
23 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
24 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
25 * 報告すること.
26 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
27 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
28 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
29 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
30 * 免責すること.
31 *
32 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
33 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
34 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
35 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
36 * の責任を負わない.
37 *
38 * $Id$
39 */
40
41/*
42 * シリアルインタフェースドライバのターゲット依存部(NTShell用)
43 */
44
45#include <t_stddef.h>
46#include <t_syslog.h>
47#include <errno.h>
48#include <termios.h>
49#include <unistd.h>
50#include <fcntl.h>
51#include "tSIOPortNTShellMain_tecsgen.h"
52#include "syssvc/siofd.h"
53
54/*
55 * SIOポートのオープン
56 */
57void
58eSIOPort_open(CELLIDX idx)
59{
60 CELLCB *p_cellcb = GET_CELLCB(idx);
61 int_t fd;
62 struct termios term;
63
64 if (!VAR_opened) {
65 /*
66 * 既にオープンしている場合は、二重にオープンしない.
67 */
68 if (ATTR_path != NULL) {
69 fd = siofd_open(ATTR_path, O_RDWR, 0777);
70 assert(fd >= 0);
71 VAR_read_fd = fd;
72 VAR_write_fd = fd;
73 }
74 else {
75 fd = STDIN_FILENO; /* 標準入出力を使う */
76 VAR_read_fd = STDIN_FILENO;
77 VAR_write_fd = STDOUT_FILENO;
78 }
79 siofd_fcntl(fd, F_SETOWN, getpid());
80 siofd_fcntl(fd, F_SETFL, (O_NONBLOCK | O_ASYNC));
81
82 siofd_tcgetattr(fd, &VAR_saved_term);
83 term = VAR_saved_term;
84 term.c_lflag &= ~(ECHO | ICANON);
85 siofd_tcsetattr(fd, TCSAFLUSH, &term);
86
87 VAR_rcv_flag = false;
88 VAR_rcv_rdy = false;
89 VAR_snd_flag = false;
90 VAR_snd_rdy = false;
91 VAR_opened = true;
92 }
93}
94
95/*
96 * SIOポートのクローズ
97 */
98void
99eSIOPort_close(CELLIDX idx)
100{
101 CELLCB *p_cellcb = GET_CELLCB(idx);
102 int_t fd;
103
104 if (VAR_opened) {
105 fd = VAR_read_fd;
106 siofd_tcsetattr(fd, TCSAFLUSH, &VAR_saved_term);
107 siofd_fcntl(fd, F_SETFL, 0);
108
109 if (ATTR_path != NULL) {
110 siofd_close(VAR_read_fd);
111 }
112 VAR_opened = false;
113 }
114}
115
116/*
117 * SIOポートへの文字送信
118 */
119bool_t
120eSIOPort_putChar(CELLIDX idx, char c)
121{
122 CELLCB *p_cellcb = GET_CELLCB(idx);
123 int_t n;
124
125 if (!VAR_snd_flag) {
126 if ((n = siofd_write(VAR_write_fd, &c, 1)) > 0) {
127 return(true);
128 }
129 else {
130 assert(n < 0 && errno == EAGAIN);
131 VAR_snd_flag = true;
132 VAR_snd_buf = c;
133 return(true);
134 }
135 }
136 else {
137 return(false);
138 }
139}
140
141/*
142 * SIOポートからの文字受信
143 */
144int_t
145eSIOPort_getChar(CELLIDX idx)
146{
147 CELLCB *p_cellcb = GET_CELLCB(idx);
148 char c;
149 int_t n;
150
151 if (VAR_rcv_flag) {
152 VAR_rcv_flag = false;
153 return((int_t)(uint8_t)(VAR_rcv_buf));
154 }
155 else if ((n = siofd_read(VAR_read_fd, &c, 1)) > 0) {
156 return((int_t)(uint8_t) c);
157 }
158 else {
159 assert(n < 0 && errno == EAGAIN);
160 return(-1);
161 }
162}
163
164/*
165 * SIOポートからのコールバックの許可
166 */
167void
168eSIOPort_enableCBR(CELLIDX idx, uint_t cbrtn)
169{
170 CELLCB *p_cellcb = GET_CELLCB(idx);
171
172 switch (cbrtn) {
173 case SIOSendReady:
174 VAR_snd_rdy = true;
175 break;
176 case SIOReceiveReady:
177 VAR_rcv_rdy = true;
178 break;
179 }
180}
181
182/*
183 * SIOポートからのコールバックの禁止
184 */
185void
186eSIOPort_disableCBR(CELLIDX idx, uint_t cbrtn)
187{
188 CELLCB *p_cellcb = GET_CELLCB(idx);
189
190 switch (cbrtn) {
191 case SIOSendReady:
192 VAR_snd_rdy = false;
193 break;
194 case SIOReceiveReady:
195 VAR_rcv_rdy = false;
196 break;
197 }
198}
199
200/*
201 * SIOの割込みサービスルーチン
202 */
203bool_t
204sio_isr_snd(ID siopid)
205{
206 if (!(1 <= siopid && siopid <= tSIOPortNTShellMain_N_CELL))
207 return false;
208 CELLIDX idx = &tSIOPortNTShellMain_CB_tab[siopid - 1];
209 CELLCB *p_cellcb = GET_CELLCB(idx);
210 int_t n;
211
212 if (VAR_snd_flag) {
213 if ((n = siofd_write(VAR_write_fd, &(VAR_snd_buf), 1)) > 0) {
214 VAR_snd_flag = false;
215 if (VAR_snd_rdy) {
216 ciSIOCBR_readySend();
217 return VAR_snd_rdy;
218 }
219 }
220 }
221
222 return false;
223}
224
225/*
226 * SIOの割込みサービスルーチン
227 */
228bool_t
229sio_isr_rcv(ID siopid, char c)
230{
231 if (!(1 <= siopid && siopid <= tSIOPortNTShellMain_N_CELL))
232 return false;
233 CELLIDX idx = &tSIOPortNTShellMain_CB_tab[siopid - 1];
234 CELLCB *p_cellcb = GET_CELLCB(idx);
235
236 if (!VAR_rcv_flag) {
237 VAR_rcv_buf = c;
238 VAR_rcv_flag = true;
239 if (VAR_rcv_rdy) {
240 ciSIOCBR_readyReceive();
241 return VAR_rcv_rdy;
242 }
243 }
244
245 return false;
246}
247
248/*
249 * SIOドライバの終了処理
250 */
251void
252eTerminate_main(CELLIDX idx)
253{
254 eSIOPort_close(idx);
255}
Note: See TracBrowser for help on using the repository browser.