diff options
-rw-r--r-- | sysutils/hal/Makefile | 2 | ||||
-rw-r--r-- | sysutils/hal/files/patch-hald_freebsd_hf-usb2.c | 490 |
2 files changed, 376 insertions, 116 deletions
diff --git a/sysutils/hal/Makefile b/sysutils/hal/Makefile index eed3c7c7b018..5e97f9e9a43d 100644 --- a/sysutils/hal/Makefile +++ b/sysutils/hal/Makefile @@ -8,7 +8,7 @@ PORTNAME= hal DISTVERSION= 0.5.14 -PORTREVISION= 14 +PORTREVISION= 15 CATEGORIES= sysutils MASTER_SITES= http://hal.freedesktop.org/releases/ diff --git a/sysutils/hal/files/patch-hald_freebsd_hf-usb2.c b/sysutils/hal/files/patch-hald_freebsd_hf-usb2.c index d53d2a16694a..e65c2403abbc 100644 --- a/sysutils/hal/files/patch-hald_freebsd_hf-usb2.c +++ b/sysutils/hal/files/patch-hald_freebsd_hf-usb2.c @@ -1,153 +1,413 @@ ---- hald/freebsd/hf-usb2.c.orig 2009-08-24 07:42:29.000000000 -0500 -+++ hald/freebsd/hf-usb2.c 2010-03-17 22:25:17.000000000 -0500 -@@ -42,22 +42,6 @@ +--- hald/freebsd/hf-usb2.c.orig 2009-08-24 14:42:29.000000000 +0200 ++++ hald/freebsd/hf-usb2.c 2011-06-28 16:18:02.000000000 +0200 +@@ -22,7 +22,7 @@ + **************************************************************************/ + + #ifdef HAVE_CONFIG_H +-# include <config.h> ++#include <config.h> + #endif + + #include <string.h> +@@ -42,246 +42,200 @@ static struct libusb20_backend *hf_usb2_be = NULL; static void -hf_usb2_copy_parent (HalDevice *parent, - const char *key, - gpointer user_data) --{ ++hf_usb2_probe_interfaces(HalDevice * parent) + { - HalDevice *device; -- ++ int num_interfaces; ++ int i; + - g_return_if_fail(HAL_IS_DEVICE(parent)); - g_return_if_fail(HAL_IS_DEVICE(user_data)); -- ++ g_return_if_fail(HAL_IS_DEVICE(parent)); + - device = HAL_DEVICE(user_data); - - if (! strncmp(key, "usb_device.", strlen("usb_device."))) - hal_device_copy_property(parent, key, device, key); --} -- --static void - hf_usb2_probe_interfaces(HalDevice *parent) ++ if (hal_device_property_get_bool(parent, "info.ignore")) ++ return; ++ ++ num_interfaces = hal_device_property_get_int(parent, ++ "usb_device.num_interfaces"); ++ ++ for (i = 0; i < num_interfaces; i++) { ++ HalDevice *device; ++ ++ device = hf_device_new(parent); ++ ++ hal_device_property_set_string(device, "info.subsystem", "usb"); ++ hal_device_property_set_int(device, "usb.interface.number", i); ++ hal_device_copy_property(parent, "info.product", device, "info.product"); ++ hal_device_copy_property(parent, "info.vendor", device, "info.vendor"); ++ hal_device_merge_with_rewrite(device, parent, "usb.", "usb_device."); ++ ++ if (hf_device_preprobe(device)) { ++ const char *driver, *devname; ++ ++ hf_runner_run_sync(device, 0, "hald-probe-usb2-interface", NULL); ++ ++ devname = hal_device_property_get_string(device, ++ "usb.freebsd.devname"); ++ if (devname) ++ hf_devtree_device_set_name(device, devname); ++ ++ driver = hal_device_property_get_string(device, "freebsd.driver"); ++ if (driver) { ++ if (!strcmp(driver, "ukbd")) ++ hf_device_set_input(device, "keyboard", "keys", NULL); ++ else if (!strcmp(driver, "ums") || !strcmp(driver, "atp")) { ++ hf_device_set_input(device, "mouse", NULL, devname); ++ hf_runner_run_sync(device, 0, "hald-probe-mouse", NULL); ++ } else if (!strcmp(driver, "uhid")) { ++ hal_device_property_set_string(device, "info.category", ++ "hiddev"); ++ hal_device_add_capability(device, "hiddev"); ++ hf_device_property_set_string_printf(device, "hiddev.device", ++ "/dev/%s", devname); ++ hal_device_copy_property(device, "info.product", device, ++ "hiddev.product"); ++ hf_runner_run_sync(device, 0, "hald-probe-hiddev", NULL); ++ } else if (!strcmp(driver, "ldev")) { ++ /* Linux driver (webcam) */ ++ ++ /* ++ * XXX This is a hack. Currently, all ldev devices are ++ * webcams. That may not always be the case. Hopefully, ++ * when other Linux driver support is added, there will be ++ * a sysctl or some other way to determine device class. ++ */ ++ hf_usb_add_webcam_properties(device); ++ } else if (!strcmp(driver, "pwc")) { ++ /* Phillips Web Cam */ ++ hf_usb_add_webcam_properties(device); ++ } ++ } else { ++ /* Try and detect webcamd devices. */ ++ hf_runner_run_sync(device, 0, "hald-probe-video4linux", NULL); ++ } ++ ++ hf_usb_device_compute_udi(device); ++ hf_device_add(device); ++ } ++ } + } + + static void +-hf_usb2_probe_interfaces(HalDevice *parent) ++hf_usb2_probe_device(HalDevice * parent, int bus, int addr) { - int num_interfaces; -@@ -79,9 +63,9 @@ +- int num_interfaces; +- int i; ++ HalDevice *device; + +- g_return_if_fail(HAL_IS_DEVICE(parent)); ++ g_return_if_fail(HAL_IS_DEVICE(parent)); + +- if (hal_device_property_get_bool(parent, "info.ignore")) +- return; ++ device = hf_device_new(parent); - hal_device_property_set_string(device, "info.subsystem", "usb"); - hal_device_property_set_int(device, "usb.interface.number", i); +- num_interfaces = hal_device_property_get_int(parent, +- "usb_device.num_interfaces"); +- +- for (i = 0; i < num_interfaces; i++) +- { +- HalDevice *device; +- +- device = hf_device_new(parent); +- +- hal_device_property_set_string(device, "info.subsystem", "usb"); +- hal_device_property_set_int(device, "usb.interface.number", i); - hal_device_property_foreach(parent, hf_usb2_copy_parent, device); - hal_device_copy_property(parent, "info.product", device, "info.product"); - hal_device_copy_property(parent, "info.vendor", device, "info.vendor"); -+ hal_device_merge_with_rewrite(device, parent, "usb.", "usb_device."); - - if (hf_device_preprobe(device)) - { -@@ -98,10 +82,10 @@ - if (driver) - { - if (! strcmp(driver, "ukbd")) +- hal_device_copy_property(parent, "info.product", device, "info.product"); +- hal_device_copy_property(parent, "info.vendor", device, "info.vendor"); +- +- if (hf_device_preprobe(device)) +- { +- const char *driver, *devname; +- +- hf_runner_run_sync(device, 0, "hald-probe-usb2-interface", NULL); +- +- devname = hal_device_property_get_string(device, +- "usb.freebsd.devname"); +- if (devname) +- hf_devtree_device_set_name(device, devname); +- +- driver = hal_device_property_get_string(device, "freebsd.driver"); +- if (driver) +- { +- if (! strcmp(driver, "ukbd")) - hf_device_set_input(device, "keyboard", NULL); - else if (! strcmp(driver, "ums")) -+ hf_device_set_input(device, "keyboard", "keys", NULL); -+ else if (! strcmp(driver, "ums") || ! strcmp(driver, "atp")) - { +- { - hf_device_set_input(device, "mouse", devname); -+ hf_device_set_input(device, "mouse", NULL, devname); - hf_runner_run_sync(device, 0, "hald-probe-mouse", NULL); - } - else if (! strcmp(driver, "uhid")) -@@ -133,6 +117,11 @@ - hf_usb_add_webcam_properties(device); - } - } -+ else -+ { -+ /* Try and detect webcamd devices. */ -+ hf_runner_run_sync(device, 0, "hald-probe-video4linux", NULL); -+ } - - hf_usb_device_compute_udi(device); - hf_device_add(device); -@@ -192,11 +181,12 @@ - addr = libusb20_dev_get_address(pdev); - - if (addr == 1) +- hf_runner_run_sync(device, 0, "hald-probe-mouse", NULL); +- } +- else if (! strcmp(driver, "uhid")) +- { +- hal_device_property_set_string(device, "info.category", +- "hiddev"); +- hal_device_add_capability(device, "hiddev"); +- hf_device_property_set_string_printf(device, "hiddev.device", +- "/dev/%s", devname); +- hal_device_copy_property(device, "info.product", device, +- "hiddev.product"); +- hf_runner_run_sync(device, 0, "hald-probe-hiddev", NULL); +- } +- else if (! strcmp(driver, "ldev")) +- { +- /* Linux driver (webcam) */ +- +- /* +- * XXX This is a hack. Currently, all ldev devices are +- * webcams. That may not always be the case. Hopefully, +- * when other Linux driver support is added, there will be +- * a sysctl or some other way to determine device class. +- */ +- hf_usb_add_webcam_properties(device); +- } +- else if (! strcmp(driver, "pwc")) +- { +- /* Phillips Web Cam */ +- hf_usb_add_webcam_properties(device); +- } +- } ++ hal_device_property_set_string(device, "info.subsystem", "usb_device"); ++ hal_device_property_set_int(device, "usb_device.bus_number", bus); ++ hal_device_property_set_int(device, "usb_device.level_number", 1); ++ hal_device_property_set_int(device, "usb_device.port_number", addr); + +- hf_usb_device_compute_udi(device); +- hf_device_add(device); ++ if (hf_device_preprobe(device)) { ++ hf_runner_run_sync(device, 0, "hald-probe-usb2-device", NULL); ++ hf_usb_device_compute_udi(device); ++ hf_device_add(device); ++ hf_usb2_probe_interfaces(device); + } +- } + } + + static void +-hf_usb2_probe_device (HalDevice *parent, int bus, int addr) ++hf_usb2_privileged_init(void) + { +- HalDevice *device; +- +- g_return_if_fail(HAL_IS_DEVICE(parent)); +- +- device = hf_device_new(parent); ++ hf_usb2_be = libusb20_be_alloc_default(); ++ if (hf_usb2_be == NULL) ++ HAL_INFO(("unable to open USB backend: %s", g_strerror(errno))); ++} + +- hal_device_property_set_string(device, "info.subsystem", "usb_device"); +- hal_device_property_set_int(device, "usb_device.bus_number", bus); +- hal_device_property_set_int(device, "usb_device.level_number", addr - 1); +- hal_device_property_set_int(device, "usb_device.port_number", addr); ++static void ++hf_usb2_new_device(int bus, int addr) ++{ ++ HalDevice *parent; + +- if (hf_device_preprobe(device)) +- { +- hf_runner_run_sync(device, 0, "hald-probe-usb2-device", NULL); +- hf_usb_device_compute_udi(device); ++ parent = hf_devtree_find_from_info(hald_get_gdl(), "usbus", bus); + +- hf_device_add(device); +- } +- else +- return; ++ if (!parent || hal_device_property_get_bool(parent, "info.ignore")) ++ return; + +- hf_usb2_probe_interfaces(device); ++ hf_usb2_probe_device(parent, bus, addr); + } + + static void +-hf_usb2_privileged_init (void) ++hf_usb2_probe(void) + { +- hf_usb2_be = libusb20_be_alloc_default(); +- if (hf_usb2_be == NULL) +- HAL_INFO(("unable to open USB backend: %s", g_strerror(errno))); +-} ++ struct libusb20_device *pdev = NULL; + +-static void +-hf_usb2_probe (void) +-{ +- struct libusb20_device *pdev = NULL; ++ if (hf_usb2_be == NULL) ++ return; + +- if (hf_usb2_be == NULL) +- return; ++ while ((pdev = libusb20_be_device_foreach(hf_usb2_be, pdev))) { ++ hf_usb2_new_device(libusb20_dev_get_bus_number(pdev), ++ libusb20_dev_get_address(pdev)); ++ } + +- while ((pdev = libusb20_be_device_foreach(hf_usb2_be, pdev))) +- { +- HalDevice *parent; +- int bus, addr; +- +- bus = libusb20_dev_get_bus_number(pdev); +- addr = libusb20_dev_get_address(pdev); +- +- if (addr == 1) - parent = hf_devtree_find_parent_from_info(hald_get_gdl(), "usbus", bus); -+ parent = hf_devtree_find_from_info(hald_get_gdl(), "usbus", bus); - else - parent = hf_device_store_match(hald_get_gdl(), "usb_device.bus_number", - HAL_PROPERTY_TYPE_INT32, bus, "usb_device.port_number", +- else +- parent = hf_device_store_match(hald_get_gdl(), "usb_device.bus_number", +- HAL_PROPERTY_TYPE_INT32, bus, "usb_device.port_number", - HAL_PROPERTY_TYPE_INT32, addr - 1, NULL); -+ HAL_PROPERTY_TYPE_INT32, addr - 1, "info.bus", -+ HAL_PROPERTY_TYPE_STRING, "usb_device", NULL); - if (! parent || hal_device_property_get_bool(parent, "info.ignore")) - continue; - -@@ -216,7 +206,13 @@ - HalDevice *parent_device; - int bus, addr, pbus, paddr; +- if (! parent || hal_device_property_get_bool(parent, "info.ignore")) +- continue; ++ libusb20_be_free(hf_usb2_be); ++ hf_usb2_be = NULL; ++} -- if (strncmp(name, "ugen", strlen("ugen"))) -+ if (! parent) -+ return FALSE; +- hf_usb2_probe_device(parent, bus, addr); +- } ++static gboolean ++hf_usb2_devd_notify(const char *system, ++ const char *subsystem, ++ const char *type, ++ const char *data) ++{ ++ const char *ugen; ++ int bus; ++ int addr; + -+ if (strncmp(name, "ugen", strlen("ugen")) && -+ ! strncmp(parent, "uhub", strlen("uhub"))) -+ return TRUE; -+ else if (strncmp(name, "ugen", strlen("ugen"))) - return FALSE; - else if (strncmp(parent, "ugen", strlen("ugen"))) - return TRUE; -@@ -232,7 +228,8 @@ - - parent_device = hf_device_store_match(hald_get_gdl(), - "usb_device.bus_number", HAL_PROPERTY_TYPE_INT32, pbus, -- "usb_device.port_number", HAL_PROPERTY_TYPE_INT32, paddr, NULL); -+ "usb_device.port_number", HAL_PROPERTY_TYPE_INT32, paddr, "info.bus", -+ HAL_PROPERTY_TYPE_STRING, "usb_device", NULL); ++ if (!data || strcmp(system, "USB") || strcmp(subsystem, "DEVICE") || ++ (strcmp(type, "ATTACH") && strcmp(type, "DETACH"))) ++ return FALSE; ++ ++ ugen = strstr(data, "ugen="); ++ if (ugen == NULL) { ++ /* ++ * The following case is not required in ++ * FreeBSD 8-stable and newer: ++ */ ++ ugen = strstr(data, "cdev="); ++ if (ugen == NULL) ++ return FALSE; ++ ++ if (sscanf(ugen, "cdev=ugen%i.%i", &bus, &addr) != 2) ++ return FALSE; ++ } else { ++ if (sscanf(ugen, "ugen=ugen%i.%i", &bus, &addr) != 2) ++ return FALSE; ++ } - if (parent_device && ! hal_device_property_get_bool(parent_device, - "info.ignore")) -@@ -255,8 +252,6 @@ +- libusb20_be_free(hf_usb2_be); +- hf_usb2_be = NULL; +-} ++ if (strcmp(type, "ATTACH") == 0) { + +-static gboolean +-hf_usb2_devd_add (const char *name, +- GHashTable *params, +- GHashTable *at, +- const char *parent) +-{ +- HalDevice *parent_device; +- int bus, addr, pbus, paddr; ++ HAL_INFO(("received devd attach event, device %s", data)); - if (strncmp(name, "ugen", strlen("ugen"))) - return FALSE; +- if (strncmp(name, "ugen", strlen("ugen"))) +- return FALSE; - else if (strncmp(parent, "ugen", strlen("ugen"))) - return TRUE; +- +- if (sscanf(name, "ugen%i.%i", &bus, &addr) != 2) +- return FALSE; +- +- if (sscanf(parent, "ugen%i.%i", &pbus, &paddr) != 2) +- return FALSE; +- +- HAL_INFO(("received devd add event for device '%s' with parent '%s'", +- name, parent)); +- +- parent_device = hf_device_store_match(hald_get_gdl(), +- "usb_device.bus_number", HAL_PROPERTY_TYPE_INT32, pbus, +- "usb_device.port_number", HAL_PROPERTY_TYPE_INT32, paddr, NULL); +- +- if (parent_device && ! hal_device_property_get_bool(parent_device, +- "info.ignore")) +- { +- hf_usb2_probe_device(parent_device, bus, addr); +- return TRUE; +- } ++ hf_usb2_new_device(bus, addr); ++ } ++ if (strcmp(type, "DETACH") == 0) { + +- return FALSE; +-} ++ HalDevice *device; - if (sscanf(name, "ugen%i.%i", &bus, &addr) != 2) - return FALSE; -@@ -265,7 +260,8 @@ +-static gboolean +-hf_usb2_devd_remove (const char *name, +- GHashTable *params, +- GHashTable *at, +- const char *parent) +-{ +- HalDevice *device; +- int bus, addr; ++ HAL_INFO(("received devd detach event, device %s", data)); - device = hf_device_store_match(hald_get_gdl(), "usb_device.bus_number", - HAL_PROPERTY_TYPE_INT32, bus, "usb_device.port_number", +- if (strncmp(name, "ugen", strlen("ugen"))) +- return FALSE; +- else if (strncmp(parent, "ugen", strlen("ugen"))) +- return TRUE; +- +- if (sscanf(name, "ugen%i.%i", &bus, &addr) != 2) +- return FALSE; +- +- HAL_INFO(("received devd remove event, device %s", name)); +- +- device = hf_device_store_match(hald_get_gdl(), "usb_device.bus_number", +- HAL_PROPERTY_TYPE_INT32, bus, "usb_device.port_number", - HAL_PROPERTY_TYPE_INT32, addr, NULL); -+ HAL_PROPERTY_TYPE_INT32, addr, "info.bus", -+ HAL_PROPERTY_TYPE_STRING, "usb_device", NULL); +- +- if (device) +- { +- hf_device_remove_tree(device); +- return TRUE; +- } ++ device = hf_device_store_match(hald_get_gdl(), ++ "usb_device.bus_number", HAL_PROPERTY_TYPE_INT32, bus, ++ "usb_device.port_number", HAL_PROPERTY_TYPE_INT32, addr, ++ "info.bus", HAL_PROPERTY_TYPE_STRING, "usb_device", NULL); - if (device) - { -@@ -276,6 +272,23 @@ - return FALSE; +- return FALSE; ++ if (device) ++ hf_device_remove_tree(device); ++ } ++ return TRUE; } -+static gboolean -+hf_usb2_devd_notify (const char *system, -+ const char *subsystem, -+ const char *type, -+ const char *data) -+{ -+ if (! data || strcmp(system, "USB") || strcmp(subsystem, "DEVICE") || -+ (strcmp(type, "ATTACH") && strcmp(type, "DETACH"))) -+ return FALSE; -+ -+ return TRUE; -+} -+ -+ -+ -+ -+ HFHandler hf_usb2_handler = { - .privileged_init = hf_usb2_privileged_init, - .probe = hf_usb2_probe -@@ -283,5 +296,6 @@ +- .privileged_init = hf_usb2_privileged_init, +- .probe = hf_usb2_probe ++ .privileged_init = hf_usb2_privileged_init, ++ .probe = hf_usb2_probe + }; HFDevdHandler hf_usb2_devd_handler = { - .add = hf_usb2_devd_add, +- .add = hf_usb2_devd_add, - .remove = hf_usb2_devd_remove -+ .remove = hf_usb2_devd_remove, -+ .notify = hf_usb2_devd_notify ++ .notify = hf_usb2_devd_notify }; |