cfe_api.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:10k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (C) 2000, 2001 Broadcom Corporation
  3.  *
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (at your option) any later version.
  8.  *
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  17.  */
  18. /*  *********************************************************************
  19.     *  Broadcom Common Firmware Environment (CFE)
  20.     *
  21.     *  Device Function stubs File: cfe_api.c
  22.     *
  23.     *  This module contains device function stubs (small routines to
  24.     *  call the standard "iocb" interface entry point to CFE).
  25.     *  There should be one routine here per iocb function call.
  26.     *
  27.     *  Author:  Mitch Lichtenberg (mpl@broadcom.com)
  28.     *
  29.     ********************************************************************* */
  30. #include "cfe_xiocb.h"
  31. #include "cfe_api.h"
  32. static long cfe_console_handle = -1;
  33. static int (*cfe_dispfunc)(long handle,cfe_xiocb_t *xiocb) = 0;
  34. static cfe_xuint_t cfe_handle = 0;
  35. /*
  36.  * This macro makes a "signed 64-bit pointer" - basically extending a regular
  37.  * pointer to its 64-bit compatibility space equivalent.
  38.  */
  39. #define BIGPTR(x) (long long) (long) (x)
  40. typedef unsigned long intptr_t;
  41. int cfe_init(cfe_xuint_t handle)
  42. {
  43. if ((*((unsigned int *) (int) CFE_APISEAL) == CFE_EPTSEAL) ||
  44.     (*((unsigned int *) (int) CFE_APISEAL_RE) == CFE_EPTSEAL) ||
  45.     (*((unsigned int *) (int) CFE_APISEAL_OLD) == CFE_EPTSEAL)) {
  46. cfe_dispfunc = (cfe_xptr_t) (int) CFE_APIENTRY;
  47. if (handle) cfe_handle = handle;
  48. return 0;
  49. } else {
  50. return -1;
  51. }
  52. }
  53. int cfe_iocb_dispatch(cfe_xiocb_t *xiocb);
  54. int cfe_iocb_dispatch(cfe_xiocb_t *xiocb)
  55. {
  56. if (!cfe_dispfunc) return -1;
  57. return (*cfe_dispfunc)(cfe_handle,xiocb);
  58. }
  59. static int cfe_strlen(char *name)
  60. {
  61. int count = 0;
  62. while (*name) {
  63. count++;
  64. name++;
  65. }
  66. return count;
  67. }
  68. int cfe_open(char *name)
  69. {
  70. cfe_xiocb_t xiocb;
  71. xiocb.xiocb_fcode = CFE_CMD_DEV_OPEN;
  72. xiocb.xiocb_status = 0;
  73. xiocb.xiocb_handle = 0;
  74. xiocb.xiocb_flags = 0;
  75. xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
  76. xiocb.plist.xiocb_buffer.buf_offset = 0;
  77. xiocb.plist.xiocb_buffer.buf_ptr = BIGPTR(name);
  78. xiocb.plist.xiocb_buffer.buf_length = cfe_strlen(name);
  79. cfe_iocb_dispatch(&xiocb);
  80. return (xiocb.xiocb_status < 0) ? xiocb.xiocb_status : xiocb.xiocb_handle;
  81. }
  82. int cfe_close(int handle)
  83. {
  84. cfe_xiocb_t xiocb;
  85. xiocb.xiocb_fcode = CFE_CMD_DEV_CLOSE;
  86. xiocb.xiocb_status = 0;
  87. xiocb.xiocb_handle = handle;
  88. xiocb.xiocb_flags = 0;
  89. xiocb.xiocb_psize = 0;
  90. cfe_iocb_dispatch(&xiocb);
  91. return (xiocb.xiocb_status);
  92. }
  93. int cfe_readblk(int handle,cfe_xint_t offset,unsigned char *buffer,int length)
  94. {
  95. cfe_xiocb_t xiocb;
  96. xiocb.xiocb_fcode = CFE_CMD_DEV_READ;
  97. xiocb.xiocb_status = 0;
  98. xiocb.xiocb_handle = handle;
  99. xiocb.xiocb_flags = 0;
  100. xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
  101. xiocb.plist.xiocb_buffer.buf_offset = offset;
  102. xiocb.plist.xiocb_buffer.buf_ptr = BIGPTR(buffer);
  103. xiocb.plist.xiocb_buffer.buf_length = length;
  104. cfe_iocb_dispatch(&xiocb);
  105. return (xiocb.xiocb_status < 0) ? xiocb.xiocb_status : xiocb.plist.xiocb_buffer.buf_retlen;
  106. }
  107. int cfe_read(int handle,unsigned char *buffer,int length)
  108. {
  109. return cfe_readblk(handle,0,buffer,length);
  110. }
  111. int cfe_writeblk(int handle,cfe_xint_t offset,unsigned char *buffer,int length)
  112. {
  113. cfe_xiocb_t xiocb;
  114. xiocb.xiocb_fcode = CFE_CMD_DEV_WRITE;
  115. xiocb.xiocb_status = 0;
  116. xiocb.xiocb_handle = handle;
  117. xiocb.xiocb_flags = 0;
  118. xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
  119. xiocb.plist.xiocb_buffer.buf_offset = offset;
  120. xiocb.plist.xiocb_buffer.buf_ptr = BIGPTR(buffer);
  121. xiocb.plist.xiocb_buffer.buf_length = length;
  122. cfe_iocb_dispatch(&xiocb);
  123. return (xiocb.xiocb_status < 0) ? xiocb.xiocb_status : xiocb.plist.xiocb_buffer.buf_retlen;
  124. }
  125. int cfe_write(int handle,unsigned char *buffer,int length)
  126. {
  127. return cfe_writeblk(handle,0,buffer,length);
  128. }
  129. int cfe_ioctl(int handle,unsigned int ioctlnum,unsigned char *buffer,int length,int *retlen)
  130. {
  131. cfe_xiocb_t xiocb;
  132. xiocb.xiocb_fcode = CFE_CMD_DEV_IOCTL;
  133. xiocb.xiocb_status = 0;
  134. xiocb.xiocb_handle = handle;
  135. xiocb.xiocb_flags = 0;
  136. xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
  137. xiocb.plist.xiocb_buffer.buf_ioctlcmd = (cfe_xint_t) ioctlnum;
  138. xiocb.plist.xiocb_buffer.buf_ptr = BIGPTR(buffer);
  139. xiocb.plist.xiocb_buffer.buf_length = length;
  140. cfe_iocb_dispatch(&xiocb);
  141. if (retlen) *retlen = xiocb.plist.xiocb_buffer.buf_retlen;
  142. return xiocb.xiocb_status;
  143. }
  144. int cfe_inpstat(int handle)
  145. {
  146. cfe_xiocb_t xiocb;
  147. xiocb.xiocb_fcode = CFE_CMD_DEV_INPSTAT;
  148. xiocb.xiocb_status = 0;
  149. xiocb.xiocb_handle = handle;
  150. xiocb.xiocb_flags = 0;
  151. xiocb.xiocb_psize = sizeof(xiocb_inpstat_t);
  152. xiocb.plist.xiocb_inpstat.inp_status = 0;
  153. cfe_iocb_dispatch(&xiocb);
  154. if (xiocb.xiocb_status < 0) return xiocb.xiocb_status;
  155. return xiocb.plist.xiocb_inpstat.inp_status;
  156. }
  157. long long cfe_getticks(void)
  158. {
  159. cfe_xiocb_t xiocb;
  160. xiocb.xiocb_fcode = CFE_CMD_FW_GETTIME;
  161. xiocb.xiocb_status = 0;
  162. xiocb.xiocb_handle = 0;
  163. xiocb.xiocb_flags = 0;
  164. xiocb.xiocb_psize = sizeof(xiocb_time_t);
  165. xiocb.plist.xiocb_time.ticks = 0;
  166. cfe_iocb_dispatch(&xiocb);
  167. return xiocb.plist.xiocb_time.ticks;
  168. }
  169. int cfe_getenv(char *name,char *dest,int destlen)
  170. {
  171. cfe_xiocb_t xiocb;
  172. *dest = 0;
  173. xiocb.xiocb_fcode = CFE_CMD_ENV_GET;
  174. xiocb.xiocb_status = 0;
  175. xiocb.xiocb_handle = 0;
  176. xiocb.xiocb_flags = 0;
  177. xiocb.xiocb_psize = sizeof(xiocb_envbuf_t);
  178. xiocb.plist.xiocb_envbuf.enum_idx = 0;
  179. xiocb.plist.xiocb_envbuf.name_ptr = BIGPTR(name);
  180. xiocb.plist.xiocb_envbuf.name_length = cfe_strlen(name);
  181. xiocb.plist.xiocb_envbuf.val_ptr = BIGPTR(dest);
  182. xiocb.plist.xiocb_envbuf.val_length = destlen;
  183. cfe_iocb_dispatch(&xiocb);
  184. return xiocb.xiocb_status;
  185. }
  186. int cfe_setenv(char *name,char *val)
  187. {
  188. cfe_xiocb_t xiocb;
  189. xiocb.xiocb_fcode = CFE_CMD_ENV_SET;
  190. xiocb.xiocb_status = 0;
  191. xiocb.xiocb_handle = 0;
  192. xiocb.xiocb_flags = 0;
  193. xiocb.xiocb_psize = sizeof(xiocb_envbuf_t);
  194. xiocb.plist.xiocb_envbuf.enum_idx = 0;
  195. xiocb.plist.xiocb_envbuf.name_ptr = BIGPTR(name);
  196. xiocb.plist.xiocb_envbuf.name_length = cfe_strlen(name);
  197. xiocb.plist.xiocb_envbuf.val_ptr = BIGPTR(val);
  198. xiocb.plist.xiocb_envbuf.val_length = cfe_strlen(val);
  199. cfe_iocb_dispatch(&xiocb);
  200. return xiocb.xiocb_status;
  201. }
  202. int cfe_enummem(long idx, unsigned long long *addr, unsigned long long *size, long *type)
  203. {
  204. cfe_xiocb_t xiocb;
  205. xiocb.xiocb_fcode = CFE_CMD_FW_MEMENUM;
  206. xiocb.xiocb_status = 0;
  207. xiocb.xiocb_handle = 0;
  208. xiocb.xiocb_flags = 0;
  209. xiocb.xiocb_psize = sizeof(xiocb_meminfo_t);
  210. xiocb.plist.xiocb_meminfo.mi_idx = idx;
  211. cfe_iocb_dispatch(&xiocb);
  212. (*addr) = xiocb.plist.xiocb_meminfo.mi_addr;
  213. (*size) = xiocb.plist.xiocb_meminfo.mi_size;
  214. (*type) = xiocb.plist.xiocb_meminfo.mi_type;
  215. return xiocb.xiocb_status;
  216. }
  217. int cfe_enumenv(int idx,char *name,int namelen,char *val,int vallen)
  218. {
  219. cfe_xiocb_t xiocb;
  220. xiocb.xiocb_fcode = CFE_CMD_ENV_SET;
  221. xiocb.xiocb_status = 0;
  222. xiocb.xiocb_handle = 0;
  223. xiocb.xiocb_flags = 0;
  224. xiocb.xiocb_psize = sizeof(xiocb_envbuf_t);
  225. xiocb.plist.xiocb_envbuf.enum_idx = idx;
  226. xiocb.plist.xiocb_envbuf.name_ptr = BIGPTR(name);
  227. xiocb.plist.xiocb_envbuf.name_length = namelen;
  228. xiocb.plist.xiocb_envbuf.val_ptr = BIGPTR(val);
  229. xiocb.plist.xiocb_envbuf.val_length = vallen;
  230. cfe_iocb_dispatch(&xiocb);
  231. return xiocb.xiocb_status;
  232. }
  233. int cfe_exit(int warm, int status)
  234. {
  235. cfe_xiocb_t xiocb;
  236. xiocb.xiocb_fcode = CFE_CMD_FW_RESTART;
  237. xiocb.xiocb_status = 0;
  238. xiocb.xiocb_handle = 0;
  239. xiocb.xiocb_flags = warm ? CFE_FLG_WARMSTART : 0;
  240. xiocb.xiocb_psize = sizeof(xiocb_exitstat_t);
  241. xiocb.plist.xiocb_exitstat.status = (cfe_xint_t) status;
  242. cfe_iocb_dispatch(&xiocb);
  243. return (xiocb.xiocb_status);
  244. }
  245. int cfe_flushcache(int flg)
  246. {
  247. cfe_xiocb_t xiocb;
  248. xiocb.xiocb_fcode = CFE_CMD_FW_FLUSHCACHE;
  249. xiocb.xiocb_status = 0;
  250. xiocb.xiocb_handle = 0;
  251. xiocb.xiocb_flags = flg;
  252. xiocb.xiocb_psize = 0;
  253. cfe_iocb_dispatch(&xiocb);
  254. return xiocb.xiocb_status;
  255. }
  256. int cfe_getstdhandle(int flg)
  257. {
  258. cfe_xiocb_t xiocb;
  259. xiocb.xiocb_fcode = CFE_CMD_DEV_GETHANDLE;
  260. xiocb.xiocb_status = 0;
  261. xiocb.xiocb_handle = 0;
  262. xiocb.xiocb_flags = flg;
  263. xiocb.xiocb_psize = 0;
  264. cfe_iocb_dispatch(&xiocb);
  265. return (xiocb.xiocb_status < 0) ? xiocb.xiocb_status : xiocb.xiocb_handle;
  266. }
  267. int cfe_start_cpu(int cpu, void (*fn)(void), long sp, long gp, long a1)
  268. {
  269. cfe_xiocb_t xiocb;
  270. xiocb.xiocb_fcode = CFE_CMD_FW_CPUCTL;
  271. xiocb.xiocb_status = 0;
  272. xiocb.xiocb_handle = 0;
  273. xiocb.xiocb_flags  = 0;
  274. xiocb.xiocb_psize = sizeof(xiocb_cpuctl_t);
  275. xiocb.plist.xiocb_cpuctl.cpu_number = cpu;
  276. xiocb.plist.xiocb_cpuctl.cpu_command = CFE_CPU_CMD_START;
  277. xiocb.plist.xiocb_cpuctl.gp_val = gp;
  278. xiocb.plist.xiocb_cpuctl.sp_val = sp;
  279. xiocb.plist.xiocb_cpuctl.a1_val = a1;
  280. xiocb.plist.xiocb_cpuctl.start_addr = (long)fn;
  281. cfe_iocb_dispatch(&xiocb);
  282. return xiocb.xiocb_status;
  283. }
  284. int cfe_stop_cpu(int cpu)
  285. {
  286. cfe_xiocb_t xiocb;
  287. xiocb.xiocb_fcode = CFE_CMD_FW_CPUCTL;
  288. xiocb.xiocb_status = 0;
  289. xiocb.xiocb_handle = 0;
  290. xiocb.xiocb_flags  = 0;
  291. xiocb.xiocb_psize = sizeof(xiocb_cpuctl_t);
  292. xiocb.plist.xiocb_cpuctl.cpu_number = cpu;
  293. xiocb.plist.xiocb_cpuctl.cpu_command = CFE_CPU_CMD_STOP;
  294. cfe_iocb_dispatch(&xiocb);
  295. return xiocb.xiocb_status;
  296. }
  297. void cfe_open_console()
  298. {
  299. cfe_console_handle = cfe_getstdhandle(CFE_STDHANDLE_CONSOLE);
  300. }
  301. void cfe_console_print(const char *str, int len)
  302. {
  303. int res;
  304. if (cfe_console_handle != -1) {
  305. do {
  306. res = cfe_writeblk(cfe_console_handle, 0, str, len);
  307. if (res < 0)
  308. break;
  309. str += res;
  310. len -= res;
  311. } while (len);
  312. }
  313. }