⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drv_usb.c

📁 基于omap5912平台的usb设备驱动源程序
💻 C
📖 第 1 页 / 共 5 页
字号:
        
    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 + -