|
楼主 |
发表于 2013-9-11 16:22:52
|
显示全部楼层
细读ATMEGA32UE手册,发现CONTROL端口0只涉及到RXSTPI,RXOUTI,TXINI三位
程序改成如果,但结果还是依旧,在接收到0x80 , 0x06 , 0x00 0x01 , 0x00 0x00 , 0x40 0x00后,反回对应描术符后,再没有发应,UEINTX均为0,提示无法识别USB设备
程序修改如下:
void USB_Task(void)
{
//Usb_select_endpoint(EP_CONTROL);
USB_General_Int();
// Here connection to the device enumeration process
if (Is_usb_receive_setup())
{
usb_process_request();
}
if(Is_usb_receive_out())
{
Usb_ack_receive_out();
}
USB_Send_Data();
}
void usb_process_request(void)
{
USB_Read_Bytes(8,USB_READ_BUFFER);
USB_ControlRequest.bmRequestType = USB_READ_BUFFER[0];
USB_ControlRequest.bRequest = USB_READ_BUFFER[1];
USB_ControlRequest.wValue = USB_READ_BUFFER[3];
USB_ControlRequest.wValue = ((USB_ControlRequest.wValue << 8) | USB_READ_BUFFER[2]);
USB_ControlRequest.wIndex = USB_READ_BUFFER[5];
USB_ControlRequest.wIndex = ((USB_ControlRequest.wIndex << 8) | USB_READ_BUFFER[4]);
USB_ControlRequest.wLength = USB_READ_BUFFER[7];
USB_ControlRequest.wLength = ((USB_ControlRequest.wLength << 8) | USB_READ_BUFFER[6]);
Usb_ack_receive_setup(); //!< clear the receive setup flag
if ((USB_ControlRequest.bmRequestType & 0x60) == Std_Requests)
{
switch (USB_ControlRequest.bRequest)
{
case GET_DESCRIPTOR:
usb_get_descriptor();
break;
case GET_CONFIGURATION:
usb_get_configuration();
break;
case SET_ADDRESS:
usb_set_address();
break;
/*case CLEAR_FEATURE:
case SET_FEATURE:
case GET_STATUS:
case GET_INTERFACE:
case SET_CONFIGURATION:
case SET_DESCRIPTOR:
case SET_INTERFACE:
case SYNCH_FRAME:*/
default: //!< un-supported request => call to user read request
Usb_send_control_in();
return;
break;
}
}
else
{
switch(USB_ControlRequest.bRequest)
{
case GET_REPORT:
hid_get_report();
break;
case SET_REPORT:
hid_set_report();
break;
/*case GET_PROTOCOL:
case SET_PROTOCOL:
case SET_IDLE:
case GET_IDLE:*/
default:
Usb_send_control_in();
break;
}
}
}
void usb_set_address(void)
{
uint8 addr = (USB_ControlRequest.wValue & 0x7F);
Usb_configure_address(addr);
//Usb_ack_receive_setup();
Usb_send_control_in(); //!< send a ZLP for STATUS phase
while(!Is_usb_in_ready()); //!< waits for status phase done
//!< before using the new address
Usb_enable_address();
}
void usb_get_descriptor(void)
{
uint8 DescriptorType = (USB_ControlRequest.wValue >> 8);
uint8 DescriptorNumber = (USB_ControlRequest.wValue & 0xFF);
switch (DescriptorType)
{
case DEVICE_DESCRIPTOR:
if (USB_ControlRequest.wLength > sizeof(USB_DeviceDescriptor))
{
len_w = sizeof(USB_DeviceDescriptor);
}
else
{
len_w = USB_ControlRequest.wLength;
}
pbuffp_w = USB_DeviceDescriptor;
break;
case CONFIGURATION_DESCRIPTOR:
if (USB_ControlRequest.wLength > sizeof(USB_ConfigDescriptor))
{
len_w = sizeof(USB_ConfigDescriptor);
}
else
{
len_w = USB_ControlRequest.wLength;
}
pbuffp_w = USB_ConfigDescriptor;
break;
case STRING_DESCRIPTOR:
switch (DescriptorNumber)
{
case 0x00:
if (USB_ControlRequest.wLength > sizeof(USB_LanguageString))
{
len_w = sizeof(USB_LanguageString);
}
else
{
len_w = USB_ControlRequest.wLength;
}
pbuffp_w = USB_LanguageString;
break;
case 0x01:
if (USB_ControlRequest.wLength > sizeof(USB_ManufacturerString))
{
len_w = sizeof(USB_ManufacturerString);
}
else
{
len_w = USB_ControlRequest.wLength;
}
pbuffp_w = USB_ManufacturerString;
break;
case 0x02:
if (USB_ControlRequest.wLength > sizeof(USB_ProductString))
{
len_w = sizeof(USB_ProductString);
}
else
{
len_w = USB_ControlRequest.wLength;
}
pbuffp_w = USB_ProductString;
break;
case 0x03:
if (USB_ControlRequest.wLength > sizeof(USB_SerialNumberString))
{
len_w = sizeof(USB_SerialNumberString);
}
else
{
len_w = USB_ControlRequest.wLength;
}
pbuffp_w = USB_SerialNumberString;
break;
default:
Usb_send_control_in();
//Usb_enable_stall_handshake();
break;
}
break;
case REPORT:
if (USB_ControlRequest.wLength > sizeof(USB_ReportDescriptor))
{
len_w = sizeof(USB_ReportDescriptor);
}
else
{
len_w = USB_ControlRequest.wLength;
}
pbuffp_w = USB_ReportDescriptor;
break;
default:
Usb_send_control_in();
//Usb_enable_stall_handshake();
break;
}
USB_Send_Data();
}
void USB_Send_Data(void)
{
if (len_w > USB_ConfigDescriptor[7])
{
USB_Write_Bytes(USB_ConfigDescriptor[7]);
len_w -= USB_ConfigDescriptor[7];
pbuffp_w += USB_ConfigDescriptor[7];
}
else
{
if (len_w != 0)
{
USB_Write_Bytes(len_w);
len_w = 0;
}
else
{
if(zlp == TRUE)
{
Usb_send_control_in();
zlp = FALSE;
}
}
}
}
void USB_Write_Bytes(uint8 temp_len)
{
for (uint8 i=0;i<temp_len;i++)
{
Usb_read_byte() = (*(pbuffp_w+i));
}
Usb_send_control_in();
}
void USB_Read_Bytes(uint8 len_r , uint8 *pbuffp_r)
{
for (uint8 i=0;i<len_r;i++)
{
*(pbuffp_r+i) = Usb_read_byte();
}
} |
|