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