1183370Simp/* $NetBSD: cfe_api.c,v 1.5 2005/12/11 12:18:07 christos Exp $ */ 2183370Simp/* from: SiByte Id: cfe_api.c,v 1.16 2002/07/09 23:29:11 cgd Exp $ */ 3183370Simp 4183370Simp/*- 5183370Simp * Copyright 2000, 2001, 2002 6183370Simp * Broadcom Corporation. All rights reserved. 7183370Simp * 8183370Simp * This software is furnished under license and may be used and copied only 9183370Simp * in accordance with the following terms and conditions. Subject to these 10183370Simp * conditions, you may download, copy, install, use, modify and distribute 11183370Simp * modified or unmodified copies of this software in source and/or binary 12183370Simp * form. No title or ownership is transferred hereby. 13183370Simp * 14183370Simp * 1) Any source code used, modified or distributed must reproduce and 15183370Simp * retain this copyright notice and list of conditions as they appear in 16183370Simp * the source file. 17183370Simp * 18183370Simp * 2) No right is granted to use any trade name, trademark, or logo of 19183370Simp * Broadcom Corporation. The "Broadcom Corporation" name may not be 20183370Simp * used to endorse or promote products derived from this software 21183370Simp * without the prior written permission of Broadcom Corporation. 22183370Simp * 23183370Simp * 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR IMPLIED 24183370Simp * WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF 25183370Simp * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR 26183370Simp * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL BROADCOM BE LIABLE 27183370Simp * FOR ANY DAMAGES WHATSOEVER, AND IN PARTICULAR, BROADCOM SHALL NOT BE 28183370Simp * LIABLE FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 29183370Simp * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 30183370Simp * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 31183370Simp * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 32183370Simp * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 33183370Simp * OR OTHERWISE), EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 34183370Simp */ 35183370Simp 36183370Simp/* ********************************************************************* 37183370Simp * 38183370Simp * Broadcom Common Firmware Environment (CFE) 39183370Simp * 40183370Simp * Device Function stubs File: cfe_api.c 41183370Simp * 42183370Simp * This module contains device function stubs (small routines to 43183370Simp * call the standard "iocb" interface entry point to CFE). 44183370Simp * There should be one routine here per iocb function call. 45183370Simp * 46183370Simp * Authors: Mitch Lichtenberg, Chris Demetriou 47183370Simp * 48183370Simp ********************************************************************* */ 49183370Simp 50183370Simp#include <sys/cdefs.h> 51183370Simp__FBSDID("$FreeBSD$"); 52183370Simp 53183370Simp#include <dev/cfe/cfe_api.h> 54183370Simp#include <dev/cfe/cfe_api_int.h> 55183370Simp 56183370Simp/* Cast from a native pointer to a cfe_xptr_t and back. */ 57183370Simp#define XPTR_FROM_NATIVE(n) ((cfe_xptr_t) (intptr_t) (n)) 58183370Simp#define NATIVE_FROM_XPTR(x) ((void *) (intptr_t) (x)) 59183370Simp 60183370Simp#ifdef CFE_API_IMPL_NAMESPACE 61183370Simp#define cfe_iocb_dispatch(a) __cfe_iocb_dispatch(a) 62183370Simp#endif 63183370Simpint cfe_iocb_dispatch(cfe_xiocb_t *xiocb); 64183370Simp 65183370Simp#if defined(CFE_API_common) || defined(CFE_API_ALL) 66183370Simp/* 67183370Simp * Declare the dispatch function with args of "intptr_t". 68183370Simp * This makes sure whatever model we're compiling in 69183370Simp * puts the pointers in a single register. For example, 70183370Simp * combining -mlong64 and -mips1 or -mips2 would lead to 71183370Simp * trouble, since the handle and IOCB pointer will be 72183370Simp * passed in two registers each, and CFE expects one. 73183370Simp */ 74183370Simp 75183370Simpstatic int (*cfe_dispfunc)(intptr_t handle, intptr_t xiocb) = 0; 76183370Simpstatic cfe_xuint_t cfe_handle = 0; 77183370Simp 78183370Simpint 79183370Simpcfe_init(cfe_xuint_t handle, cfe_xuint_t ept) 80183370Simp{ 81183370Simp cfe_dispfunc = NATIVE_FROM_XPTR(ept); 82183370Simp cfe_handle = handle; 83183370Simp return 0; 84183370Simp} 85183370Simp 86183370Simpint 87183370Simpcfe_iocb_dispatch(cfe_xiocb_t *xiocb) 88183370Simp{ 89183370Simp if (!cfe_dispfunc) return -1; 90183370Simp return (*cfe_dispfunc)((intptr_t)cfe_handle, (intptr_t)xiocb); 91183370Simp} 92183370Simp#endif /* CFE_API_common || CFE_API_ALL */ 93183370Simp 94183370Simp#if defined(CFE_API_close) || defined(CFE_API_ALL) 95183370Simpint 96183370Simpcfe_close(int handle) 97183370Simp{ 98183370Simp cfe_xiocb_t xiocb; 99183370Simp 100183370Simp xiocb.xiocb_fcode = CFE_CMD_DEV_CLOSE; 101183370Simp xiocb.xiocb_status = 0; 102183370Simp xiocb.xiocb_handle = handle; 103183370Simp xiocb.xiocb_flags = 0; 104183370Simp xiocb.xiocb_psize = 0; 105183370Simp 106183370Simp cfe_iocb_dispatch(&xiocb); 107183370Simp 108183370Simp return xiocb.xiocb_status; 109183370Simp 110183370Simp} 111183370Simp#endif /* CFE_API_close || CFE_API_ALL */ 112183370Simp 113183370Simp#if defined(CFE_API_cpu_start) || defined(CFE_API_ALL) 114183370Simpint 115183370Simpcfe_cpu_start(int cpu, void (*fn)(void), long sp, long gp, long a1) 116183370Simp{ 117183370Simp cfe_xiocb_t xiocb; 118183370Simp 119183370Simp xiocb.xiocb_fcode = CFE_CMD_FW_CPUCTL; 120183370Simp xiocb.xiocb_status = 0; 121183370Simp xiocb.xiocb_handle = 0; 122183370Simp xiocb.xiocb_flags = 0; 123183370Simp xiocb.xiocb_psize = sizeof(xiocb_cpuctl_t); 124183370Simp xiocb.plist.xiocb_cpuctl.cpu_number = cpu; 125183370Simp xiocb.plist.xiocb_cpuctl.cpu_command = CFE_CPU_CMD_START; 126183370Simp xiocb.plist.xiocb_cpuctl.gp_val = gp; 127183370Simp xiocb.plist.xiocb_cpuctl.sp_val = sp; 128183370Simp xiocb.plist.xiocb_cpuctl.a1_val = a1; 129183370Simp xiocb.plist.xiocb_cpuctl.start_addr = (long)fn; 130183370Simp 131183370Simp cfe_iocb_dispatch(&xiocb); 132183370Simp 133183370Simp return xiocb.xiocb_status; 134183370Simp} 135183370Simp#endif /* CFE_API_cpu_start || CFE_API_ALL */ 136183370Simp 137183370Simp#if defined(CFE_API_cpu_stop) || defined(CFE_API_ALL) 138183370Simpint 139183370Simpcfe_cpu_stop(int cpu) 140183370Simp{ 141183370Simp cfe_xiocb_t xiocb; 142183370Simp 143183370Simp xiocb.xiocb_fcode = CFE_CMD_FW_CPUCTL; 144183370Simp xiocb.xiocb_status = 0; 145183370Simp xiocb.xiocb_handle = 0; 146183370Simp xiocb.xiocb_flags = 0; 147183370Simp xiocb.xiocb_psize = sizeof(xiocb_cpuctl_t); 148183370Simp xiocb.plist.xiocb_cpuctl.cpu_number = cpu; 149183370Simp xiocb.plist.xiocb_cpuctl.cpu_command = CFE_CPU_CMD_STOP; 150183370Simp 151183370Simp cfe_iocb_dispatch(&xiocb); 152183370Simp 153183370Simp return xiocb.xiocb_status; 154183370Simp} 155183370Simp#endif /* CFE_API_cpu_stop || CFE_API_ALL */ 156183370Simp 157183370Simp#if defined(CFE_API_enumenv) || defined(CFE_API_ALL) 158183370Simpint 159183370Simpcfe_enumenv(int idx, char *name, int namelen, char *val, int vallen) 160183370Simp{ 161183370Simp cfe_xiocb_t xiocb; 162183370Simp 163202091Simp xiocb.xiocb_fcode = CFE_CMD_ENV_ENUM; 164183370Simp xiocb.xiocb_status = 0; 165183370Simp xiocb.xiocb_handle = 0; 166183370Simp xiocb.xiocb_flags = 0; 167183370Simp xiocb.xiocb_psize = sizeof(xiocb_envbuf_t); 168183370Simp xiocb.plist.xiocb_envbuf.enum_idx = idx; 169183370Simp xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name); 170183370Simp xiocb.plist.xiocb_envbuf.name_length = namelen; 171183370Simp xiocb.plist.xiocb_envbuf.val_ptr = XPTR_FROM_NATIVE(val); 172183370Simp xiocb.plist.xiocb_envbuf.val_length = vallen; 173183370Simp 174183370Simp cfe_iocb_dispatch(&xiocb); 175183370Simp 176183370Simp return xiocb.xiocb_status; 177183370Simp} 178183370Simp#endif /* CFE_API_enumenv || CFE_API_ALL */ 179183370Simp 180183370Simp#if defined(CFE_API_enummem) || defined(CFE_API_ALL) 181183370Simpint 182183370Simpcfe_enummem(int idx, int flags, cfe_xuint_t *start, cfe_xuint_t *length, 183183370Simp cfe_xuint_t *type) 184183370Simp{ 185183370Simp cfe_xiocb_t xiocb; 186183370Simp 187183370Simp xiocb.xiocb_fcode = CFE_CMD_FW_MEMENUM; 188183370Simp xiocb.xiocb_status = 0; 189183370Simp xiocb.xiocb_handle = 0; 190183370Simp xiocb.xiocb_flags = flags; 191183370Simp xiocb.xiocb_psize = sizeof(xiocb_meminfo_t); 192183370Simp xiocb.plist.xiocb_meminfo.mi_idx = idx; 193183370Simp 194183370Simp cfe_iocb_dispatch(&xiocb); 195183370Simp 196183370Simp if (xiocb.xiocb_status < 0) 197183370Simp return xiocb.xiocb_status; 198183370Simp 199183370Simp *start = xiocb.plist.xiocb_meminfo.mi_addr; 200183370Simp *length = xiocb.plist.xiocb_meminfo.mi_size; 201183370Simp *type = xiocb.plist.xiocb_meminfo.mi_type; 202183370Simp 203183370Simp return 0; 204183370Simp} 205183370Simp#endif /* CFE_API_enummem || CFE_API_ALL */ 206183370Simp 207183370Simp#if defined(CFE_API_exit) || defined(CFE_API_ALL) 208183370Simpint 209183370Simpcfe_exit(int warm, int status) 210183370Simp{ 211183370Simp cfe_xiocb_t xiocb; 212183370Simp 213183370Simp xiocb.xiocb_fcode = CFE_CMD_FW_RESTART; 214183370Simp xiocb.xiocb_status = 0; 215183370Simp xiocb.xiocb_handle = 0; 216183370Simp xiocb.xiocb_flags = warm ? CFE_FLG_WARMSTART : 0; 217183370Simp xiocb.xiocb_psize = sizeof(xiocb_exitstat_t); 218183370Simp xiocb.plist.xiocb_exitstat.status = status; 219183370Simp 220183370Simp cfe_iocb_dispatch(&xiocb); 221183370Simp 222183370Simp return xiocb.xiocb_status; 223183370Simp} 224183370Simp#endif /* CFE_API_exit || CFE_API_ALL */ 225183370Simp 226183370Simp#if defined(CFE_API_flushcache) || defined(CFE_API_ALL) 227183370Simpint 228183370Simpcfe_flushcache(int flg) 229183370Simp{ 230183370Simp cfe_xiocb_t xiocb; 231183370Simp 232183370Simp xiocb.xiocb_fcode = CFE_CMD_FW_FLUSHCACHE; 233183370Simp xiocb.xiocb_status = 0; 234183370Simp xiocb.xiocb_handle = 0; 235183370Simp xiocb.xiocb_flags = flg; 236183370Simp xiocb.xiocb_psize = 0; 237183370Simp 238183370Simp cfe_iocb_dispatch(&xiocb); 239183370Simp 240183370Simp return xiocb.xiocb_status; 241183370Simp} 242183370Simp#endif /* CFE_API_flushcache || CFE_API_ALL */ 243183370Simp 244183370Simp#if defined(CFE_API_getdevinfo) || defined(CFE_API_ALL) 245183370Simpint 246183370Simpcfe_getdevinfo(char *name) 247183370Simp{ 248183370Simp cfe_xiocb_t xiocb; 249183370Simp 250183370Simp xiocb.xiocb_fcode = CFE_CMD_DEV_GETINFO; 251183370Simp xiocb.xiocb_status = 0; 252183370Simp xiocb.xiocb_handle = 0; 253183370Simp xiocb.xiocb_flags = 0; 254183370Simp xiocb.xiocb_psize = sizeof(xiocb_buffer_t); 255183370Simp xiocb.plist.xiocb_buffer.buf_offset = 0; 256183370Simp xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(name); 257183370Simp xiocb.plist.xiocb_buffer.buf_length = cfe_strlen(name); 258183370Simp 259183370Simp cfe_iocb_dispatch(&xiocb); 260183370Simp 261183370Simp if (xiocb.xiocb_status < 0) 262183370Simp return xiocb.xiocb_status; 263183370Simp return xiocb.plist.xiocb_buffer.buf_devflags; 264183370Simp} 265183370Simp#endif /* CFE_API_getdevinfo || CFE_API_ALL */ 266183370Simp 267183370Simp#if defined(CFE_API_getenv) || defined(CFE_API_ALL) 268183370Simpint 269183370Simpcfe_getenv(char *name, char *dest, int destlen) 270183370Simp{ 271183370Simp cfe_xiocb_t xiocb; 272183370Simp 273183370Simp *dest = 0; 274183370Simp 275183370Simp xiocb.xiocb_fcode = CFE_CMD_ENV_GET; 276183370Simp xiocb.xiocb_status = 0; 277183370Simp xiocb.xiocb_handle = 0; 278183370Simp xiocb.xiocb_flags = 0; 279183370Simp xiocb.xiocb_psize = sizeof(xiocb_envbuf_t); 280183370Simp xiocb.plist.xiocb_envbuf.enum_idx = 0; 281183370Simp xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name); 282183370Simp xiocb.plist.xiocb_envbuf.name_length = cfe_strlen(name); 283183370Simp xiocb.plist.xiocb_envbuf.val_ptr = XPTR_FROM_NATIVE(dest); 284183370Simp xiocb.plist.xiocb_envbuf.val_length = destlen; 285183370Simp 286183370Simp cfe_iocb_dispatch(&xiocb); 287183370Simp 288183370Simp return xiocb.xiocb_status; 289183370Simp} 290183370Simp#endif /* CFE_API_getenv || CFE_API_ALL */ 291183370Simp 292183370Simp#if defined(CFE_API_getfwinfo) || defined(CFE_API_ALL) 293183370Simpint 294183370Simpcfe_getfwinfo(cfe_fwinfo_t *info) 295183370Simp{ 296183370Simp cfe_xiocb_t xiocb; 297183370Simp 298183370Simp xiocb.xiocb_fcode = CFE_CMD_FW_GETINFO; 299183370Simp xiocb.xiocb_status = 0; 300183370Simp xiocb.xiocb_handle = 0; 301183370Simp xiocb.xiocb_flags = 0; 302183370Simp xiocb.xiocb_psize = sizeof(xiocb_fwinfo_t); 303183370Simp 304183370Simp cfe_iocb_dispatch(&xiocb); 305183370Simp 306183370Simp if (xiocb.xiocb_status < 0) 307183370Simp return xiocb.xiocb_status; 308183370Simp 309183370Simp info->fwi_version = xiocb.plist.xiocb_fwinfo.fwi_version; 310183370Simp info->fwi_totalmem = xiocb.plist.xiocb_fwinfo.fwi_totalmem; 311183370Simp info->fwi_flags = xiocb.plist.xiocb_fwinfo.fwi_flags; 312183370Simp info->fwi_boardid = xiocb.plist.xiocb_fwinfo.fwi_boardid; 313183370Simp info->fwi_bootarea_va = xiocb.plist.xiocb_fwinfo.fwi_bootarea_va; 314183370Simp info->fwi_bootarea_pa = xiocb.plist.xiocb_fwinfo.fwi_bootarea_pa; 315183370Simp info->fwi_bootarea_size = xiocb.plist.xiocb_fwinfo.fwi_bootarea_size; 316183370Simp#if 0 317183370Simp info->fwi_reserved1 = xiocb.plist.xiocb_fwinfo.fwi_reserved1; 318183370Simp info->fwi_reserved2 = xiocb.plist.xiocb_fwinfo.fwi_reserved2; 319183370Simp info->fwi_reserved3 = xiocb.plist.xiocb_fwinfo.fwi_reserved3; 320183370Simp#endif 321183370Simp 322183370Simp return 0; 323183370Simp} 324183370Simp#endif /* CFE_API_getfwinfo || CFE_API_ALL */ 325183370Simp 326183370Simp#if defined(CFE_API_getstdhandle) || defined(CFE_API_ALL) 327183370Simpint 328183370Simpcfe_getstdhandle(int flg) 329183370Simp{ 330183370Simp cfe_xiocb_t xiocb; 331183370Simp 332183370Simp xiocb.xiocb_fcode = CFE_CMD_DEV_GETHANDLE; 333183370Simp xiocb.xiocb_status = 0; 334183370Simp xiocb.xiocb_handle = 0; 335183370Simp xiocb.xiocb_flags = flg; 336183370Simp xiocb.xiocb_psize = 0; 337183370Simp 338183370Simp cfe_iocb_dispatch(&xiocb); 339183370Simp 340183370Simp if (xiocb.xiocb_status < 0) 341183370Simp return xiocb.xiocb_status; 342183370Simp return xiocb.xiocb_handle; 343183370Simp 344183370Simp} 345183370Simp#endif /* CFE_API_getstdhandle || CFE_API_ALL */ 346183370Simp 347183370Simp#if defined(CFE_API_getticks) || defined(CFE_API_ALL) 348183370Simpint64_t 349183370Simp#ifdef CFE_API_IMPL_NAMESPACE 350183370Simp__cfe_getticks(void) 351183370Simp#else 352183370Simpcfe_getticks(void) 353183370Simp#endif 354183370Simp{ 355183370Simp cfe_xiocb_t xiocb; 356183370Simp 357183370Simp xiocb.xiocb_fcode = CFE_CMD_FW_GETTIME; 358183370Simp xiocb.xiocb_status = 0; 359183370Simp xiocb.xiocb_handle = 0; 360183370Simp xiocb.xiocb_flags = 0; 361183370Simp xiocb.xiocb_psize = sizeof(xiocb_time_t); 362183370Simp xiocb.plist.xiocb_time.ticks = 0; 363183370Simp 364183370Simp cfe_iocb_dispatch(&xiocb); 365183370Simp 366183370Simp return xiocb.plist.xiocb_time.ticks; 367183370Simp 368183370Simp} 369183370Simp#endif /* CFE_API_getticks || CFE_API_ALL */ 370183370Simp 371183370Simp#if defined(CFE_API_inpstat) || defined(CFE_API_ALL) 372183370Simpint 373183370Simpcfe_inpstat(int handle) 374183370Simp{ 375183370Simp cfe_xiocb_t xiocb; 376183370Simp 377183370Simp xiocb.xiocb_fcode = CFE_CMD_DEV_INPSTAT; 378183370Simp xiocb.xiocb_status = 0; 379183370Simp xiocb.xiocb_handle = handle; 380183370Simp xiocb.xiocb_flags = 0; 381183370Simp xiocb.xiocb_psize = sizeof(xiocb_inpstat_t); 382183370Simp xiocb.plist.xiocb_inpstat.inp_status = 0; 383183370Simp 384183370Simp cfe_iocb_dispatch(&xiocb); 385183370Simp 386183370Simp if (xiocb.xiocb_status < 0) 387183370Simp return xiocb.xiocb_status; 388183370Simp return xiocb.plist.xiocb_inpstat.inp_status; 389183370Simp 390183370Simp} 391183370Simp#endif /* CFE_API_inpstat || CFE_API_ALL */ 392183370Simp 393183370Simp#if defined(CFE_API_ioctl) || defined(CFE_API_ALL) 394183370Simpint 395183370Simpcfe_ioctl(int handle, unsigned int ioctlnum, unsigned char *buffer, int length, 396183370Simp int *retlen, cfe_xuint_t offset) 397183370Simp{ 398183370Simp cfe_xiocb_t xiocb; 399183370Simp 400183370Simp xiocb.xiocb_fcode = CFE_CMD_DEV_IOCTL; 401183370Simp xiocb.xiocb_status = 0; 402183370Simp xiocb.xiocb_handle = handle; 403183370Simp xiocb.xiocb_flags = 0; 404183370Simp xiocb.xiocb_psize = sizeof(xiocb_buffer_t); 405183370Simp xiocb.plist.xiocb_buffer.buf_offset = offset; 406183370Simp xiocb.plist.xiocb_buffer.buf_ioctlcmd = ioctlnum; 407183370Simp xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer); 408183370Simp xiocb.plist.xiocb_buffer.buf_length = length; 409183370Simp 410183370Simp cfe_iocb_dispatch(&xiocb); 411183370Simp 412183370Simp if (retlen) 413183370Simp *retlen = xiocb.plist.xiocb_buffer.buf_retlen; 414183370Simp return xiocb.xiocb_status; 415183370Simp} 416183370Simp#endif /* CFE_API_ioctl || CFE_API_ALL */ 417183370Simp 418183370Simp#if defined(CFE_API_open) || defined(CFE_API_ALL) 419183370Simpint 420183370Simpcfe_open(char *name) 421183370Simp{ 422183370Simp cfe_xiocb_t xiocb; 423183370Simp 424183370Simp xiocb.xiocb_fcode = CFE_CMD_DEV_OPEN; 425183370Simp xiocb.xiocb_status = 0; 426183370Simp xiocb.xiocb_handle = 0; 427183370Simp xiocb.xiocb_flags = 0; 428183370Simp xiocb.xiocb_psize = sizeof(xiocb_buffer_t); 429183370Simp xiocb.plist.xiocb_buffer.buf_offset = 0; 430183370Simp xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(name); 431183370Simp xiocb.plist.xiocb_buffer.buf_length = cfe_strlen(name); 432183370Simp 433183370Simp cfe_iocb_dispatch(&xiocb); 434183370Simp 435183370Simp if (xiocb.xiocb_status < 0) 436183370Simp return xiocb.xiocb_status; 437183370Simp return xiocb.xiocb_handle; 438183370Simp} 439183370Simp#endif /* CFE_API_open || CFE_API_ALL */ 440183370Simp 441183370Simp#if defined(CFE_API_read) || defined(CFE_API_ALL) 442183370Simpint 443183370Simpcfe_read(int handle, unsigned char *buffer, int length) 444183370Simp{ 445183370Simp return cfe_readblk(handle, 0, buffer, length); 446183370Simp} 447183370Simp#endif /* CFE_API_read || CFE_API_ALL */ 448183370Simp 449183370Simp#if defined(CFE_API_readblk) || defined(CFE_API_ALL) 450183370Simpint 451183370Simpcfe_readblk(int handle, cfe_xint_t offset, unsigned char *buffer, int length) 452183370Simp{ 453183370Simp cfe_xiocb_t xiocb; 454183370Simp 455183370Simp xiocb.xiocb_fcode = CFE_CMD_DEV_READ; 456183370Simp xiocb.xiocb_status = 0; 457183370Simp xiocb.xiocb_handle = handle; 458183370Simp xiocb.xiocb_flags = 0; 459183370Simp xiocb.xiocb_psize = sizeof(xiocb_buffer_t); 460183370Simp xiocb.plist.xiocb_buffer.buf_offset = offset; 461183370Simp xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer); 462183370Simp xiocb.plist.xiocb_buffer.buf_length = length; 463183370Simp 464183370Simp cfe_iocb_dispatch(&xiocb); 465183370Simp 466183370Simp if (xiocb.xiocb_status < 0) 467183370Simp return xiocb.xiocb_status; 468183370Simp return xiocb.plist.xiocb_buffer.buf_retlen; 469183370Simp} 470183370Simp#endif /* CFE_API_readblk || CFE_API_ALL */ 471183370Simp 472183370Simp#if defined(CFE_API_setenv) || defined(CFE_API_ALL) 473183370Simpint 474183370Simpcfe_setenv(char *name, char *val) 475183370Simp{ 476183370Simp cfe_xiocb_t xiocb; 477183370Simp 478183370Simp xiocb.xiocb_fcode = CFE_CMD_ENV_SET; 479183370Simp xiocb.xiocb_status = 0; 480183370Simp xiocb.xiocb_handle = 0; 481183370Simp xiocb.xiocb_flags = 0; 482183370Simp xiocb.xiocb_psize = sizeof(xiocb_envbuf_t); 483183370Simp xiocb.plist.xiocb_envbuf.enum_idx = 0; 484183370Simp xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name); 485183370Simp xiocb.plist.xiocb_envbuf.name_length = cfe_strlen(name); 486183370Simp xiocb.plist.xiocb_envbuf.val_ptr = XPTR_FROM_NATIVE(val); 487183370Simp xiocb.plist.xiocb_envbuf.val_length = cfe_strlen(val); 488183370Simp 489183370Simp cfe_iocb_dispatch(&xiocb); 490183370Simp 491183370Simp return xiocb.xiocb_status; 492183370Simp} 493183370Simp#endif /* CFE_API_setenv || CFE_API_ALL */ 494183370Simp 495183370Simp#if (defined(CFE_API_strlen) || defined(CFE_API_ALL)) \ 496183370Simp && !defined(CFE_API_STRLEN_CUSTOM) 497183370Simpint 498183370Simpcfe_strlen(char *name) 499183370Simp{ 500183370Simp int count = 0; 501183370Simp 502183370Simp while (*name++) 503183370Simp count++; 504183370Simp 505183370Simp return count; 506183370Simp} 507183370Simp#endif /* CFE_API_strlen || CFE_API_ALL */ 508183370Simp 509183370Simp#if defined(CFE_API_write) || defined(CFE_API_ALL) 510183370Simpint 511183370Simpcfe_write(int handle, unsigned char *buffer, int length) 512183370Simp{ 513183370Simp return cfe_writeblk(handle, 0, buffer, length); 514183370Simp} 515183370Simp#endif /* CFE_API_write || CFE_API_ALL */ 516183370Simp 517183370Simp#if defined(CFE_API_writeblk) || defined(CFE_API_ALL) 518183370Simpint 519183370Simpcfe_writeblk(int handle, cfe_xint_t offset, unsigned char *buffer, int length) 520183370Simp{ 521183370Simp cfe_xiocb_t xiocb; 522183370Simp 523183370Simp xiocb.xiocb_fcode = CFE_CMD_DEV_WRITE; 524183370Simp xiocb.xiocb_status = 0; 525183370Simp xiocb.xiocb_handle = handle; 526183370Simp xiocb.xiocb_flags = 0; 527183370Simp xiocb.xiocb_psize = sizeof(xiocb_buffer_t); 528183370Simp xiocb.plist.xiocb_buffer.buf_offset = offset; 529183370Simp xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer); 530183370Simp xiocb.plist.xiocb_buffer.buf_length = length; 531183370Simp 532183370Simp cfe_iocb_dispatch(&xiocb); 533183370Simp 534183370Simp if (xiocb.xiocb_status < 0) 535183370Simp return xiocb.xiocb_status; 536183370Simp return xiocb.plist.xiocb_buffer.buf_retlen; 537183370Simp} 538183370Simp#endif /* CFE_API_writeblk || CFE_API_ALL */ 539