?? usb.c
字號:
stall3=0;
break;
case 4:
stall4=0;
break;
case 5:
stall5=0;
break;
case 6:
stall6=0;
break;
default:
break;
}
break;
default:
break;
}
}
/***************************************************************************
【功能說明】設置特性
****************************************************************************/
void setfeature(void)
{
switch(usb_buf[0]&0x03) /*find request target */
{
case 0: /*DEVICE */
break;
case 1: /*INTERFACE */
break;
case 2: /*ENDPOINT */
switch(usb_buf[4]&0x0F) /*find specific endpoint */
{ /* (strip off dir. bit) */
case 0:
stall0 = 1;
break;
case 1:
stall1 = 1;
break;
case 2:
stall2 = 1;
break;
case 3:
stall3 = 1;
break;
case 4:
stall4 = 1;
break;
case 5:
stall5 = 1;
break;
case 6:
stall6 = 1;
break;
default:
break;
}
break;
default:
break;
}
}
/***************************************************************************
【功能說明】設置配置值
****************************************************************************/
void setconfiguration(void)
{
usb_cfg=usb_buf[2]; /*set the configuration # */
if(usb_cfg!=0)
{
dtapid_TGL0PID=0;
dtapid_TGL1PID=0;
dtapid_TGL3PID=0;
stall0=stall1=stall2=0;
stall3=stall4=stall5=0;
stall6=0;
FLUSHTX1;
write_usb(EPC1,EP_EN+01); /*enable EP1 at adr 1 */
FLUSHRX1;
write_usb(EPC2,EP_EN+02); /*enable EP2 at adr 2 */
FLUSHTX2;
write_usb(EPC3,EP_EN+03); /*enable EP3 at adr 3 */
FLUSHRX2;
write_usb(EPC4,EP_EN+04); /*enable EP4 at adr 4 */
FLUSHTX3;
write_usb(EPC5,EP_EN+05); /*enable EP5 at adr 5 */
FLUSHRX3;
write_usb(EPC6,EP_EN+06); /*enable EP6 at adr 6 */
write_usb(RXC1,RX_EN);
write_usb(RXC3,RX_EN);
}
else /*unconfigure the device */
{
write_usb(EPC1,0); /*disable EP1 */
write_usb(EPC2,0); /*disable EP2 */
write_usb(EPC3,0); /*disable EP3 */
write_usb(EPC4,0); /*disable EP4 */
write_usb(EPC5,0); /*disable EP5 */
write_usb(EPC6,0); /*disable EP6 */
}
}
/***************************************************************************
【功能說明】This subroutine handles OUT NAK events for FIFO0 (endpoint 0)
****************************************************************************/
void nak0(void)
{
if(status_GETDESC)
{
status_GETDESC=0; /*exit multi-packet mode */
FLUSHTX0; /*flush TX0 and disable */
write_usb(RXC0,RX_EN); /*re-enable the receiver */
}
}
void usb_alt(void)
{
evnt=read_usb(ALTEV); /*check the events */
if(evnt&RESET_A) /*reset event */
{
write_usb(NFSR,RST_ST); /*enter reset state */
write_usb(FAR,AD_EN+0); /*set default address */
write_usb(EPC0, 0x00); /*enable EP0 only */
FLUSHTX0; /*flush TX0 and disable */
write_usb(RXC0,RX_EN); /*enable the receiver */
write_usb(ALTMSK,SD3+RESET_A);/*adjust interrupts */
write_usb(NFSR,OPR_ST); /*go operational */
}
else if(evnt&SD3) /*suspend event */
{
write_usb(ALTMSK,RESUME_A+RESET_A);
write_usb(NFSR,SUS_ST); /*enter suspend state */
}
else if(evnt&RESUME_A) /*resume event */
{
write_usb(ALTMSK,SD3+RESET_A);
write_usb(NFSR,OPR_ST); /*go operational */
}
else
{
}
}
/****************************************************************************
* 名稱:
* USB_Init()
* 功能:
* 初始化 USB 設備 (9603).
* 參數:
* 返回:
* int 類型, 如果初始化成功返回非0, 失敗返回0.
* 注釋:
* 在對USB設備進行讀寫前, 需對USB設備進行初始化.
* 修改:
****************************************************************************/
int USB_Init(void)
{
/* 關中斷 */
rINTMSK |= BIT_GLOBAL;
/* 初始化USB中斷 */
Isr_Init();
/* 初始化9603 */
Init_9603();
COMfront[0] = 0;
COMfront[1] = 0;
COMfront[2] = 0;
COMtail[0] = 0;
COMtail[1] = 0;
COMtail[2] = 0;
/* 開中斷 */
rINTMSK &= ~(BIT_GLOBAL); //GLOBAL有效
rINTMSK &= ~(BIT_EINT1);
return 1;
}
/****************************************************************************
* 名稱:
* USB_Purge()
* 功能:
* 清除輸入緩沖區.
* 參數:
* channel ---輸入,通道ID, (0-2)
* 返回:
* int 類型, 成功返回1, 否則返回0 (通常是channel參數不正確).
* 注釋:
* 修改:
****************************************************************************/
int USB_Purge(unsigned int channel)
{
if(channel > 2)
return 0;
/* 關中斷 */
rINTMSK |= BIT_EINT1;
COMtail[channel] = COMfront[channel] = 0;
/* 開中斷 */
rINTMSK &= ~(BIT_EINT1);
return 1;
}
/****************************************************************************
* 名稱:
* USB_Read()
* 功能:
* 從指定USB通道,接收指定的字節數到接收緩沖區.
* 參數:
* channel ---輸入,通道ID, (0-2)
* rev_buf ---輸出,接收數據的緩沖區指針
* count ---輸入,準備接收數據的大小,字節為單位
* 返回:
* int 類型, 返回實際接收的數據大小,字節為單位, 錯誤返回-1.
* 注釋:
* USB_Read阻塞讀取USB通道數據, 直到數據到達緩沖區.
* 修改:
****************************************************************************/
int USB_Read(unsigned channel, char *rev_buf, unsigned int count)
{
unsigned int i=0;
if(channel > 2)
return -1;
if(count == 0)
return 0;
while(COMtail[channel] == COMfront[channel]);
/* 關中斷 */
rINTMSK |= BIT_EINT1;
do
{
rev_buf[i++] = COMbuf[channel][COMtail[channel]++];
if(COMtail[channel] > 64)
COMtail[channel] = 0;
} while(i < count && COMtail[channel] != COMfront[channel]);
/* 開中斷 */
rINTMSK &= ~(BIT_EINT1);
return i;
}
/****************************************************************************
* 名稱:
* USB_Write()
* 功能:
* 從指定USB通道發送指定的字節數的數據.
* 參數:
* channel ---輸入,通道ID, (0-2)
* snd_buf ---輸入,待發送的數據的緩沖區指針
* length ---輸入,準備發送數據的大小,字節為單位
* 返回:
* int 類型, 返回實際發送的數據大小,字節為單位, 錯誤返回-1.
* 注釋:
* USB_Write阻塞發送USB通道數據, 直到發送完指定長度的數據.
* 修改:
****************************************************************************/
int USB_Write(unsigned channel, const char *snd_buf, unsigned int length)
{
unsigned int i = 0, j;
unsigned char count;
if(channel > 2)
return -1;
if(length == 0)
return 0;
switch(channel)
{
case 0:
case 1:
case 2:
while(i < length)
{
/* 關中斷 */
rINTMSK |= BIT_EINT1;
FLUSHTX3
do
{
(*(volatile unsigned char *)0x02000002) = TXS3;
count = *(volatile unsigned char *)0x02000000;
count &= 0x1f;
(*(volatile unsigned char *)0x02000002)=TXD3;
for(j=0; j<count && i<length; j++)
{
(*(volatile unsigned char *)0x02000000) = snd_buf[i++];
}
}while(count==0x1f && i<length);
TXEN3_PID
/* 開中斷 */
rINTMSK &= ~(BIT_EINT1);
}
break;
}
return i;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -