Index: tools/makeobjops.awk =================================================================== --- tools/makeobjops.awk (revision 230401) +++ tools/makeobjops.awk (working copy) @@ -192,7 +192,7 @@ # Handle "METHOD" and "STATICMETHOD" sections. # -function handle_method (static, doc) +function handle_method (static, api, doc) { # # Get the return type and function name and delete that from @@ -204,6 +204,8 @@ error = 1; return; } + if (api) + needs_apicheck = 1; sub(/^[^ ]+[ ]+/, ""); ret = $0; sub(/[ ]*\{.*$/, "", ret); @@ -305,7 +307,35 @@ prototype = "typedef " ret " " mname "_t("; printh(format_line(prototype argument_list ");", line_width, length(prototype))); + # API function + if (api) { + delete api_arguments + delete api_varnames + api_varnames[1] = "_provider"; + for (i = 2; i <= num_arguments; i++) { + api_arguments[i-1] = arguments[i]; + api_varnames[i] = varnames[i]; + } + api_argument_list = join(", ", api_arguments, num_arguments - 1); + api_varname_list = join(", ", api_varnames, num_varnames); + if (opt_d) { + warn("API Arguments: " api_argument_list); + warn("API Varnames: " api_varname_list); + } + + printh("/** @brief An exported API function for " umname "() method */"); + printh(ret " " mname "(" api_argument_list ");"); + + # Implementation + printc(ret " " mname "(" api_argument_list ")"); + printc("{"); + printc("\tdevice_t _provider = devclass_get_device(devclass_find(\"" intname "\"), 0);") + retrn = (ret != "void") ? "return " : ""; + printc("\t" retrn umname"(" api_varname_list ");"); + printc("}\n"); + } + # Print out the method desc printc("struct kobjop_desc " mname "_desc = {"); printc("\t0, { &" mname "_desc, (kobjop_t)" default_function " }"); @@ -469,11 +499,16 @@ else if (/^HEADER[ ]*{$/) printh(handle_code()); else if (/^METHOD/) { - handle_method(0, lastdoc); + handle_method(0, 0, lastdoc); lastdoc = ""; - } else if (/^STATICMETHOD/) { - handle_method(1, lastdoc); + } + else if (/^APIMETHOD/) { + handle_method(0, 1, lastdoc); lastdoc = ""; + } + else if (/^STATICMETHOD/) { + handle_method(1, 0, lastdoc); + lastdoc = ""; } else { debug($0); warnsrc("Invalid line encountered"); @@ -481,6 +516,14 @@ } } + if (needs_apicheck) { + printh("int " intname "_available(void);"); + printc("int " intname "_available(void)"); + printc("{"); + printc("\treturn (devclass_get_device(devclass_find(\"" intname "\"), 0) != NULL);"); + printc("}"); + } + # # Print the final '#endif' in the header file. # Index: dev/gpio/gpio_if.m =================================================================== --- dev/gpio/gpio_if.m (revision 230401) +++ dev/gpio/gpio_if.m (working copy) @@ -34,7 +34,7 @@ # # Get total number of pins # -METHOD int pin_max { +APIMETHOD int pin_max { device_t dev; int *npins; }; @@ -42,7 +42,7 @@ # # Set value of pin specifed by pin_num # -METHOD int pin_set { +APIMETHOD int pin_set { device_t dev; uint32_t pin_num; uint32_t pin_value; @@ -51,7 +51,7 @@ # # Get value of pin specifed by pin_num # -METHOD int pin_get { +APIMETHOD int pin_get { device_t dev; uint32_t pin_num; uint32_t *pin_value; @@ -60,7 +60,7 @@ # # Toggle value of pin specifed by pin_num # -METHOD int pin_toggle { +APIMETHOD int pin_toggle { device_t dev; uint32_t pin_num; }; @@ -68,7 +68,7 @@ # # Get pin capabilities # -METHOD int pin_getcaps { +APIMETHOD int pin_getcaps { device_t dev; uint32_t pin_num; uint32_t *caps; @@ -77,7 +77,7 @@ # # Get pin flags # -METHOD int pin_getflags { +APIMETHOD int pin_getflags { device_t dev; uint32_t pin_num; uint32_t *flags; @@ -86,7 +86,7 @@ # # Get pin name # -METHOD int pin_getname { +APIMETHOD int pin_getname { device_t dev; uint32_t pin_num; char *name; @@ -95,7 +95,7 @@ # # Set current configuration and capabilities # -METHOD int pin_setflags { +APIMETHOD int pin_setflags { device_t dev; uint32_t pin_num; uint32_t flags;