Home | History | Annotate | Line # | Download | only in cfe
      1  1.5  christos /* $NetBSD: cfe_api.c,v 1.5 2005/12/11 12:18:07 christos 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.4     lukem 
     50  1.4     lukem #include <sys/cdefs.h>
     51  1.5  christos __KERNEL_RCSID(0, "$NetBSD: cfe_api.c,v 1.5 2005/12/11 12:18:07 christos Exp $");
     52  1.1    simonb 
     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