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