From: Martin Mares Date: Fri, 22 Jun 2018 22:23:32 +0000 (+0200) Subject: Experiments with USB X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=50cdc6ca4e8e5e3a45ea4c5c211e94e875e322db;p=home-hw.git Experiments with USB --- diff --git a/Makefile b/Makefile index fe19fd2..639ca7f 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ########################################################################################################################## -# File automatically-generated by tool: [projectgenerator] version: [2.27.0] date: [Fri Jun 22 21:02:51 CEST 2018] +# File automatically-generated by tool: [projectgenerator] version: [2.27.0] date: [Fri Jun 22 21:45:40 CEST 2018] ########################################################################################################################## # ------------------------------------------------ diff --git a/Src/usb_device.c b/Src/usb_device.c index cf6223b..d9bbefe 100644 --- a/Src/usb_device.c +++ b/Src/usb_device.c @@ -84,6 +84,191 @@ USBD_HandleTypeDef hUsbDeviceFS; */ /* USER CODE BEGIN 1 */ +static uint8_t xxx_rx_buf[64]; + +static uint8_t xxx_init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) +{ + USBD_LL_OpenEP(pdev, 0x01, USBD_EP_TYPE_BULK, 64); + pdev->ep_out[1].maxpacket = 64; + + USBD_LL_OpenEP(pdev, 0x81, USBD_EP_TYPE_BULK, 64); + pdev->ep_in[1].maxpacket = 64; + + // USBD_LL_PrepareReceive(pdev, 0x01, xxx_rx_buf, 64); + USBD_LL_Transmit(pdev, 0x81, "brum", 4); + + return USBD_OK; +} + +static uint8_t xxx_deinit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) +{ + USBD_LL_CloseEP(pdev, 0x01); + USBD_LL_CloseEP(pdev, 0x81); + return USBD_OK; +} + +static uint8_t xxx_zero; + +static uint8_t xxx_setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) +{ + switch (req->bmRequest & USB_REQ_TYPE_MASK) + { + case USB_REQ_TYPE_STANDARD: + switch (req->bRequest) + { + case USB_REQ_GET_DESCRIPTOR: + { + USBD_CtlSendData(pdev, NULL, 0); + return USBD_OK; + } + case USB_REQ_GET_INTERFACE: + { + USBD_CtlSendData(pdev, &xxx_zero, 1); + return USBD_OK; + } + case USB_REQ_SET_INTERFACE: + if ((uint8_t) req->wValue == 0) + return USBD_OK; + break; + case USB_REQ_SET_FEATURE: + case USB_REQ_CLEAR_FEATURE: + // Handled by USBD, we are only notified + return USBD_OK; + } + break; + } + + USBD_CtlError(pdev, req); + return USBD_FAIL; +} + +static uint8_t xxx_ep0_rx_ready(USBD_HandleTypeDef *pdev) +{ + return USBD_OK; +} + +static uint8_t xxx_ep0_tx_ready(USBD_HandleTypeDef *pdev) +{ + return USBD_OK; +} + +static uint8_t xxx_data_in(USBD_HandleTypeDef *pdev, uint8_t epnum) +{ + USBD_EndpointTypeDef *pep = &pdev->ep_in[1]; + return USBD_OK; +} + +static uint8_t xxx_data_out(USBD_HandleTypeDef *pdev, uint8_t epnum) +{ + USBD_EndpointTypeDef *pep = &pdev->ep_out[1]; + unsigned int len = USBD_LL_GetRxDataSize(pdev, 0x01); + return USBD_OK; +} + +static uint8_t xxx_sof(USBD_HandleTypeDef *pdev) +{ + return USBD_OK; +} + +static uint8_t xxx_iso_in_incomplete(USBD_HandleTypeDef *pdev, uint8_t epnum) +{ + return USBD_OK; +} + +static uint8_t xxx_iso_out_incomplete(USBD_HandleTypeDef *pdev, uint8_t epnum) +{ + return USBD_OK; +} + +// FIXME: constify +static uint8_t xxx_cfg_desc[] = { + // Configuration descriptor + 9, // bLength + USB_DESC_TYPE_CONFIGURATION, // bDescriptorType + 32, // wTotalLength + 0, + 0x01, // bNumInterfaces + 0x01, // bConfigurationValue + USBD_IDX_CONFIG_STR, // iConfiguration: index of string descriptor + 0xc0, // bmAttributes: bus-powered, supports remote wakeup + 0x32, // Max power: 100 mA + // Interface descriptor + 9, // bLength + USB_DESC_TYPE_INTERFACE, // bDescriptorType + 0x00, // bInterfaceNumber + 0x00, // bAlternateSetting + 0x01, // bNumEndpoints + 0xff, // bInterfaceClass: vendor-defined + 0x00, // bInterfaceSubClass + 0x00, // nInterfaceProtocol + USBD_IDX_INTERFACE_STR, // iInterface: index of string descriptor + // End-point descriptor + 7, // bLength + USB_DESC_TYPE_ENDPOINT, // bDescriptorType + 0x01, // bEndpointAddress + USBD_EP_TYPE_BULK, // bmAttributes + 0x40, 0x00, // wMaxPacketSize + 0x00, // bInterval: unused + // End-point descriptor + 7, // bLength + USB_DESC_TYPE_ENDPOINT, // bDescriptorType + 0x81, // bEndpointAddress + USBD_EP_TYPE_BULK, // bmAttributes + 0x40, 0x00, // wMaxPacketSize + 0x00, // bInterval: unused +}; + +static uint8_t *xxx_get_cfg_desc(uint16_t *len) +{ + *len = sizeof(xxx_cfg_desc); + return xxx_cfg_desc; +} + +// FIXME: constify +static uint8_t xxx_qual_desc[] = { + 10, // bLength + USB_DESC_TYPE_DEVICE_QUALIFIER, // bDescriptorType + 0x00, 0x02, // bcdUSB + 0x00, // bDeviceClass + 0x00, // bDeviceSubClass + 0x00, // bDeviceProtocol + 0x40, // bMaxPacketSize0 + 0x01, // bNumConfigurations + 0x00, // bReserved +}; + +static uint8_t *xxx_get_dev_qual_desc(uint16_t *len) +{ + *len = sizeof(xxx_qual_desc); + return xxx_qual_desc; +} + +static uint8_t *xxx_get_usr_string_desc(USBD_HandleTypeDef *pdev, uint8_t index, uint16_t *len) +{ + *len = 0; + return NULL; +} + +USBD_ClassTypeDef xxx_class = { + xxx_init, + xxx_deinit, + xxx_setup, + xxx_ep0_tx_ready, + xxx_ep0_rx_ready, + xxx_data_in, + xxx_data_out, + xxx_sof, + xxx_iso_in_incomplete, + xxx_iso_out_incomplete, + xxx_get_cfg_desc, + xxx_get_cfg_desc, + xxx_get_cfg_desc, + xxx_get_dev_qual_desc, +#if USBD_SUPPORT_USER_STRING == 1 + xxx_get_usr_string_desc, +#endif +}; + /* USER CODE END 1 */ /** @@ -99,9 +284,13 @@ void MX_USB_DEVICE_Init(void) /* Init Device Library, add supported class and start the library. */ USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS); +#if 0 USBD_RegisterClass(&hUsbDeviceFS, &USBD_DFU); USBD_DFU_RegisterMedia(&hUsbDeviceFS, &USBD_DFU_fops_FS); +#else + USBD_RegisterClass(&hUsbDeviceFS, &xxx_class); +#endif USBD_Start(&hUsbDeviceFS); diff --git a/Src/usbd_desc.c b/Src/usbd_desc.c index a4bd3e2..0dbcead 100644 --- a/Src/usbd_desc.c +++ b/Src/usbd_desc.c @@ -91,14 +91,14 @@ * @{ */ -#define USBD_VID 1155 +#define USBD_VID 0x4242 #define USBD_LANGID_STRING 1033 #define USBD_MANUFACTURER_STRING "UCW" -#define USBD_PID_FS 57105 +#define USBD_PID_FS 0x0001 #define USBD_PRODUCT_STRING_FS "Mysterious Gadget" #define USBD_SERIALNUMBER_STRING_FS "00000000002A" -#define USBD_CONFIGURATION_STRING_FS "DFU Config" -#define USBD_INTERFACE_STRING_FS "DFU Interface" +#define USBD_CONFIGURATION_STRING_FS "Default Config" +#define USBD_INTERFACE_STRING_FS "Default Interface" /* USER CODE BEGIN PRIVATE_DEFINES */ diff --git a/testusb.ioc b/testusb.ioc index e3d878a..5531719 100644 --- a/testusb.ioc +++ b/testusb.ioc @@ -144,10 +144,14 @@ RCC.VCOOutput2Freq_Value=8000000 USB.IPParameters=ep0_mps USB.ep0_mps=DEP0CTL_MPS_64 USB_DEVICE.CLASS_NAME_FS=DFU -USB_DEVICE.IPParameters=VirtualMode,VirtualModeFS,CLASS_NAME_FS,MANUFACTURER_STRING,PRODUCT_STRING_DFU_FS,SERIALNUMBER_STRING_DFU_FS +USB_DEVICE.CONFIGURATION_STRING_DFU_FS=Default Config +USB_DEVICE.INTERFACE_STRING_DFU_FS=Default Interface +USB_DEVICE.IPParameters=VirtualMode,VirtualModeFS,CLASS_NAME_FS,MANUFACTURER_STRING,PRODUCT_STRING_DFU_FS,SERIALNUMBER_STRING_DFU_FS,VID,PID_DFU_FS,CONFIGURATION_STRING_DFU_FS,INTERFACE_STRING_DFU_FS USB_DEVICE.MANUFACTURER_STRING=UCW +USB_DEVICE.PID_DFU_FS=0x0001 USB_DEVICE.PRODUCT_STRING_DFU_FS=Mysterious Gadget USB_DEVICE.SERIALNUMBER_STRING_DFU_FS=00000000002A +USB_DEVICE.VID=0x4242 USB_DEVICE.VirtualMode=Dfu USB_DEVICE.VirtualModeFS=Dfu_FS VP_SYS_VS_Systick.Mode=SysTick