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