fusb_debug.c 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. /*
  2. * Copyright : (C) 2022 Phytium Information Technology, Inc.
  3. * All Rights Reserved.
  4. *
  5. * This program is OPEN SOURCE software: you can redistribute it and/or modify it
  6. * under the terms of the Phytium Public License as published by the Phytium Technology Co.,Ltd,
  7. * either version 1.0 of the License, or (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY;
  10. * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. * See the Phytium Public License for more details.
  12. *
  13. *
  14. * FilePath: fusb_debug.c
  15. * Date: 2022-02-11 13:33:11
  16. * LastEditTime: 2022-02-18 09:18:04
  17. * Description:  This files is for implmentation of USB debug utilities
  18. *
  19. * Modify History:
  20. * Ver   Who        Date         Changes
  21. * ----- ------     --------    --------------------------------------
  22. * 1.0 Zhugengyu 2022/2/7 init commit
  23. */
  24. #include "fdebug.h"
  25. #include "fusb_private.h"
  26. #define FUSB_DEBUG_TAG "FUSB_DEBUG"
  27. #define FUSB_ERROR(format, ...) FT_DEBUG_PRINT_E(FUSB_DEBUG_TAG, format, ##__VA_ARGS__)
  28. #define FUSB_WARN(format, ...) FT_DEBUG_PRINT_W(FUSB_DEBUG_TAG, format, ##__VA_ARGS__)
  29. #define FUSB_INFO(format, ...) FT_DEBUG_PRINT_I(FUSB_DEBUG_TAG, format, ##__VA_ARGS__)
  30. #define FUSB_DEBUG(format, ...) FT_DEBUG_PRINT_D(FUSB_DEBUG_TAG, format, ##__VA_ARGS__)
  31. static inline boolean FUsbIsValidStringIndex(u8 id)
  32. {
  33. return (0 != id) && (0xff != id);
  34. }
  35. /**
  36. * @name: FUsbDumpAllDescriptors
  37. * @msg: 打印USB设备的描述符信息(设备描述符,配置描述符和接口描述符)
  38. * @return {*}
  39. * @param {FUsbDev} *dev, USB设备实例,已完成初始化
  40. */
  41. void FUsbDumpAllDescriptors(FUsbDev *dev)
  42. {
  43. FError ret = FUSB_SUCCESS;
  44. if ((NULL == dev) || (NULL == dev->configuration))
  45. return;
  46. const FUsbDeviceDescriptor *dev_desc = NULL;
  47. const FUsbConfigurationDescriptor *config_desc = NULL;
  48. const FUsbInterfaceDescriptor *if_desc = NULL;
  49. FASSERT(dev->controller && dev->controller->usb);
  50. FUsb *instance = dev->controller->usb;
  51. u8 if_num = 0;
  52. u8 func_id = 0;
  53. FUsbConfigParser *parser = &dev->config_parser;
  54. dev_desc = dev->descriptor;
  55. config_desc = dev->configuration;
  56. /* init descriptor parser in each dump */
  57. ret = FUsbSetupConfigParser(dev, config_desc, config_desc->wTotalLength);
  58. FUsbSetupStringParser(dev);
  59. if (FUSB_SUCCESS != ret)
  60. return;
  61. if (FUsbIsValidStringIndex(dev_desc->iManufacturer))
  62. {
  63. ret = FUsbSearchStringDescriptor(instance, dev, dev_desc->iManufacturer);
  64. if (FUSB_SUCCESS == ret)
  65. printf(" Manufacturer: %s\r\n", FUsbGetString(dev));
  66. }
  67. if (FUsbIsValidStringIndex(dev_desc->iProduct))
  68. {
  69. ret = FUsbSearchStringDescriptor(instance, dev, dev_desc->iProduct);
  70. if (FUSB_SUCCESS == ret)
  71. printf(" Product: %s\r\n", FUsbGetString(dev));
  72. }
  73. if (FUsbIsValidStringIndex(dev_desc->iSerialNumber))
  74. {
  75. ret = FUsbSearchStringDescriptor(instance, dev, dev_desc->iSerialNumber);
  76. if (FUSB_SUCCESS == ret)
  77. printf(" Serial No.: %s\r\n", FUsbGetString(dev));
  78. }
  79. while (NULL != (if_desc = (const FUsbInterfaceDescriptor *)FUsbGetDescriptorFromParser(parser, FUSB_DESC_TYPE_INTERFACE)))
  80. {
  81. if (if_desc->bInterfaceNumber > if_num)
  82. {
  83. if_num = if_desc->bInterfaceNumber;
  84. }
  85. if (if_desc->bInterfaceNumber != if_num)
  86. {
  87. FUSB_INFO("Alternate setting %u ignored", if_desc->bInterfaceNumber);
  88. continue;
  89. }
  90. if (FUsbIsValidStringIndex(if_desc->iInterface))
  91. {
  92. ret = FUsbSearchStringDescriptor(instance, dev, if_desc->iInterface);
  93. if (FUSB_SUCCESS == ret)
  94. printf(" Interface: %s\r\n", FUsbGetString(dev));
  95. }
  96. }
  97. /* revoke descriptor parser after used */
  98. FUsbRevokeConfigParser(dev);
  99. FUsbRevokeStringParser(dev);
  100. return;
  101. }
  102. /**
  103. * @name: FUsbDumpDeviceDescriptor
  104. * @msg: 打印设备描述符信息
  105. * @return {*}
  106. * @param {FUsbDeviceDescriptor} *descriptor, 设备描述符
  107. */
  108. void FUsbDumpDeviceDescriptor(const FUsbDeviceDescriptor *descriptor)
  109. {
  110. if (NULL != descriptor)
  111. {
  112. FUSB_INFO("");
  113. FUSB_INFO("===Device Descriptor");
  114. FUSB_INFO(" bLength: %d", descriptor->bLength);
  115. FUSB_INFO(" bDescriptorType: %d", descriptor->bDescriptorType);
  116. FUSB_INFO(" bcdUSB: 0x%x", descriptor->bcdUSB);
  117. FUSB_INFO(" bDeviceClass: %d", descriptor->bDeviceClass);
  118. FUSB_INFO(" bDeviceSubClass: %d", descriptor->bDeviceSubClass);
  119. FUSB_INFO(" bDeviceProtocol: %d", descriptor->bDeviceProtocol);
  120. FUSB_INFO(" bMaxPacketSize0: %d", descriptor->bMaxPacketSize0);
  121. FUSB_INFO(" idVendor: 0x%x", descriptor->idVendor);
  122. FUSB_INFO(" idProduct: 0x%x", descriptor->idProduct);
  123. FUSB_INFO(" bcdDevice: 0x%x", descriptor->bcdDevice);
  124. FUSB_INFO(" iManufacturer: %d", descriptor->iManufacturer);
  125. FUSB_INFO(" iSerialNumber: %d", descriptor->iSerialNumber);
  126. FUSB_INFO(" bNumConfigurations: %d", descriptor->bNumConfigurations);
  127. FUSB_INFO("");
  128. }
  129. }
  130. /**
  131. * @name: FUsbDumpConfigDescriptor
  132. * @msg: 打印配置描述符信息
  133. * @return {*}
  134. * @param {FUsbConfigurationDescriptor} *descriptor, 配置描述符
  135. */
  136. void FUsbDumpConfigDescriptor(const FUsbConfigurationDescriptor *descriptor)
  137. {
  138. if (NULL != descriptor)
  139. {
  140. FUSB_INFO("");
  141. FUSB_INFO("===Configure Descriptor");
  142. FUSB_INFO(" bLength: %d", descriptor->bLength);
  143. FUSB_INFO(" bDescriptorType: %d", descriptor->bDescriptorType);
  144. FUSB_INFO(" wTotalLength: %d", descriptor->wTotalLength);
  145. FUSB_INFO(" bNumInterfaces: %d", descriptor->bNumInterfaces); /* 该配置下有多少个接口描述符 */
  146. FUSB_INFO(" bConfigurationValue: %d", descriptor->bConfigurationValue); /* 该配置描述符的配置号信息 */
  147. FUSB_INFO(" iConfiguration: %d", descriptor->iConfiguration);
  148. FUSB_INFO(" bmAttributes: 0x%x", descriptor->bmAttributes);
  149. FUSB_INFO(" remote-weakup: %s",
  150. (descriptor->bmAttributes & FUSB_CONFIG_DESC_ATTR_REMOTE_WEAKUP) ? "yes" : "no");
  151. FUSB_INFO(" self-power: %s",
  152. (descriptor->bmAttributes & FUSB_CONFIG_DESC_ATTR_SELF_POWER) ? "yes" : "no");
  153. FUSB_INFO(" usb1.0-compatible: %s",
  154. (descriptor->bmAttributes & FUSB_CONFIG_DESC_ATTR_USB1_COMPATIABLE) ? "yes" : "no");
  155. FUSB_INFO(" max power: %dmA", 2 * (descriptor->bMaxPower));
  156. FUSB_INFO(" ");
  157. }
  158. }
  159. /**
  160. * @name: FUsbDumpInterfaceDescriptor
  161. * @msg: 打印接口描述符信息
  162. * @return {*}
  163. * @param {FUsbInterfaceDescriptor} *descriptor, 接口描述符
  164. */
  165. void FUsbDumpInterfaceDescriptor(const FUsbInterfaceDescriptor *descriptor)
  166. {
  167. if (NULL != descriptor)
  168. {
  169. FUSB_INFO("");
  170. FUSB_INFO("===Interface Descriptor");
  171. FUSB_INFO(" bLength: %d", descriptor->bLength);
  172. FUSB_INFO(" bDescriptorType: %d", descriptor->bDescriptorType);
  173. FUSB_INFO(" bInterfaceNumber: %d", descriptor->bInterfaceNumber);
  174. FUSB_INFO(" bAlternateSetting: %d", descriptor->bAlternateSetting);
  175. FUSB_INFO(" bNumEndpoints: %d", descriptor->bNumEndpoints);
  176. FUSB_INFO(" bInterfaceClass: %d", descriptor->bInterfaceClass);
  177. FUSB_INFO(" bInterfaceSubClass: %d", descriptor->bInterfaceSubClass);
  178. FUSB_INFO(" bInterfaceProtocol: %d", descriptor->bInterfaceProtocol);
  179. FUSB_INFO(" iInterface: %d", descriptor->iInterface);
  180. FUSB_INFO(" ");
  181. }
  182. }
  183. /**
  184. * @name: FUsbDumpEndpointDescriptor
  185. * @msg: 打印端点描述符信息
  186. * @return {*}
  187. * @param {FUsbEndpointDescriptor} *descriptor, 端点描述符
  188. */
  189. void FUsbDumpEndpointDescriptor(const FUsbEndpointDescriptor *descriptor)
  190. {
  191. if (NULL != descriptor)
  192. {
  193. FUSB_INFO("");
  194. FUSB_INFO("===Endpoint Descriptor");
  195. FUSB_INFO(" bLength: %d", descriptor->bLength);
  196. FUSB_INFO(" bDescriptorType: %d", descriptor->bDescriptorType);
  197. FUSB_INFO(" bEndpointAddress: %d", descriptor->bEndpointAddress);
  198. FUSB_INFO(" ep num: %d", FUSB_EP_DESC_EP_NUM(descriptor->bEndpointAddress));
  199. FUSB_INFO(" ep dir: %s",
  200. (FUSB_EP_DESC_EP_DIR_IN & descriptor->bEndpointAddress) ? "IN" : "OUT");
  201. FUSB_INFO(" bmAttributes: 0x%x", descriptor->bmAttributes);
  202. FUSB_INFO(" trans type: %d ([0]-%s, [1]-%s, [2]-%s, [3]-%s)",
  203. FUSB_EP_DESC_TRANS_TYPE(descriptor->bmAttributes),
  204. "control", "isochronous", "bulk", "interrupt");
  205. FUSB_INFO(" wMaxPacketSize: %d", descriptor->wMaxPacketSize);
  206. FUSB_INFO(" bInterval: %d", descriptor->bInterval);
  207. FUSB_INFO(" ");
  208. }
  209. }