M4521_BSP V3.02.000
The Board Support Package for M4521
hid_driver.c
Go to the documentation of this file.
1/**************************************************************************/
13#include <stdio.h>
14#include <string.h>
15
16#include "M4521.h"
17#include "usbh_core.h"
18
19#include "usbh_hid.h"
20
21
39
40static HID_DEV_T g_hid_dev[CONFIG_HID_MAX_DEV];
41
42static HID_DEV_T *g_hdev_list = NULL;
43
44static HID_DEV_T *alloc_hid_device(void)
45{
46 int i;
47
48 for (i = 0; i < CONFIG_HID_MAX_DEV; i++)
49 {
50 if (g_hid_dev[i].udev == NULL)
51 {
52 memset((char *)&g_hid_dev[i], 0, sizeof(HID_DEV_T));
53 return &g_hid_dev[i];
54 }
55 }
56 return NULL;
57}
58
59void free_hid_device(HID_DEV_T *hid_dev)
60{
61 hid_dev->udev = NULL;
62 memset((char *)hid_dev, 0, sizeof(HID_DEV_T));
63}
64
65HID_DEV_T *find_hid_deivce_by_urb(URB_T *urb)
66{
67 int i;
68
69 if (urb->dev == NULL)
70 return NULL;
71
72 for (i = 0; i < CONFIG_HID_MAX_DEV; i++)
73 {
74 if (g_hid_dev[i].udev == urb->dev)
75 {
76 if ((g_hid_dev[i].urbin == urb) || (g_hid_dev[i].urbout == urb))
77 return &g_hid_dev[i];
78 }
79 }
80 return NULL;
81}
82
83int find_hid_device(HID_DEV_T *hdev)
84{
85 int i;
86
87 for (i = 0; i < CONFIG_HID_MAX_DEV; i++)
88 {
89 if (&g_hid_dev[i] == hdev)
90 {
91 return TRUE;
92 }
93 }
94 return FALSE;
95}
96
97static int usbhid_probe(USB_DEV_T *dev, USB_IF_DESC_T *ifd, const USB_DEV_ID_T *id)
98{
99 EP_INFO_T *ep_info;
100 int ifnum;
101 HID_DEV_T *hid, *p;
102 int i;
103
104 HID_DBGMSG("usbhid_probe - dev=0x%x\n", (int)dev);
105
106 ifnum = ifd->bInterfaceNumber;
107
108 HID_DBGMSG("HID probe called for ifnum %d\n", ifnum);
109
110 ep_info = NULL;
111 for (i = 0; i < dev->ep_list_cnt; i++)
112 {
113 if ((dev->ep_list[i].ifnum == ifnum) &&
114 ((dev->ep_list[i].bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT))
115 {
116 ep_info = &dev->ep_list[i];
117 HID_DBGMSG("Interrupt Endpoint 0x%x found.\n", ep_info->bEndpointAddress);
118 }
119 }
120 if (ep_info == NULL)
121 {
122 HID_DBGMSG("couldn't find an input interrupt endpoint\n");
123 return USB_ERR_NODEV;
124 }
125
126 hid = alloc_hid_device();
127 if (hid == NULL)
128 return USB_ERR_NODEV;
129
130 HID_DBGMSG("New HID device 0x%x.\n", (int)hid);
131
132 hid->ifnum = ifnum;
133 hid->udev = dev;
134 hid->next = NULL;
135 hid->bSubClassCode = ifd->bInterfaceSubClass;
136 hid->bProtocolCode = ifd->bInterfaceProtocol;
137
138 /*
139 * Chaining newly found HID device to end of HID device list.
140 */
141 if (g_hdev_list == NULL)
142 g_hdev_list = hid;
143 else
144 {
145 for (p = g_hdev_list; p->next != NULL; p = p->next)
146 ;
147 p->next = hid;
148 }
149
150 return 0;
151}
152
153
154static void hid_disconnect(USB_DEV_T *dev)
155{
156 HID_DEV_T *hid_dev, *p;
157 int i;
158
159 HID_DBGMSG("HID device disconnected!\n");
160
161 for (i = 0; i < CONFIG_HID_MAX_DEV; i++)
162 {
163 if (g_hid_dev[i].udev == dev)
164 {
165 hid_dev = &g_hid_dev[i];
166
167 if (hid_dev->urbin)
168 {
169 USBH_UnlinkUrb(hid_dev->urbin);
170 USBH_FreeUrb(hid_dev->urbin);
171 }
172 if (hid_dev->urbout)
173 {
174 USBH_UnlinkUrb(hid_dev->urbout);
175 USBH_FreeUrb(hid_dev->urbout);
176 }
177
178 /*
179 * Remove this HID device from HID device list.
180 */
181 if (hid_dev == g_hdev_list)
182 g_hdev_list = g_hdev_list->next;
183 else
184 {
185 for (p = g_hdev_list; p != NULL; p = p->next)
186 {
187 if (p->next == hid_dev)
188 {
189 p->next = hid_dev->next;
190 break;
191 }
192 }
193 }
194 free_hid_device(hid_dev);
195 }
196 }
197}
198
199
200#define USB_INTERFACE_CLASS_HID 3
201
202static USB_DEV_ID_T hid_id_table[] =
203{
204 USB_DEVICE_ID_MATCH_INT_CLASS, /* match_flags */
205 0, 0, 0, 0, 0, 0, 0,
206 USB_INTERFACE_CLASS_HID, /* bInterfaceClass */
207 0, 0, 0
208};
209
210
211static USB_DRIVER_T hid_driver =
212{
213 "hid driver",
214 usbhid_probe,
215 hid_disconnect,
216 hid_id_table,
217 NULL, /* suspend */
218 NULL, /* resume */
219 {NULL,NULL} /* driver_list */
220};
221
222
223EP_INFO_T *hid_get_ep_info(USB_DEV_T *dev, int ifnum, uint16_t dir)
224{
225 int i;
226
227 for (i = 0; i < dev->ep_list_cnt; i++)
228 {
229 if ((dev->ep_list[i].ifnum == ifnum) &&
230 ((dev->ep_list[i].bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT))
231 {
232 if ((dev->ep_list[i].bEndpointAddress & USB_ENDPOINT_DIR_MASK) == dir)
233 {
234 //printf("Endpoint found: 0x%x\n", dev->ep_list[i].bEndpointAddress);
235 return &dev->ep_list[i];
236 }
237 }
238 }
239 return NULL;
240}
241
243
244
249void USBH_HidInit(void)
250{
251 memset((char *)&g_hid_dev[0], 0, sizeof(g_hid_dev));
252 g_hdev_list = NULL;
253 USBH_RegisterDriver(&hid_driver);
254}
255
256
266{
267 return g_hdev_list;
268}
269
270 /* end of group USBH_HID_EXPORTED_FUNCTIONS */
272 /* end of group USBH_HID_Driver */
274 /* end of group USB_Host_Driver */
276 /* end of group Component_Library */
278
279
280
281
#define NULL
Definition: M4521.h:13912
#define TRUE
Definition: M4521.h:13905
#define FALSE
Definition: M4521.h:13908
int32_t USBH_RegisterDriver(USB_DRIVER_T *new_driver)
Register a device driver to USB Host Core driver.
Definition: usbh_core.c:78
struct usb_device * dev
Definition: usbh_core.h:519
int32_t USBH_UnlinkUrb(URB_T *urb)
Cancel an URB which has been submit to USB core.
Definition: usbh_core.c:237
void USBH_FreeUrb(URB_T *)
Free the URB allocated from USBH_AllocUrb()
Definition: usbh_support.c:99
#define CONFIG_HID_MAX_DEV
Definition: usbh_hid.h:42
USB_DEV_T * udev
Definition: usbh_hid.h:100
URB_T * urbin
Definition: usbh_hid.h:104
struct usbhid_dev * next
Definition: usbh_hid.h:109
URB_T * urbout
Definition: usbh_hid.h:105
void USBH_HidInit(void)
Init USB Host HID driver.
Definition: hid_driver.c:249
uint8_t bProtocolCode
Definition: usbh_hid.h:103
HID_DEV_T * USBH_HidGetDeviceList(void)
Get a list of currently connected USB Hid devices.
Definition: hid_driver.c:265
int ifnum
Definition: usbh_hid.h:101
uint8_t bSubClassCode
Definition: usbh_hid.h:102
USB Host core driver header file.
USB_IF_DESC_T
Definition: usbh_core.h:315
HIDDEN_SYMBOLS struct usb_device USB_DEV_T
#define USB_ERR_NODEV
Definition: usbh_err_code.h:11