📄 gfd_usb_hl.c
字号:
unsigned char Ucode_15[]= {
0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x02, 0x00, 0x1c, 0x0a, 0x80, 0x04,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
unsigned char Ucode_1A[]= {
0x0b, 0x00, 0x00, 0x00, 0x1c, 0x06, 0x00, 0x05,
0x00, 0x00, 0x00, 0x00};
/*-------------------------------------------------------------------*
* define declarations
*-------------------------------------------------------------------*/
/*-------------------------------------------------------------------*
* extern variable declerations
*-------------------------------------------------------------------*/
extern UINT8 *rd_pages[NUM_RAMDISK_PAGES];
extern UINT8 g_nor_buf[256*1024];
extern int g_nor_blknum;
/*-------------------------------------------------------------------*
* extern function decleratios
*-------------------------------------------------------------------*/
extern ER usb_write_reg(U32 reg, U32 val);
extern ER usb_read_reg(U32 reg);
extern U8 usb_chang_reg32_to_reg8(U32 reg);
extern U16 usb_change_reg32_to_reg16(U32 reg);
extern U8 usb_get_regbit15_to_8(U32 reg);
extern ER USB_DMA_TRANS_RX(U32 srcadd, U32 destadd, U32 srcwidth, U32 destwidth, U32 srcsize, U32 channelnum, U32 transnum);
extern ER USB_DMA_TRANS_TX(U32 srcadd, U32 destadd, U32 srcwidth, U32 destwidth, U32 srcsize, U32 channelnum, U32 transnum);
extern ER usb_lock_readreg(U32 reg);
extern ER usb_RMW_reg(U32 reg, U32 val);
extern ER usb_RMW_clrreg(U32 reg, U32 val);
extern INT nor_rd_io(UINT16 driveno, UINT32 page, VOID FAR *buffer, UINT16 count, INT do_read);
/*-------------------------------------------------------------------*
* local function definitions
*-------------------------------------------------------------------*/
/*
*bulk transmit: command block wrapper
*/
U32 usb_bulk(void)
{
U8 k;
for(k=0; k<31; k++)
cbw[k] = RX[k];
if(blt <120)
{
for(k=0;k<31;k++)
{
analys[blt][k] = RX[k];
}
blt++;
}
#if 0
blt--;
if(analys[blt][19] == 0x02)
{
while(1);
}
blt++;
#endif
if(cbw[0] != 0x55)
return -1;
if(cbw[1] != 0x53)
return -1;
if(cbw[2] != 0x42)
return -1;
if(cbw[3] == 0x43)
usb_bulk_cbw();
return 0;
}
U32 usb_bulk_cbw(void)
{
U32 cbwtag;
U8 cbw_len; //the valid length of the cbw in bytes
U8 ti;
cbwtag = ((cbw[7]<<24)|(cbw[6]<<16)|(cbw[5]<<8)|(cbw[4]));
cbw_dtl = ((cbw[11]<<24)|(cbw[10]<<16)|(cbw[9]<<8)|(cbw[8]));
cbw_direct = cbw[12];
cbw_len = cbw[14];
for(ti=0; ti<12; ti++)
ufi_cmd[ti] = 0;
for(ti=0; ti<cbw_len; ti++)
ufi_cmd[ti] = cbw[15+ti];
bulk_commmand();
return cbwtag;
}
/*
* UFI COMMAND FUNCTION
*/
void bulk_commmand(void)
{
U8 command;
U16 translen;
command = ufi_cmd[0];
/*if((ufi_cmd[0] == 0x28) && (ufi_cmd[4] ==0x40) )
{
while(1);
}*/
lblkaddr = (((U32)ufi_cmd[2]) << 24) | (((U32)ufi_cmd[3]) << 16) | (((U32)ufi_cmd[4]) << 8) | ((U32)ufi_cmd[5]);
translen = (((U16)ufi_cmd[7]) << 8) | ((U16)ufi_cmd[8]);
switch(command)
{
case INQUIRY:
desc_len = 0x24;//sizeof (UInquiry);modified
head_temp = UInquiry;
descactu_len = 0x24;//sizeof (UInquiry);
requlen = cbw_dtl;
blktrasstate = BULKIN;
break;
case READ:
blktrasstate = BULKIN;
temblklen = translen;
if(temblklen > LENGH)
{
longblk = LONGBLK;
blktmp = LENGH;
desc_len = LENGH*512;
}
else
{
longblk = SHORTBLK;
blktmp = temblklen;
desc_len = temblklen*512;
}
/*read from flush*/
/*
if(lblkaddr==0x8)
{
while(1);
}
*/
#ifdef USBNORFLASH
dev_io_proc(1, (UINT32)lblkaddr, bulkindatebuf, (UINT16)blktmp, 1);
#endif
#ifdef USBRAMDISK
usbpc_rd_io(0,(UINT32)lblkaddr, bulkindatebuf,(UINT32)blktmp,1);
#endif
#ifdef USBMMC
mmc_io(2,(UINT32)lblkaddr, bulkindatebuf, (UINT32)blktmp,1);
#endif
/*invert order*/
//usbswap_data(bulkindatebuf,blktmp);
head_temp = bulkindatebuf;
descactu_len = translen*512;//sizeof (URead20);
requlen = translen*512;//sizeof (URead20);
break;
case READ_CAPACITY:
blktrasstate = BULKIN;
desc_len = 0x8;//sizeof (URead_capacity);
head_temp = URead_capacity;
descactu_len = 0x8;//sizeof (URead_capacity);
requlen = cbw_dtl;
break;
case READ_FORMAT_CAPACITY:
blktrasstate = BULKIN;
desc_len = 0x14;//sizeof (URead_format_capacity);
head_temp = URead_format_capacity;
descactu_len = 0x14;//sizeof (URead_format_capacity);
requlen = cbw_dtl;
break;
case REQUEST_SENSE:
blktrasstate = BULKIN;
desc_len = 0x12;//sizeof (URequest_sense);
head_temp = URequest_sense;
descactu_len = 0x12;//sizeof (URequest_sense);
requlen = cbw_dtl;
break;
case CODE_1A:
blktrasstate = BULKIN;
desc_len = sizeof (Ucode_1A);
head_temp = (U32 *)Ucode_1A;
descactu_len = sizeof (Ucode_1A);
requlen = cbw_dtl;
break;
case CODE_15:
blktrasstate = BULKIN;
desc_len = sizeof (Ucode_15);
head_temp = (U32 *)Ucode_15;
descactu_len = sizeof (Ucode_15);
requlen = cbw_dtl;
break;
case WRITE2:
blktrasstate = BULKOUT;
//if(lblkaddr == 0)
//{
// while(1);
//}
temblklen = translen;
if(temblklen > LENGH)
{
longblk = LONGBLK;
blktmp = LENGH;
desc_len = LENGH*512;
}
else
{
longblk = SHORTBLK;
blktmp = temblklen;
desc_len = temblklen*512;
}
head_temp = bulkindatebuf;
descactu_len = translen*512;//sizeof (URead20);
requlen = translen*512;//sizeof (URead20);
break;
case TESTUNITREADY :
unsinglepocket = SINGLE;
break;
case PREVENT :
unsinglepocket = SINGLE;
sing = SI;
break;
}
}
void usb_bulk_csw(void)
{
U32 residue;
csw[0] = 0x53425355;
csw[1] = usb_bulk_cbw();
residue = requlen - descactu_len;
csw[2] = residue;
if(sing == UNSI)
{
csw[4] = 0x00;
}
else
{
timen++;
sing = UNSI;
csw[4] = 0x01;
}
tlengh = 13;
head_temp = csw;
}
/*DATA TRANSFER*/
U32 transbulk(unsigned char *head)
{
unsigned char *urb;
int j, ti,j1;
U32 P2;
volatile U32 i;
U32 stat,temp = 0;
U32 t;
if(blktrasstate == BULKIN)
{
/*in transfer*/
ti = desc_len;
urb = head;
if(ti < 64)
{
*(RP)(USB_TXLENGTH) = ti;//the pocket, less than 8 bytes
}
else
{
*(RP)(USB_TXLENGTH) = 64;
}
j = ti/64;
usbmod = ti%64;
if(desc_len < 64)
{
//USB_DMA_TRANS_TX((U32)urb,(U32)USB_TXFIFO,0x32,0x32,0x16,0x0,0x10);
USB_DMA_TRANS_TX((U32)urb,(U32)USB_TXFIFO,0x32,0x32,0x16,CHAN,0x10);
}
else
{
longpk = LONGPKSTATE;
//usbdmapp = APP;
lstate=1;
//USB_DMA_TRANS_TX((U32)urb,(U32)USB_TXFIFO,0x32,0x32,0x16,0x0,j*0x10);
USB_DMA_TRANS_TX((U32)urb,(U32)USB_TXFIFO,0x32,0x32,0x16,CHAN,j*0x10);
longurb = head + j*64;
}
i = *(volatile U32 *)DMACCConfiguration;
while((i & 0x1) != 0)
{
i = *(volatile U32 *)DMACCConfiguration;
}
}
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);
USB_DMA_TRANS_RX((U32)USB_RXFIFO,(U32)urb,0x32,0x32,0x16,CHAN,0x10);
}
else
{
longpk = LONGPKSTATE;
//USB_DMA_TRANS_RX((U32)USB_RXFIFO,(U32)urb,0x32,0x32,0x16,0x0,j*0x10);
USB_DMA_TRANS_RX((U32)USB_RXFIFO,(U32)urb,0x32,0x32,0x16,CHAN,j*0x10);
longurb = head + j*64;
}
//for(i=0;i<10000;i++);
i = *(volatile U32 *)DMACCConfiguration;
while((i & 0x1) != 0)
{
i = *(volatile U32 *)DMACCConfiguration;
}
#ifdef USBNORFLASH
dev_io_proc(1,(UINT32)lblkaddr, bulkindatebuf,(UINT16)blktmp,0);
#endif
#ifdef USBRAMDISK
usbpc_rd_io(0,(UINT32)lblkaddr, bulkindatebuf,(UINT32)blktmp,0);
#endif
#ifdef USBMMC
//if(lblkaddr == 0)
//{
// while(1);
//}
mmc_io(0, (UINT32)lblkaddr, bulkindatebuf, (UINT32)blktmp,0);
#endif
}
}
/*
* 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((unsigned char *)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 = (unsigned char *)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 = device_desc;
root = (unsigned char *)device_desc;
desc_len = 0x12;//sizeof(device_desc);
break;
case PDC_CONFIG_DESC_TYPE:
head_temp = conf_desc;
root = (unsigned char *)conf_desc;
des_tmp = command[6]|(command[7]<<8);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -