3.USB移植
项目要求USB设备为打印机设备,bulk传输,所以将官方的CDC例程进行修改
1.将\HC32F4A0_DDL_Rev2.0.0\projects\ev_hc32f4a0_lqfp176\applications\usb\usb_dev_cdc\source中的文件和
HC32F4A0_DDL_Rev2.0.0\midwares\hc32\usb\usb_device_lib拷贝到自己的工程中

2.修改usb_dev_desc.c中的内容
#define DEV_VID (0x0000)
#define DEV_PID (0x0000)
define DEV_LANGID_STRING (0x409)
define DEV_MANUFACTURER_STRING ("demo")
define DEV_PRODUCT_FS_STRING ("demo")
define DEV_SERIALNUMBER_FS_STRING ("ffffffffffff")
define DEV_CONFIGURATION_FS_STRING ("demo Config")
define DEV_INTERFACE_FS_STRING ("demo Interface")
3.修改usb_dev_cdc_class.c中的内容
1.修改配置描述符
__USB_ALIGN_BEGIN static uint8_t usb_dev_cdc_cfgdesc[USB_CDC_CONFIG_DESC_SIZ] =
{
/Configuration Descriptor/
0x09, /* bLength: Configuration Descriptor size /
USB_CFG_DESCRIPTOR_TYPE, / bDescriptorType: Configuration /
USB_CDC_CONFIG_DESC_SIZ, / wTotalLength:no of returned bytes /
0x00,
0x01, / bNumInterfaces: 1 interface /
0x01, / bConfigurationValue: Configuration value /
0x00, / iConfiguration: Index of string descriptor describing the configuration /
0xC0, / bmAttributes: self powered /
0x32, / MaxPower 0 mA */
/Interface Descriptor/
/* 09 /
0x09, / bLength: Interface Descriptor size /
USB_INTERFACE_DESCRIPTOR_TYPE, / bDescriptorType: Interface /
/ Interface descriptor type /
0x00, / bInterfaceNumber: Number of Interface /
0x00, / bAlternateSetting: Alternate setting /
0x02, / bNumEndpoints: One endpoints used /
0x07, / bInterfaceClass: Printers Interface Class /
0x01, / bInterfaceSubClass: Printers /
0x02, / bInterfaceProtocol: Bi-directional interface /
0x00, / iInterface: */
/Endpoint 1 Descriptor/
0x07, /* bLength: Endpoint Descriptor size /
USB_ENDPOINT_DESCRIPTOR_TYPE, / bDescriptorType: Endpoint /
CDC_OUT_EP, / bEndpointAddress: (OUT1) /
0x02, / bmAttributes: Bulk /
LOBYTE(MAX_CDC_PACKET_SIZE),
HIBYTE(MAX_CDC_PACKET_SIZE),
0x00, / bInterval: /
/Endpoint 2 Descriptor/
/ 25 /
0x07, / bLength: Endpoint Descriptor size /
USB_ENDPOINT_DESCRIPTOR_TYPE, / bDescriptorType: Endpoint /
CDC_IN_EP, / bEndpointAddress: (IN2) /
0x02, / bmAttributes: Bulk /
LOBYTE(MAX_CDC_PACKET_SIZE),
HIBYTE(MAX_CDC_PACKET_SIZE),
0x00, / bInterval: ignore for Bulk transfer */
} ;
2.修改设置请求返回值,设备将枚举成打印机,并会回复device id请求
case USB_REQ_TYPE_CLASS : //0x20
if (req->wLength != 0U)
{
__ALIGN_BEGIN const uint8_t buffer[]={
0x01, 0x5C, //92 0x5C
0x4D, 0x46, 0x47, 0x3A, //pMFG:
'D' , 'e' , 'm' , 'o',' ', ';',
0x43, 0x4D, 0x44, 0x3A, //CMD:
0x53, 0x63, 0x61, 0x6E, 0x6E, 0x65, 0x72, 0x5F, 0x49, 0x6D, 0x61, 0x67, 0x65, 0x3B, ;
0x4D, 0x4F, 0x44, 0x45, 0x4C, 0x3A, //MODEL:
0x53, 0x63, 0x61 ,0x6E, 0x6E, 0x65, 0x72, 0x3B, ;
0x63, 0x6C, 0x61, 0x73, 0x73, 0x3A, //class:
0x53, 0x43, 0x41, 0x4E, 0x4E, 0x45, 0x52, 0x3B, ;
0x44, 0x45, 0x53, 0x3A, //DES:
0x53, 0x63, 0x61, 0x6E, 0x6E, 0x65, 0x72, 0x5F, 0x74, 0x65, 0x73, 0x74, 0x3B, ;
0x43, 0x4D, 0x54, 0x3A, //CMT:
0x44, 0x45, 0x4D ,0x4F, 0x20, 0x00, 0x43, 0x6F, 0x2E, 0x2C, 0x4C, 0x74, 0x64
};
/* Send the data to the host */
cdcCmd = req->bRequest;
cdcLen = req->wLength;
usb_ctrldatatx(pdev, (uint8_t *)buffer, sizeof(buffer));
}
break;
4.修改usb_dev_stdreq.c中的内容
void usb_getstatus(usb_core_instance *pdev, const USB_SETUP_REQ *req)
{
(void)(req);
uint8_t device_cur_status=0;
switch (pdev->dev.device_cur_status)
{
case USB_DEV_ADDRESSED:
case USB_DEV_CONFIGURED:
#ifdef SELF_POWER
dev_cfg_status = USB_CONFIG_SELF_POWERED;
#else
dev_cfg_status = 0x00U;
#endif
if (0U != pdev->dev.device_remote_wakeup)
{
dev_cfg_status |= USB_CONFIG_REMOTE_WAKEUP;
}
device_cur_status=pdev->dev.device_cur_status;
if ( (device_cur_status== USB_DEV_DEFAULT) //0x01
||(device_cur_statusUSB_DEV_ADDRESSED) //0x02
||(device_cur_statusUSB_DEV_CONFIGURED))//0x03
{
if (LOBYTE(req->wIndex) <= USBD_ITF_MAX_NUM) //0x01
{
pdev->dev.class_callback->ep0_setup(pdev, (void*)req);
if (req->wLength == 0U)
{
usb_ctrlstatustx(pdev);
}
}
else
{
usb_ctrlerr(pdev);
}
}
// usb_ctrldatatx(pdev, (uint8_t *)&dev_cfg_status, 0x5c);
break;
default :
usb_ctrlerr(pdev);
break;
}
}
5.修改usb_dev_cdc_class.c中的内容

浙公网安备 33010602011771号