Example of using the UsbHostMAX3421E library.

Dependencies:   mbed UsbHostMAX3421E millis

Committer:
hudakz
Date:
Mon Jul 13 07:04:20 2020 +0000
Revision:
2:941b29d88da9
Parent:
1:587777f16756
Example of using the UsbHostMAX3421E library.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 0:f12b0c43b7c8 1 #include "mbed.h"
hudakz 0:f12b0c43b7c8 2
hudakz 0:f12b0c43b7c8 3 #include "Usb.h"
hudakz 0:f12b0c43b7c8 4 #include "usbhub.h"
hudakz 0:f12b0c43b7c8 5 #include "pgm_strings.h"
hudakz 0:f12b0c43b7c8 6
hudakz 2:941b29d88da9 7 Usb usb(D11, D12, D13, D10, D9); // mosi, miso, sck, ss, intr
hudakz 0:f12b0c43b7c8 8
hudakz 0:f12b0c43b7c8 9 uint8_t getConfDescr(uint8_t addr, uint8_t conf);
hudakz 0:f12b0c43b7c8 10
hudakz 0:f12b0c43b7c8 11 void printAllAddresses(UsbDevice* pdev)
hudakz 0:f12b0c43b7c8 12 {
hudakz 0:f12b0c43b7c8 13 UsbDeviceAddress adr;
hudakz 0:f12b0c43b7c8 14
hudakz 0:f12b0c43b7c8 15 adr.devAddress = pdev->address.devAddress;
hudakz 0:f12b0c43b7c8 16 printf("\r\nAddr: 0x%x (0x%x.0x%x.0x%x)\r\n", adr.devAddress, adr.bmHub, adr.bmParent, adr.bmAddress);
hudakz 0:f12b0c43b7c8 17 }
hudakz 0:f12b0c43b7c8 18
hudakz 0:f12b0c43b7c8 19 /**
hudakz 0:f12b0c43b7c8 20 * @brief
hudakz 0:f12b0c43b7c8 21 * @note
hudakz 0:f12b0c43b7c8 22 * @param
hudakz 0:f12b0c43b7c8 23 * @retval
hudakz 0:f12b0c43b7c8 24 */
hudakz 0:f12b0c43b7c8 25 void printAddress(uint8_t addr)
hudakz 0:f12b0c43b7c8 26 {
hudakz 0:f12b0c43b7c8 27 UsbDeviceAddress adr;
hudakz 0:f12b0c43b7c8 28
hudakz 0:f12b0c43b7c8 29 adr.devAddress = addr;
hudakz 0:f12b0c43b7c8 30 printf("\r\nADDR:\t0x%x\r\n", adr.devAddress);
hudakz 0:f12b0c43b7c8 31 printf("DEV:\t0x%x\r\n", adr.bmAddress);
hudakz 0:f12b0c43b7c8 32 printf("PRNT:\t0x%x\r\n", adr.bmParent);
hudakz 0:f12b0c43b7c8 33 printf("HUB:\t0x%x\r\n", adr.bmHub);
hudakz 0:f12b0c43b7c8 34 }
hudakz 0:f12b0c43b7c8 35
hudakz 0:f12b0c43b7c8 36 /**
hudakz 0:f12b0c43b7c8 37 * @brief
hudakz 0:f12b0c43b7c8 38 * @note
hudakz 0:f12b0c43b7c8 39 * @param
hudakz 0:f12b0c43b7c8 40 * @retval
hudakz 0:f12b0c43b7c8 41 */
hudakz 0:f12b0c43b7c8 42 uint8_t getDevDescr(uint8_t addr, uint8_t& num_conf)
hudakz 0:f12b0c43b7c8 43 {
hudakz 0:f12b0c43b7c8 44 USB_DEVICE_DESCRIPTOR buf;
hudakz 0:f12b0c43b7c8 45 uint8_t rcode;
hudakz 0:f12b0c43b7c8 46
hudakz 0:f12b0c43b7c8 47 rcode = usb.getDevDescr(addr, 0, 0x12, (uint8_t*) &buf);
hudakz 0:f12b0c43b7c8 48 if (rcode) {
hudakz 0:f12b0c43b7c8 49 return(rcode);
hudakz 0:f12b0c43b7c8 50 }
hudakz 0:f12b0c43b7c8 51
hudakz 0:f12b0c43b7c8 52 printf("%s", Dev_Header_str);
hudakz 0:f12b0c43b7c8 53 printf("%s0x%.8x", Dev_Length_str, buf.bLength);
hudakz 0:f12b0c43b7c8 54 printf("%s0x%.8x", Dev_Type_str, buf.bDescriptorType);
hudakz 0:f12b0c43b7c8 55 printf("%s0x%.16x", Dev_Version_str, buf.bcdUSB);
hudakz 0:f12b0c43b7c8 56 printf("%s0x%.8x", Dev_Class_str, buf.bDeviceClass);
hudakz 0:f12b0c43b7c8 57 printf("%s0x%.8x", Dev_Subclass_str, buf.bDeviceSubClass);
hudakz 0:f12b0c43b7c8 58 printf("%s0x%.8x", Dev_Protocol_str, buf.bDeviceProtocol);
hudakz 0:f12b0c43b7c8 59 printf("%s0x%.8x", Dev_Pktsize_str, buf.bMaxPacketSize0);
hudakz 0:f12b0c43b7c8 60 printf("%s0x%.16x", Dev_Vendor_str, buf.idVendor);
hudakz 0:f12b0c43b7c8 61 printf("%s0x%.16x", Dev_Product_str, buf.idProduct);
hudakz 0:f12b0c43b7c8 62 printf("%s0x%.16x", Dev_Revision_str, buf.bcdDevice);
hudakz 0:f12b0c43b7c8 63 printf("%s0x%.8x", Dev_Mfg_str, buf.iManufacturer);
hudakz 0:f12b0c43b7c8 64 printf("%s0x%.8x", Dev_Prod_str, buf.iProduct);
hudakz 0:f12b0c43b7c8 65 printf("%s0x%.8x", Dev_Serial_str, buf.iSerialNumber);
hudakz 0:f12b0c43b7c8 66 printf("%s0x%.8x", Dev_Nconf_str, buf.bNumConfigurations);
hudakz 0:f12b0c43b7c8 67 num_conf = buf.bNumConfigurations;
hudakz 0:f12b0c43b7c8 68 return(0);
hudakz 0:f12b0c43b7c8 69 }
hudakz 0:f12b0c43b7c8 70
hudakz 0:f12b0c43b7c8 71 /* function to print configuration descriptor */
hudakz 0:f12b0c43b7c8 72 void printConfDescr(uint8_t* descr_ptr)
hudakz 0:f12b0c43b7c8 73 {
hudakz 0:f12b0c43b7c8 74 USB_CONFIGURATION_DESCRIPTOR* conf_ptr = (USB_CONFIGURATION_DESCRIPTOR*)descr_ptr;
hudakz 0:f12b0c43b7c8 75
hudakz 0:f12b0c43b7c8 76 printf("%s", Conf_Header_str);
hudakz 0:f12b0c43b7c8 77 printf("%s0x%.16x", Conf_Totlen_str, conf_ptr->wTotalLength);
hudakz 0:f12b0c43b7c8 78 printf("%s0x%.8x", Conf_Nint_str, conf_ptr->bNumInterfaces);
hudakz 0:f12b0c43b7c8 79 printf("%s0x%.8x", Conf_Value_str, conf_ptr->bConfigurationValue);
hudakz 0:f12b0c43b7c8 80 printf("%s0x%.8x", Conf_String_str, conf_ptr->iConfiguration);
hudakz 0:f12b0c43b7c8 81 printf("%s0x%.8x", Conf_Attr_str, conf_ptr->bmAttributes);
hudakz 0:f12b0c43b7c8 82 printf("%s0x%.8x", Conf_Pwr_str, conf_ptr->bMaxPower);
hudakz 0:f12b0c43b7c8 83 return;
hudakz 0:f12b0c43b7c8 84 }
hudakz 0:f12b0c43b7c8 85
hudakz 0:f12b0c43b7c8 86 /* function to print interface descriptor */
hudakz 0:f12b0c43b7c8 87 void printIntfDescr(uint8_t* descr_ptr)
hudakz 0:f12b0c43b7c8 88 {
hudakz 0:f12b0c43b7c8 89 USB_INTERFACE_DESCRIPTOR* intf_ptr = (USB_INTERFACE_DESCRIPTOR*)descr_ptr;
hudakz 0:f12b0c43b7c8 90
hudakz 0:f12b0c43b7c8 91 printf("%s", Int_Header_str);
hudakz 0:f12b0c43b7c8 92 printf("%s0x%.8x", Int_Number_str, intf_ptr->bInterfaceNumber);
hudakz 0:f12b0c43b7c8 93 printf("%s0x%.8x", Int_Alt_str, intf_ptr->bAlternateSetting);
hudakz 0:f12b0c43b7c8 94 printf("%s0x%.8x", Int_Endpoints_str, intf_ptr->bNumEndpoints);
hudakz 0:f12b0c43b7c8 95 printf("%s0x%.8x", Int_Class_str, intf_ptr->bInterfaceClass);
hudakz 0:f12b0c43b7c8 96 printf("%s0x%.8x", Int_Subclass_str, intf_ptr->bInterfaceSubClass);
hudakz 0:f12b0c43b7c8 97 printf("%s0x%.8x", Int_Protocol_str, intf_ptr->bInterfaceProtocol);
hudakz 0:f12b0c43b7c8 98 printf("%s0x%.8x", Int_String_str, intf_ptr->iInterface);
hudakz 0:f12b0c43b7c8 99 return;
hudakz 0:f12b0c43b7c8 100 }
hudakz 0:f12b0c43b7c8 101
hudakz 0:f12b0c43b7c8 102 /* function to print endpoint descriptor */
hudakz 0:f12b0c43b7c8 103 void printEpDescr(uint8_t* descr_ptr)
hudakz 0:f12b0c43b7c8 104 {
hudakz 0:f12b0c43b7c8 105 USB_ENDPOINT_DESCRIPTOR* ep_ptr = (USB_ENDPOINT_DESCRIPTOR*)descr_ptr;
hudakz 0:f12b0c43b7c8 106
hudakz 0:f12b0c43b7c8 107 printf("%s", End_Header_str);
hudakz 0:f12b0c43b7c8 108 printf("%s0x%.8x", End_Address_str, ep_ptr->bEndpointAddress);
hudakz 0:f12b0c43b7c8 109 printf("%s0x%.8x", End_Attr_str, ep_ptr->bmAttributes);
hudakz 0:f12b0c43b7c8 110 printf("%s0x%.16x", End_Pktsize_str, ep_ptr->wMaxPacketSize);
hudakz 0:f12b0c43b7c8 111 printf("%s0x%.8x", End_Interval_str, ep_ptr->bInterval);
hudakz 0:f12b0c43b7c8 112
hudakz 0:f12b0c43b7c8 113 return;
hudakz 0:f12b0c43b7c8 114 }
hudakz 0:f12b0c43b7c8 115
hudakz 0:f12b0c43b7c8 116 /**
hudakz 0:f12b0c43b7c8 117 * @brief
hudakz 0:f12b0c43b7c8 118 * @note
hudakz 0:f12b0c43b7c8 119 * @param
hudakz 0:f12b0c43b7c8 120 * @retval
hudakz 0:f12b0c43b7c8 121 */
hudakz 0:f12b0c43b7c8 122 void printHubDescr(uint8_t* descrptr, uint8_t addr)
hudakz 0:f12b0c43b7c8 123 {
hudakz 0:f12b0c43b7c8 124 HubDescriptor* pHub = (HubDescriptor*)descrptr;
hudakz 0:f12b0c43b7c8 125 uint8_t len = *((uint8_t*)descrptr);
hudakz 0:f12b0c43b7c8 126
hudakz 0:f12b0c43b7c8 127 printf("\r\n\r\nHub Descriptor:\r\n");
hudakz 0:f12b0c43b7c8 128 printf("bDescLength:\t\t0x%x\r\n", pHub->bDescLength);
hudakz 0:f12b0c43b7c8 129 printf("bDescriptorType:\t0x%x\r\n", pHub->bDescriptorType);
hudakz 0:f12b0c43b7c8 130 printf("bNbrPorts:\t\t0x%x\r\n", pHub->bNbrPorts);
hudakz 0:f12b0c43b7c8 131 printf("LogPwrSwitchMode:\t0x%x\r\n", pHub->LogPwrSwitchMode);
hudakz 0:f12b0c43b7c8 132 printf("CompoundDevice:\t\t0x%x\r\n", pHub->CompoundDevice);
hudakz 0:f12b0c43b7c8 133 printf("OverCurrentProtectMode:\t0x%x", pHub->OverCurrentProtectMode);
hudakz 0:f12b0c43b7c8 134 printf("TTThinkTime:\t\t0x%x", pHub->TTThinkTime);
hudakz 0:f12b0c43b7c8 135 printf("PortIndicatorsSupported:0x%x", pHub->PortIndicatorsSupported);
hudakz 0:f12b0c43b7c8 136 printf("Reserved:\t\t0x%x", pHub->Reserved);
hudakz 0:f12b0c43b7c8 137 printf("bPwrOn2PwrGood:\t\t0x%x", pHub->bPwrOn2PwrGood);
hudakz 0:f12b0c43b7c8 138 printf("bHubContrCurrent:\t0x%x", pHub->bHubContrCurrent);
hudakz 0:f12b0c43b7c8 139
hudakz 0:f12b0c43b7c8 140 for (uint8_t i = 7; i < len; i++)
hudakz 0:f12b0c43b7c8 141 printf("0x%.8x ", descrptr[i]);
hudakz 0:f12b0c43b7c8 142
hudakz 0:f12b0c43b7c8 143 printf("\r\n");
hudakz 0:f12b0c43b7c8 144
hudakz 0:f12b0c43b7c8 145 //for (uint8_t i=1; i<=pHub->bNbrPorts; i++)
hudakz 0:f12b0c43b7c8 146 // PrintHubPortStatus(&Usb, addr, i, 1);
hudakz 0:f12b0c43b7c8 147 }
hudakz 0:f12b0c43b7c8 148
hudakz 0:f12b0c43b7c8 149 /**
hudakz 0:f12b0c43b7c8 150 * @brief
hudakz 0:f12b0c43b7c8 151 * @note
hudakz 0:f12b0c43b7c8 152 * @param
hudakz 0:f12b0c43b7c8 153 * @retval
hudakz 0:f12b0c43b7c8 154 */
hudakz 0:f12b0c43b7c8 155 void printDescriptors(uint8_t addr)
hudakz 0:f12b0c43b7c8 156 {
hudakz 0:f12b0c43b7c8 157 uint8_t rcode = 0;
hudakz 0:f12b0c43b7c8 158 uint8_t num_conf = 0;
hudakz 0:f12b0c43b7c8 159
hudakz 0:f12b0c43b7c8 160 rcode = getDevDescr((uint8_t) addr, num_conf);
hudakz 0:f12b0c43b7c8 161 if (rcode) {
hudakz 1:587777f16756 162 printf("%s0x%.8x", Gen_Error_str, rcode);
hudakz 0:f12b0c43b7c8 163 }
hudakz 0:f12b0c43b7c8 164
hudakz 0:f12b0c43b7c8 165 printf("\r\n");
hudakz 0:f12b0c43b7c8 166
hudakz 0:f12b0c43b7c8 167 for (int i = 0; i < num_conf; i++) {
hudakz 0:f12b0c43b7c8 168 rcode = getConfDescr(addr, i); // get configuration descriptor
hudakz 0:f12b0c43b7c8 169 if (rcode) {
hudakz 1:587777f16756 170 printf("%s0x%.8x", Gen_Error_str, rcode);
hudakz 0:f12b0c43b7c8 171 }
hudakz 0:f12b0c43b7c8 172
hudakz 0:f12b0c43b7c8 173 printf("\r\n");
hudakz 0:f12b0c43b7c8 174 }
hudakz 0:f12b0c43b7c8 175 }
hudakz 0:f12b0c43b7c8 176
hudakz 0:f12b0c43b7c8 177 /**
hudakz 0:f12b0c43b7c8 178 * @brief
hudakz 0:f12b0c43b7c8 179 * @note
hudakz 0:f12b0c43b7c8 180 * @param
hudakz 0:f12b0c43b7c8 181 * @retval
hudakz 0:f12b0c43b7c8 182 */
hudakz 0:f12b0c43b7c8 183 void printAllDescriptors(UsbDevice* pdev)
hudakz 0:f12b0c43b7c8 184 {
hudakz 0:f12b0c43b7c8 185 printf("\r\n");
hudakz 0:f12b0c43b7c8 186 printf("0x%.8x\r\n--", pdev->address.devAddress);
hudakz 0:f12b0c43b7c8 187 printDescriptors(pdev->address.devAddress);
hudakz 0:f12b0c43b7c8 188 }
hudakz 0:f12b0c43b7c8 189
hudakz 0:f12b0c43b7c8 190 /*function to print unknown descriptor */
hudakz 0:f12b0c43b7c8 191 void printUnknownDescr(uint8_t* descr_ptr)
hudakz 0:f12b0c43b7c8 192 {
hudakz 0:f12b0c43b7c8 193 uint8_t length = *descr_ptr;
hudakz 0:f12b0c43b7c8 194 uint8_t i;
hudakz 0:f12b0c43b7c8 195
hudakz 0:f12b0c43b7c8 196 printf("%s", Unk_Header_str);
hudakz 1:587777f16756 197 printf("%s0x%.8x", Unk_Length_str, *descr_ptr);
hudakz 1:587777f16756 198 printf("%s0x%.8x", Unk_Type_str, *(descr_ptr + 1 ));
hudakz 0:f12b0c43b7c8 199 printf("%s", Unk_Contents_str);
hudakz 0:f12b0c43b7c8 200 descr_ptr += 2;
hudakz 0:f12b0c43b7c8 201 for (i = 0; i < length; i++) {
hudakz 0:f12b0c43b7c8 202 printf("0x%.8x", *descr_ptr);
hudakz 0:f12b0c43b7c8 203 descr_ptr++;
hudakz 0:f12b0c43b7c8 204 }
hudakz 0:f12b0c43b7c8 205 }
hudakz 0:f12b0c43b7c8 206
hudakz 0:f12b0c43b7c8 207 /**
hudakz 0:f12b0c43b7c8 208 * @brief
hudakz 0:f12b0c43b7c8 209 * @note
hudakz 0:f12b0c43b7c8 210 * @param
hudakz 0:f12b0c43b7c8 211 * @retval
hudakz 0:f12b0c43b7c8 212 */
hudakz 0:f12b0c43b7c8 213 uint8_t getConfDescr(uint8_t addr, uint8_t conf)
hudakz 0:f12b0c43b7c8 214 {
hudakz 0:f12b0c43b7c8 215 uint8_t buf[BUFSIZE];
hudakz 0:f12b0c43b7c8 216 uint8_t* buf_ptr = buf;
hudakz 0:f12b0c43b7c8 217 uint8_t rcode;
hudakz 0:f12b0c43b7c8 218 uint8_t descr_length;
hudakz 0:f12b0c43b7c8 219 uint8_t descr_type;
hudakz 0:f12b0c43b7c8 220 uint16_t total_length;
hudakz 0:f12b0c43b7c8 221
hudakz 0:f12b0c43b7c8 222 rcode = usb.getConfDescr(addr, 0, 4, conf, buf); //get total length
hudakz 0:f12b0c43b7c8 223 LOBYTE(total_length) = buf[2];
hudakz 0:f12b0c43b7c8 224 HIBYTE(total_length) = buf[3];
hudakz 0:f12b0c43b7c8 225 if (total_length > 256) {
hudakz 0:f12b0c43b7c8 226
hudakz 0:f12b0c43b7c8 227 //check if total length is larger than buffer
hudakz 0:f12b0c43b7c8 228 printf("%s", Conf_Trunc_str);
hudakz 0:f12b0c43b7c8 229 total_length = 256;
hudakz 0:f12b0c43b7c8 230 }
hudakz 0:f12b0c43b7c8 231
hudakz 0:f12b0c43b7c8 232 rcode = usb.getConfDescr(addr, 0, total_length, conf, buf); //get the whole descriptor
hudakz 0:f12b0c43b7c8 233 while (buf_ptr < buf + total_length) {
hudakz 0:f12b0c43b7c8 234
hudakz 0:f12b0c43b7c8 235 //parsing descriptors
hudakz 0:f12b0c43b7c8 236 descr_length = *(buf_ptr);
hudakz 0:f12b0c43b7c8 237 descr_type = *(buf_ptr + 1);
hudakz 0:f12b0c43b7c8 238 switch (descr_type) {
hudakz 0:f12b0c43b7c8 239 case (USB_DESCRIPTOR_CONFIGURATION):
hudakz 0:f12b0c43b7c8 240 printConfDescr(buf_ptr);
hudakz 0:f12b0c43b7c8 241 break;
hudakz 0:f12b0c43b7c8 242
hudakz 0:f12b0c43b7c8 243 case (USB_DESCRIPTOR_INTERFACE):
hudakz 0:f12b0c43b7c8 244 printIntfDescr(buf_ptr);
hudakz 0:f12b0c43b7c8 245 break;
hudakz 0:f12b0c43b7c8 246
hudakz 0:f12b0c43b7c8 247 case (USB_DESCRIPTOR_ENDPOINT):
hudakz 0:f12b0c43b7c8 248 printEpDescr(buf_ptr);
hudakz 0:f12b0c43b7c8 249 break;
hudakz 0:f12b0c43b7c8 250
hudakz 0:f12b0c43b7c8 251 case 0x29:
hudakz 0:f12b0c43b7c8 252 printHubDescr(buf_ptr, addr);
hudakz 0:f12b0c43b7c8 253 break;
hudakz 0:f12b0c43b7c8 254
hudakz 0:f12b0c43b7c8 255 default:
hudakz 0:f12b0c43b7c8 256 printUnknownDescr(buf_ptr);
hudakz 0:f12b0c43b7c8 257 break;
hudakz 0:f12b0c43b7c8 258 } //switch( descr_type
hudakz 0:f12b0c43b7c8 259
hudakz 0:f12b0c43b7c8 260 buf_ptr = (buf_ptr + descr_length); //advance buffer pointer
hudakz 0:f12b0c43b7c8 261 } //while( buf_ptr <=...
hudakz 0:f12b0c43b7c8 262
hudakz 0:f12b0c43b7c8 263 return(rcode);
hudakz 0:f12b0c43b7c8 264 }
hudakz 0:f12b0c43b7c8 265
hudakz 0:f12b0c43b7c8 266
hudakz 0:f12b0c43b7c8 267 /**
hudakz 0:f12b0c43b7c8 268 * @brief
hudakz 0:f12b0c43b7c8 269 * @note
hudakz 0:f12b0c43b7c8 270 * @param
hudakz 0:f12b0c43b7c8 271 * @retval
hudakz 0:f12b0c43b7c8 272 */
hudakz 0:f12b0c43b7c8 273 int main()
hudakz 0:f12b0c43b7c8 274 {
hudakz 0:f12b0c43b7c8 275 printf("Starting..\r\n");
hudakz 0:f12b0c43b7c8 276
hudakz 0:f12b0c43b7c8 277 if (usb.init() == -1)
hudakz 0:f12b0c43b7c8 278 printf("OSC did not start.\r\n");
hudakz 0:f12b0c43b7c8 279
hudakz 0:f12b0c43b7c8 280 wait_ms(200);
hudakz 0:f12b0c43b7c8 281
hudakz 0:f12b0c43b7c8 282 while (true) {
hudakz 0:f12b0c43b7c8 283 usb.task();
hudakz 0:f12b0c43b7c8 284
hudakz 0:f12b0c43b7c8 285 if (usb.getUsbTaskState() == USB_STATE_RUNNING) {
hudakz 0:f12b0c43b7c8 286 usb.ForEachUsbDevice(&printAllDescriptors);
hudakz 0:f12b0c43b7c8 287 usb.ForEachUsbDevice(&printAllAddresses);
hudakz 0:f12b0c43b7c8 288
hudakz 0:f12b0c43b7c8 289 while (1) {}
hudakz 0:f12b0c43b7c8 290 }
hudakz 0:f12b0c43b7c8 291 }
hudakz 0:f12b0c43b7c8 292 }