📄 d12_user.c
字号:
// =========================================
// 文件名称:D12_User.c
// 功能描述:PDIUSBD12应用层
// 维护记录:modified by liuxue v1.0 2007-03-15
// =========================================
#include "SPCE061A.h"
#include "D12_Driver.h"
#include "System.h"
CONTROL_TRANSFERS ControlData;
EPPFLAGS bEPPflags;
// =========================================
// 函数:void (*StandardDeviceRequest[])(void)
// 描述:标准请求处理
// 参数:无
// 返回:无
// =========================================
void (*StandardDeviceRequest[])(void) =
{
D12_Get_Status,
D12_Clear_Feature,
D12_Reserved,
D12_Set_Feature,
D12_Reserved,
D12_Set_Address,
D12_Get_Descriptor,
D12_Reserved,
D12_Get_Configuration,
D12_Set_Configuration,
D12_Get_Interface,
D12_Set_Interface,
D12_Reserved,
D12_Reserved,
D12_Reserved,
D12_Reserved
};
// =========================================
// 函数:void D12_Control_Handler(void)
// 描述:控制传输
// 参数:无
// 返回:无
// =========================================
void D12_Control_Handler(void)
{
unsigned int type, req;
type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
if(type == USB_STANDARD_REQUEST)
{
(*StandardDeviceRequest[req])();
}
else
D12_Stall_Ep0();
}
// =========================================
// 函数:void D12_Disconnect_USB(void)
// 描述:USB软连接断开
// 参数:无
// 返回:无
// =========================================
void D12_Disconnect_USB(void)
{
D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_4M);
}
// =========================================
// 函数:void D12_Connect_USB(void)
// 描述:USB软连接
// 参数:无
// 返回:无
// =========================================
void D12_Connect_USB(void)
{
D12_SetMode(D12_NOLAZYCLOCK | D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_4M);
}
// =========================================
// 函数:void D12_Reconnect_USB(void)
// 描述:USB重连接
// 参数:无
// 返回:无
// =========================================
void D12_Reconnect_USB(void)
{
int i, j;
D12_Disconnect_USB();
for(i=0; i<=500; i++)
{
for(j=0; j<1000; j++)
*P_Watchdog_Clear = 0x01;
};
D12_Connect_USB();
}
// =========================================
// 函数:void D12_USB_Isr(void)
// 描述:USB重连接
// 参数:无
// 返回:无
// =========================================
void D12_USB_Isr(void)
{
unsigned int i_st;
bEPPflags.bits.in_isr = 1;
i_st = D12_ReadInterruptRegister();
if(i_st != 0)
{
if(i_st & D12_INT_BUSRESET)
{
bEPPflags.bits.bus_reset = 1;
}
if(i_st & D12_INT_EOT)
{
D12_DMA_Eot();
}
if(i_st & D12_INT_SUSPENDCHANGE)
{
bEPPflags.bits.suspend = 1;
}
if(i_st & D12_INT_ENDP0IN)
{
D12_Ep0_TxDone();
}
if(i_st & D12_INT_ENDP0OUT)
{
D12_Ep0_RxDone();
}
if(i_st & D12_INT_ENDP1IN)
{
D12_Ep1_TxDone();
}
if(i_st & D12_INT_ENDP1OUT)
{
D12_Ep1_RxDone();
}
if(i_st & D12_INT_ENDP2IN)
{
D12_Main_TxDone();
}
if(i_st & D12_INT_ENDP2OUT)
{
D12_Main_RxDone();
}
}
bEPPflags.bits.in_isr = 0;
}
// =========================================
// 函数:void D12_DMA_Eot(void)
// 描述:PDIUSBD12的DMA处理
// 参数:无
// 返回:无
// =========================================
void D12_DMA_Eot(void)
{
}
// =========================================
// 函数:void D12_Ep0_RxDone(void)
// 描述:端点0,接收数据处理
// 参数:无
// 返回:无
// =========================================
void D12_Ep0_RxDone(void)
{
unsigned int i;
unsigned int I_uiBuffer_Data_Length = 0;
unsigned int ep_last;
ep_last = D12_ReadLastTransactionStatus(0); // Clear interrupt flag
if(ep_last & D12_SETUPPACKET)
{
ControlData.wLength = 0;
ControlData.wCount = 0;
//判断端点是否满,如是,则取出
I_uiBuffer_Data_Length = D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest), (unsigned int *)(&(ControlData.DeviceRequest)));
if(I_uiBuffer_Data_Length != sizeof(DEVICE_REQUEST))
{
D12_SetEndpointStatus(0, 1);
D12_SetEndpointStatus(1, 1);
bEPPflags.bits.control_state = USB_IDLE;
return;
}
// Acknowledge setup here to unlock in/out endp
// 向控制输出端点发送应答建立命令以重新使能下一个建立阶段
D12_AcknowledgeEndpoint(0);
D12_AcknowledgeEndpoint(1);
ControlData.wLength = ControlData.DeviceRequest.wLength;
ControlData.wCount = 0;
if(ControlData.DeviceRequest.bmRequestType & (unsigned int)USB_ENDPOINT_DIRECTION_MASK)
{
bEPPflags.bits.setup_packet = 1;
bEPPflags.bits.control_state = USB_TRANSMIT; /* get command */
}
else
{
if(ControlData.DeviceRequest.wLength == 0)
{
bEPPflags.bits.setup_packet = 1;
bEPPflags.bits.control_state = USB_IDLE; /* set command */
}
else
{
if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE)
{
bEPPflags.bits.control_state = USB_IDLE;
D12_SetEndpointStatus(0, 1);
D12_SetEndpointStatus(1, 1);
}
else
{
bEPPflags.bits.control_state = USB_RECEIVE; /* set command with OUT token */
}
} // set command with data
} // else set command
} // if setup packet
else if(bEPPflags.bits.control_state == USB_RECEIVE)
{
i = D12_ReadEndpoint(0, EP0_PACKET_SIZE,
ControlData.dataBuffer + ControlData.wCount);
ControlData.wCount += i;
if(i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength)
{
bEPPflags.bits.setup_packet = 1;
bEPPflags.bits.control_state = USB_IDLE;
}
}
else
{
bEPPflags.bits.control_state = USB_IDLE;
}
}
// =========================================
// 函数:void D12_Ep0_TxDone(void)
// 描述:端点0,发送数据处理
// 参数:无
// 返回:无
// =========================================
void D12_Ep0_TxDone(void)
{
unsigned long int i = ControlData.wLength - ControlData.wCount;
D12_ReadLastTransactionStatus(1);
if(bEPPflags.bits.control_state != USB_TRANSMIT)
return;
if(i >= EP0_PACKET_SIZE)
{
D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
ControlData.wCount += EP0_PACKET_SIZE;
bEPPflags.bits.control_state = USB_TRANSMIT;
}
else if(i != 0)
{
D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
ControlData.wCount += i;
bEPPflags.bits.control_state = USB_IDLE;
}
else if(i == 0)
{
D12_WriteEndpoint(1, 0, 0); // Send zero packet at the end
bEPPflags.bits.control_state = USB_IDLE;
}
}
// =========================================
// 函数:void D12_Ep1_TxDone(void)
// 描述:端点1,发送数据处理
// 参数:无
// 返回:无
// =========================================
void D12_Ep1_TxDone(void)
{
bEPPflags.bits.Ep1_SendDataFlag = 1;
D12_ReadLastTransactionStatus(3); // Clear interrupt flag
}
// =========================================
// 函数:void D12_Ep1_RxDone(void)
// 描述:端点1,接收数据处理
// 参数:无
// 返回:无
// =========================================
void D12_Ep1_RxDone(void)
{
bEPPflags.bits.Ep1_ReceiveDataFlag = 1;
}
// =========================================
// 函数:void D12_Main_TxDone(void)
// 描述:端点2,发送数据处理
// 参数:无
// 返回:无
// =========================================
void D12_Main_TxDone(void)
{
bEPPflags.bits.Ep2_SendDataFlag = 1;
D12_ReadLastTransactionStatus(5); // Clear D12 interrupt flag
if(G_UpLoad_Flag == 1)
{
UpLoad();
}
}
// =========================================
// 函数:void D12_Main_RxDone(void)
// 描述:端点2,接收数据处理
// 参数:无
// 返回:无
// =========================================
void D12_Main_RxDone(void)
{
bEPPflags.bits.Ep2_ReceiveDataFlag = 1;
if(G_UpLoad_Flag == 2)
{
DownLoad();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -