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_status
USB_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中的内容

posted @ 2022-11-11 13:28  小木头丶  阅读(213)  评论(0)    收藏  举报