📄 gfd_usb_hl.c
字号:
}
}
return 0;
}
void pdc_bus_get_descriptor(U8 *command)
{
U16 req_len;
U8 des_tmp;
switch( command[3])
{
case PDC_DEV_DESC_TYPE:
MSDevice.dUSBTrans.head_temp = device_desc;
MSDevice.dUSBTrans.desc_len = 0x12;
break;
case PDC_CONFIG_DESC_TYPE:
MSDevice.dUSBTrans.head_temp = conf_desc;
des_tmp = command[6]|(command[7]<<8);
MSDevice.dUSBTrans.desc_len = (des_tmp > 0x20)? 0x20 : des_tmp;
if(des_tmp > 0x20)
MSDevice.dCtrlTrans.statempty = EMPTY;
break;
case PDC_STRING_DESC_TYPE:
switch(command[2])
{
case 0:
MSDevice.dUSBTrans.head_temp = (U32*)(unsigned char *)unicode_string;
MSDevice.dUSBTrans.desc_len = sizeof(unicode_string);
break;
case 1:
MSDevice.dUSBTrans.head_temp = (U32*)(unsigned char *)mfg_string;
MSDevice.dUSBTrans.desc_len = sizeof(mfg_string);
break;
case 2:
MSDevice.dUSBTrans.head_temp = (U32*)(unsigned char *)product_string;
MSDevice.dUSBTrans.desc_len = sizeof(product_string);
break;
case 3:
MSDevice.dUSBTrans.head_temp = (U32*)(unsigned char *)serial_string;
MSDevice.dUSBTrans.desc_len = sizeof(serial_string);
break;
default:
break;
}
break;
default:
break;
}
//urb
if(MSDevice.dUSBTrans.head_temp)
{
/*传输所要求的长度的数据 */
req_len =command[6]|(command[7]<<8);
if (MSDevice.dUSBTrans.desc_len > req_len )
{
MSDevice.dUSBTrans.desc_len = req_len ;
}
}
}
void pdc_bus_SET_CONFIGURATION(void)
{
return;
}
U32 transcl(unsigned char *head)
{
unsigned char *urb;
int j, ti;
U32 t;
ti = MSDevice.dUSBTrans.desc_len;
urb = head;
if(ti < 8)
{
*(RP)(USB_TXLENGTH) = ti;//SETUP事务的数据包长度每次不超过8个字节--由硬件决定
}
else
{
*(RP)(USB_TXLENGTH) = 8;
}
j=ti/8;
MSDevice.dUSBTrans.usbmod = ti%8;
if(MSDevice.dUSBStat.usbstate == USBCG)
{
if(MSDevice.dUSBTrans.desc_len <= 8)
{
USB_DMA_TRANS_TX((U32)urb,(U32)USB_TXFIFO,0x32,0x32,0x16,CHAN,0x10);
}
else
{
MSDevice.dUSBTrans.longpk = LONGPKSTATE;
MSDevice.dUSBTrans.longurb = head + j*64;
if(MSDevice.dUSBTrans.usbmod ||(MSDevice.dCtrlTrans.statempty == EMPTY))
{
MSDevice.dUSBStat.usbdmapp = APP;
}
else if (!MSDevice.dUSBTrans.usbmod)
{
MSDevice.dUSBTrans.longpk = SHORTPK;
}
USB_DMA_TRANS_TX((U32)urb,(U32)USB_TXFIFO,0x32,0x32,0x16,CHAN,j*0x10);
}
}
else //第一个包传输
{
MSDevice.dUSBStat.usbstate = USBCG;//标志配置主机
USB_DMA_TRANS_TX((U32)urb,(U32)USB_TXFIFO,0x32,0x32,0x16,CHAN,0x10);
}
}
ER HA_GFDUSB_INTHANDLE(void) //USB 中断处理程序
{
ER Epstat;
U32 evnt,intr,imask;
int i;
intr = usb_lock_readreg(USB_INTR);
imask = usb_read_reg(USB_INTRMASK);
Epstat = usb_lock_readreg(USB_EPINFO);
if(((Epstat &= 0x1f)== 0) || ((Epstat &= 0x1f)== 1))
{
MSDevice.dUSBStat.epstate = EPCL;
while(1)
{
/* 读中断寄存器*/
evnt = intr & (SETUP|IN|OUT|PING|TRAERR|ACK|STCOV|CTRAERR|RESET) & (~imask);
/* 判断是否有中断 */
if (evnt==0)
{
return 0;
}
if(evnt & RESET)
{
MSDevice.dUSBTrans.head_temp = (U32*)NULL;
MSDevice.dUSBTrans.desc_len = 1;
MSDevice.dBulkStat.descactu_len = 0;
MSDevice.dCBW.requlen = 0;
MSDevice.dUSBTrans.longpk = SHORTPK;
MSDevice.dCtrlTrans.statempty = NEMPTY;
MSDevice.dUSBStat.setconstate = NSETCONFIG;
MSDevice.dBulkStat.blkstate = BLKCMD;
MSDevice.dUSBTrans.usbmod = 0;
MSDevice.dBulkStat.unsinglepocket = UNSINGLE;
MSDevice.dCSW.sing = UNSI;
MSDevice.dBulkData.longblk = SHORTBLK;
MSDevice.dUSBStat.usbdmapp = NAPP;
usb_write_reg((U32)USB_EP0OUTSTAT, 0x02);
usb_write_reg((U32)USB_EP1OUTSTAT, 0x02);
usb_write_reg((U32)USB_EP2INSTAT, 0x02);
usb_write_reg((U32)USB_INTR, 0x0);
usb_write_reg((U32)USB_INTRMASK, 0x172);
usb_RMW_clrreg(USB_INTR,0x7ffffdff);
}
if(evnt & out)
{
OUTINTR();
usb_RMW_clrreg(USB_INTR,0x7ffffffb);
}
if( evnt & setup)
{
usb_irq_setup();
usb_RMW_clrreg(USB_INTR,0x7ffffffe);
}
if(evnt & ping)
{
usb_RMW_clrreg(USB_INTR,0x7ffffff7);
while(1);
}
if(evnt & traerr)
{
usb_RMW_clrreg(USB_INTR,0x7fffffef);
while(1);
}
if (evnt & stcov)
{
usb_write_reg(USB_PKTPASSEDCTRL,0x00);
usb_write_reg(USB_PKTDROPPEDCTRL,0x00);
usb_write_reg(USB_CRCERRCTRL,0x00);
usb_write_reg(USB_BITSTUFFERRCTRL,0x00);
usb_write_reg(USB_PIDERRCTRL,0x00);
usb_write_reg(USB_FRAMINGERrCTRL,0x00);
usb_write_reg(USB_TXPKTCTRL,0x00);
usb_RMW_clrreg(USB_INTR,0x7fffffbf);
}
if(evnt & ctraerr)
{
usb_RMW_clrreg(USB_INTR,0x7fffff7f);
}
intr = usb_lock_readreg(USB_INTR);
imask = usb_read_reg(USB_INTRMASK);
}
}
else
{
MSDevice.dUSBStat.epstate = EPBULK;
evnt = intr & (SETUP|IN|OUT|PING|TRAERR|ACK|STCOV|CTRAERR|RESET) & (~imask);
if(evnt & OUT)
{
OUTINTR();
usb_RMW_clrreg(USB_INTR,0x7ffffffb);
}
}
if(evnt & RESET)
{
usb_RMW_clrreg(USB_INTR,0x7ffffdff);
}
if (evnt & stcov)
{
usb_write_reg(USB_PKTPASSEDCTRL,0x00);
usb_write_reg(USB_PKTDROPPEDCTRL,0x00);
usb_write_reg(USB_CRCERRCTRL,0x00);
usb_write_reg(USB_BITSTUFFERRCTRL,0x00);
usb_write_reg(USB_PIDERRCTRL,0x00);
usb_write_reg(USB_FRAMINGERrCTRL,0x00);
usb_write_reg(USB_TXPKTCTRL,0x00);
usb_RMW_clrreg(USB_INTR,0x7fffffbf);
while(1);
}
if(evnt & traerr)
{
usb_RMW_clrreg(USB_INTR,0x7fffffef);
while(1);
}
}
/*响应主机的OUT 请求*/
ER OUTINTR(void)
{
U32 t1,t2;
int ti,j;
ER stat;
volatile U32 i;
stat = usb_lock_readreg(USB_EPINFO);
if((stat &= 0x1f) != 0x0)
{
/*BLKCMD 阶段*/
if(MSDevice.dBulkStat.blkstate == BLKCMD)
{
usb_write_reg((U32)USB_INTRMASK, 0x176);
t2 = *(RP)(USB_RECEIVETYPE) & 0x4;
while((t2 == 0x0))
{
t2 = *(RP)(USB_RECEIVETYPE) & 0X4;
}
if(t2 == 0x4)
{
/*CBW 阶段*/
MSDevice.dUSBStat.usbdmapp = APP;
USB_DMA_TRANS_RX((U32)USB_RXFIFO,(U32)MSDevice.dCBW.RX,0x32,0x32,0x16,CHAN,0x10);
i = *(volatile U32 *)DMACCConfiguration;
while((i & 0x1) != 0)
{
i = *(volatile U32 *)DMACCConfiguration;
}
}
}
}
else
{
*(RP)USB_RECEIVETYPE &= 0x07;
}
return(0);
}
#ifdef OS_LIB_DEBUG
/*USB中断响应程序*/
void ENT_INT_USB(void)
{
ent_int();
mask_irq(INT_USB);
HA_GFDUSB_INTHANDLE();
unmask_irq(INT_USB);
ret_int();
}
#endif
/*ramdisk驱动程序*/
INT usbpc_rd_io(int driveno, int block, void *buffer, int count,
INT reading)
{
#ifdef WORDWRITE
UINT32 *p;
UINT32 ltemp;
UINT16 page_number;
UINT32 byte_number;
INT16 i;
UINT32 *pbuffer;
#else
UINT8 *p;
UINT32 ltemp;
UINT16 page_number;
UINT16 byte_number;
INT16 i;
UINT8 *pbuffer;
#endif
#ifdef WORDWRITE
// We don't use drive no. You could have multiple drives if wanted
driveno = driveno;
pbuffer = (UINT32 *)buffer;
while (count)
{
// Get the page number
ltemp = block / RAMDISK_PAGE_SIZE;
page_number = (UINT16) ltemp;
// Check. This shouldn't happen
if ( (page_number >= NUM_RAMDISK_PAGES) || !rd_pages[page_number] )
return(NO);
// Get the offset
ltemp = block % RAMDISK_PAGE_SIZE;
byte_number = (UINT32) (ltemp*128);
p = (UINT32 *)rd_pages[page_number];
p += byte_number;
if (reading&0x01) // &0x01 for flash flush.
{
for (i = 0; i < 128; i++)
*pbuffer++ = *p++;
}
else
{
for (i = 0; i < 128; i++)
*p++ = *pbuffer++;
}
count--;
block++;
}
#else
// We don't use drive no. You could have multiple drives if wanted
driveno = driveno;
pbuffer = (UINT8 *)buffer;
while (count)
{
// Get the page number
ltemp = block / RAMDISK_PAGE_SIZE;
page_number = (UINT16) ltemp;
// Check. This shouldn't happen
if ( (page_number >= NUM_RAMDISK_PAGES) || !rd_pages[page_number] )
return(NO);
// Get the offset
ltemp = block % RAMDISK_PAGE_SIZE;
byte_number = (UINT16) (ltemp*512);
p = rd_pages[page_number];
p += byte_number;
if (reading&0x01) // &0x01 for flash flush.
{
for (i = 0; i < 512; i++)
*pbuffer++ = *p++;
}
else
{
for (i = 0; i < 512; i++)
*p++ = *pbuffer++;
}
count--;
block++;
}
#endif
return(YES);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -