📄 gfd_usb_hl.c.bak
字号:
}
}
else
{
/*out transfer*/
ti = desc_len;
urb = head;
j=ti/64;
usbmod = ti%64;
if(desc_len <= 64)
{
USB_DMA_TRANS_RX((U32)USB_RXFIFO,(U32)urb,0x32,0x32,0x16,0x0,0x10);
}
else
{
longpk = LONGPKSTATE;
USB_DMA_TRANS_RX((U32)USB_RXFIFO,(U32)urb,0x32,0x32,0x16,0x0,j*0x10);
longurb = head + j*64;
}
}
}
/*
* H A _ I N T _ H A N D L E R _ U S B S E R V I C E
*/
U8 *get_irq_request_cmd(void)
{
static U8 command[8];
command[0] = usb_chang_reg32_to_reg8(USB_EP0OUTBMREQTYPE);
command[1] = usb_chang_reg32_to_reg8(USB_EP0OUTBREQUEST);
command[2] = usb_chang_reg32_to_reg8(USB_EP0OUTWVALUE);
command[3] = usb_get_regbit15_to_8(USB_EP0OUTWVALUE);
command[4] = usb_chang_reg32_to_reg8(USB_EP0OUTWINDEX);
command[5] = usb_get_regbit15_to_8(USB_EP0OUTWINDEX);
command[6] = usb_chang_reg32_to_reg8(USB_EP0OUTWLENGTH);
command[7] = usb_get_regbit15_to_8(USB_EP0OUTWLENGTH);
return command;
}
void usb_irq_setup(void)
{
U8* command_request;
command_request = get_irq_request_cmd();
pdc_bus_ctrl_pipe_notificaion(PDC_SETUP_COMMAND, command_request);
if(setconstate == SETCONFIG)
{
setconstate = NSETCONFIG;
}
else
{
transcl(head_temp);
}
return;
}
U32 pdc_bus_ctrl_pipe_notificaion(unsigned long notif_type, unsigned char *cmd)
{
U8 RequestType;
U8 bmRequest ;
if(notif_type == PDC_SETUP_COMMAND)
{
/* SETUP Command from the control pipe */
RequestType = cmd[0] & 0x60;
switch(RequestType)
{
case STANDARD_REQUEST:
/* Process USB Standrad request */
bmRequest = cmd[1];
switch (bmRequest)
{
case GET_DESCRIPTOR:
usb_RMW_reg(USB_EP0OUTSTAT,0x0a);
stat_des = 1;
pdc_bus_get_descriptor(cmd);
break;
case SET_CONFIGURATION:
usb_RMW_reg(USB_EP0OUTSTAT,0x0a);
stat_conf = 1;
pdc_bus_SET_CONFIGURATION();
setconstate = SETCONFIG;
break;
default:
usb_RMW_reg(USB_EP0OUTSTAT,0x0a);
stat_defa = 1;
break;
}
case CLASS_REQUEST:
case VENDOR_REQUEST:
usb_RMW_reg(USB_EP0OUTSTAT,0x0a);
bmRequest = cmd[1];
if(bmRequest == 0xFE)
{
head_temp = empty;
desc_len = 1;
}
break;
default:
usb_RMW_reg(USB_EP0OUTSTAT,0x0a);
stat_defa1 = 1;
break;
}
}
return 0;
}
void pdc_bus_get_descriptor(U8 *command)
{
U16 req_len;
U8 des_tmp;
switch( command[3])
{
case PDC_DEV_DESC_TYPE:
head_temp = (unsigned char *)device_desc;
root = (unsigned char *)device_desc;
desc_len = 0x12;//sizeof(device_desc);
break;
case PDC_CONFIG_DESC_TYPE:
head_temp = (unsigned char *)conf_desc;
root = (unsigned char *)conf_desc;
des_tmp = command[6]|(command[7]<<8);
desc_len = (des_tmp > 0x20)? 0x20 : des_tmp;
if(des_tmp > 0x20)
statempty = EMPTY;
break;
case PDC_STRING_DESC_TYPE:
switch(command[2])
{
case 0:
head_temp = unicode_string;
root = unicode_string;
desc_len = sizeof(unicode_string);
break;
case 1:
head_temp = mfg_string;
root = mfg_string;
desc_len = sizeof(mfg_string);
break;
case 2:
head_temp = product_string;
root = product_string;
desc_len = sizeof(product_string);
break;
case 3:
head_temp = serial_string;
root = serial_string;
desc_len = sizeof(serial_string);
break;
default:
break;
}
break;
default:
break;
}
//urb
if(head_temp)
{
/* Get max length that remote end wants */
req_len =command[6]|(command[7]<<8);
if (desc_len > req_len )
{
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 = desc_len;
urb = head;
if(ti < 8)
{
*(RP)(USB_TXLENGTH) = ti;//the pocket, less than 8 bytes
}
else
{
*(RP)(USB_TXLENGTH) = 8;
}
j=ti/8;
usbmod = ti%8;
if(usbstate == USBCG)
{
if(desc_len <= 8)
{
USB_DMA_TRANS_TX((U32)urb,(U32)USB_TXFIFO,0x32,0x32,0x16,0x0,0x10);
}
else
{
longpk = LONGPKSTATE;
longurb = head + j*64;
USB_DMA_TRANS_TX((U32)urb,(U32)USB_TXFIFO,0x32,0x32,0x16,0x0,j*0x10);
}
}
else
{
/*the first pocket*/
usbstate = USBCG;//modified
USB_DMA_TRANS_TX((U32)urb,(U32)USB_TXFIFO,0x32,0x32,0x16,0x0,0x10);
}
}
ER HA_GFDUSB_INTHANDLE(void) //;when there is usb interrupt,the process starts
{
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))
{
epstate = EPCL;
while(1)
{
/* Read IRQ status*/
evnt = intr & (SETUP|IN|OUT|PING|TRAERR|ACK|STCOV|CTRAERR|RESET) & (~imask);
/* No irq? */
if (evnt==0)
{
return 0;
}
if(evnt & RESET)
{
//for(i;i<21;i++);
head_temp = NULL;
desc_len = 1;
state1 = 1;
urb_num = 0;
stat_des = 0;
stat_add = 0;
stat_conf = 0;
stat_defa = 0;
stat_out1 = 0;
stat_defa1 =0;
stat_ack = 0;
stat_in = 0;
statep1 = 0;
state_in = 0;
state3 = 0;
stateep1 = 0;
descactu_len = 0;
requlen = 0;
//usbstate = USBDEF;
bulkstat = BULKOUTSTAT;
transstat = TRANSBG;
bulkinepstat = BULKINDO;
longpk = SHORTPK;
statempty = NEMPTY;
setconstate = NSETCONFIG;
blkstate = BLKCMD;
usbmod = 0;
unsinglepocket = UNSINGLE;
sing = UNSI;
timen = 0;
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_RMW_clrreg(USB_INTR,0x7ffffdff);
}
if(evnt & out)
{
OUTINTR();
usb_RMW_clrreg(USB_INTR,0x7ffffffb);
evnt = usb_lock_readreg(USB_INTR);
}
if( evnt & setup)
{
usb_irq_setup();
usb_RMW_clrreg(USB_INTR,0x7ffffffe);
evnt = usb_lock_readreg(USB_INTR);
}
if(evnt & ping)
{
usb_RMW_clrreg(USB_INTR,0x7ffffff7);
evnt = usb_lock_readreg(USB_INTR);
}
if(evnt & traerr)
{
usb_RMW_clrreg(USB_INTR,0x7fffffef);
evnt = usb_lock_readreg(USB_INTR);
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);
evnt = usb_lock_readreg(USB_INTR);
}
if(evnt & ctraerr)
{
usb_RMW_clrreg(USB_INTR,0x7fffff7f);;
evnt = usb_lock_readreg(USB_INTR);
}
intr = usb_lock_readreg(USB_INTR);
imask = usb_read_reg(USB_INTRMASK);
}
}
else
{
epstate = EPBULK;
evnt = intr & (SETUP|IN|OUT|PING|TRAERR|ACK|STCOV|CTRAERR) & (~imask);
if(evnt & OUT)
{
OUTINTR();
usb_RMW_clrreg(USB_INTR,0x7ffffffb);
}
}
}
/*OUT POCKET HANDLE*/
ER OUTINTR(void)
{
U32 t,t1,t2,outtime=0;
int ti,j;
ER stat;
stat_out1++ ;
stat = usb_lock_readreg(USB_EPINFO);
if((stat &= 0x1f) != 0x0)
{
/* NON0EDNP HANDLE*/
state_in = 0;
statep1 = 1;//endp1 transport
/*BLK CMD STATE*/
if(blkstate == BLKCMD)
{
usb_write_reg((U32)USB_INTRMASK, 0x126);
t2 = *(RP)(USB_RECEIVETYPE) & 0x4;
while((t2 == 0x0) && (outtime < 1000))
{
t2 = *(RP)(USB_RECEIVETYPE) & 0X4;
outtime++;
}
if(outtime < 1000)
{
if(t2 == 0x4)
{
R = RX;
/*CBW STATE*/
USB_DMA_TRANS_RX((U32)USB_RXFIFO,(U32)R,0x32,0x32,0x16,0x0,0x10);
R = R + 64;
t = usb_read_reg(USB_RXLENGTH);
if(t != 64)
{
t = 64 - t;
R = R - t;
}
}
}
}
}
else
{
statep1 = 0;
*(RP)USB_RECEIVETYPE &= 0x07;
}
return(0);
}
void ENT_INT_USB(void)
{
ent_int();
mask_irq(INT_USB);
HA_GFDUSB_INTHANDLE();
unmask_irq(INT_USB);
ret_int();
}
#if 0
INT nor_rd_io(UINT16 driveno, UINT32 page, VOID FAR *buffer, UINT16 count, INT do_read)
{
UINT8 *p;
UINT32 ltemp,tempblknum;
UINT32 page_number;
UINT32 byte_number;
INT16 i;
UINT8 *pbuffer, *ptempbuffer;
INT flag;
/* We don't use drive no. You could have multiple drives if wanted */
driveno = driveno;
pbuffer = (UINT8 *)buffer;
flag = do_read;
flag &= 1;
while (count)
{
byte_number = 512*(page & 0x1ff);
tempblknum = (page >> 9);
/* Check. This shouldn't happen */
//if ( (page_number >= NUM_RAMDISK_PAGES) || !nor_rd_pages[page_number] )
// return(NO);
if(tempblknum != g_nor_blknum)
{
if (flag)
{
p = (UINT8 *)(FAT_FLASH_STARTADD + page * 512);
drv_flash_read(( unsigned char *)pbuffer, (unsigned int *)p, 512 );
}
else
{
drv_flash_write (( unsigned char *) g_nor_buf,( unsigned int *) (g_nor_blknum*512*512 + FAT_FLASH_STARTADD), FLASH_AREA_SIZE );
drv_flash_read(( unsigned char *)g_nor_buf, (unsigned int *)(tempblknum*512*512 + FAT_FLASH_STARTADD), FLASH_AREA_SIZE);
for (i = 0; i < 512; i++)
g_nor_buf[byte_number+i] = *pbuffer++;
g_nor_blknum = tempblknum;
}
}
else
{
if (flag)
{
for (i = 0; i < 512; i++)\
{
*pbuffer++ = g_nor_buf[byte_number+i];
}
}
else
{
for (i = 0; i < 512; i++)
{
g_nor_buf[byte_number+i] = *pbuffer++;
}
}
}
count--;
page++;
}
if(do_read&FLUSH)
drv_flash_write (( unsigned char *) g_nor_buf,( unsigned int *) (g_nor_blknum*512*512 + FAT_FLASH_STARTADD), FLASH_AREA_SIZE );
return(YES);
}
#endif
void usbswap_data(U32 *src, U16 len)
{
char *psrc, *pdst, tmp;
int i;
psrc = (char *)src;
for(i = 0; i < len*128; i++)
{
tmp = *psrc+3;
*(psrc+3) = *psrc;
*psrc = tmp;
tmp = *(psrc+2);
*(psrc+2) = *(psrc+1);
*(psrc+1) = tmp;
src++;
psrc = (char *)src;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -