diff --git a/repos/dde_linux/lib/import/import-usb_hid_include.mk b/repos/dde_linux/lib/import/import-usb_hid_include.mk deleted file mode 100644 index 84edf2e3cc..0000000000 --- a/repos/dde_linux/lib/import/import-usb_hid_include.mk +++ /dev/null @@ -1,13 +0,0 @@ -USB_HID_CONTRIB_DIR := $(call select_from_ports,dde_linux)/src/drivers/usb_hid - -include $(call select_from_repositories,lib/import/import-usb_arch_include.mk) - -# -# The order of include-search directories is important, we need to look into -# 'contrib' before falling back to our custom 'lx_emul.h' header. -# -INC_DIR += $(ARCH_SRC_INC_DIR) -INC_DIR += $(USB_HID_CONTRIB_DIR)/include -INC_DIR += $(USB_HID_CONTRIB_DIR)/drivers/hid -INC_DIR += $(USB_HID_CONTRIB_DIR)/drivers/input -INC_DIR += $(LIB_CACHE_DIR)/usb_hid_include/include/include/include diff --git a/repos/dde_linux/lib/mk/usb_hid_include.mk b/repos/dde_linux/lib/mk/usb_hid_include.mk deleted file mode 100644 index fd490f2c71..0000000000 --- a/repos/dde_linux/lib/mk/usb_hid_include.mk +++ /dev/null @@ -1,37 +0,0 @@ -ifeq ($(called_from_lib_mk),yes) - -USB_HID_CONTRIB_DIR := $(call select_from_ports,dde_linux)/src/drivers/usb_hid -LX_EMUL_H := $(REP_DIR)/src/drivers/usb_hid_legacy/lx_emul.h - -# -# Determine the header files included by the contrib code. For each -# of these header files we create a symlink to 'lx_emul.h'. -# -SCAN_DIRS := $(addprefix $(USB_HID_CONTRIB_DIR)/include/, asm-generic linux uapi) \ - $(addprefix $(USB_HID_CONTRIB_DIR)/, drivers) -GEN_INCLUDES := $(shell grep -rIh "^\#include .*\/" $(SCAN_DIRS) |\ - sed "s/^\#include [^<\"]*[<\"]\([^>\"]*\)[>\"].*/\1/" |\ - sort | uniq) -# -# Filter out original Linux headers that exist in the contrib directory -# -NO_GEN_INCLUDES := $(shell cd $(USB_HID_CONTRIB_DIR)/; find include -name "*.h" |\ - sed "s/.\///" | sed "s/.*include\///") -GEN_INCLUDES := $(filter-out $(NO_GEN_INCLUDES),$(GEN_INCLUDES)) - -# -# Put Linux headers in 'GEN_INC' dir, since some include use "../../" paths use -# three level include hierarchy -# -GEN_INC := $(shell pwd)/include/include/include -GEN_INCLUDES := $(addprefix $(GEN_INC)/,$(GEN_INCLUDES)) - -all: $(GEN_INCLUDES) - -$(GEN_INCLUDES): - $(VERBOSE)mkdir -p $(dir $@) - $(VERBOSE)ln -s $(LX_EMUL_H) $@ - -endif - -CC_CXX_WARN_STRICT = diff --git a/repos/dde_linux/recipes/src/legacy_usb_hid_drv/content.mk b/repos/dde_linux/recipes/src/legacy_usb_hid_drv/content.mk deleted file mode 100644 index ea3fa5485d..0000000000 --- a/repos/dde_linux/recipes/src/legacy_usb_hid_drv/content.mk +++ /dev/null @@ -1,29 +0,0 @@ -LIB_MK := lib/mk/usb_hid_include.mk \ - $(foreach SPEC,arm arm_64 x86_32 x86_64,lib/mk/spec/$(SPEC)/lx_kit_setjmp.mk) - -PORT_DIR := $(call port_dir,$(REP_DIR)/ports/dde_linux) - -MIRROR_FROM_REP_DIR := $(LIB_MK) \ - lib/import/import-usb_hid_include.mk \ - lib/import/import-usb_arch_include.mk \ - src/include/legacy src/lib/legacy/lx_kit \ - src/lib/lx_kit/spec \ - $(foreach SPEC,arm arm_64 arm_v6 arm_v7 x86 x86_32 x86_64,src/include/spec/$(SPEC)) \ - $(shell cd $(REP_DIR); find src/drivers/usb_hid_legacy -type f) - -MIRROR_FROM_PORT_DIR := $(shell cd $(PORT_DIR); find src/drivers/usb_hid -type f | grep -v ".git") -MIRROR_FROM_PORT_DIR := $(filter-out $(MIRROR_FROM_REP_DIR),$(MIRROR_FROM_PORT_DIR)) - -content: $(MIRROR_FROM_REP_DIR) $(MIRROR_FROM_PORT_DIR) - -$(MIRROR_FROM_REP_DIR): - $(mirror_from_rep_dir) - -$(MIRROR_FROM_PORT_DIR): - mkdir -p $(dir $@) - cp $(PORT_DIR)/$@ $@ - -content: LICENSE -LICENSE: - ( echo "GNU General Public License version 2, see:"; \ - echo "https://www.kernel.org/pub/linux/kernel/COPYING" ) > $@ diff --git a/repos/dde_linux/recipes/src/legacy_usb_hid_drv/hash b/repos/dde_linux/recipes/src/legacy_usb_hid_drv/hash deleted file mode 100644 index 77cd339c99..0000000000 --- a/repos/dde_linux/recipes/src/legacy_usb_hid_drv/hash +++ /dev/null @@ -1 +0,0 @@ -2023-08-21 1c6c779b2c30b83d3626ce36efbec0b0b45a05d1 diff --git a/repos/dde_linux/recipes/src/legacy_usb_hid_drv/used_apis b/repos/dde_linux/recipes/src/legacy_usb_hid_drv/used_apis deleted file mode 100644 index bb3dde8e18..0000000000 --- a/repos/dde_linux/recipes/src/legacy_usb_hid_drv/used_apis +++ /dev/null @@ -1,7 +0,0 @@ -base -os -format -event_session -report_session -usb_session -timer_session diff --git a/repos/dde_linux/src/drivers/usb_hid_legacy/README b/repos/dde_linux/src/drivers/usb_hid_legacy/README deleted file mode 100644 index b73a36eb1b..0000000000 --- a/repos/dde_linux/src/drivers/usb_hid_legacy/README +++ /dev/null @@ -1,48 +0,0 @@ -USB HID driver -############## - -Supports keyboard and mouse connected via USB. It connects to one or multiple -USB sessions and reports input events to an event session. A run script can be -found under 'run/usb_hid.run'. - -Configuration snippet: - -! -! -! -! - -When the use_report attribute is set, the HID driver will request a ROM called -"report" that is used to iterate over all devices provided by the USB host -controller driver (resp. a rom filter). In that mode the driver tries to -claim all HID devices (class 0x3) via dedicated USB sessions. - -Note: It has been observed that certain 1.0 versions of Qemu do not generate -mouse interrupts. The mouse driver should work correctly on Qemu 1.0.93 and -above. - -HID - Touchscreen support -~~~~~~~~~~~~~~~~~~~~~~~~~ - -Touchscreen absolute coordinates must be calibrated (e.g. re-calculated) to -screen absolute coordinates. The screen resolution is not determined -automatically by the HID driver, but can be configured: - -!... -! -!... - -If a touchscreen is multi-touch-capable than the multitouch attribute gears -which type of Genode input events are generated. If set to 'no' (default) -than absolute events are generated and no multitouch events. If set to 'yes' -solely multitouch events are generated. - -Keyboard LED handling -~~~~~~~~~~~~~~~~~~~~~ - -The state of the keyboard LEDs like capslock can be controlled by providing -a corresponding ROM to the driver and configure it appropriatedly: - -!... -! -!... diff --git a/repos/dde_linux/src/drivers/usb_hid_legacy/driver.h b/repos/dde_linux/src/drivers/usb_hid_legacy/driver.h deleted file mode 100644 index ab655b38d7..0000000000 --- a/repos/dde_linux/src/drivers/usb_hid_legacy/driver.h +++ /dev/null @@ -1,145 +0,0 @@ -/* - * \brief USB HID driver - * \author Stefan Kalkowski - * \date 2018-06-27 - */ - -/* - * Copyright (C) 2018 Genode Labs GmbH - * - * This file is distributed under the terms of the GNU General Public License - * version 2. - */ - -#ifndef _SRC__DRIVERS__USB_HID__DRIVER_H_ -#define _SRC__DRIVERS__USB_HID__DRIVER_H_ - -#include -#include -#include -#include -#include -#include - -struct usb_device_id; -struct usb_interface; -struct usb_device; - -struct Driver -{ - using Label = Genode::String<64>; - - struct Task - { - Lx::Task task; - Genode::Signal_handler handler; - bool handling_signal { false }; - - /* - * If the task is currently executing and the signal handler - * is called again via 'block_and_schedule()', we need to - * keep this information, so the task does not block at the - * end when a new signal already occurred. - * - * Initialized as true for the initial run of the task. - */ - bool _signal_pending { true }; - - void handle_signal() - { - _signal_pending = true; - task.unblock(); - handling_signal = true; - Lx::scheduler().schedule(); - handling_signal = false; - } - - bool signal_pending() - { - bool ret = _signal_pending; - _signal_pending = false; - return ret; - } - - template - Task(Genode::Entrypoint & ep, ARGS &&... args) - : task(args...), handler(ep, *this, &Task::handle_signal) {} - }; - - struct Device - { - using Le = Genode::List_element; - - Le le { this }; - Label label; - Driver &driver; - Genode::Env &env; - - /* - * Dedicated allocator per device to notice dangling - * allocations on device destruction. - */ - Genode::Allocator_avl alloc; - - Task state_task; - Task urb_task; - - Usb::Connection usb { env, &alloc, label.string(), - 512 * 1024, state_task.handler }; - usb_device * udev = nullptr; - bool updated = true; - - Device(Driver & drv, Label label); - ~Device(); - - static void state_task_entry(void *); - static void urb_task_entry(void *); - void register_device(); - void unregister_device(); - void probe_interface(usb_interface *, usb_device_id *); - void remove_interface(usb_interface *); - bool deinit(); - }; - - struct Devices : Genode::List - { - template - void for_each(FN const & fn) - { - Device::Le * cur = first(); - for (Device::Le * next = cur ? cur->next() : nullptr; cur; - cur = next, next = cur ? cur->next() : nullptr) - fn(*cur->object()); - } - }; - - enum Input_event { - EVENT_TYPE_PRESS, - EVENT_TYPE_RELEASE, - EVENT_TYPE_MOTION, - EVENT_TYPE_WHEEL, - EVENT_TYPE_TOUCH - }; - - Devices devices; - Genode::Env &env; - Genode::Entrypoint &ep { env.ep() }; - Genode::Heap heap { env.ram(), env.rm() }; - Event::Connection event { env }; - Genode::Constructible main_task; - Genode::Constructible report_rom; - - Driver(Genode::Env &env); - - void scan_report(); - - static unsigned long screen_x; - static unsigned long screen_y; - static bool multi_touch; - - static void main_task_entry(void *); - static void input_callback(Input_event type, unsigned code, - int ax, int ay, int rx, int ry); -}; - -#endif /* _SRC__DRIVERS__USB_HID__DRIVER_H_ */ diff --git a/repos/dde_linux/src/drivers/usb_hid_legacy/dummies.c b/repos/dde_linux/src/drivers/usb_hid_legacy/dummies.c deleted file mode 100644 index 6fc8b0275b..0000000000 --- a/repos/dde_linux/src/drivers/usb_hid_legacy/dummies.c +++ /dev/null @@ -1,647 +0,0 @@ -#include - -#if 0 -#define TRACE \ - do { \ - lx_printf("%s not implemented\n", __func__); \ - } while (0) -#else -#define TRACE do { ; } while (0) -#endif - -#define TRACE_AND_STOP \ - do { \ - lx_printf("%s not implemented\n", __func__); \ - BUG(); \ - } while (0) - -int bitmap_subset(const unsigned long *src1, const unsigned long *src2, int nbits) -{ - TRACE; - return 1; -} - -int bitmap_weight(const unsigned long *src, unsigned int nbits) -{ - TRACE; - return 0; -} - -int bus_for_each_dev(struct bus_type *bus, struct device *start, void *data, int (*fn)(struct device *dev, void *data)) -{ - TRACE_AND_STOP; - return -1; -} - -int bus_for_each_drv(struct bus_type *bus, struct device_driver *start, void *data, int (*fn)(struct device_driver *, void *)) -{ - TRACE; - return 0; -} - -int bus_register(struct bus_type *bus) -{ - TRACE; - return 0; -} - -void bus_unregister(struct bus_type *bus) -{ - TRACE_AND_STOP; -} - -int cdev_device_add(struct cdev *cdev, struct device *dev) -{ - TRACE; - return 0; -} - -void cdev_device_del(struct cdev *cdev, struct device *dev) -{ - TRACE; -} - -int class_register(struct class *cls) -{ - TRACE; - return 0; -} - -void class_unregister(struct class *cls) -{ - TRACE_AND_STOP; -} - -unsigned long clear_user(void *to, unsigned long n) -{ - TRACE_AND_STOP; - return -1; -} - -long copy_from_user(void *to, const void *from, unsigned long n) -{ - TRACE_AND_STOP; - return -1; -} - -size_t copy_to_user(void *dst, void const *src, size_t len) -{ - TRACE_AND_STOP; - return -1; -} - -int device_create_file(struct device *device, const struct device_attribute *entry) -{ - TRACE; - return 0; -} - -void device_enable_async_suspend(struct device *dev) -{ - TRACE; -} - -void device_initialize(struct device *dev) -{ - TRACE; -} - -void device_lock(struct device *dev) -{ - TRACE_AND_STOP; -} - -void device_release_driver(struct device *dev) -{ - TRACE_AND_STOP; -} - -void device_remove_file(struct device *dev, const struct device_attribute *attr) -{ - TRACE; -} - -int device_set_wakeup_enable(struct device *dev, bool enable) -{ - TRACE; - return 0; -} - -void device_unlock(struct device *dev) -{ - TRACE_AND_STOP; -} - -int devm_add_action(struct device *dev, void (*action)(void *), void *data) -{ - TRACE_AND_STOP; - return -1; -} - -int devm_add_action_or_reset(struct device *dev, void (*action)(void *), void *data) -{ - TRACE_AND_STOP; - return -1; -} - -char *devm_kasprintf(struct device *dev, gfp_t gfp, const char *fmt, ...) -{ - TRACE_AND_STOP; - return NULL; -} - -int devm_led_classdev_register(struct device *parent, struct led_classdev *led_cdev) -{ - TRACE_AND_STOP; - return -1; -} - -int devm_led_trigger_register(struct device *dev, struct led_trigger *trigger) -{ - TRACE_AND_STOP; - return -1; -} - -void devres_add(struct device *dev, void *res) -{ - TRACE_AND_STOP; -} - -void *devres_alloc(dr_release_t release, size_t size, gfp_t gfp) -{ - TRACE_AND_STOP; - return NULL; -} - -void devres_close_group(struct device *dev, void *id) -{ - TRACE_AND_STOP; -} - -int devres_destroy(struct device *dev, dr_release_t release, dr_match_t match, void *match_data) -{ - TRACE_AND_STOP; - return -1; -} - -void * devres_open_group(struct device *dev, void *id, gfp_t gfp) -{ - TRACE_AND_STOP; - return NULL; -} - -int devres_release_group(struct device *dev, void *id) -{ - TRACE_AND_STOP; - return -1; -} - -int dev_set_name(struct device *dev, const char *name, ...) -{ - TRACE; - return 0; -} - -int down_interruptible(struct semaphore *sem) -{ - TRACE; - return 0; -} - -int down_trylock(struct semaphore *sem) -{ - TRACE; - return 0; -} - -int driver_attach(struct device_driver *drv) -{ - TRACE_AND_STOP; - return -1; -} - -int fasync_helper(int a1, struct file * f, int a2, struct fasync_struct ** fas) -{ - TRACE_AND_STOP; - return -1; -} - -u64 get_unaligned_le64(const void *p) -{ - TRACE_AND_STOP; - return -1; -} - -int ida_simple_get(struct ida *ida, unsigned int start, unsigned int end, gfp_t gfp_mask) -{ - TRACE; - return 0; -} - -void ida_simple_remove(struct ida *ida, unsigned int id) -{ - TRACE; -} - -struct input_event; -int input_event_from_user(const char __user *buffer, struct input_event *event) -{ - TRACE_AND_STOP; - return -1; -} - -int input_event_to_user(char __user *buffer, const struct input_event *event) -{ - TRACE_AND_STOP; - return -1; -} - -struct input_dev; -void input_ff_destroy(struct input_dev *dev) -{ - TRACE; -} - -struct ff_effect; -int input_ff_effect_from_user(const char __user *buffer, size_t size, struct ff_effect *effect) -{ - TRACE_AND_STOP; - return -1; -} - -int input_ff_erase(struct input_dev *dev, int effect_id, struct file *file) -{ - TRACE_AND_STOP; - return -1; -} - -int input_ff_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) -{ - TRACE_AND_STOP; - return -1; -} - -int input_ff_upload(struct input_dev *dev, struct ff_effect *effect, struct file *file) -{ - TRACE_AND_STOP; - return -1; -} - -unsigned long int_sqrt(unsigned long x) -{ - TRACE_AND_STOP; - return -1; -} - -unsigned int jiffies_to_usecs(const unsigned long j) -{ - TRACE; - return 0; -} - -void kill_fasync(struct fasync_struct **a0, int a1, int a2) -{ - TRACE_AND_STOP; -} - -struct kobject * kobject_create_and_add(const char * a0, struct kobject * a1) -{ - TRACE_AND_STOP; - return NULL; -} - -char *kobject_get_path(struct kobject *kobj, gfp_t gfp_mask) -{ - TRACE; - return NULL; -} - -void kobject_put(struct kobject * a0) -{ - TRACE_AND_STOP; -} - -struct device *kobj_to_dev(struct kobject *kobj) -{ - TRACE_AND_STOP; - return NULL; -} - -int kstrtou8(const char *s, unsigned int base, u8 *res) -{ - TRACE_AND_STOP; - return -1; -} - -int kstrtouint(const char *s, unsigned int base, unsigned int *res) -{ - TRACE_AND_STOP; - return -1; -} - -int kstrtoul(const char *s, unsigned int base, unsigned long *res) -{ - TRACE_AND_STOP; - return -1; -} - -ktime_t ktime_get_boottime(void) -{ - TRACE_AND_STOP; - return -1; -} - -ktime_t ktime_get_real(void) -{ - TRACE_AND_STOP; - return -1; -} - -ktime_t ktime_mono_to_any(ktime_t tmono, enum tk_offsets offs) -{ - TRACE_AND_STOP; - return -1; -} - -ktime_t ktime_mono_to_real(ktime_t mono) -{ - TRACE_AND_STOP; - return -1; -} - -struct timespec64 ktime_to_timespec64(const s64 nsec) -{ - struct timespec64 ret; - TRACE_AND_STOP; - return ret; -} - -void kvfree(const void *addr) -{ - TRACE_AND_STOP; -} - -int memcmp(const void * a0, const void * a1, size_t a2) -{ - TRACE_AND_STOP; - return -1; -} - -void __module_get(struct module *module) -{ - TRACE; -} - -void module_put(struct module * module) -{ - TRACE; -} - -loff_t no_llseek(struct file *file, loff_t offset, int whence) -{ - TRACE_AND_STOP; - return -1; -} - -int nonseekable_open(struct inode *inode, struct file *filp) -{ - TRACE_AND_STOP; - return -1; -} - -void *power_supply_get_drvdata(struct power_supply *psy) -{ - TRACE_AND_STOP; - return NULL; -} - -int power_supply_powers(struct power_supply *psy, struct device *dev) -{ - TRACE_AND_STOP; - return -1; -} - -int register_chrdev_region(dev_t a0, unsigned a1, const char * a2) -{ - TRACE; - return 0; -} - -int scnprintf(char *buf, size_t size, const char *fmt, ...) -{ - TRACE_AND_STOP; - return -1; -} - -void sema_init(struct semaphore *sem, int val) -{ - TRACE; -} - -void spin_lock(spinlock_t *lock) -{ - TRACE; -} - -void spin_lock_irq(spinlock_t *lock) -{ - TRACE; -} - -void spin_unlock_irq(spinlock_t *lock) -{ - TRACE; -} - -int sscanf(const char * a0, const char * a1, ...) -{ - TRACE_AND_STOP; - return -1; -} - -int strcmp(const char *s1, const char *s2) -{ - TRACE_AND_STOP; - return -1; -} - -size_t strlcpy(char *dest, const char *src, size_t size) -{ - TRACE_AND_STOP; - return -1; -} - -int strncmp(const char *cs, const char *ct, size_t count) -{ - TRACE_AND_STOP; - return -1; -} - -char *strrchr(const char * a0, int a1) -{ - TRACE_AND_STOP; - return NULL; -} - -char *strstr(const char * a0, const char * a1) -{ - TRACE_AND_STOP; - return NULL; -} - -int sysfs_create_files(struct kobject *kobj, const struct attribute **ptr) -{ - TRACE_AND_STOP; - return -1; -} - -void sysfs_remove_group(struct kobject *kobj, const struct attribute_group *grp) -{ - TRACE_AND_STOP; -} - -struct urb; -void usb_block_urb(struct urb *urb) -{ - TRACE_AND_STOP; -} - -struct usb_device; -int usb_clear_halt(struct usb_device *dev, int pipe) -{ - TRACE; - return -1; -} - -int usb_interrupt_msg(struct usb_device *usb_dev, unsigned int pipe, void *data, int len, int *actual_length, int timeout) -{ - TRACE_AND_STOP; - return -1; -} - -struct usb_interface; -void usb_queue_reset_device(struct usb_interface *dev) -{ - TRACE; -} - -int usb_string(struct usb_device *dev, int index, char *buf, size_t size) -{ - TRACE; - return -1; -} - -void usb_unpoison_urb(struct urb *urb) -{ - TRACE_AND_STOP; -} - -struct __kfifo; -int __kfifo_alloc(struct __kfifo *fifo, unsigned int size, size_t esize, gfp_t gfp_mask) -{ - TRACE_AND_STOP; - return -1; -} - -void __kfifo_free(struct __kfifo *fifo) -{ - TRACE_AND_STOP; -} - -unsigned int __kfifo_in(struct __kfifo *fifo, const void *buf, unsigned int len) -{ - TRACE_AND_STOP; - return 0; -} - -unsigned int __kfifo_in_r(struct __kfifo *fifo, const void *buf, unsigned int len, size_t recsize) -{ - TRACE_AND_STOP; - return 0; -} - -unsigned int __kfifo_out(struct __kfifo *fifo, void *buf, unsigned int len) -{ - TRACE_AND_STOP; - return 0; -} - -unsigned int __kfifo_out_r(struct __kfifo *fifo, void *buf, unsigned int len, size_t recsize) -{ - TRACE_AND_STOP; - return 0; -} - -void __kfifo_skip_r(struct __kfifo *fifo, size_t recsize) -{ - TRACE_AND_STOP; -} - -unsigned int __kfifo_max_r(unsigned int len, size_t recsize) -{ - TRACE_AND_STOP; -} - -void usb_kill_urb(struct urb *urb) -{ - TRACE; -} - -int usb_unlink_urb(struct urb *urb) -{ - TRACE_AND_STOP; - return -1; -} - -int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...) -{ - TRACE_AND_STOP; - return -1; -} - -struct power_supply; -struct power_supply_desc; -struct power_supply_config; -struct power_supply * devm_power_supply_register(struct device *parent, const struct power_supply_desc *desc, const struct power_supply_config *cfg) -{ - TRACE_AND_STOP; - return NULL; -} - -void devres_free(void *res) -{ - TRACE_AND_STOP; -} - -char *kasprintf(gfp_t gfp, const char *fmt, ...) -{ - TRACE_AND_STOP; - return NULL; -} - -void poll_wait(struct file *a0, wait_queue_head_t *a1, poll_table *a2) -{ - TRACE_AND_STOP; -} - -void power_supply_changed(struct power_supply *psy) -{ - TRACE_AND_STOP; -} - -int sysfs_create_group(struct kobject *kobj, const struct attribute_group *grp) -{ - TRACE; - return 0; -} - -void up(struct semaphore *sem) -{ - TRACE; -} - -bool usb_device_is_owned(struct usb_device *udev) -{ - TRACE; - return false; -} diff --git a/repos/dde_linux/src/drivers/usb_hid_legacy/evdev.cc b/repos/dde_linux/src/drivers/usb_hid_legacy/evdev.cc deleted file mode 100644 index e7cde6d6ca..0000000000 --- a/repos/dde_linux/src/drivers/usb_hid_legacy/evdev.cc +++ /dev/null @@ -1,498 +0,0 @@ -/* - * \brief Input service and event handler - * \author Christian Helmuth - * \author Dirk Vogt - * \author Sebastian Sumpf - * \author Christian Menard - * \author Alexander Boettcher - * \date 2009-04-20 - * - * TODO make this a complete replacement for evdev.c from Linux - * TODO per-device slot handling - * - * The original implementation was in the L4Env from the TUD:OS group - * (l4/pkg/input/lib/src/l4evdev.c). This file was released under the terms of - * the GNU General Public License version 2. - */ - -/* - * Copyright (C) 2009-2017 Genode Labs GmbH - * Copyright (C) 2014 Ksys Labs LLC - * - * This file is distributed under the terms of the GNU General Public License - * version 2. - */ - -/* Genode includes */ -#include -#include -#include - -/* LX kit */ -#include -#include - -/* local */ -#include "led_state.h" - -/* Linux includes */ -#include -#include -#include -#include -#include -#include -#include -#include - - -static struct slot -{ - int id = -1; /* current tracking id */ - int x = -1; /* last reported x axis */ - int y = -1; /* last reported y axis */ - int event = -1; /* last reported ABS_MT_ event */ -} slots[16]; - -static int slot = 0; /* store current input slot */ - - -static bool transform(input_dev *dev, int &x, int &y) -{ - if (!Driver::screen_x || !Driver::screen_y) return true; - - int const min_x_dev = input_abs_get_min(dev, ABS_X); - int const min_y_dev = input_abs_get_min(dev, ABS_Y); - int const max_x_dev = input_abs_get_max(dev, ABS_X); - int const max_y_dev = input_abs_get_max(dev, ABS_Y); - int const max_y_norm = max_y_dev - min_y_dev; - int const max_x_norm = max_x_dev - min_x_dev; - - if (!max_x_norm || !max_y_norm || - x < min_x_dev || y < min_y_dev || x > max_x_dev || y > max_y_dev) { - Genode::warning("ignore input source with coordinates out of range"); - return false; - } - - x = Driver::screen_x * (x - min_x_dev) / (max_x_norm); - y = Driver::screen_y * (y - min_y_dev) / (max_y_norm); - - return true; -} - - -static void handle_mt_tracking_id(input_dev *dev, int value) -{ - if (value != -1) { - if (slots[slot].id != -1) - Genode::warning("old tracking id in use and got new one"); - - slots[slot].id = value; - return; - } - - /* send end of slot usage event for clients */ - int x = slots[slot].x < 0 ? 0 : slots[slot].x; - int y = slots[slot].y < 0 ? 0 : slots[slot].y; - - if (!transform(dev, x, y)) return; - - Driver::input_callback(Driver::EVENT_TYPE_TOUCH, slot, x, y, -1, -1); - - slots[slot].event = slots[slot].x = slots[slot].y = -1; - slots[slot].id = value; -} - - -static void handle_mt_slot(int value) -{ - if ((unsigned)value >= sizeof(slots) / sizeof(slots[0])) { - Genode::warning("drop multi-touch slot id ", value); - return; - } - - slot = value; -} - - -enum Axis { AXIS_X, AXIS_Y }; - -static void handle_absolute_axis(input_dev *dev, unsigned code, int value, Axis axis) -{ - slots[slot].event = code; - - Driver::Input_event type = Driver::EVENT_TYPE_MOTION; - - switch (axis) { - case AXIS_X: - type = code == ABS_X ? Driver::EVENT_TYPE_MOTION - : Driver::EVENT_TYPE_TOUCH; - slots[slot].x = value; - break; - case AXIS_Y: - type = code == ABS_Y ? Driver::EVENT_TYPE_MOTION - : Driver::EVENT_TYPE_TOUCH; - slots[slot].y = value; - break; - } - - int x = slots[slot].x; - int y = slots[slot].y; - - if (x == -1 || y == -1) return; - - if (!transform(dev, x, y)) return; - - Driver::input_callback(type, slot, x, y, 0, 0); -} - - -static void handle_absolute(input_dev *dev, unsigned code, int value) -{ - switch (code) { - case ABS_WHEEL: - Driver::input_callback(Driver::EVENT_TYPE_WHEEL, 0, 0, 0, 0, value); - return; - - case ABS_X: - if (dev->mt && Driver::multi_touch) return; - handle_absolute_axis(dev, code, value, AXIS_X); - return; - - case ABS_MT_POSITION_X: - if (!Driver::multi_touch) return; - handle_absolute_axis(dev, code, value, AXIS_X); - return; - - case ABS_Y: - if (dev->mt && Driver::multi_touch) return; - handle_absolute_axis(dev, code, value, AXIS_Y); - return; - - case ABS_MT_POSITION_Y: - if (!Driver::multi_touch) return; - handle_absolute_axis(dev, code, value, AXIS_Y); - return; - - case ABS_MT_TRACKING_ID: - if (!Driver::multi_touch) return; - handle_mt_tracking_id(dev, value); - return; - - case ABS_MT_SLOT: - if (!Driver::multi_touch) return; - handle_mt_slot(value); - return; - - case ABS_MT_TOUCH_MAJOR: - case ABS_MT_TOUCH_MINOR: - case ABS_MT_ORIENTATION: - case ABS_MT_TOOL_TYPE: - case ABS_MT_BLOB_ID: - case ABS_MT_PRESSURE: - case ABS_MT_DISTANCE: - case ABS_MT_TOOL_X: - case ABS_MT_TOOL_Y: - /* ignore unused multi-touch events */ - return; - - default: - Genode::warning("unknown absolute event code ", code, " not handled"); - return; - } -} - - -static void handle_relative(unsigned code, int value) -{ - Driver::Input_event type; - int x = 0, y = 0; - - switch (code) { - case REL_X: - type = Driver::EVENT_TYPE_MOTION; - x = value; - break; - - case REL_Y: - type = Driver::EVENT_TYPE_MOTION; - y = value; - break; - - case REL_HWHEEL: - type = Driver::EVENT_TYPE_WHEEL; - x = value; - break; - - case REL_WHEEL: - type = Driver::EVENT_TYPE_WHEEL; - y = value; - break; - - default: - Genode::warning("unknown relative event code ", code, " not handled"); - return; - } - - Driver::input_callback(type, 0, 0, 0, x, y); -} - - -static void handle_key(input_dev *dev, unsigned code, int value) -{ - /* no press/release events for multi-touch devices in multi-touch mode */ - if (dev->mt && Driver::multi_touch) return; - - /* map BTN_TOUCH to BTN_LEFT */ - if (code == BTN_TOUCH) code = BTN_LEFT; - - Driver::Input_event type; - switch (value) { - case 0: type = Driver::EVENT_TYPE_RELEASE; break; - case 1: type = Driver::EVENT_TYPE_PRESS; break; - - default: - Genode::warning("unknown key event value ", value, " not handled"); - return; - } - - Driver::input_callback(type, code, 0, 0, 0, 0); -} - - -extern "C" void genode_evdev_event(input_handle *handle, unsigned int type, - unsigned int code, int value) -{ - input_dev *dev = handle->dev; - - /* filter sound events */ - if (test_bit(EV_SND, handle->dev->evbit)) return; - - /* filter input_repeat_key() */ - if ((type == EV_KEY) && (value == 2)) return; - - /* filter EV_SYN and EV_MSC */ - if (type == EV_SYN || type == EV_MSC) return; - - switch (type) { - case EV_KEY: handle_key(dev, code, value); return; - case EV_REL: handle_relative(code, value); return; - case EV_ABS: handle_absolute(dev, code, value); return; - - default: - Genode::warning("unknown event type ", type, " not handled"); - return; - } -} - - -/*************************** - ** Keyboard LED handling ** - ***************************/ - -class Keyboard_led -{ - private: - - Genode::Registry::Element _reg_elem; - input_dev * const _input_dev; - - usb_interface *_interface() { - return container_of(_input_dev->dev.parent->parent, usb_interface, dev); } - - usb_device *_usb_device() { - return interface_to_usbdev(_interface()); } - - public: - - Keyboard_led(Genode::Registry ®istry, input_dev *dev) - : _reg_elem(registry, *this), _input_dev(dev) { } - - bool match(input_dev const *other) const { return _input_dev == other; } - - void update(unsigned leds) - { - unsigned *buf = (unsigned *)kmalloc(4, GFP_LX_DMA); - *buf = leds; - usb_control_msg(_usb_device(), usb_sndctrlpipe(_usb_device(), 0), - 0x9, USB_TYPE_CLASS | USB_RECIP_INTERFACE, 0x200, - _interface()->cur_altsetting->desc.bInterfaceNumber, - buf, 1, 500); - kfree(buf); - } -}; - - -static Genode::Registry _registry; - - -namespace Usb { class Led; } - -class Usb::Led -{ - private: - - Lx::Task _task { _run, this, "led_worker", Lx::Task::PRIORITY_2, - Lx::scheduler() }; - - completion _config_update; - completion _led_update; - - enum Update_state { NONE, UPDATE, BLOCKED }; - Update_state _update_state { NONE }; - - Led_state _capslock { Lx_kit::env().env(), "capslock" }, - _numlock { Lx_kit::env().env(), "numlock" }, - _scrlock { Lx_kit::env().env(), "scrlock" }; - - Genode::Signal_handler _config_handler { - Lx_kit::env().env().ep(), *this, &Led::_handle_config }; - - void _handle_config() - { - Lx_kit::env().config_rom().update(); - Genode::Xml_node config = Lx_kit::env().config_rom().xml(); - - _capslock.update(config, _config_handler); - _numlock .update(config, _config_handler); - _scrlock .update(config, _config_handler); - - complete(&_config_update); - Lx::scheduler().schedule(); - } - - static void _run(void *l) - { - Led *led = (Led *)l; - - while (true) { - /* config update from EP */ - wait_for_completion(&led->_config_update); - - led->_update_state = UPDATE; - - _registry.for_each([&] (Keyboard_led &keyboard) { - led->update(keyboard); }); - - /* wake up other task that waits for regestry access */ - if (led->_update_state == BLOCKED) - complete(&led->_led_update); - - led->_update_state = NONE; - } - } - - public: - - Led() - { - init_completion(&_config_update); - init_completion(&_led_update); - Genode::Signal_transmitter(_config_handler).submit(); - } - - void update(Keyboard_led &keyboard) - { - unsigned leds = 0; - - leds |= _capslock.enabled() ? 1u << LED_CAPSL : 0; - leds |= _numlock.enabled() ? 1u << LED_NUML : 0; - leds |= _scrlock.enabled() ? 1u << LED_SCROLLL : 0; - - keyboard.update(leds); - } - - /* - * wait for completion of registry and led state updates - */ - void wait_for_registry() - { - /* task in _run function might receive multiple updates */ - while ((_update_state == UPDATE)) { - _update_state = BLOCKED; - wait_for_completion(&_led_update); - } - } -}; - - -static Genode::Constructible _led; - - -static int led_connect(struct input_handler *handler, struct input_dev *dev, - const struct input_device_id *id) -{ - _led->wait_for_registry(); - - Keyboard_led *keyboard = new (Lx_kit::env().heap()) Keyboard_led(_registry, dev); - _led->update(*keyboard); - - input_handle *handle = (input_handle *)kzalloc(sizeof(input_handle), 0); - handle->dev = input_get_device(dev); - handle->handler = handler; - - input_register_handle(handle); - - return 0; -} - - -static void led_disconnect(struct input_handle *handle) -{ - input_dev *dev = handle->dev; - - _led->wait_for_registry(); - - _registry.for_each([&] (Keyboard_led &keyboard) { - if (keyboard.match(dev)) - destroy(Lx_kit::env().heap(), &keyboard); - }); - - input_unregister_handle(handle); - input_put_device(dev); - kfree(handle); -} - - -static bool led_match(struct input_handler *handler, struct input_dev *dev) -{ - hid_device *hid = (hid_device *)input_get_drvdata(dev); - hid_report *report; - - /* search report for keyboard entries */ - list_for_each_entry(report, &hid->report_enum[0].report_list, list) { - - for (unsigned i = 0; i < report->maxfield; i++) - for (unsigned j = 0; j < report->field[i]->maxusage; j++) { - hid_usage *usage = report->field[i]->usage + j; - if ((usage->hid & HID_USAGE_PAGE) == HID_UP_KEYBOARD) { - return true; - } - } - } - - return false; -} - - -static struct input_handler led_handler; -static struct input_device_id led_ids[2]; - -static int led_init(void) -{ - led_ids[0].driver_info = 1; /* match all */ - led_ids[1] = {}; - - led_handler.name = "led"; - led_handler.connect = led_connect; - led_handler.disconnect = led_disconnect; - led_handler.id_table = led_ids; - led_handler.match = led_match; - - _led.construct(); - - return input_register_handler(&led_handler); -} - - -extern "C" { module_init(led_init); } diff --git a/repos/dde_linux/src/drivers/usb_hid_legacy/led_state.h b/repos/dde_linux/src/drivers/usb_hid_legacy/led_state.h deleted file mode 100644 index 9cd3362038..0000000000 --- a/repos/dde_linux/src/drivers/usb_hid_legacy/led_state.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * \brief Configuration of keyboard mode indicators - * \author Norman Feske - * \date 2017-10-25 - */ - -/* - * Copyright (C) 2017 Genode Labs GmbH - * - * This file is part of the Genode OS framework, which is distributed - * under the terms of the GNU Affero General Public License version 3. - */ - -#ifndef _INPUT__LED_STATE_H_ -#define _INPUT__LED_STATE_H_ - -#include -#include -#include - -namespace Usb { struct Led_state; } - - -struct Usb::Led_state -{ - Genode::Env &_env; - - typedef Genode::String<32> Name; - - Name const _name; - - Genode::Constructible _rom; - - bool _enabled = false; - - Led_state(Genode::Env &env, Name const &name) : _env(env), _name(name) { } - - void update(Genode::Xml_node config, Genode::Signal_context_capability sigh) - { - typedef Genode::String<32> Attr; - typedef Genode::String<16> Value; - - Attr const attr(_name, "_led"); - Value const value = config.attribute_value(attr.string(), Value()); - - bool const rom_configured = (value == "rom"); - - if (rom_configured && !_rom.constructed()) { - _rom.construct(_env, _name.string()); - _rom->sigh(sigh); - } - - if (!rom_configured && _rom.constructed()) - _rom.destruct(); - - if (_rom.constructed()) - _rom->update(); - - _enabled = _rom.constructed() ? _rom->xml().attribute_value("enabled", false) - : config.attribute_value(attr.string(), false); - } - - bool enabled() const { return _enabled; } -}; - -#endif /* _INPUT__LED_STATE_H_ */ diff --git a/repos/dde_linux/src/drivers/usb_hid_legacy/lx_emul.cc b/repos/dde_linux/src/drivers/usb_hid_legacy/lx_emul.cc deleted file mode 100644 index ec9b5900d0..0000000000 --- a/repos/dde_linux/src/drivers/usb_hid_legacy/lx_emul.cc +++ /dev/null @@ -1,671 +0,0 @@ - -#include -#include - -#include -#include - -#include -#include -#include - -#define TRACE do { ; } while (0) - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -extern "C" int usb_match_device(struct usb_device *dev, - const struct usb_device_id *id) -{ - if ((id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) && - id->idVendor != le16_to_cpu(dev->descriptor.idVendor)) - return 0; - - if ((id->match_flags & USB_DEVICE_ID_MATCH_PRODUCT) && - id->idProduct != le16_to_cpu(dev->descriptor.idProduct)) - return 0; - - if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_LO) && - (id->bcdDevice_lo > le16_to_cpu(dev->descriptor.bcdDevice))) - return 0; - - if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_HI) && - (id->bcdDevice_hi < le16_to_cpu(dev->descriptor.bcdDevice))) - return 0; - - if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_CLASS) && - (id->bDeviceClass != dev->descriptor.bDeviceClass)) - return 0; - - if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_SUBCLASS) && - (id->bDeviceSubClass != dev->descriptor.bDeviceSubClass)) - return 0; - - if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_PROTOCOL) && - (id->bDeviceProtocol != dev->descriptor.bDeviceProtocol)) - return 0; - - return 1; -} - - -extern "C" int usb_match_one_id_intf(struct usb_device *dev, - struct usb_host_interface *intf, - const struct usb_device_id *id) -{ - if (dev->descriptor.bDeviceClass == USB_CLASS_VENDOR_SPEC && - !(id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) && - (id->match_flags & (USB_DEVICE_ID_MATCH_INT_CLASS | - USB_DEVICE_ID_MATCH_INT_SUBCLASS | - USB_DEVICE_ID_MATCH_INT_PROTOCOL | - USB_DEVICE_ID_MATCH_INT_NUMBER))) - return 0; - - if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_CLASS) && - (id->bInterfaceClass != intf->desc.bInterfaceClass)) - return 0; - - if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_SUBCLASS) && - (id->bInterfaceSubClass != intf->desc.bInterfaceSubClass)) - return 0; - - if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_PROTOCOL) && - (id->bInterfaceProtocol != intf->desc.bInterfaceProtocol)) - return 0; - - if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_NUMBER) && - (id->bInterfaceNumber != intf->desc.bInterfaceNumber)) - return 0; - - return 1; -} - - -struct Lx_driver -{ - using Element = Genode::List_element; - using List = Genode::List; - - device_driver & dev_drv; - Element le { this }; - - Lx_driver(device_driver & drv) : dev_drv(drv) { list().insert(&le); } - - bool match(struct device *dev) - { - /* - * Don't try if buses don't match, since drivers often use 'container_of' - * which might cast the device to non-matching type - */ - if (dev_drv.bus != dev->bus) - return false; - - return dev_drv.bus->match ? dev_drv.bus->match(dev, &dev_drv) - : false; - } - - int probe(struct device *dev) - { - dev->driver = &dev_drv; - if (dev_drv.bus->probe) return dev_drv.bus->probe(dev); - return 0; - } - - static List & list() - { - static List _list; - return _list; - } -}; - - -struct task_struct *current; -struct workqueue_struct *system_wq; -unsigned long jiffies; - - -Genode::Ram_dataspace_capability Lx::backend_alloc(Genode::addr_t size, - Genode::Cache cache) -{ - return Lx_kit::env().env().ram().alloc(size, cache); -} - - -const char *dev_name(const struct device *dev) { return dev->name; } - - -size_t strlen(const char *s) { return Genode::strlen(s); } - - -int mutex_lock_interruptible(struct mutex *m) -{ - mutex_lock(m); - return 0; -} - - -int driver_register(struct device_driver *drv) -{ - if (!drv) - return 1; - - Lx_driver * driver = (Lx_driver *)kzalloc(sizeof(Lx_driver), GFP_KERNEL); - - Genode::construct_at(driver, *drv); - - return 0; -} - -static struct usb_driver * hid_driver = nullptr; -int usb_register_driver(struct usb_driver * driver, struct module *, const char *) -{ - hid_driver = driver; - return 0; -} - - -void Driver::Device::probe_interface(usb_interface * iface, usb_device_id * id) -{ - hid_driver->probe(iface, id); -} - - -void Driver::Device::remove_interface(usb_interface * iface) -{ - hid_driver->disconnect(iface); - kfree(iface); -} - - -long __wait_completion(struct completion *work, unsigned long timeout) -{ - Lx::timer_update_jiffies(); - struct process_timer timer { *Lx::scheduler().current() }; - unsigned long expire = timeout + jiffies; - - if (timeout) { - timer_setup(&timer.timer, process_timeout, 0); - mod_timer(&timer.timer, expire); - } - - while (!work->done) { - - if (timeout && expire <= jiffies) return 0; - - Lx::Task * task = Lx::scheduler().current(); - work->task = (void *)task; - task->block_and_schedule(); - } - - if (timeout) del_timer(&timer.timer); - - work->done = 0; - return (expire > jiffies) ? (expire - jiffies) : 1; -} - - -int dev_set_drvdata(struct device *dev, void *data) -{ - dev->driver_data = data; - return 0; -} - - -void *dev_get_drvdata(const struct device *dev) -{ - return dev->driver_data; -} - - -size_t strlcat(char *dest, const char *src, size_t dest_size) -{ - size_t len_d = strlen(dest); - - if (len_d > dest_size) return 0; - - size_t len = dest_size - len_d - 1; - - memcpy(dest + len_d, src, len); - dest[len_d + len] = 0; - return len; -} - - -int __usb_get_extra_descriptor(char *buffer, unsigned size, unsigned char type, void **ptr) -{ - struct usb_descriptor_header *header; - - while (size >= sizeof(struct usb_descriptor_header)) { - header = (struct usb_descriptor_header *)buffer; - - if (header->bLength < 2) { - printk(KERN_ERR - "%s: bogus descriptor, type %d length %d\n", - usbcore_name, - header->bDescriptorType, - header->bLength); - return -1; - } - - if (header->bDescriptorType == type) { - *ptr = header; - return 0; - } - - buffer += header->bLength; - size -= header->bLength; - } - - return -1; -} - - -void *vzalloc(unsigned long size) -{ - return kzalloc(size, 0); -} - - -void vfree(void *addr) -{ - if (!addr) return; - kfree(addr); -} - - -int device_add(struct device *dev) -{ - if (dev->driver) return 0; - - /* foreach driver match and probe device */ - using Le = Genode::List_element; - for (Le *le = Lx_driver::list().first(); le; le = le->next()) - if (le->object()->match(dev)) { - int ret = le->object()->probe(dev); - if (!ret) return 0; - } - - return 0; -} - - -void device_del(struct device *dev) -{ - if (dev->bus && dev->bus->remove) - dev->bus->remove(dev); -} - - -void *usb_alloc_coherent(struct usb_device *dev, size_t size, gfp_t mem_flags, dma_addr_t *dma) -{ - return kmalloc(size, GFP_KERNEL); -} - - -struct device *get_device(struct device *dev) -{ - dev->ref++; - return dev; -} - - -void put_device(struct device *dev) -{ - if (dev->ref) { - dev->ref--; - return; - } - - if (dev->release) - dev->release(dev); - else if (dev->type && dev->type->release) - dev->type->release(dev); -} - - -void cdev_init(struct cdev *c, const struct file_operations *fops) -{ - c->ops = fops; -} - - -void usb_free_coherent(struct usb_device *dev, size_t size, void *addr, dma_addr_t dma) -{ - kfree(addr); -} - - -int mutex_lock_killable(struct mutex *lock) -{ - mutex_lock(lock); - return 0; -} - - -u16 get_unaligned_le16(const void *p) -{ - const struct __una_u16 *ptr = (const struct __una_u16 *)p; - return ptr->x; -} - - -unsigned long find_next_bit(const unsigned long *addr, unsigned long size, unsigned long offset) -{ - unsigned long i = offset / BITS_PER_LONG; - offset -= (i * BITS_PER_LONG); - - for (; offset < size; offset++) - if (addr[i] & (1UL << offset)) - return offset + (i * BITS_PER_LONG); - - return size; -} - - -long find_next_zero_bit_le(const void *addr, - unsigned long size, unsigned long offset) -{ - unsigned long max_size = sizeof(long) * 8; - if (offset >= max_size) { - Genode::warning("Offset greater max size"); - return offset + size; - } - - for (; offset < max_size; offset++) - if (!(*(unsigned long*)addr & (1L << offset))) - return offset; - - return offset + size; -} - - -u32 get_unaligned_le32(const void *p) -{ - const struct __una_u32 *ptr = (const struct __una_u32 *)p; - return ptr->x; -} - - -void *devm_kzalloc(struct device *dev, size_t size, gfp_t gfp) -{ - return kzalloc(size, gfp); -} - - -int usb_get_descriptor(struct usb_device *dev, unsigned char type, - unsigned char index, void *buf, int size) -{ - int i; - int result; - - memset(buf, 0, size); - - for (i = 0; i < 3; ++i) { - /* retry on length 0 or error; some devices are flakey */ - result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), - USB_REQ_GET_DESCRIPTOR, USB_DIR_IN, - (type << 8) + index, 0, buf, size, - USB_CTRL_GET_TIMEOUT); - if (result <= 0 && result != -ETIMEDOUT) - continue; - if (result > 1 && ((u8 *)buf)[1] != type) { - result = -ENODATA; - continue; - } - break; - } - return result; -} - - - -static struct usb_interface_assoc_descriptor *find_iad(struct usb_device *dev, - struct usb_host_config *config, - u8 inum) -{ - struct usb_interface_assoc_descriptor *retval = NULL; - struct usb_interface_assoc_descriptor *intf_assoc; - int first_intf; - int last_intf; - int i; - - for (i = 0; (i < USB_MAXIADS && config->intf_assoc[i]); i++) { - intf_assoc = config->intf_assoc[i]; - if (intf_assoc->bInterfaceCount == 0) - continue; - - first_intf = intf_assoc->bFirstInterface; - last_intf = first_intf + (intf_assoc->bInterfaceCount - 1); - if (inum >= first_intf && inum <= last_intf) { - if (!retval) - retval = intf_assoc; - else - dev_err(&dev->dev, "Interface #%d referenced" - " by multiple IADs\n", inum); - } - } - - return retval; -} - - -struct usb_host_interface *usb_altnum_to_altsetting(const struct usb_interface *intf, - unsigned int altnum) -{ - for (unsigned i = 0; i < intf->num_altsetting; i++) { - if (intf->altsetting[i].desc.bAlternateSetting == altnum) - return &intf->altsetting[i]; - } - return NULL; -} - - -int usb_set_configuration(struct usb_device *dev, int configuration) -{ - int i, ret; - struct usb_host_config *cp = NULL; - struct usb_interface **new_interfaces = NULL; - int n, nintf; - - if (dev->authorized == 0 || configuration == -1) - configuration = 0; - else { - for (i = 0; i < dev->descriptor.bNumConfigurations; i++) { - if (dev->config[i].desc.bConfigurationValue == - configuration) { - cp = &dev->config[i]; - break; - } - } - } - if ((!cp && configuration != 0)) - return -EINVAL; - - /* The USB spec says configuration 0 means unconfigured. - * But if a device includes a configuration numbered 0, - * we will accept it as a correctly configured state. - * Use -1 if you really want to unconfigure the device. - */ - if (cp && configuration == 0) - dev_warn(&dev->dev, "config 0 descriptor??\n"); - - /* Allocate memory for new interfaces before doing anything else, - * so that if we run out then nothing will have changed. */ - n = nintf = 0; - if (cp) { - nintf = cp->desc.bNumInterfaces; - new_interfaces = (struct usb_interface **) - kmalloc(nintf * sizeof(*new_interfaces), GFP_KERNEL); - if (!new_interfaces) - return -ENOMEM; - - for (; n < nintf; ++n) { - new_interfaces[n] = (struct usb_interface*) - kzalloc( sizeof(struct usb_interface), GFP_KERNEL); - if (!new_interfaces[n]) { - ret = -ENOMEM; - while (--n >= 0) - kfree(new_interfaces[n]); - kfree(new_interfaces); - return ret; - } - } - } - - /* - * Initialize the new interface structures and the - * hc/hcd/usbcore interface/endpoint state. - */ - for (i = 0; i < nintf; ++i) { - struct usb_interface_cache *intfc; - struct usb_interface *intf; - struct usb_host_interface *alt; - u8 ifnum; - - cp->interface[i] = intf = new_interfaces[i]; - intfc = cp->intf_cache[i]; - intf->altsetting = intfc->altsetting; - intf->num_altsetting = intfc->num_altsetting; - intf->authorized = 1; //FIXME - - alt = usb_altnum_to_altsetting(intf, 0); - - /* No altsetting 0? We'll assume the first altsetting. - * We could use a GetInterface call, but if a device is - * so non-compliant that it doesn't have altsetting 0 - * then I wouldn't trust its reply anyway. - */ - if (!alt) - alt = &intf->altsetting[0]; - - ifnum = alt->desc.bInterfaceNumber; - intf->intf_assoc = find_iad(dev, cp, ifnum); - intf->cur_altsetting = alt; - intf->dev.parent = &dev->dev; - intf->dev.driver = NULL; - intf->dev.bus = (bus_type*) 0xdeadbeef /*&usb_bus_type*/; - intf->minor = -1; - device_initialize(&intf->dev); - dev_set_name(&intf->dev, "%d-%s:%d.%d", dev->bus->busnum, - dev->devpath, configuration, ifnum); - } - kfree(new_interfaces); - - ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), - USB_REQ_SET_CONFIGURATION, 0, configuration, 0, - NULL, 0, USB_CTRL_SET_TIMEOUT); - if (ret < 0 && cp) { - for (i = 0; i < nintf; ++i) { - put_device(&cp->interface[i]->dev); - cp->interface[i] = NULL; - } - cp = NULL; - } - - dev->actconfig = cp; - - if (!cp) { - dev->state = USB_STATE_ADDRESS; - return ret; - } - dev->state = USB_STATE_CONFIGURED; - - return 0; -} - -static Genode::Allocator &heap() -{ - static Genode::Heap heap(Lx_kit::env().env().ram(), Lx_kit::env().env().rm()); - return heap; -} - -extern "C" -void *kmalloc(size_t size, gfp_t flags) -{ - try { - void * const addr = heap().alloc(size); - - if (!addr) - return 0; - - if ((Genode::addr_t)addr & 0x3) - Genode::error("unaligned kmalloc ", (Genode::addr_t)addr); - - if (flags & __GFP_ZERO) - memset(addr, 0, size); - - return addr; - } catch (...) { - return NULL; - } -} - -extern "C" -void kfree(const void *p) -{ - if (!p) return; - - heap().free((void *)p, 0); -} - -extern "C" -void *kzalloc(size_t size, gfp_t flags) -{ - return kmalloc(size, flags | __GFP_ZERO); -} - -extern "C" -void *kcalloc(size_t n, size_t size, gfp_t flags) -{ - if (size != 0 && n > (~0UL / size)) - return 0; - - return kzalloc(n * size, flags); -} - -extern "C" -void *kmemdup(const void *src, size_t size, gfp_t flags) -{ - void *addr = kmalloc(size, flags); - - if (addr) - memcpy(addr, src, size); - - return addr; -} - -/****************** - ** linux/kref.h ** - ******************/ - -void kref_init(struct kref *kref) -{ - atomic_set(&kref->refcount, 1); -} - - -void kref_get(struct kref *kref) -{ - atomic_inc(&kref->refcount); -} - - -int kref_put(struct kref *kref, void (*release) (struct kref *kref)) -{ - if(!atomic_dec_return(&kref->refcount)) { - release(kref); - return 1; - } - return 0; -} - diff --git a/repos/dde_linux/src/drivers/usb_hid_legacy/lx_emul.h b/repos/dde_linux/src/drivers/usb_hid_legacy/lx_emul.h deleted file mode 100644 index 58585b0741..0000000000 --- a/repos/dde_linux/src/drivers/usb_hid_legacy/lx_emul.h +++ /dev/null @@ -1,642 +0,0 @@ -/* - * \brief USB HID driver Linux emulation environment - * \author Stefan Kalkowski - * \date 2018-06-13 - */ - -/* - * Copyright (C) 2018 Genode Labs GmbH - * - * This file is distributed under the terms of the GNU General Public License - * version 2. - */ - -#ifndef _SRC__DRIVERS__USB_HID__LX_EMUL_H_ -#define _SRC__DRIVERS__USB_HID__LX_EMUL_H_ - -#include -#include - -#include - -#include -#include -#include -#include - -enum { HZ = 100UL }; - -#include -#include -#include - -typedef int clockid_t; - -#include -#include - -#include - -LX_MUTEX_INIT_DECLARE(dquirks_lock); -LX_MUTEX_INIT_DECLARE(input_mutex); -LX_MUTEX_INIT_DECLARE(wacom_udev_list_lock); - -#define dquirks_lock LX_MUTEX(dquirks_lock) -#define input_mutex LX_MUTEX(input_mutex) -#define wacom_udev_list_lock LX_MUTEX(wacom_udev_list_lock) - - -typedef __u16 __le16; -typedef __u32 __le32; -typedef __u64 __le64; -typedef __u64 __be64; - -#define DECLARE_BITMAP(name,bits) \ - unsigned long name[BITS_TO_LONGS(bits)] - -#include -#include -#include -#include -#include -#include -#include - -static inline void barrier() { asm volatile ("": : :"memory"); } - -#define READ_ONCE(x) x - -#include -#include -#include -#include - -struct file -{ - unsigned int f_flags; - void * private_data; -}; - -struct device; - -typedef unsigned long kernel_ulong_t; -typedef struct { __u8 b[16]; } uuid_le; - -struct device * get_device(struct device *dev); -void put_device(struct device *); -void * dev_get_drvdata(const struct device *dev); -int dev_set_drvdata(struct device *dev, void *data); - -#define dev_info(dev, format, arg...) lx_printf("dev_info: " format , ## arg) -#define dev_warn(dev, format, arg...) lx_printf("dev_warn: " format , ## arg) -#define dev_err( dev, format, arg...) lx_printf("dev_err: " format , ## arg) -#define dev_dbg( dev, format, arg...) - -#define pr_info(fmt, ...) printk(KERN_INFO fmt, ##__VA_ARGS__) -#define pr_err(fmt, ...) printk(KERN_ERR fmt, ##__VA_ARGS__) -#define pr_warn(fmt, ...) printk(KERN_WARN fmt, ##__VA_ARGS__) - -struct semaphore {}; - -struct device_driver -{ - char const *name; - struct bus_type *bus; - struct module *owner; - const char *mod_name; -}; - -typedef int devt; - -struct class -{ - const char *name; - char *(*devnode)(struct device *dev, mode_t *mode); -}; - -struct device -{ - char const * name; - struct device * parent; - struct kobject * kobj; - struct device_driver * driver; - struct bus_type * bus; - dev_t devt; - struct class * class; - const struct device_type * type; - void (*release)(struct device *dev); - void * driver_data; - unsigned ref; -}; - -void down(struct semaphore *sem); -void up(struct semaphore *sem); - -#define module_driver(__driver, __register, __unregister, ...) \ - static int __init __driver##_init(void) \ - { \ - return __register(&(__driver) , ##__VA_ARGS__); \ - } \ - module_init(__driver##_init); \ - static void __exit __driver##_exit(void) \ - { \ - __unregister(&(__driver) , ##__VA_ARGS__); \ - } \ - module_exit(__driver##_exit); - -void device_lock(struct device *dev); -void device_release_driver(struct device *dev); - -#define KBUILD_MODNAME "" - -struct attribute -{ - const char * name; - mode_t mode; -}; - -struct device_attribute { - struct attribute attr; - ssize_t (*show)(struct device *dev, struct device_attribute *attr, - char *buf); - ssize_t (*store)(struct device *dev, struct device_attribute *attr, - const char *buf, size_t count); -}; - -#define __ATTR(_name,_mode,_show,_store) { \ - .attr = {.name = #_name, .mode = _mode }, \ - .show = _show, \ - .store = _store, \ -} - -#define DEVICE_ATTR(_name, _mode, _show, _store) \ -struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store) - -int sprintf(char *buf, const char *fmt, ...); -int kstrtoul(const char *s, unsigned int base, unsigned long *res); - -void device_unlock(struct device *dev); - -struct kobj_uevent_env; - -struct bus_type { - const char * name; - const struct attribute_group **dev_groups; - const struct attribute_group **drv_groups; - int (*match)(struct device *dev, struct device_driver *drv); - int (*uevent)(struct device *dev, struct kobj_uevent_env *env); - int (*probe)(struct device *dev); - int (*remove)(struct device *dev); -}; - -int bus_for_each_dev(struct bus_type *bus, struct device *start, void *data, int (*fn)(struct device *dev, void *data)); -int bus_for_each_drv(struct bus_type *bus, struct device_driver *start, void *data, int (*fn)(struct device_driver *, void *)); -int driver_attach(struct device_driver *drv); - -struct file_operations; -struct cdev { const struct file_operations * ops; }; - -typedef __s64 time64_t; - -struct timespec64 { - time64_t tv_sec; /* seconds */ - long tv_nsec; /* nanoseconds */ -}; - -struct timespec64 ktime_to_timespec64(const s64 nsec); - -enum { - S_IWGRP = 20, - S_IRGRP = 40, - S_IRUGO = 444, - S_IWUSR = 200, - S_IRUSR = 400, -}; - -struct attribute_group -{ - const char *name; - struct attribute **attrs; - struct bin_attribute **bin_attrs; -}; - -void kfree(const void *); -unsigned int jiffies_to_usecs(const unsigned long j); -void *devm_kzalloc(struct device *dev, size_t size, gfp_t gfp); -size_t strlen(const char *s); - -#define from_timer(var, callback_timer, timer_fieldname) \ - container_of(callback_timer, typeof(*var), timer_fieldname) - -int sysfs_create_group(struct kobject *kobj, const struct attribute_group *grp); -void sysfs_remove_group(struct kobject *kobj, const struct attribute_group *grp); -static inline void devm_kfree(struct device *dev, void *p) {} - -#define module_param_array_named(name, array, type, nump, perm) - -void *kmalloc(size_t size, gfp_t flags); -void *kzalloc(size_t size, gfp_t flags); -void *kcalloc(size_t n, size_t size, gfp_t flags); - -int snprintf(char *buf, size_t size, const char *fmt, ...); -const char *dev_name(const struct device *dev); -u16 get_unaligned_le16(const void *p); -u32 get_unaligned_le32(const void *p); - -void *vzalloc(unsigned long size); -void vfree(void *addr); - -struct pm_message {}; -typedef struct pm_message pm_message_t; - -struct task_struct -{ - char comm[16]; -}; - -extern struct task_struct *current; - -struct completion -{ - unsigned int done; - void * task; -}; - -long __wait_completion(struct completion *work, unsigned long timeout); - -struct notifier_block; - -enum { - EPOLLIN = 0x00000001, - EPOLLOUT = 0x00000004, - EPOLLERR = 0x00000008, - EPOLLHUP = 0x00000010, - EPOLLRDNORM = 0x00000040, - EPOLLWRNORM = 0x00000100, - EPOLLRDHUP = 0x00002000, - ESHUTDOWN = 58, -}; - -enum led_brightness { LED_OFF = 0, LED_FULL = 255 }; - -struct led_classdev -{ - const char * name; - enum led_brightness max_brightness; - int flags; - void (*brightness_set)(struct led_classdev *led_cdev, - enum led_brightness brightness); - int (*brightness_set_blocking)(struct led_classdev *led_cdev, - enum led_brightness brightness); - enum led_brightness (*brightness_get)(struct led_classdev *led_cdev); - const char *default_trigger; - struct led_trigger *trigger; -}; - -struct led_trigger -{ - const char * name; -}; - -int sscanf(const char *, const char *, ...); - -#define hid_dump_input(a,b,c) do { } while (0) -#define hid_dump_report(a, b, c, d) do { } while (0) -#define hid_debug_register(a, b) do { } while (0) -#define hid_debug_unregister(a) do { } while (0) -#define hid_debug_init() do { } while (0) -#define hid_debug_exit() do { } while (0) - -struct hid_device; - -static inline int hidraw_report_event(struct hid_device *hid, u8 *data, int len) { return 0; } - -int down_trylock(struct semaphore *sem); - -struct bin_attribute { - struct attribute attr; - size_t size; - ssize_t (*read)(struct file *, struct kobject *, - struct bin_attribute *, char *, loff_t, size_t); -}; - -struct device *kobj_to_dev(struct kobject *kobj); - -static inline int hidraw_connect(struct hid_device *hid) { return -1; } -static inline void hidraw_disconnect(struct hid_device *hid) { } - -struct hidraw { u32 minor; }; - -int device_create_file(struct device *device, const struct device_attribute *entry); -void device_remove_file(struct device *dev, const struct device_attribute *attr); - -int mutex_lock_killable(struct mutex *lock); - -struct driver_attribute { - struct attribute attr; -}; - -#define DRIVER_ATTR_WO(_name) \ - struct driver_attribute driver_attr_##_name = { .attr = { .name = NULL } } - -void msleep(unsigned int); - -long find_next_zero_bit_le(const void *addr, unsigned long size, unsigned long offset); - -int sysfs_create_group(struct kobject *kobj, const struct attribute_group *grp); - -int down_interruptible(struct semaphore *sem); - -int scnprintf(char *buf, size_t size, const char *fmt, ...); - -enum { PAGE_SIZE = 4096, }; - -#define __ATTRIBUTE_GROUPS(_name) \ -static const struct attribute_group *_name##_groups[] = { \ - &_name##_group, \ - NULL, \ -} - -#define ATTRIBUTE_GROUPS(_name) \ -static const struct attribute_group _name##_group = { \ - .attrs = _name##_attrs, \ -}; \ -__ATTRIBUTE_GROUPS(_name) - -#define DEVICE_ATTR_RO(_name) \ - struct device_attribute dev_attr_##_name = { .attr = { .name = NULL } } - -struct kobj_uevent_env; - -int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...); - -int dev_set_name(struct device *dev, const char *name, ...); -int device_add(struct device *dev); - -void device_initialize(struct device *dev); - -void device_enable_async_suspend(struct device *dev); - -void device_del(struct device *dev); - -void sema_init(struct semaphore *sem, int val); - -int driver_register(struct device_driver *drv); -void driver_unregister(struct device_driver *drv); -int bus_register(struct bus_type *bus); -void bus_unregister(struct bus_type *bus); - -enum { CLOCK_BOOTTIME = 7, }; - -struct fasync_struct; -void kill_fasync(struct fasync_struct **, int, int); - -enum { SIGIO = 29 }; - -enum { - POLL_IN = 1, - POLL_HUP = 6, -}; - -enum tk_offsets { TK_OFFS_BOOT = 1, }; - -ktime_t ktime_mono_to_real(ktime_t mono); -ktime_t ktime_mono_to_any(ktime_t tmono, enum tk_offsets offs); - -static inline void rcu_read_lock(void) { } -static inline void rcu_read_unlock(void) { } - -#define rcu_dereference(p) p -#define rcu_assign_pointer(p,v) p = v -#define rcu_dereference_protected(p, c) p - -static inline int hidraw_init(void) { return 0; } -static inline int hidraw_exit(void) { return 0; } -static inline int hidraw_debug_init(void) { return 0; } -static inline int hidraw_debug_exit(void) { return 0; } - -#define list_for_each_entry_rcu(pos, head, member) \ - list_for_each_entry(pos, head, member) - -int fasync_helper(int, struct file *, int, struct fasync_struct **); - -typedef unsigned fl_owner_t; - -struct scatterlist; - -bool lockdep_is_held(void *); - -struct power_supply; -void power_supply_changed(struct power_supply *psy); - -static inline u16 get_unaligned_be16(const void *p) { - return be16_to_cpup((__be16 *)p); } - -static inline void synchronize_rcu(void) { } - -static inline void list_add_tail_rcu(struct list_head *n, - struct list_head *head) { - list_add_tail(n, head); } - -static inline void list_del_rcu(struct list_head *entry) { - list_del(entry); } - -int mutex_lock_interruptible(struct mutex *m); - -void kvfree(const void *addr); - -struct inode -{ - struct cdev * i_cdev; -}; - -int nonseekable_open(struct inode *inode, struct file *filp); - -enum { O_NONBLOCK = 0x4000 }; - -typedef unsigned __poll_t; - -typedef struct poll_table_struct { } poll_table; - -size_t copy_to_user(void *dst, void const *src, size_t len); -long copy_from_user(void *to, const void *from, unsigned long n); -#define put_user(x, ptr) ({ lx_printf("put_user not implemented"); (0);}) - -int devm_add_action(struct device *dev, void (*action)(void *), void *data); - -void poll_wait(struct file *f, wait_queue_head_t *w, poll_table *p); - -#define get_user(x, ptr) ({ x = *ptr; 0; }) - -unsigned long clear_user(void *to, unsigned long n); - -#define _IOC_NRSHIFT 0 -#define _IOC_TYPESHIFT (_IOC_NRSHIFT + 8) -#define _IOC_SIZESHIFT (_IOC_TYPESHIFT + 8) -#define _IOC_DIRSHIFT (_IOC_SIZESHIFT + 14) - -#define _IOC_WRITE 1U -#define _IOC_READ 2U -#define _IOC_SIZEMASK ((1 << 14) - 1) -#define _IOC_DIR(cmd) cmd -#define _IOC(dir,type,nr,size) (type+nr+sizeof(size)) -#define _IOR(type,nr,size) (type+nr+sizeof(size)+10) -#define _IOW(type,nr,size) (type+nr+sizeof(size)+20) -#define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK) -#define _IOC_TYPE(cmd) cmd -#define _IOC_NR(cmd) cmd - -signed long schedule_timeout(signed long timeout); - -int kstrtouint(const char *s, unsigned int base, unsigned int *res); - -#define find_next_zero_bit find_next_zero_bit_le - -int device_set_wakeup_enable(struct device *dev, bool enable); - -struct ida {}; -#define DEFINE_IDA(name) struct ida name; - -loff_t no_llseek(struct file *file, loff_t offset, int whence); - -struct file_operations -{ - struct module *owner; - int (*open) (struct inode *, struct file *); - ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); - loff_t (*llseek) (struct file *, loff_t, int); - unsigned int (*poll) (struct file *, struct poll_table_struct *); - long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); - int (*flush) (struct file *, fl_owner_t id); - int (*release) (struct inode *, struct file *); - ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); - int (*fasync) (int, struct file *, int); -}; - -#define MKDEV(major, minor) 0 - -unsigned long int_sqrt(unsigned long x); - -u64 get_unaligned_le64(const void *p); - -#define U8_MAX ((u8)~0U) -#define S8_MAX ((s8)(U8_MAX>>1)) -#define S8_MIN ((s8)(-S8_MAX - 1)) -#define U16_MAX ((u16)~0U) -#define S16_MAX ((s16)(U16_MAX>>1)) -#define S16_MIN ((s16)(-S16_MAX - 1)) -#define U32_MAX ((u32)~0U) -#define S32_MAX ((s32)(U32_MAX>>1)) -#define S32_MIN ((s32)(-S32_MAX - 1)) - -typedef void (*dr_release_t)(struct device *dev, void *res); -void *devres_alloc(dr_release_t release, size_t size, gfp_t gfp); -void devres_add(struct device *dev, void *res); -int devres_release_group(struct device *dev, void *id); -void * devres_open_group(struct device *dev, void *id, gfp_t gfp); -void devres_close_group(struct device *dev, void *id); - -static inline void add_input_randomness(unsigned int type, unsigned int code, unsigned int value) { } - -unsigned long find_next_bit(const unsigned long *addr, unsigned long size, unsigned long offset); -#define find_first_bit(addr, size) find_next_bit((addr), (size), 0) - -char *devm_kasprintf(struct device *dev, gfp_t gfp, const char *fmt, ...); - -int devm_led_trigger_register(struct device *dev, struct led_trigger *trigger); - -int devm_add_action_or_reset(struct device *dev, void (*action)(void *), void *data); - -int devm_led_classdev_register(struct device *parent, struct led_classdev *led_cdev); - -enum { LED_HW_PLUGGABLE = 1 << 19 }; - -int kstrtou8(const char *s, unsigned int base, u8 *res); - -struct kobj_attribute -{ - struct attribute attr; - void * show; - void * store; -}; - -int bitmap_subset(const unsigned long *src1, const unsigned long *src2, int nbits); - -struct device_type { - const char *name; - const struct attribute_group **groups; - void (*release)(struct device *dev); - int (*uevent)(struct device *dev, struct kobj_uevent_env *env); - char *(*devnode)(struct device *dev, mode_t *mode, kuid_t *, kgid_t *); -}; - -char *kasprintf(gfp_t gfp, const char *fmt, ...); - -void cdev_init(struct cdev *c, const struct file_operations *fops); -int cdev_device_add(struct cdev *cdev, struct device *dev); -void cdev_device_del(struct cdev *cdev, struct device *dev); - -#define MINOR(dev) ((dev) & 0xff) - -typedef int (*dr_match_t)(struct device *dev, void *res, void *match_data); - -void devres_free(void *res); -int devres_destroy(struct device *dev, dr_release_t release, dr_match_t match, void *match_data); - -static inline void dump_stack(void) { } - -int bitmap_weight(const unsigned long *src, unsigned int nbits); - -#define list_add_rcu list_add - -int ida_simple_get(struct ida *ida, unsigned int start, unsigned int end, gfp_t gfp_mask); -void ida_simple_remove(struct ida *ida, unsigned int id); - -int class_register(struct class *cls); -void class_unregister(struct class *cls); -int register_chrdev_region(dev_t, unsigned, const char *); -void unregister_chrdev_region(dev_t, unsigned); - -int sysfs_create_files(struct kobject *kobj, const struct attribute **ptr); - -static inline void led_trigger_event(struct led_trigger *trigger, - enum led_brightness event) {} - -typedef unsigned slab_flags_t; - -struct tasklet_struct -{ - void (*func)(unsigned long); - unsigned long data; -}; - -struct __una_u16 { u16 x; } __attribute__((packed)); -struct __una_u32 { u32 x; } __attribute__((packed)); - -void subsys_input_init(); -int module_evdev_init(); -int module_led_init(); -int module_usbhid_init(); -int module_hid_init(); -int module_hid_generic_init(); -int module_ch_driver_init(); -int module_holtek_mouse_driver_init(); -int module_apple_driver_init(); -int module_ms_driver_init(); -int module_mt_driver_init(); -int module_wacom_driver_init(); - -struct input_handle; -void genode_evdev_event(struct input_handle *handle, unsigned int type, unsigned int code, int value); - -struct usb_device; -extern int usb_get_configuration(struct usb_device *dev); -extern void usb_destroy_configuration(struct usb_device *dev); - -struct usb_hcd { unsigned amd_resume_bug:1; }; - -bool usb_device_is_owned(struct usb_device *udev); - -#include - -#endif /* _SRC__DRIVERS__USB_HID__LX_EMUL_H_ */ diff --git a/repos/dde_linux/src/drivers/usb_hid_legacy/main.cc b/repos/dde_linux/src/drivers/usb_hid_legacy/main.cc deleted file mode 100644 index 8ba614fbf4..0000000000 --- a/repos/dde_linux/src/drivers/usb_hid_legacy/main.cc +++ /dev/null @@ -1,327 +0,0 @@ -/* - * \brief USB HID driver - * \author Stefan Kalkowski - * \date 2018-06-07 - */ - -/* - * Copyright (C) 2018 Genode Labs GmbH - * - * This file is distributed under the terms of the GNU General Public License - * version 2. - */ - -#include - -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include - -extern "C" void usb_detect_interface_quirks(struct usb_device *udev); - -void Driver::Device::register_device() -{ - if (udev) { - Genode::error("device already registered!"); - return; - } - - Usb::Device_descriptor dev_desc; - Usb::Config_descriptor config_desc; - usb.config_descriptor(&dev_desc, &config_desc); - - udev = (usb_device*) kzalloc(sizeof(usb_device), GFP_KERNEL); - udev->bus = (usb_bus*) kzalloc(sizeof(usb_bus), GFP_KERNEL); - udev->bus->bus_name = "usbbus"; - udev->bus->controller = (device*) (&usb); - udev->bus_mA = 900; /* set to maximum USB3.0 */ - - Genode::memcpy(&udev->descriptor, &dev_desc, sizeof(usb_device_descriptor)); - udev->devnum = dev_desc.num; - udev->speed = (usb_device_speed) dev_desc.speed; - udev->authorized = 1; - - int cfg = usb_get_configuration(udev); - if (cfg < 0) { - Genode::error("usb_get_configuration returned error ", cfg); - return; - } - - usb_detect_interface_quirks(udev); - cfg = usb_choose_configuration(udev); - if (cfg < 0) { - Genode::error("usb_choose_configuration returned error ", cfg); - return; - } - - int ret = usb_set_configuration(udev, cfg); - if (ret < 0) { - Genode::error("usb_set_configuration returned error ", ret); - return; - } - - for (int i = 0; i < udev->config->desc.bNumInterfaces; i++) { - struct usb_interface * iface = udev->config->interface[i]; - struct usb_host_interface * alt = iface->cur_altsetting; - - if (alt->desc.bInterfaceClass != USB_CLASS_HID) - continue; - - for (int j = 0; j < alt->desc.bNumEndpoints; ++j) { - - struct usb_host_endpoint * ep = &alt->endpoint[j]; - int epnum = usb_endpoint_num(&ep->desc); - int is_out = usb_endpoint_dir_out(&ep->desc); - if (is_out) udev->ep_out[epnum] = ep; - else udev->ep_in[epnum] = ep; - } - - struct usb_device_id id; - probe_interface(iface, &id); - } -} - - -void Driver::Device::unregister_device() -{ - for (unsigned i = 0; i < USB_MAXINTERFACES; i++) { - if (!udev->config->interface[i]) break; - else remove_interface(udev->config->interface[i]); - } - usb_destroy_configuration(udev); - kfree(udev->bus); - kfree(udev); - udev = nullptr; -} - - -void Driver::Device::state_task_entry(void * arg) -{ - Device & dev = *reinterpret_cast(arg); - - for (;;) { - while (dev.state_task.signal_pending()) { - if (dev.usb.plugged() && !dev.udev) - dev.register_device(); - - if (!dev.usb.plugged() && dev.udev) - dev.unregister_device(); - } - Lx::scheduler().current()->block_and_schedule(); - } -} - - -void Driver::Device::urb_task_entry(void * arg) -{ - Device & dev = *reinterpret_cast(arg); - - for (;;) { - while (dev.udev && dev.usb.source()->ack_avail()) { - Usb::Packet_descriptor p = dev.usb.source()->get_acked_packet(); - if (p.completion) p.completion->complete(p); - dev.usb.source()->release_packet(p); - } - - Lx::scheduler().current()->block_and_schedule(); - } -} - - -Driver::Device::Device(Driver & driver, Label label) -: label(label), - driver(driver), - env(driver.env), - alloc(&driver.heap), - state_task(env.ep(), state_task_entry, reinterpret_cast(this), - "usb_state", Lx::Task::PRIORITY_0, Lx::scheduler()), - urb_task(env.ep(), urb_task_entry, reinterpret_cast(this), - "usb_urb", Lx::Task::PRIORITY_0, Lx::scheduler()) -{ - usb.tx_channel()->sigh_ack_avail(urb_task.handler); - driver.devices.insert(&le); -} - - -Driver::Device::~Device() -{ - driver.devices.remove(&le); - - while (usb.source()->ack_avail()) { - Usb::Packet_descriptor p = usb.source()->get_acked_packet(); - usb.source()->release_packet(p); - } -} - - -bool Driver::Device::deinit() -{ - return !udev && !state_task.handling_signal && !urb_task.handling_signal; -} - - -unsigned long Driver::screen_x = 0; -unsigned long Driver::screen_y = 0; -bool Driver::multi_touch = false; -static Driver * driver = nullptr; - - -void Driver::main_task_entry(void * arg) -{ - driver = reinterpret_cast(arg); - - subsys_input_init(); - module_evdev_init(); - module_led_init(); - module_usbhid_init(); - module_hid_init(); - module_hid_generic_init(); - module_ch_driver_init(); - module_holtek_mouse_driver_init(); - module_apple_driver_init(); - module_ms_driver_init(); - module_mt_driver_init(); - /* disable wacom driver due to #3997 */ - // module_wacom_driver_init(); - - bool use_report = false; - - try { - Genode::Xml_node config_node = Lx_kit::env().config_rom().xml(); - use_report = config_node.attribute_value("use_report", false); - config_node.attribute("width").value(screen_x); - config_node.attribute("height").value(screen_y); - multi_touch = config_node.attribute_value("multitouch", false); - } catch(...) { } - - if (use_report) - Genode::warning("use compatibility mode: ", - "will claim all HID devices from USB report"); - - Genode::log("Configured HID screen with ", screen_x, "x", screen_y, - " (multitouch=", multi_touch ? "true" : "false", ")"); - - for (;;) { - while (driver->main_task->signal_pending()) { - if (!use_report) - static Device dev(*driver, Label("")); - else - driver->scan_report(); - } - Lx::scheduler().current()->block_and_schedule(); - } -} - - -void Driver::scan_report() -{ - if (!report_rom.constructed()) { - report_rom.construct(env, "report"); - report_rom->sigh(main_task->handler); - } - - report_rom->update(); - - devices.for_each([&] (Device & d) { d.updated = false; }); - - try { - Genode::Xml_node report_node = report_rom->xml(); - report_node.for_each_sub_node([&] (Genode::Xml_node & dev_node) - { - unsigned long c = 0; - dev_node.attribute("class").value(c); - if (c != USB_CLASS_HID) return; - - Label label; - dev_node.attribute("label").value(label); - - bool found = false; - - devices.for_each([&] (Device & d) { - if (d.label == label) d.updated = found = true; }); - - if (!found) - new (heap) Device(*this, label); - }); - } catch(...) { - Genode::error("Error parsing USB devices report"); - }; - - devices.for_each([&] (Device & d) { - if (!d.updated && d.deinit()) - destroy(heap, &d); - }); -} - - -void Driver::input_callback(Input_event type, unsigned code, - int ax, int ay, int rx, int ry) -{ - auto submit = [&] (Input::Event const &ev) - { - driver->event.with_batch([&] (Event::Session_client::Batch &batch) { - batch.submit(ev); }); - }; - - using namespace Input; - - switch (type) { - case EVENT_TYPE_PRESS: submit(Press{Keycode(code)}); break; - case EVENT_TYPE_RELEASE: submit(Release{Keycode(code)}); break; - case EVENT_TYPE_MOTION: - if (rx == 0 && ry == 0) - submit(Absolute_motion{ax, ay}); - else - submit(Relative_motion{rx, ry}); - break; - case EVENT_TYPE_WHEEL: submit(Wheel{rx, ry}); break; - case EVENT_TYPE_TOUCH: - { - Touch_id const id { code }; - - if (rx == -1 && ry == -1) - submit(Touch_release{id}); - else - submit(Touch{id, (float)ax, (float)ay}); - break; - } - } -} - - -Driver::Driver(Genode::Env &env) : env(env) -{ - Genode::log("--- USB HID input driver ---"); - - Lx_kit::construct_env(env); - - LX_MUTEX_INIT(dquirks_lock); - LX_MUTEX_INIT(input_mutex); - LX_MUTEX_INIT(wacom_udev_list_lock); - - Lx::scheduler(&env); - Lx::timer(&env, &ep, &heap, &jiffies); - Lx::Work::work_queue(&heap); - - main_task.construct(env.ep(), main_task_entry, reinterpret_cast(this), - "main", Lx::Task::PRIORITY_0, Lx::scheduler()); - - /* give all task a first kick before returning */ - Lx::scheduler().schedule(); -} - - -void Component::construct(Genode::Env &env) -{ - env.exec_static_constructors(); - static Driver driver(env); -} diff --git a/repos/dde_linux/src/drivers/usb_hid_legacy/target.mk b/repos/dde_linux/src/drivers/usb_hid_legacy/target.mk deleted file mode 100644 index 157943e41d..0000000000 --- a/repos/dde_linux/src/drivers/usb_hid_legacy/target.mk +++ /dev/null @@ -1,41 +0,0 @@ -TARGET := usb_hid_legacy_drv -SRC_C := dummies.c -SRC_CC := main.cc lx_emul.cc evdev.cc -SRC_CC += printf.cc bug.cc timer.cc scheduler.cc env.cc work.cc - -LIBS := base usb_hid_include lx_kit_setjmp format - -USB_CONTRIB_DIR := $(call select_from_ports,dde_linux)/src/drivers/usb_hid - -INC_DIR += $(USB_CONTRIB_DIR)/drivers/usb/core -INC_DIR += $(PRG_DIR) -INC_DIR += $(REP_DIR)/src/include - -SRC_C += drivers/hid/hid-apple.c -SRC_C += drivers/hid/hid-cherry.c -SRC_C += drivers/hid/hid-core.c -SRC_C += drivers/hid/hid-generic.c -SRC_C += drivers/hid/hid-holtek-mouse.c -SRC_C += drivers/hid/hid-input.c -SRC_C += drivers/hid/hid-microsoft.c -SRC_C += drivers/hid/hid-multitouch.c -SRC_C += drivers/hid/hid-quirks.c -SRC_C += drivers/hid/wacom_sys.c -SRC_C += drivers/hid/wacom_wac.c -SRC_C += drivers/hid/usbhid/hid-core.c -SRC_C += drivers/input/evdev.c -SRC_C += drivers/input/input-mt.c -SRC_C += drivers/input/input.c -SRC_C += drivers/usb/core/config.c -SRC_C += drivers/usb/core/generic.c -SRC_C += drivers/usb/core/quirks.c - -CC_OPT += -D__KERNEL__ -CC_C_OPT += -Wno-unused-but-set-variable -Wno-pointer-sign \ - -Wno-incompatible-pointer-types -Wno-unused-variable \ - -Wno-unused-function -Wno-uninitialized -Wno-maybe-uninitialized - -CC_CXX_WARN_STRICT = - -vpath %.c $(USB_CONTRIB_DIR) -vpath %.cc $(REP_DIR)/src/lib/legacy/lx_kit