📄 openfirmware.c
字号:
/*** Copyright 2003, Axel D鰎fler, axeld@pinc-software.de. All rights reserved.** Distributed under the terms of the OpenBeOS License.*/#include <boot/shared/openfirmware.h>#include <newos/errors.h>#include <stdarg.h>// OpenFirmware entry functionstatic int (*gCallOpenFirmware)(void *) = 0; int gChosen;intof_init(int (*openFirmwareEntry)(void *)){ gCallOpenFirmware = openFirmwareEntry; gChosen = of_finddevice("/chosen"); if (gChosen == OF_FAILED) return ERR_NOT_FOUND; return NO_ERROR;}intof_call_method(const char *method, int numArgs, int numReturns, ...){ struct { const char *name; int num_args; int num_returns; void *args[10]; } args = {method, numArgs, numReturns}; va_list list; int i; // iterate over all arguments and copy them into the // structure passed over to the OpenFirmware va_start(list, numReturns); for (i = 0; i < numArgs; i++) { // copy args args.args[i] = (void *)va_arg(list, void *); } for (i = numArgs; i < numArgs + numReturns; i++) { // clear return values args.args[i] = NULL; } if (gCallOpenFirmware(&args) == OF_FAILED) return OF_FAILED; if (numReturns > 0) { // copy return values over to the provided location for (i = numArgs; i < numArgs + numReturns; i++) { void **store = va_arg(list, void **); if (store) *store = args.args[i]; } } va_end(list); return 0;}int of_finddevice(const char *device){ struct { const char *name; int num_args; int num_returns; const char *device; int handle; } args = {"finddevice", 1, 1, device, 0}; if (gCallOpenFirmware(&args) == OF_FAILED) return OF_FAILED; return args.handle;}/** Returns the first child of the given node */intof_child(int node){ struct { const char *name; int num_args; int num_returns; int node; int child; } args = {"child", 1, 1, node, 0}; if (gCallOpenFirmware(&args) == OF_FAILED) return OF_FAILED; return args.child;}/** Returns the next sibling of the given node */intof_peer(int node){ struct { const char *name; int num_args; int num_returns; int node; int next_sibling; } args = {"peer", 1, 1, node, 0}; if (gCallOpenFirmware(&args) == OF_FAILED) return OF_FAILED; return args.next_sibling;}/** Returns the parent of the given node */intof_parent(int node){ struct { const char *name; int num_args; int num_returns; int node; int parent; } args = {"parent", 1, 1, node, 0}; if (gCallOpenFirmware(&args) == OF_FAILED) return OF_FAILED; return args.parent;}intof_instance_to_path(int instance, char *pathBuffer, int bufferSize){ struct { const char *name; int num_args; int num_returns; int instance; char *path_buffer; int buffer_size; int size; } args = {"instance-to-path", 3, 1, instance, pathBuffer, bufferSize, 0}; if (gCallOpenFirmware(&args) == OF_FAILED) return OF_FAILED; return args.size;}int of_instance_to_package(int instance){ struct { const char *name; int num_args; int num_returns; int instance; int package; } args = {"instance-to-package", 1, 1, instance, 0}; if (gCallOpenFirmware(&args) == OF_FAILED) return OF_FAILED; return args.package;}int of_getprop(int package, const char *property, void *buffer, int bufferSize){ struct { const char *name; int num_args; int num_returns; int package; const char *property; void *buffer; int buffer_size; int size; } args = {"getprop", 4, 1, package, property, buffer, bufferSize, 0}; if (gCallOpenFirmware(&args) == OF_FAILED) return OF_FAILED; return args.size;}int of_setprop(int package, const char *property, const void *buffer, int bufferSize){ struct { const char *name; int num_args; int num_returns; int package; const char *property; const void *buffer; int buffer_size; int size; } args = {"setprop", 4, 1, package, property, buffer, bufferSize, 0}; if (gCallOpenFirmware(&args) == OF_FAILED) return OF_FAILED; return args.size;}intof_getproplen(int package, const char *property){ struct { const char *name; int num_args; int num_returns; int package; const char *property; int size; } args = {"getproplen", 2, 1, package, property, 0}; if (gCallOpenFirmware(&args) == OF_FAILED) return OF_FAILED; return args.size;}intof_nextprop(int package, const char *previousProperty, char *nextProperty){ struct { const char *name; int num_args; int num_returns; int package; const char *previous_property; char *next_property; int flag; } args = {"nextprop", 3, 1, package, previousProperty, nextProperty, 0}; if (gCallOpenFirmware(&args) == OF_FAILED) return OF_FAILED; return args.flag;}intof_package_to_path(int package, char *pathBuffer, int bufferSize){ struct { const char *name; int num_args; int num_returns; int package; char *path_buffer; int buffer_size; int size; } args = {"package-to-path", 3, 1, package, pathBuffer, bufferSize, 0}; if (gCallOpenFirmware(&args) == OF_FAILED) return OF_FAILED; return args.size;}// I/O functionsint of_open(const char *nodeName){ struct { const char *name; int num_args; int num_returns; const char *node_name; int handle; } args = {"open", 1, 1, nodeName, 0}; if (gCallOpenFirmware(&args) == OF_FAILED || args.handle == 0) return OF_FAILED; return args.handle;}voidof_close(int handle){ struct { const char *name; int num_args; int num_returns; int handle; } args = {"close", 1, 0, handle}; gCallOpenFirmware(&args);}int of_read(int handle, void *buffer, int bufferSize){ struct { const char *name; int num_args; int num_returns; int handle; void *buffer; int buffer_size; int size; } args = {"read", 3, 1, handle, buffer, bufferSize, 0}; if (gCallOpenFirmware(&args) == OF_FAILED) return OF_FAILED; return args.size;}int of_write(int handle, const void *buffer, int bufferSize){ struct { const char *name; int num_args; int num_returns; int handle; const void *buffer; int buffer_size; int size; } args = {"write", 3, 1, handle, buffer, bufferSize, 0}; if (gCallOpenFirmware(&args) == OF_FAILED) return OF_FAILED; return args.size;}int of_seek(int handle, long long pos){ struct { const char *name; int num_args; int num_returns; int handle; int64 pos; int status; } args = {"seek", 3, 1, handle, pos, 0}; if (gCallOpenFirmware(&args) == OF_FAILED) return OF_FAILED; return args.status;}// memory functionsintof_release(void *virtual, int size){ struct { const char *name; int num_args; int num_returns; void *virtual; int size; } args = {"release", 2, 0, virtual, size}; return gCallOpenFirmware(&args);}void *of_claim(void *virtual, int size, int align){ struct { const char *name; int num_args; int num_returns; void *virtual; int size; int align; void *address; } args = {"claim", 3, 1, virtual, size, align}; if (gCallOpenFirmware(&args) == OF_FAILED) return NULL; return args.address;}// misc functions/** tests if the given service is missing */intof_test(const char *service){ struct { const char *name; int num_args; int num_returns; const char *service; int missing; } args = {"test", 1, 1, service, 0}; if (gCallOpenFirmware(&args) == OF_FAILED) return OF_FAILED; return args.missing;}/** Returns the millisecond counter */intof_milliseconds(void){ struct { const char *name; int num_args; int num_returns; int milliseconds; } args = {"milliseconds", 0, 1, 0}; gCallOpenFirmware(&args); return args.milliseconds;}voidof_exit(void){ struct { const char *name; int num_args; int num_returns; } args = {"exit", 0, 0}; gCallOpenFirmware(&args);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -