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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: SCCS/s.of1275.c 1.6 05/18/01 15:16:42 cort
  3.  */
  4. /* Open Firmware Client Interface */
  5. #include "of1275.h"
  6. static int (*of_server)(void *) = (int(*)(void*))-1;
  7. void
  8. of_init(void *handler)
  9. {
  10. of_server = (int(*)(void*))handler;
  11. }
  12. /* 6.3.2.1 Client interface */
  13. int
  14. of_test(const char *name, int *missing)
  15. {
  16. int result;
  17. static of_test_service s;
  18. s.service = "test";
  19. s.n_args = 1;
  20. s.n_returns = 1;
  21. s.name = name;
  22. result = of_server(&s);
  23. *missing = s.missing;
  24. return result;
  25. }
  26. /* 6.3.2.2 Device tree */
  27. int
  28. of_peer(int phandle, int *sibling_phandle)
  29. {
  30. int result;
  31. static of_peer_service s;
  32. s.service = "peer";
  33. s.n_args = 1;
  34. s.n_returns = 1;
  35. s.phandle = phandle;
  36. result = of_server(&s);
  37. *sibling_phandle = s.sibling_phandle;
  38. return result;
  39. }
  40. int
  41. of_child(int phandle, int *child_phandle)
  42. {
  43. int result;
  44. static of_child_service s;
  45. s.service = "child";
  46. s.n_args = 1;
  47. s.n_returns = 1;
  48. s.phandle = phandle;
  49. result = of_server(&s);
  50. *child_phandle = s.child_phandle;
  51. return result;
  52. }
  53. int
  54. of_parent(int phandle, int *parent_phandle)
  55. {
  56. int result;
  57. static of_parent_service s;
  58. s.service = "parent";
  59. s.n_args = 1;
  60. s.n_returns = 1;
  61. s.phandle = phandle;
  62. result = of_server(&s);
  63. *parent_phandle = s.parent_phandle;
  64. return result;
  65. }
  66. int
  67. of_instance_to_package(int ihandle, int *phandle)
  68. {
  69. int result;
  70. static of_instance_to_package_service s;
  71. s.service = "instance-to-package";
  72. s.n_args = 1;
  73. s.n_returns = 1;
  74. s.ihandle = ihandle;
  75. result = of_server(&s);
  76. *phandle = s.phandle;
  77. return result;
  78. }
  79. int
  80. of_getproplen(int phandle, const char *name, int *proplen)
  81. {
  82. int result;
  83. static of_getproplen_service s;
  84. s.service = "getproplen";
  85. s.n_args = 2;
  86. s.n_returns = 1;
  87. s.phandle = phandle;
  88. s.name = name;
  89. result = of_server(&s);
  90. *proplen = s.proplen;
  91. return result;
  92. }
  93. int
  94. of_getprop(int phandle, const char *name, void *buf, int buflen, int *size)
  95. {
  96. int result;
  97. static of_getprop_service s;
  98. s.service = "getprop";
  99. s.n_args = 4;
  100. s.n_returns = 1;
  101. s.phandle = phandle;
  102. s.name = name;
  103. s.buf = buf;
  104. s.buflen = buflen;
  105. result = of_server(&s);
  106. *size = s.size;
  107. return result;
  108. }
  109. int
  110. of_nextprop(int phandle, const char *previous, void *buf, int *flag)
  111. {
  112. int result;
  113. static of_nextprop_service s;
  114. s.service = "nextprop";
  115. s.n_args = 3;
  116. s.n_returns = 1;
  117. s.phandle = phandle;
  118. s.previous = previous;
  119. s.buf = buf;
  120. result = of_server(&s);
  121. *flag = s.flag;
  122. return result;
  123. }
  124. int
  125. of_setprop(int phandle, const char *name, void *buf, int len, int *size)
  126. {
  127. int result;
  128. static of_setprop_service s;
  129. s.service = "setprop";
  130. s.n_args = 4;
  131. s.n_returns = 1;
  132. s.phandle = phandle;
  133. s.name = name;
  134. s.buf = buf;
  135. s.len = len;
  136. result = of_server(&s);
  137. *size = s.size;
  138. return result;
  139. }
  140. int
  141. of_canon(const char *device_specifier, void *buf, int buflen, int *length)
  142. {
  143. int result;
  144. static of_canon_service s;
  145. s.service = "canon";
  146. s.n_args = 3;
  147. s.n_returns = 1;
  148. s.device_specifier = device_specifier;
  149. s.buf = buf;
  150. s.buflen = buflen;
  151. result = of_server(&s);
  152. *length = s.length;
  153. return result;
  154. }
  155. int
  156. of_finddevice(const char *device_specifier, int *phandle)
  157. {
  158. int result;
  159. static of_finddevice_service s;
  160. s.service = "finddevice";
  161. s.n_args = 1;
  162. s.n_returns = 1;
  163. s.device_specifier = device_specifier;
  164. result = of_server(&s);
  165. *phandle = s.phandle;
  166. return result;
  167. }
  168. int
  169. of_instance_to_path(int ihandle, void *buf, int buflen, int *length)
  170. {
  171. int result;
  172. static of_instance_to_path_service s;
  173. s.service = "instance-to-path";
  174. s.n_args = 3;
  175. s.n_returns = 1;
  176. s.ihandle = ihandle;
  177. s.buf = buf;
  178. s.buflen = buflen;
  179. result = of_server(&s);
  180. *length = s.length;
  181. return result;
  182. }
  183. int
  184. of_package_to_path(int phandle, void *buf, int buflen, int *length)
  185. {
  186. int result;
  187. static of_package_to_path_service s;
  188. s.service = "package-to-path";
  189. s.n_args = 3;
  190. s.n_returns = 1;
  191. s.phandle = phandle;
  192. s.buf = buf;
  193. s.buflen = buflen;
  194. result = of_server(&s);
  195. *length = s.length;
  196. return result;
  197. }
  198. /* int of_call_method(const char *method, int ihandle, ...); */
  199. /* 6.3.2.3 Device I/O */
  200. int
  201. of_open(const char *device_specifier, int *ihandle)
  202. {
  203. int result;
  204. static of_open_service s;
  205. s.service = "open";
  206. s.n_args = 1;
  207. s.n_returns = 1;
  208. s.device_specifier = device_specifier;
  209. result = of_server(&s);
  210. *ihandle = s.ihandle;
  211. return result;
  212. }
  213. int
  214. of_close(int ihandle)
  215. {
  216. int result;
  217. static of_close_service s;
  218. s.service = "close";
  219. s.n_args = 1;
  220. s.n_returns = 0;
  221. s.ihandle = ihandle;
  222. result = of_server(&s);
  223. return result;
  224. }
  225. int
  226. of_read(int ihandle, void *addr, int len, int *actual)
  227. {
  228. int result;
  229. static of_read_service s;
  230. s.service = "read";
  231. s.n_args = 3;
  232. s.n_returns = 1;
  233. s.ihandle = ihandle;
  234. s.addr = addr;
  235. s.len = len;
  236. result = of_server(&s);
  237. *actual = s.actual;
  238. return result;
  239. }
  240. int
  241. of_write(int ihandle, void *addr, int len, int *actual)
  242. {
  243. int result;
  244. static of_write_service s;
  245. s.service = "write";
  246. s.n_args = 3;
  247. s.n_returns = 1;
  248. s.ihandle = ihandle;
  249. s.addr = addr;
  250. s.len = len;
  251. result = of_server(&s);
  252. *actual = s.actual;
  253. return result;
  254. }
  255. int
  256. of_seek(int ihandle, int pos_hi, int pos_lo, int *status)
  257. {
  258. int result;
  259. static of_seek_service s;
  260. s.service = "seek";
  261. s.n_args = 3;
  262. s.n_returns = 1;
  263. s.ihandle = ihandle;
  264. s.pos_hi = pos_hi;
  265. s.pos_lo = pos_lo;
  266. result = of_server(&s);
  267. *status = s.status;
  268. return result;
  269. }
  270. /* 6.3.2.4 Memory */
  271. int
  272. of_claim(void *virt, int size, int align, void **baseaddr)
  273. {
  274. int result;
  275. static of_claim_service s;
  276. s.service = "claim";
  277. s.n_args = 3;
  278. s.n_returns = 1;
  279. s.virt = virt;
  280. s.size = size;
  281. s.align = align;
  282. result = of_server(&s);
  283. *baseaddr = s.baseaddr;
  284. return result;
  285. }
  286. int
  287. of_release(void *virt, int size)
  288. {
  289. int result;
  290. static of_release_service s;
  291. s.service = "release";
  292. s.n_args = 2;
  293. s.n_returns = 0;
  294. s.virt = virt;
  295. s.size = size;
  296. result = of_server(&s);
  297. return result;
  298. }
  299. /* 6.3.2.5 Control transfer */
  300. int
  301. of_boot(const char *bootspec)
  302. {
  303. int result;
  304. static of_boot_service s;
  305. s.service = "boot";
  306. s.n_args = 1;
  307. s.n_returns = 0;
  308. s.bootspec = bootspec;
  309. result = of_server(&s);
  310. return result;
  311. }
  312. int
  313. of_enter(void)
  314. {
  315. int result;
  316. static of_enter_service s;
  317. s.service = "enter";
  318. s.n_args = 0;
  319. s.n_returns = 0;
  320. result = of_server(&s);
  321. return result;
  322. }
  323. int
  324. of_exit(void)
  325. {
  326. int result;
  327. static of_exit_service s;
  328. s.service = "exit";
  329. s.n_args = 0;
  330. s.n_returns = 0;
  331. result = of_server(&s);
  332. return result;
  333. }
  334. /* int of_chain(void *virt, int size, void *entry, void *args, int len); */
  335. /* 6.3.2.6 User interface */
  336. /* int of_interpret(const char *arg, ...); */
  337. int
  338. of_set_callback(void *newfunc, void **oldfunc)
  339. {
  340. int result;
  341. static of_set_callback_service s;
  342. s.service = "set-callback";
  343. s.n_args = 1;
  344. s.n_returns = 1;
  345. s.newfunc = newfunc;
  346. result = of_server(&s);
  347. *oldfunc = s.oldfunc;
  348. return result;
  349. }
  350. int
  351. of_set_symbol_lookup(void *sym_to_value, void *value_to_sym)
  352. {
  353. int result;
  354. static of_set_symbol_lookup_service s;
  355. s.service = "set-symbol-lookup";
  356. s.n_args = 2;
  357. s.n_returns = 0;
  358. s.sym_to_value = sym_to_value;
  359. s.value_to_sym = s.value_to_sym;
  360. result = of_server(&s);
  361. return result;
  362. }
  363. /* 6.3.2.7 Time */
  364. int
  365. of_milliseconds(int *ms)
  366. {
  367. int result;
  368. static of_milliseconds_service s;
  369. s.service = "milliseconds";
  370. s.n_args = 0;
  371. s.n_returns = 1;
  372. result = of_server(&s);
  373. *ms = s.ms;
  374. return result;
  375. }