usbdl_usb_drv.c
来自「MTK 平台启动源码」· C语言 代码 · 共 2,365 行 · 第 1/5 页
C
2,365 行
#elif defined(DRV_USB_IP_V2)
kal_uint8 epctl_value = 0;
/* check the packet size, FIFO only 8 bytes*/
if((epno == 0)||((epno == 3)&&(data_size != 8)))
EXT_ASSERT(0, epno, 0, 0);
switch(type)
{
case USB_ENDPT_BULK:
epctl_value = VUSB_ENDPT_BULK_RX;
break;
case USB_ENDPT_INTR:
epctl_value = VUSB_ENDPT_BULK_RX;
break;
/* not support */
case USB_ENDPT_CTRL:
case USB_ENDPT_ISO:
ASSERT(0);
break;
}
g_UsbDrvInfo.ep_out_max_data_size[epno-1] = (kal_uint8)data_size;
DRV_WriteReg8(USB_ENDPT_CTL(epno), DRV_Reg8(USB_ENDPT_CTL(epno))|epctl_value);
#elif defined(DRV_USB_IP_V1)
if(epno == 0)
ASSERT(0);
DRV_WriteReg8(USB_INDEX,epno);
DRV_WriteReg8(USB_OUTCSR1,(USB_OUTCSR1_CLRDATATOG | USB_OUTCSR1_FLUSHFIFO));
DRV_WriteReg8(USB_OUTMAXP, (kal_uint8)(data_size/8));
#endif
}
void USB_EP0En(void)
{
#if defined(DRV_USB_IP_V3)
/* default address is from 0 to 63 */
DRV_WriteReg(USB_INTRTXE, DRV_Reg(USB_INTRTXE)|USB_INTRE_EPEN);
#elif defined(DRV_USB_IP_V2)
DRV_WriteReg8(USB_ENDPT_CTL(0), VUSB_ENDPT_CONTROL);
#elif defined(DRV_USB_IP_V1)
DRV_Reg8(USB_INTRIN1E) |= USB_INTRIN1E_EPEN;
#endif
}
void USB_TxEPEn(kal_uint8 epno, kal_bool bDMA, kal_bool is_flush)
{
if(epno == 0)
ASSERT(0);
#if defined(DRV_USB_IP_V3)
DRV_WriteReg8(USB_INDEX, epno);
/* double buffers, so flush twice */
if(is_flush == KAL_TRUE)
{
DRV_WriteReg(USB_TXCSR, (USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG));
DRV_WriteReg(USB_TXCSR, (USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG));
}
DRV_Reg(USB_INTRTXE) |= USB_INTRE_EPEN<<epno;
/* Only configure as multiple packet DMA TX mode */
DRV_WriteReg(USB_TXCSR, USB_TXCSR_AUTOSET|USB_TXCSR_DMAREQENAB|USB_TXCSR_DMAREQMODE);
#elif defined(DRV_USB_IP_V2)
if(bDMA == KAL_TRUE)
{
g_UsbDrvInfo.ep_in_enb_state[epno-1] = USB_EP_ENB_DMA;
}
else
{
g_UsbDrvInfo.ep_in_enb_state[epno-1] = USB_EP_ENB_NORMAL;
}
#elif defined(DRV_USB_IP_V1)
DRV_WriteReg8(USB_INDEX, epno);
if(bDMA == KAL_TRUE)
{
DRV_Reg8(USB_INTRIN1E) = DRV_Reg8(USB_INTRIN1E) & (~(USB_INTRIN1E_EPEN << epno));
if(is_flush == KAL_TRUE)
{
DRV_WriteReg8(USB_INCSR1, (USB_INCSR1_CLRDATATOG | USB_INCSR1_FLUSHFIFO));
DRV_WriteReg8(USB_INCSR1, (USB_INCSR1_CLRDATATOG | USB_INCSR1_FLUSHFIFO));
}
// DRV_WriteReg8(USB_INCSR2, 0);
DRV_WriteReg8(USB_INCSR2, (USB_INCSR2_AUTOSET | USB_INCSR2_DMAENAB));
}
else
{
if(is_flush == KAL_TRUE)
{
DRV_WriteReg8(USB_INCSR1,(USB_INCSR1_CLRDATATOG | USB_INCSR1_FLUSHFIFO));
DRV_WriteReg8(USB_INCSR1,(USB_INCSR1_CLRDATATOG | USB_INCSR1_FLUSHFIFO));
}
DRV_WriteReg8(USB_INCSR2,0);
DRV_Reg8(USB_INTRIN1E) |= (USB_INTRIN1E_EPEN << epno);
}
#endif
}
void USB_TxEPDis(kal_uint8 epno, kal_bool bDMA)
{
if(epno == 0)
ASSERT(0);
#if defined(DRV_USB_IP_V3)
USB_Stop_DMA_Channel(epno, USB_TX_EP_TYPE);
DRV_Reg(USB_INTRTXE) &= ~(USB_INTRE_EPEN<<epno);
DRV_WriteReg8(USB_INDEX, epno);
DRV_WriteReg(USB_TXCSR, (USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG));
DRV_WriteReg(USB_TXCSR, (USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG));
#elif defined(DRV_USB_IP_V2)
#if 0
/* under construction !*/
/* under construction !*/
/* under construction !*/
#endif
g_UsbDrvInfo.ep_in_enb_state[epno-1] = USB_EP_DIS;
WRITE_EPN_BDT_PID(epno, USB_BDT_TX, 0);
#elif defined(DRV_USB_IP_V1)
DRV_WriteReg8(USB_INDEX, epno);
if(bDMA == KAL_TRUE)
{
#if 0
/* under construction !*/
/* under construction !*/
#endif
DRV_Reg8(USB_INTRIN1E) = DRV_Reg8(USB_INTRIN1E) & (~(USB_INTRIN1E_EPEN << epno));
DRV_WriteReg8(USB_INCSR2,0);
}
else
{
DRV_Reg8(USB_INTRIN1E) = DRV_Reg8(USB_INTRIN1E) & (~(USB_INTRIN1E_EPEN << epno));
DRV_WriteReg8(USB_INCSR2,0);
}
#endif
}
void USB_RxEPEn(kal_uint8 epno, kal_bool bDMA, kal_bool is_flush)
{
if(epno == 0)
ASSERT(0);
#if defined(DRV_USB_IP_V3)
DRV_WriteReg8(USB_INDEX, epno);
/* maybe double buffer, so flush twice */
if(is_flush == KAL_TRUE)
{
DRV_WriteReg(USB_RXCSR, (USB_RXCSR_FLUSHFIFO|USB_RXCSR_CLRDATATOG));
DRV_WriteReg(USB_RXCSR, (USB_RXCSR_FLUSHFIFO|USB_RXCSR_CLRDATATOG));
}
DRV_Reg(USB_INTRRXE) |= USB_INTRE_EPEN<<epno;
#elif defined(DRV_USB_IP_V2)
if(bDMA == KAL_TRUE)
{
g_UsbDrvInfo.ep_out_enb_state[epno-1] = USB_EP_ENB_DMA;
/* The first expect received packet is data0*/
g_UsbDrvInfo.ep_out_data01[epno-1] = 0;
}
else
{
g_UsbDrvInfo.ep_out_enb_state[epno-1] = USB_EP_ENB_NORMAL;
/* The first expect received packet is data0*/
g_UsbDrvInfo.ep_out_data01[epno-1] = 0;
// configure BDT to receive data
WRITE_EPN_BDT_PID(epno, USB_BDT_RX,
(g_UsbDrvInfo.ep_out_max_data_size[epno-1] << VUSB_BDT_BC_SHIFT) |
(g_UsbDrvInfo.ep_out_data01[epno-1]<<VUSB_BDT_DATA01_SHIFT) |
VUSB_BDT_DTS_BIT | VUSB_BDT_OWNS_BIT);
g_UsbDrvInfo.ep_out_data01[epno-1] ^= 1;
}
#elif defined(DRV_USB_IP_V1)
DRV_WriteReg8(USB_INDEX, epno);
if(bDMA == KAL_TRUE)
{
DRV_Reg8(USB_INTROUT1E) = DRV_Reg8(USB_INTROUT1E) & (~(USB_INTROUT1E_EPEN<<epno));
if(is_flush == KAL_TRUE)
{
DRV_WriteReg8(USB_OUTCSR1,(USB_OUTCSR1_CLRDATATOG | USB_OUTCSR1_FLUSHFIFO));
DRV_WriteReg8(USB_OUTCSR1,(USB_OUTCSR1_CLRDATATOG | USB_OUTCSR1_FLUSHFIFO));
}
// DRV_WriteReg8(USB_OUTCSR2,0);
DRV_WriteReg8(USB_OUTCSR2,(USB_OUTCSR2_AUTOCLEAR | USB_OUTCSR2_DMAENAB));
}
else
{
if(is_flush == KAL_TRUE)
{
DRV_WriteReg8(USB_OUTCSR1,(USB_OUTCSR1_CLRDATATOG | USB_OUTCSR1_FLUSHFIFO));
DRV_WriteReg8(USB_OUTCSR1,(USB_OUTCSR1_CLRDATATOG | USB_OUTCSR1_FLUSHFIFO));
}
DRV_WriteReg8(USB_OUTCSR2,0);
DRV_Reg8(USB_INTROUT1E) |= USB_INTROUT1E_EPEN<<epno;
}
#endif
}
void USB_RxEPDis(kal_uint8 epno, kal_bool bDMA)
{
if(epno == 0)
ASSERT(0);
#if defined(DRV_USB_IP_V3)
USB_Stop_DMA_Channel(epno, USB_RX_EP_TYPE);
DRV_Reg(USB_INTRRXE) &= ~(USB_INTRE_EPEN << epno);
DRV_WriteReg8(USB_INDEX, epno);
DRV_WriteReg(USB_RXCSR, (USB_RXCSR_FLUSHFIFO|USB_RXCSR_CLRDATATOG));
DRV_WriteReg(USB_RXCSR, (USB_RXCSR_FLUSHFIFO|USB_RXCSR_CLRDATATOG));
#elif defined(DRV_USB_IP_V2)
#if 0
/* under construction !*/
/* under construction !*/
/* under construction !*/
#endif
g_UsbDrvInfo.ep_out_enb_state[epno-1] = USB_EP_DIS;
WRITE_EPN_BDT_PID(epno, USB_BDT_RX, 0);
#elif defined(DRV_USB_IP_V1)
DRV_WriteReg8(USB_INDEX, epno);
if(bDMA == KAL_TRUE)
{
#if 0
/* under construction !*/
/* under construction !*/
#endif
DRV_Reg8(USB_INTROUT1E) = DRV_Reg8(USB_INTROUT1E) & (~(USB_INTROUT1E_EPEN << epno));
DRV_WriteReg8(USB_OUTCSR2, 0);
}
else
{
DRV_Reg8(USB_INTROUT1E) = DRV_Reg8(USB_INTROUT1E) & (~(USB_INTROUT1E_EPEN << epno));
DRV_WriteReg8(USB_OUTCSR2, 0);
}
#endif
}
void USB_TxEPClearDataTog(kal_uint8 epno)
{
#if defined(DRV_USB_IP_V3)
DRV_WriteReg8(USB_INDEX, epno);
DRV_WriteReg(USB_TXCSR, DRV_Reg(USB_TXCSR)|USB_TXCSR_CLRDATATOG);
#elif defined(DRV_USB_IP_V2)
#elif defined(DRV_USB_IP_V1)
DRV_WriteReg8(USB_INDEX, epno);
DRV_WriteReg8(USB_INCSR1, DRV_Reg8(USB_INCSR1)|USB_INCSR1_CLRDATATOG);
#endif
}
void USB_RxEPClearDataTog(kal_uint8 epno)
{
#if defined(DRV_USB_IP_V3)
DRV_WriteReg8(USB_INDEX, epno);
DRV_WriteReg(USB_RXCSR, DRV_Reg(USB_RXCSR)|USB_RXCSR_CLRDATATOG);
#elif defined(DRV_USB_IP_V2)
#elif defined(DRV_USB_IP_V1)
DRV_WriteReg8(USB_INDEX, epno);
DRV_WriteReg8(USB_OUTCSR1, DRV_Reg8(USB_OUTCSR1)|USB_OUTCSR1_CLRDATATOG);
#endif
}
/* Clear EP data01, note that ep0 can not use this function */
void USB_TxEPClearData01(kal_uint8 epno)
{
if(epno == 0)
ASSERT(0);
#if defined(DRV_USB_IP_V2)
g_UsbDrvInfo.ep_in_data01[epno-1] = 0;
#endif
}
#if 0
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
#if defined(DRV_USB_IP_V2)
/* under construction !*/
#endif
/* under construction !*/
#endif
/* read FIFO data from EP nEP with sfift */
void USB_EPFIFORead_Shift(kal_uint8 nEP, kal_uint16 nBytes, void *pDst, kal_uint32 shift)
{
#if defined(DRV_USB_IP_V1)||defined(DRV_USB_IP_V3)
kal_uint16 nCount = nBytes;
kal_uint8 *pby;
kal_uint32 nAddr;
#endif
if((nBytes!=0) && (pDst==NULL))
EXT_ASSERT(0, (kal_uint32)nBytes, 0, 0);
#if defined(DRV_USB_IP_V3)
DRV_WriteReg8(USB_INDEX, nEP);
nAddr = USB_EP0 + nEP*4;
pby = (kal_uint8 *)pDst;
/* read byte by byte */
while (nCount)
{
*pby++ = DRV_Reg8(nAddr);
nCount--;
}
#elif defined(DRV_USB_IP_V2)
// make sure this endpoint status belong to MCU
if(nEP==0)
{
if((READ_EP0_BDT_PID(USB_BDT_RX, g_UsbDrvInfo.ep0_rx_even_odd)&VUSB_BDT_OWNS_BIT)!=0)
ASSERT(0);
kal_mem_cpy(pDst, (void*)(READ_EP0_BDT_ADDR(USB_BDT_RX, g_UsbDrvInfo.ep0_rx_even_odd) + shift), nBytes);
}
else
{
ASSERT(g_UsbDrvInfo.ep_out_enb_state[nEP-1] != USB_EP_DIS);
ASSERT(nBytes <= g_UsbDrvInfo.ep_out_max_data_size[nEP-1]);
if((READ_EPN_BDT_PID(nEP, USB_BDT_RX)&VUSB_BDT_OWNS_BIT)!=0)
ASSERT(0);
kal_mem_cpy(pDst, (void*)(READ_EPN_BDT_ADDR(nEP, USB_BDT_RX) + shift), nBytes);
}
#elif defined(DRV_USB_IP_V1)
DRV_WriteReg8(USB_INDEX,nEP);
nAddr = USB_EP0+nEP*4;
pby = (kal_uint8 *)pDst;
/* read byte by byte */
while (nCount)
{
*pby++ = DRV_Reg8(nAddr);
nCount--;
}
#endif
}
/* Read fifo data from EP nEP*/
void USB_EPFIFORead(kal_uint8 nEP, kal_uint16 nBytes, void *pDst)
{
USB_EPFIFORead_Shift(nEP, nBytes, pDst, 0);
}
/* write data to fifo EP nEP*/
void USB_EPFIFOWrite (kal_uint8 nEP, kal_uint16 nBytes, void *pSrc)
{
#if (defined(DRV_USB_IP_V1)||defined(DRV_USB_IP_V3))
kal_uint16 nCount = nBytes;
kal_uint8 *pby;
kal_uint32 nAddr;
#endif
if((nBytes!=0) && (pSrc==NULL))
EXT_ASSERT(0, (kal_uint32)nBytes, 0, 0);
#if defined(DRV_USB_IP_V3)
DRV_WriteReg8(USB_INDEX, nEP);
nAddr = USB_EP0 + nEP*4;
pby = (kal_uint8 *)pSrc;
/* write byte by byte */
while (nCount)
{
DRV_WriteReg8(nAddr, *pby++);
nCount--;
}
#elif defined(DRV_USB_IP_V2)
if(nEP==0)
{
// make sure this endpoint status belong to MCU
if((READ_EP0_BDT_PID(USB_BDT_TX, g_UsbDrvInfo.ep0_tx_even_odd)&VUSB_BDT_OWNS_BIT)!=0)
ASSERT(0);
kal_mem_cpy((void*)READ_EP0_BDT_ADDR(USB_BDT_TX, g_UsbDrvInfo.ep0_tx_even_odd),
pSrc, nBytes);
WRITE_EP0_BDT_PID(USB_BDT_TX, g_UsbDrvInfo.ep0_tx_even_odd, nBytes<<VUSB_BDT_BC_SHIFT);
}
else
{
ASSERT(g_UsbDrvInfo.ep_in_enb_state[nEP-1]!=USB_EP_DIS);
ASSERT(nBytes<=g_UsbDrvInfo.ep_in_max_data_size[nEP-1]);
// make sure this endpoint status belong to MCU
if((READ_EPN_BDT_PID(nEP, USB_BDT_TX)&VUSB_BDT_OWNS_BIT)!=0)
ASSERT(0);
kal_mem_cpy((void*)READ_EPN_BDT_ADDR(nEP, USB_BDT_TX), pSrc, nBytes);
WRITE_EPN_BDT_PID(nEP, USB_BDT_TX, nBytes<<VUSB_BDT_BC_SHIFT);
}
#elif defined(DRV_USB_IP_V1)
DRV_WriteReg8(USB_INDEX,nEP);
nAddr = USB_EP0+nEP*4;
pby = (kal_uint8 *)pSrc;
/* write by byte */
while (nCount)
{
DRV_WriteReg8(nAddr,*pby++);
nCount--;
}
#endif
}
/* type == USB_TX_EP_TYPE or USB_RX_EP_TYPE
en == KAL_TRUE means stall this endpoint */
void USB_CtrlEPStall(kal_uint8 EPno, USB_EP_TYPE direction, kal_bool en, USB_CTRL_STALL_ENTRY entry)
{
#if defined(DRV_USB_IP_V3)
kal_uint16 CSR;
#elif defined(DRV_USB_IP_V1)
kal_uint8 CSR1;
#endif
if((EPno==0)||(EPno>MAX_INTR_EP_NUM))
EXT_ASSERT(0, (kal_uint32)EPno, (kal_uint32)entry, 0);
#if defined(DRV_USB_IP_V3)
if (en == KAL_TRUE)
{
/* stall endpoint */
if(direction == USB_RX_EP_TYPE)
{
DRV_WriteReg8(USB_INDEX, EPno);
CSR = DRV_Reg(USB_RXCSR);
DRV_WriteReg(USB_RXCSR, (CSR|USB_RXCSR_FLUSHFIFO|USB_RXCSR_CLRDATATOG|USB_RXCSR_SENDSTALL));
g_UsbDrvInfo.ep_rx_stall_status[EPno-1] = KAL_TRUE;
}
else
{
DRV_WriteReg8(USB_INDEX, EPno);
CSR = DRV_Reg(USB_TXCSR);
DRV_WriteReg(USB_TXCSR, (CSR|USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG|USB_TXCSR_SENDSTALL));
g_UsbDrvInfo.ep_tx_stall_status[EPno-1] = KAL_TRUE;
}
}
else
{
/* clear stall */
if (direction == USB_RX_EP_TYPE)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?