📄 transfer.c
字号:
endpoint_info *epi_ptr;
INT8U transfer_direction;
INT16U transfer_size;
INT8U err;
epi_ptr = &(dvi_ptr->epi_info[0]); // 获取默认端点描述信息结构指针
transfer_direction = dev_req->bmRequestType>>7; // 请求数据传输方向
transfer_size = dev_req->wLength; // 请求数据长度
err = Control_Setup(dev_req, epi_ptr); //建立阶段
if (0 != err) {
return (err|0x0000);
}
if (transfer_direction & 0x01) { //控制读
if (transfer_size) {
err = Control_In(data_ptr, transfer_size, epi_ptr); //数据阶段
if (0 != err) {
return (err|0x0000);
}
}
USB_Delay(200);
err = Control_Out(data_ptr, 0, epi_ptr); //交换阶段
if (0 != err) {
return (err|0x0000);
}
}
else { //控制写
if (transfer_size) {
err = Control_Out(data_ptr, transfer_size, epi_ptr); //数据阶段
if (0 != err) {
return (err|0x0000);
}
}
USB_Delay(200);
err = Control_In(data_ptr, 0, epi_ptr); //交换阶段
if (0 != err) {
return (err|0x0000);
}
}
return 0;
}
INT8U Bulk_Out( INT8U *data_ptr,
INT32U size,
endpoint_info *epi_ptr)
{
INT8U uc_Data0Addr;
INT8U uc_Data1Addr;
INT8U uc_TranLen;
INT8U uc_UnTranLen;
INT8U uc_Cmd;
INT8U uc_Result;
INT8U uc_Timeout;
INT8U uc_Intr;
//INT8U uc_BufLen;
INT8U uc_Addr;
INT8U uc_Toggle;
uc_Timeout = 0;
uc_Toggle = 0;
uc_Data0Addr = EP0_Buf;
uc_Data1Addr = uc_Data0Addr+ epi_ptr->endpoint_descriptor.wMaxPacketSize;
uc_Addr = uc_Data0Addr;
uc_TranLen = m_MIN(epi_ptr->endpoint_descriptor.wMaxPacketSize, size);
uc_Cmd = sDATA0_WR;
SL811BufWrite(uc_Addr, data_ptr, uc_TranLen);
SL811Write(EP0Status, ((epi_ptr->endpoint_descriptor.bEndpointAddress&0x0F)|PID_OUT)); // PID + EP address
SL811Write(EP0Counter, epi_ptr->dvi_ptr->address); // USB address
SL811Write(EP0Address, uc_Addr); // buffer address, start with "data0"
SL811Write(EP0XferLen, uc_TranLen); // data transfer length
SL811Write(IntStatus,INT_CLEAR); // clear interrupt status
SL811Write(EP0Control, uc_Cmd); // Enable ARM and USB transfer start here
WaitForOver:
while(1) {
uc_Intr = SL811Read(IntStatus); // wait for interrupt to be done, and
if((uc_Intr & USB_RESET) || (uc_Intr & INSERT_REMOVE)) // proceed to parse result from slave
{ // device.
return 0xff; // flag true, so that main loop will
} // know this condition and exit gracefully
if(uc_Intr & USB_A_DONE)
break; // interrupt done !!!
}
SL811Write(IntStatus, INT_CLEAR);
USB_Delay(50);
uc_Result = SL811Read(EP0Status);
uc_UnTranLen = SL811Read(EP0Counter);
if (uc_Result & EP0_ACK) {
size -= uc_TranLen;
data_ptr += uc_TranLen;
uc_Toggle = !uc_Toggle;
if (size) {
uc_Addr = (uc_Toggle&1)?uc_Data1Addr:uc_Data0Addr;
uc_TranLen = m_MIN(size, epi_ptr->endpoint_descriptor.wMaxPacketSize);
uc_Cmd ^= 0x40;
uc_Cmd |= 0x20;
SL811BufWrite(uc_Addr, data_ptr, uc_TranLen);
SL811Write(EP0XferLen, uc_TranLen);
SL811Write(EP0Address, uc_Addr);
SL811Write(IntStatus, INT_CLEAR);
SL811Write(EP0Control, uc_Cmd);
goto WaitForOver;
}
else {
return 0;
}
}
if (uc_Result & EP0_STALL) {
return 0;
}
// EP0_OVERFLOW, EP0_ERROR, EP0_SEQUENCE, EP0_SETUP, EP0_STALL, EP0_TIMEOUT, EP0_NAK
return 0xff;
}
INT8U Bulk_In( INT8U *data_ptr,
INT32U size,
endpoint_info *epi_ptr)
{
INT8U uc_Data0Addr;
INT8U uc_Data1Addr;
INT8U uc_TranLen;
INT8U uc_UnTranLen;
INT8U uc_Cmd;
INT8U uc_Result;
INT8U uc_Timeout;
INT8U uc_Intr;
//INT8U uc_BufLen;
INT8U uc_Addr;
INT8U uc_Toggle;
uc_Timeout = 0;
uc_Toggle = 0;
uc_Data0Addr = EP0_Buf;
uc_Data1Addr = uc_Data0Addr+ epi_ptr->endpoint_descriptor.wMaxPacketSize;
uc_Addr = uc_Data0Addr;
uc_TranLen = m_MIN(epi_ptr->endpoint_descriptor.wMaxPacketSize, size);
uc_Cmd = sDATA0_RD;
SL811Write(EP0Status, ((epi_ptr->endpoint_descriptor.bEndpointAddress&0x0F)|PID_IN)); // PID + EP address
SL811Write(EP0Counter, epi_ptr->dvi_ptr->address); // USB address
SL811Write(EP0Address, uc_Addr); // buffer address, start with "data0"
SL811Write(EP0XferLen, uc_TranLen); // data transfer length
SL811Write(IntStatus,INT_CLEAR); // clear interrupt status
SL811Write(EP0Control, uc_Cmd); // Enable ARM and USB transfer start here
WaitForOver:
while(1) {
uc_Intr = SL811Read(IntStatus); // wait for interrupt to be done, and
if((uc_Intr & USB_RESET) || (uc_Intr & INSERT_REMOVE)) // proceed to parse result from slave
{ // device.
return 0xff; // flag true, so that main loop will
} // know this condition and exit gracefully
if(uc_Intr & USB_A_DONE)
break; // interrupt done !!!
}
SL811Write(IntStatus, INT_CLEAR);
USB_Delay(50);
uc_Result = SL811Read(EP0Status);
uc_UnTranLen = SL811Read(EP0Counter);
if (uc_Result & EP0_ACK) {
SL811BufRead(((uc_Toggle&1)?uc_Data1Addr:uc_Data0Addr), data_ptr, uc_TranLen);
data_ptr += uc_TranLen;
size -= uc_TranLen;
uc_Toggle = !uc_Toggle;
if (size) {
uc_Addr = (uc_Toggle&1)?uc_Data1Addr:uc_Data0Addr;
uc_TranLen = m_MIN(size, epi_ptr->endpoint_descriptor.wMaxPacketSize);
uc_Cmd ^= 0x40;
uc_Cmd |= 0x20;
SL811Write(EP0XferLen, uc_TranLen);
SL811Write(EP0Address, uc_Addr);
SL811Write(IntStatus, INT_CLEAR);
SL811Write(EP0Control, uc_Cmd);
goto WaitForOver;
}
else {
return 0;
}
}
if (uc_Result & EP0_STALL) {
return 0;
}
// EP0_OVERFLOW, EP0_ERROR, EP0_SEQUENCE, EP0_SETUP
return 0xff;
}
INT16U Bulk_Transfer( INT8U direction,
INT8U *data_ptr,
INT32U size,
device_instance *dvi_ptr)
{
endpoint_info *BulkIn_ptr;
endpoint_info *BulkOut_ptr;
INT16U err;
INT8U i;
if (DirectionPID_IN == direction) {
for (i=1; i<MAX_ENDPOINT_NUM; i++) {
if (dvi_ptr->epi_info[i].endpoint_descriptor.bmAttributes == 0x02
&&(dvi_ptr->epi_info[i].endpoint_descriptor.bEndpointAddress&0x80)==0x80) {
BulkIn_ptr = &(dvi_ptr->epi_info[i]);
break;
}
}
if (i == MAX_ENDPOINT_NUM) {
return 0xff;
}
err = Bulk_In(data_ptr, size, BulkIn_ptr);
if (err) {
return err;
}
}
else if(DirectionPID_OUT == direction) {
for(i=1; i<MAX_ENDPOINT_NUM; i++) {
if (dvi_ptr->epi_info[i].endpoint_descriptor.bmAttributes == 0x02
&&(dvi_ptr->epi_info[i].endpoint_descriptor.bEndpointAddress&0x80)==0x00) {
BulkOut_ptr = &(dvi_ptr->epi_info[i]);
break;
}
}
if (i == MAX_ENDPOINT_NUM) {
return 0xff;
}
err = Bulk_Out(data_ptr, size, BulkOut_ptr);
if (err) {
return err;
}
}
else {
return 0xff;
}
return 0;
}
/*
INT8U Bulk_Write( INT8U *data_ptr
INT16U size_ptr
endpoint_info *epi_ptr)
{
INT8U data0_addr;
INT8U data1_addr;
data0_addr = EP0_Buf;
data1_addr = data0_addr + epi_ptr->endpoint_descriptor.wMaxPacketSize;
data0 = EP0_Buf; // DATA0 buffer address
data1 = data0 + (unsigned char)usbstack.wPayload; // DATA1 buffer address
}
INT8U Bulk_Read( INT8U *data_ptr
INT16U size_ptr
endpoint_info *epi_ptr)
{
}
INT8U Bulk_Transfer( INT8U direction,
INT8U *data_ptr,
INT8U *size_ptr,
transfer_instance *hTrInstance)
{
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -