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

📄 isr.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
字号:
/********************************************************************
   COPYRIGHT (c)   2007 BY ROCK-CHIP FUZHOU
      --  ALL RIGHTS RESERVED  --
* File Name: UsbIsr.c
* Author:  Oliver Miao
* Created:  2007-6-20 9:59
* Modified:
* Revision:  1.00
*
*********************************************************************
********************
* Module History
********************
*2007-6-20 10:10 Created by Oli
*2007-9-24 11:41    去掉UsbSetupReq函数中对ResetFlag的检查 by Oli
*2007-9-24 16:04    Usb_PowerOnInit函数中:
                    //SOFT_CONNECT();                   //降低功耗
*********************************************************************/
#include "hw_include.h"

#include "include.h"
#include "usb.h"
#include "hw_memmap.h"
#include "hw_common.h"
#include "BulkOnly.h"
#include "UsbBlock.h"
//#include "hw_sd.h"

//#define       DEBUG

BOOL bIsFullSpeed;
BOOL bRequestError;
INT32 UsbZeroData;
INT32 ResetFlag;
UINT32 uControlStage;
UINT32 uBulkBlockSize;
UINT32 uCurrentCtrlPacketSize;
UINT32 uCurrentBulklPacketSize;
__align(4)  UINT8   Bulk_buf[4096];
setup_request_t  SetupRequestData;
UINT8   volatile    UsbConnected;       //modiby lxs @2008.1.23
UINT8   volatile    SCSI_MediaReady;    //modiby lxs @2008.1.23
extern UINT16  BulkEndpSize;
extern  UINT32 uControlDataSize;
extern  BYTE    scUsbDscr[];
extern  UINT8 *CtrlInBuffer  ;

extern  UINT8 G_ucBulkPhase;
extern  UINT8 G_ucBulkStausPhase;
uint8  HsRetryTimes = 0; //add by lxs @2008.02.22

void Delay10ms(void)
{
    ;
}

/********************************************************************
Routine  :  UDC_ISR
Input  :  void
Output  :  void
Function :  UDC interrupt routine
*********************************************************************/
void UDC_ISR(void)
{
    UINT32 int2flgReg = INTFLG;

#ifdef DEBUG
    //printf("->UDC_ISR\n");
#endif
    //USB状态中断
    if (int2flgReg & VBUS_INTR)
    {
        UsbVbusIsr();//UsbVbusIntr();
    }
    if (int2flgReg & USBRST_INTR)
    {
        UsbReset();
    }
    if (int2flgReg & SETUP_INTR)
    {
        UsbSetupReq();
    }
    if (int2flgReg & SUSP_INTR)
    {
        UsbSuspend();
    }
    if (int2flgReg & RSUME_INTR)
    {
        UsbResume();
    }

    //USB控制端点中断
    if (int2flgReg & IN0_INTR)
    {
        UsbIn0();
    }
    if (int2flgReg & OUT0_INTR)
    {
        UsbOut0();
    }

    //USB批量传输中断
    if (int2flgReg & ENP1_INTR)
    {
        UsbBulkOutPacket();
    }
    if (int2flgReg & ENP2_INTR)
    {
        UsbBulkInPacket();
    }
}

/********************************************************************
Routine  :  UsbReset
Input  :  void
Output  :  void
Function :  Process the Reset interrupt
*********************************************************************/
void UsbReset()
{
    UINT32 int2flgReg;

    uControlDataSize = 0;//uControlDataSize记录控制传输尚需要传输的字节个数
    G_ucBulkPhase = K_CommandPhase;
    G_ucBulkStausPhase = K_CommandPhase;
    UsbZeroData = 0;
#if 0
    do
    {
        int2flgReg = INTFLG;
    }
    while (int2flgReg & USBRST_INTR);
    if (!IS_HIGH_SPEED() && HsRetryTimes == 0)
    {
        HsRetryTimes = 1;
        USB_PHY_RST();
        DelayMs_nops(200);
        SOFT_CONNECT();
    }
#endif

    UDCInit();
    UsbReadyToReadDataEP(Bulk_buf);
    //2007-9-24 16:01ResetFlag = 1;
}

/********************************************************************
Routine  :  UsbSetupReq
Input  :  void
Output  :  void
Function :  Process the Usb Setup interrupt
*********************************************************************/
void UsbSetupReq()
{
    UINT32*  p;
    UINT32   request_type;

    bRequestError = NO;
    uControlStage = SETUP_STAGE;
    if (IS_HIGH_SPEED())
    {
        bIsFullSpeed = 0;
        uBulkBlockSize  = HI_SPEED_BULK_PACKET_SIZE;
        uCurrentCtrlPacketSize  = HI_SPEED_CTRL_PACKET_SIZE;
        uCurrentBulklPacketSize = HI_SPEED_BULK_PACKET_SIZE;
    }
    else
    {
        bIsFullSpeed = 1;
        uBulkBlockSize  = FULL_SPEED_BULK_PACKET_SIZE;
        uCurrentCtrlPacketSize  = FULL_SPEED_CTRL_PACKET_SIZE;
        uCurrentBulklPacketSize = FULL_SPEED_BULK_PACKET_SIZE;
    }
    scUsbDscr[7] = uCurrentCtrlPacketSize;
    //2007-9-24 16:01ResetFlag = 0;
    //UsbReadyToReadDataEP(ChannelSet[0].pBulkOutBuffer);
    UsbReadyToReadDataEP(Bulk_buf);

    // read setup data
    p = (UINT32*) & SetupRequestData;
    *p++ = *(volatile UINT32 *)UDC_SETUP1;
    *p   = *(volatile UINT32 *)UDC_SETUP2;

    // identify standard request
    request_type = GET_REQ_TYPE(SetupRequestData.bmRequestType);

    if (request_type == REQ_TYPE_STANDARD)  //USB标准请求
    {
        if (SetupRequestData.bRequest == GET_DESCRIPTOR)
        {
            UsbGetDescriptor();
//****************************************************************************
// 修改 PC 不开机 BUG。 2008-03-19 FZF
//****************************************************************************
            if (UsbConnected == 0)
            {
                UsbConnected = 1;   //modify by lxs @2008.1.23
                SCSI_MediaReady = 0;
            }
            //RockOSSendMsg(MBGUI, MS_ISRGU_USBCableInd ,(void*)1);
//****************************************************************************

        }
    }
    else
    {
        if (request_type == REQ_TYPE_CLASS)     //USB类请求
        {
            if (SetupRequestData.bRequest == 0xfe) //GET MAX LUN
            {
                char type = UsbBlkGetMaxLun() - 1;

                HsRetryTimes = 0;
                uControlDataSize = 1;
                UsbWriteCtlEP(1, (UINT8*)(&type));
            }
            else
            {
                if (SetupRequestData.bRequest == 0xff) //USB BULK-ONLY Mass Storage RESET
                {
                    ;
                }
            }
        }
        else
        {
            if (request_type == REQ_TYPE_VENDOR)    //USB厂家请求
            {
                ;
            }
        }
    }

    BulkEndpSize = bIsFullSpeed ? FULL_SPEED_BULK_PACKET_SIZE : HI_SPEED_BULK_PACKET_SIZE;
    uControlStage = DATA_STAGE ;
}

/********************************************************************
Routine  :  UsbSuspend
Input  :  void
Output  :  void
Function :  Process the Suspend interrupt
*********************************************************************/
void UsbSuspend()
{
    if (UsbConnected)
    {
        UsbConnected = 0;
        //RockOSSendMsg(MBGUI, MS_ISRGU_USBCableInd ,(void*)0);
    }
}

/********************************************************************
Routine  :  UsbResume
Input  :  void
Output  :  void
Function :  Process the Resume interrupt
*********************************************************************/
void UsbResume()
{
    UsbClrCtlEP();
}

/********************************************************************
Routine  :  UsbIn0
Input  :  void
Output  :  void
Function :  Process TX0 interrupt
*********************************************************************/
void UsbIn0()
{
    UINT32 STATUS;

    STATUS = TX0_STATUS; //MUST DONE!+oli@2007-6-28 23:13

    if (uControlStage == DATA_STAGE)
    {
        if (uControlDataSize > 0)
        {
            UsbWriteCtlEP(uControlDataSize, CtrlInBuffer);
        }
        else
        {
            if (UsbZeroData == 1)
            {
                UsbWriteCtlEP(0, CtrlInBuffer);
                UsbZeroData = 0;
            }
            else
            {
                // open OUT gate
                UsbEnableRX();
                uControlStage = STATUS_STAGE;
            }
        }
    }
    else
    {
        if (uControlStage == STATUS_STAGE)
        {
            UsbDisableEP0();
        }
    }
}

/********************************************************************
Routine  :  UsbOut0
Input  :  void
Output  :  void
Function :  Process RX0 interrupt
*********************************************************************/
void UsbOut0()
{
    INT32 len;
    UINT32 STATUS;

    if (uControlStage == STATUS_STAGE)
    {
        STATUS = RX0_STATUS;       //MUST DONE!!!+OLI@2007-6-28 23:19
        // assert both TX0NAK, RX0NAK at status stage
        UsbDisableEP0();
    }
    else
    {
        if (uControlStage == DATA_STAGE)
        {
            // read length from H/W
            len = RX0_STATUS & RxCNT;

            // record received result
            uControlDataSize -= len;
            WriteReg32(UDC_DMA0LM_OADDR, virt_to_phy((UINT32)(CtrlInBuffer)));
            WriteReg32(UDC_DMA0CTLO, ENP_DMA_START);

        }
    }
}

/********************************************************************
Routine  :  UsbIntrReq
Input  :  void
Output  :  channel index
Function :  Process Intr_IN interrupt
*********************************************************************/
void UsbIntrReq(UINT32 ch)
{
    return;     //暂时用不到+oli@2007-6-28 23:09
}

/********************************************************************
Routine  :  UsbCtlSetZeroData
Input  :  the data length that need to transfer
Output  :  void
Function :  Judge if it's need to transfer a zero lenth data
               after the last data packet in CtlTrans
*********************************************************************/
void UsbCtlSetZeroData(INT32 len)
{
    if (bIsFullSpeed)
    {
        UsbZeroData = (len % FULL_SPEED_CTRL_PACKET_SIZE) ? 0 : 1;
    }
    else
    {
        UsbZeroData = (len % HI_SPEED_CTRL_PACKET_SIZE) ? 0 : 1;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -