瀏覽代碼

HID: wiimote: Add wiimote event handler

Create array of all event handlers and call each handler when we
receive the related event.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
David Herrmann 14 年之前
父節點
當前提交
a4d1919762
共有 1 個文件被更改,包括 18 次插入0 次删除
  1. 18 0
      drivers/hid/hid-wiimote.c

+ 18 - 0
drivers/hid/hid-wiimote.c

@@ -130,10 +130,22 @@ static int wiimote_input_event(struct input_dev *dev, unsigned int type,
 	return 0;
 	return 0;
 }
 }
 
 
+struct wiiproto_handler {
+	__u8 id;
+	size_t size;
+	void (*func)(struct wiimote_data *wdata, const __u8 *payload);
+};
+
+static struct wiiproto_handler handlers[] = {
+	{ .id = 0 }
+};
+
 static int wiimote_hid_event(struct hid_device *hdev, struct hid_report *report,
 static int wiimote_hid_event(struct hid_device *hdev, struct hid_report *report,
 							u8 *raw_data, int size)
 							u8 *raw_data, int size)
 {
 {
 	struct wiimote_data *wdata = hid_get_drvdata(hdev);
 	struct wiimote_data *wdata = hid_get_drvdata(hdev);
+	struct wiiproto_handler *h;
+	int i;
 
 
 	if (!atomic_read(&wdata->ready))
 	if (!atomic_read(&wdata->ready))
 		return -EBUSY;
 		return -EBUSY;
@@ -143,6 +155,12 @@ static int wiimote_hid_event(struct hid_device *hdev, struct hid_report *report,
 	if (size < 1)
 	if (size < 1)
 		return -EINVAL;
 		return -EINVAL;
 
 
+	for (i = 0; handlers[i].id; ++i) {
+		h = &handlers[i];
+		if (h->id == raw_data[0] && h->size < size)
+			h->func(wdata, &raw_data[1]);
+	}
+
 	return 0;
 	return 0;
 }
 }