📄 isr.c
字号:
#include <c8051f120.h>
#include <d12interface.h>
#include <usb.h>
CONTROL_XFER ControlData;
#define D12_SETUPPACKET_MASK 0x20
u8 Ep2OutLen; //len of ep2 out data
bool Ep2SendBufferFul = false; //ep2 send buffer has data to send
/* ep0 out interrupt */
void ep0_out()
{
u8 ret, i;
ret = D12_ReadLastTransactionStatus(D12_EPCTLOUT);
if (ret & D12_SETUPPACKET_MASK)
{//setup packet
ControlData.wLength = 0;
ControlData.wCount = 0;
if( D12_ReadEndpointBuffer(0, (u8 *)(&(ControlData.DevRequest)),
sizeof(ControlData.DevRequest)) != sizeof(DEVICE_REQUEST) )
{
//wrong setup packet, set ep0 to stall
D12_SetEndpointStatus(0, 1);
D12_SetEndpointStatus(1, 1);
bEppflags.flags.control_state = USB_IDLE;
return;
}
//u16 data must be swap because d12 & c51 has different byte order
ControlData.DevRequest.wValue = SWAP(ControlData.DevRequest.wValue);
ControlData.DevRequest.wIndex = SWAP(ControlData.DevRequest.wIndex);
ControlData.DevRequest.wLength = SWAP(ControlData.DevRequest.wLength);
// Acknowledge setup here to unlock in/out endp
D12_AcknowledgeEndpoint(0);
D12_AcknowledgeEndpoint(1);
ControlData.wLength = ControlData.DevRequest.wLength;
ControlData.wCount = 0;
if (ControlData.DevRequest.bmRequestType & USB_ENDPOINT_DIRECTION_MASK)
{//device send data to pc
bEppflags.flags.setup_packet = 1;
bEppflags.flags.control_state = USB_TRANSMIT; //USB_IDLE;/* get command */
//control_handler();
}
else
{
if (ControlData.DevRequest.wLength == 0)
{
bEppflags.flags.setup_packet = 1;
bEppflags.flags.control_state = USB_IDLE; /* set command */
}
else
{
if(ControlData.DevRequest.wLength > MAX_CONTROLDATA_SIZE)
{
bEppflags.flags.control_state = USB_IDLE;
D12_SetEndpointStatus(0, 1);
D12_SetEndpointStatus(1, 1);
}
else
{
bEppflags.flags.control_state = USB_RECEIVE; /* set command with OUT
token */
}
} // set command with data
} // else set command
// if setup packet
}
else if (bEppflags.flags.control_state == USB_RECEIVE)
{
i = D12_ReadEndpointBuffer(0,
ControlData.buffer + ControlData.wCount,
EP0_PACKET_SIZE);
ControlData.wCount += i;
if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength)
{
//data received over
bEppflags.flags.setup_packet = 1;
bEppflags.flags.control_state = USB_IDLE;
}
}
else
{
bEppflags.flags.control_state = USB_IDLE;
}
}
void ep0_in()
{
short i = ControlData.wLength - ControlData.wCount;
D12_ReadLastTransactionStatus(1); // Clear interrupt flag
if (bEppflags.flags.control_state != USB_TRANSMIT)
return;
if( i >= EP0_PACKET_SIZE) {
D12_WriteEndpointBuffer(1, ControlData.pData + ControlData.wCount, EP0_PACKET_SIZE);
ControlData.wCount += EP0_PACKET_SIZE;
bEppflags.flags.control_state = USB_TRANSMIT;
}
else if( i != 0) {
D12_WriteEndpointBuffer(1, ControlData.pData + ControlData.wCount, i);
ControlData.wCount += i;
bEppflags.flags.control_state = USB_IDLE;
}
else if (i == 0){
D12_WriteEndpointBuffer(1, 0, 0); // Send zero packet at the end ???
bEppflags.flags.control_state = USB_IDLE;
}
}
//ep1 in
void ep1_in(void)
{
D12_ReadLastTransactionStatus(3); // Clear interrupt flag
}
//ep1 out
void ep1_out(void)
{
u8 len;
D12_ReadLastTransactionStatus(2); // Clear interrupt flag
len = D12_ReadEndpointBuffer(2, Ep1Buf, EP1_PACKET_SIZE);
if(len != 0)
bEppflags.flags.ep1_out = 1;
}
//ep2 (main ep) in
void main_in()
{
D12_ReadLastTransactionStatus(5);
Ep2SendBufferFul = false;
}
//ep2 (main ep) out
void main_out()
{
u8 epstatus;
DISABLE_INTERRUPT;
D12_ReadLastTransactionStatus(4);
epstatus = D12_ReadEndpointStatus(4);
epstatus &= 0x60;
Ep2OutLen = D12_ReadEndpointBuffer(4, Ep2Buf, EP2_PACKET_SIZE);
if (epstatus == 0x60)
Ep2OutLen += D12_ReadEndpointBuffer(4, Ep2Buf+EP2_PACKET_SIZE, EP2_PACKET_SIZE); //read double buf data
if (Ep2OutLen != 0)
bEppflags.flags.ep2_out = 1;
else
ENABLE_INTERRUPT;
}
/* external interrupt handle rounter */
void D12Int_Handler() interrupt 0
{
u16 ret;
bEppflags.flags.in_isr = 1;
ret = D12_ReadInterruptRegister();
if (ret & 0x1) //control ep out
{
ep0_out();
}
if (ret & 0x2) //control ep in
{
ep0_in();
}
if (ret & 0x4) //ep1 out
{
ep1_out();
}
if (ret & 0x8) //ep1 in
{
ep1_in();
}
if (ret & 0x10) //ep2 out
{
main_out();
}
if (ret & 0x20) //ep2 in
{
main_in();
}
if (ret & 0x40) //system reset
{
bEppflags.flags.bus_reset = 1;
}
if (ret & 0x80)
{
bEppflags.flags.suspend = 1;
}
bEppflags.flags.in_isr = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -