usbdl_usb_drv.c
来自「MTK 平台启动源码」· C语言 代码 · 共 2,365 行 · 第 1/5 页
C
2,365 行
{
DRV_WriteReg8(USB_INDEX, EPno);
CSR = DRV_Reg(USB_RXCSR);
CSR &= ~USB_RXCSR_SENDSTALL;
DRV_WriteReg(USB_RXCSR, (CSR|USB_RXCSR_FLUSHFIFO|USB_RXCSR_CLRDATATOG));
g_UsbDrvInfo.ep_rx_stall_status[EPno-1] = KAL_FALSE;
}
else
{
DRV_WriteReg8(USB_INDEX, EPno);
CSR = DRV_Reg(USB_TXCSR);
CSR &= ~USB_TXCSR_SENDSTALL;
DRV_WriteReg(USB_TXCSR,(CSR|USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG));
g_UsbDrvInfo.ep_tx_stall_status[EPno-1] = KAL_FALSE;
}
}
#elif defined(DRV_USB_IP_V2)
if (en == KAL_TRUE)
{
/* stall endpoint */
if (direction == USB_RX_EP_TYPE)
{
WRITE_EPN_BDT_PID(EPno, USB_BDT_RX, VUSB_BDT_OWNS_BIT|VUSB_BDT_STALL_BIT);
g_UsbDrvInfo.ep_rx_stall_status[EPno-1] = KAL_TRUE;
g_UsbDrvInfo.ep_out_data01[EPno-1] = 0;
}
else
{
WRITE_EPN_BDT_PID(EPno, USB_BDT_TX, VUSB_BDT_OWNS_BIT|VUSB_BDT_STALL_BIT);
g_UsbDrvInfo.ep_tx_stall_status[EPno-1] = KAL_TRUE;
g_UsbDrvInfo.ep_in_data01[EPno-1] = 0;
}
}
else
{
/* clear stall */
if (direction == USB_RX_EP_TYPE)
{
WRITE_EPN_BDT_PID(EPno, USB_BDT_RX, 0);
g_UsbDrvInfo.ep_rx_stall_status[EPno-1] = KAL_FALSE;
g_UsbDrvInfo.ep_out_data01[EPno-1] = 0;
}
else
{
WRITE_EPN_BDT_PID(EPno, USB_BDT_TX, 0);
g_UsbDrvInfo.ep_tx_stall_status[EPno-1] = KAL_FALSE;
g_UsbDrvInfo.ep_in_data01[EPno-1] = 0;
}
}
#elif defined(DRV_USB_IP_V1)
if (en == KAL_TRUE)
{
/* stall endpoint */
if (direction == USB_RX_EP_TYPE)
{
DRV_WriteReg8(USB_INDEX, EPno);
CSR1 = DRV_Reg8(USB_OUTCSR1);
CSR1 |= USB_OUTCSR1_SENDSTALL;
DRV_WriteReg8(USB_OUTCSR1,(CSR1|USB_OUTCSR1_FLUSHFIFO|USB_OUTCSR1_CLRDATATOG));
DRV_WriteReg8(USB_OUTCSR1, (CSR1|USB_OUTCSR1_FLUSHFIFO|USB_OUTCSR1_CLRDATATOG));
g_UsbDrvInfo.ep_rx_stall_status[EPno-1] = KAL_TRUE;
}
else
{
DRV_WriteReg8(USB_INDEX, EPno);
CSR1 = DRV_Reg8(USB_INCSR1);
CSR1 |= USB_INCSR1_SENDSTALL;
DRV_WriteReg8(USB_INCSR1,(CSR1|USB_INCSR1_FLUSHFIFO|USB_INCSR1_CLRDATATOG));
DRV_WriteReg8(USB_INCSR1, (CSR1|USB_INCSR1_FLUSHFIFO|USB_INCSR1_CLRDATATOG));
g_UsbDrvInfo.ep_tx_stall_status[EPno-1] = KAL_TRUE;
}
}
else
{
/* clear stall */
if (direction == USB_RX_EP_TYPE)
{
DRV_WriteReg8(USB_INDEX, EPno);
CSR1 = DRV_Reg8(USB_OUTCSR1);
CSR1 &= ~USB_OUTCSR1_SENDSTALL;
DRV_WriteReg8(USB_OUTCSR1,(CSR1|USB_OUTCSR1_FLUSHFIFO|USB_OUTCSR1_CLRDATATOG));
DRV_WriteReg8(USB_OUTCSR1, (CSR1|USB_OUTCSR1_FLUSHFIFO|USB_OUTCSR1_CLRDATATOG));
g_UsbDrvInfo.ep_rx_stall_status[EPno-1] = KAL_FALSE;
}
else
{
DRV_WriteReg8(USB_INDEX, EPno);
CSR1 = DRV_Reg8(USB_INCSR1);
CSR1 &= ~USB_INCSR1_SENDSTALL;
DRV_WriteReg8(USB_INCSR1,(CSR1|USB_INCSR1_FLUSHFIFO|USB_INCSR1_CLRDATATOG));
DRV_WriteReg8(USB_INCSR1, (CSR1|USB_INCSR1_FLUSHFIFO|USB_INCSR1_CLRDATATOG));
g_UsbDrvInfo.ep_tx_stall_status[EPno-1] = KAL_FALSE;
}
}
#endif
}
/* get endpoint 0 status. (if transaction end or sent stall interrupt received) */
void USB_Get_EP0_Status(kal_bool *p_transaction_end, kal_bool *p_sent_stall)
{
#if defined(DRV_USB_IP_V3)
kal_uint16 CSR0;
DRV_WriteReg8(USB_INDEX, 0);
CSR0 = DRV_Reg(USB_CSR0);
if (CSR0 & USB_CSR0_SENTSTALL)
*p_sent_stall = KAL_TRUE;
else
*p_sent_stall = KAL_FALSE;
if (CSR0 & USB_CSR0_SETUPEND)
*p_transaction_end = KAL_TRUE;
else
*p_transaction_end = KAL_FALSE;
#elif defined(DRV_USB_IP_V2)
if((READ_EP0_BDT_PID(USB_BDT_RX, g_UsbDrvInfo.ep0_rx_even_odd^1) &VUSB_BDT_STALL_BIT)
&& (DRV_Reg8(USB_CTL)&VUSB_CTL_TXD_SUSPEND))
*p_sent_stall = KAL_TRUE;
else
*p_sent_stall = KAL_FALSE;
if(g_UsbDrvInfo.ep0_transaction_type == USB_EP0_TRANS_END)
*p_transaction_end = KAL_TRUE;
else
*p_transaction_end = KAL_FALSE;
#elif defined(DRV_USB_IP_V1)
kal_uint8 byCSR0;
DRV_WriteReg8(USB_INDEX,0);
byCSR0 = DRV_Reg8(USB_CSR0);
if (byCSR0 & USB_CSR0_SENTSTALL)
*p_sent_stall = KAL_TRUE;
else
*p_sent_stall = KAL_FALSE;
if (byCSR0 & USB_CSR0_SETUPEND)
*p_transaction_end = KAL_TRUE;
else
*p_transaction_end = KAL_FALSE;
#endif
}
/* control endpoint 0 registers according to USB_EP0_DRV_STATE */
void USB_Update_EP0_State(USB_EP0_DRV_STATE state, kal_bool stall, kal_bool end)
{
#if defined(DRV_USB_IP_V3)
kal_uint8 reg_state;
kal_uint16 CSR0;
/* clear sent stall */
if(state == USB_EP0_DRV_STATE_CLEAR_SENT_STALL)
{
DRV_WriteReg8(USB_INDEX, 0);
CSR0 = DRV_Reg(USB_CSR0);
DRV_WriteReg(USB_CSR0, CSR0&(~USB_CSR0_SENTSTALL));
return;
}
/* clear transaction end*/
if(state == USB_EP0_DRV_STATE_TRANSACTION_END)
{
DRV_WriteReg8(USB_INDEX, 0);
DRV_WriteReg(USB_CSR0, (USB_CSR0_SERVICEDSETUPEND));
return;
}
/* ep0 read end or write ready*/
if(state == USB_EP0_DRV_STATE_READ_END)
{
reg_state = USB_CSR0_SERVICEDRXPKTRDY;
}
else
{
reg_state = USB_CSR0_TXPKTRDY;
}
/* error occured, sent stall*/
if(stall == KAL_TRUE)
{
reg_state |= USB_CSR0_SENDSTALL;
}
/* last data for this transaction, set data end bit*/
if(end == KAL_TRUE)
{
reg_state |= USB_CSR0_DATAEND;
}
DRV_WriteReg8(USB_INDEX, 0);
DRV_WriteReg(USB_CSR0, reg_state);
#elif defined(DRV_USB_IP_V2)
/* clear sent stall*/
if(state ==USB_EP0_DRV_STATE_CLEAR_SENT_STALL)
{
WRITE_EP0_BDT_PID(USB_BDT_RX, USB_BDT_EVEN,
READ_EP0_BDT_PID(USB_BDT_RX, USB_BDT_EVEN)&(~VUSB_BDT_STALL_BIT));
WRITE_EP0_BDT_PID(USB_BDT_RX, USB_BDT_ODD,
READ_EP0_BDT_PID(USB_BDT_RX, USB_BDT_ODD)&(~VUSB_BDT_STALL_BIT));
WRITE_EP0_BDT_PID(USB_BDT_TX, USB_BDT_EVEN,
READ_EP0_BDT_PID(USB_BDT_TX, USB_BDT_EVEN)&(~VUSB_BDT_STALL_BIT));
WRITE_EP0_BDT_PID(USB_BDT_TX, USB_BDT_ODD,
READ_EP0_BDT_PID(USB_BDT_TX, USB_BDT_ODD)&(~VUSB_BDT_STALL_BIT));
return;
}
/* clear transaction end*/
if(state ==USB_EP0_DRV_STATE_TRANSACTION_END)
{
EXT_ASSERT((g_UsbDrvInfo.ep0_current_dir==0), 0, 0, 0);
/* clear the data in sent buffer */
WRITE_EP0_BDT_PID(USB_BDT_TX, USB_BDT_EVEN, 0);
WRITE_EP0_BDT_PID(USB_BDT_TX, USB_BDT_ODD, 0);
WRITE_EP0_BDT_PID(USB_BDT_RX, g_UsbDrvInfo.ep0_rx_even_odd,
(USB_EP0_MAXP << VUSB_BDT_BC_SHIFT) |VUSB_BDT_OWNS_BIT);
g_UsbDrvInfo.ep0_transaction_type = USB_EP0_TRANS_NONE;
return;
}
/* ep0 read end or write ready*/
if((state == USB_EP0_DRV_STATE_READ_END) && (stall==KAL_FALSE))
{
/* clear tx suspend for setupt packet*/
if(DRV_Reg8(USB_CTL)&VUSB_CTL_TXD_SUSPEND)
{
g_UsbDrvInfo.ep0_tx_data01 = 0;
/* clear the data in sent buffer */
WRITE_EP0_BDT_PID(USB_BDT_TX, USB_BDT_EVEN, 0);
WRITE_EP0_BDT_PID(USB_BDT_TX, USB_BDT_ODD, 0);
DRV_Reg8(USB_CTL) = DRV_Reg8(USB_CTL)&(~VUSB_CTL_TXD_SUSPEND);
}
WRITE_EP0_BDT_PID(USB_BDT_RX, g_UsbDrvInfo.ep0_rx_even_odd,
(USB_EP0_MAXP << VUSB_BDT_BC_SHIFT) |VUSB_BDT_OWNS_BIT);
g_UsbDrvInfo.ep0_transaction_type = USB_EP0_TRANS_RX_DATA;
}
else if((state == USB_EP0_DRV_STATE_WRITE_RDY) && (stall==KAL_FALSE))
{
/* toggle DATA01*/
g_UsbDrvInfo.ep0_tx_data01^=1;
WRITE_EP0_BDT_PID(USB_BDT_TX, g_UsbDrvInfo.ep0_tx_even_odd,
(READ_EP0_BDT_PID(USB_BDT_TX, g_UsbDrvInfo.ep0_tx_even_odd)&VUSB_BDT_BC_MASK)
|(g_UsbDrvInfo.ep0_tx_data01<<VUSB_BDT_DATA01_SHIFT)
| VUSB_BDT_DTS_BIT | VUSB_BDT_OWNS_BIT);
g_UsbDrvInfo.ep0_transaction_type = USB_EP0_TRANS_TX_DATA;
}
/* error occured, sent stall*/
if(stall == KAL_TRUE)
{
WRITE_EP0_BDT_PID(USB_BDT_RX, USB_BDT_EVEN,
READ_EP0_BDT_PID(USB_BDT_RX, USB_BDT_EVEN)|VUSB_BDT_STALL_BIT);
WRITE_EP0_BDT_PID(USB_BDT_RX, USB_BDT_ODD,
READ_EP0_BDT_PID(USB_BDT_RX, USB_BDT_ODD)|VUSB_BDT_STALL_BIT);
WRITE_EP0_BDT_PID(USB_BDT_TX, USB_BDT_EVEN,
READ_EP0_BDT_PID(USB_BDT_RX, USB_BDT_EVEN)|VUSB_BDT_STALL_BIT);
WRITE_EP0_BDT_PID(USB_BDT_TX, USB_BDT_ODD,
READ_EP0_BDT_PID(USB_BDT_RX, USB_BDT_ODD)|VUSB_BDT_STALL_BIT);
g_UsbDrvInfo.ep0_transaction_type = USB_EP0_TRANS_NONE;
}
/* last data for this transaction, set data end bit*/
else if(end == KAL_TRUE)
{
if(g_UsbDrvInfo.ep0_transaction_type==USB_EP0_TRANS_RX_DATA)
{
/* status data01 always 1*/
g_UsbDrvInfo.ep0_tx_data01 = 1;
/* byte count 0 */
WRITE_EP0_BDT_PID(USB_BDT_TX, g_UsbDrvInfo.ep0_tx_even_odd,
(g_UsbDrvInfo.ep0_tx_data01<<VUSB_BDT_DATA01_SHIFT) |
VUSB_BDT_DTS_BIT | VUSB_BDT_OWNS_BIT);
g_UsbDrvInfo.ep0_transaction_type = USB_EP0_TRANS_RX_STATUS;
}
else if(g_UsbDrvInfo.ep0_transaction_type==USB_EP0_TRANS_TX_DATA)
{
g_UsbDrvInfo.ep0_transaction_type = USB_EP0_TRANS_TX_DATA_END;
}
else
{
EXT_ASSERT(0, g_UsbDrvInfo.ep0_transaction_type, state, stall);
}
}
#elif defined(DRV_USB_IP_V1)
kal_uint8 reg_state;
kal_uint8 byCSR0;
/* clear sent stall*/
if(state ==USB_EP0_DRV_STATE_CLEAR_SENT_STALL)
{
DRV_WriteReg8(USB_INDEX,0);
byCSR0 = DRV_Reg8(USB_CSR0);
DRV_WriteReg8(USB_CSR0, byCSR0&(~USB_CSR0_SENTSTALL));
return;
}
/* clear transaction end*/
if(state ==USB_EP0_DRV_STATE_TRANSACTION_END)
{
DRV_WriteReg8(USB_INDEX,0);
DRV_WriteReg8(USB_CSR0, (USB_CSR0_SERVICESETUPEND));
return;
}
/* ep0 read end or write ready*/
if(state == USB_EP0_DRV_STATE_READ_END)
{
reg_state = USB_CSR0_SERVICEDOUTPKTRDY;
}
else
{
reg_state = USB_CSR0_INPKTRDY;
}
/* error occured, sent stall*/
if(stall == KAL_TRUE)
{
reg_state |= USB_CSR0_SENDSTALL;
}
/* last data for this transaction, set data end bit*/
if(end == KAL_TRUE)
{
reg_state |= USB_CSR0_DATAEND;
}
DRV_WriteReg8(USB_INDEX,0);
DRV_WriteReg8(USB_CSR0, reg_state);
#endif
}
/* return packet length for endpoint 0*/
kal_uint32 USB_EP0_Pkt_Len(void)
{
kal_uint32 nCount = 0;
#if defined(DRV_USB_IP_V3)
kal_uint16 CSR0;
DRV_WriteReg8(USB_INDEX, 0);
CSR0 = DRV_Reg(USB_CSR0);
if(CSR0&USB_CSR0_RXPKTRDY)
nCount = (kal_uint32)DRV_Reg8(USB_COUNT0);
#elif defined(DRV_USB_IP_V2)
if((READ_EP0_BDT_PID(USB_BDT_RX, g_UsbDrvInfo.ep0_rx_even_odd) &VUSB_BDT_OWNS_BIT)==0)
{
nCount = (READ_EP0_BDT_PID(USB_BDT_RX, g_UsbDrvInfo.ep0_rx_even_odd) & VUSB_BDT_BC_MASK)
>>VUSB_BDT_BC_SHIFT;
}
#elif defined(DRV_USB_IP_V1)
kal_uint8 byCSR0;
DRV_WriteReg8(USB_INDEX,0);
byCSR0 = DRV_Reg8(USB_CSR0);
if(byCSR0 & USB_CSR0_OUTPKTRDY)
{
nCount = (kal_uint32)DRV_Reg8(USB_COUNT0);
}
#endif
return nCount;
}
/* ep in data prepared ready, set ready bit */
void USB_EP_Bulk_Tx_Ready(kal_uint8 ep_num)
{
if((ep_num==0)||(ep_num>MAX_INTR_EP_NUM))
EXT_ASSERT(0, ep_num, 0, 0);
#if defined(DRV_USB_IP_V3)
DRV_WriteReg8(USB_INDEX, ep_num);
DRV_WriteReg(USB_TXCSR, DRV_Reg(USB_TXCSR)|USB_TXCSR_TXPKTRDY);
#elif defined(DRV_USB_IP_V2)
WRITE_EPN_BDT_PID(ep_num, USB_BDT_TX,
(READ_EPN_BDT_PID(ep_num, USB_BDT_TX) & VUSB_BDT_BC_MASK) |
(g_UsbDrvInfo.ep_in_data01[ep_num-1]<<VUSB_BDT_DATA01_SHIFT) |
VUSB_BDT_DTS_BIT | VUSB_BDT_OWNS_BIT);
g_UsbDrvInfo.ep_in_data01[ep_num-1]^=1;
#elif defined(DRV_USB_IP_V1)
DRV_WriteReg8(USB_INDEX,ep_num);
DRV_WriteReg8(USB_INCSR1, USB_INCSR1_INPKTRDY);
#endif
}
/* return ep out received packet length*/
kal_uint32 USB_EP_Rx_Pkt_Len(kal_uint8 ep_num)
{
#if defined(DRV_USB_IP_V3)
kal_uint16 CSR;
#elif defined(DRV_USB_IP_V1)
kal_uint8 byCSR;
#endif
kal_uint32 nCount = 0;
if((ep_num==0)||(ep_num>MAX_INTR_EP_NUM))
EXT_ASSERT(0, ep_num, 0, 0);
#if defined(DRV_USB_IP_V3)
DRV_WriteReg8(USB_INDEX, ep_num);
CSR = DRV_Reg(USB_RXCSR);
if(CSR&USB_RXCSR_RXPKTRDY)
nCount = (kal_uint32)DRV_Reg(USB_RXCOUNT);
#elif defined(DRV_USB_IP_V2)
if((READ_EPN_BDT_PID(ep_num, USB_BDT_RX)&VUSB_BDT_OWNS_BIT)==0)
{
nCount = (READ_EPN_BDT_PID(ep_num, USB_BDT_RX)&VUSB_BDT_BC_MASK)
>> VUSB_BDT_BC_SHIFT;
}
#elif defined(DRV_USB_IP_V1)
DRV_WriteReg8(USB_INDEX,ep_num);
byCSR = DRV_Reg8(USB_OUTCSR1);
if(byCSR & USB_OUTCSR1_OUTPKTRDY)
{
nCount = (kal_uint32)DRV_Reg8(USB_OUTCOUNT1);
}
#endif
return nCount;
}
/* ep out data already read out, clear the data*/
void USB_EP_Bulk_Rx_Ready(kal_uint8 ep_num)
{
if((ep_num==0)||(ep_num>MAX_INTR_EP_NUM))
EXT_ASSERT(0, ep_num, 0, 0);
#if defined(DRV_USB_IP_V3)
DRV_WriteReg8(USB_INDEX, ep_num);
DRV_WriteReg(USB_RXCSR, DRV_Reg(USB_RXCSR)&(~USB_RXCSR_RXPKTRDY));
#elif defined(DRV_USB_IP_V2)
WRITE_EPN_BDT_PID(ep_num, USB_BDT_RX,
(g_UsbDrvInfo.ep_out_max_data_size[ep_num-1] << VUSB_BDT_BC_SHIFT) |
(g_UsbDrvInfo.ep_out_data01[ep_num-1]<<VUSB_BDT_DATA01_SHIFT) |
VUSB_BDT_DTS_BIT | VUSB_BDT_OWNS_BIT);
g_UsbDrvInfo.ep_out_data01[ep_num-1]^=1;
#elif defined(DRV_USB_IP_V1)
DRV_WriteReg8(USB_INDEX,ep_num);
DRV_WriteReg8(USB_OUTCSR1, 0);
#endif
}
/* Get status. See if ep in fifo is empty.
If false, it means some data in fifo still wait to send out */
kal_bool USB_Is_EP_Bulk_Tx_Empty(kal_uint8 ep_num)
{
#if defined(DRV_USB_IP_V3)
kal_uint16 CSR;
#elif defined(DRV_USB_IP_V1)
kal_uint8 byCSR;
#endif
kal_bool bRet;
if((ep_num==0)||(ep_num>MAX_INTR_EP_NUM))
EXT_ASSERT(0, ep_num, 0, 0);
#if defined(DRV_USB_IP_V3)
DRV_WriteReg8(USB_INDEX, ep_num);
CSR = DRV_Reg(USB_TXCSR);
if(CSR&USB_TXCSR_FIFONOTEMPTY)
return KAL_FALSE;
else
return KAL_TRUE;
#elif defined(DRV_USB_IP_V2)
/* own bit 1 means the data is still not sent out */
if((READ_EPN_BDT_PID(ep_num, USB_BDT_TX)&VUSB_BDT_OWNS_BIT)!=0)
bRet = KAL_FALSE;
else
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?