Hid.c 24 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048
  1. /*
  2. ********************************************************************************
  3. * USB Hid Driver
  4. *
  5. * (c) Copyright 2006-2010, All winners Co,Ld.
  6. * All Right Reserved
  7. *
  8. * FileName : Hid.c
  9. *
  10. * Author : Javen
  11. *
  12. * Date : 2010/06/02
  13. *
  14. * Description : Hid Driver中对USB接口设备的处理
  15. *
  16. * Others : NULL
  17. *
  18. * History:
  19. * <time> <author> <version > <desc>
  20. * 2010.06.02 Javen 1.0 build this file
  21. *
  22. ********************************************************************************
  23. */
  24. //#include "usb_host_config.h"
  25. //#include "usb_host_base_types.h"
  26. #include "usb_os_platform.h"
  27. #include "error.h"
  28. #include "usb_utils_find_zero_bit.h"
  29. #include "usb_list.h"
  30. #include "urb.h"
  31. #include "list_head_ext.h"
  32. #include "usb_host_common.h"
  33. #include "usb_gen_dev_mod.h"
  34. #include "usb_core_interface.h"
  35. #include "usb_msg.h"
  36. #include "HidSpec.h"
  37. #include "Hid.h"
  38. #include "Hid_i.h"
  39. #include "HidTransport.h"
  40. #include "HidProtocol.h"
  41. #include "HidFunDrv.h"
  42. #define HID_DRV_NAME "HID Class"
  43. #define HID_DRV_AUTHOR "Host Driver Author"
  44. #if 0
  45. #define DMSG_HID_TEST hal_log_info
  46. #else
  47. #define DMSG_HID_TEST(...)
  48. #endif
  49. //---------------------------------------------------------------
  50. // 宏定义区
  51. //---------------------------------------------------------------
  52. //---------------------------------------------------------------
  53. // 全局变量区
  54. //---------------------------------------------------------------
  55. static struct usb_host_func_drv HidDrv;
  56. static u32 HidDev_id_array; /* 记录了设备的编号 */
  57. static struct usb_drv_dev_match_table Hid_match_table[] = {
  58. {
  59. USB_DEVICE_ID_MATCH_INT_CLASS, //match_flags;
  60. 0, //idVendor;
  61. 0, //idProduct;
  62. 0, //bcdDevice_lo;
  63. 0, //bcdDevice_hi;
  64. //Used for device class matches
  65. 0, //bDeviceClass;
  66. 0, //bDeviceSubClass;
  67. 0, //bDeviceProtocol;
  68. //Used for interface class matches
  69. USB_CLASS_HID, //bInterfaceClass;
  70. 0, //bInterfaceSubClass;
  71. 0, //bInterfaceProtocol;
  72. //not matched against
  73. 0, //driver_info;
  74. },
  75. {
  76. 0, //match_flags;
  77. 0, //idVendor;
  78. 0, //idProduct;
  79. 0, //bcdDevice_lo;
  80. 0, //bcdDevice_hi;
  81. //Used for device class matches
  82. 0, //bDeviceClass;
  83. 0, //bDeviceSubClass;
  84. 0, //bDeviceProtocol;
  85. //Used for interface class matches
  86. 0, //bInterfaceClass;
  87. 0, //bInterfaceSubClass;
  88. 0, //bInterfaceProtocol;
  89. //not matched against
  90. 0, //driver_info;
  91. }/* Terminating entry */
  92. };
  93. //---------------------------------------------------------------
  94. // 函数区定义区
  95. //---------------------------------------------------------------
  96. /*
  97. *******************************************************************************
  98. * get_HidDev_id
  99. *
  100. * Description:
  101. * 给新插入的设备分配ID
  102. *
  103. * Parameters:
  104. * void
  105. *
  106. * Return value:
  107. * 返回分配的ID
  108. *
  109. * note:
  110. * 无
  111. *
  112. *******************************************************************************
  113. */
  114. static unsigned int get_HidDev_id(void)
  115. {
  116. unsigned int bit = 0;
  117. bit = find_next_zero_bit((const volatile u32 *)&HidDev_id_array, (1 * 32), 0);
  118. if(bit > 32){
  119. hal_log_err("ERR: find_next_zero_bit failed\n");
  120. return 31;
  121. }
  122. usb_set_bit(bit, (volatile uint32_t *)&HidDev_id_array);
  123. return bit;
  124. }
  125. /*
  126. *******************************************************************************
  127. * free_HidDev_id
  128. *
  129. * Description:
  130. * 释放分配的ID
  131. *
  132. * Parameters:
  133. * bit : input. mscDev的ID号
  134. *
  135. * Return value:
  136. * 0 :成功
  137. * !0 :失败
  138. *
  139. * note:
  140. * 无
  141. *
  142. *******************************************************************************
  143. */
  144. static int free_HidDev_id(unsigned int bit)
  145. {
  146. if(usb_test_bit(bit, (volatile uint32_t *)&HidDev_id_array) == 0){
  147. hal_log_err("ERR: free_host_id: invalid bit(%d)\n", bit);
  148. return -1;
  149. }
  150. /* 回收该位 */
  151. usb_clear_bit(bit, (volatile uint32_t *)&HidDev_id_array);
  152. return 0;
  153. }
  154. /*
  155. *******************************************************************************
  156. * HidDevInit
  157. *
  158. * Description:
  159. *
  160. *
  161. * Parameters:
  162. *
  163. *
  164. * Return value:
  165. *
  166. *
  167. * note:
  168. * 无
  169. *
  170. *******************************************************************************
  171. */
  172. static int HidDevInit(HidDev_t *HidDev, struct usb_interface *intf)
  173. {
  174. int ret = 0;
  175. if(HidDev == NULL || intf == NULL){
  176. hal_log_err("ERR: HidDevInit: input error\n");
  177. return USB_ERR_BAD_ARGUMENTS;
  178. }
  179. HidDev->pusb_dev = usb_mod_interface_to_usbdev(intf);
  180. if(HidDev->pusb_dev == NULL){
  181. hal_log_err("ERR: HidDevInit: HidDev->pusb_dev == NULL\n");
  182. return USB_ERR_BAD_ARGUMENTS;
  183. }
  184. HidDev->pusb_intf = intf;
  185. HidDev->DevNo = get_HidDev_id();
  186. /* Store our private data in the interface */
  187. usb_mod_usb_set_intf_priv_data(intf, (void *)HidDev);
  188. /* alloc urb */
  189. HidDev->CurrentUrb = usb_alloc_urb(0);
  190. if(HidDev->CurrentUrb == NULL){
  191. hal_log_err("ERR: HidDevInit: usb_alloc_urb failed\n");
  192. return USB_ERR_ALLOC_URB_FAILED;
  193. }
  194. HidDev->CtrlReq = (struct usb_ctrlrequest *)usb_buffer_alloc(HidDev->pusb_dev,
  195. sizeof(struct usb_ctrlrequest),
  196. 0,
  197. NULL);
  198. if(HidDev->CtrlReq == NULL){
  199. hal_log_err("ERR: usb_buffer_alloc CtrlReq failed\n");
  200. ret = USB_ERR_MALLOC_FAILED;
  201. goto error0;
  202. }
  203. HidDev->ReportDesc = (unsigned char *)hal_malloc(USB_HID_MAX_DESCRIPTOR_SIZE);
  204. if(HidDev->ReportDesc == NULL){
  205. hal_log_err("ERR: hal_malloc failed\n");
  206. goto error1;
  207. }
  208. HidDev->UrbWait = hal_sem_create(0);
  209. if(HidDev->UrbWait == NULL){
  210. hal_log_err("ERR: USB_OS_SemCreate UrbWait failed\n");
  211. ret = USB_ERR_CREATE_SIME_FAILED;
  212. goto error2;
  213. }
  214. return USB_ERR_SUCCESS;
  215. error2:
  216. hal_free(HidDev->ReportDesc);
  217. HidDev->ReportDesc = NULL;
  218. error1:
  219. usb_buffer_free(HidDev->pusb_dev, sizeof(struct usb_ctrlrequest), (void *)(HidDev->CtrlReq), 0);
  220. HidDev->CtrlReq = NULL;
  221. error0:
  222. usb_free_urb(HidDev->CurrentUrb);
  223. HidDev->CurrentUrb = NULL;
  224. return ret;
  225. }
  226. /*
  227. *******************************************************************************
  228. * HidDevFree
  229. *
  230. * Description:
  231. *
  232. *
  233. * Parameters:
  234. *
  235. *
  236. * Return value:
  237. *
  238. *
  239. * note:
  240. * 无
  241. *
  242. *******************************************************************************
  243. */
  244. static int HidDevFree(HidDev_t *HidDev)
  245. {
  246. unsigned char err = 0;
  247. if(HidDev == NULL){
  248. hal_log_err("ERR: input error\n");
  249. return USB_ERR_BAD_ARGUMENTS;
  250. }
  251. if(HidDev->CurrentUrb){
  252. usb_free_urb(HidDev->CurrentUrb);
  253. HidDev->CurrentUrb = NULL;
  254. }
  255. if(HidDev->CtrlReq){
  256. usb_buffer_free(HidDev->pusb_dev, sizeof(struct usb_ctrlrequest), (void *)(HidDev->CtrlReq), 0);
  257. HidDev->CtrlReq = NULL;
  258. }
  259. if(HidDev->ReportDesc){
  260. hal_free(HidDev->ReportDesc);
  261. }
  262. if(HidDev->UrbWait){
  263. hal_sem_delete(HidDev->UrbWait);
  264. HidDev->UrbWait = NULL;
  265. }
  266. /* Remove our private data from the interface */
  267. usb_mod_usb_set_intf_priv_data(HidDev->pusb_intf, NULL);
  268. free_HidDev_id(HidDev->DevNo);
  269. return 0;
  270. }
  271. /*
  272. *******************************************************************************
  273. * HidGetDeviceInfo
  274. *
  275. * Description:
  276. *
  277. *
  278. * Parameters:
  279. *
  280. *
  281. * Return value:
  282. * 无
  283. *
  284. * note:
  285. * 无
  286. *
  287. *******************************************************************************
  288. */
  289. static void HidGetDeviceInfo(HidDev_t *HidDev, unsigned int index)
  290. {
  291. struct usb_interface_descriptor *idesc = &(HidDev->pusb_intf->cur_altsetting->desc);
  292. HidDev->InterfaceNo = idesc->bInterfaceNumber;
  293. HidDev->SubClass = idesc->bInterfaceSubClass;
  294. HidDev->Protocol = idesc->bInterfaceProtocol;
  295. return;
  296. }
  297. /*
  298. *******************************************************************************
  299. * HidGetTransport
  300. *
  301. * Description:
  302. *
  303. *
  304. * Parameters:
  305. *
  306. *
  307. * Return value:
  308. *
  309. *
  310. * note:
  311. * 无
  312. *
  313. *******************************************************************************
  314. */
  315. static int HidGetTransport(HidDev_t *HidDev)
  316. {
  317. HidDev->ResetRecovery = HidResetRecovery;
  318. HidDev->SoftReset = HidSoftReset;
  319. HidDev->Transport = HidTransport;
  320. HidDev->StopTransport = HidStopTransport;
  321. return USB_ERR_SUCCESS;
  322. }
  323. /*
  324. *******************************************************************************
  325. * HidCreatePipes
  326. *
  327. * Description:
  328. *
  329. *
  330. * Parameters:
  331. *
  332. *
  333. * Return value:
  334. *
  335. *
  336. * note:
  337. * 无
  338. *
  339. *******************************************************************************
  340. */
  341. static int HidCreatePipes(HidDev_t *HidDev)
  342. {
  343. struct usb_host_virt_interface *altsetting = HidDev->pusb_intf->cur_altsetting;
  344. struct usb_endpoint_descriptor *ep = NULL;
  345. struct usb_endpoint_descriptor *ep_int = NULL;
  346. int i = 0;
  347. for (i = 0; i < altsetting->desc.bNumEndpoints; i++) {
  348. ep = &altsetting->endpoint[i].desc;
  349. /* Is it an interrupt endpoint? */
  350. if ((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT) {
  351. ep_int = ep;
  352. }
  353. }
  354. if(ep_int == NULL){
  355. hal_log_err("HidCreatePipes: Endpoint sanity check failed! Rejecting dev.\n");
  356. return USB_ERR_UNKOWN_ERROR;
  357. }
  358. /* create ctrl and int pipes */
  359. HidDev->CtrlOut = usb_sndctrlpipe(HidDev->pusb_dev, 0);
  360. HidDev->CtrlIn = usb_rcvctrlpipe(HidDev->pusb_dev, 0);
  361. HidDev->IntIn = usb_rcvintpipe(HidDev->pusb_dev,
  362. ep_int->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
  363. HidDev->EpInterval = ep_int->bInterval;
  364. HidDev->OnceTransferLength = ep_int->wMaxPacketSize;
  365. return USB_ERR_SUCCESS;
  366. }
  367. /*
  368. *******************************************************************************
  369. * HidSetDeviceState
  370. *
  371. * Description:
  372. *
  373. *
  374. * Parameters:
  375. *
  376. *
  377. * Return value:
  378. *
  379. *
  380. * note:
  381. * 无
  382. *
  383. *******************************************************************************
  384. */
  385. void HidSetDeviceState(HidDev_t *HidDev, HidDev_State_t state)
  386. {
  387. unsigned int cup_sr = 0;
  388. ENTER_CRITICAL(cup_sr);
  389. HidDev->State = state;
  390. EXIT_CRITICAL(cup_sr);
  391. }
  392. /*
  393. *******************************************************************************
  394. * HidParseReport
  395. *
  396. * Description:
  397. *
  398. *
  399. * Parameters:
  400. *
  401. *
  402. * Return value:
  403. *
  404. *
  405. * note:
  406. * 无
  407. *
  408. *******************************************************************************
  409. */
  410. int HidGetInputReport(HidDev_t *HidDev,
  411. unsigned int Usagepage,
  412. unsigned int Usage,
  413. unsigned int *BitOffset,
  414. unsigned int *BitCount)
  415. {
  416. usbHidReportEnum_t *InputReport = NULL;
  417. usbHidReport_t *Report = NULL;
  418. usbHidField_t *Field = NULL;
  419. usbHidUsage_t *ReportUsage = NULL;
  420. unsigned int Offset_ReportId = 0; /* 如果有ReportId, 那么data[0]就不能够算在BitOffset里 */
  421. unsigned int i = 0;
  422. unsigned int j = 0;
  423. unsigned int k = 0;
  424. InputReport = HidDev->HidReportEnum + USB_HID_REPORT_INPUT;
  425. if(InputReport == NULL){
  426. hal_log_err("ERR: InputReport is NULL\n");
  427. return USB_ERR_BAD_ARGUMENTS;
  428. }
  429. /* Device uses numbered reports, data[0] is report number */
  430. if(InputReport->numbered){
  431. Offset_ReportId = 8;
  432. }
  433. hal_log_info("InputReport ReportNum = %d\n", InputReport->ReportNum);
  434. /* report */
  435. for(i = 0; i < InputReport->ReportNum; i++){
  436. Report = InputReport->Report[i];
  437. if(Report == NULL){
  438. hal_log_err("ERR: Report is NULL\n");
  439. continue;
  440. }
  441. /* field */
  442. for(j = 0; j < Report->Maxfield; j++){
  443. Field = Report->Field[j];
  444. if(Field == NULL){
  445. hal_log_err("ERR: Field is NULL\n");
  446. continue;
  447. }
  448. /* Usage */
  449. for(k = 0; k < Field->maxusage; k++){
  450. ReportUsage = &Field->usage[k];
  451. if(ReportUsage == NULL){
  452. hal_log_err("ERR: Usage is NULL\n");
  453. continue;
  454. }
  455. if(Usage == USB_HID_GENERIC_DESKTOP_PAGE_UNDEFINED){
  456. if(((ReportUsage->hid >> 16) & 0xffff) == Usagepage){
  457. DMSG_HID_TEST("Find Bitmap: Usage(%x), Id = %d, report_offset = %d, report_size = %d\n",
  458. Usagepage, ((Offset_ReportId == 0) ? 0 : 1),
  459. Field->report_offset, (Field->report_size * k));
  460. *BitOffset = Offset_ReportId + Field->report_offset + (Field->report_size * k);
  461. *BitCount = Field->report_size * Field->report_count;
  462. DMSG_HID_TEST("Usage(%x), BitOffset = %d, BitCount = %d\n",
  463. Usagepage, *BitOffset, *BitCount);
  464. return USB_ERR_SUCCESS;
  465. }
  466. }else{
  467. if(ReportUsage->hid == ((Usagepage << 16) | Usage)){
  468. DMSG_HID_TEST("Find Bitmap: usage(%x, %x), Id = %d, report_offset = %d, report_size = %d\n",
  469. Usagepage, Usage, ((Offset_ReportId == 0) ? 0 : 1),
  470. Field->report_offset, (Field->report_size * k));
  471. *BitOffset = Offset_ReportId + Field->report_offset + (Field->report_size * k);
  472. *BitCount = Field->report_size;
  473. DMSG_HID_TEST("usage(%x, %x), BitOffset = %d, BitCount = %d\n",
  474. Usagepage, Usage, *BitOffset, *BitCount);
  475. return USB_ERR_SUCCESS;
  476. }
  477. }
  478. }
  479. }
  480. }
  481. return USB_ERR_UNKOWN_ERROR;
  482. }
  483. /*
  484. *******************************************************************************
  485. * HidDevScan
  486. *
  487. * Description:
  488. *
  489. *
  490. * Parameters:
  491. *
  492. *
  493. * Return value:
  494. *
  495. *
  496. * note:
  497. * 无
  498. *
  499. *******************************************************************************
  500. */
  501. static int HidDevScan(HidDev_t *HidDev)
  502. {
  503. struct usb_host_virt_interface *cur_alt = NULL;
  504. usbHidDescriptor_t *HidDesc = NULL;
  505. int ret = 0;
  506. unsigned int i = 0;
  507. if(HidDev == NULL){
  508. hal_log_err("ERR: HidDevScan: input error\n");
  509. return USB_ERR_BAD_ARGUMENTS;
  510. }
  511. /* initalize parameter */
  512. cur_alt = HidDev->pusb_intf->cur_altsetting;
  513. /* get device type */
  514. HidDev->DevType = cur_alt->desc.bInterfaceProtocol;
  515. /* Get Hid descriptor */
  516. if (usb_get_extra_descriptor(cur_alt, USB_HID_DT_HID, &HidDesc)
  517. &&(!cur_alt->desc.bNumEndpoints
  518. || usb_get_extra_descriptor(&(cur_alt->endpoint[0]), USB_HID_DT_HID, &HidDesc))){
  519. hal_log_err("ERR: class descriptor not present\n");
  520. return USB_ERR_UNKOWN_ERROR;
  521. }
  522. /* 获得report返回的数据长度 */
  523. for (i = 0; i < HidDesc->bNumDescriptors; i++){
  524. if (HidDesc->desc[i].bDescriptorType == USB_HID_DT_REPORT){
  525. HidDev->ReportSize = le16_to_cpu(HidDesc->desc[i].wDescriptorLength);
  526. break;
  527. }
  528. }
  529. if (HidDev->ReportSize == 0 || HidDev->ReportSize > USB_HID_MAX_DESCRIPTOR_SIZE) {
  530. hal_log_err("ERR: weird size of report descriptor (%u)\n", HidDev->ReportSize);
  531. return USB_ERR_UNKOWN_ERROR;
  532. }
  533. /* set idle request, 限制了report的频率 */
  534. HidSetIlde(HidDev, HidDev->InterfaceNo, 0, 0);
  535. /* Get Hid Report descriptor */
  536. ret = HidGetClassDescriptor(HidDev,
  537. HidDev->InterfaceNo,
  538. USB_HID_DT_REPORT,
  539. (void *)HidDev->ReportDesc,
  540. HidDev->ReportSize);
  541. if(ret != USB_ERR_SUCCESS){
  542. hal_log_err("ERR: HidGetClassDescriptor failed\n");
  543. return USB_ERR_COMMAND_EXECUTE_FAILED;
  544. }
  545. /* parse Hid Report descriptor */
  546. HidParseReport(HidDev->ReportDesc, HidDev->ReportSize, HidDev);
  547. /* Client probe */
  548. switch(HidDev->DevType){
  549. case USB_HID_PROTOCOL_MOUSE:
  550. HidDev->ClientProbe = usbMouseProbe;
  551. HidDev->ClientRemove = usbMouseRemove;
  552. break;
  553. /*
  554. case USB_HID_PROTOCOL_KEYBOARD:
  555. HidDev->ClientProbe = usbKeyBoardProbe;
  556. HidDev->ClientRemove = usbKeyBoardRemove;
  557. break;
  558. */
  559. default:
  560. hal_log_err("ERR: HidDevScan: unkown hid Device Type(%x)\n", HidDev->DevType);
  561. HidDev->ClientProbe = NULL;
  562. HidDev->ClientRemove = NULL;
  563. return USB_ERR_UNKOWN_DEVICE;
  564. }
  565. if(HidDev->ClientProbe){
  566. if(HidDev->ClientProbe(HidDev) != USB_ERR_SUCCESS){
  567. hal_log_err("ERR: ClientProbe faield\n");
  568. return USB_ERR_DEVICE_PROBE_FAILED;
  569. }
  570. }
  571. return USB_ERR_SUCCESS;
  572. }
  573. /*
  574. *******************************************************************************
  575. * HidDevAdd
  576. *
  577. * Description:
  578. *
  579. *
  580. * Parameters:
  581. *
  582. *
  583. * Return value:
  584. *
  585. *
  586. * note:
  587. * 无
  588. *
  589. *******************************************************************************
  590. */
  591. static int HidDevAdd(HidDev_t * HidDev)
  592. {
  593. return HidDevScan(HidDev);
  594. }
  595. /*
  596. *******************************************************************************
  597. * HidDevDel
  598. *
  599. * Description:
  600. *
  601. *
  602. * Parameters:
  603. *
  604. *
  605. * Return value:
  606. *
  607. *
  608. * note:
  609. * 无
  610. *
  611. *******************************************************************************
  612. */
  613. static int HidDevDel(HidDev_t * HidDev)
  614. {
  615. if(HidDev->ClientRemove){
  616. if(HidDev->ClientRemove(HidDev) != USB_ERR_SUCCESS){
  617. hal_log_err("ERR: ClientProbe faield\n");
  618. return USB_ERR_DEVICE_PROBE_FAILED;
  619. }
  620. }
  621. HidFreeReport(HidDev);
  622. return USB_ERR_SUCCESS;
  623. }
  624. /*
  625. *******************************************************************************
  626. * HidSentRequest
  627. *
  628. * Description:
  629. *
  630. *
  631. * Parameters:
  632. *
  633. *
  634. * Return value:
  635. *
  636. *
  637. * note:
  638. * 无
  639. *
  640. *******************************************************************************
  641. */
  642. int HidSentRequest(HidRequest_t *HidReq)
  643. {
  644. HidDev_t *HidDev = NULL;
  645. unsigned int cpu_sr = 0;
  646. int ret = 0;
  647. if(HidReq == NULL){
  648. hal_log_err("ERR: HidSentRequest: input error\n");
  649. return USB_ERR_BAD_ARGUMENTS;
  650. }
  651. HidDev = HidReq->HidDev;
  652. if(HidDev == NULL){
  653. hal_log_err("ERR: HidSentRequest: HidDev == NULL\n");
  654. return USB_ERR_BAD_ARGUMENTS;
  655. }
  656. /* Transport */
  657. ret = HidDev->Transport(HidDev, HidReq);
  658. ENTER_CRITICAL(cpu_sr);
  659. HidReq->Result = ret;
  660. EXIT_CRITICAL(cpu_sr);
  661. /* HidReq Done */
  662. HidReq->Done(HidReq);
  663. return USB_ERR_SUCCESS;
  664. }
  665. /*
  666. *******************************************************************************
  667. * HidDevProbe
  668. *
  669. * Description:
  670. *
  671. *
  672. * Parameters:
  673. *
  674. *
  675. * Return value:
  676. *
  677. *
  678. * note:
  679. * 无
  680. *
  681. *******************************************************************************
  682. */
  683. static int32_t HidDevProbe(struct usb_interface *intf, const struct usb_drv_dev_match_table * table_item)
  684. {
  685. const s32 match_table_index = table_item - Hid_match_table;
  686. HidDev_t *HidDev = NULL;
  687. int ret = 0;
  688. // unsigned char err = 0;
  689. hal_log_info("HidDevProbe begin\n");
  690. if(intf == NULL || table_item == NULL){
  691. hal_log_err("ERR: HidDevProbe: input error\n");
  692. return -1;
  693. }
  694. //----------------------------------------------------------------
  695. // 创建HidDev设备
  696. //----------------------------------------------------------------
  697. /* 初始化一个mscDev */
  698. HidDev = hal_malloc(sizeof(HidDev_t));
  699. if(HidDev == NULL){
  700. hal_log_err("ERR: HidDevProbe malloc failed\n");
  701. goto error0;
  702. }
  703. memset(HidDev, 0, sizeof(HidDev_t));
  704. ret = HidDevInit(HidDev, intf);
  705. if(ret != USB_ERR_SUCCESS){
  706. hal_log_err("ERR: HidDevProbe failed\n");
  707. ret = -1;
  708. goto error1;
  709. }
  710. /* 获得设备信息 */
  711. HidGetDeviceInfo(HidDev, match_table_index);
  712. /* 获得Transport */
  713. ret = HidGetTransport(HidDev);
  714. if(ret != USB_ERR_SUCCESS){
  715. hal_log_err("ERR: HidGetTransport failed\n");
  716. ret = -1;
  717. goto error2;
  718. }
  719. /* 创建传输管道 */
  720. ret = HidCreatePipes(HidDev);
  721. if(ret != USB_ERR_SUCCESS){
  722. hal_log_err("ERR: HidGetTransport failed\n");
  723. ret = -1;
  724. goto error3;
  725. }
  726. HidSetDeviceState(HidDev, HID_DEV_ONLINE);
  727. //----------------------------------------------------------------
  728. // 识别HidDev设备
  729. //----------------------------------------------------------------
  730. ret = HidDevAdd(HidDev);
  731. if(ret != USB_ERR_SUCCESS){
  732. hal_log_err("ERR: HidDevScan failed\n");
  733. ret = -1;
  734. goto error4;
  735. }
  736. return 0;
  737. error4:
  738. HidSetDeviceState(HidDev, HID_DEV_OFFLINE);
  739. error3:
  740. error2:
  741. HidDevFree(HidDev);
  742. error1:
  743. hal_free(HidDev);
  744. error0:
  745. return -1;
  746. }
  747. /*
  748. *******************************************************************************
  749. * HidInit
  750. *
  751. * Description:
  752. *
  753. *
  754. * Parameters:
  755. *
  756. *
  757. * Return value:
  758. * EPDK_OK / EPDK_FAIL
  759. *
  760. * note:
  761. * 无
  762. *
  763. *******************************************************************************
  764. */
  765. static int32_t HidDevSuspend(struct usb_interface *intf)
  766. {
  767. hal_log_info("HidDevSuspend not support\n");
  768. return 0;
  769. }
  770. /*
  771. *******************************************************************************
  772. * HidInit
  773. *
  774. * Description:
  775. *
  776. *
  777. * Parameters:
  778. *
  779. *
  780. * Return value:
  781. * EPDK_OK / EPDK_FAIL
  782. *
  783. * note:
  784. * 无
  785. *
  786. *******************************************************************************
  787. */
  788. static void HidDevRemove(struct usb_interface *intf)
  789. {
  790. HidDev_t *HidDev = NULL;
  791. if(intf == NULL){
  792. hal_log_err("ERR: HidDevRemoves: input error\n");
  793. return ;
  794. }
  795. HidDev = (HidDev_t *)usb_mod_usb_get_intf_priv_data(intf);
  796. if(HidDev == NULL){
  797. hal_log_err("ERR: HidDev = NULL\n");
  798. return ;
  799. }
  800. HidSetDeviceState(HidDev, HID_DEV_OFFLINE);
  801. HidDevDel(HidDev);
  802. HidDevFree(HidDev);
  803. hal_free(HidDev);
  804. hal_log_info("HidDevRemove complete\n");
  805. return ;
  806. }
  807. /*
  808. *******************************************************************************
  809. * HidInit
  810. *
  811. * Description:
  812. *
  813. *
  814. * Parameters:
  815. *
  816. *
  817. * Return value:
  818. * EPDK_OK / EPDK_FAIL
  819. *
  820. * note:
  821. * 无
  822. *
  823. *******************************************************************************
  824. */
  825. static int HidDriverInit(struct usb_host_func_drv *drv)
  826. {
  827. if(drv == NULL){
  828. hal_log_err("ERR: mscDrv_init: input error\n");
  829. return -1;
  830. }
  831. USB_INIT_LIST_HEAD(&(drv->virt_dev_list));
  832. drv->func_drv_name = HID_DRV_NAME;
  833. drv->func_drv_auther = HID_DRV_AUTHOR;
  834. drv->probe = HidDevProbe;
  835. drv->disconnect = HidDevRemove;
  836. drv->suspend = HidDevSuspend;
  837. drv->resume = NULL;
  838. drv->match_table = Hid_match_table;
  839. return 0;
  840. }
  841. /*
  842. *******************************************************************************
  843. * HidInit
  844. *
  845. * Description:
  846. *
  847. *
  848. * Parameters:
  849. *
  850. *
  851. * Return value:
  852. * EPDK_OK / EPDK_FAIL
  853. *
  854. * note:
  855. * 无
  856. *
  857. *******************************************************************************
  858. */
  859. int HidInit(void)
  860. {
  861. int ret = 0;
  862. memset(&HidDrv, 0, sizeof(struct usb_host_func_drv));
  863. if(HidDriverInit(&HidDrv) != 0){
  864. hal_log_err("ERR: HidDriverInit failed\n");
  865. return -1;
  866. }
  867. ret = usb_host_func_drv_reg(&HidDrv);
  868. if(ret != 0){
  869. hal_log_err("ERR: HidInit: Reg driver %s failed\n", HidDrv.func_drv_name);
  870. return -1;
  871. }
  872. return 0;
  873. }
  874. /*
  875. *******************************************************************************
  876. * HidExit
  877. *
  878. * Description:
  879. *
  880. *
  881. * Parameters:
  882. *
  883. *
  884. * Return value:
  885. * EPDK_OK / EPDK_FAIL
  886. *
  887. * note:
  888. * 无
  889. *
  890. *******************************************************************************
  891. */
  892. int HidExit(void)
  893. {
  894. int ret = 0;
  895. ret = usb_host_func_drv_unreg(&HidDrv);
  896. if(ret != 0){
  897. hal_log_err("ERR: HidExit: UnReg driver %s failed\n", HidDrv.func_drv_name);
  898. return -1;
  899. }
  900. memset(&HidDrv, 0, sizeof(struct usb_host_func_drv));
  901. return 0;
  902. }