📄 drv_usb.c
字号:
hUsbf->regs->RXDMA0 = 0
| ( 0 << 15 ) /* RXn_STOP */
| ( 0 << 0 ) /* 7:0 RXn_TC */
;
hUsbf->regs->RXDMA1 = 0
| ( 0 << 15 ) /* RXn_STOP*/
| ( 0 << 0 ) /* 7:0 RXn_TC*/
;
hUsbf->regs->RXDMA2 = 0
| ( 0 << 15 ) /* RXn_STOP*/
| ( 0 << 0 ) /* 7:0 RXn_TC*/
;
}
void USB_ConfiguredStateHandler( void )
{
INT16S epNum;
/* Loop through each valid Receiving EndPoint and enable the
* FIFO to receive new data */
for ( epNum = 0 ; epNum < USB_EP_SIZE ; epNum++ )
if ( ( hUsbf->regs->RX_EP[epNum].RX_EP ) & 0x8000 )
{
/* Select the Endpoint i+1 and set to Receiver Mode */
hUsbf->regs->EPNUM = ( epNum + 1 );
/* Enable FIFO to receive communication from USB Host */
/* Enable FIFO for Communication Transfers */
hUsbf->regs->CTRL = 0x0004;
}
}
void USB_ResetStateHandler( void )
{
INT16U intEn;
/* Clear USB Configuration */
/* Remote Wakeup to bring back from Suspend State */
if (CSL_SOK != CSL_usbfHwControl(hUsbf,CSL_USBF_CMD_INFORM_DEVICE_CFG_CLEARED,NULL))
{
OS_DEBUGF(DEV_USB,(" CSL_USBF_CMD_INFORM_DEVICE_CFG_CLEARED:cmd failed \r\n"));
}
/* Set current Endpoint 0 */
hUsbf->regs->EPNUM = 0;
/* Reset Current Endpoint */
if (CSL_SOK != CSL_usbfHwControl(hUsbf,CSL_USBF_CMD_RESET_EP,NULL))
{
OS_DEBUGF(DEV_USB,(" CSL_USBF_CMD_RESET_EP:cmd failed \r\n"));
}
/* Re-enable the USB interrupts on USB_IRQ_EN
* Start of frame ( ISO Only )
* RX Endpoint n
* TX Endpoint n
* Device State Chg
* EP0 RX/TX
*/
intEn = 0xB9;
if (CSL_SOK != CSL_usbfHwControl(hUsbf,CSL_USBF_CMD_ENABLE_INTERRUPT,&intEn))
{
OS_DEBUGF(DEV_USB,(" CSL_USBF_CMD_ENABLE_INTERRUPT:cmd failed \r\n"));
}
}
/** ============================================================================
* @func processStateChg
* @desc
* Handles any change of State for the USB Device
*
* =============================================================================
*/
void processStateChg(void )
{
INT16U state_chg;
/* Find any difference from the last state, to the current state */
state_chg = last_state ^ hUsbf->regs->DEVSTAT;
/* ---------------------------- *
* Attached State Change *
* ---------------------------- */
if ( ( state_chg & CSL_USBF_DEVICE_STATUS_ATTACHED ) && \
( hUsbf->regs->DEVSTAT & CSL_USBF_DEVICE_STATUS_ATTACHED ) )
USB_AttachedStateHandler( );
/* ---------------------------- *
* Default State Change *
* ---------------------------- */
if ( ( state_chg & CSL_USBF_DEVICE_STATUS_DEFAULT ) && \
( hUsbf->regs->DEVSTAT & CSL_USBF_DEVICE_STATUS_DEFAULT ) )
USB_DefaultStateHandler( );
/* ---------------------------- *
* Suspended State Change *
* ---------------------------- */
if ( ( state_chg & CSL_USBF_DEVICE_STATUS_SUSPENDED ) && \
( hUsbf->regs->DEVSTAT & CSL_USBF_DEVICE_STATUS_SUSPENDED ) )
USB_SuspendStateHandler( );
/* ---------------------------- *
* Remote Wakeup State Change *
* ---------------------------- */
if ( ( state_chg & CSL_USBF_DEVICE_STATUS_REMOTE_WAKEUP_GRANTED ) && \
( hUsbf->regs->DEVSTAT & CSL_USBF_DEVICE_STATUS_REMOTE_WAKEUP_GRANTED ) )
__asm( " nop" );
/* ---------------------------- *
* Addressed State Change *
* ---------------------------- */
if ( ( state_chg & CSL_USBF_DEVICE_STATUS_ADDRESSED ) && \
( hUsbf->regs->DEVSTAT & CSL_USBF_DEVICE_STATUS_ADDRESSED ) )
USB_AddressStateHandler( );
/* ---------------------------- *
* Configured State Change *
* ---------------------------- */
if ( ( state_chg & CSL_USBF_DEVICE_STATUS_CONFIGURED ) && \
( hUsbf->regs->DEVSTAT & CSL_USBF_DEVICE_STATUS_CONFIGURED ) )
USB_ConfiguredStateHandler( );
/* ---------------------------- *
* Reset State Change *
* ---------------------------- */
if ( ( state_chg & CSL_USBF_DEVICE_STATUS_DEVICE_RESETTING ) &&\
( hUsbf->regs->DEVSTAT & CSL_USBF_DEVICE_STATUS_DEVICE_RESETTING ) )
USB_ResetStateHandler( );
/* Record the current Device Status */
last_state = hUsbf->regs->DEVSTAT;
}
/** ============================================================================
* @n@b receiveEP
*
* @b Description
* @n This is a generic receive function that redirects incoming packets to
* a specficied function handler.
*
* =============================================================================
*/
void receiveEP( void )
{
INT8U endpt_num;
CSL_UsbfNonIsoEpIntStatus intStatus;
if (CSL_SOK != CSL_usbfGetHwStatus(hUsbf,\
CSL_USBF_QUERY_FRAME_NONISO_EP_INT_STATUS,&intStatus))
{
OS_DEBUGF(DEV_USB,("Rep: CSL_USBF_QUERY_FRAME_NONISO_EP_INT_STATUS:query failed \r\n"));
}
/* Read endpoint number */
endpt_num = intStatus.rxEpIntSource;
if (CSL_SOK != CSL_usbfHwControl(hUsbf,CSL_USBF_CMD_SELECT_EP,&endpt_num))
{
OS_DEBUGF(DEV_USB,(" CSL_USBF_CMD_SELECT_EP:cmd failed \r\n"));
}
/* Check for ACK */
if ( hUsbf->regs->STAT_FLG & CSL_USBF_NONISO_EP_STATUS_ACK_HANDSHAKE )
{
/* Execute user defined tx-handler */
( ( void( * )( ) )endpt_func_out[endpt_num] )( endpt_num, USB_DIR_OUT );
}
/* No ACK received - clear halt and set fifo to receive again */
else
{
/* Clear Halt on endpoint */
/* Clear Control Halt */
if (CSL_SOK != CSL_usbfHwControl(hUsbf,CSL_USBF_CMD_CLEAR_HALT,NULL))
{
OS_DEBUGF(DEV_USB,("Rep: CSL_USBF_CMD_CLEAR_HALT:cmd failed \r\n"));
}
/* Set current endpoint to [endpt_num] and disable FIFO access */
hUsbf->regs->EPNUM = 0x00 | endpt_num;
/* Setup Endpoint [endpt_num] to retreive the next incoming packet. */
if (CSL_SOK != CSL_usbfHwControl(hUsbf,CSL_USBF_CMD_ENABLE_FIFO,NULL))
{
OS_DEBUGF(DEV_USB,("Rep: CSL_USBF_CMD_ENABLE_FIFO:cmd failed \r\n"));
}
}
}
/** ============================================================================
* @n@b transmitEP
*
* @b Description
* @n This is a generic receive function that redirects incoming packets to
* a specficied function handler.
*
* =============================================================================
*/
void transmitEP( void )
{
INT8U endpt_num;
INT8U epNum;
CSL_UsbfNonIsoEpIntStatus intStatus;
INT16U epStatus;
if (CSL_SOK != CSL_usbfGetHwStatus(hUsbf,\
CSL_USBF_QUERY_FRAME_NONISO_EP_INT_STATUS,&intStatus))
{
OS_DEBUGF(DEV_USB,("Tep: CSL_USBF_QUERY_FRAME_NONISO_EP_INT_STATUS:query failed \r\n"));
}
/* Read Current Endpoint Number */
endpt_num = intStatus.txEpIntSource;
epNum = endpt_num | 0x10 ;
OS_DEBUGF(DEV_USB,("endpt func in epNum %d\r\n",epNum));
/* Set current endpoint to [endpt_num] and direction IN */
if (CSL_SOK != CSL_usbfHwControl(hUsbf,CSL_USBF_CMD_SELECT_EP,&epNum))
{
OS_DEBUGF(DEV_USB,(" CSL_USBF_CMD_SELECT_EP:cmd failed \r\n"));
}
if (CSL_SOK != CSL_usbfGetHwStatus(hUsbf,\
CSL_USBF_QUERY_NONISO_EP_STATUS,&epStatus))
{
OS_DEBUGF(DEV_USB,("Tep: CSL_USBF_QUERY_NONISO_EP_STATUS:query failed \r\n"));
}
/* Check for ACK */
if ( epStatus & CSL_USBF_NONISO_EP_STATUS_ACK_HANDSHAKE )
{
/* Execute user defined tx-handler */
( ( void( * )( ) )endpt_func_in[endpt_num] )( endpt_num, USB_DIR_IN );
OS_DEBUGF(DEV_USB,("endpt func in 2\r\n"));
}
/* No ACK received - clear halt */
else
{
/* Clear Halt on endpoint */
/* Clear Control Halt */
if (CSL_SOK != CSL_usbfHwControl(hUsbf,CSL_USBF_CMD_CLEAR_HALT,NULL))
{
OS_DEBUGF(DEV_USB,("Tep: CSL_USBF_CMD_CLEAR_HALT:cmd failed \r\n"));
}
/* Set current endpoint to [endpt_num] and disable FIFO access */
hUsbf->regs->EPNUM = 0x10 | endpt_num;
}
}
void dUSB_ISR(void)
{
INT16U irq_src = 0;
INT16U irq_src_mask;
/* Read pending IRQs */
if (CSL_SOK != CSL_usbfGetHwStatus(hUsbf,CSL_USBF_QUERY_IRQ_SRC,&irq_src))
{
OS_DEBUGF(DEV_USB,("serviceIrq: CSL_USBF_QUERY_IRQ_SRC:cmd failed \r\n"));
}
/* Generate mask to service IRQs individually.
* Automatically remove the Start of Frame IRQ */
irq_src_mask = irq_src & 0xFF7F;
//OS_DEBUGF(DEV_USB,("serviceIrq %04x\r\n",irq_src));
#if 1
/* Service each IRQ individually */
for ( ; irq_src_mask ; )
{
if ( irq_src_mask & CSL_USBF_IRQ_SRC_DS_CHG )
{
irq_src_mask ^= CSL_USBF_IRQ_SRC_DS_CHG;
processStateChg( );
OS_DEBUGF(DEV_USB,("CSL_USBF_IRQ_SRC_DS_CHG\r\n"));
}
else if ( irq_src_mask & CSL_USBF_IRQ_SRC_EPN_RX )
{
irq_src_mask ^= CSL_USBF_IRQ_SRC_EPN_RX;
receiveEP( );
OS_DEBUGF(DEV_USB,("CSL_USBF_IRQ_SRC_EPN_RX\r\n"));
}
else if ( irq_src_mask & CSL_USBF_IRQ_SRC_EP0_RX )
{
irq_src_mask ^= CSL_USBF_IRQ_SRC_EP0_RX;
receiveEP( );
OS_DEBUGF(DEV_USB,("CSL_USBF_IRQ_SRC_EP0_RX\r\n"));
}
else if ( irq_src_mask & CSL_USBF_IRQ_SRC_EPN_TX )
{
irq_src_mask ^= CSL_USBF_IRQ_SRC_EPN_TX;
transmitEP( );
OS_DEBUGF(DEV_USB,("CSL_USBF_IRQ_SRC_EPN_TX\r\n"));
}
else if ( irq_src_mask & CSL_USBF_IRQ_SRC_EP0_TX )
{
irq_src_mask ^= CSL_USBF_IRQ_SRC_EP0_TX;
transmitEP( );
OS_DEBUGF(DEV_USB,("CSL_USBF_IRQ_SRC_EP0_TX\r\n"));
}
else if ( irq_src_mask & CSL_USBF_IRQ_SRC_RXN_EOT )
{
irq_src_mask ^= CSL_USBF_IRQ_SRC_RXN_EOT;
OS_DEBUGF(DEV_USB,("CSL_USBF_IRQ_SRC_RXN_EOT\r\n"));
}
else if ( irq_src_mask & CSL_USBF_IRQ_SRC_RXN_CNT )
{
irq_src_mask ^= CSL_USBF_IRQ_SRC_RXN_CNT;
OS_DEBUGF(DEV_USB,("CSL_USBF_IRQ_SRC_RXN_CNT\r\n"));
}
else if ( irq_src_mask & CSL_USBF_IRQ_SRC_TXN_DONE )
{
irq_src_mask ^= CSL_USBF_IRQ_SRC_TXN_DONE;
OS_DEBUGF(DEV_USB,("CSL_USBF_IRQ_SRC_TXN_DONE\r\n"));
}
else if ( irq_src_mask & CSL_USBF_IRQ_SRC_SETUP )
{
irq_src_mask ^= CSL_USBF_IRQ_SRC_SETUP;
processEP0( 0, USB_DIR_OUT );
OS_DEBUGF(DEV_USB,("CSL_USBF_IRQ_SRC_SETUP\r\n"));
}
}
#endif
/* Clear IRQs that have been serviced */
hUsbf->regs->IRQ_SRC = irq_src;
hUsbf->regs->IRQ_EN = 0xff;
}
void CSL_usbfStartDmaTransfer (CSL_UsbfHandle hUsbf,CSL_UsbfDmaNum dmaNum)
{
switch (dmaNum)
{
case 0:
CSL_FINS(hUsbf->regs->TXDMA0, USBF_TXDMA0_TX0_START, 1 );
break;
case 1:
CSL_FINS(hUsbf->regs->TXDMA1, USBF_TXDMA1_TX1_START, 1 );
break;
case 2:
CSL_FINS(hUsbf->regs->TXDMA2, USBF_TXDMA2_TX2_START, 1 );
break;
}
}
void
CSL_usbfInitRemoteWakeup(
CSL_UsbfHandle hUsbf
)
{
CSL_FINS(hUsbf->regs->SYSCON2, USBF_SYSCON2_RMT_WKP, 1 );
}
void
CSL_usbfStallUsbCmd(
CSL_UsbfHandle hUsbf
)
{
CSL_FINS(hUsbf->regs->SYSCON2, USBF_SYSCON2_STALL_CMD, 1 );
}
void
CSL_usbfInformDeviceCfgDone(
CSL_UsbfHandle hUsbf
)
{
CSL_FINS(hUsbf->regs->SYSCON2, USBF_SYSCON2_DEV_CFG, 1 );
}
void
CSL_usbfInformDeviceCfgCleared(
CSL_UsbfHandle hUsbf
)
{
CSL_FINS(hUsbf->regs->SYSCON2, USBF_SYSCON2_CLR_CFG, 1 );
}
void
CSL_usbfClearHalt(
CSL_UsbfHandle hUsbf
)
{
CSL_FINS(hUsbf->regs->CTRL, USBF_CTRL_CLR_HALT, 1 );
}
void
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -