1*c188bc0cScgd /* $NetBSD: cfe_api.c,v 1.1 2002/11/09 06:20:40 cgd Exp $ */
2*c188bc0cScgd /* from: SiByte Id: cfe_api.c,v 1.16 2002/07/09 23:29:11 cgd Exp $ */
3*c188bc0cScgd
4*c188bc0cScgd /*
5*c188bc0cScgd * Copyright 2000, 2001, 2002
6*c188bc0cScgd * Broadcom Corporation. All rights reserved.
7*c188bc0cScgd *
8*c188bc0cScgd * This software is furnished under license and may be used and copied only
9*c188bc0cScgd * in accordance with the following terms and conditions. Subject to these
10*c188bc0cScgd * conditions, you may download, copy, install, use, modify and distribute
11*c188bc0cScgd * modified or unmodified copies of this software in source and/or binary
12*c188bc0cScgd * form. No title or ownership is transferred hereby.
13*c188bc0cScgd *
14*c188bc0cScgd * 1) Any source code used, modified or distributed must reproduce and
15*c188bc0cScgd * retain this copyright notice and list of conditions as they appear in
16*c188bc0cScgd * the source file.
17*c188bc0cScgd *
18*c188bc0cScgd * 2) No right is granted to use any trade name, trademark, or logo of
19*c188bc0cScgd * Broadcom Corporation. The "Broadcom Corporation" name may not be
20*c188bc0cScgd * used to endorse or promote products derived from this software
21*c188bc0cScgd * without the prior written permission of Broadcom Corporation.
22*c188bc0cScgd *
23*c188bc0cScgd * 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR IMPLIED
24*c188bc0cScgd * WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF
25*c188bc0cScgd * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
26*c188bc0cScgd * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL BROADCOM BE LIABLE
27*c188bc0cScgd * FOR ANY DAMAGES WHATSOEVER, AND IN PARTICULAR, BROADCOM SHALL NOT BE
28*c188bc0cScgd * LIABLE FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29*c188bc0cScgd * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30*c188bc0cScgd * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
31*c188bc0cScgd * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
32*c188bc0cScgd * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
33*c188bc0cScgd * OR OTHERWISE), EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34*c188bc0cScgd */
35*c188bc0cScgd
36*c188bc0cScgd /* *********************************************************************
37*c188bc0cScgd *
38*c188bc0cScgd * Broadcom Common Firmware Environment (CFE)
39*c188bc0cScgd *
40*c188bc0cScgd * Device Function stubs File: cfe_api.c
41*c188bc0cScgd *
42*c188bc0cScgd * This module contains device function stubs (small routines to
43*c188bc0cScgd * call the standard "iocb" interface entry point to CFE).
44*c188bc0cScgd * There should be one routine here per iocb function call.
45*c188bc0cScgd *
46*c188bc0cScgd * Authors: Mitch Lichtenberg, Chris Demetriou
47*c188bc0cScgd *
48*c188bc0cScgd ********************************************************************* */
49*c188bc0cScgd
50*c188bc0cScgd #include "cfe_api.h"
51*c188bc0cScgd #include "cfe_api_int.h"
52*c188bc0cScgd
53*c188bc0cScgd /* Cast from a native pointer to a cfe_xptr_t and back. */
54*c188bc0cScgd #define XPTR_FROM_NATIVE(n) ((cfe_xptr_t) (intptr_t) (n))
55*c188bc0cScgd #define NATIVE_FROM_XPTR(x) ((void *) (intptr_t) (x))
56*c188bc0cScgd
57*c188bc0cScgd #ifdef CFE_API_IMPL_NAMESPACE
58*c188bc0cScgd #define cfe_iocb_dispatch(a) __cfe_iocb_dispatch(a)
59*c188bc0cScgd #endif
60*c188bc0cScgd int cfe_iocb_dispatch(cfe_xiocb_t *xiocb);
61*c188bc0cScgd
62*c188bc0cScgd #if defined(CFE_API_common) || defined(CFE_API_ALL)
63*c188bc0cScgd /*
64*c188bc0cScgd * Declare the dispatch function with args of "intptr_t".
65*c188bc0cScgd * This makes sure whatever model we're compiling in
66*c188bc0cScgd * puts the pointers in a single register. For example,
67*c188bc0cScgd * combining -mlong64 and -mips1 or -mips2 would lead to
68*c188bc0cScgd * trouble, since the handle and IOCB pointer will be
69*c188bc0cScgd * passed in two registers each, and CFE expects one.
70*c188bc0cScgd */
71*c188bc0cScgd
72*c188bc0cScgd static int (*cfe_dispfunc)(intptr_t handle, intptr_t xiocb) = 0;
73*c188bc0cScgd static cfe_xuint_t cfe_handle = 0;
74*c188bc0cScgd
75*c188bc0cScgd int
cfe_init(cfe_xuint_t handle,cfe_xuint_t ept)76*c188bc0cScgd cfe_init(cfe_xuint_t handle, cfe_xuint_t ept)
77*c188bc0cScgd {
78*c188bc0cScgd cfe_dispfunc = NATIVE_FROM_XPTR(ept);
79*c188bc0cScgd cfe_handle = handle;
80*c188bc0cScgd return 0;
81*c188bc0cScgd }
82*c188bc0cScgd
83*c188bc0cScgd int
cfe_iocb_dispatch(cfe_xiocb_t * xiocb)84*c188bc0cScgd cfe_iocb_dispatch(cfe_xiocb_t *xiocb)
85*c188bc0cScgd {
86*c188bc0cScgd if (!cfe_dispfunc) return -1;
87*c188bc0cScgd return (*cfe_dispfunc)((intptr_t)cfe_handle, (intptr_t)xiocb);
88*c188bc0cScgd }
89*c188bc0cScgd #endif /* CFE_API_common || CFE_API_ALL */
90*c188bc0cScgd
91*c188bc0cScgd #if defined(CFE_API_close) || defined(CFE_API_ALL)
92*c188bc0cScgd int
cfe_close(int handle)93*c188bc0cScgd cfe_close(int handle)
94*c188bc0cScgd {
95*c188bc0cScgd cfe_xiocb_t xiocb;
96*c188bc0cScgd
97*c188bc0cScgd xiocb.xiocb_fcode = CFE_CMD_DEV_CLOSE;
98*c188bc0cScgd xiocb.xiocb_status = 0;
99*c188bc0cScgd xiocb.xiocb_handle = handle;
100*c188bc0cScgd xiocb.xiocb_flags = 0;
101*c188bc0cScgd xiocb.xiocb_psize = 0;
102*c188bc0cScgd
103*c188bc0cScgd cfe_iocb_dispatch(&xiocb);
104*c188bc0cScgd
105*c188bc0cScgd return xiocb.xiocb_status;
106*c188bc0cScgd
107*c188bc0cScgd }
108*c188bc0cScgd #endif /* CFE_API_close || CFE_API_ALL */
109*c188bc0cScgd
110*c188bc0cScgd #if defined(CFE_API_cpu_start) || defined(CFE_API_ALL)
111*c188bc0cScgd int
cfe_cpu_start(int cpu,void (* fn)(void),long sp,long gp,long a1)112*c188bc0cScgd cfe_cpu_start(int cpu, void (*fn)(void), long sp, long gp, long a1)
113*c188bc0cScgd {
114*c188bc0cScgd cfe_xiocb_t xiocb;
115*c188bc0cScgd
116*c188bc0cScgd xiocb.xiocb_fcode = CFE_CMD_FW_CPUCTL;
117*c188bc0cScgd xiocb.xiocb_status = 0;
118*c188bc0cScgd xiocb.xiocb_handle = 0;
119*c188bc0cScgd xiocb.xiocb_flags = 0;
120*c188bc0cScgd xiocb.xiocb_psize = sizeof(xiocb_cpuctl_t);
121*c188bc0cScgd xiocb.plist.xiocb_cpuctl.cpu_number = cpu;
122*c188bc0cScgd xiocb.plist.xiocb_cpuctl.cpu_command = CFE_CPU_CMD_START;
123*c188bc0cScgd xiocb.plist.xiocb_cpuctl.gp_val = gp;
124*c188bc0cScgd xiocb.plist.xiocb_cpuctl.sp_val = sp;
125*c188bc0cScgd xiocb.plist.xiocb_cpuctl.a1_val = a1;
126*c188bc0cScgd xiocb.plist.xiocb_cpuctl.start_addr = (long)fn;
127*c188bc0cScgd
128*c188bc0cScgd cfe_iocb_dispatch(&xiocb);
129*c188bc0cScgd
130*c188bc0cScgd return xiocb.xiocb_status;
131*c188bc0cScgd }
132*c188bc0cScgd #endif /* CFE_API_cpu_start || CFE_API_ALL */
133*c188bc0cScgd
134*c188bc0cScgd #if defined(CFE_API_cpu_stop) || defined(CFE_API_ALL)
135*c188bc0cScgd int
cfe_cpu_stop(int cpu)136*c188bc0cScgd cfe_cpu_stop(int cpu)
137*c188bc0cScgd {
138*c188bc0cScgd cfe_xiocb_t xiocb;
139*c188bc0cScgd
140*c188bc0cScgd xiocb.xiocb_fcode = CFE_CMD_FW_CPUCTL;
141*c188bc0cScgd xiocb.xiocb_status = 0;
142*c188bc0cScgd xiocb.xiocb_handle = 0;
143*c188bc0cScgd xiocb.xiocb_flags = 0;
144*c188bc0cScgd xiocb.xiocb_psize = sizeof(xiocb_cpuctl_t);
145*c188bc0cScgd xiocb.plist.xiocb_cpuctl.cpu_number = cpu;
146*c188bc0cScgd xiocb.plist.xiocb_cpuctl.cpu_command = CFE_CPU_CMD_STOP;
147*c188bc0cScgd
148*c188bc0cScgd cfe_iocb_dispatch(&xiocb);
149*c188bc0cScgd
150*c188bc0cScgd return xiocb.xiocb_status;
151*c188bc0cScgd }
152*c188bc0cScgd #endif /* CFE_API_cpu_stop || CFE_API_ALL */
153*c188bc0cScgd
154*c188bc0cScgd #if defined(CFE_API_enumenv) || defined(CFE_API_ALL)
155*c188bc0cScgd int
cfe_enumenv(int idx,char * name,int namelen,char * val,int vallen)156*c188bc0cScgd cfe_enumenv(int idx, char *name, int namelen, char *val, int vallen)
157*c188bc0cScgd {
158*c188bc0cScgd cfe_xiocb_t xiocb;
159*c188bc0cScgd
160*c188bc0cScgd xiocb.xiocb_fcode = CFE_CMD_ENV_SET;
161*c188bc0cScgd xiocb.xiocb_status = 0;
162*c188bc0cScgd xiocb.xiocb_handle = 0;
163*c188bc0cScgd xiocb.xiocb_flags = 0;
164*c188bc0cScgd xiocb.xiocb_psize = sizeof(xiocb_envbuf_t);
165*c188bc0cScgd xiocb.plist.xiocb_envbuf.enum_idx = idx;
166*c188bc0cScgd xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name);
167*c188bc0cScgd xiocb.plist.xiocb_envbuf.name_length = namelen;
168*c188bc0cScgd xiocb.plist.xiocb_envbuf.val_ptr = XPTR_FROM_NATIVE(val);
169*c188bc0cScgd xiocb.plist.xiocb_envbuf.val_length = vallen;
170*c188bc0cScgd
171*c188bc0cScgd cfe_iocb_dispatch(&xiocb);
172*c188bc0cScgd
173*c188bc0cScgd return xiocb.xiocb_status;
174*c188bc0cScgd }
175*c188bc0cScgd #endif /* CFE_API_enumenv || CFE_API_ALL */
176*c188bc0cScgd
177*c188bc0cScgd #if defined(CFE_API_enummem) || defined(CFE_API_ALL)
178*c188bc0cScgd int
cfe_enummem(int idx,int flags,cfe_xuint_t * start,cfe_xuint_t * length,cfe_xuint_t * type)179*c188bc0cScgd cfe_enummem(int idx, int flags, cfe_xuint_t *start, cfe_xuint_t *length,
180*c188bc0cScgd cfe_xuint_t *type)
181*c188bc0cScgd {
182*c188bc0cScgd cfe_xiocb_t xiocb;
183*c188bc0cScgd
184*c188bc0cScgd xiocb.xiocb_fcode = CFE_CMD_FW_MEMENUM;
185*c188bc0cScgd xiocb.xiocb_status = 0;
186*c188bc0cScgd xiocb.xiocb_handle = 0;
187*c188bc0cScgd xiocb.xiocb_flags = flags;
188*c188bc0cScgd xiocb.xiocb_psize = sizeof(xiocb_meminfo_t);
189*c188bc0cScgd xiocb.plist.xiocb_meminfo.mi_idx = idx;
190*c188bc0cScgd
191*c188bc0cScgd cfe_iocb_dispatch(&xiocb);
192*c188bc0cScgd
193*c188bc0cScgd if (xiocb.xiocb_status < 0)
194*c188bc0cScgd return xiocb.xiocb_status;
195*c188bc0cScgd
196*c188bc0cScgd *start = xiocb.plist.xiocb_meminfo.mi_addr;
197*c188bc0cScgd *length = xiocb.plist.xiocb_meminfo.mi_size;
198*c188bc0cScgd *type = xiocb.plist.xiocb_meminfo.mi_type;
199*c188bc0cScgd
200*c188bc0cScgd return 0;
201*c188bc0cScgd }
202*c188bc0cScgd #endif /* CFE_API_enummem || CFE_API_ALL */
203*c188bc0cScgd
204*c188bc0cScgd #if defined(CFE_API_exit) || defined(CFE_API_ALL)
205*c188bc0cScgd int
cfe_exit(int warm,int status)206*c188bc0cScgd cfe_exit(int warm, int status)
207*c188bc0cScgd {
208*c188bc0cScgd cfe_xiocb_t xiocb;
209*c188bc0cScgd
210*c188bc0cScgd xiocb.xiocb_fcode = CFE_CMD_FW_RESTART;
211*c188bc0cScgd xiocb.xiocb_status = 0;
212*c188bc0cScgd xiocb.xiocb_handle = 0;
213*c188bc0cScgd xiocb.xiocb_flags = warm ? CFE_FLG_WARMSTART : 0;
214*c188bc0cScgd xiocb.xiocb_psize = sizeof(xiocb_exitstat_t);
215*c188bc0cScgd xiocb.plist.xiocb_exitstat.status = status;
216*c188bc0cScgd
217*c188bc0cScgd cfe_iocb_dispatch(&xiocb);
218*c188bc0cScgd
219*c188bc0cScgd return xiocb.xiocb_status;
220*c188bc0cScgd }
221*c188bc0cScgd #endif /* CFE_API_exit || CFE_API_ALL */
222*c188bc0cScgd
223*c188bc0cScgd #if defined(CFE_API_flushcache) || defined(CFE_API_ALL)
224*c188bc0cScgd int
cfe_flushcache(int flg)225*c188bc0cScgd cfe_flushcache(int flg)
226*c188bc0cScgd {
227*c188bc0cScgd cfe_xiocb_t xiocb;
228*c188bc0cScgd
229*c188bc0cScgd xiocb.xiocb_fcode = CFE_CMD_FW_FLUSHCACHE;
230*c188bc0cScgd xiocb.xiocb_status = 0;
231*c188bc0cScgd xiocb.xiocb_handle = 0;
232*c188bc0cScgd xiocb.xiocb_flags = flg;
233*c188bc0cScgd xiocb.xiocb_psize = 0;
234*c188bc0cScgd
235*c188bc0cScgd cfe_iocb_dispatch(&xiocb);
236*c188bc0cScgd
237*c188bc0cScgd return xiocb.xiocb_status;
238*c188bc0cScgd }
239*c188bc0cScgd #endif /* CFE_API_flushcache || CFE_API_ALL */
240*c188bc0cScgd
241*c188bc0cScgd #if defined(CFE_API_getdevinfo) || defined(CFE_API_ALL)
242*c188bc0cScgd int
cfe_getdevinfo(char * name)243*c188bc0cScgd cfe_getdevinfo(char *name)
244*c188bc0cScgd {
245*c188bc0cScgd cfe_xiocb_t xiocb;
246*c188bc0cScgd
247*c188bc0cScgd xiocb.xiocb_fcode = CFE_CMD_DEV_GETINFO;
248*c188bc0cScgd xiocb.xiocb_status = 0;
249*c188bc0cScgd xiocb.xiocb_handle = 0;
250*c188bc0cScgd xiocb.xiocb_flags = 0;
251*c188bc0cScgd xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
252*c188bc0cScgd xiocb.plist.xiocb_buffer.buf_offset = 0;
253*c188bc0cScgd xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(name);
254*c188bc0cScgd xiocb.plist.xiocb_buffer.buf_length = cfe_strlen(name);
255*c188bc0cScgd
256*c188bc0cScgd cfe_iocb_dispatch(&xiocb);
257*c188bc0cScgd
258*c188bc0cScgd if (xiocb.xiocb_status < 0)
259*c188bc0cScgd return xiocb.xiocb_status;
260*c188bc0cScgd return xiocb.plist.xiocb_buffer.buf_devflags;
261*c188bc0cScgd }
262*c188bc0cScgd #endif /* CFE_API_getdevinfo || CFE_API_ALL */
263*c188bc0cScgd
264*c188bc0cScgd #if defined(CFE_API_getenv) || defined(CFE_API_ALL)
265*c188bc0cScgd int
cfe_getenv(char * name,char * dest,int destlen)266*c188bc0cScgd cfe_getenv(char *name, char *dest, int destlen)
267*c188bc0cScgd {
268*c188bc0cScgd cfe_xiocb_t xiocb;
269*c188bc0cScgd
270*c188bc0cScgd *dest = 0;
271*c188bc0cScgd
272*c188bc0cScgd xiocb.xiocb_fcode = CFE_CMD_ENV_GET;
273*c188bc0cScgd xiocb.xiocb_status = 0;
274*c188bc0cScgd xiocb.xiocb_handle = 0;
275*c188bc0cScgd xiocb.xiocb_flags = 0;
276*c188bc0cScgd xiocb.xiocb_psize = sizeof(xiocb_envbuf_t);
277*c188bc0cScgd xiocb.plist.xiocb_envbuf.enum_idx = 0;
278*c188bc0cScgd xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name);
279*c188bc0cScgd xiocb.plist.xiocb_envbuf.name_length = cfe_strlen(name);
280*c188bc0cScgd xiocb.plist.xiocb_envbuf.val_ptr = XPTR_FROM_NATIVE(dest);
281*c188bc0cScgd xiocb.plist.xiocb_envbuf.val_length = destlen;
282*c188bc0cScgd
283*c188bc0cScgd cfe_iocb_dispatch(&xiocb);
284*c188bc0cScgd
285*c188bc0cScgd return xiocb.xiocb_status;
286*c188bc0cScgd }
287*c188bc0cScgd #endif /* CFE_API_getenv || CFE_API_ALL */
288*c188bc0cScgd
289*c188bc0cScgd #if defined(CFE_API_getfwinfo) || defined(CFE_API_ALL)
290*c188bc0cScgd int
cfe_getfwinfo(cfe_fwinfo_t * info)291*c188bc0cScgd cfe_getfwinfo(cfe_fwinfo_t *info)
292*c188bc0cScgd {
293*c188bc0cScgd cfe_xiocb_t xiocb;
294*c188bc0cScgd
295*c188bc0cScgd xiocb.xiocb_fcode = CFE_CMD_FW_GETINFO;
296*c188bc0cScgd xiocb.xiocb_status = 0;
297*c188bc0cScgd xiocb.xiocb_handle = 0;
298*c188bc0cScgd xiocb.xiocb_flags = 0;
299*c188bc0cScgd xiocb.xiocb_psize = sizeof(xiocb_fwinfo_t);
300*c188bc0cScgd
301*c188bc0cScgd cfe_iocb_dispatch(&xiocb);
302*c188bc0cScgd
303*c188bc0cScgd if (xiocb.xiocb_status < 0)
304*c188bc0cScgd return xiocb.xiocb_status;
305*c188bc0cScgd
306*c188bc0cScgd info->fwi_version = xiocb.plist.xiocb_fwinfo.fwi_version;
307*c188bc0cScgd info->fwi_totalmem = xiocb.plist.xiocb_fwinfo.fwi_totalmem;
308*c188bc0cScgd info->fwi_flags = xiocb.plist.xiocb_fwinfo.fwi_flags;
309*c188bc0cScgd info->fwi_boardid = xiocb.plist.xiocb_fwinfo.fwi_boardid;
310*c188bc0cScgd info->fwi_bootarea_va = xiocb.plist.xiocb_fwinfo.fwi_bootarea_va;
311*c188bc0cScgd info->fwi_bootarea_pa = xiocb.plist.xiocb_fwinfo.fwi_bootarea_pa;
312*c188bc0cScgd info->fwi_bootarea_size = xiocb.plist.xiocb_fwinfo.fwi_bootarea_size;
313*c188bc0cScgd #if 0
314*c188bc0cScgd info->fwi_reserved1 = xiocb.plist.xiocb_fwinfo.fwi_reserved1;
315*c188bc0cScgd info->fwi_reserved2 = xiocb.plist.xiocb_fwinfo.fwi_reserved2;
316*c188bc0cScgd info->fwi_reserved3 = xiocb.plist.xiocb_fwinfo.fwi_reserved3;
317*c188bc0cScgd #endif
318*c188bc0cScgd
319*c188bc0cScgd return 0;
320*c188bc0cScgd }
321*c188bc0cScgd #endif /* CFE_API_getfwinfo || CFE_API_ALL */
322*c188bc0cScgd
323*c188bc0cScgd #if defined(CFE_API_getstdhandle) || defined(CFE_API_ALL)
324*c188bc0cScgd int
cfe_getstdhandle(int flg)325*c188bc0cScgd cfe_getstdhandle(int flg)
326*c188bc0cScgd {
327*c188bc0cScgd cfe_xiocb_t xiocb;
328*c188bc0cScgd
329*c188bc0cScgd xiocb.xiocb_fcode = CFE_CMD_DEV_GETHANDLE;
330*c188bc0cScgd xiocb.xiocb_status = 0;
331*c188bc0cScgd xiocb.xiocb_handle = 0;
332*c188bc0cScgd xiocb.xiocb_flags = flg;
333*c188bc0cScgd xiocb.xiocb_psize = 0;
334*c188bc0cScgd
335*c188bc0cScgd cfe_iocb_dispatch(&xiocb);
336*c188bc0cScgd
337*c188bc0cScgd if (xiocb.xiocb_status < 0)
338*c188bc0cScgd return xiocb.xiocb_status;
339*c188bc0cScgd return xiocb.xiocb_handle;
340*c188bc0cScgd
341*c188bc0cScgd }
342*c188bc0cScgd #endif /* CFE_API_getstdhandle || CFE_API_ALL */
343*c188bc0cScgd
344*c188bc0cScgd #if defined(CFE_API_getticks) || defined(CFE_API_ALL)
345*c188bc0cScgd int64_t
346*c188bc0cScgd #ifdef CFE_API_IMPL_NAMESPACE
__cfe_getticks(void)347*c188bc0cScgd __cfe_getticks(void)
348*c188bc0cScgd #else
349*c188bc0cScgd cfe_getticks(void)
350*c188bc0cScgd #endif
351*c188bc0cScgd {
352*c188bc0cScgd cfe_xiocb_t xiocb;
353*c188bc0cScgd
354*c188bc0cScgd xiocb.xiocb_fcode = CFE_CMD_FW_GETTIME;
355*c188bc0cScgd xiocb.xiocb_status = 0;
356*c188bc0cScgd xiocb.xiocb_handle = 0;
357*c188bc0cScgd xiocb.xiocb_flags = 0;
358*c188bc0cScgd xiocb.xiocb_psize = sizeof(xiocb_time_t);
359*c188bc0cScgd xiocb.plist.xiocb_time.ticks = 0;
360*c188bc0cScgd
361*c188bc0cScgd cfe_iocb_dispatch(&xiocb);
362*c188bc0cScgd
363*c188bc0cScgd return xiocb.plist.xiocb_time.ticks;
364*c188bc0cScgd
365*c188bc0cScgd }
366*c188bc0cScgd #endif /* CFE_API_getticks || CFE_API_ALL */
367*c188bc0cScgd
368*c188bc0cScgd #if defined(CFE_API_inpstat) || defined(CFE_API_ALL)
369*c188bc0cScgd int
cfe_inpstat(int handle)370*c188bc0cScgd cfe_inpstat(int handle)
371*c188bc0cScgd {
372*c188bc0cScgd cfe_xiocb_t xiocb;
373*c188bc0cScgd
374*c188bc0cScgd xiocb.xiocb_fcode = CFE_CMD_DEV_INPSTAT;
375*c188bc0cScgd xiocb.xiocb_status = 0;
376*c188bc0cScgd xiocb.xiocb_handle = handle;
377*c188bc0cScgd xiocb.xiocb_flags = 0;
378*c188bc0cScgd xiocb.xiocb_psize = sizeof(xiocb_inpstat_t);
379*c188bc0cScgd xiocb.plist.xiocb_inpstat.inp_status = 0;
380*c188bc0cScgd
381*c188bc0cScgd cfe_iocb_dispatch(&xiocb);
382*c188bc0cScgd
383*c188bc0cScgd if (xiocb.xiocb_status < 0)
384*c188bc0cScgd return xiocb.xiocb_status;
385*c188bc0cScgd return xiocb.plist.xiocb_inpstat.inp_status;
386*c188bc0cScgd
387*c188bc0cScgd }
388*c188bc0cScgd #endif /* CFE_API_inpstat || CFE_API_ALL */
389*c188bc0cScgd
390*c188bc0cScgd #if defined(CFE_API_ioctl) || defined(CFE_API_ALL)
391*c188bc0cScgd int
cfe_ioctl(int handle,unsigned int ioctlnum,unsigned char * buffer,int length,int * retlen,cfe_xuint_t offset)392*c188bc0cScgd cfe_ioctl(int handle, unsigned int ioctlnum, unsigned char *buffer, int length,
393*c188bc0cScgd int *retlen, cfe_xuint_t offset)
394*c188bc0cScgd {
395*c188bc0cScgd cfe_xiocb_t xiocb;
396*c188bc0cScgd
397*c188bc0cScgd xiocb.xiocb_fcode = CFE_CMD_DEV_IOCTL;
398*c188bc0cScgd xiocb.xiocb_status = 0;
399*c188bc0cScgd xiocb.xiocb_handle = handle;
400*c188bc0cScgd xiocb.xiocb_flags = 0;
401*c188bc0cScgd xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
402*c188bc0cScgd xiocb.plist.xiocb_buffer.buf_offset = offset;
403*c188bc0cScgd xiocb.plist.xiocb_buffer.buf_ioctlcmd = ioctlnum;
404*c188bc0cScgd xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer);
405*c188bc0cScgd xiocb.plist.xiocb_buffer.buf_length = length;
406*c188bc0cScgd
407*c188bc0cScgd cfe_iocb_dispatch(&xiocb);
408*c188bc0cScgd
409*c188bc0cScgd if (retlen)
410*c188bc0cScgd *retlen = xiocb.plist.xiocb_buffer.buf_retlen;
411*c188bc0cScgd return xiocb.xiocb_status;
412*c188bc0cScgd }
413*c188bc0cScgd #endif /* CFE_API_ioctl || CFE_API_ALL */
414*c188bc0cScgd
415*c188bc0cScgd #if defined(CFE_API_open) || defined(CFE_API_ALL)
416*c188bc0cScgd int
cfe_open(char * name)417*c188bc0cScgd cfe_open(char *name)
418*c188bc0cScgd {
419*c188bc0cScgd cfe_xiocb_t xiocb;
420*c188bc0cScgd
421*c188bc0cScgd xiocb.xiocb_fcode = CFE_CMD_DEV_OPEN;
422*c188bc0cScgd xiocb.xiocb_status = 0;
423*c188bc0cScgd xiocb.xiocb_handle = 0;
424*c188bc0cScgd xiocb.xiocb_flags = 0;
425*c188bc0cScgd xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
426*c188bc0cScgd xiocb.plist.xiocb_buffer.buf_offset = 0;
427*c188bc0cScgd xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(name);
428*c188bc0cScgd xiocb.plist.xiocb_buffer.buf_length = cfe_strlen(name);
429*c188bc0cScgd
430*c188bc0cScgd cfe_iocb_dispatch(&xiocb);
431*c188bc0cScgd
432*c188bc0cScgd if (xiocb.xiocb_status < 0)
433*c188bc0cScgd return xiocb.xiocb_status;
434*c188bc0cScgd return xiocb.xiocb_handle;
435*c188bc0cScgd }
436*c188bc0cScgd #endif /* CFE_API_open || CFE_API_ALL */
437*c188bc0cScgd
438*c188bc0cScgd #if defined(CFE_API_read) || defined(CFE_API_ALL)
439*c188bc0cScgd int
cfe_read(int handle,unsigned char * buffer,int length)440*c188bc0cScgd cfe_read(int handle, unsigned char *buffer, int length)
441*c188bc0cScgd {
442*c188bc0cScgd return cfe_readblk(handle, 0, buffer, length);
443*c188bc0cScgd }
444*c188bc0cScgd #endif /* CFE_API_read || CFE_API_ALL */
445*c188bc0cScgd
446*c188bc0cScgd #if defined(CFE_API_readblk) || defined(CFE_API_ALL)
447*c188bc0cScgd int
cfe_readblk(int handle,cfe_xint_t offset,unsigned char * buffer,int length)448*c188bc0cScgd cfe_readblk(int handle, cfe_xint_t offset, unsigned char *buffer, int length)
449*c188bc0cScgd {
450*c188bc0cScgd cfe_xiocb_t xiocb;
451*c188bc0cScgd
452*c188bc0cScgd xiocb.xiocb_fcode = CFE_CMD_DEV_READ;
453*c188bc0cScgd xiocb.xiocb_status = 0;
454*c188bc0cScgd xiocb.xiocb_handle = handle;
455*c188bc0cScgd xiocb.xiocb_flags = 0;
456*c188bc0cScgd xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
457*c188bc0cScgd xiocb.plist.xiocb_buffer.buf_offset = offset;
458*c188bc0cScgd xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer);
459*c188bc0cScgd xiocb.plist.xiocb_buffer.buf_length = length;
460*c188bc0cScgd
461*c188bc0cScgd cfe_iocb_dispatch(&xiocb);
462*c188bc0cScgd
463*c188bc0cScgd if (xiocb.xiocb_status < 0)
464*c188bc0cScgd return xiocb.xiocb_status;
465*c188bc0cScgd return xiocb.plist.xiocb_buffer.buf_retlen;
466*c188bc0cScgd }
467*c188bc0cScgd #endif /* CFE_API_readblk || CFE_API_ALL */
468*c188bc0cScgd
469*c188bc0cScgd #if defined(CFE_API_setenv) || defined(CFE_API_ALL)
470*c188bc0cScgd int
cfe_setenv(char * name,char * val)471*c188bc0cScgd cfe_setenv(char *name, char *val)
472*c188bc0cScgd {
473*c188bc0cScgd cfe_xiocb_t xiocb;
474*c188bc0cScgd
475*c188bc0cScgd xiocb.xiocb_fcode = CFE_CMD_ENV_SET;
476*c188bc0cScgd xiocb.xiocb_status = 0;
477*c188bc0cScgd xiocb.xiocb_handle = 0;
478*c188bc0cScgd xiocb.xiocb_flags = 0;
479*c188bc0cScgd xiocb.xiocb_psize = sizeof(xiocb_envbuf_t);
480*c188bc0cScgd xiocb.plist.xiocb_envbuf.enum_idx = 0;
481*c188bc0cScgd xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name);
482*c188bc0cScgd xiocb.plist.xiocb_envbuf.name_length = cfe_strlen(name);
483*c188bc0cScgd xiocb.plist.xiocb_envbuf.val_ptr = XPTR_FROM_NATIVE(val);
484*c188bc0cScgd xiocb.plist.xiocb_envbuf.val_length = cfe_strlen(val);
485*c188bc0cScgd
486*c188bc0cScgd cfe_iocb_dispatch(&xiocb);
487*c188bc0cScgd
488*c188bc0cScgd return xiocb.xiocb_status;
489*c188bc0cScgd }
490*c188bc0cScgd #endif /* CFE_API_setenv || CFE_API_ALL */
491*c188bc0cScgd
492*c188bc0cScgd #if (defined(CFE_API_strlen) || defined(CFE_API_ALL)) \
493*c188bc0cScgd && !defined(CFE_API_STRLEN_CUSTOM)
494*c188bc0cScgd int
cfe_strlen(char * name)495*c188bc0cScgd cfe_strlen(char *name)
496*c188bc0cScgd {
497*c188bc0cScgd int count = 0;
498*c188bc0cScgd
499*c188bc0cScgd while (*name++)
500*c188bc0cScgd count++;
501*c188bc0cScgd
502*c188bc0cScgd return count;
503*c188bc0cScgd }
504*c188bc0cScgd #endif /* CFE_API_strlen || CFE_API_ALL */
505*c188bc0cScgd
506*c188bc0cScgd #if defined(CFE_API_write) || defined(CFE_API_ALL)
507*c188bc0cScgd int
cfe_write(int handle,unsigned char * buffer,int length)508*c188bc0cScgd cfe_write(int handle, unsigned char *buffer, int length)
509*c188bc0cScgd {
510*c188bc0cScgd return cfe_writeblk(handle, 0, buffer, length);
511*c188bc0cScgd }
512*c188bc0cScgd #endif /* CFE_API_write || CFE_API_ALL */
513*c188bc0cScgd
514*c188bc0cScgd #if defined(CFE_API_writeblk) || defined(CFE_API_ALL)
515*c188bc0cScgd int
cfe_writeblk(int handle,cfe_xint_t offset,unsigned char * buffer,int length)516*c188bc0cScgd cfe_writeblk(int handle, cfe_xint_t offset, unsigned char *buffer, int length)
517*c188bc0cScgd {
518*c188bc0cScgd cfe_xiocb_t xiocb;
519*c188bc0cScgd
520*c188bc0cScgd xiocb.xiocb_fcode = CFE_CMD_DEV_WRITE;
521*c188bc0cScgd xiocb.xiocb_status = 0;
522*c188bc0cScgd xiocb.xiocb_handle = handle;
523*c188bc0cScgd xiocb.xiocb_flags = 0;
524*c188bc0cScgd xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
525*c188bc0cScgd xiocb.plist.xiocb_buffer.buf_offset = offset;
526*c188bc0cScgd xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer);
527*c188bc0cScgd xiocb.plist.xiocb_buffer.buf_length = length;
528*c188bc0cScgd
529*c188bc0cScgd cfe_iocb_dispatch(&xiocb);
530*c188bc0cScgd
531*c188bc0cScgd if (xiocb.xiocb_status < 0)
532*c188bc0cScgd return xiocb.xiocb_status;
533*c188bc0cScgd return xiocb.plist.xiocb_buffer.buf_retlen;
534*c188bc0cScgd }
535*c188bc0cScgd #endif /* CFE_API_writeblk || CFE_API_ALL */
536