source: atk2-sc3_fl850f1l/kernel/ioc_manage.c@ 117

Last change on this file since 117 was 117, checked in by ertl-ishikawa, 9 years ago

ATK2-SC3 1.3.2 FL850F1L(RH850F1L)依存部(GCC/GHS/CCRH)を追加

File size: 10.8 KB
Line 
1/*
2 * TOPPERS ATK2
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 * Automotive Kernel Version 2
5 *
6 * Copyright (C) 2012-2015 by Center for Embedded Computing Systems
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 * Copyright (C) 2012-2015 by FUJI SOFT INCORPORATED, JAPAN
9 * Copyright (C) 2012-2013 by Spansion LLC, USA
10 * Copyright (C) 2012-2015 by NEC Communication Systems, Ltd., JAPAN
11 * Copyright (C) 2012-2015 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
12 * Copyright (C) 2012-2014 by Renesas Electronics Corporation, JAPAN
13 * Copyright (C) 2012-2015 by Sunny Giken Inc., JAPAN
14 * Copyright (C) 2012-2015 by TOSHIBA CORPORATION, JAPAN
15 * Copyright (C) 2012-2015 by Witz Corporation
16 * Copyright (C) 2014-2015 by AISIN COMCRUISE Co., Ltd., JAPAN
17 * Copyright (C) 2014-2015 by eSOL Co.,Ltd., JAPAN
18 * Copyright (C) 2014-2015 by SCSK Corporation, JAPAN
19 *
20 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
21 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
22 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
23 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
24 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
25 * スコード中に含まれていること.
26 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
27 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
28 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
29 * の無保証規定を掲載すること.
30 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
31 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
32 * と.
33 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
34 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
35 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
36 * 報告すること.
37 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
38 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
39 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
40 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
41 * 免責すること.
42 *
43 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
44 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
45 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
46 * 用する者に対して,AUTOSARパートナーになることを求めている.
47 *
48 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
49 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
50 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
51 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
52 * の責任を負わない.
53 *
54 * $Id: ioc_manage.c 187 2015-06-25 03:39:04Z t_ishikawa $
55 */
56
57/*
58 * IOCモジュール
59 */
60#include "ioc_impl.h"
61#include "check.h"
62
63/*
64 * トレースログマクロのデフォルト定義
65 */
66#ifndef LOG_IOCSEND_ENTER
67#define LOG_IOCSEND_ENTER(senderid)
68#endif /* LOG_IOCSEND_ENTER */
69
70#ifndef LOG_IOCSEND_LEAVE
71#define LOG_IOCSEND_LEAVE(ercd)
72#endif /* LOG_IOCSEND_LEAVE */
73
74#ifndef LOG_IOCWRITE_ENTER
75#define LOG_IOCWRITE_ENTER(senderid)
76#endif /* LOG_IOCWRITE_ENTER */
77
78#ifndef LOG_IOCWRITE_LEAVE
79#define LOG_IOCWRITE_LEAVE(ercd)
80#endif /* LOG_IOCWRITE_LEAVE */
81
82#ifndef LOG_IOCRECEIVE_ENTER
83#define LOG_IOCRECEIVE_ENTER(iocid)
84#endif /* LOG_IOCRECEIVE_ENTER */
85
86#ifndef LOG_IOCRECEIVE_LEAVE
87#define LOG_IOCRECEIVE_LEAVE(ercd)
88#endif /* LOG_IOCRECEIVE_LEAVE */
89
90#ifndef LOG_IOCREAD_ENTER
91#define LOG_IOCREAD_ENTER(iocid)
92#endif /* LOG_IOCREAD_ENTER */
93
94#ifndef LOG_IOCREAD_LEAVE
95#define LOG_IOCREAD_LEAVE(ercd)
96#endif /* LOG_IOCREAD_LEAVE */
97
98#ifndef LOG_IOCEMPTYQUEUE_ENTER
99#define LOG_IOCEMPTYQUEUE_ENTER(iocid)
100#endif /* LOG_IOCEMPTYQUEUE_ENTER */
101
102#ifndef LOG_IOCEMPTUQUEUE_LEAVE
103#define LOG_IOCEMPTUQUEUE_LEAVE(ercd)
104#endif /* LOG_IOCEMPTUQUEUE_LEAVE */
105
106
107/* 内部関数のプロトタイプ宣言 */
108LOCAL_INLINE void ioc_memcpy(void *p_dst, const void *p_src, uint32 sz);
109
110
111/*
112 * 初期化関数
113 */
114void
115ioc_initialize(void)
116{
117 IocType i;
118 IOCCB *p_ioccb;
119 const IOCINIB *p_iocinib;
120
121 /* キューの初期化 */
122 for (i = 0U; i < tnum_queueioc; i++) {
123 p_ioccb = &ioccb_table[i];
124 p_ioccb->quecnt = 0U;
125 p_ioccb->head = 0U;
126 p_ioccb->tail = 0U;
127 p_ioccb->lostflg = FALSE;
128 }
129
130 /* 各IOCのバッファ初期化 */
131 for (i = 0U; i < tnum_ioc; i++) {
132 if (ioc_inival_table[i] != NULL) {
133 p_iocinib = &iocinib_table[i];
134 ioc_memcpy((void *) (p_iocinib->p_iocmb), ioc_inival_table[i], p_iocinib->datasz);
135 }
136 }
137}
138
139
140
141LOCAL_INLINE void
142ioc_memcpy(void *p_dst, const void *p_src, uint32 sz)
143{
144 uint8 *p_tmp_dst = (uint8 *) p_dst;
145 const uint8 *p_tmp_src = (const uint8 *) p_src;
146
147 while (sz > 0U) {
148 *p_tmp_dst = *p_tmp_src;
149 p_tmp_dst++;
150 p_tmp_src++;
151 sz--;
152 }
153}
154
155
156Std_ReturnType
157ioc_send_generic(IocType IocWrapperId, const void *in)
158{
159 const IOCWRPINIB *p_iocwrpinib;
160 const IOCINIB *p_iocinib;
161 IOCCB *p_ioccb;
162 Std_ReturnType ercd = IOC_E_OK;
163
164 p_iocwrpinib = get_iocwrpinib(IocWrapperId);
165 p_iocinib = get_iocinib(IOCID(p_iocwrpinib));
166 p_ioccb = get_ioccb(IOCID(p_iocwrpinib));
167
168 LOG_IOCSEND_ENTER(p_iocwrpinib->senderid);
169
170 CHECK_IOC_CALLEVEL_DISABLEDINT(CALLEVEL_IOCSEND);
171 CHECK_IOC_ACCESS(p_iocwrpinib->p_sndosapcb == p_runosap);
172 CHECK_IOC_MEM_READ((const MemoryStartAddressType) in, p_iocinib->datasz, p_iocinib->alignsz);
173
174 x_nested_lock_os_int();
175
176 S_D_CHECK_IOC_LIMIT(p_ioccb->quecnt < p_iocinib->maxque);
177 ioc_memcpy((void *) ((uint32) p_iocinib->p_iocmb + ((p_iocinib->datasz) * (p_ioccb->tail))), in, p_iocinib->datasz);
178 p_ioccb->quecnt++;
179 p_ioccb->tail++;
180 if (p_ioccb->tail >= p_iocinib->maxque) {
181 p_ioccb->tail = 0U;
182 }
183
184 d_exit_no_errorhook:
185 x_nested_unlock_os_int();
186 exit_no_errorhook:
187 LOG_IOCSEND_LEAVE(ercd);
188 return(ercd);
189
190#ifdef CFG_USE_ERRORHOOK
191 d_exit_errorhook:
192 goto errorhook_start;
193
194 exit_errorhook:
195 x_nested_lock_os_int();
196 errorhook_start:
197#ifdef CFG_USE_PARAMETERACCESS
198 _errorhook_par1.iocid = IOCID(p_iocwrpinib);
199 _errorhook_par2.senderid = p_iocwrpinib->senderid;
200#endif /* CFG_USE_PARAMETERACCESS */
201 if (p_iocinib->groupflg != FALSE) {
202 call_errorhook(ercd, IOCServiceId_IOC_SendGroup);
203 }
204 else {
205 call_errorhook(ercd, IOCServiceId_IOC_Send);
206 }
207 x_nested_unlock_os_int();
208 goto exit_no_errorhook;
209#endif /* CFG_USE_ERRORHOOK */
210}
211
212
213Std_ReturnType
214ioc_write_generic(IocType IocWrapperId, const void *in)
215{
216 const IOCWRPINIB *p_iocwrpinib;
217 const IOCINIB *p_iocinib;
218 Std_ReturnType ercd = IOC_E_OK;
219
220 p_iocwrpinib = get_iocwrpinib(IocWrapperId);
221 p_iocinib = get_iocinib(IOCID(p_iocwrpinib));
222
223 LOG_IOCWRITE_ENTER(p_iocwrpinib->senderid);
224
225 CHECK_IOC_CALLEVEL_DISABLEDINT(CALLEVEL_IOCWRITE);
226 CHECK_IOC_ACCESS(p_iocwrpinib->p_sndosapcb == p_runosap);
227 CHECK_IOC_MEM_READ((const MemoryStartAddressType) in, p_iocinib->datasz, p_iocinib->alignsz);
228
229 x_nested_lock_os_int();
230
231 ioc_memcpy((void *) (p_iocinib->p_iocmb), in, p_iocinib->datasz);
232
233 d_exit_no_errorhook:
234 x_nested_unlock_os_int();
235 exit_no_errorhook:
236 LOG_IOCWRITE_LEAVE(ercd);
237 return(ercd);
238
239#ifdef CFG_USE_ERRORHOOK
240 d_exit_errorhook:
241 goto errorhook_start;
242
243 exit_errorhook:
244 x_nested_lock_os_int();
245 errorhook_start:
246#ifdef CFG_USE_PARAMETERACCESS
247 _errorhook_par1.iocid = IOCID(p_iocwrpinib);
248 _errorhook_par2.senderid = p_iocwrpinib->senderid;
249#endif /* CFG_USE_PARAMETERACCESS */
250 if (p_iocinib->groupflg != FALSE) {
251 call_errorhook(ercd, IOCServiceId_IOC_WriteGroup);
252 }
253 else {
254 call_errorhook(ercd, IOCServiceId_IOC_Write);
255 }
256 x_nested_unlock_os_int();
257 goto exit_no_errorhook;
258#endif /* CFG_USE_ERRORHOOK */
259}
260
261
262Std_ReturnType
263ioc_receive_generic(IocType IocId, void *out)
264{
265 const IOCINIB *p_iocinib;
266 IOCCB *p_ioccb;
267 Std_ReturnType ercd = IOC_E_OK;
268
269 LOG_IOCRECEIVE_ENTER(IocId);
270
271 p_iocinib = get_iocinib(IocId);
272 p_ioccb = get_ioccb(IocId);
273
274 CHECK_IOC_CALLEVEL_DISABLEDINT(CALLEVEL_IOCRECEIVE);
275 CHECK_IOC_ACCESS(p_iocinib->p_rcvosapcb == p_runosap);
276 CHECK_IOC_MEM_WRITE(out, p_iocinib->datasz, p_iocinib->alignsz);
277
278 x_nested_lock_os_int();
279
280 S_D_CHECK_IOC_NO_DATA(p_ioccb->quecnt > 0U);
281 ioc_memcpy(out, (void *) ((uint32) p_iocinib->p_iocmb + ((p_iocinib->datasz) * (p_ioccb->head))), p_iocinib->datasz);
282
283 p_ioccb->quecnt--;
284 p_ioccb->head++;
285 if (p_ioccb->head >= p_iocinib->maxque) {
286 p_ioccb->head = 0U;
287 }
288
289 S_D_CHECK_IOC_LOST(p_ioccb->lostflg == FALSE);
290
291 d_exit_no_errorhook:
292 x_nested_unlock_os_int();
293 exit_no_errorhook:
294 LOG_IOCRECEIVE_LEAVE(ercd);
295 return(ercd);
296
297#ifdef CFG_USE_ERRORHOOK
298 d_exit_errorhook:
299 goto errorhook_start;
300
301 exit_errorhook:
302 x_nested_lock_os_int();
303 errorhook_start:
304#ifdef CFG_USE_PARAMETERACCESS
305 _errorhook_par1.iocid = IocId;
306#endif /* CFG_USE_PARAMETERACCESS */
307 if (p_iocinib->groupflg != FALSE) {
308 call_errorhook(ercd, IOCServiceId_IOC_ReceiveGroup);
309 }
310 else {
311 call_errorhook(ercd, IOCServiceId_IOC_Receive);
312 }
313 x_nested_unlock_os_int();
314 goto exit_no_errorhook;
315#endif /* CFG_USE_ERRORHOOK */
316}
317
318
319Std_ReturnType
320ioc_read_generic(IocType IocId, void *out)
321{
322 const IOCINIB *p_iocinib;
323 Std_ReturnType ercd = IOC_E_OK;
324
325 LOG_IOCREAD_ENTER(IocId);
326
327 p_iocinib = get_iocinib(IocId);
328
329 CHECK_IOC_CALLEVEL_DISABLEDINT(CALLEVEL_IOCREAD);
330 CHECK_IOC_ACCESS(p_iocinib->p_rcvosapcb == p_runosap);
331 CHECK_IOC_MEM_WRITE(out, p_iocinib->datasz, p_iocinib->alignsz);
332
333 x_nested_lock_os_int();
334
335 ioc_memcpy(out, (void *) (p_iocinib->p_iocmb), p_iocinib->datasz);
336
337 d_exit_no_errorhook:
338 x_nested_unlock_os_int();
339 exit_no_errorhook:
340 LOG_IOCREAD_LEAVE(ercd);
341 return(ercd);
342
343#ifdef CFG_USE_ERRORHOOK
344 d_exit_errorhook:
345 goto errorhook_start;
346
347 exit_errorhook:
348 x_nested_lock_os_int();
349 errorhook_start:
350#ifdef CFG_USE_PARAMETERACCESS
351 _errorhook_par1.iocid = IocId;
352#endif /* CFG_USE_PARAMETERACCESS */
353 if (p_iocinib->groupflg != FALSE) {
354 call_errorhook(ercd, IOCServiceId_IOC_ReadGroup);
355 }
356 else {
357 call_errorhook(ercd, IOCServiceId_IOC_Read);
358 }
359 x_nested_unlock_os_int();
360 goto exit_no_errorhook;
361#endif /* CFG_USE_ERRORHOOK */
362}
363
364
365Std_ReturnType
366ioc_empty_queue_generic(IocType IocId)
367{
368 IOCCB *p_ioccb;
369 const IOCINIB *p_iocinib;
370 Std_ReturnType ercd = IOC_E_OK;
371
372 p_ioccb = get_ioccb(IocId);
373 p_iocinib = get_iocinib(IocId);
374
375 CHECK_IOC_CALLEVEL_DISABLEDINT(CALLEVEL_IOCEMPTYQUEUE);
376 CHECK_IOC_ACCESS(p_iocinib->p_rcvosapcb == p_runosap);
377
378 x_nested_lock_os_int();
379
380 p_ioccb->quecnt = 0U;
381 p_ioccb->head = 0U;
382 p_ioccb->tail = 0U;
383 p_ioccb->lostflg = FALSE;
384
385 d_exit_no_errorhook:
386 x_nested_unlock_os_int();
387 exit_no_errorhook:
388 LOG_IOCREAD_LEAVE(ercd);
389 return(ercd);
390
391#ifdef CFG_USE_ERRORHOOK
392 d_exit_errorhook:
393 goto errorhook_start;
394
395 exit_errorhook:
396 x_nested_lock_os_int();
397 errorhook_start:
398#ifdef CFG_USE_PARAMETERACCESS
399 _errorhook_par1.iocid = IocId;
400#endif /* CFG_USE_PARAMETERACCESS */
401 call_errorhook(ercd, IOCServiceId_IOC_EmptyQueue);
402 x_nested_unlock_os_int();
403 goto exit_no_errorhook;
404#endif /* CFG_USE_ERRORHOOK */
405}
Note: See TracBrowser for help on using the repository browser.