[Feature]Upload Modem source code
Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/driver/connectivity/sdio_device_boot/inc/sdio_fw.h b/mcu/driver/connectivity/sdio_device_boot/inc/sdio_fw.h
new file mode 100644
index 0000000..5ad4449
--- /dev/null
+++ b/mcu/driver/connectivity/sdio_device_boot/inc/sdio_fw.h
@@ -0,0 +1,189 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * sdio_fw.h
+ *
+ * Project:
+ * --------
+ * SDIO Device Firmware
+ *
+ * Description:
+ * ------------
+ *
+ *
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ ****************************************************************************/
+#ifndef SDIO_FW_H
+#define SDIO_FW_H
+
+#include "sdio_fw_drv_config.h"
+
+#if !defined(SDIO_UNIT_TEST) && defined(__BOOTROM__)
+#include "br_MTK_BB.h"
+#endif
+
+#include "sdio_gpd.h"
+
+
+// ========================================
+//
+// Define hardware limitation.
+//
+// ========================================
+#define _2KB (2024 * 4)
+#define _4KB (1024 * 4)
+#define _64KB (16 * _4KB)
+#define SDIO_TX_PACKET_SIZE _4KB
+#define SDIO_RX_PACKET_SIZE _64KB-1
+
+#define SDIO_MAX_TX_QUEUE_NUM 1
+#define SDIO_MAX_RX_QUEUE_NUM 1
+
+
+// ========================================
+//
+// Macro for improving code readability
+//
+// ========================================
+#define SDIO_RX 0
+#define SDIO_TX 1
+
+#define SDIO_DEFAULT_TQ_IDX 0
+#define SDIO_DEFAULT_RQ_IDX 0
+
+#define SDIO_SWINT_MB0_BROMSEND 0x00010000
+#define SDIO_SWINT_MB0_BROMRECV 0x00020000
+#define SDIO_SWINT_MB_SENDDATA 0x00010000
+#define SDIO_SWINT_MB_RECVDATA 0x00020000
+#define SDIO_SWINT_ERROR_BROMSEND 0x00040000
+#define SDIO_SWINT_ERROR_BROMRECV 0x00080000
+
+
+// ========================================
+//
+// Define driver data structures
+//
+// ========================================
+
+typedef struct _SDIO_QUEUE_HANDLE {
+ PSDIO_GPDH_Node pGPD_Enq;
+ PSDIO_GPDH_Node pGPD_Deq;
+ kal_uint8 Nodes_Limit;
+ kal_uint8 Nodes_Current;
+ kal_uint8 isTX;
+
+ kal_uint8 *TX_USER_Buffer;
+ kal_uint8 *TX_USER_Buffer_Write_Ptr;
+} SDIO_QUEUE_HANDLE, *PSDIO_QUEUE_HANDLE;
+
+#define SDIO_QUEUE_GET_GPD_ENQ(PQUEUE) (PQUEUE->pGPD_Enq)
+#define SDIO_QUEUE_SET_GPD_ENQ(PQUEUE, ENQ) (PQUEUE->pGPD_Enq=ENQ)
+#define SDIO_QUEUE_GET_GPD_DEQ(PQUEUE) (PQUEUE->pGPD_Deq)
+#define SDIO_QUEUE_SET_GPD_DEQ(PQUEUE, DEQ) (PQUEUE->pGPD_Deq=DEQ)
+#define SDIO_QUEUE_GET_Q_HW_IDX(PQUEUE) (PQUEUE->Q_HW_Idx)
+#define SDIO_QUEUE_SET_Q_HW_IDX(PQUEUE, IDX) (PQUEUE->Q_HW_Idx=IDX)
+#define SDIO_QUEUE_GET_NODES_LIMIT(PQUEUE) (PQUEUE->Nodes_Limit)
+#define SDIO_QUEUE_SET_NODES_LIMIT(PQUEUE, LIMIT) (PQUEUE->Nodes_Limit=LIMIT)
+#define SDIO_QUEUE_GET_NODES_CURRENT(PQUEUE) (PQUEUE->Nodes_Current)
+#define SDIO_QUEUE_SET_NODES_CURRENT(PQUEUE, CUR) (PQUEUE->Nodes_Current=CUR)
+#define SDIO_QUEUE_DEC_NODES_CURRENT(PQUEUE, DEC) (PQUEUE->Nodes_Current-=DEC)
+#define SDIO_QUEUE_INC_NODES_CURRENT(PQUEUE, INC) (PQUEUE->Nodes_Current+=INC)
+#define SDIO_QUEUE_GET_ISTX(PQUEUE) (PQUEUE->isTX)
+#define SDIO_QUEUE_SET_ISTX(PQUEUE, ISTX) (PQUEUE->isTX=ISTX)
+#define SDIO_QUEUE_GET_TX_USER_BUFFER(PQUEUE, BUF) (PQUEUE->TX_USER_Buffer)
+#define SDIO_QUEUE_SET_TX_USER_BUFFER(PQUEUE, BUF) (PQUEUE->TX_USER_Buffer=BUF)
+#define SDIO_QUEUE_GET_TX_USER_BUFFER_WR_PTR(PQUEUE) (PQUEUE->TX_USER_Buffer_Write_Ptr)
+#define SDIO_QUEUE_SET_TX_USER_BUFFER_WR_PTR(PQUEUE, PTR) (PQUEUE->TX_USER_Buffer_Write_Ptr=PTR)
+#define SDIO_QUEUE_INC_TX_USER_BUFFER_WR_PTR(PQUEUE, INC) (PQUEUE->TX_USER_Buffer_Write_Ptr+=INC)
+
+
+typedef struct _SDIO_INT_INFO {
+ kal_uint32 HGFISR;
+ kal_uint32 HWFISR;
+ kal_uint32 HWFTE0SR;
+ kal_uint32 HWFRE0SR;
+ //kal_uint32 HWFRE01R;
+} SDIO_INT_INFO, *PSDIO_INT_INFO;
+
+
+typedef struct _SDIO_USER_HANDLE {
+ PSDIO_GPDH_Node pGPDH_List;
+ kal_uint32 GPDH_Number;
+
+ kal_uint32 *TX_GPDB_Pool;
+ kal_uint32 *TX_GPDB_Pool_Head;
+ kal_uint32 *TX_GPDB_Pool_Tail;
+ kal_uint32 TX_GPDB_Backup_Num;
+
+ SDIO_QUEUE_HANDLE TQ_Handles[SDIO_MAX_TX_QUEUE_NUM];
+ SDIO_QUEUE_HANDLE RQ_Handles[SDIO_MAX_RX_QUEUE_NUM];
+
+ SDIO_INT_INFO Int_Info;
+
+ kal_uint16 TQ_start_threshold;
+ kal_uint16 TQ_supplement_threshold;
+
+ void (*timer_callback)(kal_uint32);
+} SDIO_USER_HANDLE, *PSDIO_USER_HANDLE;
+
+
+typedef struct _SDIO_QUEUE_REQ_DESCRIPTOR {
+ kal_uint8 Q_HW_Idx;
+ kal_uint8 isTX;
+} SDIO_QUEUE_REQ_DESCRIPTOR, *PSDIO_QUEUE_REQ_DESCRIPTOR;
+
+#define SDIO_QUEUE_REQ_SET_Q_HW_IDX(QUEUE_REQ, IDX) QUEUE_REQ.Q_HW_Idx=IDX
+#define SDIO_QUEUE_REQ_SET_IS_TX(QUEUE_REQ, TX) QUEUE_REQ.isTX=TX
+
+
+// ========================================
+//
+// Define driver internal functions in sdio_fw.c
+//
+// ========================================
+void sdio_error_processing(
+ void
+ );
+
+
+#endif
diff --git a/mcu/driver/connectivity/sdio_device_boot/inc/sdio_fw.h.bak b/mcu/driver/connectivity/sdio_device_boot/inc/sdio_fw.h.bak
new file mode 100755
index 0000000..24fef82
--- /dev/null
+++ b/mcu/driver/connectivity/sdio_device_boot/inc/sdio_fw.h.bak
@@ -0,0 +1,189 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * sdio_fw.h
+ *
+ * Project:
+ * --------
+ * SDIO Device Firmware
+ *
+ * Description:
+ * ------------
+ *
+ *
+ *
+ * Author:
+ * -------
+ * Cool Lee, Light Hsieh
+ *
+ ****************************************************************************/
+#ifndef SDIO_FW_H
+#define SDIO_FW_H
+
+#include "sdio_fw_drv_config.h"
+
+#ifndef SDIO_UNIT_TEST
+#include "br_MTK_BB.h"
+#endif
+
+#include "sdio_gpd.h"
+
+
+// ========================================
+//
+// Define hardware limitation.
+//
+// ========================================
+#define _2KB (2024 * 4)
+#define _4KB (1024 * 4)
+#define _64KB (16 * _4KB)
+#define SDIO_TX_PACKET_SIZE _4KB
+#define SDIO_RX_PACKET_SIZE _64KB-1
+
+#define SDIO_MAX_TX_QUEUE_NUM 1
+#define SDIO_MAX_RX_QUEUE_NUM 1
+
+
+// ========================================
+//
+// Macro for improving code readability
+//
+// ========================================
+#define SDIO_RX 0
+#define SDIO_TX 1
+
+#define SDIO_DEFAULT_TQ_IDX 0
+#define SDIO_DEFAULT_RQ_IDX 0
+
+#define SDIO_SWINT_MB0_BROMSEND 0x00010000
+#define SDIO_SWINT_MB0_BROMRECV 0x00020000
+#define SDIO_SWINT_MB_SENDDATA 0x00010000
+#define SDIO_SWINT_MB_RECVDATA 0x00020000
+#define SDIO_SWINT_ERROR_BROMSEND 0x00040000
+#define SDIO_SWINT_ERROR_BROMRECV 0x00080000
+
+
+// ========================================
+//
+// Define driver data structures
+//
+// ========================================
+
+typedef struct _SDIO_QUEUE_HANDLE {
+ PSDIO_GPDH_Node pGPD_Enq;
+ PSDIO_GPDH_Node pGPD_Deq;
+ kal_uint8 Nodes_Limit;
+ kal_uint8 Nodes_Current;
+ kal_uint8 isTX;
+
+ kal_uint8 *TX_USER_Buffer;
+ kal_uint8 *TX_USER_Buffer_Write_Ptr;
+} SDIO_QUEUE_HANDLE, *PSDIO_QUEUE_HANDLE;
+
+#define SDIO_QUEUE_GET_GPD_ENQ(PQUEUE) (PQUEUE->pGPD_Enq)
+#define SDIO_QUEUE_SET_GPD_ENQ(PQUEUE, ENQ) (PQUEUE->pGPD_Enq=ENQ)
+#define SDIO_QUEUE_GET_GPD_DEQ(PQUEUE) (PQUEUE->pGPD_Deq)
+#define SDIO_QUEUE_SET_GPD_DEQ(PQUEUE, DEQ) (PQUEUE->pGPD_Deq=DEQ)
+#define SDIO_QUEUE_GET_Q_HW_IDX(PQUEUE) (PQUEUE->Q_HW_Idx)
+#define SDIO_QUEUE_SET_Q_HW_IDX(PQUEUE, IDX) (PQUEUE->Q_HW_Idx=IDX)
+#define SDIO_QUEUE_GET_NODES_LIMIT(PQUEUE) (PQUEUE->Nodes_Limit)
+#define SDIO_QUEUE_SET_NODES_LIMIT(PQUEUE, LIMIT) (PQUEUE->Nodes_Limit=LIMIT)
+#define SDIO_QUEUE_GET_NODES_CURRENT(PQUEUE) (PQUEUE->Nodes_Current)
+#define SDIO_QUEUE_SET_NODES_CURRENT(PQUEUE, CUR) (PQUEUE->Nodes_Current=CUR)
+#define SDIO_QUEUE_DEC_NODES_CURRENT(PQUEUE, DEC) (PQUEUE->Nodes_Current-=DEC)
+#define SDIO_QUEUE_INC_NODES_CURRENT(PQUEUE, INC) (PQUEUE->Nodes_Current+=INC)
+#define SDIO_QUEUE_GET_ISTX(PQUEUE) (PQUEUE->isTX)
+#define SDIO_QUEUE_SET_ISTX(PQUEUE, ISTX) (PQUEUE->isTX=ISTX)
+#define SDIO_QUEUE_GET_TX_USER_BUFFER(PQUEUE, BUF) (PQUEUE->TX_USER_Buffer)
+#define SDIO_QUEUE_SET_TX_USER_BUFFER(PQUEUE, BUF) (PQUEUE->TX_USER_Buffer=BUF)
+#define SDIO_QUEUE_GET_TX_USER_BUFFER_WR_PTR(PQUEUE) (PQUEUE->TX_USER_Buffer_Write_Ptr)
+#define SDIO_QUEUE_SET_TX_USER_BUFFER_WR_PTR(PQUEUE, PTR) (PQUEUE->TX_USER_Buffer_Write_Ptr=PTR)
+#define SDIO_QUEUE_INC_TX_USER_BUFFER_WR_PTR(PQUEUE, INC) (PQUEUE->TX_USER_Buffer_Write_Ptr+=INC)
+
+
+typedef struct _SDIO_INT_INFO {
+ kal_uint32 HGFISR;
+ kal_uint32 HWFISR;
+ kal_uint32 HWFTE0SR;
+ kal_uint32 HWFRE0SR;
+ //kal_uint32 HWFRE01R;
+} SDIO_INT_INFO, *PSDIO_INT_INFO;
+
+
+typedef struct _SDIO_USER_HANDLE {
+ PSDIO_GPDH_Node pGPDH_List;
+ kal_uint32 GPDH_Number;
+
+ kal_uint32 *TX_GPDB_Pool;
+ kal_uint32 *TX_GPDB_Pool_Head;
+ kal_uint32 *TX_GPDB_Pool_Tail;
+ kal_uint32 TX_GPDB_Backup_Num;
+
+ SDIO_QUEUE_HANDLE TQ_Handles[SDIO_MAX_TX_QUEUE_NUM];
+ SDIO_QUEUE_HANDLE RQ_Handles[SDIO_MAX_RX_QUEUE_NUM];
+
+ SDIO_INT_INFO Int_Info;
+
+ kal_uint16 TQ_start_threshold;
+ kal_uint16 TQ_supplement_threshold;
+
+ void (*timer_callback)(kal_uint32);
+} SDIO_USER_HANDLE, *PSDIO_USER_HANDLE;
+
+
+typedef struct _SDIO_QUEUE_REQ_DESCRIPTOR {
+ kal_uint8 Q_HW_Idx;
+ kal_uint8 isTX;
+} SDIO_QUEUE_REQ_DESCRIPTOR, *PSDIO_QUEUE_REQ_DESCRIPTOR;
+
+#define SDIO_QUEUE_REQ_SET_Q_HW_IDX(QUEUE_REQ, IDX) QUEUE_REQ.Q_HW_Idx=IDX
+#define SDIO_QUEUE_REQ_SET_IS_TX(QUEUE_REQ, TX) QUEUE_REQ.isTX=TX
+
+
+// ========================================
+//
+// Define driver internal functions in sdio_fw.c
+//
+// ========================================
+void sdio_error_processing(
+ void
+ );
+
+
+#endif
diff --git a/mcu/driver/connectivity/sdio_device_boot/inc/sdio_fw_api.h b/mcu/driver/connectivity/sdio_device_boot/inc/sdio_fw_api.h
new file mode 100644
index 0000000..21a2840
--- /dev/null
+++ b/mcu/driver/connectivity/sdio_device_boot/inc/sdio_fw_api.h
@@ -0,0 +1,183 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * sdio_api.h
+ *
+ * Project:
+ * --------
+ * SDIO Device Firmware
+ *
+ * Description:
+ * ------------
+ * This file list APIs provided to target environment in which no ISR and
+ * multi-tasking are available. Driver for the target environment does not
+ * share the same API and source/binary files with driver for environment
+ * with ISR and multi-tasking.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ ****************************************************************************/
+#ifndef _SDIO_FW_API_H_
+#define _SDIO_FW_API_H_
+
+#include "sdio_fw.h"
+
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// Data structure Section
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#define SDIO_MAX_TIMEOUT 0xFFFFFFFF
+#define SDIO_TX_GPDB_SIZE 0x1000 //4kb
+#define SDIO_DEFAULT_TX_START_THRESHOLD 0
+#define SDIO_DEFAULT_TX_SUPPLEMENT_THRESHOLD 0
+#define SDIO_DEFAULT_TX_NO_PRESTART 0xFFFF
+
+typedef enum _SDIO_STATUS {
+ SDIO_SUCCESS = 0
+ ,SDIO_BASIS = SDIO_STATUS_BASIS
+ ,SDIO_HW_WRITE_TIMEOUT = SDIO_BASIS + 0x1
+ ,SDIO_HW_READ_TIMEOUT = SDIO_BASIS + 0x2
+ ,SDIO_TX_CRC_ERROR = SDIO_BASIS + 0x3
+ ,SDIO_TX_OVERFLOW = SDIO_BASIS + 0x4
+ ,SDIO_RX_UNDERFLOW = SDIO_BASIS + 0x5
+ ,SDIO_RX_LEN_OVERFLOW = SDIO_BASIS + 0x6
+ ,SDIO_HOST_MOUNT_TIMEOUT = SDIO_BASIS + 0x7
+ ,SDIO_USER_TIMEOUT = SDIO_BASIS + 0x8
+ ,SDIO_ILLEGAL_ACCESS = SDIO_BASIS + 0x9
+ ,SDIO_RESOURCE_NOT_ENOUGH = SDIO_BASIS + 0xA
+ ,SDIO_RESOURCE_CONFLICT = SDIO_BASIS + 0xB
+ ,SDIO_QUEUE_FULL = SDIO_BASIS + 0xC
+ ,SDIO_QUEUE_EMPTY = SDIO_BASIS + 0xD
+ ,SDIO_ABNORMAL_HOST_BEHAVIOR = SDIO_BASIS + 0xE
+ ,SDIO_ABNORMAL_SETTING = SDIO_BASIS + 0xF
+ ,SDIO_ERROR = SDIO_BASIS + 0x10
+} SDIO_STATUS;
+
+
+typedef struct _SDIO_USER_REQ_DESCRIPTOR {
+ // User shall pass information about memory space for GPD headers and number of GPD headers
+ PSDIO_GPDH_Node pGPDH_List;
+ kal_uint16 TX_GPDH_Number;
+ kal_uint16 RX_GPDH_Number;
+
+ kal_uint16 TQ_start_threshold;
+ kal_uint16 TQ_supplement_threshold;
+
+ kal_uint32 *TX_GPDB_Pool;
+ kal_uint32 TX_GPDB_Backup_Num;
+
+ void (*timer_callback)(kal_uint32);
+} SDIO_USER_REQ_DESCRIPTOR, *PSDIO_USER_REQ_DESCRIPTOR;
+
+#define SDIO_USER_REQ_SET_GPDH_LIST(USER_REQ, GPDH_LIST) USER_REQ.pGPDH_List=GPDH_LIST
+#define SDIO_USER_REQ_SET_TX_GPDH_NUM(USER_REQ, GPDH_NUM) USER_REQ.TX_GPDH_Number=GPDH_NUM
+#define SDIO_USER_REQ_SET_RX_GPDH_NUM(USER_REQ, GPDH_NUM) USER_REQ.RX_GPDH_Number=GPDH_NUM
+#define SDIO_USER_REQ_SET_TIMER_CALLBACK(USER_REQ, FUNC) USER_REQ.timer_callback=FUNC
+#define SDIO_USER_REQ_SET_TX_GPDB(USER_REQ, GPDB) USER_REQ.TX_GPDB_Pool=GPDB
+#define SDIO_USER_REQ_SET_TX_GPDB_NUM(USER_REQ, GPDB_NUM) USER_REQ.TX_GPDB_Backup_Num=GPDB_NUM
+#define SDIO_USER_REQ_SET_TX_START_THRESHOLD(USER_REQ, NUM) USER_REQ.TQ_start_threshold=NUM
+#define SDIO_USER_REQ_SET_TX_SUPPLEMENT_THRESHOLD(USER_REQ, NUM) USER_REQ.TQ_supplement_threshold=NUM
+
+
+typedef struct _SDIO_BUFFER_DESCRIPTOR {
+ kal_uint32 address;
+ kal_uint32 length;
+
+} SDIO_BUFFER_DESCRIPTOR, *PSDIO_BUFFER_DESCRIPTOR;
+
+#define SDIO_BUFFER_SET_ADDRESS(BD, ADDRESS) BD.address=ADDRESS;
+#define SDIO_BUFFER_SET_LENGTH(BD, LENGTH) BD.length=LENGTH;
+
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// API Section
+//
+//////////////////////////////////////////////////////////////////////////////
+
+extern SDIO_STATUS sdio_init(
+ void (*timer_callback)(kal_uint32),
+ kal_uint32 timeout
+ );
+
+
+extern SDIO_STATUS sdio_open(
+ PSDIO_USER_HANDLE pUser_handle,
+ PSDIO_USER_REQ_DESCRIPTOR pUser_Req
+ );
+
+
+extern void sdio_close(
+ PSDIO_USER_HANDLE pUser_handle
+ );
+
+
+extern SDIO_STATUS sdio_rx(
+ PSDIO_USER_HANDLE pUser_handle,
+ PSDIO_BUFFER_DESCRIPTOR bd,
+ kal_uint32 timeout_period //in ms
+ );
+
+
+extern SDIO_STATUS sdio_tx(
+ PSDIO_USER_HANDLE pUser_handle,
+ PSDIO_BUFFER_DESCRIPTOR bd,
+ kal_uint32 timeout_period //in ms
+ );
+
+
+extern SDIO_STATUS sdio_D2H_send_mailbox(
+ PSDIO_USER_HANDLE pUser_Handle,
+ kal_uint32 cmd,
+ kal_uint32 timeout
+ );
+
+
+extern SDIO_STATUS sdio_H2D_receive_mailbox(
+ PSDIO_USER_HANDLE pUser_Handle,
+ kal_uint32 *resp,
+ kal_uint32 timeout
+ );
+
+#endif
diff --git a/mcu/driver/connectivity/sdio_device_boot/inc/sdio_fw_drv_config.h b/mcu/driver/connectivity/sdio_device_boot/inc/sdio_fw_drv_config.h
new file mode 100644
index 0000000..7748430
--- /dev/null
+++ b/mcu/driver/connectivity/sdio_device_boot/inc/sdio_fw_drv_config.h
@@ -0,0 +1,86 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * sdio_fw.h
+ *
+ * Project:
+ * --------
+ * SDIO Device Firmware
+ *
+ * Description:
+ * ------------
+ *
+ *
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ ****************************************************************************/
+#ifndef SDIO_FW_DRV_CONFIG_H
+#define SDIO_FW_DRV_CONFIG_H
+
+// ========================================
+//
+// Internal features and configurations
+//
+// ========================================
+//#define SDIO_UNIT_TEST
+
+#define SDIO_RX_CALL_WITH_SINGLE_BUFFER
+#define SDIO_DEQUEUE_WHILE_POLL
+//#define SDIO_ENABLE_DEINIT
+#define SDIO_REPORT_ERROR_REASON
+//#define SDIO_TX_PREQUEUE //Don't enable this option
+
+#ifndef SDIO_UNIT_TEST
+ #include "br_sw_types.h"
+ #define SDIO_STATUS_BASIS 0xB000
+#else
+ #include "typedefs.h"
+ #include "reg_base.h"
+ #define SDIO_STATUS_BASIS 0
+ #define NULL 0
+ #define SDIO_MAX_RX_BD_PER_GPD 16
+ #define SDIO_MAX_TX_BD_PER_GPD 255
+ #define SDIO_MAX_TX_GPD_PER_Q 255
+ #define SDIO_MAX_RX_GPD_PER_Q 16
+#endif
+
+#endif
diff --git a/mcu/driver/connectivity/sdio_device_boot/inc/sdio_gpd.h b/mcu/driver/connectivity/sdio_device_boot/inc/sdio_gpd.h
new file mode 100644
index 0000000..011e2a7
--- /dev/null
+++ b/mcu/driver/connectivity/sdio_device_boot/inc/sdio_gpd.h
@@ -0,0 +1,145 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * sdio_gpd.h
+ *
+ * Project:
+ * --------
+ * SDIO Device Firmware
+ *
+ * Description:
+ * ------------
+ *
+ *
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ ****************************************************************************/
+#ifndef SDIO_GPD_H
+#define SDIO_GPD_H
+
+#include "sdio_fw_drv_config.h"
+
+
+#define SDIO_GPDH_NODE_BYTE_SIZE 16
+
+typedef struct _SDIO_GPDH_Node {
+ struct {
+ unsigned HWO:1;
+ unsigned BDP:1;
+ unsigned BPS:1;
+ unsigned reserved0:4;
+ unsigned IOC:1;
+ unsigned checksum:8;
+ unsigned reserved1:16;
+ } DW0;
+
+ struct _SDIO_GPDH_Node *next;
+ kal_uint32 buffer_address;
+
+ union {
+ struct {
+ unsigned rx_buffer_length:16;
+ unsigned extension_length:8;
+ unsigned reserved2:8;
+ } RX;
+ unsigned long reserved3;
+ } DW3;
+
+} SDIO_GPDH_Node, *PSDIO_GPDH_Node;
+
+#define SDIO_GPD_GET_HWO(GPD) (GPD->DW0.HWO)
+#define SDIO_GPD_SET_HWO(GPD) (GPD->DW0.HWO=1)
+#define SDIO_GPD_CLR_HWO(GPD) (GPD->DW0.HWO=0)
+#define SDIO_GPD_GET_BDP(GPD) (GPD->DW0.BDP)
+#define SDIO_GPD_SET_BDP(GPD) (GPD->DW0.BDP=1)
+#define SDIO_GPD_CLR_BDP(GPD) (GPD->DW0.BDP=0)
+#define SDIO_GPD_GET_BPS(GPD) (GPD->DW0.BPS)
+#define SDIO_GPD_SET_BPS(GPD) (GPD->DW0.BPS=1)
+#define SDIO_GPD_CLR_BSP(GPD) (GPD->DW0.BPS=0)
+#define SDIO_GPD_GET_IOC(GPD) (GPD->DW0.IOC)
+#define SDIO_GPD_SET_IOC(GPD) (GPD->DW0.IOC=1)
+#define SDIO_GPD_CLR_IOC(GPD) (GPD->DW0.IOC=0)
+#define SDIO_GPD_GET_BUFFER_LENGTH(GPD) (GPD->DW3.RX.rx_buffer_length)
+#define SDIO_GPD_SET_BUFFER_LENGTH(GPD, LEN) (GPD->DW3.RX.rx_buffer_length=LEN)
+#define SDIO_GPD_GET_EXTENSION_lENGTH(GPD) (GPD->DW3.RX.extension_length)
+#define SDIO_GPD_SET_EXTENSION_lENGTH(GPD, LEN) (GPD->DW3.RX.extension_length=LEN)
+#define SDIO_GPD_GET_NEXT_HEADER(GPD) (GPD->next)
+#define SDIO_GPD_SET_NEXT_HEADER(GPD, NEXT) (GPD->next=NEXT)
+#define SDIO_GPD_GET_BUFFER_ADDRESS(GPD) (GPD->buffer_address)
+#define SDIO_GPD_SET_BUFFER_ADDRESS(GPD, ADDR) (GPD->buffer_address=ADDR)
+
+
+typedef struct _SDIO_RX_BD {
+
+ struct {
+ unsigned EOL:1; // end of list
+ unsigned reserved0:7;
+ unsigned checksum:8;
+ unsigned reserved1:16;
+ } DW0;
+
+ unsigned long next_bd_address;
+ unsigned long data_address;
+
+ struct {
+ unsigned rx_buffer_length:16;
+ unsigned bd_ext_length:8;
+ unsigned reserved2:8;
+ } DW3;
+
+} SDIO_RX_BD, *PSDIO_RX_BD;
+
+#define SDIO_GPD_RX_BD_GET_EOL(BD) (BD->DW0.EOL)
+#define SDIO_GPD_RX_BD_SET_EOL(BD) (BD->DW0.EOL=1)
+#define SDIO_GPD_RX_BD_CLR_EOL(BD) (BD->DW0.EOL=0)
+#define SDIO_GPD_RX_BD_GET_CHECKSUM(BD) (BD->DW0.checksum)
+#define SDIO_GPD_RX_BD_SET_CHECKSUM(BD, CHECKSUM) (BD->DW0.checksum=checksum)
+#define SDIO_GPD_RX_BD_GET_NEXT(BD) (BD->next_bd_address)
+#define SDIO_GPD_RX_BD_SET_NEXT(BD, NEXT) (BD->next_bd_address=NEXT)
+#define SDIO_GPD_RX_BD_GET_BUF_ADDR(BD) (BD->data_address)
+#define SDIO_GPD_RX_BD_SET_BUF_ADDR(BD, ADDR) (BD->data_address=ADDR)
+#define SDIO_GPD_RX_BD_GET_RX_BUF_LEN(BD) (BD->DW3.rx_buffer_length)
+#define SDIO_GPD_RX_BD_SET_RX_BUF_LEN(BD, LEN) (BD->DW0.rx_buffer_length=LEN)
+#define SDIO_GPD_RX_BD_GET_RX_BD_EXT_LEN(BD) (BD->DW3.bd_ext_length)
+#define SDIO_GPD_RX_BD_SET_RX_BD_EXT_LEN(BD, LEN) (BD->DW0.bd_ext_length=LEN)
+
+#endif
diff --git a/mcu/driver/connectivity/usb_class/include/icusb_debug_tool.h b/mcu/driver/connectivity/usb_class/include/icusb_debug_tool.h
new file mode 100644
index 0000000..defb0af
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/icusb_debug_tool.h
@@ -0,0 +1,225 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+* A. Patent Notice:
+* The software delivered hereunder, including any and all updates and upgrades,
+* might be subject to patent rights of standard-setting organizations, patent pools
+* or their respective patent owners, that will be necessarily infringed by the use
+* and distribution of the products incorporating all or part of this software.
+* According to the licensing terms of these patent holders, it is your sole
+* obligation to obtain the necessary patent licenses from these patent holders
+* before you can use or distribute the products incorporating all or part of this
+* software. MediaTek shall not be liable for your failure to obtain or maintain such
+* licenses.
+*
+* As a courtesy to our customers, the following are some of the software that might
+* contain such patent licenses, but MediaTek does not warrant the accuracy or
+* completeness of the information below.
+* (1) MPEG4/AAC/AACPLUS/AACVPLUSV2: essential patents license must be obtained
+* from Via Licensing: <www.vialicensing.com>
+* (2) WAP/MMS security RC5 algorithm belongs to RSA Data Security:
+* <www.rsasecurity.com>
+* Notice: Please contact RSA to get this license before shipping the products to
+* USA which include RC5 security algorithm.
+*
+* B. In addition, customers must contact the respective licensors to obtain
+* necessary software licenses before it can use or distribute the licensed
+* products.
+*
+* As a courtesy to our customers, the following are some of the software licensers
+* and the notice or disclaimer required by their licenses, but MediaTek does not
+* warrant the accuracy or completeness of the information below.
+* (1) Microsoft Windows Media (WMA software):
+* Microsoft: <www.microsoft.com>
+* Approved OEM Manufacturers: <wmlicense.smdisp.net/oem_approved/>
+* Sample Windows Media Licensing Agreements:
+* <www.microsoft.com/windows/windowsmedia/licensing/agreements.aspx>
+* Notice in header or documentation: "This product is protected by certain
+* intellectual property rights of Microsoft and cannot be used or further
+* distributed without a license from Microsoft."
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usb_debug_tool.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb common driver debug buffer definitions
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifdef __IC_USB_ENABLE__
+
+#ifndef USB_DEBUG_TOOL_H
+#define USB_DEBUG_TOOL_H
+
+/***********************************************
+ implement definition
+************************************************/
+
+#define ICUSB_DBG_DATA_SIZE 512
+
+typedef enum
+{
+ IC_USB_DBG_SET_TXPKTREADY,
+ IC_USB_SET_EVENT,
+ IC_USB_RETRIEVE_EVENT,
+ IC_USB_SUSSPEND_DEVICE,
+ IC_USB_REMOTE_WAKEUP,
+ IC_USB_REMOTE_WAKEUP_DONE,
+ IC_USB_RESET,
+ IC_USB_CONN,
+ IC_USB_DISCONN,
+ IC_USB_BABBLE,
+ IC_USB_SESSREQ,
+ IC_USB_MASK_HISR,
+ IC_USB_DBG_HISR,
+ IC_USB_DMA_CALLBACK,
+ IC_USB_CONN_AND_DISCONN,
+ IC_USB_UNEXPECTED_EP0_INTR,
+ IC_USB_UNEXPECTED_TX_INTR,
+ IC_USB_EPN_RX_INTR,
+ IC_USB_UNEXPECTED_RX_INTR,
+ IC_USB_UNMASK_HISR,
+ IC_USB_DMA_TIMEOUT_ERROR,
+ IC_USB_EP0_INTR,
+ IC_USB_EPN_TX_INTR,
+ IC_USB_PN_RX_INTR,
+ IC_USB_SEND_DATA_DONE,
+ IC_USB_EP0_Setup,
+ IC_USB_EP0_Data,
+ IC_USB_DMA_LISR,
+
+#ifdef __IC_USB_EEM_SUPPORT__
+ IC_USB_EEM_START,
+ IC_USB_EEM_END,
+ IC_USB_EEM_RECEIVE,
+ IC_USB_EEM_SEND,
+ IC_USB_EEM_ClearRX,
+ IC_USB_EEM_ClearTX,
+ IC_USB_EEM_Resume,
+ IC_USB_EEM_Suspend,
+#endif
+
+#ifdef __IC_USB_ICCD_SUPPORT__
+ IC_USB_ICCD_CTRL_EP_HDLR,
+ IC_USB_ICCD_HDLR,
+ IC_USB_ICCD_START,
+ IC_USB_ICCD_END,
+ IC_USB_ICCD_POWER_ON,
+ IC_USB_ICCD_POWER_OFF,
+ IC_USB_ICCD_DATA_TRANSFER,
+ IC_USB_ICCD_Already_POWER_ON,
+ IC_USB_ICCD_ERROR,
+ IC_USB_ICCD_BUSY_WAIT,
+ IC_USB_ICC_DATA_CMD,
+ IC_USB_ICC_XFR_CMD,
+ IC_USB_ICC_Power_ON_CMD,
+ IC_USB_ICC_Power_OFF_CMD,
+ IC_USB_ICC_SLOT_CMD,
+ IC_USB_ICC_ENUMERATION_FAIL,
+ IC_USB_ICC_RESET_DEVICE,
+ IC_USB_ICC_SUSPEND,
+ IC_USB_ICC_RESUME,
+ IC_USB_ICC_STALL,
+#endif
+ USB_DBG_MAX
+}ICUSB_DBG_INFO;
+
+
+/***********************************************
+ Implement enum and structure
+************************************************/
+
+typedef struct
+{
+ ICUSB_DBG_INFO tag;
+ kal_uint32 time;
+ kal_uint32 data1;
+ kal_uint32 data2;
+}ICUsb_Dbg_Data;
+
+
+typedef struct
+{
+ ICUsb_Dbg_Data dbg_data[ICUSB_DBG_DATA_SIZE];
+ kal_uint16 dbg_data_idx;
+}ICUsb_Dbg_Struct;
+
+
+/***********************************************
+ function and global variable
+************************************************/
+extern void ICUSB_Dbg_Trace(ICUSB_DBG_INFO tag, kal_uint32 time, kal_uint32 data1, kal_uint32 data2);
+
+
+#endif
+/* USB_DEBUG_TOOL_H */
+
+#endif
+
diff --git a/mcu/driver/connectivity/usb_class/include/icusb_eem_adap.h b/mcu/driver/connectivity/usb_class/include/icusb_eem_adap.h
new file mode 100644
index 0000000..d529a26
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/icusb_eem_adap.h
@@ -0,0 +1,157 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+* A. Patent Notice:
+* The software delivered hereunder, including any and all updates and upgrades,
+* might be subject to patent rights of standard-setting organizations, patent pools
+* or their respective patent owners, that will be necessarily infringed by the use
+* and distribution of the products incorporating all or part of this software.
+* According to the licensing terms of these patent holders, it is your sole
+* obligation to obtain the necessary patent licenses from these patent holders
+* before you can use or distribute the products incorporating all or part of this
+* software. MediaTek shall not be liable for your failure to obtain or maintain such
+* licenses.
+*
+* As a courtesy to our customers, the following are some of the software that might
+* contain such patent licenses, but MediaTek does not warrant the accuracy or
+* completeness of the information below.
+* (1) MPEG4/AAC/AACPLUS/AACVPLUSV2: essential patents license must be obtained
+* from Via Licensing: <www.vialicensing.com>
+* (2) WAP/MMS security RC5 algorithm belongs to RSA Data Security:
+* <www.rsasecurity.com>
+* Notice: Please contact RSA to get this license before shipping the products to
+* USA which include RC5 security algorithm.
+*
+* B. In addition, customers must contact the respective licensors to obtain
+* necessary software licenses before it can use or distribute the licensed
+* products.
+*
+* As a courtesy to our customers, the following are some of the software licensers
+* and the notice or disclaimer required by their licenses, but MediaTek does not
+* warrant the accuracy or completeness of the information below.
+* (1) Microsoft Windows Media (WMA software):
+* Microsoft: <www.microsoft.com>
+* Approved OEM Manufacturers: <wmlicense.smdisp.net/oem_approved/>
+* Sample Windows Media Licensing Agreements:
+* <www.microsoft.com/windows/windowsmedia/licensing/agreements.aspx>
+* Notice in header or documentation: "This product is protected by certain
+* intellectual property rights of Microsoft and cannot be used or further
+* distributed without a license from Microsoft."
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * Icusb_eem_drv.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for host EEM class adaptaion layer definitaions
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USB_HOST_EEM_DRV_H
+#define USB_HOST_EEM_DRV_H
+
+typedef enum
+{
+ USB_EEM_DONE, //Setup DMA
+ USB_EEM_TRANSFER, // DMA Still Running --> last data hasn't send out
+ USB_EEM_NEXT_TRANSFER,
+ USB_EEM_NOT_READY, // USB config = F , Enumeraion not finish or device removed
+ USB_EEM_CRC_ERROR, // CRC_check_flag = T
+ USB_EEM_LENGTH_ERROR, // Data length doesn't match
+ USB_EEM_HEADER_TYPE_ERROR, // data or command packet define
+ USB_EEM_HEADER_PARAM_ERROR //command parameter type
+}USB_EEM_RESPONSE;
+
+
+extern kal_bool USB_EEM_START(kal_uint8 eem_index, module_type ownerid);
+
+extern kal_bool USB_EEM_END(kal_uint8 eem_index, module_type ownerid);
+
+//extern kal_bool USB_EEM_CRC_Check_Set(kal_uint8 eem_index, module_type ownerid,kal_bool CRC_check);
+
+//extern kal_bool USB_EEM_Set_Owner(kal_uint8 eem_index, module_type ownerid);
+
+extern void USB_EEM_Clear_TX_Buffer(kal_uint8 eem_index, module_type ownerid);
+
+extern void USB_EEM_Clear_RX_Buffer(kal_uint8 eem_index, module_type ownerid); //doesn't support
+
+extern USB_EEM_RESPONSE USB_EEM_Send_Frame(kal_uint8 eem_index,peer_buff_struct *peer_buff_ptr, flc2_pool_id_enum pool_id);
+
+//extern USB_EEM_RESPONSE USB_EEM_Send_Frame(kal_uint8 eem_index, module_type ownerid,kal_uint8 *Buffaddr, kal_uint16 Length,kal_bool CRC_Check,kal_uint16 CRC_Value);
+
+extern USB_EEM_RESPONSE USB_EEM_Receive_Frame(kal_uint8 eem_index, module_type ownerid,kal_uint8 *Buffaddr, kal_uint16 Length);
+
+extern void USB_EEM_rx_buff_reserve(kal_uint8 eem_index,void* buff_ptr[], kal_uint32 num);
+
+extern void USB_EEM_rx_buff_release(kal_uint8 eem_index,void* buff_ptr[], kal_uint32 *num);
+
+
+// Error message
+
+
+#endif /* USB_HOST_ACM_DRV_H */
+
+
diff --git a/mcu/driver/connectivity/usb_class/include/icusb_eem_drv.h b/mcu/driver/connectivity/usb_class/include/icusb_eem_drv.h
new file mode 100644
index 0000000..71760be
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/icusb_eem_drv.h
@@ -0,0 +1,297 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+* A. Patent Notice:
+* The software delivered hereunder, including any and all updates and upgrades,
+* might be subject to patent rights of standard-setting organizations, patent pools
+* or their respective patent owners, that will be necessarily infringed by the use
+* and distribution of the products incorporating all or part of this software.
+* According to the licensing terms of these patent holders, it is your sole
+* obligation to obtain the necessary patent licenses from these patent holders
+* before you can use or distribute the products incorporating all or part of this
+* software. MediaTek shall not be liable for your failure to obtain or maintain such
+* licenses.
+*
+* As a courtesy to our customers, the following are some of the software that might
+* contain such patent licenses, but MediaTek does not warrant the accuracy or
+* completeness of the information below.
+* (1) MPEG4/AAC/AACPLUS/AACVPLUSV2: essential patents license must be obtained
+* from Via Licensing: <www.vialicensing.com>
+* (2) WAP/MMS security RC5 algorithm belongs to RSA Data Security:
+* <www.rsasecurity.com>
+* Notice: Please contact RSA to get this license before shipping the products to
+* USA which include RC5 security algorithm.
+*
+* B. In addition, customers must contact the respective licensors to obtain
+* necessary software licenses before it can use or distribute the licensed
+* products.
+*
+* As a courtesy to our customers, the following are some of the software licensers
+* and the notice or disclaimer required by their licenses, but MediaTek does not
+* warrant the accuracy or completeness of the information below.
+* (1) Microsoft Windows Media (WMA software):
+* Microsoft: <www.microsoft.com>
+* Approved OEM Manufacturers: <wmlicense.smdisp.net/oem_approved/>
+* Sample Windows Media Licensing Agreements:
+* <www.microsoft.com/windows/windowsmedia/licensing/agreements.aspx>
+* Notice in header or documentation: "This product is protected by certain
+* intellectual property rights of Microsoft and cannot be used or further
+* distributed without a license from Microsoft."
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usb_host_eem_drv.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for host EEM class driver definitions
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USB_HOST_EEM_DRV_H
+#define USB_HOST_EEM_DRV_H
+
+ //#include "icusb_drv.h"
+ #include "drv_comm.h"
+ #include "usb_host_default_drv.h"
+/***********************************************
+ eem class descriptor definition
+************************************************/
+#define USB_EEM_DEVICE_CODE 0x00
+#define USB_EEM_SUBCLASS_CODE 0x00
+#define USB_EEM_PROTOCOL_CODE 0x00
+
+#define USB_EEM_DATA_INTERFACE_CLASS_CODE 0x02
+#define USB_EEM_DATA_INTERFACE_SUBCLASS_CODE 0x0C
+#define USB_EEM_DATA_INTERFACE_PROTOCOL_CODE 0x07
+
+/***********************************************
+ eem class specific command definition
+************************************************/
+#define USB_EEM_Packet_Type_Mask 0x8000
+#define USB_EEM_Command 0x3800
+#define USB_EEM_Command_Param 0x07FF
+
+#define USB_EEM_DATA_CRC 0x4000
+#define USB_EEM_DATA_Length 0x3FFF
+
+#define USB_EEM_Header_Length 2
+
+
+#define USB_EEM_Command_TYPE 0x1000
+#define USB_EEM_Data_TYPE 0x0000
+
+#define USB_EEM_Data_CRC_SET 0x0000
+
+
+/***********************************************
+ eem class Buffer & Data Length
+************************************************/
+
+#define USB_EEM_MAX_FRAME_SIZE 1518 // TCPIP protocol
+#define USB_EEM_MIN_FRAME_SIZE 46 // TCPIP protocol
+
+#define EEM_TX_BUFFER_NUM 10 // EEM task allocate buffer
+#define EEM_RX_BUFFER_NUM 10 // EEM task allocate buffer
+
+#define USB_MAX_EEM_NUM 1
+
+
+typedef enum
+{
+ USB_EEM_DONE = 0, //Setup DMA
+ USB_EEM_TRANSFER, // DMA Still Running --> last data hasn't send out
+ USB_EEM_NEXT_TRANSFER,
+
+ USB_EEM_NOT_READY, // USB config = F , Enumeraion not finish or device removed
+
+ USB_EEM_CRC_ERROR, // CRC_check_flag = T
+ USB_EEM_LENGTH_ERROR, // Data length doesn't match
+
+ USB_EEM_HEADER_TYPE_ERROR, // data or command packet define
+ USB_EEM_HEADER_PARAM_ERROR //command parameter type
+
+} USB_EEM_RESPONSE;
+
+
+typedef enum
+{
+ IC_USB_SIM1 = 0,
+ IC_USB_SIM2
+} IC_USB_NUM;
+
+typedef enum
+{
+ USB_HOST_EEM_DATA_PAYLOAD = 0,
+ USB_HOST_EEM_COMMAND
+}USB_EEM_HEADER_TYPE;
+
+
+typedef enum
+{
+ USB_HOST_EEM_CMD_ECHO = 0,
+ USB_HOST_EEM_CMD_ECHO_RESPONSE,
+ USB_HOST_EEM_CMD_SUSPEND_HINT,
+ USB_HOST_EEM_CMD_RESPONSE_HINT,
+ USB_HOST_EEM_CMD_RESPONSE_COMPLETE_HINT,
+ USB_HOST_EEM_CMD_TICKLE
+}USB_HOST_EEM_CMD;
+
+typedef enum
+{
+ EEM_RX_FIRST_PACKET =0,
+ EEM_RX_MIDDLE_PACKET,
+ EEM_RX_LAST_PACKET
+}USBH_EEM_RX_STATE;
+
+/* EEM Data header*/
+typedef struct
+{
+ kal_bool bmType;
+ kal_bool bmCRC;
+ kal_uint16 eem_frame_length;
+}USBH_EEM_Data_Header;
+
+
+/* EEM Command Header */
+typedef struct
+{
+ kal_bool bmType;
+ USB_HOST_EEM_CMD bmEEMCmd;
+ kal_uint16 eem_Cmd_Param;
+}USBH_EEM_Command_Header;
+
+
+typedef struct
+{
+ peer_buff_struct *buffer_ptr;
+ kal_uint8 *data_ptr;
+ kal_uint16 data_length;
+ kal_uint8 pool_id;
+}EEM_Buffer_CONTROL;
+
+
+typedef struct
+{
+ USBH_EP_Struct ep_tx_info;
+ USBH_EP_Struct ep_rx_info;
+ USBH_Common_Struct common_info;
+
+ kal_uint8 dev_error_count;
+ kal_bool config; //Descriptor match
+ kal_bool dev_attatch; //Vbus3.3 provide & Device class match
+ kal_bool usb_command;
+ kal_bool reponse_hint;
+ kal_bool reponse_complete_hint;
+ kal_uint16 response_time;
+ kal_uint16 response_complete_time;
+
+ kal_bool dma_rx_running;
+ kal_bool dma_tx_running;
+
+ kal_uint8 tx_sent_buff_index; //data is sending out
+ kal_uint8 tx_wait_buff_index; // wait for next transfer
+ EEM_Buffer_CONTROL tx_buffer[EEM_TX_BUFFER_NUM];
+
+ kal_uint8 rx_full_buff_index; // receive Data
+ kal_uint8 rx_empty_buff_index; // empty buffer get from EEM Tsk
+ EEM_Buffer_CONTROL rx_buffer[EEM_RX_BUFFER_NUM];
+
+ kal_uint16 rx_last_data_length; //FIFO + DMA + FIFO
+ kal_uint16 rx_dma_length; //DMA transfer length
+ USBH_EEM_RX_STATE ep_rx_status;
+
+ USB_EP_DIRECTION stall_ep_dir;
+ kal_uint32 sleep_timer_handle; /* use timer to check whether App need to use Device or not */
+
+}USB_Host_EEM_Struct;
+
+/************************************************************
+
+ extern variables and functions
+
+*************************************************************/
+extern USBD_ClassDriver_Struct USB_Host_Eem_Drv;
+extern USB_Host_EEM_Struct g_UsbHostEem[USB_MAX_EEM_NUM];
+
+//extern kal_uint8 USB_EEM_Check_index(kal_uint8 usb_ip_port);
+extern void USB_Host_EEM_State_Start(void);
+extern void USB_Host_EEM_State_End(void);
+extern void USB_Host_Eem_DMA_TX_Hdlr(void);
+extern void USB_Host_Eem_DMA_RX_Hdlr(void);
+extern void USB_Host_Eem_Data_Transfer(USB_EP_DIRECTION direction);
+extern void USB_Host_Eem_ECHO_Command(USBH_Common_Struct common_str,USBH_EP_Struct usb_ep_str, kal_uint16 nBytes, void *pDst);
+
+#endif /* USB_HOST_ACM_DRV_H */
+
+
diff --git a/mcu/driver/connectivity/usb_class/include/icusb_iccd_adap.h b/mcu/driver/connectivity/usb_class/include/icusb_iccd_adap.h
new file mode 100644
index 0000000..2c4dc42
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/icusb_iccd_adap.h
@@ -0,0 +1,122 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * icusb_iccd_adap.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for host mass storage adaptaion layer definitaions (file system API)
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USB_HOST_ICCD_ADAP_H
+#define USB_HOST_ICCD_ADAP_H
+
+typedef enum
+{
+ ICUSB_ICCD_P_ATR,
+ ICUSB_ICCD_P_ATR_LENGTH,
+ ICUSB_ICCD_P_DESCRIPTOR,
+ ICUSB_ICCD_P_DELAY
+}USB_HOST_ICCD_PARAMETER;
+
+typedef struct{
+ kal_uint8 *pATR;
+ kal_uint32 atrLen;
+}ICUSB_ICCD_INFO;
+
+
+//SIM Drive : return Status
+typedef enum
+{
+ DEVICE_Is_Always_Busy,
+ DEVICE_Is_Ready,
+ DEVICE_HW_FAIL,
+ ATR_RESPONSE_FAIL,
+ APDU_FAIL,
+ APDU_SUCCESS
+}USB_ICCD_STATE;
+
+
+// SIM Drive => iccd_index is mapping to ICUSB HW
+// only SIM Driver will user use these API
+
+extern USB_ICCD_STATE ICUSB_ICCD_POWER_ON(kal_uint8 iccd_index);
+extern USB_ICCD_STATE ICUSB_ICCD_POWER_RESET(kal_uint8 iccd_index);
+extern USB_ICCD_STATE ICUSB_ICCD_DATA_Transfer(kal_uint8 iccd_index,kal_uint16 tx_length,kal_uint8 *tx_buffer, kal_uint8 *rx_buffer, kal_uint16 *rx_size);
+
+extern void ICUSB_ICCD_Parameter_Setting(kal_uint8 iccd_index,USB_HOST_ICCD_PARAMETER parameter, kal_uint16 data);
+extern void ICUSB_ICCD_Parameter_Querry(kal_uint8 iccd_index, ICUSB_ICCD_INFO *pInfo);
+
+extern void ICUSB_ICCD_Init(kal_uint8 iccd_index);
+extern kal_bool IC_USB_POWER_ON(kal_uint8 iccd_index,kal_bool blocking);
+extern kal_bool IC_USB_Reset_Card(kal_uint8 iccd_index);
+
+
+#endif /* USB_HOST_ICCD_ADAP_H */
+
diff --git a/mcu/driver/connectivity/usb_class/include/icusb_iccd_drv.h b/mcu/driver/connectivity/usb_class/include/icusb_iccd_drv.h
new file mode 100644
index 0000000..0fce166
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/icusb_iccd_drv.h
@@ -0,0 +1,260 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * icusb_iccd_drv.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for host mass storage class driver definitions
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USB_HOST_ICCD_DRV_H
+#define USB_HOST_ICCD_DRV_H
+
+#include "usb_host_default_drv.h"
+
+/***********************************************
+ iccd class descriptor definition
+************************************************/
+#define USB_ICCD_DEVICE_CODE 0x00
+#define USB_ICCD_SUBCLASS_CODE 0x00
+#define USB_ICCD_PROTOCOL_CODE 0x00
+#define USB_ICCD_INTERFACE_CLASS_CODE 0x0B
+#define USB_ICCD_INTERFACE_SUBCLASS_CODE 0x00
+#define USB_ICCD_INTERFACE_PROTOCOL_CODE 0x02
+
+
+/************************************************************
+ ICCD class parameter definition
+*************************************************************/
+#define USB_ICCD_POWER_ON 0x62
+#define USB_ICCD_POWER_OFF 0x63
+#define USB_ICCD_XFR_BLOCK 0x65
+#define USB_ICCD_DATA_BLOCK 0x6F
+#define USB_ICCD_SLOT_STATUS 0x81
+
+
+//Data Block Parameter
+#define USB_DATA_bResponse_APDU_DONE 0x00
+#define USB_DATA_bResponse_APDU_START_PACKET 0x01
+#define USB_DATA_bResponse_APDU_MIDDLE_PACKET 0x02
+#define USB_DATA_bResponse_APDU_LAST_PACKET 0x03
+#define USB_DATA_bResponse_NEXT_XFR 0x10
+#define USB_DATA_bResponse_Status_Info 0x40
+#define USB_DATA_bResponse_Polling 0x80
+
+//Status parameter
+#define USB_bmIccStatus 0x03
+#define USB_bmIccStatus_Active 0
+#define USB_bmIccStatus_Not_Active 1
+#define USB_bmIccStatus_Not_Present 2
+
+#define USB_bmCommandStatus 0xC0
+#define USB_bmCommandStatus_Ready 0x00
+#define USB_bmCommandStatus_Error 0x40
+
+//Error Code
+#define USB_ICC_MUTE 0xFE
+#define USB_XFR_OVERRUN 0xFC
+#define USB_HW_ERROR 0xFB
+
+
+// Event flag. mith be handled in HISR level. This event is used when state complete to retrive waiting task
+#define EVENT_USB_ICCD_DONE ((kal_uint32)0x00000001)
+#define EVENT_USB_ICCD_DETATCH ((kal_uint32)0x00000002)
+#define EVENT_ICUSB_ENUMERATION_DONE ((kal_uint32)0x00000004) //notice SIM Drive
+#define EVENT_ICUSB_ENUMERATION_FAIL ((kal_uint32)0x00000008) //notice SIM Drive
+
+#define ICCD_ATR_REQ_LENGTH 50
+
+// USB Host ICCD Support Number = ICUSB number
+#define USB_MAX_ICCD_NUM 1
+
+
+
+// ICCD state
+typedef enum
+{
+ USB_HOST_ICCD_IDLE,
+ USB_HOST_ICCD_SEND_COMMAND,
+ USB_HOST_ICCD_REQUEST_COMMAND,
+ USB_HOST_ICCD_SEND_CLEAR_STALL,
+ USB_HOST_ICCD_REQUEST_CLEAR_STALL
+}USB_HOST_ICCD_STATE;
+
+
+
+// Result of the RESPONSE,REQUEST state (EP0 Setup, Data, Status stage complete)
+typedef enum
+{
+ USB_HOST_ICCD_RESULT_OK,
+ USB_HOST_ICCD_RESULT_TIMEOUT,
+ USB_HOST_ICCD_RESULT_NO_RESPONSE,
+ USB_HOST_ICCD_RESULT_NOT_CONFIG,
+ USB_HOST_ICCD_RESULT_STALL
+}USB_HOST_ICCD_RESULT;
+
+// USB-ICC Status (use Data Command / Slot_Status command)
+typedef enum
+{
+ USB_ICCD_DEVICE_Active,
+ USB_ICCD_DEVICE_Cannot_Response,
+ USB_ICCD_DEVICE_HW_ERROR,
+ USB_ICCD_DEVICE_Not_Active,
+ USB_ICCD_DEVICE_NOT_CONFIG,
+ USB_ICCD_DEVICE_Fail //Ep0 contorl pipe transfer fail
+}USB_HOST_ICCD_DEV_STATE;
+
+
+/* The ICCD APDU Response type*/
+typedef enum
+{
+ USB_HOST_ICCD_APDU_RESPONSE,
+ USB_HOST_ICCD_APDU_DONE,
+ USB_HOST_ICCD_APDU_POLLING,
+ USB_HOST_ICCD_CMD_FAIL, // need to get Smart SIM Status
+ USB_HOST_ICCD_NOT_CONFIG,
+ USB_HOST_ICCD_ERROR //Ep0 contorl pipe transfer fail
+}USB_HOST_ICCD_CMD_STATE;
+
+/* Ctrl EP commands that may used after ICCD class driver is started
+ Note that it contains both standard and class specific request */
+typedef enum
+{
+ USB_HOST_ICCD_EP0_CMD_NONE,
+ USB_HOST_ICCD_EP0_CMD_POWER_ON,
+ USB_HOST_ICCD_EP0_CMD_POWER_OFF,
+ USB_HOST_ICCD_EP0_CMD_XFR_BLOCK,
+ USB_HOST_ICCD_EP0_CMD_DATA_BLOCK,
+ USB_HOST_ICCD_EP0_CMD_SLOT_STATUS,
+ USB_HOST_ICCD_EP0_CMD_CLEAR_STALL
+}USB_HOST_ICCD_EP0_CMD;
+
+/************************************************************
+ Implementation structures
+*************************************************************/
+typedef struct
+{
+ kal_uint8 bStatus;
+ kal_uint8 bError;
+ kal_uint8 bReserved;
+}USB_Host_ICCD_Status_Struct;
+
+typedef struct
+{
+ /* device level resource */
+ USBH_Common_Struct common_info;
+
+ kal_eventgrpid event_id; /* event used for (CBW, DATA, CSW) state machine to retrive waiting task */
+ kal_eventgrpid start_event_id;
+ kal_mutexid mutex_id; /* mutex used to protect ms command. When USB task is polling state machine, read/write action from application task should be protected */
+
+ kal_uint32 sleep_timer_handle; /* use timer to check whether App need to use Device or not */
+
+ kal_uint8 dev_error_count;
+ kal_bool config; //Descriptor match
+ kal_bool dev_attatch; //Vbus3.3 provide & Device class match
+
+ USB_HOST_ICCD_DEV_STATE dev_state; //USB-ICC state: ready,active,error
+ USB_HOST_ICCD_RESULT ep0_result; //Setup + Data + Stage Complete
+ USB_HOST_ICCD_CMD_STATE apdu_response; //using DATA_BLOCK query
+ USB_HOST_ICCD_EP0_CMD ep0_cmd; // ICCD Class specific Command
+
+ kal_uint8 atr_data[ICCD_ATR_REQ_LENGTH]; /* ATR Response*/
+ kal_uint16 atr_length;
+ kal_uint16 sleep_time;
+ kal_uint16 rx_real_length;
+ kal_uint16* rx_buffer;
+
+}USB_Host_ICCD_Struct;
+
+
+/************************************************************
+ extern variables and functions
+*************************************************************/
+
+extern USBD_ClassDriver_Struct USB_Host_Iccd_Drv;
+extern USB_Host_ICCD_Struct g_UsbHostIccd[USB_MAX_ICCD_NUM];
+
+extern void USB_Host_ICCD_Reset_Card(kal_uint8 iccd_index);
+extern void USB_Host_ICCD_Enumeration_Fail(kal_uint8 usb_ip_port);
+
+extern USB_HOST_ICCD_RESULT USB_Host_ICCD_POWER_ON(kal_uint8 iccd_index);
+extern USB_HOST_ICCD_RESULT USB_Host_ICCD_POWER_OFF(kal_uint8 iccd_index);
+extern USB_HOST_ICCD_RESULT USB_Host_ICCD_XFR_BLOCK(kal_uint8 iccd_index,kal_uint16 buflen, kal_uint8 *buffer);
+extern USB_HOST_ICCD_CMD_STATE USB_Host_ICCD_DATA_BLOCK(kal_uint8 iccd_index,kal_uint16 *rx_size, kal_uint8 *buffer);
+extern USB_HOST_ICCD_DEV_STATE USB_Host_ICCD_SLOT_STATUS(kal_uint8 iccd_index);
+
+extern void USB_Host_ICCD_Sleep_Timeout(void *parameter);
+
+
+
+#endif /* USB_HOST_MS_DRV_H */
+
diff --git a/mcu/driver/connectivity/usb_class/include/otg.h b/mcu/driver/connectivity/usb_class/include/otg.h
new file mode 100644
index 0000000..7f244a9
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/otg.h
@@ -0,0 +1,199 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * otg_drv_pri.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+* This file intends for otg definitions.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef OTG_H
+#define OTG_H
+
+#include "otg_if.h"
+//#include "kal_non_specific_general_types.h"
+#include "usb_comm.h"
+#include "kal_public_api.h" //#include "stack_ltlcom.h" //MSBB change #include "app_ltlcom.h"
+#include "dcl.h"
+
+
+typedef struct
+{
+ kal_uint32 *hnp_srp_parameter;
+ USB_DEVICE_TYPE hnp_srp_type; /* This is mainly used for SRP, HNP */
+ kal_bool b_check_srp; /* If SRP is in progress */
+}OTG_Struct;
+
+
+typedef enum
+{
+ OTG_HDLR_TASK_INIT_MS,
+ OTG_HDLR_TASK_END_MS,
+ OTG_HDLR_TASK_INIT_NOMAL_MS,
+ OTG_HDLR_TASK_END_NORMAL_MS,
+ OTG_HDLR_TASK_ONLY_END_NORMAL_MS,
+ OTG_HDLR_TASK_MAX
+}OTG_HDLR_TASK_TYPE;
+
+
+typedef struct
+{
+ LOCAL_PARA_HDR
+ kal_uint32 *parameter;
+ OTG_HDLR_TASK_TYPE type;
+}otg_hdlr_ind_struct;
+
+
+extern OTG_Struct gUsbOtg;
+
+extern DCL_HANDLE g_OTG_Dcl_Handle;
+
+extern void OTG_Init_Phase1(void);
+extern void OTG_Init_Phase2(void);
+extern void OTG_Release(void);
+extern void OTG_Start_SRP(void);
+extern void OTG_Config_SRP(USB_DEVICE_TYPE type, kal_uint32 *parameter);
+extern void OTG_Config_HNP(USB_DEVICE_TYPE type, kal_uint32 *parameter);
+extern void OTG_Display_Message(OTG_DISPLAY_MSG_TYPE otg_msg_type);
+extern void OTG_Hdlr_Send_Msg(OTG_HDLR_TASK_TYPE type, kal_uint32* parameter);
+
+
+extern void OTG_B_EnDis_HNP(kal_bool set);
+extern void OTG_B_Set_Session_Valid(kal_bool set);
+
+
+#endif
+
+
diff --git a/mcu/driver/connectivity/usb_class/include/ptp_state.h b/mcu/driver/connectivity/usb_class/include/ptp_state.h
new file mode 100644
index 0000000..827a86d
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/ptp_state.h
@@ -0,0 +1,409 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+* A. Patent Notice:
+* The software delivered hereunder, including any and all updates and upgrades,
+* might be subject to patent rights of standard-setting organizations, patent pools
+* or their respective patent owners, that will be necessarily infringed by the use
+* and distribution of the products incorporating all or part of this software.
+* According to the licensing terms of these patent holders, it is your sole
+* obligation to obtain the necessary patent licenses from these patent holders
+* before you can use or distribute the products incorporating all or part of this
+* software. MediaTek shall not be liable for your failure to obtain or maintain such
+* licenses.
+*
+* As a courtesy to our customers, the following are some of the software that might
+* contain such patent licenses, but MediaTek does not warrant the accuracy or
+* completeness of the information below.
+* (1) MPEG4/AAC/AACPLUS/AACVPLUSV2: essential patents license must be obtained
+* from Via Licensing: <www.vialicensing.com>
+* (2) WAP/MMS security RC5 algorithm belongs to RSA Data Security:
+* <www.rsasecurity.com>
+* Notice: Please contact RSA to get this license before shipping the products to
+* USA which include RC5 security algorithm.
+*
+* B. In addition, customers must contact the respective licensors to obtain
+* necessary software licenses before it can use or distribute the licensed
+* products.
+*
+* As a courtesy to our customers, the following are some of the software licensers
+* and the notice or disclaimer required by their licenses, but MediaTek does not
+* warrant the accuracy or completeness of the information below.
+* (1) Microsoft Windows Media (WMA software):
+* Microsoft: <www.microsoft.com>
+* Approved OEM Manufacturers: <wmlicense.smdisp.net/oem_approved/>
+* Sample Windows Media Licensing Agreements:
+* <www.microsoft.com/windows/windowsmedia/licensing/agreements.aspx>
+* Notice in header or documentation: "This product is protected by certain
+* intellectual property rights of Microsoft and cannot be used or further
+* distributed without a license from Microsoft."
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * ptp_state.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file implements the PICTURE TRANSFER PROTOCOL definitions
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef PTP_STATE_H
+#define PTP_STATE_H
+
+//#include "usb_custom.h"
+//#include "fat_fs.h"
+
+
+#include "fs_type.h"
+#include "kal_public_api.h" //#include "stack_ltlcom.h" //MSBB change #include "app_ltlcom.h"
+#include "kal_general_types.h"
+
+
+
+/***********************************************
+ PTP specific command definitions
+************************************************/
+/* Operation Codes */
+#define PTP_GET_DEVICE_INFO 0x1001
+#define PTP_OPEN_SESSION 0x1002
+#define PTP_CLOSE_SESSION 0x1003
+#define PTP_GET_STORAGE_IDS 0x1004
+#define PTP_GET_STORAGE_INFO 0x1005
+#define PTP_GET_NUM_OBJECTS 0x1006
+#define PTP_GET_OBJECT_HANDLES 0x1007
+#define PTP_GET_OBJECT_INFO 0x1008
+#define PTP_GET_OBJECT 0x1009
+#define PTP_GET_THUMB 0x100A
+#define PTP_SEND_OBJECT_INFO 0x100C
+#define PTP_SEND_OBJECT 0x100D
+#define PTP_GET_PARTIAL_OBJECT 0x101B
+
+/* Response Codes */
+#define PTP_OK 0x2001
+#define PTP_GENERAL_ERROR 0x2002
+#define PTP_SESSION_NOT_OPEN 0x2003
+#define PTP_OPERATION_NOT_SUPPORTED 0x2005
+#define PTP_PARAMETER_NOT_SUPPORTED 0x2006
+#define PTP_NO_THUMBNAIL_PRESENT 0x2010
+#define PTP_DEVICE_BUSY 0x2019
+#define PTP_TRANSACTION_CANCELLED 0x201F
+
+/* Event Codes */
+#define PTP_CANCEL_TRANSACTION 0x4001
+#define PTP_OBJECT_ADDED 0x4002
+#define PTP_OBJECT_REMOVED 0x4003
+#define PTP_STORE_ADDED 0x4004
+#define PTP_STORE_REMOVED 0x4005
+#define PTP_OBJECT_INFO_CHAGNED 0x4007
+#define PTP_REQUEST_OBJECT_TRANSFER 0x4009
+
+
+/* Object Format Codes*/
+#define PTP_ASSOCIATION 0x3001
+#define PTP_SCRIPT 0x3002
+#define PTP_DPOF 0x3006
+#define PTP_EXIF_JPEG 0x3801
+#define PTP_TIFF_EP 0x3802
+#define PTP_BMP 0x3804
+#define PTP_CIFF 0x3805
+#define PTP_GIF 0x3807
+#define PTP_JFIF 0x3808
+#define PTP_PNG 0x380B
+#define PTP_TIFF 0x380D
+#define PTP_TIFF_IT 0x380E
+
+/* Functional Mode Values*/
+#define PTP_STANDARD_MODE 0x0000
+#define PTP_SLEEP_STATE 0x0001
+
+/* ObjectInfo ProtectionStatus Values*/
+#define PTP_NO_PROTECTION 0x0000
+#define PTP_READ_ONLY 0x0001
+
+/* Storage Types */
+#define PTP_FIXED_ROM 0x0001
+#define PTP_REMOVABLE_ROM 0x0002
+#define PTP_FIXED_RAM 0x0003
+#define PTP_REMOVABLE_RAM 0x0004
+
+/* File System Type Values */
+#define PTP_GENERIC_FLAT 0x0001
+#define PTP_GENERIC_HIERARCHICAL 0x0002
+#define PTP_DCF 0x0003
+
+/* StorageInfo AccessCapability Values */
+#define PTP_READ_WRITE 0x0000
+#define PTP_READ_ONLY_WITHOUT_DELETION 0x0001
+#define PTP_READ_ONLY_WITH_DELETION 0x0002
+
+/* Association Types */
+#define PTP_GENERIC_FOLDER 0x0001
+#define PTP_ALBUM 0x0002
+#define PTP_TIME_SEQUENCE 0x0003
+#define PTP_HORIZONTAL_PANORAMIC 0x0004
+#define PTP_VERTICAL_PANORAMIC 0x0005
+#define PTP_2D_PANORAMIC 0x0006
+#define PTP_ANCILLARY 0x0007
+
+/***********************************************
+ Implement definition
+************************************************/
+#define PTP_MAX_OPERATION_CODE_SIZE 13
+#define PTP_MAX_EVENT_CODE_SIZE 7
+#define PTP_MAX_OBJECT_FORMAT_CODE_SIZE 2
+#define PTP_MAX_SCRIPT_OBJECT_HANDLES 6
+//#define PTP_OBJECT_INFO_SIZE 94
+
+#define PTP_SCRIPT_STORAGE_ID 0x00000000
+#define PTP_IMAGE_STORAGE_ID 0x00010001
+#define PTP_ALL_STORAGE_ID 0x0001FFFF
+
+/* Script object handle */
+#define DDISCVRY_DPS 0xC1000000
+#define HDISCVRY_DPS 0xC1000001
+#define DREQUEST_DPS 0xC1000002
+#define DRSPONSE_DPS 0xC1000003
+#define HREQUEST_DPS 0xC1000004
+#define HRSPONSE_DPS 0xC1000005
+
+/* Script object flag shift */
+#define DDISCVRY 0
+#define HDISCVRY 1
+#define DREQUEST 2
+#define DRSPONSE 3
+#define HREQUEST 4
+#define HRSPONSE 5
+
+/* Object handle value */
+#define PTP_NO_HANDLE -1
+
+/***********************************************
+ Implement enum and structure
+************************************************/
+typedef struct
+{
+ kal_uint16 StandardVersion;
+ kal_uint16 VenderExtensionID[2];
+ kal_uint16 VenderExtensionVersion;
+ kal_uint8 VendorExtensionDesc; /* empty string */
+ kal_uint8 FunctionalMode[2];
+ kal_uint8 OperationsSupportedSize[4];
+ kal_uint8 OperationsSupported[PTP_MAX_OPERATION_CODE_SIZE][2];
+ kal_uint8 EventsSupportedSize[4];
+ kal_uint8 EventsSupported[PTP_MAX_EVENT_CODE_SIZE][2];
+ kal_uint8 DevicePropertiesSupportedSize[4]; /* empty array*/
+ kal_uint8 CaptureFormatsSize[4]; /* empty array*/
+ kal_uint8 ImageFormatsSize[4];
+ kal_uint8 ImageFormats[PTP_MAX_OBJECT_FORMAT_CODE_SIZE][2];
+// kal_uint8 padding; /* sizeof(PTP_DeviceInfo_Struct) still count this byte */
+}PTP_DeviceInfo_Struct;
+
+
+typedef struct
+{
+ kal_uint16 StorageType;
+ kal_uint16 FilesystemType;
+ kal_uint16 AccessCapability;
+ kal_uint16 MaxCapacity[4];
+ kal_uint16 FreeSpaceInBytes[4];
+ kal_uint16 FreeSpaceInImages[2];
+}PTP_StorageInfo_Struct;
+
+
+typedef struct
+{
+ kal_uint32 StorageID;
+ kal_uint16 ObjectFormat;
+ kal_uint16 ProtectionStatus;
+ kal_uint32 ObjectCompressedSize;
+ kal_uint16 ThumbFormat;
+ kal_uint16 ThumbCompressedSize[2];
+ kal_uint16 ThumbPixWidth[2];
+ kal_uint16 ThumbPixHeight[2];
+ kal_uint16 ImagePixWidth[2];
+ kal_uint16 ImagePixHeight[2];
+ kal_uint16 ImageBitDepth[2];
+ kal_uint16 ParentObject[2];
+ kal_uint16 AssociationType;
+ kal_uint32 AssociationDesc;
+ kal_uint32 SequenceNumber;
+}PTP_ObjectInfo_Struct;
+
+
+typedef struct
+{
+ /* Pointer to buffer for XML packet transmission operation*/
+ kal_uint8 *dps_request_tx_data;
+ kal_uint8 *dps_response_tx_data;
+ kal_uint8 *dps_request_rx_data;
+ kal_uint8 *dps_response_rx_data;
+
+ /* PTP dataset structure */
+ PTP_DeviceInfo_Struct image_deviceinfo;
+ PTP_StorageInfo_Struct image_storageinfo;
+ PTP_ObjectInfo_Struct image_objectinfo;
+
+ kal_uint32 received_xml_size;
+ kal_uint32 send_dps_request_xml_size;
+ kal_uint32 send_dps_response_xml_size;
+ kal_uint32 current_opened_object_handle; /* current opened object handle */
+ FS_HANDLE current_file_handle; /* current file handle opened by USB */
+
+ kal_uint8 dps_rx_buffer_index; /* Rx XML buffer index, 1 : request xml, 0 : response xml */
+ kal_uint8 script_flag; /* XML script flag */
+ kal_bool get_data_error; /* a flag to check if there is any error happened when taregt send datat to host. In PTP, it means there is an error at the file system operation of image file */
+ kal_uint32 rw_bytes; /* R/W bytes for FS R/W*/
+ kal_bool dps_discovery;
+ kal_bool mmi_start_job; /* a flag to check if it is doing a job now*/
+ kal_bool next_xml_is_start_job;
+ kal_bool is_start_job_xml;
+ kal_bool is_wait_host_respone;
+} PTP_Struct;
+
+
+/***********************************************
+ function and global variable
+************************************************/
+extern PTP_Struct g_PTPImage;
+
+extern void PTP_Parse_MMI_Meg(ilm_struct *p_recv_ilm);
+extern void PTP_Parse_USB_Meg(ilm_struct *p_recv_ilm);
+
+
+#endif /* PTP_STATE_H */
+
+
diff --git a/mcu/driver/connectivity/usb_class/include/usb.h b/mcu/driver/connectivity/usb_class/include/usb.h
new file mode 100644
index 0000000..329b9eb
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/usb.h
@@ -0,0 +1,1019 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usb.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb1.1 definitions.
+ *
+ * Author:
+ * -------
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USB_H
+#define USB_H
+
+
+#include "usb_custom.h"
+#include "usb_custom_def.h"
+//#include "usb_drv.h"
+#include "dcl.h"
+#include "usb_comm.h"
+#include "kal_general_types.h"
+
+
+/* Remove dependence.
+ * It should be releated to MMI behavior. Thus, add it on makefile if request is incoming.
+ */
+//#ifdef __TC01__
+//#define __USB_BOOT_NOT_CHECK_NVRAM_SETTING__
+//#endif
+
+/***********************************************
+ standard command definition
+************************************************/
+
+/* Standard Request Codes */
+#define USB_GET_STATUS 0x00
+#define USB_CLEAR_FEATURE 0x01
+#define USB_SET_FEATURE 0x03
+#define USB_SET_ADDRESS 0x05
+#define USB_GET_DESCRIPTOR 0x06
+#define USB_SET_DESCRIPTOR 0x07
+#define USB_GET_CONFIGURATION 0x08
+#define USB_SET_CONFIGURATION 0x09
+#define USB_GET_INTERFACE 0x0A
+#define USB_SET_INTERFACE 0x0B
+#define USB_SYNCH_FRAME 0x0C
+
+/* Vendor Request Codes */
+#define USB_GET_MS_DESCRIPTOR 0xCC
+
+/* Command bit fields */
+#define USB_CMD_DATADIR 0x80
+
+/* Request Type Field */
+#define USB_CMD_TYPEMASK 0x60
+#define USB_CMD_STDREQ 0x00
+#define USB_CMD_CLASSREQ 0x20
+#define USB_CMD_VENDREQ 0x40
+#define USB_CMD_STDDEVIN 0x80
+#define USB_CMD_STDDEVOUT 0x00
+#define USB_CMD_STDIFIN 0x81
+#define USB_CMD_STDIFOUT 0x01
+#define USB_CMD_STDEPIN 0x82
+#define USB_CMD_STDEPOUT 0x02
+#define USB_CMD_CLASSIFIN 0xA1
+#define USB_CMD_CLASSIFOUT 0x21
+#define USB_CMD_VENDDEVIN 0xC0
+#define USB_CMD_VENDDEVOUT 0x40
+
+
+/* Standard command descriptor type*/
+#define USB_DEVICE 0x01
+#define USB_CONFIG 0x02
+#define USB_STRING 0x03
+#define USB_INTERFACE 0x04
+#define USB_ENDPOINT 0x05
+#define USB_DEVICE_QUALIFIER 0x06
+#define USB_OTHER_SPEED 0x07
+#define USB_INTERFACE_POWER 0x08
+#define USB_OTG_DESC 0x09
+#define USB_INTERFACE_ASSOCIATION 0x0B
+
+#define USB_CMD_DESCMASK 0xFF00
+#define USB_CMD_DEVICE (USB_DEVICE<<8)
+#define USB_CMD_CONFIG (USB_CONFIG<<8)
+#define USB_CMD_STRING (USB_STRING<<8)
+#define USB_CMD_INTERFACE (USB_INTERFACE<<8)
+#define USB_CMD_ENDPOINT (USB_ENDPOINT<<8)
+#define USB_CMD_DEVICE_QUALIFIER (USB_DEVICE_QUALIFIER<<8)
+#define USB_CMD_OTHER_SPEED (USB_OTHER_SPEED<<8)
+#define USB_CMD_INTERFACE_POWER (USB_INTERFACE_POWER<<8)
+
+/* Standard Device Feature Selectors */
+#define USB_FTR_DEVREMWAKE 0x0001
+#define USB_FTR_EPHALT 0x0000
+#define USB_FTR_B_HNP_ENB 0x0003
+#define USB_FTR_A_HNP_SUPPORT 0x0004
+#define USB_FTR_A_ALT_HNP_SUPPORT 0x0005
+#define USB_FTR_TEST_MODE 0x0002
+
+/* Vendor OS feature descriptor, feature index */
+#define USB_FTR_GENRE 0x0001
+#define USB_FTR_EXT_COMPAT_ID 0x0004
+#define USB_FTR_EXT_PROPERTIES 0x0005
+
+
+/* USB test mode */
+#define USB_TEST_J 0x01
+#define USB_TEST_K 0x02
+#define USB_TEST_SE0_NAK 0x03
+#define USB_TEST_PACKET 0x04
+
+/***********************************************
+ standard descriptor definition
+************************************************/
+/* Scriptor length */
+#define USB_DEVDSC_LENGTH 18
+#define USB_CFGDSC_LENGTH 9
+#define USB_IFDSC_LENGTH 9
+#define USB_MAX_IFDSC_LENGTH 258 /* this will change depend on different class interface */
+ /*descriptor requirment*/
+ /* 258 is for video streaming class interface */
+#define USB_EPDSC_LENGTH 7
+#define USB_OTGDSC_LENGTH 3
+#define USB_MAX_CLASS_EPDESC_LENGTH 12 /* this will change depend on different class interface */
+ /*descriptor requirment*/
+ /* 12 is for video control interrupt ep */
+#define USB_IAD_LENGTH 8
+#define USB_DEV_QUA_DSC_LENGTH 10
+#define USB_OTHER_CFGDSC_LENGTH 9
+#define USB_MAX_OS_STRING_LENGTH 18
+#define USB_MAX_OS_FEATURE_DESC_LENGTH 40
+
+
+/* Endpoint direction */
+#define USB_EP_DIR 0x80
+#define USB_EP_DIR_IN 0x80
+#define USB_EP_DIR_OUT 0x00
+
+/* Endpoint transfer types */
+#define USB_EP_TFMASK 0x03
+#define USB_EP_CONTROL 0x00
+#define USB_EP_ISO 0x01
+#define USB_EP_BULK 0x02
+#define USB_EP_INTR 0x03
+
+/* ISO Synchronization types */
+#define USB_ISO_NO_SYNCHRONIZATION 0x00
+#define USB_ISO_ASYNCHRONOUS 0x01
+#define USB_ISO_ADAPTIVE 0x02
+#define USB_ISO_SYNCHRONOUS 0x03
+
+/* ISO Usage types */
+#define USB_ISO_DATA 0x00
+#define USB_ISO_FEEDBACK 0x01
+#define USB_ISO_IMPLICIT_FEEDBACK 0x02
+
+/*****Descriptor Element*****/
+/* Define values for Standard Device Descriptor */
+/* For Device descriptor */
+
+/* bcdDevice value */
+#define USB_DEVDSC_BCDDEVICE_PHONE 0x0100 /* Release number of USB device */
+#define USB_DEVDSC_BCDDEVICE_MODEM_CARD 0x0200 /* Release number of USB modem card device for ECMT */
+#define USB_DEVDSC_BCDDEVICE_MODEM_CARD_FOR_NDIS 0x0300 /* Release number of USB modem card device for NDIS*/
+
+/* Device class code for composite device */
+#define USB_COMPOSITE_DEVICE_CODE 0xEF
+#define USB_COMPOSITE_SUBCLASS_CODE 0x02
+#define USB_COMPOSITE_PROTOCOL_CODE 0x01
+
+/* Device class code for without IAD composite device */
+#define USB_COMPOSITE_NO_IAD_DEVICE_CODE 0x00
+#define USB_COMPOSITE_NO_IAD_SUBCLASS_CODE 0x00
+#define USB_COMPOSITE_NO_IAD_PROTOCOL_CODE 0x00
+
+
+#define USB_DEVDSC_CONFIGS USB_MAX_CONFIG // USB_DEVDSC_CONFIGS --> USB_GetChargeCurrentTableSize()
+
+
+/*For Configuration descriptor*/
+#define USB_CFGDSC_ATTR_NATURE 0x80
+#define USB_CFGDSC_ATTR_SELFPOWER 0x40
+#define USB_CFGDSC_ATTR_REMOTEWAKEUP 0x20
+#define USB_CFGDSC_MAXPOWER (500/2)
+
+#define USB_OTG_HNP_SUPPORT 0x02
+#define USB_OTG_SRP_SUPPORT 0x01
+
+
+/***********************************************
+ Hub class code definition
+************************************************/
+#define USB_HUB_DEVICE_CLASS_CODE 0x09
+#define USB_HUB_DEVICE_SUBCLASS_CODE 0x00
+//#define USB_HUB_DEVICE_PROTOCOL_CODE 0x00
+#define USB_HUB_INTERFACE_CLASS_CODE 0x09
+#define USB_HUB_INTERFACE_SUBCLASS_CODE 0x00
+//#define USB_HUB_INTERFACE_PROTOCOL_CODE 0x00
+
+
+/***********************************************
+ Implement definition
+************************************************/
+
+/* Define configuration, interface, ep number */
+#define USB_MAX_CONFIG 6 /* configuration number */
+#define USB_MAX_IAD 1
+
+#define USB_MAX_INTERFACE 2 /* interface number */
+
+#define USB_MAX_INTERFACE_ALTERNATE_NUM 1 /* interface alternate seting number */
+
+#if defined(__USB_EP_TEST__)
+#define USB_MAX_EP_BULK_TX 4 /* max bulk in ep number */
+#define USB_MAX_EP_BULK_RX 3 /* max bulk in ep number */
+#define USB_MAX_EP_ISO_TX 4 /* max interrupt ep number */
+#define USB_MAX_EP_INTR_TX 4 /* max interrupt ep number */
+#else
+#define USB_MAX_EP_BULK_TX 1 /* max bulk in ep number */
+#define USB_MAX_EP_BULK_RX 1 /* max bulk in ep number */
+#define USB_MAX_EP_INTR_TX 1 /* max interrupt ep number */
+#define USB_MAX_EP_ISO_TX 1 /* max interrupt ep number */
+#endif
+
+#define USB_MAX_STRING 12 /* string number */
+
+#define USB_MAX_EP_PER_IF 3 /* 3 is for image class */
+
+/* serial string array size for that unique Serial number*/
+#define USB_SERIAL_STRING_LEN 16
+
+/* define endpoint data parameters */
+#define USB_EP_NODATA -1 /* no more data for endpoint to send */
+
+
+/***********************************************
+ standard command structure
+************************************************/
+
+/* usb standard command structure */
+typedef struct
+{
+ kal_uint8 bmRequestType;
+ kal_uint8 bRequest;
+ kal_uint16 wValue;
+ kal_uint16 wIndex;
+ kal_uint16 wLength;
+}Usb_Command;
+
+
+
+/***********************************************
+ Standard descriptor structure
+************************************************/
+
+/* standard device descriptor */
+typedef struct
+{
+ kal_uint8 bLength;
+ kal_uint8 bDescriptorType;
+ kal_uint16 bcdUSB;
+ kal_uint8 bDeviceClass;
+ kal_uint8 bDeviceSubClass;
+ kal_uint8 bDeviceProtocol;
+ kal_uint8 bMaxPacketSize0;
+ kal_uint16 idVendor;
+ kal_uint16 idProduct;
+ kal_uint16 bcdDevice;
+ kal_uint8 iManufacturer;
+ kal_uint8 iProduct;
+ kal_uint8 iSerialNumber;
+ kal_uint8 bNumConfigurations;
+}Usb_Dev_Dscr;
+
+
+/* standard configuration descriptor */
+typedef struct
+{
+ kal_uint8 bLength;
+ kal_uint8 bDescriptorType;
+ kal_uint16 wTotalLength;
+ kal_uint8 bNumInterfaces;
+ kal_uint8 bConfigurationValue;
+ kal_uint8 iConfiguration;
+ kal_uint8 bmAttributes;
+ kal_uint8 bMaxPower;
+}Usb_Cfg_Dscr;
+
+
+/* standard IAD descriptor */
+typedef struct
+{
+ kal_uint8 bLength;
+ kal_uint8 bDescriptorType;
+ kal_uint8 bFirstInterface;
+ kal_uint8 bInterfaceCount;
+ kal_uint8 bFunctionClass;
+ kal_uint8 bFunctionSubClass;
+ kal_uint8 bFunctionProtocol;
+ kal_uint8 iFunction;
+}Usb_IAD_Dscr;
+
+
+/* standard interface descriptor */
+typedef struct
+{
+ kal_uint8 bLength;
+ kal_uint8 bDescriptorType;
+ kal_uint8 bInterfaceNumber;
+ kal_uint8 bAlternateSetting;
+ kal_uint8 bNumEndpoints;
+ kal_uint8 bInterfaceClass;
+ kal_uint8 bInterfaceSubClass;
+ kal_uint8 bInterfaceProtocol;
+ kal_uint8 iInterface;
+}Usb_If_Dscr;
+
+
+/* standard endpoint descriptor */
+typedef struct
+{
+ kal_uint8 bLength;
+ kal_uint8 bDescriptorType;
+ kal_uint8 bEndpointAddress;
+ kal_uint8 bmAttributes;
+ kal_uint8 wMaxPacketSize[2];
+ kal_uint8 bInterval;
+}Usb_Ep_Dscr;
+
+
+/* standard string descriptor */
+typedef struct
+{
+ kal_uint8 bLength;
+ kal_uint8 bDescriptorType;
+ kal_uint16 wData[1];
+}Usb_String_Dscr;
+
+
+/* standard string descriptor */
+typedef struct
+{
+ kal_uint8 bLength;
+ kal_uint8 bDescriptorType;
+ kal_uint8 bAttribute;
+}Usb_Otg_Dscr;
+
+
+typedef struct
+{
+ kal_uint8 bLength;
+ kal_uint8 bDescriptorType;
+ kal_uint16 bcdUSB;
+ kal_uint8 bDeviceClass;
+ kal_uint8 bDeviceSubClass;
+ kal_uint8 bDeviceProtocol;
+ kal_uint8 bMaxPacketSize0;
+ kal_uint8 bNumConfigurations;
+ kal_uint8 bReserved;
+}Usb_Dev_Qual_Dscr;
+
+
+typedef struct
+{
+ kal_uint8 bLength;
+ kal_uint8 bDescriptorType;
+ kal_uint16 wTotalLength;
+ kal_uint8 bNumInterfaces;
+ kal_uint8 bConfigurationValue;
+ kal_uint8 iConfiguration;
+ kal_uint8 bmAttributes;
+ kal_uint8 MaxPower;
+}Usb_Other_Speed_Cfg_Dscr;
+
+
+typedef struct
+{
+ kal_uint8 bLength;
+ kal_uint8 bDescriptorType;
+ kal_uint8 qwSignature[14];
+ kal_uint8 bMS_VendorCode;
+ kal_uint8 bPad;
+}Usb_OS_String_Dscr;
+
+
+typedef struct
+{
+ kal_uint32 dwLength;
+ kal_uint16 bcdVersion;
+ kal_uint16 wIndex;
+ kal_uint8 bCount;
+ kal_uint8 bPads_1[7];
+ kal_uint8 bFirstInterfaceNumber;
+ kal_uint8 bPads_2;
+ kal_uint8 compatibleID[8];
+ kal_uint8 subcompatibleID[8];
+ kal_uint8 bPads_3[6];
+}Usb_Ext_Compat_ID_OS_Feature_Dscr;
+
+
+/***********************************************
+ implement enum and structure
+************************************************/
+
+/* device states */
+typedef enum
+{
+ DEVSTATE_DEFAULT = 0,
+ DEVSTATE_SET_ADDRESS,
+ DEVSTATE_ADDRESS,
+ DEVSTATE_CONFIG
+}USB_DEVICE_STATE;
+
+
+/* Endpoint 0 state */
+typedef enum
+{
+ USB_EP0_IDLE=0,
+ USB_EP0_RX,
+ USB_EP0_TX,
+ USB_EP0_RX_STATUS
+}USB_EP0_STATE;
+
+
+/* EP0 status */
+typedef struct
+{
+ kal_int32 nBytesLeft; /* number of bytes left to send in TX mode */
+ void *pData; /* pointer to data to transmit/receive */
+ kal_int32 nBytesRecv; /* number of bytes received in RX mode */
+ kal_uint8 byFAddr; /* new function address */
+ kal_bool no_ZLP; /* No need ZLP when wLength == transfer size */
+}Usb_Ep0_Status;
+
+
+/* Bulk IN endpoint status */
+typedef struct
+{
+ void *pData; /* pointer to data buffer */
+ kal_int32 nBytesLeft; /* number of bytes left to send */
+ kal_uint8 byEP; /* endpoint number */
+}Usb_EpBIn_Status;
+
+
+/* Bulk OUT endpoint status */
+typedef struct
+{
+ void *pData; /* pointer to data buffer */
+ kal_int32 nBuffLen; /* length of data buffer */
+ kal_int32 nBytesRecv; /* number of bytes received */
+ kal_uint8 byEP; /* endpoint number */
+}Usb_EpBOut_Status;
+
+
+typedef enum
+{
+ USB_NORMAL_BOOT = 0,
+ USB_BOOT_ONE_PORT,
+ USB_BOOT_TWO_PORT,
+ USB_BOOT_THREE_PORT,
+ USB_BOOT_FOUR_PORT,
+ USB_BOOT_FIVE_PORT
+// USB_RNDIS_ONE_PORT
+}USB_Comport_Boot_Status;
+
+typedef enum
+{
+ USB_COMPORT_WIN = 0,
+ USB_COMPORT_WIN_SINGLE_INTERFACE,
+ USB_COMPORT_MAC,
+ USB_COMPORT_LINUX,
+ USB_COMPORT_MBIM,
+}USB_Comport_OS_Driver_Status;
+
+typedef enum
+{
+ USB_MASK_OWNER_COM_1 = 0,
+ USB_MASK_OWNER_COM_2,
+ USB_MASK_OWNER_COM_3,
+ USB_MASK_OWNER_COM_4,
+ USB_MASK_OWNER_COM_5,
+ USB_MASK_OWNER_MS = 10,
+ USB_MASK_OWNER_ALL,
+ USB_MASK_OWNER_MAX
+}USB_MASK_OWNER;
+
+
+/* interface create function pointer */
+typedef void (*usb_create_if_func_ptr)(void *);
+/* interface speed reset function pointer */
+typedef void (* usb_speed_if_func_ptr)(kal_bool bset);
+/* EP0 rx interrupt handler */
+typedef void (*usb_ep0_rx_ptr)(void *);
+/* class specific command interrupt handler */
+typedef void (*usb_class_specific_handler_ptr)(Usb_Ep0_Status *, Usb_Command*);
+/* endpoint interrupt handler */
+typedef void (*usb_ep_handler_ptr)(void);
+/* EP0 command interrupt handler */
+typedef void (*usb_ep0_cmd_ptr)(Usb_Command *pcmd);
+
+typedef void (*usb_void_func)(void);
+
+/* endpoint information, including endpoint status */
+typedef struct
+{
+ union
+ {
+ Usb_Ep_Dscr stdep; /* ep descriptor */
+ kal_uint8 classep[USB_MAX_CLASS_EPDESC_LENGTH];
+ }epdesc;
+
+ union
+ {
+ Usb_EpBIn_Status epin_status;
+ Usb_EpBOut_Status epout_status;
+ }ep_status; /* ep status */
+
+ usb_ep_handler_ptr ep_reset; /* ep reset handler */
+ kal_uint16 epdscr_size; /* descriptor length */
+}Usb_Ep_Info;
+
+
+typedef struct
+{
+ Usb_Ep_Info *ep_info[USB_MAX_EP_PER_IF];/* endpoint attach to the interface info */
+ kal_uint16 ifdscr_size; /* descriptor length */
+ Usb_If_Dscr stdif;
+}Usb_Alternate_Interface_Info;
+
+
+/* interface information, including endpoint information and interface information*/
+typedef struct
+{
+ kal_char *interface_name_ptr; /* interface name */
+ usb_class_specific_handler_ptr if_class_specific_hdlr; /* interface specific handler, handle ep0 class specific request */
+ kal_uint16 ifdscr_size; /* descriptor length */
+ union
+ {
+ Usb_If_Dscr stdif;
+ kal_uint8 classif[USB_MAX_IFDSC_LENGTH];
+ }ifdscr;
+
+ Usb_Ep_Info *ep_info[USB_MAX_EP_PER_IF];/* endpoint attach to the interface info */
+
+#if defined(__USB_SUPPORT_ISO_PIPE__)
+ Usb_Alternate_Interface_Info alternate_if_info[USB_MAX_INTERFACE_ALTERNATE_NUM];
+ kal_uint8 alternate_setting; /* alternate setting number */
+#endif
+
+}Usb_Interface_Info;
+
+
+/* configuration information */
+typedef struct
+{
+ Usb_Cfg_Dscr stdcfg; /* config descriptor */
+}Usb_Config_Info;
+
+
+typedef struct
+{
+ kal_bool b_enable;
+ kal_uint8 cmd;
+ usb_ep0_cmd_ptr ep0_cmd_hdlr;
+}Usb_EP0_Cmd_Hdler;
+
+/* device information, used for usb level */
+typedef struct
+{
+ USB_DEVICE_TYPE device_type;
+ USB_DEVICE_STATE nDevState; /*DEVSTATE_CONFIG,DEVSTATE_ADDRESS,DEVSTATE_DEFAULT*/
+ kal_bool remoteWk;
+#if defined(__DUAL_TALK_MODEM_SUPPORT__)
+ kal_bool isRemoteWking;
+#endif
+
+ kal_uint32 memory_addr;// allocate memory buffer address
+ kal_uint32 reserved_memory_size;//memory left size
+
+ kal_bool self_powered;
+ kal_bool ep0_send_one_pkt; /* the variable to record ep0 will send only one packet */
+ kal_bool usb_send_config_result; /* to send configure may be fail */
+
+ kal_uint8 config_num;
+ kal_uint8 interface_num[USB_MAX_INTERFACE];
+ USB_EP0_STATE ep0_state;
+
+
+ /* Add for multi-configurations*/
+ PMU_CTRL_CHR_GET_CHR_CURRENT_LIST get_chr_current_list;
+ kal_uint8 multi_Max_Power[USB_MAX_CONFIG];
+ kal_uint8 current_table_index;
+
+
+ /* used for resource management*/
+// optimize code size : cannot change order
+ kal_uint8 resource_ep_bulk_tx_number;
+ kal_uint8 resource_ep_bulk_rx_number;
+ kal_uint8 resource_ep_intr_tx_number;
+ kal_uint8 resource_interface_number;
+ kal_uint8 resource_string_number;
+#ifdef __USB_SUPPORT_ISO_PIPE__
+ kal_uint8 resource_ep_iso_tx_number;
+#endif
+#if defined(__USB_SUPPORT_ISO_PIPE__)
+ kal_uint8 resource_interface_alternate_number[USB_MAX_INTERFACE];
+#endif
+ kal_uint8 resource_iad_number;
+// resource_iad_number : must be the end of resource parameter
+
+
+
+ /* the configuration only one for saving memory */
+// optimize code size : cannot change order
+ Usb_Dev_Dscr devdscr;
+ Usb_Cfg_Dscr cfgdscr;
+ Usb_Ep_Info ep_bulk_tx_info[USB_MAX_EP_BULK_TX];
+ Usb_Ep_Info ep_bulk_rx_info[USB_MAX_EP_BULK_RX];
+ Usb_Ep_Info ep_intr_tx_info[USB_MAX_EP_INTR_TX];
+ Usb_Interface_Info if_info[USB_MAX_INTERFACE];
+#ifdef __USB_SUPPORT_ISO_PIPE__
+ Usb_Ep_Info ep_iso_tx_info[USB_MAX_EP_ISO_TX];
+#endif
+ Usb_String_Dscr *resource_string[USB_MAX_STRING];
+ Usb_IAD_Dscr iad_desc[USB_MAX_IAD];
+#ifdef __OTG_ENABLE__
+ Usb_Otg_Dscr otgdscr;
+#endif
+#ifdef __USB_IMAGE_CLASS__
+ Usb_OS_String_Dscr os_string_desc;
+ Usb_Ext_Compat_ID_OS_Feature_Dscr os_feature_desc;
+#endif
+
+ kal_uint8 *conf; /*just for descriptor transfer*/
+// conf : : must be the end of descriptor parameter
+
+ Usb_Command cmd; /*USB_COMMAND*/
+
+ Usb_Ep0_Status ep0info;
+ usb_ep0_rx_ptr ep0_rx_handler;
+ Usb_EP0_Cmd_Hdler ep0_class_cmd_handler; /* class specific ep0 cmd */
+
+ /* serial string unique for each phone*/
+ kal_uint16 serial_string[USB_SERIAL_STRING_LEN];
+
+ /* customizable variables*/
+ const USB_DEVICE_PARAM *device_param;
+} Usb_Device;
+
+
+/***********************************************
+ function and global variable
+************************************************/
+extern Usb_Device gUsbDevice;
+
+void USB_EP0_Command_Hdlr(kal_bool bError);
+
+
+#ifdef __RTL_SIMULATION_FOR_60QBIT__
+extern void usb_irq_disable_duration_test2(void);
+#endif
+
+extern void USB_Send_Msg_Ext_Queue(module_type dstid,msg_type msg_id,void *data);
+
+extern kal_uint32 USB_Get_Memory (kal_uint32 len);
+extern void USB_Free_Memory(void);
+
+#endif /* USB_H */
+
diff --git a/mcu/driver/connectivity/usb_class/include/usb_adap.h b/mcu/driver/connectivity/usb_class/include/usb_adap.h
new file mode 100644
index 0000000..9c07395
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/usb_adap.h
@@ -0,0 +1,328 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usb_adap.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb adaption layer between HW driver and class drivers
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USB_ADAP_H
+#define USB_ADAP_H
+
+
+//#include "kal_non_specific_general_types.h"
+#include "usb_comm.h"
+#include "dcl.h"
+//#include "usb_drv.h"
+#include "usb.h"
+#include "usb_mode.h"
+
+//#if defined(__MTK_TARGET__)
+//#if defined (__ARMCC_VERSION)
+//#define INLINE static __inline
+//#elif defined (__GNUC__)
+//#define INLINE inline
+//#endif /* ARMCC , GNUC */
+//#else /* __MTK_TARGET__ */
+//#define INLINE __inline
+//#endif /* __MTK_TARGET__ */
+
+
+static INLINE USB_DEVICE_STATE USB_Get_Device_State(void)
+{
+ return gUsbDevice.nDevState;
+}
+
+static INLINE void USB_Set_Device_State(USB_DEVICE_STATE usb_device_state)
+{
+ gUsbDevice.nDevState = usb_device_state;
+}
+
+static INLINE USB_DEVICE_TYPE USB_Get_Device_Type(void)
+{
+ return gUsbDevice.device_type;
+}
+
+static INLINE void USB_Set_Device_Type(USB_DEVICE_TYPE usb_device_type)
+{
+ gUsbDevice.device_type = usb_device_type;
+}
+
+static INLINE USB_EP0_STATE USB_Get_Endpoint0_State(void)
+{
+ return gUsbDevice.ep0_state;
+}
+
+static INLINE void USB_Set_Endpoint0_State(USB_EP0_STATE ep0_state)
+{
+ gUsbDevice.ep0_state = ep0_state;
+}
+
+static INLINE USB_Comport_Boot_Status USB_Get_Comport_Boot_Status(void)
+{
+ return g_UsbMode.usb_comport_boot;
+}
+
+static INLINE void USB_Release(void)
+{
+
+}
+
+static INLINE void USB_Register_EP0_RxHdlr(usb_ep0_rx_ptr handler)
+{
+ gUsbDevice.ep0_rx_handler = handler;
+}
+
+
+
+extern void USB_Register_CreateFunc(kal_char* if_name, usb_create_if_func_ptr if_create_func, usb_void_func if_init_func,
+ usb_void_func if_enable_func, usb_speed_if_func_ptr if_speed_func, usb_void_func if_resume_func);
+extern void USB_Register_Device_Code(kal_uint8 device_code, kal_uint8 subclass_code, kal_uint8 protocol_code, kal_uint16 product_code);
+extern void USB_DeRegister_CreateFunc(void);
+//extern void USB_DeRegister_Device_Code(void);
+extern Usb_Ep_Info* USB_Get_Intr_Ep(kal_uint8 *p_num);
+#ifdef __USB_SUPPORT_ISO_PIPE__
+extern Usb_Ep_Info* USB_Get_Iso_Tx_Ep(kal_uint8 *p_num);
+#endif
+#if defined(__USB_SUPPORT_ISO_PIPE__)
+extern Usb_Alternate_Interface_Info* USB_Get_Interface_Alternate_Setting(kal_uint8 p_num);
+#endif
+
+extern Usb_Ep_Info* USB_Get_Bulk_Tx_Ep(kal_uint8 *p_num);
+extern Usb_Ep_Info* USB_Get_Bulk_Rx_Ep(kal_uint8 *p_num);
+extern Usb_Interface_Info* USB_Get_Interface_Number(kal_uint8 *p_num);
+extern kal_uint8 USB_Get_String_Number(void *usb_string);
+extern Usb_IAD_Dscr* USB_Get_IAD_Number(void);
+
+extern void USB_Release_Device_Status(void);
+extern void USB_Register_EP0_Class_CmdHdlr(kal_uint8 cmd, usb_ep0_cmd_ptr handler);
+extern void USB_Init(USB_DEVICE_TYPE type, kal_bool b_enable, kal_bool is_ft_mode);
+//extern void USB_Release(void);
+//extern void USB_Register_EP0_RxHdlr(usb_ep0_rx_ptr handler);
+void USB_Mask_USB_CORE(USB_MASK_OWNER owner);
+void USB_UnMask_USB_CORE(USB_MASK_OWNER owner);
+extern void USB_UnMask_Irq(USB_MASK_OWNER owner);
+extern void USB_Mask_Irq(USB_MASK_OWNER owner);
+extern void USB_Generate_EP0Data(Usb_Ep0_Status*pep0state, Usb_Command*pcmd, void *data, kal_int32 len);
+
+
+extern void USB_Register_Drv_Info(USB_DRV_HDLR_TYPE type, kal_uint32 ep_num, usb_drv_intr_handler_ptr hdlr);
+extern void USB_Set_UnMask_Irq(kal_bool set);
+extern kal_bool USB_Get_UnMask_Irq(void);
+extern kal_uint16 USB_GetFrameCount(void);
+extern void USB_PDNmode(kal_bool pdn_en);
+
+
+extern void USB_TxEPEn(kal_uint32 ep_num, USB_ENDPT_TXFER_TYPE ep_type, USB_ENDPT_DMA_USAGE dma_usage_type, kal_bool is_flush, kal_bool is_ft_mode);
+extern void USB_TxEPDis(kal_uint32 ep_num, USB_ENDPT_DMA_USAGE dma_usage_type);
+extern void USB_RxEPEn(kal_uint32 ep_num, USB_ENDPT_TXFER_TYPE ep_type, USB_ENDPT_DMA_USAGE dma_usage_type, kal_bool is_flush, kal_bool is_ft_mode);
+extern void USB_RxEPDis(kal_uint32 ep_num, USB_ENDPT_DMA_USAGE dma_usage_type);
+extern void USB_Config_TxEP_Type(kal_uint32 ep_num, USB_ENDPT_TXFER_TYPE ep_type, kal_bool b_is_use_dma);
+extern void USB_Config_RxEP_Type(kal_uint32 ep_num, USB_ENDPT_TXFER_TYPE ep_type, kal_bool b_is_use_dma);
+extern void USB_TxEPClearDataTog(kal_uint32 ep_num, USB_ENDPT_TXFER_TYPE ep_type);
+extern void USB_RxEPClearDataTog(kal_uint32 ep_num, USB_ENDPT_TXFER_TYPE ep_type);
+extern USB_EP_STATE USB_TxEP_Usage(kal_uint32 ep_num);
+extern USB_EP_STATE USB_RxEP_Usage(kal_uint32 ep_num);
+extern void USB_EPFIFORead(kal_uint32 ep_num, kal_uint16 nBytes, void *pDst, kal_bool force_one_byte_access);
+extern void USB_EPFIFOWrite (kal_uint32 ep_num, kal_uint16 nBytes, void *pSrc);
+extern void USB_CtrlEPStall(kal_uint32 ep_num, USB_EP_DIRECTION direction, kal_bool stall_enable);
+//extern void USB_Get_EP0_Status(kal_bool *p_transaction_end, kal_bool *p_sent_stall);
+extern void USB_Update_EP0_State(USB_EP0_DRV_STATE state, kal_bool stall, kal_bool end);
+extern kal_uint32 USB_EP0_Pkt_Len(void);
+extern void USB_EP_Tx_Ready(kal_uint32 ep_num, USB_ENDPT_TXFER_TYPE ep_type);
+extern kal_uint32 USB_EP_Rx_Pkt_Len(kal_uint32 ep_num);
+extern void USB_EP_Rx_Ready(kal_uint32 ep_num, USB_ENDPT_TXFER_TYPE ep_type);
+extern kal_bool USB_Is_EP_Tx_Empty(kal_uint32 ep_num, USB_ENDPT_TXFER_TYPE ep_type);
+extern kal_bool USB_Is_EP_Rx_Empty(kal_uint32 ep_num, USB_ENDPT_TXFER_TYPE ep_type);
+extern void USB_Clear_Tx_EP_FIFO(kal_uint32 ep_num, USB_ENDPT_TXFER_TYPE ep_type, kal_bool b_reset_toggle);
+extern void USB_Clear_Rx_EP_FIFO(kal_uint32 ep_num, USB_ENDPT_TXFER_TYPE ep_type, kal_bool b_reset_toggle);
+
+/* DMA control functions */
+extern void USB_Get_DMA_Channel(kal_uint32 ep_tx_num, kal_uint32 ep_rx_num, USB_EP_DIRECTION direction, kal_bool same_chan);
+extern void USB_Stop_DMA_Channel(kal_uint32 ep_num, USB_EP_DIRECTION direction);
+extern void USB_Free_DMA_Channel(kal_uint32 ep_tx_num, kal_uint32 ep_rx_num, USB_EP_DIRECTION direction, kal_bool same_chan);
+extern void USB_DMA_Setup(kal_uint32 ep_num, USB_EP_DIRECTION direction, USB_ENDPT_TXFER_TYPE ep_type, kal_uint32 addr, kal_uint32 length,
+ usb_dma_callback callback, kal_bool callback_upd_run, kal_bool known_size, USB_DMA_TYPE dma_type);
+
+extern kal_bool USB_DMA_Get_Run_Status(kal_uint32 ep_num, USB_EP_DIRECTION direction);
+extern void USB_DMA_Set_Run_Status(kal_uint32 ep_num, USB_EP_DIRECTION direction, kal_bool status);
+extern void USB_Set_DMA_Limiter(kal_uint32 dma_limit_num);
+
+
+extern void USB_Switch_DMA_Burst_mode(kal_bool b_enable);
+extern void USB_Register_DMA_Channel(kal_uint32 ep_num, USB_EP_DIRECTION direction, kal_uint8 chan_num, kal_bool same_chan);
+extern void USB_Set_DMA_Burst_Mode(kal_uint8 dma_burst_mode);
+
+extern kal_bool USB_Is_High_Speed(void);
+
+extern void USB_Enter_Test_Mode(USB_TEST_MODE_TYPE test_selector);
+//extern void USB_Reset_FIFO(void);
+extern kal_bool USB_Is_FIFO_Not_Empty(void);
+extern kal_bool USB_Is_Suspend_Power_Status(void);
+
+extern void USB_Polling_Transmit_Done(kal_uint32 ep_num, USB_ENDPT_TXFER_TYPE ep_type);
+extern void USB_Polling_Transmit_Data(kal_uint32 ep_num, USB_EP_DIRECTION direction, USB_ENDPT_TXFER_TYPE ep_type, kal_uint32 addr, kal_uint32 length,
+ usb_dma_callback callback, kal_bool callback_upd_run, kal_bool known_size, USB_DMA_TYPE dma_type);
+extern void USB_Polling_Recv_Data(void);
+
+
+extern void USB_Clr_RX_EP_ISR(kal_uint32 ep_num);
+extern kal_bool USB_Get_RX_EP_ISR_Status(kal_uint32 ep_num);
+
+//extern kal_bool USBDL_Is_USB_Download_Mode(void);
+//extern kal_bool USBDL_Is_USB_Fast_Meta_Mode(void);
+
+
+extern void USB_Debug_Information(kal_uint32 ep_num, USB_EP_DIRECTION direction,kal_bool check_error);
+extern void USB_DUMP(void);
+
+extern DCL_USB_IP_VERSION USB_IP_Version(void);
+
+
+extern kal_uint32 USB_Intr_Max_Packet_Size(void);
+extern kal_uint32 USB_Bulk_Max_Packet_Size(void);
+#ifdef __USB_SUPPORT_ISO_PIPE__
+extern kal_uint32 USB_Iso_Max_Packet_Size(void);
+#endif
+
+
+extern DCL_HANDLE g_USB_Dcl_Handle;
+
+typedef void (*usb_hisr)(void);
+
+
+//=========================== DCL interface to other module =====================================//
+
+extern void USB_GPTI_StartItem(kal_uint32 handle,kal_uint16 tick,void (*gptimer_func)(void *),void *parameter);
+extern void USB_GPTI_StopItem(kal_uint32 handle);
+extern void USB_GPTI_GetHandle(kal_uint32* handle);
+extern void USB_GPTI_ReleaseHandle(kal_uint32* handle);
+//extern kal_uint32 USB_GPTI_GetHandle(void);
+//extern kal_uint32 USB_GPTI_ReleaseHandle(kal_uint32 handle);
+
+
+#ifdef WEBCAM_SUPPORT
+extern void USB_GPT3_Start(void);
+extern void USB_GPT3_Stop(void);
+extern kal_uint32 USB_GPT3_return_current_count(void);
+#endif
+
+
+extern void USB_CHR_USB_EINT_UnMask(void);
+
+//extern kal_bool USB_INT_USBBoot(void);
+
+//extern void USB_BMT_NO_CHARGING_OUT(kal_bool cable_in);
+
+static INLINE kal_bool USB_INT_USBBoot(void)
+{
+ DCL_HANDLE g_PW_Dcl_Handle;
+ PW_CTRL_IS_USB_BOOT CtrlVal;
+
+ g_PW_Dcl_Handle = DclPMU_Open(DCL_PW, FLAGS_NONE);
+ DclPW_Control(g_PW_Dcl_Handle, PW_CMD_IS_USB_BOOT,(DCL_CTRL_DATA_T *)&CtrlVal);
+ return (kal_bool)CtrlVal.val;
+}
+
+static INLINE void USB_Get_Current_Table(void)
+{
+ DCL_HANDLE pmu_handle; // add for usb charging
+
+ pmu_handle = DclPMU_Open(DCL_PMU, FLAGS_NONE);
+ DclPMU_Control(pmu_handle, CHR_GET_CHR_CURRENT_LIST, (DCL_CTRL_DATA_T *)&gUsbDevice.get_chr_current_list);
+ DclPMU_Close(pmu_handle);
+}
+
+static INLINE void USB_Register_USB_HISR(usb_hisr func_ptr)
+{
+ DCL_HANDLE pmu_handle; // add for usb charging
+ CHR_DET_CTRL_REGISTER_USB_HISR ChrDetVal;
+
+ pmu_handle = DclPMU_Open(DCL_PMU, FLAGS_NONE);
+ ChrDetVal.usb_det_hisr = func_ptr;
+ Dcl_Chr_Det_Control(pmu_handle, CHR_DET_CMD_REGISTER_USB_HISR, (DCL_CTRL_DATA_T *)&ChrDetVal);
+ DclPMU_Close(pmu_handle);
+}
+
+
+static INLINE void USB_BMT_NO_CHARGING_OUT(void)
+{
+ DCL_HANDLE bmt_handler;
+ BMT_CTRL_SENDMES2UEM_T bmt_cmd_data1;
+
+ bmt_handler = DclBMT_Open(DCL_BMT,FLAGS_NONE);
+ bmt_cmd_data1.ChargerMsg = DCL_BMT_USB_NO_CHARGING_OUT;
+ DclBMT_Control(bmt_handler, BMT_CMD_SENDMES2UEM, (DCL_CTRL_DATA_T *)&bmt_cmd_data1); // New API with CMD & DATA
+}
+
+static INLINE void USB_BMT_NO_CHARGING_IN(void)
+{
+ DCL_HANDLE bmt_handler;
+ BMT_CTRL_SENDMES2UEM_T bmt_cmd_data1;
+
+ bmt_handler = DclBMT_Open(DCL_BMT,FLAGS_NONE);
+ bmt_cmd_data1.ChargerMsg = DCL_BMT_USB_NO_CHARGING_IN;
+ DclBMT_Control(bmt_handler, BMT_CMD_SENDMES2UEM, (DCL_CTRL_DATA_T *)&bmt_cmd_data1); // New API with CMD & DATA
+}
+
+
+#endif /* USB_ADAP_H */
+
diff --git a/mcu/driver/connectivity/usb_class/include/usb_debug_tool.h b/mcu/driver/connectivity/usb_class/include/usb_debug_tool.h
new file mode 100644
index 0000000..5bb18ba
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/usb_debug_tool.h
@@ -0,0 +1,1057 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+* A. Patent Notice:
+* The software delivered hereunder, including any and all updates and upgrades,
+* might be subject to patent rights of standard-setting organizations, patent pools
+* or their respective patent owners, that will be necessarily infringed by the use
+* and distribution of the products incorporating all or part of this software.
+* According to the licensing terms of these patent holders, it is your sole
+* obligation to obtain the necessary patent licenses from these patent holders
+* before you can use or distribute the products incorporating all or part of this
+* software. MediaTek shall not be liable for your failure to obtain or maintain such
+* licenses.
+*
+* As a courtesy to our customers, the following are some of the software that might
+* contain such patent licenses, but MediaTek does not warrant the accuracy or
+* completeness of the information below.
+* (1) MPEG4/AAC/AACPLUS/AACVPLUSV2: essential patents license must be obtained
+* from Via Licensing: <www.vialicensing.com>
+* (2) WAP/MMS security RC5 algorithm belongs to RSA Data Security:
+* <www.rsasecurity.com>
+* Notice: Please contact RSA to get this license before shipping the products to
+* USA which include RC5 security algorithm.
+*
+* B. In addition, customers must contact the respective licensors to obtain
+* necessary software licenses before it can use or distribute the licensed
+* products.
+*
+* As a courtesy to our customers, the following are some of the software licensers
+* and the notice or disclaimer required by their licenses, but MediaTek does not
+* warrant the accuracy or completeness of the information below.
+* (1) Microsoft Windows Media (WMA software):
+* Microsoft: <www.microsoft.com>
+* Approved OEM Manufacturers: <wmlicense.smdisp.net/oem_approved/>
+* Sample Windows Media Licensing Agreements:
+* <www.microsoft.com/windows/windowsmedia/licensing/agreements.aspx>
+* Notice in header or documentation: "This product is protected by certain
+* intellectual property rights of Microsoft and cannot be used or further
+* distributed without a license from Microsoft."
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usb_debug_tool.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb common driver debug buffer definitions
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USB_DEBUG_TOOL_H
+#define USB_DEBUG_TOOL_H
+
+
+#include "kal_general_types.h"
+
+
+
+/***********************************************
+ implement definition
+************************************************/
+
+#if defined(__LOW_COST_SUPPORT_ULC__)
+#define USB_DBG_DATA_SIZE 64
+#else
+#define USB_DBG_DATA_SIZE 512
+#endif
+
+
+typedef enum
+{
+ USB_EP0_SET_CONFIGURATION = 1,
+ USB_RESET,
+ USB_SUSPEND,
+ USB_RESUME,
+ USB_DISCONN,
+ USB_RELEASE_TYPE,
+ USB_DBG_CABLE_PLUG_IN,
+ USB_DBG_CABLE_PLUG_OUT,
+ USB_DMA_LISR,
+ USB_DBG_HISR,
+ USB_DBG_HISR_ERROR_REASON,
+ USB_DBG_IN_HOST_MODE,
+ USB_DBG_DMA_CALLBACK,
+ USB_HISR_ERROR,
+ USB_HISR_SUSPEND_AND_CONN_ISR,
+ USB_UNEXPECTED_RX_HISR,
+ USB_DBG_HISR_STALL_INTR,
+ USB_UPDATE_EP0_STATE_CLEAR_SENT_STALL,
+ USB_UPDATE_EP0_STATE_SEND_STALL,
+ USB_EPN_CLEAR_SENT_STALL_RX,
+ USB_EPN_CLEAR_SENT_STALL_TX,
+ USB_EPN_SEND_STALL_RX,
+ USB_EPN_SEND_STALL_TX,
+ USB_HISR_DMA_CALLBACK_1,
+ USB_HISR_DMA_CALLBACK_2,
+ USB_DBG_DMA_CALLBACK_2,
+ USB_HISR_DMA_CALLBACK_FAST_1,
+ USB_HISR_DMA_CALLBACK_FAST_2,
+ USB_HISR_EP0_TX,
+ USB_HISR_EP0_RX,
+ USB_EPN_CTRL_STALL,
+ USB_CLEAR_TX_EP_FIFO,
+ USB_CLEAR_RX_EP_FIFO,
+ USB_EPN_UNEXPECTED_TX_HISR,
+ USB_EPN_UNEXPECTED_RX_HISR,
+ USB_UPDATE_EP0_STATE_READ_END,
+ USB_UPDATE_EP0_STATE_WRITE_RDY,
+ USB_EP0_SET_ADDRESS,
+ USB_EP0_GET_DESCRIPTOR,
+ USB_EP0_SET_INTERFACE,
+ USB_EP0_GET_CONFIGURATION,
+ USB_EP0_GET_INTERFACE,
+ USB_EP0_CLEAR_FEATURE,
+ USB_EP0_SET_FEATURE,
+ USB_EP0_GET_STATUS_TX,
+ USB_EP0_GET_STATUS_RX,
+ USB_MS_STOP_DMA_0,
+ USB_MS_STOP_DMA_1,
+ USB_MS_STOP_DMA_2,
+ USB_MS_STOP_DMA_3,
+ USB_SET_PDN_FLAG_TRUE,
+ USB_SET_PDN_FLAG_FALSE,
+ USB_TASK_UNMASK_EINT,
+ USB_USBCFG_REQ,
+ USB_DBG_SET_TXPKTREADY,
+ USB_TXCSR_STAT,
+ USB_RXCSR_STAT,
+ USB_MASK_IRQ,
+ USB_UNMASK_IRQ,
+ USB_MEMORY_GET,
+ USB_MEMORY_FREE,
+#ifdef __USB_MASS_STORAGE_ENABLE__
+ USB_MS_BUILD_DMA_TX,
+ USB_MS_BUILD_DMA_TX_CALLBACK,
+ USB_MS_BUILD_DMA_RX,
+ USB_MS_BUILD_DMA_RX_CALLBACK,
+ USB_MS_FIFO_RX_HDLR,
+ USB_MS_FIFO_RX_WITH_WRONG_CBW_SIZE,
+// USB_MS_BUILD_DMA_RX_START_TIMER,
+// USB_MS_BUILD_DMA_RX_STOP_TIMER,
+// USB_MS_BUILD_DMA_RX_TIMEOUT,
+ USB_MS_ERROR_CMD,
+ USB_MS_EP0_RESET,
+ USB_MS_RESET_MSG,
+ USB_MS_RECEIVE_RESET_MSG,
+ USB_MS_SWITCH_TO_FIFO_RX_BY_USB_CONFIG,
+ USB_MS_GET_MAX_LUN,
+ USB_MS_CMD_CBW_IS_NOT_VALID,
+ USB_MS_CMD_TESTUNITREADY,
+ USB_MS_CMD_INQUIRY,
+ USB_MS_CMD_PREVALLOW_MEDIA_REMOVL,
+ USB_MS_CMD_USBMS_WRITE10,
+ USB_MS_CMD_USBMS_USB_END,
+ USB_MS_CMD_USBMS_MSDC,
+ USB_MS_CMD_USBMS_WRITE12,
+ USB_MS_CMD_USBMS_READ10,
+ USB_MS_CMD_USBMS_READ12,
+ USB_MS_CMD_READ_CAPACITY,
+ USB_MS_CMD_READ_FORMATCAPACITY,
+ USB_MS_CMD_REQUESTSENSE,
+ USB_MS_CMD_USBMS_VERIFY,
+ USB_MS_CMD_MODE_SENSE,
+ USB_MS_CMD_MODE_SENSE6,
+ USB_MS_CMD_START_STOP_UNIT,
+ USB_MS_CMD_SYNCHRONIZE_CACHE_10,
+ USB_MS_CMD_READ_TOC,
+ USB_MS_CMD_VENDOR,
+ USB_MS_LOCKFAT,
+ USB_MS_UNLOCKFAT,
+ USB_MS_LOCKFAT_FAIL,
+ USB_MS_READ_FAIL_HANDLER,
+#endif
+ USB_ACM_DMA_SETUP,
+ USB_ACM_DMA_SETUP_1,
+ USB_ACM_DMA_SETUP_2,
+ USB_ACM_DMA_SETUP_3,
+ USB_ACM_DMA_SETUP_4,
+ USB_ACM_DMA_CALLBACK,
+ USB_ACM_SEND_INTERRUPT,
+ USB_ACM_SEND_INTERRUPT1,
+ USB_ACM_SEND_INTERRUPT2,
+ USB_ACM_INTERRUPT_HANDLER,
+ USB_ACM_INTERRUPT_RESET,
+ USB_ACM_TIMEOUT,
+ USB_ACM_ESCAPE_CHAR,
+ USB_ACM_USB2UART_RNDIS_Intr,
+ USB_ACM_USB2UART_RNDIS_Error,
+ USB_ACM_USB2UART_RNDIS_Busy,
+ USB_ACM_USB2UART_PutUARTBytes,
+ USB_ACM_USB2UART_PutUARTByte,
+ USB_ACM_USB2UART_GetUARTByte,
+ USB_ACM_USB2UART_CtrlDCD,
+ USB_ACM_USB2UART_SendISRData,
+ USB_ACM_USB2UART_PutISRBytes,
+ USB_ACM_USB2UART_PutBytes,
+ USB_ACM_USB2UART_ClrTxBuffer,
+ USB_ACM_USB2UART_ClrRxBuffer,
+ USB_ACM_USB2UART_EP_DISABLE,
+ USB_ACM_USB2UART_EP_ENABLE,
+ USB_ACM_USB2UART_Clear_Tx_ISR_Buffer,
+ USB_ACM_USB2UART_Clear_Rx_ISR_Buffer,
+ USB_ACM_USB2UART_Clear_Tx_Buffer,
+ USB_ACM_USB2UART_Switch_port,
+ USB_ACM_SEND_SHORT_PKT,
+ USB_ACM_DMA_SEND_SHORT_PKT,
+ USB_ACM_RX_PKT,
+ USB_ACM_RX_PKT_LENGTH,
+ USB_ACM_RX_FLC_PKT_LENGTH,
+ USB_ACM_RX_NEXT_PKT_LENGTH,
+ USB_ACM_SEND_READY_TO_WRITE,
+ USB_ACM_SEND_READY_TO_READ,
+ USB_ACM_HIGH_SPEED_IF_ENABLE,
+ USB_ACM_HIGH_SPEED_IF_DISABLE,
+ USB_ACM_HIGHSPEED_PUTBYTES,
+ USB_ACM_HIGHSPEED_GETBYTES,
+ USB_ACM_HIGHSPEED_GET_FRAME,
+ USB_ACM_HIGHSPEED_PUTBYTES_SETUP_DMA,
+ USB_ACM_HIGHSPEED_MOVE_RC_INDEX,
+ USB_ACM_HIGHSPEED_MOVE_R_INDEX,
+ USB_ACM_HIGHSPEED_MOVE_W_INDEX,
+ USB_ACM_HIGHSPEED_RX_IS_EMPTY,
+ USB_ACM_HIGHSPEED_RX_BUF_COUNT,
+ USB_ACM_EP0_PUTBYTES,
+ USB_ACM_EP0_GETBYTES,
+ USB_ACM_EP0_MOVE_RC_INDEX,
+ USB_ACM_EP0_MOVE_R_INDEX,
+ USB_ACM_EP0_MOVE_W_INDEX,
+ USB_ACM_EP0_RX_IS_EMPTY,
+ USB_ACM_EP0_RX_BUF_COUNT,
+#ifdef PICTBRIDGE_SUPPORT
+ USB_DBG_PTP_GET_DEVICE_INFO,
+ USB_DBG_PTP_OPEN_SESSION,
+ USB_DBG_PTP_CLOSE_SESSION,
+ USB_DBG_PTP_GET_STORAGE_IDS,
+ USB_DBG_PTP_GET_STORAGE_INFO,
+ USB_DBG_PTP_GET_NUM_OBJECTS,
+ USB_DBG_PTP_GET_OBJECT_HANDLES,
+ USB_DBG_PTP_GET_OBJECT_INFO,
+ USB_DBG_PTP_GET_OBJECT,
+ USB_DBG_PTP_GET_THUMB,
+ USB_DBG_PTP_GET_PARTIAL_OBJECT,
+ USB_DBG_PTP_SEND_OBJECT_INFO,
+ USB_DBG_PTP_SEND_OBJECT,
+ USB_DBG_DPS_HREQUEST_CONF,
+ USB_DBG_DPS_HREQUEST_CONF_CANCEL,
+ USB_DBG_DPS_HRESPONSE_CONF,
+ USB_DBG_DPS_DREQUEST_REQ,
+ USB_DBG_DPS_2_DREQUEST_REQ_WARNING,
+ USB_DBG_DPS_DRESPONSE_REQ,
+ USB_DBG_DPS_START_JOB_REQ,
+ USB_DBG_DPS_CLOSE_JOB_REQ,
+ USB_DBG_PTP_CLOSE_FS_ERROR,
+#endif
+#ifdef __USB_IMAGE_CLASS__
+ USB_IMAGE_NULL_PKT_TIME_OUT,
+ USB_IMAGE_SEND_RESET_MSG,
+ USB_IMAGE_DEVICE_RESET,
+ USB_IMAGE_CABLE_PLUG_OUT,
+ USB_IMAGE_BUILD_DMA_TX,
+ USB_IMAGE_BUILD_RETURN_DMA_TX,
+ USB_IMAGE_BUILD_DMA_TX_CALLBACK,
+ USB_IMAGE_BUILD_DMA_RX,
+ USB_IMAGE_BUILD_DMA_RX_CALLBACK,
+ USB_IMAGE_SEND_INTERRUPT,
+ USB_IMAGE_SEND_INTERRUPT1,
+ USB_IMAGE_SEND_INTERRUPT2,
+ USB_IMAGE_SEND_INTERRUPT3,
+ USB_IMAGE_INTERRUPT_PKT_FULL,
+ USB_IMAGE_CANCEL_BY_DEVICE1,
+ USB_IMAGE_CANCEL_BY_DEVICE2,
+ USB_IMAGE_CANCEL_BY_DEVICE3,
+ USB_IMAGE_EP0_RESET,
+ USB_IMAGE_EP0_CANCEL,
+ USB_IMAGE_EP0_GET_DEVICE_STATUS,
+ USB_IMAGE_INTERRUPT_HANDLER,
+ USB_IMAGE_SESSION_NOT_OPEN_ERROR,
+ USB_IMAGE_EP0_CANCEL_WITH_WRONG_TRANSACTION_ID,
+#endif
+#ifdef __MTP_ENABLE__
+ USB_MTP_GET_DEVICE_INFO,
+ USB_MTP_OPEN_SESSION,
+ USB_MTP_CLOSE_SESSION,
+ USB_MTP_GET_STORAGE_IDS,
+ USB_MTP_GET_STORAGE_INFO,
+ USB_MTP_GET_NUM_OBJECTS,
+ USB_MTP_GET_OBJECT_HANDLES,
+ USB_MTP_GET_OBJECT_INFO,
+ USB_MTP_GET_OBJECT,
+ USB_MTP_DELETE_OBJECT,
+ USB_MTP_SEND_OBJECT_INFO,
+ USB_MTP_SEND_OBJECT,
+ USB_MTP_GET_DEVICE_PROP_DESC,
+ USB_MTP_GET_DEVICE_PROP_VALUE,
+ USB_MTP_SET_DEVICE_PROP_VALUE,
+ USB_MTP_GET_PARTIAL_OBJECT,
+ USB_MTP_GET_OBJECT_PROPS_SUPPORTED,
+ USB_MTP_GET_OBJECT_PROP_DESC,
+ USB_MTP_GET_OBJECT_PROP_VALUE,
+ USB_MTP_SET_OBJECT_PROP_VALUE,
+ USB_MTP_GET_OBJECT_PROP_LIST,
+ USB_MTP_GET_OBJECT_REFERENCES,
+ USB_MTP_SET_OBJECT_REFERENCES,
+ USB_MTP_SKIP,
+ USB_MTP_OPEN_SESSION_RSP,
+ USB_MTP_CLOSE_SESSION_RSP,
+ USB_MTP_GET_STORAGE_IDS_RSP,
+ USB_MTP_GET_STORAGE_INFO_RSP,
+ USB_MTP_GET_NUM_OBJECTS_RSP,
+ USB_MTP_GET_OBJECT_HANDLES_RSP,
+ USB_MTP_GET_OBJECT_INFO_RSP,
+ USB_MTP_GET_OBJECT_RSP,
+ USB_MTP_DELETE_OBJECT_RSP,
+ USB_MTP_SEND_OBJECT_INFO_RSP,
+ USB_MTP_SEND_OBJECT_RSP,
+ USB_MTP_GET_DEVICE_PROP_DESC_RSP,
+ USB_MTP_GET_DEVICE_PROP_VALUE_RSP,
+ USB_MTP_SET_DEVICE_PROP_VALUE_RSP,
+ USB_MTP_GET_PARTIAL_OBJECT_RSP,
+ USB_MTP_GET_OBJECT_PROPS_SUPPORTED_RSP,
+ USB_MTP_GET_OBJECT_PROP_DESC_RSP,
+ USB_MTP_GET_OBJECT_PROP_VALUE_RSP,
+ USB_MTP_SET_OBJECT_PROP_VALUE_RSP,
+ USB_MTP_GET_OBJECT_REFERENCES_RSP,
+ USB_MTP_SET_OBJECT_REFERENCES_RSP,
+ USB_MTP_SKIP_RSP,
+ USB_MTP_RECEIVE_RSP_MSG,
+ USB_MTP_NO_DATA_HDLR,
+ USB_MTP_TX_DATA_HDLR,
+ USB_MTP_TX_DATA_HDLR_1,
+ USB_MTP_TX_DATA_HDLR_2,
+ USB_MTP_TX_DATA_UNEXPECTED_ZERO_SIZE,
+ USB_MTP_TX_DATA_UNVALID_MSG,
+ USB_MTP_RX_DATA_UNVALID_MSG,
+ USB_MTP_RX_DATA_HDLR_1,
+ USB_MTP_TX_DMA_CALLBACK_HDLR,
+ USB_MTP_RX_DATA_CALLBACK_HDLR,
+ USB_MTP_RESPONSE_MSG_WITH_WRONG_STATE,
+ USB_IMAGE_RELEASE_MTP,
+ USB_IMAGE_PARSE_MTP_MSG,
+ USB_IMAGE_PARSE_MTP_EVENT_MSG,
+ USB_MTP_SEND_ENABLE_REQ_MSG,
+ USB_MTP_SEND_DISABLE_REQ_MSG,
+ USB_MTP_SEND_OP_REQ_MSG,
+ USB_MTP_SEND_ABORT_EVENT_MSG,
+ USB_MTP_IMAGE_OP_HDLR,
+ USB_MTP_HOST_SEND_PACKET_IN_WRONG_STATE,
+ USB_MTP_RECEIVE_ENABLE_RSP,
+ USB_MTP_RECEIVE_DISABLE_RSP,
+#endif
+#ifdef WEBCAM_SUPPORT
+ USB_VIDEO_PROBE_DONE,
+ USB_VIDEO_PROBE_COMMIT_DONE,
+ USB_VIDEO_PROBE_COMMIT_DONE_1,
+ USB_VIDEO_PROBE_COMMIT_DONE_2,
+ USB_VIDEO_PROBE_CONTROL_ERROR,
+ USB_VIDEO_STILL_PROBE_NONE,
+ USB_VIDEO_STILL_PROBE_DONE,
+ USB_VIDEO_STILL_PROBE_COMMIT_DONE,
+ USB_VIDEO_STILL_PROBE_CONTROL_ERROR,
+ USB_VIDEO_GET_VIDEO_BUF_1,
+ USB_VIDEO_GET_VIDEO_BUF_2,
+ USB_VIDEO_COMPLETE_VIDEO_BUF_1,
+ USB_VIDEO_COMPLETE_VIDEO_BUF_2,
+ USB_VIDEO_COMPLETE_VIDEO_BUF_3,
+ USB_VIDEO_COMPLETE_VIDEO_BUF_4,
+ USB_VIDEO_GET_STILL_BUF,
+ USB_VIDEO_COMPLETE_STILL_BUF,
+ USB_VIDEO_DMA_DONE_HDLR_1,
+ USB_VIDEO_DMA_DONE_HDLR_2,
+ USB_VIDEO_DMA_DONE_HDLR_3,
+ USB_VIDEO_STILL_DMA_DONE_HDLR,
+ USB_VIDEO_SEND_VIDEO_1,
+ USB_VIDEO_SEND_VIDEO_2,
+ USB_VIDEO_SEND_INCALL_JPEG,
+ USB_VIDEO_SEND_INCALL_JPEG_DMA_CALLBACK,
+ USB_VIDEO_SEND_INCALL_JPEG_DMA_DONE,
+ USB_VIDEO_SEND_INCALL_JPEG_DMA_DONE_HDLR_1,
+ USB_VIDEO_SEND_INCALL_JPEG_DMA_DONE_HDLR_2,
+ USB_VIDEO_INCALL_TIMEOUT_HDLR,
+ USB_VIDEO_STOP_MSG,
+#endif
+#ifdef __OTG_ENABLE__
+ USB_OTG_HISR,
+ USB_OTG_SET_STATUS,
+ USB_OTG_STATE_START,
+ USB_OTG_STATE_A_IDLE,
+ USB_OTG_STATE_A_WAIT_VRISE,
+ USB_OTG_STATE_A_WAIT_BCON,
+ USB_OTG_STATE_A_HOST,
+ USB_OTG_STATE_A_SUSPEND,
+ USB_OTG_STATE_A_PERIPHERALE,
+ USB_OTG_STATE_A_WAIT_VFALL,
+ USB_OTG_STATE_B_IDLE,
+ USB_OTG_STATE_B_SRP_INIT,
+ USB_OTG_STATE_B_PERIPHERAL,
+ USB_OTG_STATE_B_WAIT_ACON,
+ USB_OTG_STATE_B_HOST,
+ USB_OTG_STATE_FROM_A_IDLE_TO_A_WAIT_BCON,
+ USB_OTG_STATE_FROM_A_PERIPHERAL_TO_A_WAIT_BCON,
+ USB_OTG_STATE_FROM_A_WAIT_BCON_TO_A_HOST,
+ USB_OTG_STATE_FROM_A_HOST_TO_A_WAIT_BCON,
+ USB_OTG_STATE_FROM_A_HOST_TO_A_SUSPEND,
+ USB_OTG_STATE_FROM_A_SUSPEND_TO_A_WAIT_BCON,
+ USB_OTG_STATE_FROM_A_SUSPEND_TO_A_PERIPHERAL,
+ USB_OTG_STATE_FROM_A_SUSPEND_TO_A_HOST,
+ USB_OTG_STATE_FROM_B_IDLE_TO_B_PERIPHERAL,
+ USB_OTG_STATE_FROM_B_PERIPHERAL_TO_B_WAIT_ACON,
+ USB_OTG_STATE_FROM_B_WAIT_ACON_TO_B_HOST,
+ USB_OTG_STATE_FROM_B_WAIT_ACON_TO_B_PERIPHERAL,
+ USB_OTG_STATE_FROM_B_HOST_TO_B_PERIPHERAL,
+ USB_OTG_STATE_FROM_A_WAIT_VFAIL_TO_A_IDLE,
+ USB_OTG_B_DEVICE_PENDING_DOWN_HDLR,
+ USB_OTG_RESET,
+ USB_OTG_SESSREQ,
+ USB_OTG_RESUME,
+ USB_OTG_SOF,
+ USB_OTG_TIMEOUT_HDLR,
+#endif
+#if defined(__OTG_ENABLE__)||defined(__IC_USB_ENABLE__)
+ USB_HCD_UNMASK_HISR,
+ USB_HCD_RESUME,
+ USB_HCD_CONN,
+ USB_HCD_DISCONN,
+ USB_HCD_BABBLE,
+ USB_HCD_DMA_CALLBACK,
+ USB_HCD_DMA_TIMEOUT_ERROR,
+ USB_HCD_EP0_INTR,
+ USB_HCD_EPN_TX_INTR,
+ USB_HCD_EPN_RX_INTR,
+ USB_HCD_SEND_DATA_DONE,
+ USB_HCD_EP0_Setup,
+ USB_HCD_EP0_Data,
+ USB_HCD_EP0_Status,
+ USB_HCD_EP0_CSR0,
+ USBD_EP0_CMD_TAKE_MUTEX,
+ USBD_EP0_CMD_GIVE_MUTEX,
+ USBD_EP0_CMD_SET_EVENT,
+ USBD_EP0_CMD_REC_EVENT,
+ USBD_CH9_CALLBACK_ERROR,
+ USBD_CH9_CALLBACK_START,
+ USBD_CH9_CALLBACK_DELAY_SET_ADDR,
+ USBD_CH9_CALLBACK_TIME_OUT,
+ USBD_CH9_CALLBACK_SET_ADDR,
+ USBD_CH9_CALLBACK_GET_DEV_DESC_8,
+ USBD_CH9_CALLBACK_GET_DEV_DESC,
+ USBD_CH9_CALLBACK_GET_CONF_DESC_9,
+ USBD_CH9_CALLBACK_GET_CONF_DESC,
+ USBD_CH9_CALLBACK_SET_HNP_ENABLE,
+ USBD_CH9_CALLBACK_SET_CONF,
+ USBD_CH9_CALLBACK_SET_CONF_DONE,
+ USBD_HOST_STOP_VBUS,
+ USBD_RESUME,
+ USBD_SUSPEND,
+ USB_HOST_DEFAULT_STARTUP,
+ USB_HOST_MS_ERROR_HLDR,
+ USB_HOST_MS_CHECK_MEDIA,
+ USB_HOST_MS_QUERY_MEDIA,
+ USB_HOST_MS_RESET,
+ USB_HOST_MS_EP0_GET_LUN,
+ USB_HOST_MS_EP0_RESET,
+ USB_HOST_SET_EVENT,
+ USB_HOST_RETRIEVE_EVENT,
+ USB_HOST_MS_REQUEST_SENSE_1,
+ USB_HOST_MS_REQUEST_SENSE_2,
+ USB_HOST_MS_REQUEST_SENSE_3,
+ USB_HOST_MS_INQUIRY_1,
+ USB_HOST_MS_INQUIRY_2,
+ USB_HOST_MS_INQUIRY_3,
+ USB_HOST_MS_READ_FORMAT_CAPACITY_1,
+ USB_HOST_MS_READ_FORMAT_CAPACITY_2,
+ USB_HOST_MS_READ_FORMAT_CAPACITY_3,
+ USB_HOST_MS_READ_CAPACITY_1,
+ USB_HOST_MS_READ_CAPACITY_2,
+ USB_HOST_MS_READ_CAPACITY_3,
+ USB_HOST_MS_READ_CAPACITY_ERROR,
+ USB_HOST_MS_TEST_UNIT_READY_1,
+ USB_HOST_MS_TEST_UNIT_READY_2,
+ USB_HOST_MS_TEST_UNIT_READY_3,
+ USB_HOST_MS_MODE_SENSE6_1,
+ USB_HOST_MS_MODE_SENSE6_2,
+ USB_HOST_MS_MODE_SENSE6_3,
+ USB_HOST_MS_MODE_SENSE6_ALL_1,
+ USB_HOST_MS_MODE_SENSE6_ALL_2,
+ USB_HOST_MS_MODE_SENSE6_ALL_3,
+ USB_HOST_MS_MODE_SENSE10_ALL_1,
+ USB_HOST_MS_MODE_SENSE10_ALL_2,
+ USB_HOST_MS_MODE_SENSE10_ALL_3,
+ USB_HOST_MS_READ_1,
+ USB_HOST_MS_READ_2,
+ USB_HOST_MS_READ_3,
+ USB_HOST_MS_WRITE_1,
+ USB_HOST_MS_WRITE_2,
+ USB_HOST_MS_WRITE_3,
+ USB_HOST_MS_CTRL_EP_HDLR,
+ USB_HOST_MS_BULK_EP_HDLR,
+ USB_HOST_MS_HDLR,
+ USB_HOST_MS_STATE_HDLR,
+ USB_HOST_MS_STATE_HDLR_ERROR1,
+ USB_HOST_MS_STATE_HDLR_ERROR2,
+ USB_HOST_MS_BULK_EP_HDLR_ERROR1,
+ USB_HOST_MS_BULK_EP_HDLR_ERROR2,
+ USB_HOST_MS_CBW_HDLR,
+ USB_HOST_MS_DATA_HDLR,
+ USB_HOST_MS_CSW_HDLR,
+ USB_HOST_MS_START_TIMER,
+ USB_HOST_MS_STATE_MAIN_FALSE,
+ USB_HOST_MS_TIME_OUT,
+ USB_HOST_A_CABLE_PLUG_IN,
+ USB_HOST_A_CABLE_PLUG_OUT,
+ USB_HOST_EXCEPTIONS,
+ USB_HOST_MS_READSECTORS_1,
+ USB_HOST_MS_READSECTORS_2,
+ USB_HOST_MS_READSECTORS_3,
+ USB_HOST_MS_READSECTORS_4,
+ USB_HOST_MS_READSECTORS_5,
+ USB_HOST_MS_READSECTORS_6,
+ USB_HOST_MS_WRITESECTORS_1,
+ USB_HOST_MS_WRITESECTORS_2,
+ USB_HOST_MS_WRITESECTORS_3,
+ USB_HOST_MS_WRITESECTORS_4,
+ USB_HOST_MS_WRITESECTORS_5,
+ USB_HOST_MS_WRITESECTORS_6,
+ USB_HOST_MS_MOUNTDEVICE_1,
+ USB_HOST_MS_MOUNTDEVICE_2,
+ USB_HOST_MS_MOUNTDEVICE_3,
+ USB_HOST_MS_MOUNTDEVICE_4,
+ USB_HOST_MS_MEDIACHANGE_1,
+ USB_HOST_MS_MEDIACHANGE_2,
+ USB_HOST_MS_MEDIACHANGE_3,
+ USB_HOST_MS_MEDIACHANGE_4,
+ USB_HOST_MS_MEDIACHANGE_5,
+ USB_HOST_MS_GETDISKGEOMETRY_1,
+ USB_HOST_MS_GETDISKGEOMETRY_2,
+ USB_HOST_MS_GETDISKGEOMETRY_3,
+ USB_HOST_MS_GETDISKGEOMETRY_4,
+ USB_HOST_MS_GETDISKGEOMETRY_5,
+ USB_HOST_MS_MESSAGEACK_1,
+ USB_HOST_MS_MESSAGEACK_2,
+ USB_HOST_MS_MESSAGEACK_3,
+ USB_HOST_MS_MESSAGEACK_4,
+ USB_HOST_MS_MESSAGEACK_5,
+ USB_HOST_MS_REPORT_MEDIA_STATE,
+ USB_HOST_MS_WRONG_EP_MAXPKT_SIZE,
+ USB_OTG_MASK_HISR,
+ USB_OTG_UNMASK_HISR,
+ USB_OTG_STATE_A_WAIT_BCON_TURN_OFF_VBUS,
+ USB_HCD_CONN_AND_DISCONN,
+ USB_A_CABLE_OUT_BUT_NO_DISCONN,
+ USB_HCD_UNEXPECTED_TX_INTR,
+ USB_HCD_UNEXPECTED_RX_INTR,
+ USB_HCD_UNEXPECTED_EP0_INTR,
+ USB_OTG_MODE_SELECTION,
+#endif
+
+#ifdef __USB_STRESS_TEST__
+ DBG_USB_ECHO_Build_TX,
+ DBG_USB_ECHO_Build_RX,
+ DBG_USB_ECHO_TX_DMA_Callback,
+ DBG_USB_ECHO_RX_DMA_Callback,
+#endif
+ USB_EP_META_INIT,
+ USB_CMD_SetFeature,
+ USB_HCD_NAKTIMEOUT,
+ USB_DBG_MAX
+}USB_DBG_INFO;
+
+
+/***********************************************
+ Implement enum and structure
+************************************************/
+
+typedef struct
+{
+ USB_DBG_INFO tag;
+ kal_uint32 time;
+ kal_uint32 data1;
+ kal_uint32 data2;
+}Usb_Dbg_Data;
+
+
+typedef struct
+{
+ Usb_Dbg_Data dbg_data[USB_DBG_DATA_SIZE];
+ kal_uint16 dbg_data_idx;
+}Usb_Dbg_Struct;
+
+
+/***********************************************
+ function and global variable
+************************************************/
+extern void USB_Dbg_Trace(USB_DBG_INFO tag, kal_uint32 data1, kal_uint32 data2);
+
+
+#endif /* USB_DEBUG_TOOL_H */
+
diff --git a/mcu/driver/connectivity/usb_class/include/usb_host_acm_drv.h b/mcu/driver/connectivity/usb_class/include/usb_host_acm_drv.h
new file mode 100644
index 0000000..b371ffa
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/usb_host_acm_drv.h
@@ -0,0 +1,145 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+* A. Patent Notice:
+* The software delivered hereunder, including any and all updates and upgrades,
+* might be subject to patent rights of standard-setting organizations, patent pools
+* or their respective patent owners, that will be necessarily infringed by the use
+* and distribution of the products incorporating all or part of this software.
+* According to the licensing terms of these patent holders, it is your sole
+* obligation to obtain the necessary patent licenses from these patent holders
+* before you can use or distribute the products incorporating all or part of this
+* software. MediaTek shall not be liable for your failure to obtain or maintain such
+* licenses.
+*
+* As a courtesy to our customers, the following are some of the software that might
+* contain such patent licenses, but MediaTek does not warrant the accuracy or
+* completeness of the information below.
+* (1) MPEG4/AAC/AACPLUS/AACVPLUSV2: essential patents license must be obtained
+* from Via Licensing: <www.vialicensing.com>
+* (2) WAP/MMS security RC5 algorithm belongs to RSA Data Security:
+* <www.rsasecurity.com>
+* Notice: Please contact RSA to get this license before shipping the products to
+* USA which include RC5 security algorithm.
+*
+* B. In addition, customers must contact the respective licensors to obtain
+* necessary software licenses before it can use or distribute the licensed
+* products.
+*
+* As a courtesy to our customers, the following are some of the software licensers
+* and the notice or disclaimer required by their licenses, but MediaTek does not
+* warrant the accuracy or completeness of the information below.
+* (1) Microsoft Windows Media (WMA software):
+* Microsoft: <www.microsoft.com>
+* Approved OEM Manufacturers: <wmlicense.smdisp.net/oem_approved/>
+* Sample Windows Media Licensing Agreements:
+* <www.microsoft.com/windows/windowsmedia/licensing/agreements.aspx>
+* Notice in header or documentation: "This product is protected by certain
+* intellectual property rights of Microsoft and cannot be used or further
+* distributed without a license from Microsoft."
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usb_host_acm_drv.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for host CDC ACM class driver definitions
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USB_HOST_ACM_DRV_H
+#define USB_HOST_ACM_DRV_H
+
+//#include "kal_non_specific_general_types.h"
+#include "usbd.h"
+
+typedef struct
+{
+ /* device level resource */
+ USBH_EP_Struct ep_tx_info;
+ USBH_EP_Struct ep_rx_info;
+ USBH_Common_Struct common_info;
+}USB_Host_Acm_Struct;
+
+
+/************************************************************
+ extern variables and functions
+*************************************************************/
+
+extern USBD_ClassDriver_Struct USB_Host_Acm_Drv;
+extern USB_Host_Acm_Struct g_UsbHostAcm;
+
+
+
+#endif /* USB_HOST_ACM_DRV_H */
+
diff --git a/mcu/driver/connectivity/usb_class/include/usb_host_default_drv.h b/mcu/driver/connectivity/usb_class/include/usb_host_default_drv.h
new file mode 100644
index 0000000..76483e9
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/usb_host_default_drv.h
@@ -0,0 +1,93 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usb_host_default_drv.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for host default class driver definitions
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USB_HOST_DEFAULT_DRV_H
+#define USB_HOST_DEFAULT_DRV_H
+
+#include "usbd.h"
+
+
+#if defined(__OTG_ENABLE__)
+extern USBD_ClassDriver_Struct USB_Host_Ext_Default_Drv;
+#endif
+
+#if defined(__IC_USB_ENABLE__)
+extern USBD_ClassDriver_Struct USB_Host_Int_Default_Drv;
+#endif
+
+#endif /* USB_HOST_DEFAULT_DRV_H */
+
diff --git a/mcu/driver/connectivity/usb_class/include/usb_host_ms_adap.h b/mcu/driver/connectivity/usb_class/include/usb_host_ms_adap.h
new file mode 100644
index 0000000..588a217
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/usb_host_ms_adap.h
@@ -0,0 +1,95 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usb_host_ms_adap.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for host mass storage adaptaion layer definitaions (file system API)
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USB_HOST_MS_ADAP_H
+#define USB_HOST_MS_ADAP_H
+
+#include "fs_type.h"
+
+
+/* Read and write command sector size limitation, 64KB */
+#define USB_HOST_MS_RW_MAX_SEC_LEN 128
+
+
+/* Read and write command sector size limitation when data source is in D-cacheable region */
+#define USB_HOST_MS_RW_MAX_DCACHE_SEC_LEN 8
+
+
+/* OTG drive */
+extern FS_Driver FS_OTGDrv;
+
+#endif /* USB_HOST_MS_ADAP_H */
+
diff --git a/mcu/driver/connectivity/usb_class/include/usb_host_ms_drv.h b/mcu/driver/connectivity/usb_class/include/usb_host_ms_drv.h
new file mode 100644
index 0000000..bdf9ff3
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/usb_host_ms_drv.h
@@ -0,0 +1,424 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usb_host_ms_drv.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for host mass storage class driver definitions
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USB_HOST_MS_DRV_H
+#define USB_HOST_MS_DRV_H
+
+#include "usbms_drv.h"
+//#include "kal_non_specific_general_types.h"
+//#include "kal_release.h"
+#include "usbd.h"
+/************************************************************
+ MS class parameter definition
+*************************************************************/
+
+/* string size in INQUERY data format */
+#define USBMS_INQUIRY_VENDOR_INFO_LEN 8
+#define USBMS_INQUIRY_PRODUCT_IDEN_LEN 16
+#define USBMS_INQUIRY_PRODUCT_REV_LEN 4
+
+/* command and adta length for each ms command */
+#define USBMS_INQUIRY_CMD_LEN 6
+#define USBMS_INQUIRY_DATA_LEN 36
+#define USBMS_READ_FORMATCAPACITY_CMD_LEN 10
+#define USBMS_READ_FORMATCAPACITY_DATA_LEN 12
+#define USBMS_READ_CAPACITY_CMD_LEN 10
+#define USBMS_READ_CAPACITY_DATA_LEN 8
+#define USBMS_MODE_SENSE6_CMD_LEN 6
+#define USBMS_MODE_SENSE6_DATA_LEN 4
+#define USBMS_MODE_SENSE_CMD_LEN 10
+#define USBMS_MODE_SENSE_DATA_LEN 4
+#define USBMS_REQUESTSENSE_CMD_LEN 12
+#define USBMS_REQUESTSENSE_DATA_LEN 18
+#define USBMS_TEST_UNIT_READY_CMD_LEN 6
+#define USBMS_TEST_UNIT_READY_DATA_LEN 0
+#define USBMS_READ_CMD_LEN 10
+#define USBMS_WRITE_CMD_LEN 10
+
+#define USBMS_CBW_LENGTH 31
+#define USBMS_CSW_LENGTH 13
+#define USBMS_CBWCB_LENGTH 16
+
+/************************************************************
+ Implementation definition
+*************************************************************/
+/* State machine polling periord*/
+#define USB_HOST_MS_QUERY_PERIOD 40 /* 10ms unit */
+
+/* Maxumum buffer size for CBW command and DATA except READ and WRITE command */
+#define USBMS_MAX_CMD_LEN 16
+#define USBMS_MAX_DATA_LEN 64
+
+/* Event flag. (CBW, DATA, CSW) is handled in HISR level
+ This event is used when state complete to retrive waiting task*/
+#define EVENT_USB_MS_DONE ((kal_uint32)0x00000001)
+#define EVENT_USB_MS_DETATCH ((kal_uint32)0x00000002)
+
+/* This is constraint by both secotr size and device DMA length */
+/* DMA length can not exceed 0xffff=>65535 */
+#define USBMS_MAX_DATA_LENGTH (32*1024)
+
+
+// USB Host Max Support Number = ICUSB + OTG
+#define USB_MAX_MS_NUM 1 //
+
+
+/* Bulk endpoint state*/
+typedef enum
+{
+ USB_HOST_MS_NONE,
+ USB_HOST_MS_CBW,
+ USB_HOST_MS_DATA,
+ USB_HOST_MS_CSW,
+ USB_HOST_MS_CBW_CLEAR_STALL,
+ USB_HOST_MS_DATA_CLEAR_STALL,
+ USB_HOST_MS_CSW_CLEAR_STALL
+}USB_HOST_MS_STATE;
+
+/* DATA stage direction */
+typedef enum
+{
+ USB_HOST_MS_DATA_NONE, /* no data phase is needed */
+ USB_HOST_MS_DATA_RECV,
+ USB_HOST_MS_DATA_SEND
+}USB_HOST_MS_DATA_DIR;
+
+/* Result of the CBW, DATA, CSW state */
+typedef enum
+{
+ USB_HOST_MS_RESULT_OK,
+ USB_HOST_MS_RESULT_CSW_FAIL,
+ USB_HOST_MS_RESULT_TIMEOUT,
+ USB_HOST_MS_RESULT_NO_RESPONSE,
+ USB_HOST_MS_RESULT_STALL,
+ USB_HOST_MS_RESULT_FORMAT_ERROR
+}USB_HOST_MS_RESULT;
+
+/* Ctrl EP commands that may used after MS class driver is started
+ Note that it contains both standard and class specific request */
+typedef enum
+{
+ USB_HOST_MS_EP0_CMD_NONE,
+ USB_HOST_MS_EP0_CMD_RESET,
+ USB_HOST_MS_EP0_CMD_GET_LUN,
+ USB_HOST_MS_EP0_CMD_CLEAR_STALL_IN,
+ USB_HOST_MS_EP0_CMD_CLEAR_STALL_OUT
+}USB_HOST_MS_EP0_CMD;
+
+
+/* The MS device status */
+typedef enum
+{
+ USB_HOST_MS_DEV_STATE_READY,
+ USB_HOST_MS_DEV_STATE_ERROR,
+ USB_HOST_MS_DEV_STATE_FATAL_ERROR
+}USB_HOST_MS_DEV_STATE;
+
+/* The media state for each LUN */
+typedef enum
+{
+ USB_HOST_MS_MEDIA_STATE_ABSENT,
+ USB_HOST_MS_MEDIA_STATE_READY,
+ USB_HOST_MS_MEDIA_STATE_WR_PROTECT,
+ USB_HOST_MS_MEDIA_STATE_CHANGED,
+ USB_HOST_MS_MEDIA_STATE_ERROR
+}USB_HOST_MS_MEDIA_STATE;
+
+typedef enum
+{
+ USB_HOST_MS_MSG_MEDIA_CHANGE,
+ USB_HOST_MS_MSG_PLUG_IN,
+ USB_HOST_MS_MSG_PLUG_OUT
+}USB_HOST_MS_MSG_TYPE;
+
+
+/************************************************************
+ Implementation structures
+*************************************************************/
+
+/* CBW and DATA related parameters */
+typedef struct
+{
+ kal_uint8 lun;
+ kal_uint32 cmd_len;
+ kal_uint8 *cmd_buff;
+ kal_uint32 data_len;
+ kal_uint8 *data_buff;
+ USB_HOST_MS_DATA_DIR data_dir;
+}USBH_Ms_Cmd_Struct;
+
+/* Media information for each LUN */
+typedef struct
+{
+ kal_uint32 sec_size;
+ kal_uint32 sec_num;
+ USB_HOST_MS_MEDIA_STATE state;
+ USB_HOST_MS_MEDIA_STATE pre_state;
+
+ kal_uint8 vendor_info[USBMS_INQUIRY_VENDOR_INFO_LEN];
+ kal_uint8 product_iden[USBMS_INQUIRY_PRODUCT_IDEN_LEN];
+ kal_uint8 product_rev[USBMS_INQUIRY_PRODUCT_REV_LEN];
+}USBH_Ms_Media_Struct;
+
+
+
+typedef struct
+{
+ /* device level resource */
+ USBH_EP_Struct ep_tx_info;
+ USBH_EP_Struct ep_rx_info;
+ USBH_Common_Struct common_info;
+
+ kal_eventgrpid event_id; /* event used for (CBW, DATA, CSW) state machine to retrive waiting task */
+ kal_mutexid mutex_id; /* mutex used to protect ms command. When USB task is polling state machine, read/write action from application task should be protected */
+ kal_uint32 gpt_handle; /* gpt handle to query device status */
+ kal_uint32 sleep_timer_handle; /* use timer to check whether App need to use Device or not */
+ kal_uint16 sleep_time;
+
+ /* CBW, DATA CSW state information*/
+ kal_uint32 CBWdata[32/4]; /* CBW data */
+ UsbMs_CSW CSW; /* CSW data*/
+ kal_uint8* data; /* DATA stage buffer address*/
+ kal_uint32 data_length; /* DATA stage size */
+ USB_HOST_MS_DATA_DIR data_dir; /* DATA stage direction */
+ /* DATA stage parameters. If data length application request is larger than DMA can support,
+ CBW, DATA, CSW state machine should divide it to multiple request */
+ kal_uint32 remain_data_length;
+ kal_uint32 sending_data_length;
+ kal_uint32 sent_data_length;
+ USBH_Ms_Cmd_Struct ms_cmd_data; /* Used to store all CBW, DATA related information */
+ USB_HOST_MS_STATE ms_state; /* State in the state machine of CBW, DATA, CSW */
+ USB_HOST_MS_RESULT result; /* CBW, DATA, CSW state result */
+ kal_bool b_rw_result; /* read/write result for READ and WRITE action */
+
+ /* EP0 information*/
+ USB_HOST_MS_EP0_CMD ms_cmd; /* Current EP0 command */
+
+ kal_uint8 *buffer_address; // transfer data if using cacheable buffer
+
+ /* media information */
+ kal_uint8 total_lun; /* total lun number in the attached device */
+// kal_uint8 support_lun; /* supported lun defined in custom */
+ USBH_Ms_Media_Struct *media_info; /* media information for each LUN*/
+ kal_uint8 *media_handle; /* media handle communicated with file system */
+ kal_uint32 *media_msg_array; /* message array communicated with FMT */
+ kal_uint32 media_state_change; /* keep information about whether each lun state is changed or not */
+
+ /* device information*/
+ USB_HOST_MS_DEV_STATE dev_state; /* device status*/
+ kal_bool dev_attatch;
+ kal_uint8 dev_error_count; /* device error count */
+ kal_bool b_sending_change_ilm; /* Check it can send message to indicate FMT*/
+ kal_bool b_sending_plugout_ilm;
+
+ USB_EP_DIRECTION stall_ep_dir;
+
+
+#ifdef __USB_OTG_RX_TEST__
+ kal_bool host_ms_rx_test_flag;
+#endif
+
+#ifdef __USB_OTG_TX_TEST__
+ kal_bool host_ms_tx_test_flag;
+#endif
+// kal_bool b_sending_disconn_ilm;
+}USB_Host_Ms_Struct;
+
+
+/************************************************************
+ extern variables and functions
+*************************************************************/
+
+ extern USBD_ClassDriver_Struct USB_Host_Ms_Drv;
+extern USB_Host_Ms_Struct g_UsbHostMs[USB_MAX_MS_NUM];
+
+extern kal_uint8 USB_MS_Check_index(kal_uint8 usb_ip_port);
+extern void USB_Host_Ms_Sleep_Timeout(void *parameter);
+extern kal_uint8 USB_MS_IP_Query(kal_uint8 lun);
+extern void USB_Host_Ms_SendInd(kal_uint8 ms_index,USB_HOST_MS_MSG_TYPE msg);
+extern void USB_Host_Ms_Get_Media_Resource(kal_uint8 ms_index);
+extern void USB_Host_Ms_Free_Media_Resource(kal_uint8 ms_index);
+extern void USB_Host_Ms_En_Device(USBH_Common_Struct common_str);
+extern void USB_Host_Ms_Check_Media_State(kal_uint8 ms_index);
+extern void USB_Host_Ms_Get_LUN(kal_uint8 ms_index);
+extern void USB_Host_Ms_Reset(kal_uint8 ms_index);
+extern void USB_Host_Ms_Clear_Stall(kal_uint8 ms_index);
+extern USB_HOST_MS_RESULT USB_Host_Ms_Request_Sense(kal_uint8 lun);
+extern USB_HOST_MS_RESULT USB_Host_Ms_Inquiry(kal_uint8 lun);
+extern USB_HOST_MS_RESULT USB_Host_Ms_Read_Format_Capacity(kal_uint8 lun);
+extern USB_HOST_MS_RESULT USB_Host_Ms_Read_Capacity(kal_uint8 lun);
+extern USB_HOST_MS_RESULT USB_Host_Ms_Test_Unit_Ready(kal_uint8 lun);
+extern USB_HOST_MS_RESULT USB_Host_Ms_Mode_Sense6(kal_uint8 lun);
+extern USB_HOST_MS_RESULT USB_Host_Ms_Mode_Sense6_All_Mode(kal_uint8 lun);
+extern USB_HOST_MS_RESULT USB_Host_Ms_Mode_Sense10_All_Mode(kal_uint8 lun);
+extern USB_HOST_MS_RESULT USB_Host_Ms_Read(kal_uint8 lun, kal_uint32 sec_start, kal_uint16 sec_num, kal_uint8* data);
+extern USB_HOST_MS_RESULT USB_Host_Ms_Write(kal_uint8 lun, kal_uint32 sec_start, kal_uint16 sec_num, kal_uint8* data);
+
+#endif /* USB_HOST_MS_DRV_H */
+
diff --git a/mcu/driver/connectivity/usb_class/include/usb_host_ms_state.h b/mcu/driver/connectivity/usb_class/include/usb_host_ms_state.h
new file mode 100644
index 0000000..3d7a8e8
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/usb_host_ms_state.h
@@ -0,0 +1,82 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usb_host_ms_state.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for host mass storage class state machine definitions
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USB_HOST_MS_STATE_H
+#define USB_HOST_MS_STATE_H
+
+
+extern void USB_Host_Ms_State_Start(kal_uint8 usb_ip_port);
+extern void USB_Host_Ms_State_Main(kal_uint8 usb_ip_port);
+
+
+#endif /* USB_HOST_MS_DRV_H */
+
diff --git a/mcu/driver/connectivity/usb_class/include/usb_mode.h b/mcu/driver/connectivity/usb_class/include/usb_mode.h
new file mode 100644
index 0000000..4fe6fec
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/usb_mode.h
@@ -0,0 +1,341 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usb_mode.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb mode selection definitions
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USB_MODE_H
+#define USB_MODE_H
+
+
+#include "usb_comm.h"
+#include "usb.h"
+#ifdef __OTG_ENABLE__
+#include "otg.h"
+#endif
+#include "kal_general_types.h"
+
+#define USB_MAX_COMPOSITE_DEVICES 10
+
+typedef enum
+{
+ USB_MODE_NONE = 0,
+ USB_MODE_NVRAM_READ_DONE,
+ USB_MODE_BMT_READ_DONE,
+ USB_MODE_FT_START_DONE
+}USB_MODE_PRARM;
+
+typedef enum
+{
+ USBDL_MODE_NONE = 0,
+ USBDL_MODE_USB_DOWNLOAD,
+ USBDL_MODE_FAST_META
+}USBDL_MODE_PRARM;
+
+
+typedef enum
+{
+ USB_MODE_CABLE_PLUGOUT,
+ USB_MODE_CABLE_A_PLUGIN,
+ USB_MODE_CABLE_B_PLUGIN,
+ USB_MODE_CABLE_ERROR,
+ USB_MODE_CABLE_UNSUPPORT
+}USB_MODE_CABLE_TYPE;
+
+
+typedef struct
+{
+ USB_Comport_Boot_Status usb_comport_boot; /* a flag to check if usb boot as com port */
+ USB_Comport_OS_Driver_Status usb_comport_driver; /* a flag to check OS version for usb comport usage */
+ kal_uint8 mode_param;
+ kal_uint8 com_port_num;
+ USB_MODE_CABLE_TYPE cable_type;
+ USB_MODE_CABLE_TYPE previous_cable_type;
+#if defined(__USB_MASS_STORAGE_ENABLE__)||defined(__MTP_ENABLE__)
+ kal_bool b_ms_first_plugin; /*whether it is first plug in or not in ms mode */
+ kal_bool b_usb_boot_with_ms;
+#endif
+#ifdef __OTG_ENABLE__
+ kal_bool b_start_srp; /* set in OTG_Start_SRP */
+ kal_bool b_start_hnp; /* Check if start HNP */
+ kal_bool b_usb_pdnmode; /* Check if phy power down or not */
+#endif
+#ifdef __IC_USB_ENABLE__
+ kal_bool b_int_usb_detect; // ICUSB enter Host mode
+#endif
+#if defined(__DM_LAWMO_SUPPORT__)
+ kal_bool b_lock_usb_boot;
+#endif
+ kal_bool usb_config_result; /* configure may be fail */
+ kal_bool usb_boot; /* is in usb boot mode */
+ kal_bool usb_menu_en; // pop up menu or not
+ kal_bool usb_cdrom_en;//config as cd rom or not
+}Usb_Mode_Struct;
+
+
+extern Usb_Mode_Struct g_UsbMode;
+
+extern void USB_Init_Mode(void);
+#ifdef __OTG_ENABLE__
+extern void OTG_Mode_Selection(void);
+#else
+extern void USB_Mode_Selection(void);
+#endif
+
+extern void USB_Config_Type(USB_DEVICE_TYPE type, kal_bool b_enable, kal_uint32 *parameter);
+extern void USB_Release_Type(kal_bool b_enable, kal_bool b_plugout);
+extern void USB_Init_Normal_Mode_Ms(void);
+extern kal_bool USB_Check_Composite_With_COM(USB_DEVICE_TYPE type);
+
+//extern void USB_Init_Normal_Mode_Ms(kal_uint32* mem_addr);
+extern void USB_End_Normal_Mode_Ms(void);
+
+#ifdef __OTG_ENABLE__
+extern void OTG_Hdlr_Select(OTG_HDLR_TASK_TYPE type, kal_uint32 *parameter);
+#endif
+
+extern void USB_Init_Ms(kal_bool bFirst);
+extern void USB_Init_ACM_In_Meta(void);
+extern void USB_Init_ACM_In_AT_Mode(void);
+
+extern USBDL_MODE_PRARM USBDL_Mode_Type(void);
+extern kal_bool USB_Exception_Check(void);
+
+
+extern kal_bool USB_Boot_With_MS(void);
+#ifdef __MTP_ENABLE__
+extern void USB_Init_MTP(kal_bool bFirst);
+#endif
+
+extern void USB_Mode_Switch(USB_DEVICE_TYPE type);
+extern void USB_Composite_Device_Table_Reset(void);
+extern void USB_Composite_Device_Table_Register(USB_COMPOSITE_DEVICE_TYPE type);
+
+#endif //USB_MODE_H
+
diff --git a/mcu/driver/connectivity/usb_class/include/usb_resource.h b/mcu/driver/connectivity/usb_class/include/usb_resource.h
new file mode 100644
index 0000000..f457ee2
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/usb_resource.h
@@ -0,0 +1,190 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usb_resource.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb resource management definitions
+ *
+ * Author:
+ * -------
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USB_RESOURCE_H
+#define USB_RESOURCE_H
+
+
+#include "usb.h"
+#include "drv_comm.h"
+#include "kal_general_types.h"
+
+/***********************************************
+ implement enum and structure
+************************************************/
+
+/* interface create infomration structrue, use this information to create interface */
+typedef struct
+{
+ kal_char *if_name_ptr;
+ usb_create_if_func_ptr if_create_func;
+ usb_void_func if_init_func;
+ usb_void_func if_enable_func;
+ usb_void_func if_resume_func;
+} Usb_IfCreate_Info;
+
+
+typedef struct
+{
+ kal_uint8 device_code; /*device class*/
+ kal_uint8 subclass_code;
+ kal_uint8 protocol_code;
+ kal_uint16 product_code;
+ kal_bool b_registerd;
+} Usb_Device_Code;
+
+
+/***********************************************
+ function and global variable
+************************************************/
+
+extern void USB_Software_Create(void);
+extern void USB_Software_Speed_Init(kal_bool b_other_speed);
+extern void USB_Software_Init(void);
+extern void USB_Software_Resume(void);
+extern void USB_Software_Enable(void);
+
+
+
+#endif /* USB_RESOURCE_H */
+
diff --git a/mcu/driver/connectivity/usb_class/include/usb_task.h b/mcu/driver/connectivity/usb_class/include/usb_task.h
new file mode 100644
index 0000000..4b14da2
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/usb_task.h
@@ -0,0 +1,180 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usb_task.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb task definitions
+ *
+ * Author:
+ * -------
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USB_TASK_H
+#define USB_TASK_H
+
+#include "syscomp_config.h"
+#include "usb_comm.h"
+#include "kal_general_types.h"
+
+
+
+/* cable status, plugin/plugout */
+typedef enum
+{
+ USB_CABLE_PLUGOUT,
+ USB_CABLE_PLUGIN
+} USB_CABLE_STATUS;
+
+/* messages sent to other tasks */
+typedef enum
+{
+#ifdef __P_PROPRIETARY_COPYRIGHT__
+ USB_SEND_MSG_MS_INIT_DONE,
+#endif
+
+ USB_SEND_BMT_START_CHARGE,
+ USB_SEND_BMT_STOP_CHARGE,
+ USB_SEND_BMT_CHARGE_MIN,
+ USB_SEND_BMT_CHARGE_MAX,
+ USB_SEND_MSG_PLUG_IN,
+ USB_SEND_MSG_PLUG_OUT,
+ USB_SEND_MSG_READ_UNIQUE_STRING,
+ USB_SEND_MSG_USB_SUSPEND
+}USB_SEND_MSG_TYPE;
+
+
+extern kal_bool usb_create(comptask_handler_struct **handle);
+extern void USB_Send_Msg(USB_SEND_MSG_TYPE usb_msg_type);
+extern void USB_Send_Config_Cnf_Msg(USB_DEVICE_TYPE mode, kal_bool result);
+extern void USB_Get_Serial_Value(void);
+
+#endif //USB_TASK_H
+
diff --git a/mcu/driver/connectivity/usb_class/include/usb_trc.h b/mcu/driver/connectivity/usb_class/include/usb_trc.h
new file mode 100644
index 0000000..6be891f
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/usb_trc.h
@@ -0,0 +1,624 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usb_trc.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file defines the index trace of USB module
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *==============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+#ifndef _USB_TRC_H
+#define _USB_TRC_H
+
+#include "kal_trace.h"
+#include "kal_public_defs.h" //MSBB change #include "stack_config.h"
+
+#ifdef __TST_MODULE__
+ #ifndef GEN_FOR_PC
+ #ifndef _STACK_CONFIG_H
+ #error "stack_config.h should be included before tst_config.h"
+ #endif
+ #endif /* GEN_FOR_PC */
+
+ #ifndef _KAL_TRACE_H
+ #error "kal_trace.h should be included before tst_trace.h"
+ #endif
+
+#if !defined(GEN_FOR_PC)
+#if defined(__TST_MODULE__) || defined(__CUSTOM_RELEASE__)
+ #include "usb_trc_gen.h"
+#endif /* TST Trace Defintion */
+#endif
+ BEGIN_TRACE_MAP(MOD_UART1_HISR)
+
+ TRC_MSG(USB_RESET_TIMES, "USB reset %d times")
+ TRC_MSG(USB_IS_SUSPEND, "USB is suspend")
+ TRC_MSG(USB_IS_RESUME, "USB is resume")
+ TRC_MSG(USB_IS_DISCONN, "USB is disconnect")
+ TRC_MSG(USB_IS_CONFIGURE, "USB is configured")
+ TRC_MSG(USB_CONFIG_NUM, "USB configure number is %d , USB support current table index is %d")
+ TRC_MSG(USB_CURRENT_TABLE, "USB support current is %x")
+ TRC_MSG(USB_EP0_SetFeature, "USB cmd clear/set Feature")
+ TRC_MSG(USB_EP0_Clear_Stall,"USB Clear EndPoint")
+ TRC_MSG(USB_EP0_SET_ADDR,"USB Set Address")
+ TRC_MSG(USB_EP0_GET_DESCRIPT,"USB Get Descriptor")
+ TRC_MSG(USB_EP0_SET_CONFIG,"USB Set Configuration")
+ TRC_MSG(USB_EP0_GET_CONFIG,"USB Get Configuration")
+ TRC_MSG(USB_EP0_SET_INTER,"USB Set Interface")
+ TRC_MSG(USB_EP0_GET_INTER,"USB Get Interface")
+ TRC_MSG(USB_EP0_GET_STAT,"USB Get Status")
+ TRC_MSG(USB_EP0_UNSUPPORT,"USB ep0 un-expected Command")
+ TRC_MSG(USB_PLUG_OUT, "USB is plugged out")
+ TRC_MSG(USB_GET_MEMORY_ADDR, "USB memory left: %x , Memory length : %d")
+ TRC_MSG(USB_HISR_State, "USB interrupt state %x ,USB mode %x , Line_State %x , OP_State %x")
+ TRC_MSG(USB_EP_UNEXPECTED_TX_HISR, "USB TX ep %d have a unexpected interrupt with TXCSR %d")
+ TRC_MSG(USB_EP_UNEXPECTED_RX_HISR, "USB RX ep %d have a unexpected interrupt with RXCSR %d")
+ TRC_MSG(USB_DRV_IS_ERROR_1, "HW ERROR: error status is %d, fast mode status is %d")
+ TRC_MSG(USB_DRV_IS_ERROR_2, "HW ERROR in host mode")
+ TRC_MSG(USB_DRV_IS_ERROR_3, "HW ERROR D+ down")
+ TRC_MSG(USB_Register, "USB Register Address: 0x%x , Value: 0x%x ")
+ TRC_MSG(USB_DRV_RX_ERROR, "USB received a RX endpoint intr no %d with status %x")
+ TRC_MSG(USBACM_DMA_Setup, "USB DMA Setup %d bytes by USB port %d")
+ TRC_MSG(USBACM_DMA_Running, "USB DMA Running on endpoint %d by USB port %d")
+ TRC_MSG(USB_RESET_Data_Toggle, "USB DMA Running just before Clear Feature on endpoint %d")
+ TRC_MSG(USB_HW_State, "USB OP state %x Line state %x")
+ TRC_MSG(USB_TX_DEBUG, "USB TXCSR %x DMA State %x")
+ TRC_MSG(USB_RX_DEBUG, "USB RXCSR %x DMA State %x")
+ TRC_MSG(USB_DMA_DEBUG, "USB DMA Count %d Real Count %d")
+ TRC_MSG(USB_REMOTE_WAKEUP, "USB REMOTE WAKEUP %d")
+ TRC_MSG(USB_DMA_HW_Intr,"USB DMA Interrupt %d")
+ TRC_MSG(USBACM_DMA_CALLBACK, "USB DMA TX callback %d bytes by USB port %d")
+ TRC_MSG(USBACM_DMA_Setup2, "USB DMA Setup Again by USB port %d")
+ TRC_MSG(USBACM_DMA_Setup0, "DMA with no Data and doesn't setup by USB port %d")
+ TRC_MSG(USB_UTMI_SIGNAL, "UTMI Signal 61A = %x 61B = %x 61C = %x 61D = %x")
+ TRC_MSG(USB_TXCSR_SET2, "USB TXCSR Setup with USB_TXCSR_TXPKTRDY already set")
+ TRC_MSG(USB_TXCSR_SET, "USB DMA Callback and set TXCSR for short packet")
+ TRC_MSG(USBACM_CTRL_DCD, "USB COMPORT: Ctrl DCD to USB port %d")
+ TRC_MSG(USBACM_CTRL_BREAK, "USB COMPORT: Ctrl Break to USB port %d")
+ TRC_MSG(USBACM_SET_BAUDRATE, "USB COMPORT: Set BaudRate to USB port %d")
+ TRC_MSG(USBACM_SET_AUTO_BAUDRATE, "USB COMPORT: Set AutoBaud Div to USB port %d")
+ TRC_MSG(USBACM_CTRL_RI, "USB COMPORT: Ctrl RI to USB port %d")
+ TRC_MSG(USBACM_CTRL_DTR, "USB COMPORT: Ctrl DTR to USB port %d")
+ TRC_MSG(USBACM_THRESHOLD_ON, "Set threshold is ON to USB port %d")
+ TRC_MSG(USBACM_THRESHOLD_OFF, "Set threshold is OFF to USB port %d")
+ TRC_MSG(USBACM_PC_SENT, "PC sent %d bytes to USB port %d")
+ TRC_MSG(USBACM_RESET_READY_TO_READ_FLAG, "reset ready to read flag by USB port %d")
+ TRC_MSG(USBACM_INIT_READY_TO_READ_FLAG, "initialize ready to read flag by USB port %d")
+ TRC_MSG(USBACM_OPEN_READY_TO_READ_FLAG, "open by %d owner reset ready to read flag by USB port %d")
+ TRC_MSG(USBACM_CLEAR_RX_BUF_READY_TO_READ_FLAG, "Clear RX buf by %d owner reset ready to read flag to USB port %d")
+ TRC_MSG(USBACM_CLEAR_TX_BUF_READY_TO_READ_FLAG, "Clear TX buf by %d owner reset ready to read flag to USB port %d")
+ TRC_MSG(USBACM_INTR, "ACM intr pipe sent %d bytes by USB port %d")
+ TRC_MSG(USBACM_CLEAR_TX_ISR_BUF, "Clear TX ISR buffer to USB port %d")
+ TRC_MSG(USBACM_OPEN, "USB ACM UART OPEN to USB port %d")
+ TRC_MSG(USBACM_CLOSE, "USB ACM UART close by %d owner to USB port %d")
+ TRC_MSG(USBACM_SET_OWNER, "USB ACM set %d owner to USB port %d")
+// TRC_MSG(USBACM_SEND_ISR_DATA, "USB ACM send ISR data %d bytes by USB port %d")
+// TRC_MSG(USBACM_PUT_ISR_BYTES, "USB ACM put ISR bytes %d bytes by USB port %d")
+ TRC_MSG(USBACM_PUT_BYTES, "USB ACM put bytes %d bytes to USB port %d")
+ TRC_MSG(USBACM_PUT_BYTES_FAIL, "USB ACM put bytes fail due to USB wrong state")
+ TRC_MSG(USBACM_PUT_BYTES_BUF_FULL, "USB ACM buffer is full because put bytes by %d owner to USB port %d")
+ TRC_MSG(USBACM_CLEAR_RX_BUF, "USB ACM clear RX buffer by USB port %d")
+ TRC_MSG(USBACM_GET_BYTES_BUF_EMPTY, "USB ACM buffer is empty because get bytes by %d owner to USB port %d")
+ TRC_MSG(USBACM_FAIL_NOT_UNMASK, "USB ACM not unmask because USB fail by USB port %d")
+ TRC_MSG(USBACM_GET_BYTES, "USB ACM get bytes %d bytes to USB port %d")
+ TRC_MSG(USBACM_CLEAR_TX_BUF, "USB ACM clear TX buffer to USB port %d")
+ TRC_MSG(USBACM_CLEAR_RDY_W, "USB ACM clear readt to write flag by %d owner to USB port %d")
+ TRC_MSG(USBACM_EP0_COMMAND, "USB ACM EP0 Command %d by USB port %d")
+// TRC_MSG(USBACM_TX_CLEAR_UNDERRUN, "USB Clear TX UnderRun by USB port %d")
+ TRC_MSG(USBACM_SET_DMA_LIMITER, "%d owner set DMA Limiter as %d to USB port %d")
+ TRC_MSG(USBACM_CLEAR_DMA_LIMITER, "%d owner Clear DMA Limiter to USB port %d")
+ TRC_MSG(USBIMAGE_GET, "Printer send %d bytes")
+ TRC_MSG(USBIMAGE_ERROR_CMDS, "PTP receive an error command %d")
+ TRC_MSG(USBMS_RX_WRONG_CBW_LENGTH, "USB MS receive a wrong length (%d) CBW cmd packet")
+ TRC_MSG(USBMS_RESET,"USB MS Receive Reset")
+ TRC_MSG(USBMS_ERROR_CMD, "USB MS %d error cmd")
+ TRC_MSG(USBMS_LOCKFAT_FAIL, "USB MS lock FAT fail")
+ TRC_MSG(USBVIDEO_INIT, "USB video is init")
+ TRC_MSG(USBVIDEO_RELEASE, "USB video is released")
+ TRC_MSG(USBVIDEO_VC_ERROR_CMD, "USB video VC %d error cmd")
+ TRC_MSG(USBVIDEO_VS_ERROR_CMD, "USB video VS %d error cmd")
+ TRC_MSG(USBVIDEO_STILL_PROBE_NONE, "USB video reset still commit index because video commit doen")
+ TRC_MSG(USBVIDEO_SET_COMMIT_VIDEO_STATE, " USB video Set commit video state %d")
+ TRC_MSG(USBVIDEO_SET_PROB_CONTROL_ERROR, "USB video Set Probe control command received %d, and total length is %d > 26")
+ TRC_MSG(USBVIDEO_STILL_COMMIT_DONE, "USB video still commit %d index")
+ TRC_MSG(USBVIDEO_SET_STILL_PROB_CONTROL_ERROR, "USB video Set Still Probe control command received %d, and total length is %d > 11")
+ TRC_MSG(USBVIDEO_GET_BUFFER, "USB video get video buffer buff r %d, w%d, f %d ")
+ TRC_MSG(USBVIDEO_COMPLETE_BUFFER, "USB video complete video buffer buff r %d, w%d, f %d ")
+ TRC_MSG(USBVIDEO_DMA_DONE, "USB video DMA done buff r %d, w%d, f %d ")
+ TRC_MSG(USBVIDEO_STILL_ERROR, "WARNING: state is still but commit is 0")
+ TRC_MSG(USB_HCD_BABBLE_INTR, "USB hcd detect babble")
+ TRC_MSG(USB_HCD_CONN_INTR, "USB hcd detect connection")
+ TRC_MSG(USB_HCD_DISCONN_INTR, "USB hcd detect disconnection")
+ TRC_MSG(USB_HCD_CONN_AND_DISCONN_INTR, "USB hcd detect connection and disconnection at the same time")
+ TRC_MSG(USB_HCD_TX_EPN_TIMEOUT, "USB hcd TX ep %d time out")
+ TRC_MSG(USB_HCD_RX_EPN_TIMEOUT, "USB hcd RX ep %d time out")
+ TRC_MSG(USB_HCD_TX_EPN_ERROR, "USB hcd TX ep %d error")
+ TRC_MSG(USB_HCD_RX_EPN_ERROR, "USB hcd RX ep %d error")
+ TRC_MSG(USB_HCD_TX_EPN_STALL, "USB hcd TX ep %d stall")
+ TRC_MSG(USB_HCD_RX_EPN_STALL, "USB hcd RX ep %d stall")
+ TRC_MSG(USB_HCD_RX_EPN_PID_ERROR, "USB hcd RX ep %d PID error")
+ TRC_MSG(USB_HCD_EP0,"USB hcd ep0 data length,already received %d, required length %d")
+ TRC_MSG(USB_HCD_EP0_RX,"USB hcd ep0 rx data done,already received %d, required length %d, max packet %d")
+ TRC_MSG(USB_HCD_RX_DMA_TIMEOUT, "USB hcd RX DMA is timeout")
+ TRC_MSG(USB_HCD_TEST_UN_SUPPORT, "USB hcd test for un-support device.")
+ TRC_MSG(USB_HCD_RESPONSE_ERROR, "USB hcd get stall from device and doesn't support HNP")
+ TRC_MSG(USB_HCD_ENUM_FAIL, "USB hcd enumeration fail")
+ TRC_MSG(USB_HCD_COMMAND_FAIL, "USB hcd get response length error")
+ TRC_MSG(USB_HCD_UN_SUPPORT, "USB hcd dones't support the class driver")
+ TRC_MSG(USB_OTG_SESSION_REQUEST, "USB A device detects B device issue session request, and USB interrupt state %x ,USB mode %x , Line_State %x , OP_State %x")
+ TRC_MSG(USB_OTG_VBUS_FALL_DOWN, "USB B device drag too much current than expected.A device going to trun off Vbus")
+ TRC_MSG(USB_OTG_DMA_STATUS, "OTG DMA Status Real Count: %d Count: %d host channel: %d device channel: %d")
+ TRC_MSG(USB_HOST_MS_STATE_START_FAIL, "USB host ms state start fail")
+ TRC_MSG(USB_HOST_MS_STATE_MAIN_FAIL, "USB host ms state main fail")
+ TRC_MSG(USB_HOST_MS_REQUEST_SENSE_OK, "USB lun %d sense ok")
+ TRC_MSG(USB_HOST_MS_REQUEST_SENSE_MEDIA_CHANGE, "USB lun %d sense media change")
+ TRC_MSG(USB_HOST_MS_REQUEST_SENSE_ABSENT, "USB lun %d sense absent")
+ TRC_MSG(USB_HOST_MS_REQUEST_SENSE_ERROR, "USB lun %d sense error")
+ TRC_MSG(USB_HOST_MS_READ_CAPACITY_FAIL, "USB lun %d read capacity is fail because its sector number is %d and sector size is %d")
+ TRC_MSG(USB_HOST_MS_READ_CAPACITY_OK, "USB lun %d read capacity is OK and its sector number is %d and sector size is %d")
+ TRC_MSG(USB_HOST_MS_CHECK_MEDIA_STATE, "USB MS host check media state %x")
+ TRC_MSG(USB_HOST_MS_MEDIA_STATE_CHANGE, "USB MS host lun %d has state change")
+ TRC_MSG(USB_HOST_MS_READ_FAIL, "USB MS host lun %d read fail")
+ TRC_MSG(USB_HOST_MS_WRITE_FAIL, "USB MS host lun %d write fail")
+ TRC_MSG(USB_HOST_MS_READ_SECTOR_FAIL, "USB MS host lun %d read sector %d with numbers %d fail because of reason %d")
+ TRC_MSG(USB_HOST_MS_READ_SECTOR_OK, "USB MS host lun %d read sector %d with numbers %d is OK")
+ TRC_MSG(USB_HOST_MS_WRITE_SECTOR_FAIL, "USB MS host lun %d write sector %d with numbers %d fail because of reason %d")
+ TRC_MSG(USB_HOST_MS_WRITE_SECTOR_OK, "USB MS host lun %d write sector %d with numbers %d is OK")
+ TRC_MSG(USB_HOST_MS_READ_SECTOR_TIMEOUT_FAIL, "USB MS host lun %d read sector fail because of timeout")
+ TRC_MSG(USB_HOST_MS_WRITE_SECTOR_TIMEOUT_FAIL, "USB MS host lun %d write sector fail because of timeout")
+ TRC_MSG(USB_HOST_ICCD_POWER_ON_OK, "IC USB ICCD power on")
+ TRC_MSG(USB_HOST_ICCD_POWER_ON_Fail,"IC USB ICCD power on fail")
+ TRC_MSG(USB_HOST_ICCD_POWER_OFF_OK, "IC USB ICCD power off")
+ TRC_MSG(USB_HOST_ICCD_XFR_BLOCK_OK, "IC USB ICCD TX Command: %d length")
+ TRC_MSG(USB_HOST_ICCD_DATA_BLOCK_OK, "IC USB ICCD RX Command: %d length")
+ TRC_MSG(USB_HOST_ICCD_SLOT_STATUS_OK, "IC USB ICCD Status %x")
+ TRC_MSG(USB_HOST_EEM_START, "IC USB EEM Start")
+ TRC_MSG(USB_HOST_EEM_END,"IC USB EEM Finish")
+ TRC_MSG(USB_HOST_EEM_SEND_FRAME, "IC USB EEM Send Frame: length : %d")
+ TRC_MSG(USB_HOST_EEM_SEND_FRAME_BUFFER, "IC USB EEM Send out buffer %d, waiting buffer %d")
+ TRC_MSG(USB_HOST_EEM_TX_DMA_Callback, "IC USB EEM TX DMA Callback buffer %d ,length: %d")
+ TRC_MSG(USB_HOST_EEM_GET_RX_BUFFER, "IC USB EEM Get RX buffer %d")
+ TRC_MSG(USB_HOST_EEM_RECEIVE_DATA, "IC USB EEM Receive Frame: length %d")
+ TRC_MSG(USB_HOST_EEM_RECEIVE_DATA_BUFFER, "IC USB EEM Receive buffer %d,waiting buffer %d")
+ TRC_MSG(USB_HOST_EEM_RX_DMA_Callback, "IC USB EEM RX DMA Callback buffer %d,length: %d")
+ TRC_MSG(USB_HOST_EEM_RX_FIFO_Read, "IC USB EEM RX FIFO Read buffer %d, length: %d")
+ TRC_MSG(USB_HOST_EEM_RECEIVE_DATA_ERROR, "IC USB EEM RX Data Error reason %d")
+ TRC_MSG(USB_PDN_LOOP_FAIL, "USB pdnmode function's while loop count is overflow")
+ TRC_MSG(USB_HOST_HIGH_RX_WRONG_MAX_PKT_SIZE, "USB host RX high endpoint max packet size is wrong")
+ TRC_MSG(USB_HOST_FULL_RX_WRONG_MAX_PKT_SIZE, "USB host RX full endpoint max packet size is wrong")
+ TRC_MSG(USB_HOST_HIGH_TX_WRONG_MAX_PKT_SIZE, "USB host TX high endpoint max packet size is wrong")
+ TRC_MSG(USB_HOST_FULL_TX_WRONG_MAX_PKT_SIZE, "USB host TX full endpoint max packet size is wrong")
+ TRC_MSG(USB_PTP_HREQUEST_ERROR, "WARNING!! 2 HREQUEST")
+ TRC_MSG(USB_PTP_DREQUEST_ERROR, "WARNING!! 2 DREQUEST")
+ TRC_MSG(USB_MTP_RESPONSE_WARNING, "USB receive MTP response message, but USB is in %d state")
+ TRC_MSG(USB_MTP_RESPONSE_UNEXPECTED_ZERO_WARNING, "USB receive MTP response message with a zero length")
+ TRC_MSG(USBIMAGE_EP0_RESET, "USB image receive ep0 reset command")
+ TRC_MSG(USBIMAGE_EP0_CANCEL, "USB image receive ep0 cancel command")
+ TRC_MSG(USBIMAGE_EP0_GET_STATUS_BUSY, "USB image response ep0 get status command with busy")
+ TRC_MSG(USBIMAGE_EP0_GET_STATUS_OK, "USB image response ep0 get status command with OK")
+ TRC_MSG(USBIMAGE_EP0_GET_STATUS_CANCEL, "USB image response ep0 get status command with transaction cancelled")
+ TRC_MSG(USBIMAGE_EP0_CANCEL_ERROR, "USB ep0 cancel command with wrong transaction ID %d, but current ID is %d")
+ TRC_MSG(USB_MTP_TX_RESPONSE_INVAILD_MTP_MSG, "USB in TX direction receive invalid MTP meaasge with result code %d and response code %x")
+ TRC_MSG(USB_MTP_RX_RESPONSE_INVAILD_MTP_MSG, "USB in RX direction receive invalid MTP meaasge with result code %d and response code %x")
+ TRC_MSG(USB_MTP_PC_SEND_WRONG_PACKET, "USB MTP receive a packet with %d length at wrong state %d")
+ TRC_MSG(USB_HW_ERROR_STATUS, "USB HW ERROR: %d, fast mode: %d")
+ TRC_MSG(USB_HOST_HW_ERROR, "USB HW ERROR in host mode")
+ TRC_MSG(USB_PULL_DOWN_DP, "USB HW ERROR D+ down")
+ TRC_MSG(USBACM_ENABLE_HIGH_SPEED_IF, "USB PPP enables high speed IF and current RX buffer write index is %d")
+ TRC_MSG(USBACM_DISABLE_HIGH_SPEED_IF, "USB PPP disables high speed IF and current RX ring buffer read pointer is %d")
+ TRC_MSG(USBACM_DISABLE_HIGH_SPEED_IF_TIMEOUT, "USB PPP disables high speed timeout, timeout count is %d")
+ TRC_MSG(USBACM_MOVE_RC_INDEX, "USB move read clear index, and current RX buffer write index is %d, buffer count is %d, read clear index is %d, and read index is %d")
+ TRC_MSG(USBACM_MOVE_R_INDEX, "USB move read index, and current RX buffer write index is %d, buffer count is %d, read clear index is %d, and read index is %d")
+ TRC_MSG(USBACM_MOVE_W_INDEX, "USB move write index, and current RX buffer write index is %d, buffer count is %d, read clear index is %d, and read index is %d")
+ TRC_MSG(USBACM_HIGHSPEED_GETBYTES, "USB ACM high speed IF get bytes with %d bytes from USB port %d")
+ TRC_MSG(USBACM_HIGHSPEED_GETBYTES_NO_DATA, "USB ACM high speed IF get bytes no data by %d owner from USB port %d")
+ TRC_MSG(USBACM_HIGHSPEED_PUTBYTES, "USB ACM high speed IF put bytes with %d bytes from USB port %d")
+ TRC_MSG(USBACM_HIGHSPEED_PUTBYTES_SETUP_DMA, "USB ACM high speed IF put bytes ser up DMA with %d bytes from USB port %d")
+ TRC_MSG(USBACM_HIGHSPEED_PUTBYTES_DMA_IS_RUNNING, "USB ACM high speed IF put bytes and DMA is running")
+ TRC_MSG(USBACM_HIGHSPEED_PUTBYTES_FAIL, "USB ACM high speed IF put bytes fail due to USB wrong state")
+ TRC_MSG(USB_ISD_ENABLE_HIGH_SPEED_IF, "USB RNDIS enables high speed IF and current RX buffer write index is %d")
+ TRC_MSG(USB_ISD_DISABLE_HIGH_SPEED_IF, "USB RNDIS disables high speed IF and current RX ring buffer read pointer is %d")
+ TRC_MSG(USB_ISD_DISABLE_HIGH_SPEED_IF_TIMEOUT, "USB RNDIS disables high speed timeout, timeout count is %d")
+ TRC_MSG(USBACM_FLC_MOVE_RC_INDEX, "USB control pipe move read clear index, and current RX buffer write index is %d, buffer count is %d, read clear index is %d, and read index is %d")
+ TRC_MSG(USBACM_FLC_MOVE_R_INDEX, "USB control pipe move read index, and current RX buffer write index is %d, buffer count is %d, read clear index is %d, and read index is %d")
+ TRC_MSG(USBACM_FLC_MOVE_W_INDEX, "USB control pipe move write index, and current RX buffer write index is %d, buffer count is %d, read clear index is %d, and read index is %d")
+ TRC_MSG(USBACM_FLC_HIGHSPEED_GETBYTES, "USB control pipe get bytes with %d bytes from USB port %d")
+ TRC_MSG(USBACM_FLC_HIGHSPEED_GETBYTES_NO_DATA, "USB control pipe get bytes no data by %d owner from USB port %d")
+ TRC_MSG(USBACM_FLC_HIGHSPEED_PUTBYTES, "USB control pipe put bytes with %d bytes from USB port %d")
+ TRC_MSG(USBACM_FLC_HIGHSPEED_PUTBYTES_SETUP_DMA, "USB control pipe put bytes ser up DMA with %d bytes from USB port %d")
+ TRC_MSG(USBACM_FLC_HIGHSPEED_PUTBYTES_DMA_IS_RUNNING, "USB control pipe put bytes and DMA is running")
+ TRC_MSG(USBACM_FLC_HIGHSPEED_PUTBYTES_FAIL, "USB control pipe put bytes fail due to USB wrong state")
+ TRC_MSG(USBACM_FLC_HIGHSPEED_PUTBYTES_BUSY, "USB control pipe put bytes fail due to USB last data didn't send out")
+ TRC_MSG(USBACM_RX_HIGHSPEED_BULK_OUT, "USB RX pipe : previous data len %d previous buffer addr %x current buffer addr %x")
+ TRC_MSG(USBACM_RX_INDEX, "USB data RX index, and current RX buffer write index is %d, buffer count is %d, read clear index is %d, and read index is %d")
+ TRC_MSG(USBACM_RX_DATA_HEADER,"USB RX pipe header : %x %x %x %x")
+ TRC_MSG(USBACM_RX_PUSH,"USB RX buffer push, index %d")
+ TRC_MSG(USBACM_RX_POP,"USB RX buffer pop, index %d")
+ TRC_MSG(USBACM_RX_NO_BUFFER,"USB RX no buffer , data count: %d")
+ TRC_MSG(USBACM_RX_FLC_DATA_HEADER,"USB control pipe rx header : %x %x %x %x")
+ TRC_MSG(USBACM_RX_FLC_PUSH,"USB control pipe rx buffer push, index %d")
+ TRC_MSG(USBACM_RX_FLC_POP,"USB control pipe rx buffer pop, index %d")
+ TRC_MSG(USBACM_RX_FLC_NO_BUFFER,"USB control pipe rx no buffer , data count: %d")
+ TRC_MSG(USBACM_Drop,"USB drop data , ep: %d , buffer index : %d")
+ TRC_MSG(USBACM_RX_FLC_HIGHSPEED_BULK_OUT, "USB RX pipe : previous data len %d previous buffer addr %x current buffer addr %x")
+ TRC_MSG(USBMS_READ_PERFORMANCE, "USB read performance %dKB/s")
+ TRC_MSG(USBMS_WRITE_PERFORMANCE, "USB write performance %dKB/s")
+ TRC_MSG(USBMS_CBWCMD, "USB CBW CMD 0x%x")
+ TRC_MSG(USB_TEST_LOAD, "USB compliance test load")
+ TRC_MSG(USB_MS_WRITE_SECTOR_FAIL, "USB MS Write Sector Fail!")
+ TRC_MSG(USB_DMAQ_RXGPD_SETUP, "USB RGPD SETUP: 0x%x header:0x%x")
+ TRC_MSG(USB_DMAQ_TXGPD_SETUP, "USB TGPD SETUP: 0x%x header:0x%x")
+ TRC_MSG(USB_DMAQ_RXGPD_FLUSH, "USB RGPD Flush")
+ TRC_MSG(USB_DMAQ_TXGPD_FLUSH, "USB TGPD Flush")
+ TRC_MSG(USB_DMAQ_RXGPD_INSERT, "USB RGPD INSERT: header: 0x%x; insert: 0x%x")
+ TRC_MSG(USB_DMAQ_TXGPD_INSERT, "USB TGPD INSERT: header: 0x%x; insert: 0x%x")
+ TRC_MSG(USB_DMAQ_RXGPD_INFO, "USB RGPD INFO: header:0x%x; next:0x%x, hwo=1")
+ TRC_MSG(USB_DMAQ_TXGPD_INFO, "USB TGPD INFO: header:0x%x; next:0x%x, hwo=1")
+ TRC_MSG(USB_DMAQ_RXGPD_EMPTY, "USB RGPD RX EMPTY: 0x%x 0x%x 0x%x 0x%x")
+ TRC_MSG(USB_DMAQ_TXGPD_EMPTY, "USB TGPD TX EMPTY: 0x%x 0x%x 0x%x 0x%x")
+ END_TRACE_MAP(MOD_UART1_HISR)
+
+
+#endif /*__TST_MODULE__*/
+
+#endif /* _USB_TRC_H */
+
diff --git a/mcu/driver/connectivity/usb_class/include/usbacm_adap.h b/mcu/driver/connectivity/usb_class/include/usbacm_adap.h
new file mode 100644
index 0000000..42c47e2
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/usbacm_adap.h
@@ -0,0 +1,166 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usbacm_adap.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb adaption layer for UART API definitions
+ *
+ * Author:
+ * -------
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USBACM_ADAP_H
+#define USBACM_ADAP_H
+
+//#include "uart_sw.h"
+#include "dcl.h"
+#include "kal_public_defs.h" //MSBB change #include "stack_msgs.h"
+//#include "kal_non_specific_general_types.h"
+#include "kal_public_defs.h" //MSBB change #include "stack_config.h"
+
+
+typedef enum
+{
+ CDC_ONLY_PUSH = 0, //Only push buffer ( initial sate: prepare buffer for USB )
+ CDC_ONLY_GET, // Only get data ( there might be no FLC buffer anymore )
+ CDC_GET_DATA, // normal state ( get data & push another buffer )
+ CDC_POP_BUFF // Get empty buffer (leave RNDIS mode „³ release FLC buffer )
+}USB_Requ_type;
+
+
+extern void USB2UART_Sendilm(UART_PORT port, msg_type msgid);
+extern void USB2UART_init(void);
+extern void USB2UART_Switch_Mapping(UART_PORT port,kal_uint8 new_port,kal_bool open);
+extern void USB2UART_Clear_Tx_Buffer(UART_PORT port);
+extern void USB2UART_Clear_Tx_ISR_Buffer(UART_PORT port);
+extern void USB2UART_Clear_Rx_Buffer(UART_PORT port);
+
+
+//#ifdef __USB_TETHERING__
+//extern kal_bool USB_Get_RNDIS_Mode(void);
+//extern kal_bool USB_Set_RNDIS_Mode(kal_bool set);
+//#endif
+
+
+#endif /* USBACM_ADAP_H */
+
diff --git a/mcu/driver/connectivity/usb_class/include/usbacm_drv.h b/mcu/driver/connectivity/usb_class/include/usbacm_drv.h
new file mode 100644
index 0000000..08bbcda
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/usbacm_drv.h
@@ -0,0 +1,914 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usbacm_drv.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb CDC ACM class driver definitions
+ *
+ * Author:
+ * -------
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USBACM_DRV_H
+#define USBACM_DRV_H
+
+//#include "kal_non_specific_general_types.h"
+#include "usb.h"
+#include "dcl.h"
+#include "usb_comm.h"
+#include "kal_public_defs.h" //MSBB change #include "stack_config.h"
+//#include "uart_sw.h"
+#include "bmd.h"
+#include "usb_custom.h"
+#include "usb_custom_def.h"
+
+/***********************************************
+ acm class specific command definition
+************************************************/
+
+#define USB_ACM_DEVICE_CODE 0x02
+#define USB_ACM_SUBCLASS_CODE 0x00
+#define USB_ACM_PROTOCOL_CODE 0x00
+
+#define USB_ACM_COMM_INTERFACE_CLASS_CODE 0x02
+#define USB_ACM_COMM_INTERFACE_SUBCLASS_CODE 0x02
+#define USB_ACM_COMM_INTERFACE_PROTOCOL_CODE 0x01
+
+#define USB_ACM_DATA_INTERFACE_CLASS_CODE 0x0a
+#define USB_ACM_DATA_INTERFACE_SUBCLASS_CODE 0x00
+#define USB_ACM_DATA_INTERFACE_PROTOCOL_CODE 0x00
+
+#define USB_CDC_IF_LENGTH 28 /* standard plus class */
+
+/* Class-Specfic Codes ,EP0*/
+#define USB_ACM_SEND_ENCAPSULATED_COMMAND 0x00
+#define USB_ACM_GET_ENCAPSULATED_RESPONSE 0x01
+#define USB_ACM_SET_COMM_FEATURE 0x02
+#define USB_ACM_GET_COMM_FEATURE 0x03
+#define USB_ACM_CLEAR_COMM_FEATURE 0x04
+#define USB_ACM_SET_LINE_CODING 0x20
+#define USB_ACM_GET_LINE_CODING 0x21
+#define USB_ACM_SET_CONTROL_LINE_STATE 0x22
+#define USB_ACM_SEND_BREAK 0x23
+
+/* Class-Specfic Codes ,EP0 - NCM*/
+#define USB_NCM_SEND_ENCAPSULATED_COMMAND 0x00
+#define USB_NCM_GET_ENCAPSULATED_RESPONSE 0x01
+#define USB_NCM_GET_NTB_PARAMETERS 0x80
+#define USB_NCM_GET_NET_ADDRESS 0x81
+#define USB_NCM_SET_NET_ADDRESS 0x82
+#define USB_NCM_GET_NTB_INPUT_SIZE 0x85
+#define USB_NCM_SET_NTB_INPUT_SIZE 0x86
+#define USB_NCM_RESET 0x05
+
+
+/*Notifications, interrupt pipe*/
+#define USB_ACM_NOTIF_NETWORK_CONNECTION 0x00
+#define USB_ACM_NOTIF_RESPONSE_AVAILABLE 0x01
+#define USB_ACM_NOTIF_SERIAL_STATE 0x20
+
+/* UART state bitmap values */
+#define SERIAL_STATE_BRXCARRIER 0x01
+
+
+/*USB_ACM_SET_CONTROL_LINE_STATE*/ /* not use anywhere */
+#define CONTROL_LINE_SIGNAL_RTS 0x02 /*DCE's RTS,DTE's CTS*/
+#define CONTROL_LINE_SIGNAL_DTR 0x01 /*DCE's DTR,DTE's DSR*/
+
+
+// RNDIS Spec //
+#define USB_ISD_DEVICE_CODE 0xE0 //0x02 //0xE0
+#define USB_ISD_SUBCLASS_CODE 0x01 //0x00 //0x01
+#define USB_ISD_PROTOCOL_CODE 0x03 //0x00 //0x03
+
+#define USB_ISD_COMM_INTERFACE_CLASS_CODE 0xE0 //0x02 //0xE0
+#define USB_ISD_COMM_INTERFACE_SUBCLASS_CODE 0x01 //0x02 //0x01
+#define USB_ISD_COMM_INTERFACE_PROTOCOL_CODE 0x03 //0xff //0x03
+
+#define USB_ISD_DATA_INTERFACE_CLASS_CODE 0x0A
+#define USB_ISD_DATA_INTERFACE_SUBCLASS_CODE 0x00
+#define USB_ISD_DATA_INTERFACE_PROTOCOL_CODE 0x00
+
+#define USB_RNDIS_RESPONSE_AVAILABL 0x01
+
+#define RNDIS_RX_BUFFER_NUM USB_ACM_RX_BUFFER_NUM // UPS : put 8 buffer
+#define RNDIS_RX_FLC_BUFFER_NUM 3 // UPS : use 3 buffer
+#define RNDIS_MAX_FRAME 1560
+
+#define USB_RNDIS_RX_LOOP_COUNT 16
+
+
+
+//MBIM
+#define USB_MBIM_IF_LENGTH 31 /* standard plus class */
+
+#define USB_MBIM_DEVICE_CODE 0xEF
+#define USB_MBIM_SUBCLASS_CODE 0x02
+#define USB_MBIM_PROTOCOL_CODE 0x01
+#define USB_MBIM_DESCRIPTOR_CODE 0x1B //MBIM functional descriptor
+
+
+#define USB_MBIM_COMM_INTERFACE_CLASS_CODE 0x02
+#define USB_MBIM_COMM_INTERFACE_SUBCLASS_CODE 0x0E
+#define USB_MBIM_COMM_INTERFACE_PROTOCOL_CODE 0x00
+
+#define USB_MBIM_DATA_INTERFACE_CLASS_CODE 0x0A
+#define USB_MBIM_DATA_INTERFACE_SUBCLASS_CODE 0x00
+#define USB_MBIM_DATA_INTERFACE_PROTOCOL_CODE 0x02
+
+// MBIM Functional Descriptor
+#define MBIM_MAX_CONTROL_MESSAGE 512
+#define MBIM_NUMBER_FILTERS 16
+#define MBIM_MAX_FILTER_SIZE 64
+#define MBIM_MAX_SEGMENT_SIZE 2048
+
+
+
+/***********************************************
+ Implement definition
+************************************************/
+
+#define USB_CDC_ACM_IF_NUMBER 2
+
+#define USB_CDC_ACM_COMM_EP_NUMBER 1 /*interrupt pipe*/
+#define USB_CDC_ACM_DATA_EP_NUMBER 2
+
+#define USBACM_RING_BUFFER_TIMEOUT 25
+
+#define USBACM_HIGH_SPEED_LOOP 100
+#define USBACM_DIRECT_PATH_LOOP 500
+
+
+#define USB_ACM_RX_HDLR_PACKET_NUM 16
+
+
+/***********************************************
+ UART SW Implement definition
+************************************************/
+#define UART_STAT_EscDet 0x01
+#define UART_STAT_Break 0x02
+
+#define UART_RecNormal 0
+#define UART_Get3EscChar 1
+#define UART_StartCheckESC 2
+
+typedef void (*UART_TX_FUNC)(UART_PORT port);
+typedef void (*UART_RX_FUNC)(UART_PORT port) ;
+
+/***********************************************
+ acm class specific descriptor structure
+************************************************/
+
+/* CDC ACM communication interface descriptor element */
+typedef struct
+{
+ kal_uint8 bLength;
+ kal_uint8 bDescriptorType;
+ kal_uint8 bInterfaceNumber;
+ kal_uint8 bAlternateSetting;
+ kal_uint8 bNumEndpoints;
+ kal_uint8 bInterfaceClass;
+ kal_uint8 bInterfaceSubClass;
+ kal_uint8 bInterfaceProtocol;
+ kal_uint8 iInterface;
+
+ kal_uint8 HFbFunctionLength; /*Header Functional Descriptor*/
+ kal_uint8 HFbDescriptorType;
+ kal_uint8 HFbDescriptorSubtype;
+ kal_uint16 bcdCDC;
+
+ kal_uint8 ACMFbFunctionLength; /*Abstract Control Management Functional Descriptor*/
+ kal_uint8 ACMFbDescriptorType;
+ kal_uint8 ACMFbDescriptorSubtype;
+ kal_uint8 ACMFbmCapabilities;
+
+ kal_uint8 UFbFunctionLength; /*Union Functional Descriptor*/
+ kal_uint8 UFbDescriptorType;
+ kal_uint8 UFbDescriptorSubtype;
+ kal_uint8 bMasterInterface;
+ kal_uint8 bSlaveInterface0;
+
+ kal_uint8 CMFbFunctionLength; /*Call Management Descriptor*/
+ kal_uint8 CMFbDescriptorType;
+ kal_uint8 CMFbDescriptorSubtype;
+ kal_uint8 CMFbmCapabilities;
+ kal_uint8 bDataInterface;
+} Usb_Cdc_If_Dscr;
+
+
+typedef struct
+{
+ kal_uint8 bLength;
+ kal_uint8 bDescriptorType;
+ kal_uint8 bInterfaceNumber;
+ kal_uint8 bAlternateSetting;
+ kal_uint8 bNumEndpoints;
+ kal_uint8 bInterfaceClass;
+ kal_uint8 bInterfaceSubClass;
+ kal_uint8 bInterfaceProtocol;
+ kal_uint8 iInterface;
+
+ kal_uint8 HFbFunctionLength; /*Header Functional Descriptor*/
+ kal_uint8 HFbDescriptorType;
+ kal_uint8 HFbDescriptorSubtype;
+ kal_uint16 bcdCDC;
+
+ kal_uint8 UFbFunctionLength; /*Union Functional Descriptor*/
+ kal_uint8 UFbDescriptorType;
+ kal_uint8 UFbDescriptorSubtype;
+ kal_uint8 bMasterInterface;
+ kal_uint8 bSlaveInterface0;
+
+ kal_uint8 MBIMbFunctionLength; /*MBIM Functional Descriptor*/
+ kal_uint8 MBIMbDescriptorType;
+ kal_uint8 MBIMbDescriptorSubtype;
+ kal_uint16 MBIMbcdMBIMVersion;
+ kal_uint16 MBIMwMaxControlMessage;
+ kal_uint8 MBIMbNumberFiliters;
+ kal_uint8 MBIMbMaxFiliterSize;
+ kal_uint16 MBIMwMaxSegmentSize;
+ kal_uint8 MBIMbmNetworkCapabilities;
+} Usb_MBIM_If_Dscr;
+
+
+/* ACM line coding element */
+typedef struct
+{
+ kal_uint32 dwDTERate;
+ kal_uint8 bCharFormat;
+ kal_uint8 bParityType;
+ kal_uint8 bDataBits;
+} UsbAcm_Line_Coding;
+
+
+/* ACM interrupt packet structure */
+typedef struct
+{
+ kal_uint8 bmRequestType;
+ kal_uint8 bRequest;
+ kal_uint16 wValue;
+ kal_uint16 wIndex;
+ kal_uint16 wLength;
+ kal_uint16 Data;
+}UsbAcm_Intr_Pkt;
+
+
+/***********************************************
+ implement enum and structure
+************************************************/
+
+/* transmit buffer type */
+typedef enum
+{
+ USBTRX_MEM_UNKOWN = 0,
+ USBTRX_MEM_ISR,
+ USBTRX_MEM_TASK,
+ USBTRX_MEM_MAX_TYPE
+} USBTRX_MEM_TYPE;
+
+typedef enum
+{
+ ACM_INTR_IDLE = 0,
+ ACM_INTR_SEND_ONE_PKT,
+ ACM_INTR_SEND_LAST_PKT
+}USB_ACM_INTR_PIPE_STATE;
+
+
+/* Current ACM driver owner application */
+typedef enum
+{
+ USB_ACM_OWNER_UART = 0,
+ USB_ACM_OWNER_FT
+// USB_ACM_OWNER_LOGGING
+}USB_ACM_OWNER_TYPE;
+
+
+
+typedef enum
+{
+ CDC_NORMAL = 0, // old transfer type, save data in ring buffer, and copy data to buffer by single interrupt ex:USB2UART_GetBytes
+ CDC_HIGH_SPEED, // Only get data ( there might be no FLC buffer anymore)
+ CDC_HIGH_SPEED_FRAME, // use transfer as unit
+ CDC_HIGH_SPEED_FRAME_DMAQ // use transfer as unit with DMAQ
+}USB_Transfer_type;
+
+/**
+ * TGPD
+ */
+typedef struct _TGPD
+{
+ kal_uint8 flag;
+ kal_uint8 chksum;
+ kal_uint16 DataBufferLen; /*Rx Allow Length*/
+ struct _TGPD* pNext;
+ kal_uint8* pBuf;
+ kal_uint16 bufLen;
+ kal_uint8 ExtLength;
+ kal_uint8 ZTepFlag;
+}TGPD, *PGPD;
+
+#define RXGPD_FLAGS_HWO 0x01
+#define RXGPD_FLAGS_BDP 0x02
+#define RXGPD_ENDPOINT 0x0F
+#define RXGPD_TGL 0x10
+#define RXGPD_ZLP 0x20
+#define RXGPD_FLAGS_IOC 0x80
+
+
+#define TXGPD_FLAGS_HWO 0x01
+#define TXGPD_FORMAT_BDP 0x02
+#define TXGPD_FORMAT_TGL 0x10
+#define TXGPD_FORMAT_ZLP 0x20
+#define TXGPD_FLAG_IOC 0x40
+
+
+typedef void (*usb_acm_rx_ptr)(void);
+
+/* ACM device structure */
+typedef struct
+{
+ kal_uint8 data_interface_id;
+ kal_bool send_Txilm;
+ kal_bool send_Rxilm;
+ kal_bool send_UARTilm;
+ kal_bool config_send_Txilm;
+ kal_bool ring_buffer_timer_counting; /* flag to check ring buffer timer running or not */
+ kal_bool threshold_enable; /* enable ring buffer threshold and time out mechanism */
+ kal_bool setup_dma; /* a flag to record DMA is triggered or not */
+ kal_bool is_intr_pending_pkt; /* interrupt pipe has pending packet */
+ kal_bool dma_txcb_just_done; /*DMA TX Callback Function just done. It's clear by putbyte funtion*/
+ kal_bool break_detect;
+ kal_bool put_start;
+ kal_uint16 dmaf_setmember; /* Who set dma_false after putbyte and it does not finsih*/
+ kal_uint16 line_state;
+ UsbAcm_Intr_Pkt intr_pkt;
+
+ kal_uint32 handle; /*GPT handle*/
+ kal_uint32 dma_handle; /*for DMA timeout handle*/
+ kal_uint32 ring_buffer_handle; /* ring buffer's GPT handle */
+ kal_uint32 break_number;
+ UsbAcm_Line_Coding line_coding; /* current line coding, just used to reply to host */
+
+ Usb_EpBIn_Status *txpipe; /* bulk in EP, Data interface */
+ Usb_EpBOut_Status *rxpipe; /* bulk out EP, Data interface */
+ Usb_EpBIn_Status *intrpipe; /* interrupt EP, Communication Interface */
+
+ USB_ACM_INTR_PIPE_STATE intr_state; /* interrupt pipe state machine */
+ Usb_Ep_Info *comm_ep_intr_info;
+ Usb_Ep_Info *data_ep_in_info;
+ Usb_Ep_Info *data_ep_out_info;
+ Usb_Interface_Info *comm_if_info;
+ Usb_Interface_Info *data_if_info;
+
+ USB_Transfer_type transfer_type;
+
+
+ kal_uint32 data_addr;
+ kal_uint32 rx_buf_data_len[USB_ACM_RX_BUFFER_NUM];
+ kal_uint16 tx_count; /* To store the TX count, debug only*/
+ kal_bool b_data_left; // left data due to 512N
+ kal_bool b_is_high_speed_enable;
+ kal_bool b_rc_index_move;
+ kal_uint16 b_rc_get_count;
+ kal_uint8 rx_buf_rc_index; /* read clear pointer */
+ kal_uint8 rx_buf_r_index; /* read pointer */
+ kal_uint8 rx_buf_w_index; /* write pointer */
+ kal_uint8 rx_buf_count; /* the buffer count with data */
+#ifdef DRV_USB_DMA_QUEUE_SUPPORT
+ kal_bool ppp_txdmaq_first;
+ kal_uint32 ppp_rdmaq_idx;
+ kal_uint32 ppp_tdmaq_idx;
+#endif
+//#endif
+
+//#ifdef __USB_TETHERING__
+ kal_uint8 *rx_buf_addr[RNDIS_RX_BUFFER_NUM+1]; //9 : 0 ~ 8
+ kal_uint32 isd_rx_buf_data_len[RNDIS_RX_BUFFER_NUM+1];
+ kal_uint8 *rx_flc_buf_addr[RNDIS_RX_FLC_BUFFER_NUM+1]; //3 //3: 0~2
+ kal_uint32 rx_flc_buf_data_len[RNDIS_RX_FLC_BUFFER_NUM+1];
+ kal_uint16 tx_flc_count; /* To store the TX count, debug only*/
+ kal_uint8 *tx_flc_data_addr;
+ kal_bool rx_full_data;
+ kal_bool halt_flag;
+ kal_bool ctrl_data_done;
+ kal_bool send_ctrl_Txilm; // Ctrl pipe --> TX message
+ kal_bool send_ctrl_Rxilm; // ctrl pipe --> RX message
+
+// kal_bool dma_rx_running; //use FIFO Read first
+// kal_bool dma_tx_running; //the dame as setup_dma
+
+ kal_uint8 rx_full_buff_index; // receive Data
+ kal_uint8 rx_empty_buff_index; // empty buffer
+ kal_uint8 rx_flc_full_buff_index; // receive Data
+ kal_uint8 rx_flc_empty_buff_index; // empty buffer
+// kal_bool b_flc_rc_index_move;
+ kal_uint8 rx_flc_buf_rc_index; /* read clear pointer */
+ kal_uint8 rx_flc_buf_r_index; /* read pointer */
+ kal_uint8 rx_flc_buf_w_index; /* write pointer: data write (bulk out handler) */
+ kal_uint8 rx_flc_buf_count; /* the buffer count with data */
+ kal_uint8 rx_flc_temp_length; /* for first time PC send data just before buffer push (initial message) */
+ kal_bool rx_flc_temp; /* for first time PC send data just before buffer push (initial message) */
+ kal_uint8 *rx_flc_temp_buf_addr;
+
+#ifdef __USB_SW_DMA_DIV__
+ kal_uint8 *tx_temp_buf_addr;
+#endif
+ kal_bool b_is_tx_direct_path_enable;
+
+}UsbAcm_Struct;
+
+
+
+typedef struct
+{
+ /* FT mode param */
+ USB_ACM_OWNER_TYPE acm_owner;
+ kal_uint8 *rx_buf_addr[RNDIS_RX_BUFFER_NUM+1]; //9 : 0 ~ 8
+ kal_uint8 ft_port_num;
+
+ kal_uint8 ft_data[USB_EP_BULK_MAXP];
+
+ kal_uint16 ft_data_len;
+ usb_acm_rx_ptr ft_rx_cb;
+
+ /* Customizable variables */
+ const USB_ACM_PARAM *acm_param;
+}UsbAcm_Common_Struct;
+
+
+typedef struct
+{
+ UART_PORT port_no;
+ kal_bool initialized;
+ kal_bool power_on;
+ module_type ownerid;
+ module_type UART_id;
+ kal_bool breakDet;
+ kal_bool EscFound;
+ IO_level DSR;
+
+ kal_uint8 EscCount;
+ kal_uint8 Rec_state; /**/
+
+ /*detect Escape*/
+ kal_uint32 handle; /*GPT handle*/
+ UARTDCBStruct DCB;
+
+ UART_ESCDetectStruct ESCDet;
+ UART_RingBufferStruct RingBuffers;
+ BUFFER_INFO Rx_Buffer; /* receive buffer */
+ BUFFER_INFO Tx_Buffer; /* transmit buffer */
+ BUFFER_INFO Tx_Buffer_ISR; /* receive buffer */
+
+ UART_TX_FUNC tx_cb;
+ UART_RX_FUNC rx_cb;
+
+
+// kal_hisrid hisr;
+//#ifdef __DMA_UART_VIRTUAL_FIFO__
+// kal_uint8 Rx_DMA_Ch;
+// kal_uint8 Tx_DMA_Ch;
+//#endif
+//#ifdef DCM_ENABLE
+// UART_BAUD_AUTO conflict with rate fix, need to disable DCM
+// kal_uint32 DCMHandle;
+// kal_bool AutobaudDetection;
+//#endif
+//#if defined(DRV_UART_COMPENSATE_AT)
+// UART_Compensate_enum CompensateAT;
+//#endif
+// UART_SLEEP_ON_TX sleep_on_tx;
+// kal_bool EnableTX;
+
+} UsbUARTStruct;
+
+
+/***********************************************
+ function and global variable
+************************************************/
+extern UsbUARTStruct USB2UARTPort[MAX_USB_PORT_NUM];
+extern UsbAcm_Struct g_UsbACM[MAX_USB_PORT_NUM];
+extern UsbAcm_Common_Struct g_UsbACM_Comm;
+extern kal_uint8 USB_PORT[uart_max_port];
+extern kal_bool USB_IS_LOGGING_PORT[uart_max_port];
+
+extern void usb_drv_trace4(module_type ownerid, kal_uint32 msg_index,const char *arg_type, kal_uint32 data1, kal_uint32 data2,kal_uint32 data3, kal_uint32 data4);
+extern void usb_drv_trace2(module_type ownerid, kal_uint32 msg_index,const char *arg_type, kal_uint32 data1, kal_uint32 data2);
+extern void usb_drv_trace1(module_type ownerid, kal_uint32 msg_index,const char *arg_type, kal_uint32 data1);
+extern void usb_drv_trace0(module_type ownerid, kal_uint32 msg_index,const char *arg_type);
+extern void USB_Acm_Exception_Check(void);
+
+extern void USB_Check_Owner(module_type ownerid,module_type current_ownerid);
+
+extern void USB_UnMask_COM_Intr(UART_PORT port);
+extern void USB_Mask_COM_Intr(UART_PORT port);
+
+extern void UART2USB_DCB2LineCoding(UARTDCBStruct *pDCB, UsbAcm_Line_Coding *pline_coding);
+
+extern void USB2UART_Timeout(void *parameter);
+
+extern void USB2UART_Dafault_Tx_Callback(UART_PORT port);
+extern void USB2UART_Dafault_Rx_Callback(UART_PORT port);
+extern void USB_Acm_Ring_Buffer_Threshold_Enable(UART_PORT port, kal_bool bset, module_type ownerid);
+
+extern void USB2UART_Polling_Flush_Transmit_Data(UART_PORT port);
+extern void USB2UART_Polling_Recv_Data(UART_PORT port);
+
+#if defined(__USB_LIMIT__)
+extern void USB2UART_Set_DMA_Limiter(kal_uint32 dma_limit_num);
+extern void USB2UART_Clear_DMA_Limiter(void);
+#endif
+
+extern void USB2UART_DMATransmit(UART_PORT port, kal_bool b_force_isr_buffer);
+extern void USB2UART_Tx_DMA1_Callback(void);
+
+extern void USB_Acm_Rx_ClrFifo(UART_PORT port);
+extern void USB_Acm1_CommIf_Create(void *ifname);
+extern void USB_Acm1_CommIf_Reset(void);
+extern void USB_Acm1_CommIf_Enable(void);
+extern void USB_Acm1_CommIf_Speed_Reset(kal_bool b_other_speed);
+extern void USB_Acm1_DataIf_Create(void *ifname);
+extern void USB_Acm1_DataIf_Reset(void);
+extern void USB_Acm1_DataIf_Enable(void);
+extern void USB_Acm1_DataIf_Speed_Reset(kal_bool b_other_speed);
+
+extern void USB_Acm_VendorIf_Create(void *ifname);
+extern void USB_Acm_VendorIf_Reset(void);
+extern void USB_Acm_VendorIf_Enable(void);
+extern void USB_Acm_VendorIf_Speed_Reset(kal_bool b_other_speed);
+
+
+
+
+extern void USB_Init_Acm_Status(void);
+extern void USB_Release_Acm_Status(void);
+
+extern void USB2UART_Tx_DMA2_Callback(void);
+extern void USB_Acm2_CommIf_Create(void *ifname);
+extern void USB_Acm2_CommIf_Reset(void);
+extern void USB_Acm2_CommIf_Enable(void);
+extern void USB_Acm2_CommIf_Speed_Reset(kal_bool b_other_speed);
+extern void USB_Acm2_DataIf_Create(void *ifname);
+extern void USB_Acm2_DataIf_Reset(void);
+extern void USB_Acm2_DataIf_Enable(void);
+extern void USB_Acm2_DataIf_Speed_Reset(kal_bool b_other_speed);
+
+
+extern void USB_Acm_FT_Register_Rx_Cb(usb_acm_rx_ptr cb);
+
+#if defined (DRV_USB_DMA_QUEUE_SUPPORT)
+extern void USB_DMAQ_Setup(kal_uint32 ep_num, USB_EP_DIRECTION direction, kal_bool first, kal_uint32 addr, usb_dmaq_callback callback, usb_dmaq_callback empty_callback);
+extern void USB_DMAQ_Stop(kal_uint32 ep_num, USB_EP_DIRECTION direction);
+extern void USB_TxEP_DMAQ_En(kal_uint8 epno, kal_bool bQMU);
+extern void USB_RxEP_DMAQ_En(kal_uint8 epno, kal_bool bQMU);
+
+extern void USB2UART_PPPRX_DMAQ_Callback(kal_uint32 usb_port);
+extern void USB2UART_PPPTX_DMAQ_Callback(kal_uint32 usb_port);
+#endif
+
+#endif /* USBACM_DRV_H */
+
diff --git a/mcu/driver/connectivity/usb_class/include/usbacm_echo.h b/mcu/driver/connectivity/usb_class/include/usbacm_echo.h
new file mode 100644
index 0000000..4cc18d6
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/usbacm_echo.h
@@ -0,0 +1,104 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usbacm_echo.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file implements USB DVT or Throughput test
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USBACM_DRV_H
+#define USBACM_DRV_H
+
+//#include "kal_non_specific_general_types.h"
+#include "usb_custom.h"
+
+
+/***********************************************
+ function and global variable
+************************************************/
+
+extern void USB_ECHO_TEST(void);
+
+
+#endif /* USBACM_DRV_H */
+
diff --git a/mcu/driver/connectivity/usb_class/include/usbacm_ft.h b/mcu/driver/connectivity/usb_class/include/usbacm_ft.h
new file mode 100644
index 0000000..640ecb9
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/usbacm_ft.h
@@ -0,0 +1,98 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usbacm_ft.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb adaption layer for factory mode definitions
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USBACM_FT_H
+#define USBACM_FT_H
+
+//#include "kal_non_specific_general_types.h"
+
+#define USB2UART_METX_TX_MAX_LEN ((1<<16)-1)
+
+extern void USB_Acm_FT_Init(void);
+extern kal_uint8 USB_Acm_FT_Port(void);
+
+extern kal_uint16 USB2UART_FT_Get_Max_Len(void);
+extern void USB2UART_FT_Tx_Byte(kal_uint8* addr, kal_uint16 len);
+extern void USB2UART_FT_Tx_Word(kal_uint32* addr, kal_uint16 len);
+extern void USB2UART_FT_Tx_Stop(void);
+extern kal_uint16 USB2UART_FT_Rx_Byte(kal_uint8* addr, kal_uint16 len);
+
+#endif /* USBACM_FT_H */
+
diff --git a/mcu/driver/connectivity/usb_class/include/usbacm_logging.h b/mcu/driver/connectivity/usb_class/include/usbacm_logging.h
new file mode 100644
index 0000000..1a76a6e
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/usbacm_logging.h
@@ -0,0 +1,192 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usbacm_logging.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for USB logging tool API definitions
+ *
+ * Author:
+ * -------
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USBACM_LOGGING_H
+#define USBACM_LOGGING_H
+
+//#include "kal_non_specific_general_types.h"
+#include "usblog_drv.h"
+#include "drv_features_usb.h"
+
+
+typedef enum
+{
+ USBACM_LOGGING_DMA_OWNER_NONE,
+ USBACM_LOGGING_DMA_OWNER_DMA,
+ USBACM_LOGGING_DMA_OWNER_LOG_SRC,
+ USBACM_LOGGING_DMA_OWNER_MAX
+}USBACM_LOGGING_DMA_OWNER;
+
+
+
+typedef struct
+{
+ USBACM_LOGGING_DMA_OWNER dma_owner;
+#if (defined(DRV_USB_LOGGING_V6)||defined(DRV_USB_LOGGING_V5)||defined(DRV_USB_LOGGING_V8))
+ kal_uint32 buff_size[USBACM_LOGGING_TOTAL_SOURCE_NUM];
+ /* Debug info */
+ kal_uint32 buffer_transmitted_times[USBACM_LOGGING_TOTAL_SOURCE_NUM];
+ kal_uint32 buffer_transmitted_num[USBACM_LOGGING_TOTAL_SOURCE_NUM];
+ kal_uint32 full_times;
+ kal_uint8 buff_num[USBACM_LOGGING_TOTAL_SOURCE_NUM];
+ kal_uint8 dma_read_index[USBACM_LOGGING_TOTAL_SOURCE_NUM];
+
+ kal_uint8 transmitting_buf_index; /* buffer source which transmitting */
+ kal_uint8 buffer_full_index[USBACM_LOGGING_TOTAL_SOURCE_NUM];
+ kal_uint8 empty_buf_count[USBACM_LOGGING_TOTAL_SOURCE_NUM]; /* the empty buffer number */
+#endif
+
+ kal_uint8 transmitting_count;
+ kal_bool b_not_first_time; /* used for IRDBG only */
+ kal_bool b_reset;
+ kal_bool b_enable;
+}USBACM_LOGGING_Struct;
+
+
+extern kal_uint8 L1D_IRDMA_Power_GetHandle(void);
+extern void L1D_IRDMA_Power_On(kal_uint8 handle);
+extern void L1D_IRDMA_Power_Off(kal_uint8 handle);
+
+#if (defined(DRV_USB_LOGGING_V5)||defined(DRV_USB_LOGGING_V5))
+extern void USBACM_LOGGING_3G_Reset(void);
+extern void USBACM_LOGGING_Reset_Hdlr(void);
+#endif
+extern void USBACM_LOGGING_Init(void);
+extern void USBACM_LOGGING_Start_Hdlr(void);
+extern void USBACM_LOGGING_Stop(void);
+extern void USBACM_LOGGING_Connect_Hdlr(void);
+extern void USBACM_LOGGING_Discon_Hdlr(void);
+//extern void USBACM_LOGGING_Flush_Data(void);
+extern void USB_DSPIRDBG_Flush_Data(void);
+
+#endif /* USBACM_LOGGING_H */
+
+
diff --git a/mcu/driver/connectivity/usb_class/include/usbd.h b/mcu/driver/connectivity/usb_class/include/usbd.h
new file mode 100644
index 0000000..015357f
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/usbd.h
@@ -0,0 +1,437 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usbd.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb1.1 host definitions.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USBD_H
+#define USBD_H
+
+//#include "usb_hcd.h"
+#include "dcl.h"
+//#include "kal_non_specific_general_types.h"
+#include "usb.h"
+#include "usb_drv.h"
+#include "usb_custom_def.h"
+
+
+#define USBD_MAX_CFG_NUM 8
+#define USBD_MAX_IF_PER_CFG 4
+#define USBD_MAX_INTERFACE_NUM (USBD_MAX_CFG_NUM * USBD_MAX_IF_PER_CFG)
+#define USBD_MAX_EP_PER_IF 3
+#define USBD_MAX_EP_NUM (USBD_MAX_INTERFACE_NUM * USBD_MAX_EP_PER_IF)
+#define USBD_MAX_CLASS_DRIVER 2
+
+#define USBD_EP0_MAX_PKT_SIZE 64
+
+#define USBD_ERROR_DELAY 35 /* 10ms unit*/
+
+#define USBD_SET_ADDRESS_RECOVERY_DELAY 1
+
+#define USBD_TEST_MODE_DELAY 1500
+//#define USBD_TEST_MODE_DELAY 300
+
+
+#ifdef __OTG_ENABLE__
+#define USB_EXT_HOST_NUM 1
+#else
+#define USB_EXT_HOST_NUM 0
+#endif
+
+#ifdef __IC_USB_ENABLE__
+#define USB_INT_HOST_NUM 1
+#else
+#define USB_INT_HOST_NUM 0
+#endif
+
+
+#define USB_HOST_NUM (USB_EXT_HOST_NUM + USB_INT_HOST_NUM)
+
+
+/* USBD test mode */
+#define USBD_TEST_SE0_NAK 0x0101
+#define USBD_TEST_J 0x0102
+#define USBD_TEST_K 0x0103
+#define USBD_TEST_PACKET 0x0104
+#define USBD_TEST_HS_HOST_PORT_SUSPEND_RESUME 0x0106
+#define USBD_TEST_SINGLE_STEP_GET_DEV_DESC 0x0107
+#define USBD_TEST_SINGLE_STEP_SET_FEATURE 0x0108
+#define USBD_TEST_UNSUPPORTED_DEVICE 0xBADD
+
+
+
+
+#define EVENT_USBD_EP0_DONE ((kal_uint32)0x00000001)
+#define EVENT_USBD_EP0_DETACH ((kal_uint32)0x00000002)
+#define EVENT_USBD_EP0_ENUMERATION ((kal_uint32)0x00000004)
+#define EVENT_USBD_RESUME_DONE ((kal_uint32)0x00000008)
+
+typedef enum
+{
+ USBD_CH9_START,
+ USBD_CH9_STOP,
+ USBD_CH9_DELAY_SET_ADDR,
+ USBD_CH9_SET_ADDR,
+ USBD_CH9_GET_DEV_DESC_8,
+ USBD_CH9_GET_DEV_DESC,
+ USBD_CH9_GET_CONF_DESC_9,
+ USBD_CH9_GET_CONF_DESC,
+ USBD_CH9_SET_CONF,
+ USBD_CH9_SET_HNP_ENABLE,
+ USBD_CH9_ENUM_OK,
+ USBD_CH9_ENUM_FAIL
+}USBD_CH9_STATE;
+
+
+typedef enum
+{
+ USBD_EP0_SETUP,
+ USBD_EP0_DATA,
+ USBD_EP0_STATUS,
+ USBD_EP0_NONE
+}USBD_EP0_STATE;
+
+
+typedef enum
+{
+ USBD_EP0_DATA_RECV,
+ USBD_EP0_DATA_SEND,
+ USBD_EP0_DATA_NULL /* no data phase is needed */
+}USBD_EP0_DATA_DIR;
+
+
+typedef enum
+{
+ USBD_HNP_NOT_SUPPORT,
+ USBD_HNP_SUPPORT,
+ USBD_HNP_ENABLE_STALL
+}USBD_HNP_SUPPORT_TYPE;
+
+
+typedef enum
+{
+ USBD_TEST_MODE_NONE = 0,
+ USBD_TEST_MODE_TYPE_SE0,
+ USBD_TEST_MODE_TYPE_J,
+ USBD_TEST_MODE_TYPE_K,
+ USBD_TEST_MODE_TYPE_TEST_PACKET,
+ USBD_TEST_MODE_TYPE_HS_HOST_PORT_SUSPEND_RESUME,
+ USBD_TEST_MODE_TYPE_SINGLE_STEP_GET_DEV_DESC,
+ USBD_TEST_MODE_TYPE_SINGLE_STEP_SET_FEATURE,
+ USBD_TEST_MODE_TYPE_UNSUPPORTED_DEVICE
+}USBD_TEST_MODE_TYPE;
+
+
+/* EP0 status */
+typedef struct
+{
+ kal_uint8 device_addr; /* new function address */
+// kal_uint8 max_packet_size;
+ Usb_Command setup_cmd; /* setup packet address */
+ kal_uint8 *data_ptr; /* data packet address */
+ USBD_EP0_DATA_DIR ep0_data_dir; /* data phase direction */
+ kal_uint32 sofar; /* number of bytes sent/recv'd so far */
+ kal_uint32 todo; /* number of bytes to send/recv */
+}USBD_EP0_Status;
+
+
+/* Bulk IN endpoint status */
+typedef struct
+{
+ kal_uint8 max_packet_size;
+ kal_uint8 *data_ptr; /* data packet address */
+ kal_uint32 sofar; /* number of bytes sent/recv'd so far */
+ kal_uint32 todo; /* number of bytes to send/recv */
+}USBD_EPIN_Status;
+
+
+/* Bulk OUT endpoint status */
+typedef struct
+{
+ kal_uint8 max_packet_size;
+ kal_uint8 *data_ptr; /* data packet address */
+ kal_uint32 sofar; /* number of bytes sent/recv'd so far */
+ kal_uint32 todo; /* number of bytes to send/recv */
+}USBD_EPOUT_Status;
+
+/* endpoint information, including endpoint status */
+typedef struct
+{
+ Usb_Ep_Dscr *p_stdep; /* ep descriptor */
+ union
+ {
+ USBD_EPIN_Status epin_status;
+ USBD_EPOUT_Status epout_status;
+ }ep_status;
+}USBD_EP_Info;
+
+
+typedef struct
+{
+ Usb_If_Dscr *p_interface_desc;
+ USBD_EP_Info *p_ep_info[USBD_MAX_EP_PER_IF];
+ kal_uint8 ep_number;
+}USBD_IF_Info;
+
+
+typedef struct
+{
+ Usb_Cfg_Dscr *p_cfg_desc;
+ USBD_IF_Info *p_interface_info[USBD_MAX_IF_PER_CFG];
+ kal_uint8 match_class_driver_index[USBD_MAX_IF_PER_CFG]; /* To store the class driver index for each interface */
+ kal_uint8 match_class_driver_point; /* To store the weighting of class driver index for each configuration */
+ kal_uint8 active_if_index_map; /* the index mapping that the active interface */
+ kal_uint8 interface_number;
+ kal_uint8 match_class_num; /* the number that match class drivers, exclude default driver */
+}USBD_CFG_Info;
+
+
+typedef struct
+{
+ Usb_Dev_Dscr dev_desc;
+ USBD_CFG_Info cfg_info[USBD_MAX_CFG_NUM];
+// Usb_IAD_Dscr *iad_desc;
+ USBD_IF_Info interface_info[USBD_MAX_INTERFACE_NUM];
+ USBD_EP_Info ep_info[USBD_MAX_EP_NUM];
+ Usb_String_Dscr *string_desc;
+ Usb_Otg_Dscr *p_otg_desc[USBD_MAX_CFG_NUM];
+ Usb_Dev_Qual_Dscr *dev_qual_dscr;
+ Usb_Other_Speed_Cfg_Dscr *other_speed_cfg_dscr;
+// Usb_OS_String_Dscr *os_string_desc;
+// Usb_Ext_Compat_ID_OS_Feature_Dscr *os_feature_desc;
+ kal_uint8 *p_conf_data[USBD_MAX_CFG_NUM];
+ kal_uint8 cfg_number;
+}USBD_Desc_Info;
+
+
+typedef struct
+{
+ kal_bool (* match)(kal_uint8 usb_ip_port, USBD_Desc_Info *p_desc_info, kal_uint32 cfg_num, kal_uint32 if_num);
+ void (* startup)(kal_uint8 usb_ip_port, USBD_Desc_Info *p_desc_info, kal_uint32 cfg_num, kal_uint32 if_num);
+ void (* detach)(kal_uint8 usb_ip_port);
+ void (* suspend)(kal_uint8 usb_ip_port);
+ void (* resume)(kal_uint8 usb_ip_port);
+}USBD_ClassDriver_Struct;
+
+
+typedef void (*usbd_ep0_callback)(kal_uint8 usb_ip_port, USB_HCD_STATUS result, kal_uint32 param);
+
+
+typedef struct
+{
+ USBD_Desc_Info desc_info;
+ USBD_EP0_STATE ep0_state; //states machine
+ USBD_EP0_Status ep0_status;
+ USBD_CH9_STATE ch9_state;
+ USBD_ClassDriver_Struct *class_driver_ptr[USBD_MAX_CLASS_DRIVER];
+ usbd_ep0_callback ep0_callback;
+ kal_uint8 ch9_error_count;
+ USBD_HNP_SUPPORT_TYPE support_hnp;
+ kal_uint8 default_class_driver_index;
+ kal_bool b_is_match_hub;
+ kal_uint32 gpt_handle; /*GPT handle*/
+ kal_mutexid usbd_ep0_mutex_id; /* mutex used to protect ep0 setup command. */
+ kal_mutexid usbd_resume_mutex_id; /* mutex used to protect ep0 setup command. */
+ kal_eventgrpid usbd_ep0_event_id; /* event used for ep0 command */
+ kal_eventgrpid usbd_resume_event_id; /* event used for ep0 command */
+ kal_bool b_suspend_mode;
+ kal_uint8 set_cfg_number;
+ kal_uint8 usb_ip_port;
+}USBD_Struct;
+
+
+typedef struct
+{
+ kal_mutexid usbd_com_ep0_mutex_id; /* mutex used to let multiple IPs can be enumerated one by one*/
+ kal_eventgrpid usbd_com_ep0_event_id; /* event used for waiting enumeration done */
+ /* Customizable variables */
+ const USB_HOST_MATCH_PARAM *host_match_param;
+}USBD_Common_Struct;
+
+
+
+//extern void USBD_Deregister_Port_Info(kal_uint8 *usb_ip_port_ptr);
+extern void USBD_Init_Status(kal_uint8 usb_ip_port);
+extern void USBD_Init(kal_uint8 usb_ip_port);
+extern void USBD_Release_Status(kal_uint8 usb_ip_port);
+extern void USBD_Release(kal_uint8 usb_ip_port);
+extern void USBD_Attatch_Hdlr(kal_uint8 usb_ip_port, USB_HCD_STATUS result, kal_uint32 param);
+extern void USBD_Detach_Hdlr(kal_uint8 usb_ip_port, USB_HCD_STATUS result, kal_uint32 param);
+extern void USBD_Suspend_Hdlr(kal_uint8 usb_ip_port, USB_HCD_STATUS result, kal_uint32 param);
+extern USBD_HNP_SUPPORT_TYPE USBD_Get_HNP_Support(kal_uint8 usb_ip_port);
+extern kal_bool USBD_Is_Match_Hub(kal_uint8 usb_ip_port);
+extern void ICUSB_Drv_Init(void);
+extern void USBD_Register_Port_Info(kal_uint8 usb_ip_port, kal_bool b_is_ext_ip);
+
+// Class layer usage API
+extern void USBD_Clear_Feature(USBH_Common_Struct common_str,USBH_EP_Struct usb_ep_str,kal_bool b_is_from_class_drv, usbd_ep0_callback callback);
+extern void USBD_Start_Setup_Cmd(USBH_Common_Struct common_str, Usb_Command *usbd_cmd, kal_uint8* data_ptr, USBD_EP0_DATA_DIR direction, kal_uint32 length, kal_bool b_is_from_class_drv, usbd_ep0_callback callback);
+extern kal_bool USBD_Send_Req(USBH_Common_Struct common_str,USBH_EP_Struct ep_str, kal_uint16 nBytes, void *pSrc);
+extern kal_bool USBD_Recv_Req(USBH_Common_Struct common_str,USBH_EP_Struct ep_str, kal_uint16 nBytes, void *pDst);
+extern void USBD_Suspend_Req(USBH_Common_Struct common_str);
+extern void USBD_Reset_Req(USBH_Common_Struct common_str);
+extern void USBD_Register_Drv_Info(USBH_Common_Struct common_str,USB_HCD_HDLR_TYPE type, USBH_EP_Struct usb_ep_str, usb_hcd_intr_handler_ptr hdlr);
+extern kal_uint8 USBD_HW_Mapping_EP(USBH_Common_Struct common_str,USB_EP_DIRECTION direction);
+extern void USBD_Dis_Attach(USBH_Common_Struct common_str);
+extern void USBD_En_Attach(USBH_Common_Struct common_str);
+extern void USBD_Config_TxEP_Type(USBH_Common_Struct common_str,USBH_EP_Struct ep_str,kal_bool b_is_switch_to_dma);
+extern void USBD_Config_RxEP_Type(USBH_Common_Struct common_str,USBH_EP_Struct ep_str,kal_bool b_is_switch_to_dma);
+extern void USBD_EP_Interval(USBH_Common_Struct common_str,USBH_EP_Struct ep_str,kal_uint8 interval);
+extern void USBD_RxEPInit(USBH_Common_Struct common_str,USBH_EP_Struct usb_ep_str);
+extern void USBD_TxEPInit(USBH_Common_Struct common_str,USBH_EP_Struct usb_ep_str);
+extern void USBD_RxEPEn(USBH_Common_Struct common_str,USBH_EP_Struct usb_ep_str, kal_uint8 interval, kal_bool bDMA);
+extern void USBD_TxEPEn(USBH_Common_Struct common_str,USBH_EP_Struct usb_ep_str, kal_uint8 interval, kal_bool bDMA);
+extern void USBD_TxEPDis(USBH_Common_Struct common_str,USBH_EP_Struct usb_ep_str, kal_bool bDMA);
+extern void USBD_RxEPDis(USBH_Common_Struct common_str,USBH_EP_Struct usb_ep_str, kal_bool bDMA);
+extern void USBD_EPFIFORead(USBH_Common_Struct common_str,USBH_EP_Struct usb_ep_str, kal_uint16 nBytes, void *pDst);
+extern void USBD_EPFIFOWrite(USBH_Common_Struct common_str,USBH_EP_Struct usb_ep_str, kal_uint16 nBytes, void *pDst);
+extern kal_uint16 USBD_EP0_Data_Length(USBH_Common_Struct common_str);
+extern kal_uint32 USBD_EP_Rx_Pkt_Len(USBH_Common_Struct common_str,USBH_EP_Struct usb_ep_str);
+extern void USBD_Clear_Data01(USBH_Common_Struct common_str,USBH_EP_Struct usb_ep_str);
+extern void USBD_Get_DMA_Channel(USBH_Common_Struct common_str,USBH_EP_Struct usb_tx_str, USBH_EP_Struct usb_rx_str, USB_EP_DIRECTION direction, kal_bool same_chan);
+extern void USBD_Free_DMA_Channel(USBH_Common_Struct common_str,USBH_EP_Struct usb_tx_str, USBH_EP_Struct usb_rx_str, USB_EP_DIRECTION direction, kal_bool same_chan);
+extern void USBD_DMA_Setup(USBH_Common_Struct common_str,USBH_EP_Struct ep_str,kal_uint32 addr, kal_uint32 length,usb_dma_callback callback,kal_bool callback_upd_run, kal_bool known_size, USB_DMA_TYPE dma_type);
+extern void USBD_Set_EP_Max_Pkt(USBH_Common_Struct common_str,USBH_EP_Struct usb_ep_str);
+extern kal_bool USBD_Get_UnMask_Irq(USBH_Common_Struct common_str);
+extern kal_bool USBD_Is_High_Speed(USBH_Common_Struct common_str);
+extern void USBD_VBusEnable(USBH_Common_Struct common_str,kal_bool enable);
+extern kal_bool USBD_Bootup_Mode(void);
+
+
+#endif /* USBD_H*/
+
diff --git a/mcu/driver/connectivity/usb_class/include/usbimage_drv.h b/mcu/driver/connectivity/usb_class/include/usbimage_drv.h
new file mode 100644
index 0000000..f110541
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/usbimage_drv.h
@@ -0,0 +1,627 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+* A. Patent Notice:
+* The software delivered hereunder, including any and all updates and upgrades,
+* might be subject to patent rights of standard-setting organizations, patent pools
+* or their respective patent owners, that will be necessarily infringed by the use
+* and distribution of the products incorporating all or part of this software.
+* According to the licensing terms of these patent holders, it is your sole
+* obligation to obtain the necessary patent licenses from these patent holders
+* before you can use or distribute the products incorporating all or part of this
+* software. MediaTek shall not be liable for your failure to obtain or maintain such
+* licenses.
+*
+* As a courtesy to our customers, the following are some of the software that might
+* contain such patent licenses, but MediaTek does not warrant the accuracy or
+* completeness of the information below.
+* (1) MPEG4/AAC/AACPLUS/AACVPLUSV2: essential patents license must be obtained
+* from Via Licensing: <www.vialicensing.com>
+* (2) WAP/MMS security RC5 algorithm belongs to RSA Data Security:
+* <www.rsasecurity.com>
+* Notice: Please contact RSA to get this license before shipping the products to
+* USA which include RC5 security algorithm.
+*
+* B. In addition, customers must contact the respective licensors to obtain
+* necessary software licenses before it can use or distribute the licensed
+* products.
+*
+* As a courtesy to our customers, the following are some of the software licensers
+* and the notice or disclaimer required by their licenses, but MediaTek does not
+* warrant the accuracy or completeness of the information below.
+* (1) Microsoft Windows Media (WMA software):
+* Microsoft: <www.microsoft.com>
+* Approved OEM Manufacturers: <wmlicense.smdisp.net/oem_approved/>
+* Sample Windows Media Licensing Agreements:
+* <www.microsoft.com/windows/windowsmedia/licensing/agreements.aspx>
+* Notice in header or documentation: "This product is protected by certain
+* intellectual property rights of Microsoft and cannot be used or further
+* distributed without a license from Microsoft."
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usbimage_drv.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb IMAGE class driver definitions
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USBIMAGE_DRV_H
+#define USBIMAGE_DRV_H
+
+#include "usb_adap.h"
+#include "usb.h"
+#include "usb_custom.h"
+#include "usb_msdisk.h"
+#include "kal_public_api.h" //#include "stack_ltlcom.h" //MSBB change #include "app_ltlcom.h"
+#include "kal_general_types.h"
+#include "usb_custom_def.h"
+
+
+
+/***********************************************
+ image class specific command definition
+************************************************/
+#define USB_IMAGE_DEVICE_CODE 0x00
+#define USB_IMAGE_SUBCLASS_CODE 0x00
+#define USB_IMAGE_PROTOCOL_CODE 0x00
+#define USB_IMAGE_INTERFACE_CLASS_CODE 0x06
+#define USB_IMAGE_INTERFACE_SUBCLASS_CODE 0x01
+#define USB_IMAGE_INTERFACE_PROTOCOL_CODE 0x01
+
+/* Class-Specific Requset Code, EP0 command*/
+#define USB_IMAGE_CANCEL 0x64
+#define USB_IMAGE_GET_EXTENDED_EVENT_DATA 0x65
+#define USB_IMAGE_RESET 0x66
+#define USB_IMAGE_GET_DEVICE_STATUS 0x67
+
+/* Class-Specific Container Type */
+#define USB_IMAGE_UNDEFINED 0x00
+#define USB_IMAGE_COMMAND_BLOCK 0x01
+#define USB_IMAGE_DATA_BLOCK 0x02
+#define USB_IMAGE_RESPONSE_BLOCK 0x03
+#define USB_IMAGE_EVENT_BLOCK 0x04
+
+/***********************************************
+ Implement definition
+************************************************/
+#define USB_IMAGE_EP_NUMBER 3
+
+
+/* For PTP */
+//#define USB_IMAGE_PTP_MAX_BUFFERSIZE (2*1024)
+#define USB_IMAGE_PTP_MAX_BUFFERSIZE (28*1024)
+#define USB_IMAGE_PTP_MAX_TX_BUFFERSIZE (USB_IMAGE_PTP_MAX_BUFFERSIZE/2)
+//#define USB_IMAGE_PTP_MAX_RX_BUFFERSIZE (USB_IMAGE_PTP_MAX_BUFFERSIZE/2)
+
+#define USB_IMAGE_PTP_MAX_XMLBUFFERSIZE (1024)
+#define USB_IMAGE_PTP_MAX_XMLHREQUESTSIZE (1040)
+#define USB_IMAGE_PTP_MAX_XMLHRSPONSESIZE (1008)
+
+#define USB_IMAGE_PTP_MAX_OBJECT_INFO (1024)
+/* For start job XML buffer */
+#define USB_IMAGE_PTP_MAX_START_JOB_XMLBUFFERSIZE (USB_IMAGE_PTP_MAX_BUFFERSIZE + USB_IMAGE_PTP_MAX_XMLBUFFERSIZE - USB_IMAGE_PTP_MAX_OBJECT_INFO)
+
+
+/* For MTP */
+#define USB_IMAGE_MTP_MAX_TX_BUFFERSIZE (USB_IMAGE_MTP_MAX_BUFFERSIZE/2)
+#define USB_IMAGE_MTP_MAX_RX_BUFFERSIZE (USB_IMAGE_MTP_MAX_BUFFERSIZE/2)
+
+
+
+
+#define USB_IMAGE_CONTAINER_LENGTH 12
+#define USB_IMAGE_RES_1_PARA 16
+#define USB_IMAGE_RES_3_PARA 24
+#define USB_IMAGE_RES_5_PARA 32
+
+/* Interrupt packet buffer */
+#define USB_IMAGE_MAX_INTERRUPT_PKT 5
+
+
+/***********************************************
+ Implement enum and structure
+************************************************/
+typedef struct
+{
+ kal_uint32 ContainerLength;
+ kal_uint16 ContainerType;
+ kal_uint16 Code;
+ kal_uint32 TransactionID;
+ kal_uint32 Parameter1;
+ kal_uint32 Parameter2;
+ kal_uint32 Parameter3;
+#ifdef __MTP_ENABLE__
+ kal_uint32 Parameter4;
+ kal_uint32 Parameter5;
+#endif
+}USB_IMAGE_CONTAINER;
+
+
+typedef struct
+{
+ kal_uint32 ContainerLength;
+ kal_uint16 ContainerType;
+ kal_uint16 Code;
+ kal_uint32 TransactionID;
+}USB_IMAGE_CONTAINER_HEADER;
+
+
+typedef struct
+{
+ kal_uint32 ContainerLength;
+ kal_uint16 ContainerType;
+ kal_uint16 Code;
+ kal_uint32 TransactionID;
+ kal_uint32 Parameter1;
+}USB_IMAGE_EVENT_CONTAINER;
+
+
+typedef enum
+{
+ /* msg from USB to MMI */
+ USB_IMAGE_MSG_MMI_DISCOVERY_IND,
+ USB_IMAGE_MSG_MMI_HREQUEST_IND,
+ USB_IMAGE_MSG_MMI_HRESPONSE_IND,
+ USB_IMAGE_MSG_MMI_DREQUEST_CONF,
+ USB_IMAGE_MSG_MMI_DRESPONSE_CONF,
+// USB_IMAGE_MSG_MMI_CONNECT_TO_PC_IND,
+ USB_IMAGE_MSG_MMI_OPEN_FILE_FAIL_IND,
+ USB_IMAGE_MSG_MMI_HOST_RESET_IND
+}USB_IMAGE_MSG_TYPE;
+
+
+typedef enum
+{
+ /* msg from USB to MTP */
+ USB_MTP_IMAGE_MSG_ENABLE_REQ,
+ USB_MTP_IMAGE_MSG_DISABLE_REQ,
+ USB_MTP_IMAGE_MSG_OPERATION_REQ,
+ USB_MTP_IMAGE_MSG_HOST_ABORT_IND,
+// USB_MTP_IMAGE_MSG_DEVICE_ABORT_IND,
+// USB_MTP_IMAGE_MSG_HOST_CANCEL_IND,
+ USB_MTP_IMAGE_MSG_HOST_SUSPEND_IND
+// USB_MTP_IMAGE_MSG_HOST_RESET_IND
+}USB_MTP_IMAGE_MSG_TYPE;
+
+
+typedef struct {
+ LOCAL_PARA_HDR
+ kal_uint8 *xml_address; /* address of xml packet*/
+ kal_uint32 xml_packet_size; /*xml packet size*/
+}usb_image_xml_struct;
+
+
+typedef struct {
+ LOCAL_PARA_HDR
+ kal_uint8 *dps_xml_request_address; /* address of xml packet*/
+ kal_uint32 dps_xml_request_buffer_size;
+ kal_uint32 dps_xml_start_job_buffer_size;
+ kal_uint8 *dps_xml_response_address;
+ kal_uint32 dps_xml_response_buffer_size;
+}usb_mmi_dps_discovery_ind_struct;
+
+
+typedef struct {
+ LOCAL_PARA_HDR
+ kal_uint32 rx_data_size;
+}usb_ptpimage_data_rx_done_conf_struct, usb_mtpimage_data_rx_done_conf_struct;
+
+
+typedef struct
+{
+ kal_uint8 data_buffer[2][USB_IMAGE_PTP_MAX_BUFFERSIZE/2];
+}USB_IMAGE_PTP_BUFFER;
+
+
+typedef struct
+{
+ kal_uint8 data_buffer[2][USB_IMAGE_MTP_MAX_BUFFERSIZE/2];
+}USB_IMAGE_MTP_BUFFER;
+
+
+typedef struct
+{
+ kal_uint16 Cancellation_Code;
+ kal_uint16 TransactionID[2];
+}USB_IMAGE_BLOCK_STRUCT;
+
+typedef struct
+{
+ kal_uint16 wLength;
+ kal_uint16 Code;
+ kal_uint32 TxEndPoint;
+ kal_uint32 RxEndPoint;
+}USB_IMAGE_DEVICE_STATUS_STRUCT;
+
+
+typedef enum
+{
+ USB_IMAGE_CMD_RX = 0, /* Initial Idle Phase, Receive Command */
+ USB_IMAGE_DATA_TX, /* Transmit Data Phase */
+ USB_IMAGE_DATA_RX, /* Receive Data Phase */
+ USB_IMAGE_RESPONSE /* Transmit Response phase */
+}USB_IMAGE_STATE;
+
+
+typedef enum
+{
+ IMAGE_INTR_IDLE = 0,
+ IMAGE_INTR_SEND_ONE_PKT,
+ IMAGE_INTR_SEND_TWO_PKT,
+ IMAGE_INTR_SEND_LAST_PKT
+}USB_IMAGE_INTR_PIPE_STATE;
+
+
+typedef enum
+{
+ IMAGE_MTP_DISABLE = 0,
+// IMAGE_MTP_DEVICE_ABORT,
+ IMAGE_MTP_HOST_CANCEL, /* When USB receive ep0 cancel command, USB will enter this state,
+ and exit this state to enable when USB receive MTP send the event msg */
+ IMAGE_MTP_HOST_SUSPEND, /* Only USB is waiting for MTP's request response and target receive suspend signal, USB will enter this state,
+ and exit this state to enable when USB receive MTP send the event msg, too. */
+ IMAGE_MTP_ENABLE /* state is enable after MTP response the enable request */
+}USB_IMAGE_MTP_STATE;
+
+
+typedef struct
+{
+ USB_IMAGE_STATE state; /* USB image class state machine */
+ USB_IMAGE_INTR_PIPE_STATE intr_state; /* interrupt pipe state machine */
+ Usb_EpBIn_Status *txpipe;
+ Usb_EpBOut_Status *rxpipe;
+ Usb_EpBIn_Status *intrpipe;
+
+ Usb_Ep_Info *image_ep_in_info;
+ Usb_Ep_Info *image_ep_out_info;
+ Usb_Ep_Info *image_ep_intr_info;
+ Usb_Interface_Info *image_if_info;
+
+ /* the PTP container */
+ USB_IMAGE_CONTAINER image_cmd;
+// USB_IMAGE_CONTAINER image_response;
+ USB_IMAGE_EVENT_CONTAINER image_event;
+
+#ifdef PICTBRIDGE_SUPPORT
+ /* buffer for data/image transmission operation*/
+ USB_IMAGE_PTP_BUFFER *image_buffer;
+
+ /* buffer for data/image's info transmission operation */
+ kal_uint8 *image_info_buffer;
+#endif
+
+#ifdef __MTP_ENABLE__
+ /* buffer for data/image transmission operation*/
+ USB_IMAGE_MTP_BUFFER *mtp_image_buffer;
+
+ /* message content for data phase */
+ kal_uint32 data_total_size; /* size of total data, 0 means no Data phase */
+ kal_uint8 *data_pool_ptr; /* data pool */
+ kal_uint32 data_pool_size; /* size of data pool */
+ kal_uint32 data_size; /* size of real data */
+
+ kal_bool b_is_first_rsp; /* a flag to check if it is the first rsp msg from MTP task */
+
+ kal_bool b_is_mtp_abnormal_msg; /* a flag to check if there is a abnormal (result is not OK) msg from MTP task */
+#endif
+
+ /* Image class ep0 cmd structure */
+ USB_IMAGE_BLOCK_STRUCT cancel_block;
+ USB_IMAGE_DEVICE_STATUS_STRUCT device_status;
+
+ USB_IMAGE_EVENT_CONTAINER image_event_array[USB_IMAGE_MAX_INTERRUPT_PKT];
+
+ kal_uint32 current_transactionID;
+ kal_uint32 total_rx_bytes; /* total RX data phase length with 12 bytes header (PTP only) */
+ kal_uint32 current_rx_bytes; /* current RX data phase length with 12 bytes header (PTP only) */
+ kal_uint32 total_tx_bytes; /* total TX data phase length with 12 bytes header (PTP only) */
+ kal_uint32 current_tx_bytes; /* current TX data phase length with 12 bytes header (PTP only) */
+#ifdef PICTBRIDGE_SUPPORT
+ kal_uint8 rw_buffer_index; /* buffer index for double buffer */
+#endif
+#ifdef __MTP_ENABLE__
+ USB_IMAGE_MTP_STATE mtp_state;
+ kal_uint32 buffer_rw_bytes[2]; /* buffer data load for double buffer, no header */
+ kal_uint8 buffer_read_index; /* buffer read index for double buffer */
+ kal_uint8 buffer_write_index; /* buffer write index for double buffer */
+ kal_bool b_wait_enable_rsp;
+ kal_bool b_wait_disable_rsp;
+ kal_bool b_wait_req_rsp;
+ kal_bool b_is_pending_disable_mtp_msg; /* pending disable mtp due to MTP does not response enable request */
+ kal_bool b_delay_disable_mtp_msg_for_req; /* delay to disable mtp due to MTP is processing a request and USB go into suspend state */
+ kal_bool b_mtp_release_type; /* MTP is disabled due to cable out */
+ kal_bool b_mtp_stop_type; /* MTP is disabled due to user wants to stop */
+ kal_bool b_delay_mtp_stop_config; /* a flag to delay disable MTP in USB boot mode when USB receives STOP_MTP msg */
+ kal_bool b_host_suspend; /* When suspend, USB will send a close session operation to MTP task automatically.
+ This flag is to prevent that USB task handles this close session response msg from MTP due to suspend */
+ kal_bool b_device_cancel; /* When RX cmd, user may hot plug out the memory card, so USB can not continue to receive data.
+ USB will send stall to host, and set this flag to response MTP_TRANSACTION_CANCELLED
+ when PC send USB_IMAGE_GET_DEVICE_STATUS ep0 cmd */
+#endif
+ kal_uint8 intr_read_ptr;
+ kal_uint8 intr_write_ptr;
+
+// kal_bool host_cancel_flag; /* a flag for ep0 get device status cmd to return response code */
+ kal_bool send_usb_image_reset_ilm; /* a flag to check whether it needs to send the reset message */
+ kal_bool usb_reset;
+ kal_bool image_ep0_reset;
+
+ kal_bool usb_image_stop; /* Upper layer is slower than USB task, if user plug cable in/out quickly,
+ USB task's state machine will not sync with upper layer.
+ Use this flag to let USB task wait for upper layer */
+ kal_bool is_suspend_state;
+ kal_bool is_session_open;
+
+#ifdef PICTBRIDGE_SUPPORT
+ /* Customizable variables */
+ const USB_IMAGE_PARAM *image_param;
+#endif
+#ifdef __MTP_ENABLE__
+ /* Customizable variables */
+ const USB_MTP_IMAGE_PARAM *mtp_image_param;
+#endif
+}USBImage_Struct;
+
+
+/***********************************************
+ function and global variable
+************************************************/
+extern USBImage_Struct g_USBImage;
+extern USB_IMAGE_CONTAINER g_USB_Image_Response;
+
+extern void USB_Image_Copy_Unicode_String(kal_uint8 *pdest, const kal_uint16 *source_string, kal_uint8 string_num);
+extern void USB_Image_If_Create(void *ifname);
+extern void USB_Image_If_Reset(void);
+extern void USB_Image_If_Enable(void);
+extern void USB_Image_If_Speed_Reset(kal_bool b_other_speed);
+extern void USB_Init_Image_Status(void);
+#ifdef PICTBRIDGE_SUPPORT
+extern void USB_Init_PTP_Status(void);
+#endif
+#ifdef __MTP_ENABLE__
+extern void USB_Init_MTP_Status(void);
+#endif
+extern void USB_Release_Image_Status(void);
+#ifdef __MTP_ENABLE__
+extern void USB_Release_MTP_Status(void);
+#endif
+
+extern void USB_Image_Suspend_Hdlr(void);
+extern void USB_Image_Reset_Hdlr(void);
+#ifdef PICTBRIDGE_SUPPORT
+extern void USB_Image_Reset_PTP_Hdlr(void);
+#endif
+extern void USB_Image_BuildRx(void *addr, kal_uint32 len);
+extern void USB_Image_BuildTx(void *addr, kal_uint32 len);
+extern void USB_Image_ReturnTx(void *addr, kal_uint32 len);
+extern void USB_Send_Null_Packet(kal_uint8 no);
+#ifdef __MTP_ENABLE__
+extern void USB_Send_Header_Packet(kal_uint8 ep_num, void *pSrc);
+extern kal_uint16* USB_MTP_Image_Get_Storage_Description_String_1_Ptr(void);
+extern kal_uint16* USB_MTP_Image_Get_Storage_Description_String_2_Ptr(void);
+#endif
+extern void USB_Image_Send_Intr(void);
+extern void USB_Image_Cancel_By_Device(void);
+extern void USB_Image_Send_Msg(USB_IMAGE_MSG_TYPE usb_msg_type);
+extern void USB_MTP_Image_Send_Msg(USB_MTP_IMAGE_MSG_TYPE usb_msg_type);
+
+
+#endif /* USBIMAGE_DRV_H */
+
+
diff --git a/mcu/driver/connectivity/usb_class/include/usbimage_mtp_state.h b/mcu/driver/connectivity/usb_class/include/usbimage_mtp_state.h
new file mode 100644
index 0000000..8f58ff6
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/usbimage_mtp_state.h
@@ -0,0 +1,423 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+* A. Patent Notice:
+* The software delivered hereunder, including any and all updates and upgrades,
+* might be subject to patent rights of standard-setting organizations, patent pools
+* or their respective patent owners, that will be necessarily infringed by the use
+* and distribution of the products incorporating all or part of this software.
+* According to the licensing terms of these patent holders, it is your sole
+* obligation to obtain the necessary patent licenses from these patent holders
+* before you can use or distribute the products incorporating all or part of this
+* software. MediaTek shall not be liable for your failure to obtain or maintain such
+* licenses.
+*
+* As a courtesy to our customers, the following are some of the software that might
+* contain such patent licenses, but MediaTek does not warrant the accuracy or
+* completeness of the information below.
+* (1) MPEG4/AAC/AACPLUS/AACVPLUSV2: essential patents license must be obtained
+* from Via Licensing: <www.vialicensing.com>
+* (2) WAP/MMS security RC5 algorithm belongs to RSA Data Security:
+* <www.rsasecurity.com>
+* Notice: Please contact RSA to get this license before shipping the products to
+* USA which include RC5 security algorithm.
+*
+* B. In addition, customers must contact the respective licensors to obtain
+* necessary software licenses before it can use or distribute the licensed
+* products.
+*
+* As a courtesy to our customers, the following are some of the software licensers
+* and the notice or disclaimer required by their licenses, but MediaTek does not
+* warrant the accuracy or completeness of the information below.
+* (1) Microsoft Windows Media (WMA software):
+* Microsoft: <www.microsoft.com>
+* Approved OEM Manufacturers: <wmlicense.smdisp.net/oem_approved/>
+* Sample Windows Media Licensing Agreements:
+* <www.microsoft.com/windows/windowsmedia/licensing/agreements.aspx>
+* Notice in header or documentation: "This product is protected by certain
+* intellectual property rights of Microsoft and cannot be used or further
+* distributed without a license from Microsoft."
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usbimage_mtp_state.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file implements the MEDIA TRANSFER PROTOCOL (MTP) definitions
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USB_IMAGE_MTP_STATE_H
+#define USB_IMAGE_MTP_STATE_H
+
+//#include "kal_non_specific_general_types.h"
+#include "usbimage_drv.h"
+#include "kal_public_api.h" //#include "stack_ltlcom.h" //MSBB change #include "app_ltlcom.h"
+
+
+/***********************************************
+ PTP/MTP specific command definitions
+************************************************/
+/* Operation Codes */
+#define MTP_GET_DEVICE_INFO 0x1001
+#define MTP_OPEN_SESSION 0x1002
+#define MTP_CLOSE_SESSION 0x1003
+#define MTP_GET_STORAGE_IDS 0x1004
+#define MTP_GET_STORAGE_INFO 0x1005
+#define MTP_GET_NUM_OBJECTS 0x1006
+#define MTP_GET_OBJECT_HANDLES 0x1007
+#define MTP_GET_OBJECT_INFO 0x1008
+#define MTP_GET_OBJECT 0x1009
+#define MTP_DELETE_OBJECT 0x100B
+#define MTP_SEND_OBJECT_INFO 0x100C
+#define MTP_SEND_OBJECT 0x100D
+
+#define MTP_FORMAT_STORE 0x100F
+#define MTP_RESET_DEVICE 0x1010
+#define MTP_SET_OBJECT_PROTECTION 0x1012
+
+#define MTP_GET_DEVICE_PROP_DESC 0x1014
+#define MTP_GET_DEVICE_PROP_VALUE 0x1015
+#define MTP_SET_DEVICE_PROP_VALUE 0x1016
+
+#define MTP_RESET_DEVICE_PROP_VALUE 0x1017
+
+#define MTP_GET_PARTIAL_OBJECT 0x101B
+
+/* MTP only */
+#define MTP_GET_OBJECT_PROPS_SUPPORTED 0x9801
+#define MTP_GET_OBJECT_PROP_DESC 0x9802
+#define MTP_GET_OBJECT_PROP_VALUE 0x9803
+#define MTP_SET_OBJECT_PROP_VALUE 0x9804
+
+#define MTP_GET_OBJECT_PROP_LIST 0x9805
+#define MTP_SET_OBJECT_PROP_LIST 0x9806
+#define MTP_GET_INTER_DEPENDENT_PROP_DESC 0x9807
+#define MTP_SEND_OBJECT_PROP_LIST 0x9808
+
+
+#define MTP_GET_OBJECT_REFERENCES 0x9810
+#define MTP_SET_OBJECT_REFERENCES 0x9811
+#define MTP_SKIP 0x9820
+
+
+/* DRM only */
+#define MTP_GET_SECURE_TIME_CHALLENGE 0x9101
+#define MTP_SET_SECURE_TIME_RESPONSE 0x9102
+#define MTP_SET_LICENSE_RESPONSE 0x9103
+#define MTP_GET_SYNC_LIST 0x9104
+#define MTP_SEND_METER_CHALLENGE_QUERY 0x9105
+#define MTP_GET_METER_CHALLENGE 0x9106
+#define MTP_SET_METER_RESPONSE 0x9107
+#define MTP_CLEAN_DATA_STORE 0x9108
+#define MTP_GET_LICENSE_STATE 0x9109
+#define MTP_DRM_CMD_1 0x910A
+#define MTP_DRM_CMD_2 0x910B
+#define MTP_DRM_CMD_3 0x9001
+#define MTP_DRM_CMD_4 0x9002
+
+
+
+
+/* Response Codes */
+#define MTP_OK 0x2001
+#define MTP_GENERAL_ERROR 0x2002
+#define MTP_SESSION_NOT_OPEN 0x2003
+#define MTP_OPERATION_NOT_SUPPORTED 0x2005
+#define MTP_PARAMETER_NOT_SUPPORTED 0x2006
+#define MTP_NO_THUMBNAIL_PRESENT 0x2010
+#define MTP_STORE_NOT_AVAILABLE 0x2013
+#define MTP_DEVICE_BUSY 0x2019
+#define MTP_SESSION_ALREADY_OPEN 0x201E
+#define MTP_TRANSACTION_CANCELLED 0x201F
+
+
+
+
+/* Event Codes */
+#define MTP_CANCEL_TRANSACTION 0x4001
+#define MTP_OBJECT_ADDED 0x4002
+#define MTP_OBJECT_REMOVED 0x4003
+#define MTP_STORE_ADDED 0x4004
+#define MTP_STORE_REMOVED 0x4005
+#define MTP_DEVICE_PROP_CHAGNED 0x4006
+#define MTP_OBJECT_INFO_CHAGNED 0x4007
+#define MTP_REQUEST_OBJECT_TRANSFER 0x4009
+#define MTP_DEVICE_RESET 0x400B
+#define MTP_STORAGE_INFO_CHANGED 0x400C
+
+
+/* Object Format Codes */
+#define MTP_UNDEFINED 0x3000
+#define MTP_ASSOCIATION 0x3001
+#define MTP_SCRIPT 0x3002
+#define MTP_DPOF 0x3006
+#define MTP_MP3 0x3009
+#define MTP_ASF 0x300C
+#define MTP_DEFINED 0x3800
+#define MTP_EXIF_JPEG 0x3801
+#define MTP_TIFF_EP 0x3802
+#define MTP_BMP 0x3804
+#define MTP_CIFF 0x3805
+#define MTP_GIF 0x3807
+#define MTP_JFIF 0x3808
+#define MTP_PNG 0x380B
+#define MTP_TIFF 0x380D
+#define MTP_TIFF_IT 0x380E
+#define MTP_WMA 0xB901
+#define MTP_WMV 0xB981
+#define MTP_ABSTRACT_AUDIO_ALBUM 0xBA03
+#define MTP_ABSTRACT_AUDIOVIDEO_PLAYLIST 0xBA05
+
+/* Device Properties Codes */
+#define MTP_BATTERY_LEVEL 0x5001
+#define MTP_DATE_TIME 0x5011
+#define MTP_SYNCHRONIZATION_PARTNER 0xD401
+#define MTP_DEVICE_FRIENDLY_NAME 0xD402
+#define MTP_VOLUME 0xD403
+#define MTP_DEVICELCON 0xD405
+#define MTP_SESSION_INITIATOR_VERSION_INFO 0xD406
+#define MTP_PLAYBACK_RATE 0xD410
+#define MTP_PLAYBACK_OBJECT 0xD411
+#define MTP_PLAYBACK_CONTAINER_INDEX 0xD412
+
+/* DRM only */
+#define MTP_SECURE_TIME 0xD101
+#define MTP_DEVICE_CERIFICATE 0xD102
+
+
+
+/* VenderExtensionID */
+#define MTP_VENDER_EXTENSION_ID_093 0x00000006
+#define MTP_VENDER_EXTENSION_ID_10 0xFFFFFFFF
+
+/* Functional Mode Values*/
+#define MTP_STANDARD_MODE 0x0000
+#define MTP_SLEEP_STATE 0x0001
+
+/* ObjectInfo ProtectionStatus Values*/
+#define MTP_NO_PROTECTION 0x0000
+#define MTP_READ_ONLY 0x0001
+
+/* Storage Types */
+#define MTP_FIXED_ROM 0x0001
+#define MTP_REMOVABLE_ROM 0x0002
+#define MTP_FIXED_RAM 0x0003
+#define MTP_REMOVABLE_RAM 0x0004
+
+/* File System Type Values */
+#define MTP_GENERIC_FLAT 0x0001
+#define MTP_GENERIC_HIERARCHICAL 0x0002
+#define MTP_DCF 0x0003
+
+/* StorageInfo AccessCapability Values */
+#define MTP_READ_WRITE 0x0000
+#define MTP_READ_ONLY_WITHOUT_DELETION 0x0001
+#define MTP_READ_ONLY_WITH_DELETION 0x0002
+
+/* Association Types */
+#define MTP_GENERIC_FOLDER 0x0001
+#define MTP_ALBUM 0x0002
+#define MTP_TIME_SEQUENCE 0x0003
+#define MTP_HORIZONTAL_PANORAMIC 0x0004
+#define MTP_VERTICAL_PANORAMIC 0x0005
+#define MTP_2D_PANORAMIC 0x0006
+#define MTP_ANCILLARY 0x0007
+
+/***********************************************
+ Implement definition
+************************************************/
+#define MTP_MAX_OPERATION_CODE_SIZE 21
+//#define MTP_MAX_OPERATION_CODE_SIZE 35
+
+#define MTP_MAX_EVENT_CODE_SIZE 4
+
+//#define MTP_MAX_DEVICE_PROPERTIES_SUPPORTED_SIZE 7
+#define MTP_MAX_DEVICE_PROPERTIES_SUPPORTED_SIZE 2
+
+//#define MTP_MAX_PLAYBACK_FORMAT_CODE_SIZE 7
+#define MTP_MAX_PLAYBACK_FORMAT_CODE_SIZE 2
+
+
+/***********************************************
+ Implement enum and structure
+************************************************/
+typedef struct
+{
+ kal_uint16 StandardVersion;
+ kal_uint16 VenderExtensionID[2];
+ kal_uint16 VenderExtensionVersion;
+ kal_uint8 VendorExtensionDescNum;
+ kal_uint8 VendorExtensionDescString[29][2];
+ kal_uint8 FunctionalMode[2];
+ kal_uint8 OperationsSupportedSize[4];
+ kal_uint8 OperationsSupported[MTP_MAX_OPERATION_CODE_SIZE][2];
+ kal_uint8 EventsSupportedSize[4];
+ kal_uint8 EventsSupported[MTP_MAX_EVENT_CODE_SIZE][2];
+ kal_uint8 DevicePropertiesSupportedSize[4];
+ kal_uint8 DevicePropertiesSupported[MTP_MAX_DEVICE_PROPERTIES_SUPPORTED_SIZE][2];
+ kal_uint8 CaptureFormatsSize[4]; /* empty array*/
+ kal_uint8 PlaybackFormatsSize[4];
+ kal_uint8 PlaybackFormats[MTP_MAX_PLAYBACK_FORMAT_CODE_SIZE][2];
+// kal_uint8 padding;
+}MTP_DeviceInfo_Struct;
+
+
+typedef struct
+{
+ kal_uint16 DevicePropertyCode;
+ kal_uint16 DataType;
+ kal_uint8 GetSet;
+}MTP_DeviceProperty_Struct;
+
+
+
+typedef struct
+{
+ kal_uint16 StorageType;
+ kal_uint16 FilesystemType;
+ kal_uint16 AccessCapability;
+ kal_uint16 MaxCapacity[4];
+ kal_uint16 FreeSpaceInBytes[4];
+ kal_uint16 FreeSpaceInImages[2];
+}MTP_StorageInfo_Struct;
+
+
+typedef struct
+{
+ kal_uint32 StorageID;
+ kal_uint16 ObjectFormat;
+ kal_uint16 ProtectionStatus;
+ kal_uint32 ObjectCompressedSize;
+ kal_uint16 ThumbFormat;
+ kal_uint16 ThumbCompressedSize[2];
+ kal_uint16 ThumbPixWidth[2];
+ kal_uint16 ThumbPixHeight[2];
+ kal_uint16 ImagePixWidth[2];
+ kal_uint16 ImagePixHeight[2];
+ kal_uint16 ImageBitDepth[2];
+ kal_uint16 ParentObject[2];
+ kal_uint16 AssociationType;
+ kal_uint32 AssociationDesc;
+ kal_uint32 SequenceNumber;
+}MTP_ObjectInfo_Struct;
+
+
+typedef struct
+{
+ /* PTP dataset structure */
+ MTP_DeviceInfo_Struct image_deviceinfo;
+ kal_bool is_wait_host_respone;
+}USB_IMAGE_MTP_Struct;
+
+
+/***********************************************
+ function and global variable
+************************************************/
+extern USB_IMAGE_MTP_Struct g_MTPImage;
+extern USB_IMAGE_CONTAINER_HEADER g_USB_Image_Data_Header;
+
+extern kal_bool USB_MTP_Is_RX_Cmd(kal_uint16 cmd_code);
+
+extern void USB_MTP_Parse_MTP_Meg(ilm_struct *p_recv_ilm);
+extern void USB_MTP_Parse_MTP_Event_Meg(ilm_struct *p_recv_ilm);
+extern void USB_MTP_Parse_USB_Meg(ilm_struct *p_recv_ilm);
+
+
+#endif /* USB_IMAGE_MTP_STATE_H */
+
+
diff --git a/mcu/driver/connectivity/usb_class/include/usbms_adap.h b/mcu/driver/connectivity/usb_class/include/usbms_adap.h
new file mode 100644
index 0000000..801fd63
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/usbms_adap.h
@@ -0,0 +1,137 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usbms_adap.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb adaption layer for mass storage definitions
+ *
+ * Author:
+ * -------
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USBMS_ADAP_H
+#define USBMS_ADAP_H
+
+//#include "kal_non_specific_general_types.h"
+#include "usb_msdisk.h"
+#include "usbms_state.h"
+#include "fs_type.h"
+
+/***********************************************
+ function and global variable
+************************************************/
+
+#ifdef __USB_RAMDISK__
+extern USB_DiskDriver_STRUCT USB_RAM_drv;
+void FAT_Init(void);
+#endif
+
+/* translate fd type to usb dev type*/
+extern USB_STORAGE_DEV_TYPE USB_Ms_Trans_Fs_Type(FS_DEVICE_TYPE_ENUM type);
+extern kal_uint8 USB_Ms_Get_Max_LUN(void);
+
+
+extern USB_STORAGE_DEV_STATUS USB_Ms_Checkmedia_Exist(kal_uint8 LUN);
+extern kal_bool USB_Ms_Format(kal_uint8 LUN);
+extern kal_bool USB_Ms_Read_Capacity(kal_uint8 LUN, kal_uint32 *max_lba, kal_uint32 *sec_len);
+extern kal_bool USB_Ms_Read_FormatCapacity(kal_uint8 LUN, kal_uint32 *max_lba, kal_uint32 *sec_len);
+//extern kal_bool USB_Ms_Read(kal_uint8 LUN, void *data, kal_uint32 LBA, kal_uint16 sec_len);
+//extern kal_bool USB_Ms_Write(kal_uint8 LUN, void *data, kal_uint32 LBA, kal_uint16 sec_len);
+extern kal_bool USB_Ms_Read_Write(USB_MS_DIRECTION direct, kal_uint8 LUN, void *data, kal_uint32 LBA, kal_uint16 sec_len);
+extern kal_bool USB_Ms_Prevmedia_Removal(kal_uint8 LUN, kal_bool enable);
+extern USB_STORAGE_DEV_TYPE USB_Ms_Dev_Type(kal_uint8 LUN);
+
+#endif //USBMS_ADAP_H
+
diff --git a/mcu/driver/connectivity/usb_class/include/usbms_drv.h b/mcu/driver/connectivity/usb_class/include/usbms_drv.h
new file mode 100644
index 0000000..9238600
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/usbms_drv.h
@@ -0,0 +1,470 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usbms_drv.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb MASS STORAGE class driver definitions
+ *
+ * Author:
+ * -------
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USBMS_DRV_H
+#define USBMS_DRV_H
+
+//#include "kal_non_specific_general_types.h"
+#include "usb_custom.h"
+#include "usb_msdisk.h"
+#include "usb.h"
+#include "usb_adap.h"
+#include "fs_type.h"
+#include "usb_custom_def.h"
+
+
+
+/***********************************************
+ ms class specific command definition
+************************************************/
+
+#define USB_MS_DEVICE_CODE 0x00
+#define USB_MS_SUBCLASS_CODE 0x00
+#define USB_MS_PROTOCOL_CODE 0x00
+#define USB_MS_INTERFACE_CLASS_CODE 0x08
+#define USB_MS_INTERFACE_SUBCLASS_CODE 0x06
+#define USB_MS_INTERFACE_SUBCLASS_CODE_2 0x05
+#define USB_MS_INTERFACE_PROTOCOL_CODE 0x50
+
+/*Class Requset Code, EP0 command*/
+#define USB_MS_RESET 0xff
+#define USB_MS_GETMAXLUN 0xfe
+
+/*Mass storage command*/
+#define USBMS_FORMAT_UNIT 0x04
+#define USBMS_INQUIRY 0x12
+#define USBMS_MODE_SENSE 0x5a
+#define USBMS_MODE_SENSE6 0x1a
+#define USBMS_MODE_SELECT 0x55
+#define USBMS_MODE_SELECT6 0x15
+#define USBMS_PREVALLOW_MEDIA_REMOVL 0x1e
+#define USBMS_READ10 0x28
+#define USBMS_READ12 0xa8
+#define USBMS_READ_FORMATCAPACITY 0x23
+#define USBMS_REQUESTSENSE 0x03
+#define USBMS_START_STOP_UNIT 0x1b
+#define USBMS_TEST_UNIT_READY 0x00
+#define USBMS_VERIFY 0x2f
+#define USBMS_WRITE10 0x2a
+#define USBMS_WRITE12 0xaa
+#define USBMS_READ_CAPACITY 0x25
+
+
+/*CD-ROM command*/
+#define USBMS_READ_TOC 0x43
+#define USBMS_READ_DISC_INFO 0X51
+
+/*Vendor Command*/
+#define USBMS_VENDOR_READ10 0xD0
+#define USBMS_VENDOR_WRITE10 0xD1
+#define USBMS_VENDOR_CMD 0xF0
+#define USBMS_VENDOR_CMD_SUB_SET 0x01
+#define USBMS_VENDOR_CMD_SUB_GET 0x02
+#define USBMS_VENDOR_CMD_SUB_META 0x03
+#define USBMS_VENDOR_CMD_SUB_SET_WIN 0x01
+#define USBMS_VENDOR_CMD_SUB_SET_MAC 0x02
+#define USBMS_VENDOR_CMD_SUB_SET_LINUX 0x03
+
+
+
+/***********************************************
+ implement definition
+************************************************/
+
+#define USB_MS_EP_NUMBER 2
+
+#define MAX_DISK_DRVER 4
+
+#define USBMS_DMA_TIMEOUT 480
+
+#define USBMS_MAX_SINGLE_BUFFERSIZE (USBMS_MAX_BUFFERSIZE/2)
+
+#define USBMS_TX_THREADHOLD (16*1024)
+
+#define USBMS_RX_MAX_SECTOR (USBMS_MAX_SINGLE_BUFFERSIZE/512)
+
+#if USBMS_MAX_SINGLE_BUFFERSIZE > USBMS_TX_THREADHOLD
+#define USBMS_TX_MAX_SECTOR (USBMS_TX_THREADHOLD/512)
+#else
+#define USBMS_TX_MAX_SECTOR (USBMS_MAX_SINGLE_BUFFERSIZE/512)
+#endif
+
+#define USBMS_READ_FAIL_TIMEOUT 50
+#define USBMS_VENDOR_CMD_TIMEOUT 50
+#define USBMS_UNKNOW_CMD_TIMEOUT 500
+
+#define USBMS_INVALID_MAX_LUN 0xFF
+
+/***********************************************
+ ms class specific descriptor structure
+************************************************/
+
+typedef struct
+{
+ kal_uint32 dCBWSignature;
+ kal_uint32 dCBWTag;
+ kal_uint32 dCBWDataTransferLength;
+ kal_uint8 bmCBWFlags;
+ kal_uint8 bCBWLUN;
+ kal_uint8 bCBWCBLength;
+ kal_uint8 CBWCB[16];
+} UsbMs_CBW;
+
+
+typedef struct
+{
+ kal_uint32 dCSWSignature;
+ kal_uint32 dCSWTag;
+ kal_uint32 dCSWDataResidue;
+ kal_uint8 bmCSWStatus;
+ kal_uint8 padding[3]; /* padding to multiple of 4*/
+} UsbMs_CSW;
+
+
+/***********************************************
+ implement enum and structure
+************************************************/
+
+/*Mass storage state*/
+typedef enum
+{
+ USBMS_IDLE = 0, /*Receive Command*/
+ USBMS_RX, /*Receive Data*/
+ USBMS_TX, /*Transmit Data*/
+ USBMS_ACK /*Transmit Data*/
+// USBMS_GETNEXTCMD,
+// USBMS_RESET_STATE
+}USBMS_STATE;
+
+
+/* read capacity command structure */
+typedef struct
+{
+ kal_uint32 LastBA; /*depend on the target*/
+ kal_uint32 BlkLen; /*512*/
+} Read_Capacity_Info;
+
+
+/* maintain read/write status */
+typedef struct
+{
+ kal_uint32 LBA; /*Logical block address*/
+ kal_uint32 BlkLen; /*512*/
+ kal_uint32 rwindex; /*if (rwindex==BlkLen) transation done.*/
+ kal_uint32 msdc_rwindex;
+ kal_bool rw_error_status;
+ kal_uint8 rw_buffer_index;
+} UsbMs_RW_Cmd;
+
+
+typedef struct
+{
+ kal_uint8 ms_buffer[2][USBMS_MAX_SINGLE_BUFFERSIZE];
+}Usb_Disk_Buffer;
+
+
+typedef struct
+{
+ USBMS_STATE nState;
+ kal_bool cbw_is_vaild;
+ kal_bool ms_is_reset; /* USB ep0 receive reset cmd */
+ kal_bool usb_reset; /* USB receive reset signal */
+ kal_bool ms_read_write_reset; /* USB bus reset vaule=True, After READ/WRITE10(12) = False */
+ kal_uint8 max_LUN;
+ kal_uint8 current_LUN;
+ kal_bool is_send_usb_reset_ilm; /* avoid to send reset messages too many times */
+ kal_bool power_off_state[MAX_DISK_DRVER];
+ kal_bool prev_write_fail[MAX_DISK_DRVER];
+
+#ifdef __USB_OTG_RX_TEST__
+ kal_bool device_ms_rx_test_flag;
+#endif
+#ifdef __USB_OTG_TX_TEST__
+ kal_bool device_ms_tx_test_flag;
+#endif
+ kal_uint8 CSWStatusError;
+ kal_uint32 CSWDataResidue;
+
+ Usb_EpBIn_Status *txpipe;
+ Usb_EpBOut_Status *rxpipe;
+ kal_uint32 CBWdata[32/4];
+// UsbMs_CSW CSW;
+ UsbMs_RW_Cmd rw_cmd;
+
+ Usb_Ep_Info *ms_ep_in_info;
+ Usb_Ep_Info *ms_ep_out_info;
+ Usb_Interface_Info *ms_if_info;
+ kal_uint8 *sensePtr;
+
+
+// kal_uint8 dma_timeout_handle; /* DMA time out timer */
+
+
+ /* buffer for read/write operation*/
+ Usb_Disk_Buffer *disk_buffer;
+
+ /* customizable variables*/
+ const USB_MS_PARAM *ms_param;
+
+#ifdef __P_PROPRIETARY_COPYRIGHT__
+ kal_bool b_read_protect;
+ kal_uint32 *read_protect_items;
+ kal_uint32 *read_protect_second_items;
+ kal_uint32 *read_protect_index;
+ kal_uint32 *read_protect_second_index;
+ kal_uint32 read_protect_num;
+ USB_STORAGE_DEV_TYPE read_protect_dev_type;
+#endif
+
+// kal_bool b_ms_first_plugin; /*whether it is first plug in or not in ms mode */
+} UsbMs_Struct;
+
+
+/***********************************************
+ function and global variable
+************************************************/
+extern UsbMs_Struct g_UsbMS;
+
+extern void USB_Ms_BuildRx(void *addr,kal_uint32 len);
+extern void USB_Ms_BuildTx(void *addr, kal_uint32 len);
+
+extern void USB_Ms_If_Create(void *ifname);
+extern void USB_Ms_If_Reset(void);
+extern void USB_Ms_If_Resume(void);
+
+extern void USB_Ms_If_Enable(void);
+extern void USB_Ms_If_Speed_Reset(kal_bool b_other_speed);
+
+extern void USB_Init_Ms_Status(void);
+extern void USB_Release_Ms_Status(void);
+
+#endif /* USBMS_DRV_H */
+
diff --git a/mcu/driver/connectivity/usb_class/include/usbms_state.h b/mcu/driver/connectivity/usb_class/include/usbms_state.h
new file mode 100644
index 0000000..8c87852
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/usbms_state.h
@@ -0,0 +1,152 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usbms_state.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb mass storage state machine definitions
+ *
+ * Author:
+ * -------
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USBMS_STATE_H
+#define USBMS_STATE_H
+
+//#include "stack_common.h"
+//#include "stack_msgs.h"
+#include "kal_public_api.h" //#include "stack_ltlcom.h" //MSBB change #include "app_ltlcom.h"
+
+#define USBMS_DIR_OUT 0x00
+#define USBMS_DIR_IN 0x80
+
+typedef enum
+{
+ USB_MS_ERROR_OK = 0,
+ USB_MS_ERROR_RX_GETNEXTCMD,
+ USB_MS_ERROR_RX_ACK,
+ USB_MS_ERROR_RX_TX,
+ USB_MS_ERROR_TX_IDLE,
+ USB_MS_ERROR_TX_RX
+} USB_MS_ERROR;
+
+typedef enum
+{
+ USB_MS_READ = 0,
+ USB_MS_WRITE
+} USB_MS_DIRECTION;
+
+//extern void USB_Ms_State_Main(ilm_struct *p_recv_ilm, kal_bool b_cable_plugin);
+extern void USB_Ms_State_Main(ilm_struct *p_recv_ilm);
+extern void USB_Ms_Cmd(void *data);
+
+#ifdef __P_PROPRIETARY_COPYRIGHT__
+extern void USB_Ms_Sort_Protect_Items(kal_uint32* data_item, kal_uint32* second_data_item);
+#endif
+
+#endif // USBMS_STATE_H
+
diff --git a/mcu/driver/connectivity/usb_class/include/usbvideo_drv.h b/mcu/driver/connectivity/usb_class/include/usbvideo_drv.h
new file mode 100644
index 0000000..4c8aab7
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/usbvideo_drv.h
@@ -0,0 +1,857 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usbvideo_drv.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb video class driver definitions
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USBVIDEO_DRV_H
+#define USBVIDEO_DRV_H
+
+
+#include "usbvideo_custom.h"
+#include "usbvideo_if.h"
+//#include "kal_non_specific_general_types.h"
+#include "usb.h"
+#include "usb_custom.h"
+#include "kal_public_api.h" //#include "stack_ltlcom.h" //MSBB change #include "app_ltlcom.h"
+#include "cal_comm_def.h"
+#include "cal_api.h"
+#include "mm_comm_def.h"
+
+//#define WEBCAM_TEST_DMA_DELAY
+
+
+/***********************************************
+ video class specific command definition
+************************************************/
+
+/* device descriptor parameter */
+#define USBVIDEO_DEVICE_CODE 0xEF
+#define USBVIDEO_SUBCLASS_CODE 0x02
+#define USBVIDEO_PROTOCOL_CODE 0x01
+
+/*Scriptor length*/
+#define USBVIDEO_VC_INTERFACE_LENGTH 13
+#define USBVIDEO_VC_CT_LENGTH 17
+#define USBVIDEO_VC_OT_LENGTH 9
+#define USBVIDEO_VC_PU_LENGTH 11
+//#define USBVIDEO_VC_PU_LENGTH 12 /* for 1.1 version*/
+#define USBVIDEO_VC_INTR_LENGTH 5
+
+#define USBVIDEO_VS_INTERFACE_LENGTH 14
+#define USBVIDEO_VS_MJPEG_FORMAT_LENGTH 11
+#define USBVIDEO_VS_MJPEG_FRAME_LENGTH 38
+#define USBVIDEO_VS_STILL_LENGTH 6
+#define USBVIDEO_VS_COLOR_MATCHING_LENGTH 6
+
+/* video interface class code */
+#define USBVIDEO_CC_VIDEO 0x0e
+
+/* video interface subclass code */
+#define USBVIDEO_SC_UNDEFINED 0x00
+#define USBVIDEO_SC_VIDEOCONTROL 0x01
+#define USBVIDEO_SC_VIDEOSTREAMING 0x02
+#define USBVIDEO_SC_VIDEO_INTERFACE_COLLECTION 0x03
+
+/* video interface protocol code */
+#define USBVIDEO_PC_PROTOCOL_UNDEFINED 0x00
+
+/* class specific descriptor types*/
+#define USBVIDEO_CS_UNDEFINED 0x20
+#define USBVIDEO_CS_DEVICE 0x21
+#define USBVIDEO_CS_CONFIGURATION 0x22
+#define USBVIDEO_CS_STRING 0x23
+#define USBVIDEO_CS_INTERFACE 0x24
+#define USBVIDEO_CS_ENDPOINT 0x25
+
+/* class specifiv VC interface descriptor subtypes*/
+#define USBVIDEO_VC_DESCRIPTOR_UNDEFINED 0x00
+#define USBVIDEO_VC_HEADER 0x01
+#define USBVIDEO_VC_INPUT_TERMINAL 0x02
+#define USBVIDEO_VC_OUTPUT_TERMINAL 0x03
+#define USBVIDEO_VC_SELECTOR_UNIT 0x04
+#define USBVIDEO_VC_PROCESSING_UNIT 0x05
+#define USBVIDEO_VC_EXTENSION_UNIT 0x06
+
+/* class specifiv VS interface descriptor subtypes*/
+#define USBVIDEO_VS_UNDEFINED 0x00
+#define USBVIDEO_VS_INPUT_HEADER 0x01
+#define USBVIDEO_VS_OUTPUT_HEADER 0x02
+#define USBVIDEO_VS_STILL_IMAGE_FRAME 0x03
+#define USBVIDEO_VS_FORMAT_UNCOMPRESSED 0x04
+#define USBVIDEO_VS_FRAME_UNCOMPRESSED 0x05
+#define USBVIDEO_VS_FORMAT_MJPEG 0x06
+#define USBVIDEO_VS_FRAME_MJPEG 0x07
+#define USBVIDEO_VS_FORMAT_MPEG1 0x08
+#define USBVIDEO_VS_FORMAT_MPEG2PS 0x09
+#define USBVIDEO_VS_FORMAT_MPEG2TS 0x0a
+#define USBVIDEO_VS_FORMAT_MPEG4SL 0x0b
+#define USBVIDEO_VS_FORMAT_DV 0x0c
+#define USBVIDEO_VS_COLORFORMAT 0x0d
+#define USBVIDEO_VS_FORMAT_VENDOR 0x0e
+#define USBVIDEO_VS_FRAME_VENDOR 0x0f
+
+/* USB terminal types */
+#define USBVIDEO_TT_VENDOR_SPECIFIC 0x0100
+#define USBVIDEO_TT_STREAMING 0x0101
+
+/* input terminal types */
+#define USBVIDEO_ITT_VENDOR_SPECIFIC 0x0200
+#define USBVIDEO_ITT_CAMERA 0x0201
+#define USBVIDEO_ITT_MEDIA_TANSPORT_INPUT 0x0202
+
+/* still image capture method */
+#define USBVIDEO_STILL_CAPTURE_METHOD_1 1
+#define USBVIDEO_STILL_CAPTURE_METHOD_2 2
+#define USBVIDEO_STILL_CAPTURE_METHOD_3 3
+
+/* hardware trigger usage*/
+#define USBVIDEO_HARDWARE_TRIGGER_NOT_SUPPORT 0
+#define USBVIDEO_HARDWARE_TRIGGER_SUPPORT 1
+#define USBVIDEO_HARDWARE_TRIGGER_STILL 0
+#define USBVIDEO_HARDWARE_TRIGGER_GENERAL 1
+
+/* MJPEG format descriptor param */
+#define USBVIDEO_FIXED_SIZE_SAMPLES 1
+
+/* request code */
+#define USBVIDEO_RC_UNDEFINED 0x00
+#define USBVIDEO_SET_CUR 0x01
+#define USBVIDEO_GET_CUR 0x81
+#define USBVIDEO_GET_MIN 0x82
+#define USBVIDEO_GET_MAX 0x83
+#define USBVIDEO_GET_RES 0x84
+#define USBVIDEO_GET_LEN 0x85
+#define USBVIDEO_GET_INFO 0x86
+#define USBVIDEO_GET_DEF 0x87
+
+/* VideoControl Interface Control Selectors */
+#define USBVIDEO_VC_CONTROL_UNDEFINED 0x00
+#define USBVIDEO_VC_VIDEO_POWER_MODE_CONTROL 0x01
+#define USBVIDEO_VC_REQUEST_ERROR_CODE_CONTROL 0x02
+
+/* RequestErrorCode */
+#define USBVIDEO_VC_REQUEST_ERROR_NO_ERROR 0x00
+#define USBVIDEO_VC_REQUEST_ERROR_NOT_READY 0x01
+#define USBVIDEO_VC_REQUEST_ERROR_WRONG_STATE 0x02
+#define USBVIDEO_VC_REQUEST_ERROR_POWER 0x03
+#define USBVIDEO_VC_REQUEST_ERROR_OUT_OF_RANGE 0x04
+#define USBVIDEO_VC_REQUEST_ERROR_INVALID_UNIT 0x05
+#define USBVIDEO_VC_REQUEST_ERROR_INVALID_CONTROL 0x06
+#define USBVIDEO_VC_REQUEST_ERROR_INVALID_REQUEST 0x07
+#define USBVIDEO_VC_REQUEST_ERROR_UNKNOWN 0xff
+
+/* videostreaming interface control selectors */
+#define USBVIDEO_VS_US_CONTROL_UNDEFINED 0x0000
+#define USBVIDEO_VS_PROBE_CONTROL 0x0100
+#define USBVIDEO_VS_COMMIT_CONTROL 0x0200
+#define USBVIDEO_VS_STILL_PROBE_CONTROL 0x0300
+#define USBVIDEO_VS_STILL_COMMIT_CONTROL 0x0400
+#define USBVIDEO_VS_STILL_IMAGE_TRIGGER_CONTROL 0x0500
+#define USBVIDEO_VS_STREAM_ERROR_CODE_CONTROL 0x0600
+#define USBVIDEO_VS_GENERATE_KEY_FRAME_CONTROL 0x0700
+#define USBVIDEO_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x0800
+#define USBVIDEO_VS_SYNC_DELAY_CONTROL 0x0900
+
+/* payload header info offset */
+#define USBVIDEO_PAYLOAD_FRAME_ID 0
+#define USBVIDEO_PAYLOAD_EOF 1
+#define USBVIDEO_PAYLOAD_PTS 2
+#define USBVIDEO_PAYLOAD_SCR 3
+#define USBVIDEO_PAYLOAD_RESVD 4
+#define USBVIDEO_PAYLOAD_STILL 5
+#define USBVIDEO_PAYLOAD_ERR 6
+#define USBVIDEO_PAYLOAD_EOH 7
+
+/* the setting of still image trigger control */
+#define USBVIDEO_STILL_IMAGE_NORMAL_OPERATION 0
+#define USBVIDEO_STILL_IMAGE_TRANSMIT 1
+#define USBVIDEO_STILL_IMAGE_TRANSMIT_DEDICATED 2
+#define USBVIDEO_STILL_IMAGE_ABORT 3
+
+/* status type for status packet */
+#define USBVIDEO_STATUS_TYPE_RESERVED 0
+#define USBVIDEO_STATUS_TYPE_VC 1
+#define USBVIDEO_STATUS_TYPE_VS 2
+
+#define USBVIDEO_STATUS_VC_ATTRIBUTRE_CONTROL_VALUE_CHANGE 0x00
+#define USBVIDEO_STATUS_VC_ATTRIBUTRE_CONTROL_INFO_CHANGE 0x01
+#define USBVIDEO_STATUS_VC_ATTRIBUTRE_CONTROL_FAILURE_CHANGE 0x02
+
+#define USBVIDEO_STATUS_VS_EVENT_BUTTOM_PRS 0x00
+#define USBVIDEO_STATUS_VS_EVENT_STREAM_ERR 0x01
+
+#define USBVIDEO_STATUS_VS_VALUE_BUTTOM_REL 0x00
+#define USBVIDEO_STATUS_VS_VALUE_BUTTOM_PRS 0x01
+
+/* Attribute information(capability) offset*/
+#define USBVIDEO_ATTR_INFO_SUPPORT_GET 0
+#define USBVIDEO_ATTR_INFO_SUPPORT_SET 1
+#define USBVIDEO_ATTR_INFO_DISBALE 2
+#define USBVIDEO_ATTR_INFO_AUTO_UPDATE 3
+#define USBVIDEO_ATTR_INFO_ASYNC_CTRL 4
+
+/***********************************************
+ implement definition
+************************************************/
+
+#define USBVIDEO_VC_EP_NUMBER 1 /*interrupt pipe*/
+#define USBVIDEO_VS_EP_NUMBER 1
+
+#define USBVIDEO_IF_LENGTH 258
+#define USBVIDEO_IF_NUMBER 2
+
+
+#define USBVIDEO_CLOCK_FREQUENCY 1000
+
+#define USBVIDEO_CT_ID 1
+#define USBVIDEO_OT_ID 2
+#define USBVIDEO_PU_ID 3
+
+
+
+#define USB_VIDEO_EP_ISO_MAXP 512
+
+
+#define USBVIDEO_VIDEO_BUFFER_NUMBER 3
+
+#define USBVIDEO_PAYLOAD_HEADER_LENGTH 12
+
+#define USBVIDEO_MAX_ATTR_VALUE_SIZE 16
+
+/***********************************************
+ video class specific descriptor structure
+************************************************/
+/* class specific VC interface descriptor */
+/* Note that the kal_uint8[2] array can not modify to kal_uint16
+ It is bacause align issue */
+typedef struct
+{
+ kal_uint8 bLength;
+ kal_uint8 bDescriptorType;
+ kal_uint8 bDescriptorSubType;
+ kal_uint8 bcdUSB[2];
+ kal_uint8 wTotalLength[2];
+ kal_uint8 dwClockFrequency[4];
+ kal_uint8 bInCollection;
+ kal_uint8 baInterfaceNr;
+} USBVideo_Class_VC_If_Dscr;
+
+/* class specific VC input(camera) terminal descriptor */
+/* Note that the kal_uint8[2] array can not modify to kal_uint16
+ It is bacause align issue */
+typedef struct
+{
+ kal_uint8 bLength;
+ kal_uint8 bDescriptorType;
+ kal_uint8 bDescriptorSubType;
+ kal_uint8 bTerminalID;
+ kal_uint8 wTerminalType[2];
+ kal_uint8 bAssocTerminal;
+ kal_uint8 iTerminal;
+ kal_uint8 wObjectiveFocalLengthMin[2];
+ kal_uint8 wObjectiveFocalLengthMax[2];
+ kal_uint8 wOcularFocalLength[2];
+ kal_uint8 bControlSize;
+ kal_uint8 bmControls[2];
+} USBVideo_CT_Dscr;
+
+/* class specific VC output terminal descriptor */
+/* Note that the kal_uint8[2] array can not modify to kal_uint16
+ It is bacause align issue */
+typedef struct
+{
+ kal_uint8 bLength;
+ kal_uint8 bDescriptorType;
+ kal_uint8 bDescriptorSubType;
+ kal_uint8 bTerminalID;
+ kal_uint8 wTerminalType[2];
+ kal_uint8 bAssocTerminal;
+ kal_uint8 bSourceID;
+ kal_uint8 iTerminal;
+} USBVideo_OT_Dscr;
+
+/* class specific VC processing unit descriptor */
+/* Note that the kal_uint8[2] array can not modify to kal_uint16
+ It is bacause align issue */
+typedef struct
+{
+ kal_uint8 bLength;
+ kal_uint8 bDescriptorType;
+ kal_uint8 bDescriptorSubType;
+ kal_uint8 bUintID;
+ kal_uint8 bSourceID;
+ kal_uint8 wMaxMultiplier[2];
+ kal_uint8 bControlSize;
+ kal_uint8 bmControls[2];
+ kal_uint8 iProcessing;
+ //kal_uint8 bmVideoStandards;
+} USBVideo_PU_Dscr;
+
+
+/* class specific interrupt endpoint descriptor */
+/* Note that the kal_uint8[2] array can not modify to kal_uint16
+ It is bacause align issue */
+typedef struct
+{
+ kal_uint8 bLength;
+ kal_uint8 bDescriptorType;
+ kal_uint8 bDescriptorSubType;
+ kal_uint8 wMaxTransferSize[2];
+} USBVideo_Intr_Ep_Dscr;
+
+
+/* class specific VS interface descriptor */
+/* Note that the kal_uint8[2] array can not modify to kal_uint16
+ It is bacause align issue */
+typedef struct
+{
+ kal_uint8 bLength;
+ kal_uint8 bDescriptorType;
+ kal_uint8 bDescriptorSubType;
+ kal_uint8 bNumFormats;
+ kal_uint8 wTotalLength[2];
+ kal_uint8 bEndpointAddress;
+ kal_uint8 bmInfo;
+ kal_uint8 bTerminalLink;
+ kal_uint8 bStillCaptureMethod;
+ kal_uint8 bTriggerSupport;
+ kal_uint8 bTriggerUsage;
+ kal_uint8 bControlSize;
+ kal_uint8 bmaControls;
+} USBVideo_Class_VS_If_Dscr;
+
+/* MJPEG video format descriptor */
+typedef struct
+{
+ kal_uint8 bLength;
+ kal_uint8 bDescriptorType;
+ kal_uint8 bDescriptorSubType;
+ kal_uint8 bFormatIndex;
+ kal_uint8 bNumFrameDescriptors;
+ kal_uint8 bmFlags;
+ kal_uint8 bDefaultFrameIndex;
+ kal_uint8 bAspectRatioX;
+ kal_uint8 bAspectRatioY;
+ kal_uint8 bmInterlaceFlags;
+ kal_uint8 bCopyProtect;
+} USBVideo_MJPEG_Format_Dscr;
+
+/* MJPEG video frame descriptor */
+/* Note that the kal_uint8[2] array can not modify to kal_uint16
+ It is bacause align issue */
+typedef struct
+{
+ kal_uint8 bLength;
+ kal_uint8 bDescriptorType;
+ kal_uint8 bDescriptorSubType;
+ kal_uint8 bFrameIndex;
+ kal_uint8 bmCapabilities;
+ kal_uint8 wWidth[2];
+ kal_uint8 wHeight[2];
+ kal_uint8 dwMinBitRate[4];
+ kal_uint8 dwMaxBitRate[4];
+ kal_uint8 dwMaxVideoFrameBufferSize[4];
+ kal_uint8 dwDefaultFrameInterval[4];
+ kal_uint8 bFrameIntervalType;
+ kal_uint8 dwMinFrameInterval[4];
+ kal_uint8 dwMaxFrameInterval[4];
+ kal_uint8 dwFrameIntervalStep[4];
+} USBVideo_MJPEG_Frame_Dscr;
+
+/* still size structure */
+/* Note that the kal_uint8[2] array can not modify to kal_uint16
+ It is bacause align issue */
+typedef struct
+{
+ kal_uint8 wWidth[2];
+ kal_uint8 wHeight[2];
+}USBVideo_Still_Size;
+
+/* Still image frame descriptor */
+typedef struct
+{
+ kal_uint8 bLength;
+ kal_uint8 bDescriptorType;
+ kal_uint8 bDescriptorSubType;
+ kal_uint8 bEndpointAddress;
+ kal_uint8 bNumImageSizePatterns;
+ USBVideo_Still_Size *p_image_patterns;
+ kal_uint8 bNumCompressionPattern;
+ kal_uint8 *p_compression_patterns;
+} USBVideo_Still_Frame_Dscr;
+
+/* Color matching descriptor */
+typedef struct
+{
+ kal_uint8 bLength;
+ kal_uint8 bDescriptorType;
+ kal_uint8 bDescriptorSubType;
+ kal_uint8 bColorPrimaries;
+ kal_uint8 bTransferCharacteristics;
+ kal_uint8 bMatrixCoefficients;
+} USBVideo_Color_Dscr;
+
+/* video probe and commit setting */
+/* Note that the kal_uint8[2] array can not modify to kal_uint16
+ It is bacause align issue */
+typedef struct
+{
+ kal_uint8 bmHint[2];
+ kal_uint8 bFormatIndex;
+ kal_uint8 bFrameIndex;
+ kal_uint8 dwFrameInterval[4];
+ kal_uint8 wKeyFrameRate[2];
+ kal_uint8 wPFrameRate[2];
+ kal_uint8 wCompQuality[2];
+ kal_uint8 wCompWindowSize[2];
+ kal_uint8 wDelay[2];
+ kal_uint8 dwMaxVideoFrameSize[4];
+ kal_uint8 dwMaxPayloadTransferSize[4];
+ //kal_uint8 dwClockFrequency[4];
+ //kal_uint8 bmFramingInfo;
+ //kal_uint8 bPreferedVersion;
+ //kal_uint8 bMinVersion;
+ //kal_uint8 bMaxVersion;
+}USBVideo_Probe_Commit_Struct;
+
+/* still probe and commit setting */
+/* Note that the kal_uint8[2] array can not modify to kal_uint16
+ It is bacause align issue */
+typedef struct
+{
+ kal_uint8 bFormatIndex;
+ kal_uint8 bFrameIndex;
+ kal_uint8 bCompressionIndex;
+ kal_uint8 dwMaxVideoFrameSize[4];
+ kal_uint8 dwMaxPayloadTransferSize[4];
+}USBVideo_Still_Probe_Commit_Struct;
+
+typedef struct
+{
+ kal_uint8 bHeaderLength;
+ kal_uint8 bmHeaderInfo;
+ kal_uint8 dwPTS[4];
+ kal_uint8 dwSCR[6];
+}USBVideo_Payload_Header;
+
+typedef struct
+{
+ kal_uint8 bStuausType;
+ kal_uint8 bOriginator;
+ kal_uint8 bEvent;
+ kal_uint8 bValue;
+}USBVideo_VS_Status_Pkt_Struct;
+
+typedef struct
+{
+ kal_uint8 bStuausType;
+ kal_uint8 bOriginator;
+ kal_uint8 bEvent;
+ kal_uint8 bSelector;
+ kal_uint8 bAttribute;
+ kal_uint8 bValue;
+}USBVideo_VC_Status_Pkt_Struct;
+
+/***********************************************
+ implement enum and structure
+************************************************/
+
+typedef enum
+{
+ /* msg between media and USB */
+ USBVIDEO_MSG_MED_START_SUCCESS_CNF,
+ USBVIDEO_MSG_MED_START_FAIL_CNF,
+ USBVIDEO_MSG_MED_START_FAIL_CONFIG_CNF,
+ USBVIDEO_MSG_MED_CHANGE_VIDEO_IND,
+ USBVIDEO_MSG_MED_STILL_CAPTURE_IND,
+ USBVIDEO_MSG_MED_START_IND,
+ USBVIDEO_MSG_MED_DEVICE_STILL_CNF,
+ USBVIDEO_MSG_MED_PAUSE_CNF,
+ USBVIDEO_MSG_MED_RESUME_SUCCESS_CNF,
+ USBVIDEO_MSG_MED_RESUME_FAIL_CNF,
+ USBVIDEO_MSG_MED_STOP_IND,
+ USBVIDEO_MSG_MED_STOP_CNF,
+ USBVIDEO_MSG_MED_ABORT_IND,
+
+ /* msg used in internal USB driver */
+ USBVIDEO_MSG_USB_ENUM_DONE,
+ USBVIDEO_MSG_USB_COMPLETE_VIDEO,
+ USBVIDEO_MSG_USB_DMA_DONE,
+ USBVIDEO_MSG_USB_CHANGE_SIZE,
+ USBVIDEO_MSG_USB_STILL_CAPTURE,
+ USBVIDEO_MSG_USB_COMPLETE_STILL,
+ USBVIDEO_MSG_USB_STILL_DMA_DONE,
+ USBVIDEO_MSG_USB_STILL_DMA_PARTIAL,
+ USBVIDEO_MSG_USB_INCALL_DMA_DONE,
+ USBVIDEO_MSG_USB_INCALL_TIMEOUT,
+ USBVIDEO_MSG_USB_INCALL_CHANGE_SIZE,
+ USBVIDEO_MSG_USB_ABORT
+}USBVIDEO_MSG_TYPE;
+
+typedef enum
+{
+ USBVIDEO_STATE_STOP,
+ USBVIDEO_STATE_SEND,
+ USBVIDEO_STATE_DROP,
+ USBVIDEO_STATE_STILL,
+ USBVIDEO_STATE_PRE_PAUSE,
+ USBVIDEO_STATE_PAUSE
+}USBVIDEO_STATE;
+
+typedef enum
+{
+ USBVIDEO_PROBE_NONE,
+ USBVIDEO_PROBE_IN,
+ USBVIDEO_PROBE_DONE,
+ USBVIDEO_COMMIT_IN,
+ USBVIDEO_COMMIT_DONE
+}USBVIDEO_PROBE_STATE;
+
+typedef enum
+{
+ USBVIDEO_START_NONE,
+ USBVIDEO_START_RECV_MED_REQ,
+ USBVIDEO_START_RECV_COMMIT,
+ USBVIDEO_START_DONE
+}USBVIDEO_START_STATE;
+
+typedef enum
+{
+ USBVIDEO_DMA_VIDEO,
+ USBVIDEO_DMA_STILL,
+ USBVIDEO_DMA_INCALL_JPEG,
+ USBVIDEO_DMA_NONE
+}USBVIDEO_DMA_TYPE;
+
+typedef enum
+{
+ USBVIDEO_DMA_DONE_COMPLETE,
+ USBVIDEO_DMA_DONE_STOP /* DMA stop because of timeout, clear halt feature ,or commit but does not change size */
+}USBVIDEO_DMA_DONE_TYPE;
+
+
+typedef enum
+{
+ USBVIDEO_NO_ERROR = 0,
+ USBVIDEO_ERROR_NOT_READY,
+ USBVIDEO_ERROR_WRONG_STATE,
+ USBVIDEO_ERROR_POWER,
+ USBVIDEO_ERROR_OUT_OF_RANGE,
+ USBVIDEO_ERROR_INVALID_UNIT,
+ USBVIDEO_ERROR_INVAILD_CONTROL,
+ USBVIDEO_ERROR_INVAILD_REQUEST,
+ USBVIDEO_ERROR_UNKNOWN
+}USBVideo_ERROR_CODE;
+
+
+typedef struct
+{
+ kal_uint8 subtype;
+ kal_uint8 length;
+}USBVideo_Attr_Sub_Map;
+
+typedef struct
+{
+ USBVIDEO_ATTRIBUTE_TYPE attr_type;
+ kal_uint32 shift;
+ kal_uint8 length;
+ const USBVideo_Attr_Sub_Map *subtype_table;
+}USBVideo_Attr_Map;
+
+typedef struct
+{
+ kal_uint32 video_size[USBVIDEO_VIDEO_BUFFER_NUMBER]; /* complete video size returned by camera */
+ kal_uint8 *video_buffer_addr[USBVIDEO_VIDEO_BUFFER_NUMBER]; /* buffer start address */
+ kal_uint32 video_buffer_size; /* each buffer size */
+ kal_uint8 video_buffer_read_index; /* read pointer */
+ kal_uint8 video_buffer_write_index; /* write pointer */
+ kal_bool video_buffer_full; /* full flag */
+ kal_bool send_video_msg; /* indicate whether complete function should send complete msg to USB task */
+ kal_uint32 sent_video_size; /* already sent size for the current transmitting buffer */
+ kal_uint8 video_frame_id; /* even/odd id filled in payload header */
+
+ kal_uint32 still_size;
+ kal_uint8 still_count;
+
+ kal_uint8 *incall_jpeg_addr;
+ kal_uint32 incall_jpeg_size;
+ kal_uint8 *incall_jpeg_buff;
+
+ USBVIDEO_DMA_TYPE dma_type;
+ USBVIDEO_DMA_DONE_TYPE dma_done_type;
+// kal_bool b_processing_dma; /* be set at DMA callback*/
+
+ kal_uint32 timer_handle;
+ kal_bool b_stop_timer; /* TRUE when clear halt cmd */
+
+ const USBVideo_Video_Size_Info *p_video_size_info; /* be set at USBVideo_VS_If_Create() */
+ const USBVideo_Still_Size_Info *p_still_size_info;
+ kal_uint8 video_size_num;
+ kal_uint8 still_size_num;
+
+ kal_uint32 default_jpeg_max_size[USBVIDEO_VIDEO_SIZE_MAX]; /* be set by MMI */
+ kal_bool b_set_default_jpeg_max_size[USBVIDEO_VIDEO_SIZE_MAX];
+}USBVideo_Control_Struct;
+
+
+typedef struct
+{
+ Usb_EpBIn_Status *intrpipe; /* interrupt EP, VC Interface */
+ Usb_EpBIn_Status *txpipe; /* Bulk IN EP, VS Interface */
+
+ Usb_Ep_Info *vc_ep_intr_info;
+ Usb_Ep_Info *vs_ep_tx_info;
+ Usb_Interface_Info *vc_if_info;
+ Usb_Interface_Info *vs_if_info;
+#ifdef __WEBCAM_SUPPORT_ISO_PIPE__
+ Usb_Alternate_Interface_Info *vs_if_alter_info;
+#endif
+ Usb_IAD_Dscr *iad_desc;
+
+
+ USBVideo_Probe_Commit_Struct vs_probe_control;
+ USBVideo_Probe_Commit_Struct vs_recv_probe_control;
+ kal_uint8 commit_video_index;
+ kal_uint8 video_compression_index;
+ USBVIDEO_PROBE_STATE probe_state;
+
+ USBVideo_Still_Probe_Commit_Struct vs_still_probe_control;
+ USBVideo_Still_Probe_Commit_Struct vs_recv_still_probe_control;
+ kal_uint8 commit_still_index;
+ kal_uint8 commit_still_compression_index;
+ kal_uint8 *descriptor;
+ USBVIDEO_PROBE_STATE still_probe_state;
+ USBVideo_VS_Status_Pkt_Struct vs_status_pkt;
+ USBVideo_VC_Status_Pkt_Struct vc_status_pkt;
+ USBVIDEO_START_STATE video_start_state;
+ USBVideo_Control_Struct video_control;
+ USBVideo_Attr_Value set_attr_value; /* be used at set attr value*/
+ USBVideo_ERROR_CODE error_code;
+ USBVIDEO_STATE state;
+
+ kal_uint32 vc_ct_support;
+ kal_uint32 vc_ct_set;
+ kal_uint32 vc_pu_support;
+ kal_uint32 vc_pu_set;
+ kal_uint8 vc_ct_subtype_cnf[USBVIDEO_ATTRIBUTE_CT_MAX];
+ kal_uint8 vc_pu_subtype_cnf[(kal_uint32)USBVIDEO_ATTRIBUTE_PU_MAX-0x80];
+ kal_uint8 vs_interface_id;
+ kal_bool vc_intr_done; /*decide if issue interrupt */
+ kal_bool vc_set_wbalance_tmp_intr;
+ kal_bool vc_set_hue_intr;
+ kal_bool vc_white_balance_error_setting;
+ kal_bool usb_video_dma_stop;
+ kal_bool is_get_buffer_after_change_size;
+
+ /* default jpeg provided by MMI */
+ usbvideo_default_JPEG_Info *default_jpeg_info; /* incall JPEG, get from media task when pause request */
+ kal_uint8 default_jpeg_num;
+
+ /* customizable variables*/
+ const USB_VIDEO_PARAM *custom_param;
+ const USBVideo_Camera_Param *camera_param;
+
+#ifdef WEBCAM_TEST_DMA_DELAY
+ kal_uint8 test_timer_handle;
+ kal_bool test_enable;
+#endif
+} USBVideo_Struct;
+
+typedef struct
+{
+ LOCAL_PARA_HDR
+ kal_uint8 index;
+}usbvideo_still_dma_struct;
+
+
+/***********************************************
+ function and global variable
+************************************************/
+extern USBVideo_Struct g_USBVideo;
+extern CAL_FEATURE_WEBCAM_GET_VIDEO_SIZE_STRUCT UsbvideoVideoSize; // CAL_FEATURE_WEBCAM_GET_VIDEO_SIZE
+extern CAL_FEATURE_WEBCAM_GET_STILL_SIZE_STRUCT UsbvideoStillSize; // CAL_FEATURE_WEBCAM_GET_STILL_SIZE
+extern CAL_FEATURE_WEBCAM_GET_COMPRESSION_STRUCT UsbvideoCompression; // CAL_FEATURE_WEBCAM_GET_COMPRESSION
+
+
+extern void USBVideo_Send_Msg(USBVIDEO_MSG_TYPE usb_msg_type, kal_uint32 param1, kal_uint32 param2);
+extern kal_bool USBVideo_Get_PU_Attr_Cur_Value(USBVIDEO_ATTRIBUTE_TYPE type);
+extern void USBVideo_VC_If_Create(void *ifname);
+extern void USBVideo_VC_If_Reset(void);
+extern void USBVideo_VC_If_Enable(void);
+extern void USBVideo_VC_If_Speed_Reset(kal_bool b_other_speed);
+extern void USBVideo_VS_If_Create(void *ifname);
+extern void USBVideo_VS_If_Reset(void);
+extern void USBVideo_VS_If_Enable(void);
+extern void USBVideo_VS_If_Speed_Reset(kal_bool b_other_speed);
+extern void USB_Init_Video_Status(void);
+extern void USB_Release_Video_Status(void);
+extern kal_bool USBVideo_Send_Intr(void *addr,kal_uint32 len);
+extern void USBVideo_Send_Incall_JPEG(void);
+extern void USBVideo_Send_Video(void);
+
+
+#endif /* USBVIDEO_DRV_H */
+
diff --git a/mcu/driver/connectivity/usb_class/include/usbvideo_state.h b/mcu/driver/connectivity/usb_class/include/usbvideo_state.h
new file mode 100644
index 0000000..e84afd5
--- /dev/null
+++ b/mcu/driver/connectivity/usb_class/include/usbvideo_state.h
@@ -0,0 +1,106 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usbvideo_state.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb video class state machine definitions
+ *
+ * Author:
+ * -------
+ * -------
+ *
+*============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USBVIDEO_STATE_H
+#define USBVIDEO_STATE_H
+
+//#include "usbvideo_custom.h"
+#include "usb_comm.h"
+#include "kal_public_api.h" //#include "stack_ltlcom.h" //MSBB change #include "app_ltlcom.h"
+
+#define USBVIDEO_PRE_PAUSE_TIMEOUT 100 /* 10ms unit*/
+#define USBVIDEO_INCALL_JPEG_TIMEOUT 100 /* 10ms unit*/
+
+/***********************************************
+ function and global variable
+************************************************/
+extern void USBVideo_Plug_Out_Hdlr(void);
+extern void USBVideo_Parse_Med_Msg(ilm_struct *p_recv_ilm, USB_DEVICE_TYPE device_type);
+
+#endif /* USBVIDEO_STATE_H */
+
diff --git a/mcu/driver/connectivity/usb_driver/inc/otg_drv.h b/mcu/driver/connectivity/usb_driver/inc/otg_drv.h
new file mode 100644
index 0000000..d780624
--- /dev/null
+++ b/mcu/driver/connectivity/usb_driver/inc/otg_drv.h
@@ -0,0 +1,279 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * otg_drv_pri.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for otg hardware related function definitions. Only use for hardware driver.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef OTG_DRV_H
+#define OTG_DRV_H
+
+//#include "kal_non_specific_general_types.h"
+
+#include "dcl.h"
+
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+
+//extern void OTG_Init_Drv_Info(void);
+//extern void OTG_Release_Drv_Info(void);
+//extern void OTG_Register_Drv_Info(OTG_DRV_HDLR_TYPE type, otg_intr_handler_ptr hdlr);
+//extern void OTG_Drv_Create_ISR(void);
+//extern void OTG_Drv_Activate_ISR(void);
+#if defined(DRV_USB_IP_V3)
+//extern void OTGDMA_Drv_Create_ISR(void);
+//extern void OTGDMA_Drv_Activate_ISR(void);
+#endif
+//extern void OTG_Init_Drv(void);
+extern OTG_PLUG_TYPE OTG_Get_Plug_Type(void);
+//extern void OTG_A_Suspend_Req(void);
+//extern void OTG_A_Resume_Req(void);
+//extern void OTG_A_Stop_Host(void);
+//extern void OTG_A_Start_HNP(void);
+//extern void OTG_B_EnDis_HNP(kal_bool set);
+//extern void OTG_B_Start_SRP(void);
+//extern void OTG_B_Stop_Host(void);
+//extern void OTG_B_Set_Session_Valid(kal_bool set);
+extern void OTG_Set_Status(OTG_STATUS_TYPE type, kal_bool set); // no DCL
+extern OTG_STATE OTG_Get_State(void); // no DCL
+//extern void OTG_Enable_Device(void);
+
+//extern void OTG_Incr_Disconn_Count(void);
+extern kal_uint8 OTG_Get_Intr_Status(void); // no DCL
+extern void OTG_Set_Conn_Intr_With_Suspend(void); // no DCL
+extern void OTG_Set_Disconn_Status(void); // no DCL
+extern kal_bool OTG_Is_B_Process_SRP(void); //no DCL
+
+
+//extern void OTG_Process_Exceptions(void);
+
+extern void OTG_HISR(void); // no DCL
+extern void OTG_Set_Intr(void); // no DCL
+
+//extern void OTG_Init_A_Plug_Detect(void);
+
+#endif /* OTG_DRV_H */
+
diff --git a/mcu/driver/connectivity/usb_driver/inc/otg_drv_pri.h b/mcu/driver/connectivity/usb_driver/inc/otg_drv_pri.h
new file mode 100644
index 0000000..39bea3f
--- /dev/null
+++ b/mcu/driver/connectivity/usb_driver/inc/otg_drv_pri.h
@@ -0,0 +1,332 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * otg_drv_pri.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for otg hardware related function definitions. Only use for hardware driver.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef OTG_DRV_PRI_H
+#define OTG_DRV_PRI_H
+
+#include "otg_drv.h"
+//#include "kal_non_specific_general_types.h"
+
+/* timer definetions*/
+
+/* Wait for VBUS Rise */
+#define TA_WAIT_VRISE (100) /* a_wait_vrise 100 ms, section: 6.6.5.1 */
+
+/* A bus suspend timer before we can switch to B_WAIT_ACON */
+#define TB_A_SUSPEND (7)
+
+/* A-Idle to B-Disconnect */
+/* It is necessary for this timer to be more than 750 ms because of a bug in OPT
+test 5.4 in which B OPT disconnects after 750 ms instead of 75ms as stated in the
+test description */
+#define TA_AIDL_BDIS (800) /* a_suspend minimum 200 ms, section: 6.6.5.3 */
+
+#define TA_DATA_PLS (3)
+
+#define TA_REMOTE_WAKEUP (20) /* OPT remote wakeup */
+
+#define TA_RESUME (20) /* resume time */
+
+
+
+#define TA_BIDL_ADIS (3)
+
+#define TA_CHECK_VBUS (535)
+
+/* A-SE0 to B-Reset */
+//#define TB_ASE0_BRST (6) /* b_wait_acon 3.125, section: 6.8.2.4 */
+#define TB_ASE0_BRST (100)
+
+
+#define TB_CHECK_A_RESUME (10)
+
+
+/* SE0 Time Before SRP */
+#define TB_SE0_SRP (5) /* b_idle 2 ms 5.3.2 */
+
+/* Data-Line Pulse Time*/
+#define TB_DATA_PLS (6) /* b_srp_init 5 to 10 ms, section: 5.3.3 */
+
+/* VBus timer */
+#define TB_VBUS_PLS (10) /* sufficient time to keep Vbus pulsing asserted */
+
+/* Discharge timer */
+//#define TB_VBUS_DSCHRG (7)
+//#define TB_VBUS_DSCHRG (3)
+#define TB_VBUS_DSCHRG (50)
+
+/* SRP Fail Time */
+#define TB_SRP_FAIL (5850) /* b_srp_init 5 to 6 sec,section: 6.8.2.2*/
+
+#define TA_ATTATCH_DEBOUNCE (100)
+
+#define TA_WAIT_BCON (2000)
+
+
+#define TA_VBUS_PERIOD_VFALL (700)
+
+
+#define TA_VBUS_PERIOD_VON (700)
+
+
+#define TA_CHECK_VFALL (10)
+
+typedef enum
+{
+ OTG_TIMER_NONE,
+ OTG_TIMER_A_IDLE_BDIS,
+ OTG_TIMER_A_CHECK_VFALL,
+// OTG_TIMER_A_REMOTE_WAKEUP,
+ OTG_TIMER_A_RESUME,
+ OTG_TIMER_B_SE0_SRP,
+ OTG_TIMER_B_SRP_FAIL,
+ OTG_TIMER_B_ASE0_BRST,
+ OTG_TIMER_B_CHECK_A_RESUME,
+ OTG_TIMER_A_VBUS_PERIOD_VFALL,
+ OTG_TIMER_A_VBUS_PERIOD_VON,
+ OTG_TIMER_MAX
+}OTG_TIMER_TYPE;
+
+
+typedef struct
+{
+ /* state machine*/
+ OTG_STATE otg_state;
+
+ /* host/device down/up handler*/
+ otg_intr_handler_ptr host_up_hdlr;
+ otg_intr_handler_ptr host_down_hdlr;
+ otg_intr_handler_ptr device_up_hdlr;
+ otg_intr_handler_ptr device_down_hdlr;
+
+ otg_intr_handler_ptr a_host_stop_hdlr;
+ otg_intr_handler_ptr a_no_response_hdlr;
+
+ /* HNP handler*/
+ otg_intr_handler_ptr b_hnp_fail_hdlr;
+ otg_intr_handler_ptr a_hnp_fail_hdlr;
+ otg_intr_handler_ptr a_hnp_stop_hdlr;
+
+ /* SRP handler*/
+ otg_intr_handler_ptr a_vrise_fail_hdlr;
+ otg_intr_handler_ptr b_srp_fail_hdlr;
+ otg_intr_handler_ptr b_srp_stop_hdlr;
+ otg_intr_handler_ptr b_srp_exception_stop_hdlr;
+
+ /* status*/
+ kal_bool a_bus_req; /* For VBUS request */
+ kal_bool a_detect_b_conn;
+ kal_bool a_detect_b_suspend;
+ kal_bool a_detect_b_resume; /* A host detect B want to remove wake up */
+ kal_bool a_detect_b_data_pls;
+ kal_bool a_suspend_req; /* A host want to suspend */
+ kal_bool a_resume_req; /* A host want to resume */
+ kal_bool a_set_b_hnp_enable; /* A host set B enable NHP */
+ kal_bool b_detect_a_conn;
+ kal_bool b_detect_a_suspend; /* B detect A suspend */
+ kal_bool b_detect_a_resume; /* B host detect A want to remove wake up */
+ kal_bool b_detect_a_reset;
+ kal_bool b_srp_request;
+ kal_bool b_hnp_enable;
+ kal_bool suspend_and_conn_intr;
+ kal_bool disconn_and_conn_intr;
+ kal_uint8 disconn_num;
+
+ kal_bool a_process_hnp;
+
+ kal_bool b_session_valid; /* Check session is vaild or not */
+ kal_bool b_suspend_req; /* For B request for host role or not*/
+
+
+ kal_bool b_check_session;
+
+ OTG_TIMER_TYPE timer_type;
+ kal_bool timer_on;
+ kal_bool timer_out;
+
+ kal_bool device_up;
+ kal_bool host_up; /* set TRUE in A_WAIT_BCON */
+ kal_bool b_device_down_pending;
+
+ kal_bool b_processing;
+
+ kal_bool b_unmask_irq;
+ kal_bool is_ProOTGHISR;
+
+ volatile kal_uint8 otg_intr_status; /* Only record OTG interrupt status */
+
+ kal_uint32 gpt_handle; /*GPT handle*/
+
+ OTG_PLUG_TYPE plug_type;
+ kal_bool b_is_vbus_power_on; /* Is USB Host turn on VBUS */
+
+#ifndef __OTG_DETECT_IDPIN_WITH_EINT__
+ kal_uint32 a_plug_gpt_handle; /*GPT handle for A-plug debounce*/
+ kal_bool a_plug_intr_allow;
+#endif
+}OTG_Drv_Info;
+
+
+extern OTG_Drv_Info g_OtgInfo;
+
+
+#endif /* OTG_DRV_PRI_H */
+
diff --git a/mcu/driver/connectivity/usb_driver/inc/usb_custom.h b/mcu/driver/connectivity/usb_driver/inc/usb_custom.h
new file mode 100644
index 0000000..d546cf7
--- /dev/null
+++ b/mcu/driver/connectivity/usb_driver/inc/usb_custom.h
@@ -0,0 +1,380 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usb_custom.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb customization parameter definition
+ *
+ * Author:
+ * -------
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+#ifndef USB_CUSTOM_H
+#define USB_CUSTOM_H
+
+
+#include "kal_general_types.h"
+#include "usb_memory_def.h"
+
+
+
+/* custom parameter for usb device*/
+typedef struct
+{
+ const kal_bool cable_plugin_level;
+ const kal_uint16 desc_vendor;
+ const kal_uint16 *manufacture_string;
+ const kal_uint8 manufacture_size;
+ const kal_uint16 *product_string;
+ const kal_uint8 product_size;
+}USB_DEVICE_PARAM;
+
+/* custom parameter for mass storage device*/
+typedef struct
+{
+ const kal_uint16 desc_product;
+ const kal_uint8 *inquire_data;
+ const kal_uint8 inquire_size;
+ const kal_uint16 *interface_string;
+ const kal_uint8 interface_size;
+}USB_MS_PARAM;
+
+/* custom parameter for acm device*/
+typedef struct
+{
+ const kal_uint16 desc_product;
+ const kal_uint16 *comm_interface_string;
+ const kal_uint8 comm_interface_size;
+ const kal_uint16 *data_interface_string;
+ const kal_uint8 data_interface_size;
+#if defined(__USB_DATA_CONNECTION__)
+ const kal_uint16 desc_data_connection_product;
+ const kal_uint16 desc_data_connection_product_dual_port;
+#endif
+}USB_ACM_PARAM;
+
+
+/* Custom parameter for video device */
+typedef struct
+{
+ const kal_uint16 desc_product;
+#ifdef __COMPOSITE_WEBCAM__
+ const kal_uint16 desc_composite_product;
+#endif
+ const kal_uint16 *vc_interface_string;
+ const kal_uint8 vc_interface_size;
+ const kal_uint16 *vc_camera_string;
+ const kal_uint8 vc_camera_size;
+ const kal_uint16 *vc_output_string;
+ const kal_uint8 vc_output_size;
+ const kal_uint16 *vc_processing_unit_string;
+ const kal_uint8 vc_processing_unit_size;
+ const kal_uint16 *vs_interface_string;
+ const kal_uint8 vs_interface_size;
+}USB_VIDEO_PARAM;
+
+
+/* custom parameter for image PTP device*/
+typedef struct
+{
+ const kal_uint16 desc_product;
+ const kal_uint16 *image_interface_string;
+ const kal_uint8 image_interface_size;
+ const kal_uint16 *image_manufacturer_string;
+ const kal_uint8 image_manufacturer_size;
+ const kal_uint16 *image_model_string;
+ const kal_uint8 image_model_size;
+ const kal_uint16 *image_device_version_string;
+ const kal_uint8 image_device_version_size;
+ const kal_uint16 *image_serial_number_string;
+ const kal_uint8 image_serial_number_size;
+}USB_IMAGE_PARAM;
+
+
+/* custom parameter for image MTP device*/
+typedef struct
+{
+ const kal_uint16 desc_product;
+ const kal_uint16 *image_interface_string;
+ const kal_uint8 image_interface_size;
+ const kal_uint16 *image_manufacturer_string;
+ const kal_uint8 image_manufacturer_size;
+ const kal_uint16 *image_model_string;
+ const kal_uint8 image_model_size;
+ const kal_uint16 *image_device_version_string;
+ const kal_uint8 image_device_version_size;
+ const kal_uint16 *image_storage_description_string_1;
+ const kal_uint8 image_storage_description_size_1;
+ const kal_uint16 *image_storage_description_string_2;
+ const kal_uint8 image_storage_description_size_2;
+ const kal_uint16 *image_device_friendly_name_default_value_string;
+ const kal_uint8 image_device_friendly_name_default_value_size;
+ const kal_uint16 *image_device_friendly_name_current_value_string;
+ const kal_uint8 image_device_friendly_name_current_value_size;
+ const kal_uint16 *image_synchronization_partner_default_value_string;
+ const kal_uint8 image_synchronization_partner_default_value_size;
+ const kal_uint16 *image_synchronization_partner_current_value_string;
+ const kal_uint8 image_synchronization_partner_current_value_size;
+}USB_MTP_IMAGE_PARAM;
+
+
+typedef struct
+{
+#if defined(__OTG_ENABLE__)
+ const kal_uint8 *ext_class_driver_weight_tbl;
+ const kal_uint8 ext_drv_num;
+#endif
+#if defined(__IC_USB_ENABLE__)
+ const kal_uint8 *int_class_driver_weight_tbl;
+ const kal_uint8 int_drv_num;
+#endif
+ const kal_bool current_follow_spec;
+}USB_HOST_MATCH_PARAM;
+
+
+typedef struct
+{
+ const kal_bool support_HNP;
+ const kal_bool support_SRP;
+ const kal_bool support_Remote_Wakeup;
+ const kal_bool support_Double_FIFO;
+ const kal_uint8 ep0_interval; // TX / RX will be controlled by Class Driver
+}USB_HOST_COMMON_PARAM;
+
+
+/* get parameter functions pointer*/
+typedef const USB_DEVICE_PARAM* (*usb_get_device_param_func)(void);
+typedef const USB_MS_PARAM* (*usb_get_ms_param_func)(void);
+typedef const USB_ACM_PARAM* (*usb_get_acm_param_func)(void);
+typedef const USB_VIDEO_PARAM* (*usb_get_video_param_func)(void);
+typedef const USB_IMAGE_PARAM* (*usb_get_image_param_func)(void);
+typedef const USB_MTP_IMAGE_PARAM* (*usb_get_mtp_image_param_func)(void);
+typedef const USB_HOST_MATCH_PARAM* (*usb_get_host_match_param_func)(void);
+typedef const USB_HOST_COMMON_PARAM* (*usb_get_host_common_param_func)(void);
+
+/* get parameter functions*/
+typedef struct
+{
+ usb_get_device_param_func get_device_param_func;
+ usb_get_ms_param_func get_ms_param_func;
+ usb_get_acm_param_func get_acm_param_func;
+#ifdef WEBCAM_SUPPORT
+ usb_get_video_param_func get_video_param_func;
+#endif
+#ifdef PICTBRIDGE_SUPPORT
+ usb_get_image_param_func get_image_param_func;
+#endif
+#ifdef __MTP_ENABLE__
+ usb_get_mtp_image_param_func get_mtp_image_param_func;
+#endif
+#if defined(__OTG_ENABLE__)||defined(__IC_USB_ENABLE__)
+ usb_get_host_match_param_func get_host_match_param_func;
+ usb_get_host_common_param_func get_host_common_param_func;
+#endif
+} USB_CUSTOM_FUNC;
+
+// MoDIS parser skip start
+extern const USB_CUSTOM_FUNC* USB_GetCustomFunc(void);
+
+/* usb power control, parameter true means power on, false means power off*/
+extern void USB_PowerControl(kal_bool enable);
+
+#ifdef __USB_AND_UART_WITH_ONE_GPIO__
+/* We must call this function in USB_EINT_HISR() in the case that USB and UART with one GPIO */
+extern void PMIC_Power_Control(kal_bool enable);
+#endif
+
+#ifdef __OTG_ENABLE__
+extern kal_uint16 USBD_Get_Max_Power(void);
+#endif
+
+extern kal_bool USB_Default_Charging(void);
+
+extern void USB_Connect_R_To_DM_Control(kal_bool enable);
+
+// MoDIS parser skip end
+#endif
+
diff --git a/mcu/driver/connectivity/usb_driver/inc/usb_drv.h b/mcu/driver/connectivity/usb_driver/inc/usb_drv.h
new file mode 100644
index 0000000..74d5034
--- /dev/null
+++ b/mcu/driver/connectivity/usb_driver/inc/usb_drv.h
@@ -0,0 +1,862 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usb_drv.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb hardware related function definitions
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+#ifndef USB_DRV_H
+#define USB_DRV_H
+
+//#include "usb_phy_drv.h"
+#include "uart_sw.h"
+#include "drv_comm.h"
+#include "kal_public_defs.h" //MSBB change #include "stack_config.h"
+#include "kal_general_types.h"
+#include "dcl.h"
+
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#if defined (DRV_USB_IP_V3)
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#if defined(__USB_STRESS_TEST__)
+/* under construction !*/
+#else
+/* under construction !*/
+#endif
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#else //USB_IP_V2 /V1 /V1_plus
+/* under construction !*/
+#if defined (DRV_USB_IP_V1_PLUS)
+/* under construction !*/
+/* under construction !*/
+#else //V2 and V1
+/* under construction !*/
+/* under construction !*/
+#endif
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#if defined(DRV_USB_IP_V1)||defined(DRV_USB_IP_V1_PLUS)
+/* under construction !*/
+#elif defined(DRV_USB_IP_V2)
+/* under construction !*/
+#endif
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#if defined(DRV_USB_IP_V1)
+/* under construction !*/
+#elif defined(DRV_USB_IP_V2)
+/* under construction !*/
+#elif defined(DRV_USB_IP_V1_PLUS)
+/* under construction !*/
+#endif
+/* under construction !*/
+#endif
+/* under construction !*/
+/* under construction !*/
+#ifdef __USB_HW_DBG__
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#else
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+
+// MoDIS parser skip start
+/* driver info functions */
+//extern void USB_Init_Drv_Info(kal_bool is_ft_mode);
+//extern void USB_ResetDrv_Info(void);
+//extern void USB_Register_Drv_Info(USB_DRV_HDLR_TYPE type, kal_uint32 ep_num, usb_drv_intr_handler_ptr hdlr);
+//extern void USB_Set_UnMask_Irq(kal_bool set);
+extern kal_bool USB_HW_Get_UnMask_Irq(void); // no DCL
+//extern kal_bool USB_Get_EP_Stall_Status(kal_uint8 ep_num, USB_EP_DIRECTION direction);
+//extern void USB_Drv_Activate_ISR(void);
+//extern void USB_Drv_Create_ISR(void);
+//extern void USBDMA_Drv_Create_ISR(void);
+//extern void USBDMA_Drv_Activate_ISR(void);
+
+
+/* system ctrl functions */
+//extern void USB_PDNmode(kal_bool pdn_en);
+//extern void USB_Pull_Up_DP_Line(void);
+//extern void USB_Set_DMA_Stop_Flag(void);
+//extern void USB_Reset_Drv(void);
+//extern void USB_Initialize_Drv_Phase1(void);
+//extern void USB_Initialize_Drv_Phase2(kal_bool b_is_reset);
+//extern void USB_Release_Drv(void);
+extern void USB_EnSysIntr(void); // no DCL
+//extern void USB_SetAddress(kal_uint8 addr, USB_SET_ADDR_STATE state);
+//extern kal_uint16 USB_GetFrameCount(void);
+
+/* EP ctrl functinos */
+//extern void USB_TxEPInit(kal_uint8 ep_num, kal_uint16 data_size, USB_ENDPT_TXFER_TYPE type,kal_bool double_fifo);
+//extern void USB_RxEPInit(kal_uint8 ep_num, kal_uint16 data_size, USB_ENDPT_TXFER_TYPE type,kal_bool double_fifo);
+
+//extern kal_uint16 USB_TXEP_PK_SIZE(kal_uint32 ep_num);
+//extern kal_uint16 USB_RXEP_PK_SIZE(kal_uint32 ep_num);
+//extern void USB_TxEPEn(kal_uint8 ep_num, USB_ENDPT_TXFER_TYPE ep_type, USB_ENDPT_DMA_USAGE dma_usage_type, kal_bool is_flush, kal_bool is_ft_mode);
+//extern void USB_TxEPDis(kal_uint8 ep_num, USB_ENDPT_DMA_USAGE dma_usage_type);
+//extern void USB_RxEPEn(kal_uint8 ep_num, USB_ENDPT_TXFER_TYPE ep_type, USB_ENDPT_DMA_USAGE dma_usage_type, kal_bool is_flush, kal_bool is_ft_mode);
+//extern void USB_RxEPDis(kal_uint8 ep_num, USB_ENDPT_DMA_USAGE dma_usage_type);
+//extern void USB_Config_TxEP_Type(kal_uint8 ep_num, USB_ENDPT_TXFER_TYPE ep_type, kal_bool b_is_use_dma);
+//extern void USB_Config_RxEP_Type(kal_uint8 ep_num, USB_ENDPT_TXFER_TYPE ep_type, kal_bool b_is_use_dma);
+//extern void USB_TxEPClearDataTog(kal_uint32 ep_num, USB_ENDPT_TXFER_TYPE ep_type);
+//extern void USB_RxEPClearDataTog(kal_uint32 ep_num, USB_ENDPT_TXFER_TYPE ep_type);
+//extern USB_EP_STATE USB_TxEP_Usage(kal_uint32 ep_num);
+//extern USB_EP_STATE USB_RxEP_Usage(kal_uint32 ep_num);
+//extern void USB_EPFIFORead(kal_uint32 ep_num, kal_uint16 nBytes, void *pDst, kal_bool force_one_byte_access);
+//extern void USB_HW_EPFIFOWrite (kal_uint32 ep_num, kal_uint16 nBytes, void *pSrc);
+//extern void USB_CtrlEPStall(kal_uint32 ep_num, USB_EP_DIRECTION direction, kal_bool stall_enable);
+
+
+
+//extern void USB_Get_EP0_Status(kal_bool *p_transaction_end, kal_bool *p_sent_stall);
+//extern void USB_Update_EP0_State(USB_EP0_DRV_STATE state, kal_bool stall, kal_bool end);
+//extern kal_uint32 USB_EP0_Pkt_Len(void);
+extern void USB_HW_EP_Tx_Ready(kal_uint32 ep_num, USB_ENDPT_TXFER_TYPE ep_type);
+//extern kal_uint32 USB_EP_Rx_Pkt_Len(kal_uint32 ep_num);
+extern void USB_HW_EP_Rx_Ready(kal_uint32 ep_num, USB_ENDPT_TXFER_TYPE ep_type);
+extern kal_bool USB_HW_Is_EP_Tx_Empty(kal_uint32 ep_num, USB_ENDPT_TXFER_TYPE ep_type);
+//extern kal_bool USB_Is_EP_Bulk_Tx_Empty(kal_uint32 ep_num);
+//extern kal_bool USB_Is_EP_Bulk_Rx_Empty(kal_uint32 ep_num);
+//extern void USB_Clear_Tx_EP_FIFO(kal_uint32 ep_num, USB_ENDPT_TXFER_TYPE ep_type, kal_bool b_reset_toggle);
+//extern void USB_Clear_Rx_EP_FIFO(kal_uint32 ep_num, USB_ENDPT_TXFER_TYPE ep_type, kal_bool b_reset_toggle);
+
+/* DMA control functions */
+//extern void USB_Get_DMA_Channel(kal_uint32 ep_tx_num, kal_uint32 ep_rx_num, USB_EP_DIRECTION direction, kal_bool same_chan);
+//extern void USB_HW_Stop_DMA_Channel(kal_uint32 ep_num, USB_EP_DIRECTION direction);
+//extern void USB_Free_DMA_Channel(kal_uint32 ep_tx_num, kal_uint32 ep_rx_num, USB_EP_DIRECTION direction, kal_bool same_chan);
+//extern void USB_DMA_Setup(kal_uint32 ep_num, USB_EP_DIRECTION direction, USB_ENDPT_TXFER_TYPE ep_type, kal_uint32 addr, kal_uint32 length,
+// usb_dma_callback callback, kal_bool callback_upd_run, kal_bool known_size, USB_DMA_TYPE dma_type);
+
+//extern kal_bool USB_DMA_Get_Run_Status(kal_uint32 ep_num, USB_EP_DIRECTION direction);
+//extern void USB_DMA_Set_Run_Status(kal_uint32 ep_num, USB_EP_DIRECTION direction, kal_bool status);
+
+
+
+extern void USB_DMA_Callback(kal_uint8 dma_chan); // no DCL
+extern void USB_DMAQ_Callback(kal_uint8 dma_chan,USB_EP_DIRECTION direction);
+
+
+extern void USB_Enable_DMA_Timer_Count(kal_uint8 dma_chan, kal_bool enable, kal_uint8 timer_ticks);
+extern kal_bool USB_Check_DMA_Time_Out(kal_uint8 dma_chan);
+//extern kal_uint32 USB_Get_DMA_Real_Count(kal_uint32 ep_num, USB_EP_DIRECTION direction);
+
+//extern void USB_DMA_Limiter(kal_uint32 dma_limit_num);
+
+//extern void USB_Switch_DMA_Burst_mode(kal_bool b_enable);
+//extern void USB_Register_DMA_Channel(kal_uint32 ep_num, USB_EP_DIRECTION direction, kal_uint8 chan_num, kal_bool same_chan);
+//extern void USB_Set_DMA_Burst_Mode(kal_uint8 dma_burst_mode);
+
+
+//extern kal_uint8 USB_Get_DMA_Channel_Num(kal_uint8 ep_num, USB_EP_DIRECTION direction); // no DCL
+
+
+#if defined(DRV_USB_IP_V3)
+//extern kal_bool USB_Is_High_Speed(void);
+//extern void USB_High_Speed_Enable(kal_bool b_enable);
+//extern void USB_Enter_Test_Mode(USB_TEST_MODE_TYPE test_selector);
+//extern void USB_Reset_FIFO(void);
+//extern kal_bool USB_Is_FIFO_Full(void);
+//extern kal_bool USB_Is_Suspend_Power_Status(void);
+
+
+
+
+
+#endif
+
+/* polling functions (used for exception log) */
+//extern void USB_Polling_Transmit_Done(kal_uint32 ep_num, USB_ENDPT_TXFER_TYPE ep_type);
+//extern void USB_Polling_Transmit_Data(kal_uint32 ep_num, USB_EP_DIRECTION direction, USB_ENDPT_TXFER_TYPE ep_type, kal_uint32 addr, kal_uint32 length,
+// usb_dma_callback callback, kal_bool callback_upd_run, kal_bool known_size, USB_DMA_TYPE dma_type);
+
+//extern void USB_Polling_Recv_Data();
+//extern void USB_Clr_RX_EP_ISR(kal_uint32 ep_num);
+//extern kal_bool USB_Get_RX_EP_ISR_Status(kal_uint32 ep_num);
+//extern void USB_Read_TX_ISR_Status(void);
+extern void USB_HISR(void); // no DCL
+
+
+//extern void USB_Phy_Enable(USB_PHY_OWNER owner);
+//extern void USB_Phy_Disable(USB_PHY_OWNER owner);
+
+//extern void USBDL_Update_USB_Download_Mode(void);
+//extern kal_bool USBDL_Is_USB_Download_Mode(void);
+
+//extern void USB_EP_Reset_Data_Toggle(kal_uint32 ep_num, USB_EP_DIRECTION direction);
+
+//extern void USB_Debug_Information(kal_uint32 ep_num, USB_EP_DIRECTION direction,kal_bool check_error);
+//extern void USB_DUMP(void);
+
+//extern void USB_PDNEnable(void);
+//extern void USB_PDNDisable(void);
+
+
+//extern void USB_EP_DMA_Running_Check(kal_uint32 ep_num, USB_EP_DIRECTION direction, kal_uint32 line);
+//extern void USB_EP_Check(kal_uint32 ep_num, USB_EP_DIRECTION direction, kal_uint32 line);
+
+
+
+// MoDIS parser skip end
+
+// MoDIS parser skip start
+/* driver info functions */
+extern void USB_Acm_Ring_Buffer_Threshold_Enable(UART_PORT port, kal_bool bset, module_type ownerid);
+extern kal_uint8 USB_Acm_FT_Port(void);
+extern kal_uint16 USB2UART_FT_Get_Max_Len(void);
+extern void USB2UART_FT_Tx_Byte(kal_uint8* addr, kal_uint16 len);
+extern void USB2UART_FT_Tx_Word(kal_uint32* addr, kal_uint16 len);
+extern void USB2UART_FT_Tx_Stop(void);
+extern kal_uint16 USB2UART_FT_Rx_Byte(kal_uint8* addr, kal_uint16 len);
+// MoDIS parser skip end
+
+
+#endif //USB_DRV_H
+
+
+
diff --git a/mcu/driver/connectivity/usb_driver/inc/usb_drv_pri.h b/mcu/driver/connectivity/usb_driver/inc/usb_drv_pri.h
new file mode 100644
index 0000000..936907b
--- /dev/null
+++ b/mcu/driver/connectivity/usb_driver/inc/usb_drv_pri.h
@@ -0,0 +1,626 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usb_drv_pri.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb hardware related function definitions. Only use for hardware driver.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USB_DRV_PRI_H
+#define USB_DRV_PRI_H
+
+
+#include "usb_hw.h"
+#include "usb_drv.h"
+#include "kal_general_types.h"
+
+
+/* power state */
+typedef enum
+{
+ USB_STATE_NORMAL = 0,
+ USB_STATE_SUSPEND
+} USB_POWER_STATE;
+
+
+
+#if defined(DRV_USB_IP_V4)
+
+#define USBDMA_CheckRunStat(_n) (DRV_Reg32(USB_DMACNTL(_n))&USB_DMACNTL_DMAEN)
+#define USBDMA_Stop(_n) DRV_WriteReg32(USB_DMACNTL(_n), DRV_Reg32(USB_DMACNTL(_n))&(~USB_DMACNTL_DMAEN))
+#define USB_DMA_TIMER_TIMEOUT_TICK 0x7f
+#define USB_DIS_DMA_LIMITER 0xff
+#define USB_DMA_TIMEOUT_STATUS 0x100
+
+#define USB_DMA_TX_CSR (USB_TXCSR_AUTOSET|USB_TXCSR_DMAREQENAB|USB_TXCSR_DMAREQMODE)
+#define USB_DMA_TX_CSR_ISO (USB_TXCSR_AUTOSET|USB_TXCSR_DMAREQENAB|USB_TXCSR_DMAREQMODE|USB_TXCSR_ISO)
+#define USB_DMAQ_TX_CSR (USB_TXCSR_DMAREQENAB)
+
+
+#define USB_DMA_RX_CSR (USB_RXCSR_AUTOCLEAR|USB_RXCSR_DMAREQENAB)
+#define USB_DMA_RX_CSR_ISO (USB_RXCSR_AUTOCLEAR|USB_RXCSR_DMAREQENAB|USB_RXCSR_ISO)
+#define USB_DMAQ_RX_CSR (USB_RXCSR_DMAREQENAB)
+
+//=============================
+//DMAQ
+#define USBDMAQ_RQ_CheckRunStat(_n)(_n) (DRV_Reg32(USB_DMAQ_RQCSR(_n))&USB_DMACNTL_DMAEN_ACTIVE)
+#define USBDMAQ_RQ_Stop(_n) DRV_WriteReg32(USB_DMAQ_RQCSR(_n), DRV_Reg32(USB_DMAQ_RQCSR(_n))|USB_DMACNTL_DMAEN_STOP)
+#define USBDMAQ_RQ_Start(_n) DRV_WriteReg32(USB_DMAQ_RQCSR(_n), DRV_Reg32(USB_DMAQ_RQCSR(_n))|USB_DMACNTL_DMAEN_START)
+#define USBDMAQ_RQ_Resume(_n) DRV_WriteReg32(USB_DMAQ_RQCSR(_n), DRV_Reg32(USB_DMAQ_RQCSR(_n))|USB_DMACNTL_DMAEN_RESUME)
+//#define USBDMAQ_Start_Addr(_n, addr) DRV_WriteReg32(USB_DMAQ_RQSAR(_n), addr)
+//TX DMAQ
+#define USBDMAQ_TQ_CheckRunStat(_n) (DRV_Reg32(USB_DMAQ_TQCSR(_n))&USB_DMACNTL_DMAEN_ACTIVE)
+#define USBDMAQ_TQ_Stop(_n) DRV_WriteReg32(USB_DMAQ_TQCSR(_n), DRV_Reg32(USB_DMAQ_TQCSR(_n))|USB_DMACNTL_DMAEN_STOP)
+#define USBDMAQ_TQ_Start(_n) DRV_WriteReg32(USB_DMAQ_TQCSR(_n), DRV_Reg32(USB_DMAQ_TQCSR(_n))|USB_DMACNTL_DMAEN_START)
+#define USBDMAQ_TQ_Resume(_n) DRV_WriteReg32(USB_DMAQ_TQCSR(_n), DRV_Reg32(USB_DMAQ_TQCSR(_n))|USB_DMACNTL_DMAEN_RESUME)
+//#define USBDMAQ_Start_Addr(_n, addr) DRV_WriteReg32(USB_DMAQ_RQSAR(_n), addr)
+//============================
+#define TGPD_MAX_NUMBERS 8
+
+
+#define RGPD_FLAGS_IOC 0x80
+#define RGPD_FLAGS_HWO 0x01
+#define RGPD_FLAGS_BDP 0x02
+#define RGPD_ENDPOINT 0x0F
+#define RGPD_TGL 0x10
+#define RGPD_ZLP 0x20
+
+
+
+#define TGPD_FLAGS_HWO 0x01
+#define TGPD_IS_FLAGS_HWO(_pd) (((TGPD *)_pd)->flag & TGPD_FLAGS_HWO)
+#define TGPD_SET_FLAGS_HWO(_pd) (((TGPD *)_pd)->flag |= TGPD_FLAGS_HWO)
+#define TGPD_CLR_FLAGS_HWO(_pd) (((TGPD *)_pd)->flag &= (~TGPD_FLAGS_HWO))
+#define TGPD_FORMAT_BDP 0x02
+#define TGPD_IS_FORMAT_BDP(_pd) (((TGPD *)_pd)->flag & TGPD_FORMAT_BDP)
+#define TGPD_SET_FORMAT_BDP(_pd) (((TGPD *)_pd)->flag |= TGPD_FORMAT_BDP)
+#define TGPD_CLR_FORMAT_BDP(_pd) (((TGPD *)_pd)->flag &= (~TGPD_FORMAT_BDP))
+
+#define TGPD_SET_FLAG(_pd, _flag) ((TGPD *)_pd)->flag = (((TGPD *)_pd)->flag&(~TGPD_FLAGS_HWO))|(_flag)
+#define TGPD_GET_FLAG(_pd) (((TGPD *)_pd)->flag & TGPD_FLAGS_HWO)
+#define TGPD_SET_CHKSUM(_pd, _n) ((TGPD *)_pd)->chksum = PDU_calcCksum((kal_uint8 *)_pd, _n)
+#define TGPD_SET_CHKSUM_HWO(_pd, _n) ((TGPD *)_pd)->chksum = PDU_calcCksum((kal_uint8 *)_pd, _n)-1
+#define TGPD_GET_CHKSUM(_pd) ((TGPD *)_pd)->chksum
+#define TGPD_SET_FORMAT(_pd, _fmt) ((TGPD *)_pd)->flag = (((TGPD *)_pd)->flag&(~TGPD_FORMAT_BDP))|(_fmt)
+#define TGPD_GET_FORMAT(_pd) ((((TGPD *)_pd)->flag & TGPD_FORMAT_BDP)>>1)
+#define TGPD_SET_DataBUF_LEN(_pd, _len) ((TGPD *)_pd)->DataBufferLen = _len
+#define TGPD_ADD_DataBUF_LEN(_pd, _len) ((TGPD *)_pd)->DataBufferLen += _len
+#define TGPD_GET_DataBUF_LEN(_pd) ((TGPD *)_pd)->DataBufferLen
+#define TGPD_SET_NEXT(_pd, _next) ((TGPD *)_pd)->pNext = ((TGPD *)_next)
+#define TGPD_GET_NEXT(_pd) (TGPD *)phys_to_virt((kal_uint32)_pd->pNext)
+#define TGPD_SET_TBD(_pd, _tbd) ((TGPD *)_pd)->pBuf = (kal_uint8 *)_tbd;\
+ TGPD_SET_FORMAT_BDP(_pd)
+#define TGPD_GET_TBD(_pd) (TBD *)((TGPD *)_pd)->pBuf
+
+#define TGPD_SET_DATA(_pd, _data) ((TGPD *)_pd)->pBuf = (kal_uint8 *)_data
+#define TGPD_GET_DATA(_pd) (kal_uint8*)((TGPD *)_pd)->pBuf
+#define TGPD_SET_BUF_LEN(_pd, _len) ((TGPD *)_pd)->bufLen = _len
+#define TGPD_ADD_BUF_LEN(_pd, _len) ((TGPD *)_pd)->bufLen += _len
+#define TGPD_GET_BUF_LEN(_pd) ((TGPD *)_pd)->bufLen
+#define TGPD_SET_EXT_LEN(_pd, _len) ((TGPD *)_pd)->ExtLength = _len
+#define TGPD_GET_EXT_LEN(_pd) ((TGPD *)_pd)->ExtLength
+#define TGPD_SET_EPaddr(_pd, _EP) ((TGPD *)_pd)->ZTepFlag =(((TGPD *)_pd)->ZTepFlag&0xF0)|(_EP)
+#define TGPD_GET_EPaddr(_pd) ((TGPD *)_pd)->ZTepFlag & 0x0F
+
+#define TGPD_FORMAT_TGL 0x10
+#define TGPD_IS_FORMAT_TGL(_pd) (((TGPD *)_pd)->ZTepFlag & TGPD_FORMAT_TGL)
+#define TGPD_SET_FORMAT_TGL(_pd) (((TGPD *)_pd)->ZTepFlag |=TGPD_FORMAT_TGL)
+#define TGPD_CLR_FORMAT_TGL(_pd) (((TGPD *)_pd)->ZTepFlag &= (~TGPD_FORMAT_TGL))
+#define TGPD_FORMAT_ZLP 0x20
+#define TGPD_IS_FORMAT_ZLP(_pd) (((TGPD *)_pd)->ZTepFlag & TGPD_FORMAT_ZLP)
+#define TGPD_SET_FORMAT_ZLP(_pd) (((TGPD *)_pd)->ZTepFlag |=TGPD_FORMAT_ZLP)
+#define TGPD_CLR_FORMAT_ZLP(_pd) (((TGPD *)_pd)->ZTepFlag &= (~TGPD_FORMAT_ZLP))
+
+#define TGPD_SET_TGL(_pd, _TGL) ((TGPD *)_pd)->ZTepFlag |=(( _TGL) ? 0x10: 0x00)
+#define TGPD_GET_TGL(_pd) ((TGPD *)_pd)->ZTepFlag & 0x10 ? 1:0
+#define TGPD_SET_ZLP(_pd, _ZLP) ((TGPD *)_pd)->ZTepFlag |= ((_ZLP) ? 0x20: 0x00)
+#define TGPD_GET_ZLP(_pd) ((TGPD *)_pd)->ZTepFlag & 0x20 ? 1:0
+
+#define TGPD_FLAG_IOC 0x40
+#define TGPD_SET_IOC(_pd) (((TGPD *)_pd)->ZTepFlag |= TGPD_FLAG_IOC)
+
+
+
+#define TGPD_GET_EXT(_pd) ((kal_uint8 *)_pd + sizeof(TGPD))
+#define TGPD_SET_KEY_IDX(_pd, _data) \
+{\
+ kal_uint8 *_tmp = ((kal_uint8 *)_pd + sizeof(TGPD));\
+ *_tmp = (unsigned char)_data;\
+}
+#define TGPD_GET_KEY_IDX(_pd) *((kal_uint8 *)_pd + sizeof(TGPD))
+
+/**
+ * TGPD
+ */
+typedef struct _TGPD
+{
+ kal_uint8 flag;
+ kal_uint8 chksum;
+ kal_uint16 DataBufferLen; /*Rx Allow Length*/
+ struct _TGPD* pNext;
+ kal_uint8* pBuf;
+ kal_uint16 bufLen;
+ kal_uint8 ExtLength;
+ kal_uint8 ZTepFlag;
+}TGPD, *PGPD;
+
+
+
+#elif defined(DRV_USB_IP_V3)
+
+
+#define USBDMA_CheckRunStat(_n) (USB_DRV_Reg(USB_DMACNTL(_n))&USB_DMACNTL_DMAEN)
+#define USBDMA_CheckPPRunStat(_n) (USB_DRV_Reg(USB_DMAPPCNTL(_n))&USB_DMACNTL_DMAEN)
+#define USBDMA_Stop(_n) USB_DRV_ClearBits(USB_DMACNTL(_n), USB_DMACNTL_DMAEN)
+#ifdef __DMA_PP_ENABLE__
+#define USBDMA_PPStop(_n) USB_DRV_ClearBits(USB_DMAPPCNTL(_n), USB_DMACNTL_DMAEN)
+#endif
+#define USB_DMA_TIMER_TIMEOUT_TICK 0x7f
+#define USB_DIS_DMA_LIMITER 0xff
+
+
+#define USB_DMA_TX_CSR (USB_TXCSR_AUTOSET|USB_TXCSR_DMAREQENAB|USB_TXCSR_DMAREQMODE)
+#define USB_DMA_TX_CSR_ISO (USB_TXCSR_AUTOSET|USB_TXCSR_DMAREQENAB|USB_TXCSR_DMAREQMODE|USB_TXCSR_ISO)
+
+
+#define USB_DMA_RX_CSR (USB_RXCSR_AUTOCLEAR|USB_RXCSR_DMAREQENAB)
+#define USB_DMA_RX_CSR_ISO (USB_RXCSR_AUTOCLEAR|USB_RXCSR_DMAREQENAB|USB_RXCSR_ISO)
+
+
+#elif defined (DRV_USB_IP_V2)
+
+#define USB_BDT_NUMBER 10
+
+/* BDT structure */
+typedef struct
+{
+ kal_uint32 PID_OWN_DATA01_BC;
+ kal_uint32 ADDRESS;
+} USB_BDT, *USB_BDT_PTR;
+
+
+/* EP0 state machine, used to handle abnormal cases*/
+typedef enum
+{
+ USB_EP0_TRANS_NONE,
+ USB_EP0_TRANS_TX_DATA,
+ USB_EP0_TRANS_TX_DATA_END,
+ USB_EP0_TRANS_TX_STATUS,
+ USB_EP0_TRANS_RX_DATA,
+ USB_EP0_TRANS_RX_STATUS,
+ USB_EP0_TRANS_END,
+ USB_EP0_TRANS_STALL
+}USB_EP0_TRANS_TYPE;
+
+/* BDT macro*/
+#define USB_BDT_RX 0
+#define USB_BDT_TX 1
+#define USB_BDT_EVEN 0
+#define USB_BDT_ODD 1
+#define WRITE_EP0_BDT(direction, even_odd, value) (g_UsbDrvInfo.bdt_ptr[direction][even_odd] = value)
+#define WRITE_EPN_BDT(ep, direction, value) (g_UsbDrvInfo.bdt_ptr[ep+1][direction] = value)
+
+#define WRITE_EP0_BDT_PID(direction, even_odd, value) (g_UsbDrvInfo.bdt_ptr[direction][even_odd]->PID_OWN_DATA01_BC = value)
+#define WRITE_EPN_BDT_PID(ep, direction, value) (g_UsbDrvInfo.bdt_ptr[ep+1][direction]->PID_OWN_DATA01_BC = value)
+#define READ_EP0_BDT_PID(direction, even_odd) (g_UsbDrvInfo.bdt_ptr[direction][even_odd]->PID_OWN_DATA01_BC)
+#define READ_EPN_BDT_PID(ep, direction) (g_UsbDrvInfo.bdt_ptr[ep+1][direction]->PID_OWN_DATA01_BC)
+
+#define WRITE_EP0_BDT_ADDR(direction, even_odd, value) (g_UsbDrvInfo.bdt_ptr[direction][even_odd]->ADDRESS = value)
+#define WRITE_EPN_BDT_ADDR(ep, direction, value) (g_UsbDrvInfo.bdt_ptr[ep+1][direction]->ADDRESS = value)
+#define READ_EP0_BDT_ADDR(direction, even_odd) (g_UsbDrvInfo.bdt_ptr[direction][even_odd]->ADDRESS)
+#define READ_EPN_BDT_ADDR(ep, direction) (g_UsbDrvInfo.bdt_ptr[ep+1][direction]->ADDRESS)
+
+#endif /* DRV_USB_IP_V2 */
+
+typedef struct
+{
+ USB_POWER_STATE power_state;
+ kal_bool is_unMaskUSB; /*Tricky, used to control interrupt */
+ kal_bool is_ProUSBHISR;
+
+ /* interrupt handler */
+ usb_drv_intr_handler_ptr reset_hdlr;
+ usb_drv_intr_handler_ptr suspend_hdlr;
+ usb_drv_intr_handler_ptr resume_hdlr;
+ usb_drv_intr_handler_ptr ep0_hdlr;
+ usb_drv_intr_handler_ptr ep_tx_hdlr[MAX_TX_EP_NUM];
+ usb_drv_intr_handler_ptr ep_rx_hdlr[MAX_RX_EP_NUM];
+
+ /* Stall status */
+ kal_bool ep_tx_stall_status[MAX_TX_EP_NUM];
+ kal_bool ep_rx_stall_status[MAX_RX_EP_NUM];
+
+ /* cable plug out : disconnect */
+ kal_bool usb_disconnect;
+
+ /* Endpoint current status */
+ USB_EP_STATE ep_tx_enb_state[MAX_TX_EP_NUM];
+ USB_EP_STATE ep_rx_enb_state[MAX_RX_EP_NUM];
+
+#if defined (DRV_USB_IP_V3)||defined (DRV_USB_IP_V4)
+ /* FIFO flush interrupt */
+ kal_bool ep_tx_flush_intr[MAX_TX_EP_NUM];
+ kal_bool ep_rx_flush_intr[MAX_RX_EP_NUM];
+ kal_uint8 dma_burst_mode;
+ /*HS FS flag*/
+ kal_bool Is_HS_mode;
+
+ /*USB FIFO full and receive Suspend signal */
+ kal_bool suspend_with_FIFO_not_empty;
+ kal_uint8 suspend_count;
+
+ /* DMA parameters */
+ kal_uint8 dma_port[2][MAX_EP_NUM]; /* record TX/RX ep's DMA port number */
+ USB_EP_DIRECTION dma_dir[MAX_DMA_NUM]; /* record DMA port's direction */
+ usb_dmaq_callback dmaq_callback[2][MAX_DMA_NUM]; /* take PP buffer */
+ usb_dmaq_callback dmaq_empty_callback[2][MAX_DMA_NUM]; /* take PP buffer */
+#else
+ kal_uint8 dma_port[MAX_DMA_NUM];
+ USB_EP_DIRECTION dma_dir[MAX_EP_NUM]; /* record DMA port's direction */
+#endif
+ kal_bool dma_pktrdy[MAX_DMA_NUM];
+ kal_bool dma_running[MAX_DMA_NUM];
+ kal_bool dma_callback_upd_run[MAX_DMA_NUM]; /* take PP buffer */
+ usb_dma_callback dma_callback[MAX_DMA_NUM]; /* take PP buffer */
+ kal_uint32 dma_tx_length[MAX_DMA_NUM];
+#ifdef __WRITE_THROUGH_CACHEABLE__
+ kal_uint32 dma_length[MAX_DMA_NUM];
+ kal_uint32 dma_addr[MAX_DMA_NUM];
+#endif
+
+#if defined (DRV_USB_IP_V3)||defined(DRV_USB_IP_V4)
+ kal_bool is_bidirection_dma[MAX_DMA_NUM];
+ kal_uint8 dma_channel;
+ kal_uint8 dma_tx_ep_num[MAX_DMA_NUM]; /* record DMA port's TX ep number */
+ kal_uint8 dma_rx_ep_num[MAX_DMA_NUM]; /* record DMA port's RX ep number */
+ kal_bool b_enable_dma_burst_auto_chge; /* For DVT use only, enable DMA auto changed burst mode */
+
+#ifdef __DMA_PP_ENABLE__
+ /* Only PP need this!! */
+ kal_uint32 dma_pp_addr[MAX_RX_EP_NUM];
+ kal_uint32 dma_pp_length[MAX_RX_EP_NUM];
+
+ kal_uint32 real_count;
+ kal_uint32 real_pp_count;
+ kal_bool dma_is_pp[MAX_DMA_NUM]; /* is PP A or PP B */
+ kal_bool dma_is_running[2][MAX_DMA_NUM]; /* is PP A or PP B running */
+#endif
+
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+
+
+#elif defined (DRV_USB_IP_V2)
+ /* DMA parameters */
+ kal_uint8 dma_pktlength[MAX_DMA_NUM];
+
+ /* dma and fast mode sequnce control parameters*/
+ kal_bool b_dma_rx_config; /* a flag to record USB config RX DMA, to cancel token done intr */
+ kal_uint8 dma_tx_ep;
+ kal_uint8 dma_res_tx_ep;
+ kal_uint8 fast_mode_tx_ep;
+
+ /* BDT addr*/
+ USB_BDT_PTR bdt_ptr[USB_BDT_NUMBER/2][2];
+
+ /* EP0 status*/
+ kal_uint8 ep0_rx_even_odd;
+ kal_uint8 ep0_tx_even_odd;
+ kal_uint8 ep0_current_dir;
+ kal_uint8 ep0_tx_data01;
+ USB_EP0_TRANS_TYPE ep0_transaction_type;
+
+ /* EPn (others to EP0) status*/
+// USB_EP_ENB_STATE ep_tx_enb_state[MAX_TX_EP_NUM];
+// USB_EP_ENB_STATE ep_rx_enb_state[MAX_RX_EP_NUM];
+ kal_uint8 ep_tx_max_data_size[MAX_TX_EP_NUM];
+ kal_uint8 ep_rx_max_data_size[MAX_RX_EP_NUM];
+ kal_uint8 ep_tx_data01[MAX_TX_EP_NUM];
+ kal_uint8 ep_rx_data01[MAX_RX_EP_NUM];
+ kal_uint32 error_count;
+ kal_uint8 error_reason;
+ kal_uint8 fm_error_reason;
+
+#elif (defined(DRV_USB_IP_V1)||defined(DRV_USB_IP_V1_PLUS))
+ kal_uint8 IntrTx;
+ kal_uint8 IntrRx;
+#endif
+}USB_Drv_Info;
+
+
+
+extern USB_Drv_Info g_UsbDrvInfo;
+
+
+#endif /* USB_DRV_PRI_H */
+
diff --git a/mcu/driver/connectivity/usb_driver/inc/usb_hcd.h b/mcu/driver/connectivity/usb_driver/inc/usb_hcd.h
new file mode 100644
index 0000000..83cf1c7
--- /dev/null
+++ b/mcu/driver/connectivity/usb_driver/inc/usb_hcd.h
@@ -0,0 +1,284 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usb_hcd.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb host hardware related function definitions. Provide for usb protocol module.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USB_HCD_H
+#define USB_HCD_H
+
+#include "usb_drv.h"
+//#include "kal_non_specific_general_types.h"
+
+#define TGPD_MAX_NUMBERS 1
+#define RGPD_MAX_NUMBERS 1
+
+extern kal_bool USB_HCD_Get_UnMask_Irq(kal_uint8 usb_ip_port);
+extern void USB_HCD_Disconn_Hdlr(kal_uint8 usb_ip_port);
+extern void USB_HCD_Conn_Hdlr(kal_uint8 usb_ip_port);
+extern void USB_HCD_VBusEnable(kal_uint8 usb_ip_port,kal_bool enable);
+extern kal_bool USB_HCD_DMA_Get_Run_Status(kal_uint8 usb_ip_port, kal_uint8 dma_chan);
+extern void USB_HCD_DMA_Callback(kal_uint8 usb_ip_port,kal_uint8 dma_chan);
+extern void USB_HCD_HISR(void);
+
+
+#if defined(DRV_USB_IP_V4)
+extern void USB_HCD_DMAQ_Callback(kal_uint8 usb_ip_port,kal_uint8 index,USB_EP_DIRECTION direction);
+#endif
+
+
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#if defined(__IC_USB_ENABLE__)
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+/* under construction !*/
+#endif
+
+#endif /* USB_HCD_H */
+
diff --git a/mcu/driver/connectivity/usb_driver/inc/usb_hcd_pri.h b/mcu/driver/connectivity/usb_driver/inc/usb_hcd_pri.h
new file mode 100644
index 0000000..c107f19
--- /dev/null
+++ b/mcu/driver/connectivity/usb_driver/inc/usb_hcd_pri.h
@@ -0,0 +1,434 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usb_hcd_pri.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb host hardware related function definitions. Only use for hardware driver.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USB_HCD_PRI_H
+#define USB_HCD_PRI_H
+
+#include "usb_drv.h"
+//#include "usb_drv_pri.h"
+#include "usb_custom.h"
+#include "usb_hw.h"
+#include "dcl.h"
+//#include "kal_non_specific_general_types.h"
+//#include "usb_hcd.h"
+
+#define USB_HCD_DEBOUNCE_DELAY (10) /* 10ms unit */
+#define USB_HCD_RESET_RECOVERY_DELAY (1)
+#define USB_HCD_RESET_DELAY (6)
+#define USB_HCD_RESUME_DELAY (2) //20ms
+#define USB_HCD_DMA_TIMER (500)
+
+#if defined (DRV_USB_IP_V3)
+
+#define USBHCD_DMA_CheckRunStat(_baseaddr,_n) (USB_DRV_Reg(USB_DMACNTL_HCD(_baseaddr,_n))&USB_DMACNTL_DMAEN)
+#define USBHCD_DMA_CheckPPRunStat(_baseaddr,_n) (USB_DRV_Reg(USB_DMAPPCNTL_HCD(_baseaddr,_n))&USB_DMACNTL_DMAEN)
+#define USBHCD_DMA_Stop(_baseaddr,_n) USB_DRV_ClearBits(USB_DMACNTL_HCD(_baseaddr,_n), USB_DMACNTL_DMAEN)
+
+#define USB_HCD_DMA_TX_CSR (USB_TXCSR_AUTOSET|USB_TXCSR_DMAREQENAB|USB_TXCSR_DMAREQMODE)
+#define USB_HCD_DMA_TX_CSR_ISO (USB_TXCSR_AUTOSET|USB_TXCSR_DMAREQENAB|USB_TXCSR_DMAREQMODE|USB_TXCSR_ISO)
+
+#define USB_HCD_DMA_RX_CSR (USB_RXCSR_AUTOCLEAR|USB_RXCSR_DMAREQENAB|USB_RXCSR_AUTOREQ)
+#define USB_HCD_DMA_RX_CSR_ISO (USB_RXCSR_AUTOCLEAR|USB_RXCSR_DMAREQENAB|USB_RXCSR_AUTOREQ|USB_RXCSR_ISO)
+
+
+#elif defined (DRV_USB_IP_V4)
+
+#define USBHCD_DMA_CheckRunStat(_baseaddr,_n) (USB_DRV_Reg(USB_DMACNTL_HCD(_baseaddr,_n))&USB_DMACNTL_DMAEN)
+#define USBHCD_DMA_CheckPPRunStat(_baseaddr,_n) (USB_DRV_Reg(USB_DMAPPCNTL_HCD(_baseaddr,_n))&USB_DMACNTL_DMAEN)
+#define USBHCD_DMA_Stop(_baseaddr,_n) USB_DRV_ClearBits(USB_DMACNTL_HCD(_baseaddr,_n), USB_DMACNTL_DMAEN)
+
+
+#define USB_HCD_DMA_TX_CSR (USB_TXCSR_AUTOSET|USB_TXCSR_DMAREQENAB|USB_TXCSR_DMAREQMODE)
+#define USB_HCD_DMA_TX_CSR_ISO (USB_TXCSR_AUTOSET|USB_TXCSR_DMAREQENAB|USB_TXCSR_DMAREQMODE|USB_TXCSR_ISO)
+#define USB_HCD_DMAQ_TX_CSR (USB_TXCSR_DMAREQENAB)
+
+
+#define USB_HCD_DMA_RX_CSR (USB_RXCSR_AUTOCLEAR|USB_RXCSR_DMAREQENAB|USB_RXCSR_AUTOREQ)
+#define USB_HCD_DMA_RX_CSR_ISO (USB_RXCSR_AUTOCLEAR|USB_RXCSR_DMAREQENAB|USB_RXCSR_AUTOREQ|USB_RXCSR_ISO)
+#define USB_HCD_DMAQ_RX_CSR (USB_RXCSR_DMAREQENAB)
+
+
+//RX DMAQ
+#define USBHCD_DMAQ_RQ_CheckRunStat(_n)(_n) (DRV_Reg32(USB_DMAQ_RQCSR(_n))&USB_DMACNTL_DMAEN_ACTIVE)
+#define USBHCD_DMAQ_RQ_Stop(_n) DRV_WriteReg32(USB_DMAQ_RQCSR(_n), DRV_Reg32(USB_DMAQ_RQCSR(_n))|USB_DMACNTL_DMAEN_STOP)
+#define USBHCD_DMAQ_RQ_Start(_n) DRV_WriteReg32(USB_DMAQ_RQCSR(_n), DRV_Reg32(USB_DMAQ_RQCSR(_n))|USB_DMACNTL_DMAEN_START)
+#define USBHCD_DMAQ_RQ_Resume(_n) DRV_WriteReg32(USB_DMAQ_RQCSR(_n), DRV_Reg32(USB_DMAQ_RQCSR(_n))|USB_DMACNTL_DMAEN_RESUME)
+
+
+//TX DMAQ
+#define USBHCD_DMAQ_TQ_CheckRunStat(_n) (DRV_Reg32(USB_DMAQ_TQCSR(_n))&USB_DMACNTL_DMAEN_ACTIVE)
+#define USBHCD_DMAQ_TQ_Stop(_n) DRV_WriteReg32(USB_DMAQ_TQCSR(_n), DRV_Reg32(USB_DMAQ_TQCSR(_n))|USB_DMACNTL_DMAEN_STOP)
+#define USBHCD_DMAQ_TQ_Start(_n) DRV_WriteReg32(USB_DMAQ_TQCSR(_n), DRV_Reg32(USB_DMAQ_TQCSR(_n))|USB_DMACNTL_DMAEN_START)
+#define USBHCD_DMAQ_TQ_Resume(_n) DRV_WriteReg32(USB_DMAQ_TQCSR(_n), DRV_Reg32(USB_DMAQ_TQCSR(_n))|USB_DMACNTL_DMAEN_RESUME)
+
+
+#define RGPD_FLAGS_HWO 0x01
+#define RGPD_FLAGS_BDP 0x02
+#define RGPD_ENDPOINT 0x0F
+#define RGPD_TGL 0x10
+#define RGPD_ZLP 0x20
+#define RGPD_FLAGS_IOC 0x80
+
+
+#define TGPD_FLAGS_HWO 0x01
+#define TGPD_FORMAT_BDP 0x02
+#define TGPD_FORMAT_TGL 0x10
+#define TGPD_FORMAT_ZLP 0x20
+#define TGPD_FLAG_IOC 0x40
+
+
+/*
+#define TGPD_IS_FLAGS_HWO(_pd) (((TGPD *)_pd)->flag & TGPD_FLAGS_HWO)
+#define TGPD_SET_FLAGS_HWO(_pd) (((TGPD *)_pd)->flag |= TGPD_FLAGS_HWO)
+#define TGPD_CLR_FLAGS_HWO(_pd) (((TGPD *)_pd)->flag &= (~TGPD_FLAGS_HWO))
+#define TGPD_IS_FORMAT_BDP(_pd) (((TGPD *)_pd)->flag & TGPD_FORMAT_BDP)
+#define TGPD_SET_FORMAT_BDP(_pd) (((TGPD *)_pd)->flag |= TGPD_FORMAT_BDP)
+#define TGPD_CLR_FORMAT_BDP(_pd) (((TGPD *)_pd)->flag &= (~TGPD_FORMAT_BDP))
+
+#define TGPD_SET_FLAG(_pd, _flag) ((TGPD *)_pd)->flag = (((TGPD *)_pd)->flag&(~TGPD_FLAGS_HWO))|(_flag)
+#define TGPD_GET_FLAG(_pd) (((TGPD *)_pd)->flag & TGPD_FLAGS_HWO)
+#define TGPD_SET_CHKSUM(_pd, _n) ((TGPD *)_pd)->chksum = PDU_calcCksum((kal_uint8 *)_pd, _n)
+#define TGPD_SET_CHKSUM_HWO(_pd, _n) ((TGPD *)_pd)->chksum = PDU_calcCksum((kal_uint8 *)_pd, _n)-1
+#define TGPD_GET_CHKSUM(_pd) ((TGPD *)_pd)->chksum
+#define TGPD_SET_FORMAT(_pd, _fmt) ((TGPD *)_pd)->flag = (((TGPD *)_pd)->flag&(~TGPD_FORMAT_BDP))|(_fmt)
+#define TGPD_GET_FORMAT(_pd) ((((TGPD *)_pd)->flag & TGPD_FORMAT_BDP)>>1)
+#define TGPD_SET_DataBUF_LEN(_pd, _len) ((TGPD *)_pd)->DataBufferLen = _len
+#define TGPD_ADD_DataBUF_LEN(_pd, _len) ((TGPD *)_pd)->DataBufferLen += _len
+#define TGPD_GET_DataBUF_LEN(_pd) ((TGPD *)_pd)->DataBufferLen
+#define TGPD_SET_NEXT(_pd, _next) ((TGPD *)_pd)->pNext = ((TGPD *)_next)
+#define TGPD_GET_NEXT(_pd) (TGPD *)phys_to_virt((kal_uint32)_pd->pNext)
+#define TGPD_SET_TBD(_pd, _tbd) ((TGPD *)_pd)->pBuf = (kal_uint8 *)_tbd;\
+ TGPD_SET_FORMAT_BDP(_pd)
+#define TGPD_GET_TBD(_pd) (TBD *)((TGPD *)_pd)->pBuf
+
+#define TGPD_SET_DATA(_pd, _data) ((TGPD *)_pd)->pBuf = (kal_uint8 *)_data
+#define TGPD_GET_DATA(_pd) (kal_uint8*)((TGPD *)_pd)->pBuf
+#define TGPD_SET_BUF_LEN(_pd, _len) ((TGPD *)_pd)->bufLen = _len
+#define TGPD_ADD_BUF_LEN(_pd, _len) ((TGPD *)_pd)->bufLen += _len
+#define TGPD_GET_BUF_LEN(_pd) ((TGPD *)_pd)->bufLen
+#define TGPD_SET_EXT_LEN(_pd, _len) ((TGPD *)_pd)->ExtLength = _len
+#define TGPD_GET_EXT_LEN(_pd) ((TGPD *)_pd)->ExtLength
+#define TGPD_SET_EPaddr(_pd, _EP) ((TGPD *)_pd)->ZTepFlag =(((TGPD *)_pd)->ZTepFlag&0xF0)|(_EP)
+#define TGPD_GET_EPaddr(_pd) ((TGPD *)_pd)->ZTepFlag & 0x0F
+
+#define TGPD_IS_FORMAT_TGL(_pd) (((TGPD *)_pd)->ZTepFlag & TGPD_FORMAT_TGL)
+#define TGPD_SET_FORMAT_TGL(_pd) (((TGPD *)_pd)->ZTepFlag |=TGPD_FORMAT_TGL)
+#define TGPD_CLR_FORMAT_TGL(_pd) (((TGPD *)_pd)->ZTepFlag &= (~TGPD_FORMAT_TGL))
+#define TGPD_IS_FORMAT_ZLP(_pd) (((TGPD *)_pd)->ZTepFlag & TGPD_FORMAT_ZLP)
+#define TGPD_SET_FORMAT_ZLP(_pd) (((TGPD *)_pd)->ZTepFlag |=TGPD_FORMAT_ZLP)
+#define TGPD_CLR_FORMAT_ZLP(_pd) (((TGPD *)_pd)->ZTepFlag &= (~TGPD_FORMAT_ZLP))
+
+#define TGPD_SET_TGL(_pd, _TGL) ((TGPD *)_pd)->ZTepFlag |=(( _TGL) ? 0x10: 0x00)
+#define TGPD_GET_TGL(_pd) ((TGPD *)_pd)->ZTepFlag & 0x10 ? 1:0
+#define TGPD_SET_ZLP(_pd, _ZLP) ((TGPD *)_pd)->ZTepFlag |= ((_ZLP) ? 0x20: 0x00)
+#define TGPD_GET_ZLP(_pd) ((TGPD *)_pd)->ZTepFlag & 0x20 ? 1:0
+
+#define TGPD_SET_IOC(_pd) (((TGPD *)_pd)->ZTepFlag |= TGPD_FLAG_IOC)
+
+#define TGPD_GET_EXT(_pd) ((kal_uint8 *)_pd + sizeof(TGPD))
+#define TGPD_SET_KEY_IDX(_pd, _data) \
+{\
+ kal_uint8 *_tmp = ((kal_uint8 *)_pd + sizeof(TGPD));\
+ *_tmp = (unsigned char)_data;\
+}
+#define TGPD_GET_KEY_IDX(_pd) *((kal_uint8 *)_pd + sizeof(TGPD))
+*/
+
+/**
+ * TGPD
+ */
+typedef struct _TGPD
+{
+ kal_uint8 flag;
+ kal_uint8 chksum;
+ kal_uint16 DataBufferLen; /*Rx Allow Length*/
+ struct _TGPD* pNext;
+ kal_uint8* pBuf;
+ kal_uint16 bufLen;
+ kal_uint8 ExtLength;
+ kal_uint8 ZTepFlag;
+}TGPD, *PGPD;
+
+
+#endif
+
+
+/* endpoint information*/
+typedef struct
+{
+ /* keep send/recv buffer addr, wait for scheduler*/
+ kal_uint8 *p_data;
+ kal_uint16 data_length;
+ /* If normal mode and data length > max pkt size */
+ kal_uint16 max_packet_size;
+ kal_uint16 sofar;
+
+ USB_ENDPT_TXFER_TYPE ep_type; /* Control, interrupt, bulk or ISO */
+ USB_EP_DIRECTION direction; /* For control endpoint, this indicates data direction*/
+ kal_bool b_enable;
+
+ kal_bool b_dma_enable;
+ kal_bool b_dmaQ_enable;
+}USB_HCD_EP_INFO;
+
+typedef enum
+{
+ USBH_STATE_START,
+ USBH_STATE_IDLE,
+ USBH_STATE_WAIT_VRISE,
+ USBH_STATE_WAIT_BCON,
+ USBH_STATE_HOST,
+ USBH_STATE_SUSPEND
+}USB_HCD_STATE;
+
+
+typedef struct
+{
+ const USB_HOST_COMMON_PARAM *host_common_param;
+
+ USB_HCD_STATE host_state;
+ USB_HCD_STATUS reset_reason;
+
+ /* interrupt handler */
+ usb_hcd_intr_handler_ptr attach_hdlr;
+ usb_hcd_intr_handler_ptr detach_hdlr;
+ usb_hcd_intr_handler_ptr resume_hdlr; /* Host receive remote wakeup handler */
+
+ /* endpoint related information*/
+ usb_hcd_intr_handler_ptr ep0_hdlr;
+ usb_hcd_intr_handler_ptr ep_tx_hdlr[MAX_TX_EP_NUM];
+ usb_hcd_intr_handler_ptr ep_rx_hdlr[MAX_RX_EP_NUM];
+ USB_HCD_EP_INFO ep0_info;
+ USB_HCD_EP_INFO ep_tx_info[MAX_TX_EP_NUM];
+ USB_HCD_EP_INFO ep_rx_info[MAX_RX_EP_NUM];
+
+ kal_bool ep0_setup;
+ kal_bool ep0_status;
+
+ USB_EP_STATE ep_tx_enb_state[MAX_TX_EP_NUM];
+ USB_EP_STATE ep_rx_enb_state[MAX_RX_EP_NUM];
+ /* FIFO flush interrupt */
+ kal_bool ep_tx_flush_intr[MAX_TX_EP_NUM];
+ kal_bool ep_rx_flush_intr[MAX_RX_EP_NUM];
+ /* TX FIFOWrite interrupt */
+ kal_bool ep0_fifo_intr;
+ kal_bool ep_tx_fifo_intr[MAX_TX_EP_NUM];
+ kal_bool ep_rx_fifo_intr[MAX_RX_EP_NUM];
+ kal_bool b_hcd_is_high_speed;
+
+ kal_uint8 ep_rx_real_num;
+ kal_uint8 ep_tx_real_num;
+
+ /* Attach/detach debounce timer */
+ kal_uint32 gpt_handle; /*GPT handle*/
+
+ /* may be omit */
+// kal_uint32 resume_timer;
+
+ kal_bool b_unmask_irq;
+
+ /* DMA parameters */
+ /* DMA RX timer */
+ kal_uint32 dma_gpt_handle[MAX_RX_EP_NUM]; /*GPT handle*/
+ kal_uint8 dma_port[2][MAX_EP_NUM]; /* record TX/RX ep's DMA port number */
+ USB_EP_DIRECTION dma_dir[MAX_DMA_NUM]; /* record DMA port's direction */
+ kal_bool dma_pktrdy[MAX_DMA_NUM];
+ kal_bool dma_running[MAX_DMA_NUM];
+ kal_bool dma_callback_upd_run[MAX_DMA_NUM]; /* take PP buffer */
+ usb_dma_callback dma_callback[MAX_DMA_NUM]; /* take PP buffer */
+ kal_uint32 dma_length[MAX_DMA_NUM];
+#if defined(DRV_USB_IP_V4)
+ kal_uint32 dmaQ_tx_length[DMAQ_MAX_NUMBERS];
+ kal_uint32 dmaQ_rx_length[DMAQ_MAX_NUMBERS];
+#endif
+ kal_uint32 dma_addr[MAX_DMA_NUM];
+ kal_bool is_bidirection_dma[MAX_DMA_NUM];
+ kal_uint8 dma_channel;
+ kal_uint8 dma_tx_ep_num[MAX_DMA_NUM]; /* record DMA port's TX ep number */
+ kal_uint8 dma_rx_ep_num[MAX_DMA_NUM]; /* record DMA port's RX ep number */
+ kal_bool b_enable_dma_burst_auto_chge; /* For DVT use only, enable DMA auto changed burst mode */
+ kal_bool b_disable_attach;
+ kal_uint8 usb_ip_port;
+}USB_HCD_Struct;
+
+
+
+extern USB_HCD_Struct g_UsbHcdInfo[USB_IP_NUM];
+
+
+#endif /* USB_HCD_PRI_H */
+
diff --git a/mcu/driver/connectivity/usb_driver/inc/usb_host_ms_custom.h b/mcu/driver/connectivity/usb_driver/inc/usb_host_ms_custom.h
new file mode 100644
index 0000000..28c288f
--- /dev/null
+++ b/mcu/driver/connectivity/usb_driver/inc/usb_host_ms_custom.h
@@ -0,0 +1,85 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usb_host_ms_custom.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb host ns customization parameter definition
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+#if 0
+/* under construction !*/
+#ifndef USB_HOST_MS_CUSTOM_H
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+/* under construction !*/
+#endif
diff --git a/mcu/driver/connectivity/usb_driver/inc/usb_hw.h b/mcu/driver/connectivity/usb_driver/inc/usb_hw.h
new file mode 100644
index 0000000..90249c1
--- /dev/null
+++ b/mcu/driver/connectivity/usb_driver/inc/usb_hw.h
@@ -0,0 +1,2792 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usb_hw.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb hardware register definitions
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *==============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+#ifndef USB_HW_H
+#define USB_HW_H
+
+#include "reg_base.h"
+#include "drv_features.h"
+/* USB Controller */
+#if (defined(DRV_USB_IP_V4)) //Unit IP
+
+
+#define DMAQ_MAX_NUMBERS 3
+
+#define USB_FADDR (USB_base+0x00) /* RW */
+#define USB_POWER (USB_base+0x01)
+#define USB_INTRTX (USB_base+0x02) /* 16-bit, status, read only */
+#define USB_INTRRX (USB_base+0x04) /* 16-bit, status, read only */
+#define USB_INTRTXE (USB_base+0x06) /* 16-bit, RW */
+#define USB_INTRRXE (USB_base+0x08) /* 16-bit, RW */
+#define USB_INTRUSB (USB_base+0x0A) /* 8-bit, status, read only*/
+#define USB_INTRUSBE (USB_base+0x0B) /* 8-bit, RW */
+#define USB_FRAME (USB_base+0x0C) /* 16-bit, read only */ /*Max Frame length = 11 bits*/
+#define USB_INDEX (USB_base+0x0E) /* RW, 4bit available*/
+#define USB_TESTMODE (USB_base+0x0F) /* RW, 8-bit */
+
+
+#define USB_CSR0 (USB_base+0x12) /* 16-bit */
+#define USB_COUNT0 (USB_base+0x18) /* RO, EP0 only*/
+#define USB_NAKLIMIT0 (USB_base+0x1B) /* RW, host mode only*/
+#define USB_TXMAXP (USB_base+0x10) /* 16-bit, RW*/
+#define USB_TXCSR (USB_base+0x12)
+#define USB_RXMAXP (USB_base+0x14) /* 16-bit, RW*/
+#define USB_RXCSR (USB_base+0x16)
+#define USB_RXCOUNT (USB_base+0x18) /* RO, 14bits */
+#define USB_TXTYPE (USB_base+0x1A) /* RW, host mode only */
+#define USB_TXINTERVAL (USB_base+0x1B) /* RW, host mode only */
+#define USB_RXTYPE (USB_base+0x1C) /* RW, host mode only */
+#define USB_RXINTERVAL (USB_base+0x1D) /* RW, host mode only */
+
+#define USB_EP0 (USB_base+0x20) /* 4 byte as 1 queue */
+#define USB_EP1 (USB_base+0x24)
+#define USB_EP2 (USB_base+0x28)
+#define USB_EP3 (USB_base+0x32)
+#define USB_EP4 (USB_base+0x40)
+
+#define USB_DEVCTL (USB_base+0x60) /* 8-bit */
+#define USB_PWRUPCNT (USB_base+0x61) /* RW */
+#define USB_TXFIFOSZ (USB_base+0x62) /* RW */
+#define USB_RXFIFOSZ (USB_base+0x63) /* RW */
+#define USB_TXFIFOADD (USB_base+0x64) /* RW */
+#define USB_RXFIFOADD (USB_base+0x66) /* RW */
+
+
+#define USB_BUSPERF1 (USB_base+0x70) /* RW */
+#define USB_BUSPERF2 (USB_base+0x72) /* RW */
+#define USB_BUSPERF3 (USB_base+0x74) /* RW */
+
+
+
+
+#define USB_VPLEN (USB_base+0x7B) /* RW, 8-bits */
+#define USB_RSTINFO (USB_base+0x7F) /* RW */
+
+
+#define USB_L1INTS (USB_base+0xA0) /* RW */
+#define USB_L1INTM (USB_base+0xA4) /* RW */
+#define USB_L1INTP (USB_base+0xA8) /* RW */
+#define USB_L1INTC (USB_base+0xAC) /* RW */
+
+#define USB_EPn_TXCSR(_n) (USB_base+0x102+(0x10*(_n))) /* R */
+#define USB_EPn_RXCSR(_n) (USB_base+0x106+(0x10*(_n))) /* R */
+
+
+#define USB_HWTPR (USB_base+0x704) //HW TxPktRdy
+#define USB_HWTPR_EN (USB_base+0x708) //HW TxPktRdy Enable
+#define USB_HWTPR_ERR (USB_base+0x70C) //HW TX Direct Path Error Detection
+
+
+
+//#define USB_DMAINTR (USB_base+0x200) /* 8-bits, W0C */
+
+#define USB_DMA_INTR_STATUS (USB_base+0x200) /* 8-bits, W1C */
+#define USB_DMA_INTR_UNMASK (USB_base+0x201) /* 8-bits, R only */
+#define USB_DMA_INTR_UNMASK_CLEAR (USB_base+0x202) /* 8-bits, W1S */
+#define USB_DMA_INTR_UNMASK_SET (USB_base+0x203) /* 8-bits, W1S */
+
+
+#define USB_DMALIMITER (USB_base+0x210) /* 8-bits, RW */
+#define USB_DMA_CONFIG (USB_base+0x220) /* 8-bits, RW */
+
+#define USB_DMACNTL(_n) (USB_base+0x1F4+(0x10*(_n))) /* RW, _n = 1~6 */
+#define USB_DMAADDR(_n) (USB_base+0x1F8+(0x10*(_n))) /* RW, _n = 1~6 */
+#define USB_DMACNT(_n) (USB_base+0x1FC+(0x10*(_n))) /* RW, _n = 1~6 */
+
+#define USB_DMA_REALCNT(_n) (USB_base+0x270+(0x10*(_n))) /* RO, _n = 1~6, 32bits */
+#define USB_DMA_TIMER(_n) (USB_base+0x274+(0x10*(_n))) /* RW, _n = 1~6, 16bits */
+
+#define USB_RQPKTCOUNT(_n) (USB_base+0x300+(0x04*(_n))) /* RW, 16bits, _n = 1~3, host mode RX ep only */
+
+#define USB_PSR_CTRL (USB_base+0x610) /* 32 bits access only */
+#define USB_PSR_CTRL_2 (USB_base+0x614) /* 32 bits access only */
+#define USB_DBG_PRB (USB_base+0x620) /* 32 bits access only */
+
+#define USB_OPSTATE (USB_DRV_Reg32(USB_DBG_PRB)&USB_DBG_PRB_OPSTATE_MASK)
+#define USB_LINE_STATE (USB_DRV_Reg32(USB_DBG_PRB)&USB_DBG_PRB_LINESTATE_MASK)
+
+#define USB_FADDR_HCD(_baseaddr) (_baseaddr+0x00) /* RW */
+#define USB_POWER_HCD(_baseaddr) (_baseaddr+0x01)
+#define USB_INTRTX_HCD(_baseaddr) (_baseaddr+0x02) /* 16-bit, status, read only */
+#define USB_INTRRX_HCD(_baseaddr) (_baseaddr+0x04) /* 16-bit, status, read only */
+#define USB_INTRTXE_HCD(_baseaddr) (_baseaddr+0x06) /* 16-bit, RW */
+#define USB_INTRRXE_HCD(_baseaddr) (_baseaddr+0x08) /* 16-bit, RW */
+#define USB_INTRUSB_HCD(_baseaddr) (_baseaddr+0x0A) /* 8-bit, status, read only*/
+#define USB_INTRUSBE_HCD(_baseaddr) (_baseaddr+0x0B) /* 8-bit, RW */
+#define USB_FRAME_HCD(_baseaddr) (_baseaddr+0x0C) /* 16-bit, read only */ /*Max Frame length = 11 bits*/
+#define USB_INDEX_HCD(_baseaddr) (_baseaddr+0x0E) /* RW, 4bit available*/
+#define USB_TESTMODE_HCD(_baseaddr) (_baseaddr+0x0F) /* RW, 8-bit */
+
+#define USB_CSR0_HCD(_baseaddr) (_baseaddr+0x12) /* 16-bit */
+#define USB_COUNT0_HCD(_baseaddr) (_baseaddr+0x18) /* RO, EP0 only*/
+#define USB_NAKLIMIT0_HCD(_baseaddr) (_baseaddr+0x1B) /* RW, host mode only*/
+#define USB_TXMAXP_HCD(_baseaddr) (_baseaddr+0x10) /* 16-bit, RW*/
+#define USB_TXCSR_HCD(_baseaddr) (_baseaddr+0x12)
+#define USB_RXMAXP_HCD(_baseaddr) (_baseaddr+0x14) /* 16-bit, RW*/
+#define USB_RXCSR_HCD(_baseaddr) (_baseaddr+0x16)
+#define USB_RXCOUNT_HCD(_baseaddr) (_baseaddr+0x18) /* RO, 14bits */
+#define USB_TXTYPE_HCD(_baseaddr) (_baseaddr+0x1A) /* RW, host mode only */
+#define USB_TXINTERVAL_HCD(_baseaddr) (_baseaddr+0x1B) /* RW, host mode only */
+#define USB_RXTYPE_HCD(_baseaddr) (_baseaddr+0x1C) /* RW, host mode only */
+#define USB_RXINTERVAL_HCD(_baseaddr) (_baseaddr+0x1D) /* RW, host mode only */
+
+#define USB_EP0_HCD(_baseaddr) (_baseaddr+0x20) /* 4 byte as 1 queue */
+
+#define USB_DEVCTL_HCD(_baseaddr) (_baseaddr+0x60) /* 8-bit */
+#define USB_PWRUPCNT_HCD(_baseaddr) (_baseaddr+0x61) /* RW */
+#define USB_TXFIFOSZ_HCD(_baseaddr) (_baseaddr+0x62) /* RW */
+#define USB_RXFIFOSZ_HCD(_baseaddr) (_baseaddr+0x63) /* RW */
+#define USB_TXFIFOADD_HCD(_baseaddr) (_baseaddr+0x64) /* RW */
+#define USB_RXFIFOADD_HCD(_baseaddr) (_baseaddr+0x66) /* RW */
+
+#define USB_BUSPERF1_HCD(_baseaddr) (_baseaddr+0x70) /* RW */
+#define USB_BUSPERF2_HCD(_baseaddr) (_baseaddr+0x72) /* RW */
+#define USB_BUSPERF3_HCD(_baseaddr) (_baseaddr+0x74) /* RW */
+#define USB_OPSTATE_HCD(_baseaddr) (_baseaddr+0x620) /* RW */
+
+#define USB_VPLEN_HCD(_baseaddr) (_baseaddr+0x7B) /* RW, 8-bits */
+#define USB_RSTINFO_HCD(_baseaddr) (_baseaddr+0x7F) /* RW */
+
+#define USB_EPn_TXCSR_HCD(_baseaddr,_n) (_baseaddr+0x102+(0x10*(_n))) /* R */
+#define USB_EPn_RXCSR_HCD(_baseaddr,_n) (_baseaddr+0x106+(0x10*(_n))) /* R */
+
+#define USB_DMAINTR_HCD(_baseaddr) (_baseaddr+0x200) /* 8-bits, W1C */
+#define USB_DMALIMITER_HCD(_baseaddr,_n) (_baseaddr+0x200+(0x10*(_n))) /* 8-bits, RW */
+#define USB_DMACNTL_HCD(_baseaddr,_n) (_baseaddr+0x1F4+(0x10*(_n))) /* RW, _n = 1~6 */
+#define USB_DMAADDR_HCD(_baseaddr,_n) (_baseaddr+0x1F8+(0x10*(_n))) /* RW, _n = 1~6 */
+#define USB_DMACNT_HCD(_baseaddr,_n) (_baseaddr+0x1FC+(0x10*(_n))) /* RW, _n = 1~6 */
+#define USB_RQPKTCOUNT_HCD(_baseaddr,_n) (_baseaddr+0x300+(0x04*(_n))) /* RW, 16bits, _n = 1~3, host mode RX ep only */
+
+#define USB_DMA_REALCNT_HCD(_baseaddr,_n) (_baseaddr+0x270+(0x10*(_n))) /* RO, _n = 1~6, 32bits */
+#define USB_DMA_TIMER_HCD(_baseaddr,_n) (_baseaddr+0x274+(0x10*(_n))) /* RW, _n = 1~6, 16bits */
+
+//DMAQ
+#define USB_DMAQ_QCR0 (USB_base+0x800) //Queue Control Register 0 QCR0
+#define USB_DMAQ_QCR1 (USB_base+0x804) //Queue Control Register 1 (wimax) QCR1
+#define USB_DMAQ_QCR2 (USB_base+0x808) //Queue Control Register 2 QCR2
+#define USB_DMAQ_QCR3 (USB_base+0x80C) //Queue Control Register 3 QCR3
+#define USB_DMAQ_RQCSR0 (USB_base+0x810) //RX Queue Command and Status Register0 RQCSR0
+#define USB_DMAQ_RQSAR0 (USB_base+0x814) //RX Queue Starting Address Register0 RQSAR0
+#define USB_DMAQ_RQCPR0 (USB_base+0x818) //RX Queue Current Pointer Register0 RQCPR0
+//#define USB_DMAQ_RQCSR1 (USB_base+0x820) //RX Queue Command and Status Register 1 RQCSR1
+//#define USB_DMAQ_RQSAR1 (USB_base+0x824) //RX Queue Starting Address Register 1 RQSAR1
+//#define USB_DMAQ_RQCPR1 (USB_base+0x828) //RX Queue Current Pointer Register 1 RQCPR1
+//#define USB_DMAQ_RQCSR2 (USB_base+0x830) //RX Queue Command and Status Register2 RQCSR2
+//#define USB_DMAQ_RQSAR2 (USB_base+0x834) //RX Queue Starting Address Register 2 RQSAR2
+//#define USB_DMAQ_RQCPR2 (USB_base+0x838) //RX Queue Current Pointer Register 2 RQCPR2
+//#define USB_DMAQ_RQCSR3 (USB_base+0x840) //RX Queue Command and Status Register 3 RQCSR3
+//#define USB_DMAQ_RQSAR3 (USB_base+0x844) //RX Queue Starting Address Register 3 RQSAR3
+//#define USB_DMAQ_RQCPR3 (USB_base+0x848) //RX Queue Current Pointer Register 3 RQCPR3
+//#define USB_DMAQ_RQCSR4 (USB_base+0x850) //RX Queue Command and Status Register 4 RQCSR4
+//#define USB_DMAQ_RQSAR4 (USB_base+0x854) //RX Queue Starting Address Register 4 RQSAR4
+//#define USB_DMAQ_RQCPR4 (USB_base+0x858) //RX Queue Current Pointer Register 4 RQCPR4
+//#define USB_DMAQ_RQCSR5 (USB_base+0x860) //RX Queue Command and Status Register 5 RQCSR5
+//#define USB_DMAQ_RQSAR5 (USB_base+0x864) //RX Queue Starting Address Register 5 RQSAR5
+//#define USB_DMAQ_RQCPR5 (USB_base+0x868) //RX Queue Current Pointer Register 5 RQCPR5
+//#define USB_DMAQ_RQCSR6 (USB_base+0x870) //RX Queue Command and Status Register 6 RQCSR6
+//#define USB_DMAQ_RQSAR6 (USB_base+0x874) //RX Queue Starting Address Register 6 RQSAR6
+//#define USB_DMAQ_RQCPR6 (USB_base+0x878) //RX Queue Current Pointer Register 6 RQCPR6
+//#define USB_DMAQ_RQCSR7 (USB_base+0x880) //RX Queue Command and Status Register 7 RQCSR7
+//#define USB_DMAQ_RQSAR7 (USB_base+0x884) //RX Queue Starting Address Register 7 RQSAR7
+//#define USB_DMAQ_RQCPR7 (USB_base+0x888) //RX Queue Current Pointer Register 7 RQCPR7
+
+#define USB_DMAQ_RQTR0 (USB_base+0x890) //RX Queue 0 Timeout Register RQTR0
+//#define USB_DMAQ_RQTR1 (USB_base+0x894) //RX Queue 1 Timeout Register RQTR1
+//#define USB_DMAQ_RQTR2 (USB_base+0x898) //RX Queue 2 Timeout Register RQTR2
+//#define USB_DMAQ_RQTR3 (USB_base+0x89C) //RX Queue 3 Timeout Register RQTR3
+//#define USB_DMAQ_RQTR4 (USB_base+0x8A0) //RX Queue 4 Timeout Register RQTR4
+//#define USB_DMAQ_RQTR5 (USB_base+0x8A4) //RX Queue 5 Timeout Register RQTR5
+//#define USB_DMAQ_RQTR6 (USB_base+0x8A8) //RX Queue 6 Timeout Register RQTR6
+//#define USB_DMAQ_RQTR7 (USB_base+0x8AC) //RX Queue 7 Timeout Register RQTR7
+
+#define USB_DMAQ_RQLDPR0 (USB_base+0x900) //RX Queue Last Done Pointer Register 0 RQLDPR0
+//#define USB_DMAQ_RQLDPR1 (USB_base+0x904) //RX Queue Last Done Pointer Register 1 RQLDPR1
+//#define USB_DMAQ_RQLDPR2 (USB_base+0x908) //RX Queue Last Done Pointer Register 2 RQLDPR2
+//#define USB_DMAQ_RQLDPR3 (USB_base+0x90C) //RX Queue Last Done Pointer Register 3 RQLDPR3
+//#define USB_DMAQ_RQLDPR4 (USB_base+0x910) //RX Queue Last Done Pointer Register 4 RQLDPR4
+//#define USB_DMAQ_RQLDPR5 (USB_base+0x914) //RX Queue Last Done Pointer Register 5 RQLDPR5
+//#define USB_DMAQ_RQLDPR6 (USB_base+0x918) //RX Queue Last Done Pointer Register 6 RQLDPR6
+//#define USB_DMAQ_RQLDPR7 (USB_base+0x91C) //RX Queue Last Done Pointer Register 7 RQLDPR7
+
+#define USB_DMAQ_T0QCSR (USB_base+0xA00) //TX 0 Queue Command and Status Register T0QCSR
+#define USB_DMAQ_T0QSAR (USB_base+0xA04) //TX 0 Queue Starting Address Register T0QSAR
+#define USB_DMAQ_T0QCPR (USB_base+0xA08) //TX 0 Queue Current Pointer Register T0QCPR
+//#define USB_DMAQ_T1QCSR (USB_base+0xA10) //TX 1 Queue Command and Status Register T1QCSR
+//#define USB_DMAQ_T1QSAR (USB_base+0xA14) //TX 1 Queue Starting Address Register T1QSAR
+//#define USB_DMAQ_T1QCPR (USB_base+0xA18) //TX 1 Queue Current Pointer Register T1QCPR
+//#define USB_DMAQ_T2QCSR (USB_base+0xA20) //TX 2 Queue Command and Status Register T2QCSR
+//#define USB_DMAQ_T2QSAR (USB_base+0xA24) //TX 2 Queue Starting Address Register T2QSAR
+//#define USB_DMAQ_T2QCPR (USB_base+0xA28) //TX 2 Queue Current Pointer Register T2QCPR
+//#define USB_DMAQ_T3QCSR (USB_base+0xA30) //TX 3 Queue Command and Status Register T3QCSR
+//#define USB_DMAQ_T3QSAR (USB_base+0xA34) //TX 3 Queue Starting Address Register T3QSAR
+//#define USB_DMAQ_T3QCPR (USB_base+0xA38) //TX 3 Queue Current Pointer Register T3QCPR
+//#define USB_DMAQ_T4QCSR (USB_base+0xA40) //TX 4 Queue Command and Status Register T4QCSR
+//#define USB_DMAQ_T4QSAR (USB_base+0xA44) //TX 4 Queue Starting Address Register T4QSAR
+//#define USB_DMAQ_T4QCPR (USB_base+0xA48) //TX 4 Queue Current Pointer Register T4QCPR
+//#define USB_DMAQ_T5QCSR (USB_base+0xA50) //TX 5 Queue Command and Status Register T5QCSR
+//#define USB_DMAQ_T5QSAR (USB_base+0xA54) //TX 5 Queue Starting Address Register T5QSAR
+//#define USB_DMAQ_T5QCPR (USB_base+0xA58) //TX 5 Queue Current Pointer Register T5QCPR
+//#define USB_DMAQ_T6QCSR (USB_base+0xA60) //TX 6 Queue Command and Status Register T6QCSR
+//#define USB_DMAQ_T6QSAR (USB_base+0xA64) //TX 6 Queue Starting Address Register T6QSAR
+//#define USB_DMAQ_T6QCPR (USB_base+0xA68) //TX 6 Queue Current Pointer Register T6QCPR
+//#define USB_DMAQ_T7QCSR (USB_base+0xA70) //TX 7 Queue Command and Status Register T7QCSR
+//#define USB_DMAQ_T7QSAR (USB_base+0xA74) //TX 7 Queue Starting Address Register T7QSAR
+//#define USB_DMAQ_T7QCPR (USB_base+0xA78) //TX 7 Queue Current Pointer Register T7QCPR
+
+#define USB_DMAQ_USBGCSR (USB_base+0xB00) //USB General Control and Status Registers USBGCSR
+//#define USB_DMAQ_USB_FW1 (USB_base+0xB04) //USB Firmware read/write Register 1 (wimax) USB_FW1
+//#define USB_DMAQ_USB_FW2 (USB_base+0xB08) //USB Firmware read/write Register 2 (wimax) USB_FW2
+//#define USB_DMAQ_T0QUSBSC (USB_base+0xB80) //T0Q USB Stream Constraint Register (wimax) T0QUSBSC
+//#define USB_DMAQ_T1QUSBSC (USB_base+0xB84) //T1Q USB Stream Constraint Register (wimax) T1QUSBSC
+//#define USB_DMAQ_T2QUSBSC (USB_base+0xB88) //T2Q USB Stream Constraint Register (wimax) T2QUSBSC
+//#define USB_DMAQ_T3QUSBSC (USB_base+0xB8C) //T3Q USB Stream Constraint Register (wimax) T3QUSBSC
+//#define USB_DMAQ_T4QUSBSC (USB_base+0xB90) //T4Q USB Stream Constraint Register (wimax) T4QUSBSC
+//#define USB_DMAQ_T5QUSBSC (USB_base+0xB94) //T5Q USB Stream Constraint Register (wimax) T5QUSBSC
+//#define USB_DMAQ_T6QUSBSC (USB_base+0xB98) //T6Q USB Stream Constraint Register (wimax) T6QUSBSC
+//#define USB_DMAQ_T7QUSBSC (USB_base+0xB9C) //T7Q USB Stream Constraint Register (wimax) T7QUSBSC
+
+#define USB_DMAQ_QISAR (USB_base+0xC00) //QMU Interrupt Status and Acknowledgement Register QISAR
+#define USB_DMAQ_QIMR (USB_base+0xC04) //QMU Interrupt Mask Register QIMR
+#define USB_DMAQ_QIMCR (USB_base+0xC08) //QMU Interrupt Mask Clear Register QIMCR
+#define USB_DMAQ_QIMSR (USB_base+0xC0C) //QMU Interrupt Mask Set Register QIMSR
+//#define USB_DMAQ_QSISAR (USB_base+0xC10) //QMU Software Interrupt Status Ack Register (wimax-cmd) QSISAR
+//#define USB_DMAQ_DSIMR (USB_base+0xC14) //Device Software Interrupt Mask Register (wimax-cmd) DSIMR
+//#define USB_DMAQ_DSIMCR (USB_base+0xC18) //Device Software Interrupt Mask Clear Register (wimax-cmd) DSIMCR
+//#define USB_DMAQ_DSIMSR (USB_base+0xC1C) //Device Software Interrupt Mask Set Register (wimax-cmd) DSIMSR
+//#define USB_DMAQ_DSICR (USB_base+0xC20) //Device Software Interrupt Command Register (wimax-evt) DSICR
+#define USB_DMAQ_IOCDISR (USB_base+0xC30) //GPD Done Interrupt on GPD IOC bit Disable Register IOCDISR
+#define USB_DMAQ_QMU_HWVER (USB_base+0xC40) //QMU Hardware Version Register QMU_HWVER
+#define USB_DMAQ_TQEMIR (USB_base+0xC60) //TX Queue Empty Indication Register TQEMIR
+//#define USB_DMAQ_TQEMIMR (USB_base+0xC64) //TX Queue Empty Indication Mask Register TQEMIMR
+#define USB_DMAQ_TQEMIMCR (USB_base+0xC68) //TX Queue Empty Indication Mask Clear Register TQEMIMCR
+#define USB_DMAQ_TQEMIMSR (USB_base+0xC6C) //TX Queue Empty Indication Mask Set Register TQEMIMSR
+#define USB_DMAQ_RQEMIR (USB_base+0xC70) //RX Queue Empty Indication Register RQEMIR
+#define USB_DMAQ_RQEMIMR (USB_base+0xC74) //RX Queue Empty Indication Mask Register RQEMIMR
+#define USB_DMAQ_RQEMIMCR (USB_base+0xC78) //RX Queue Empty Indication Mask Clear Register RQEMIMCR
+#define USB_DMAQ_RQEMIMSR (USB_base+0xC7C) //RX Queue Empty Indication Mask Set Register RQEMIMSR
+#define USB_DMAQ_RQEIR (USB_base+0xC90) //RX Queue Error Indication Register RQEIR
+#define USB_DMAQ_RQEIMR (USB_base+0xC94) //RX Queue Error Indication Mask Register RQEIMR
+#define USB_DMAQ_RQEIMCR (USB_base+0xC98) //RX Queue Error Indication Mask Clear Register RQEIMCR
+#define USB_DMAQ_RQEIMSR (USB_base+0xC9C) //RX Queue Error Indication Mask Set Register RQEIMSR
+#define USB_DMAQ_REPEIR (USB_base+0xCA0) //RX Endpoint Error Indication Register REPEIR
+#define USB_DMAQ_REPEIMR (USB_base+0xCA4) //RX Endpoint Error Indication Mask Register REPEIMR
+#define USB_DMAQ_REPEIMCR (USB_base+0xCA8) //RX Endpoint Error Indication Mask Clear Register REPEIMCR
+#define USB_DMAQ_REPEIMSR (USB_base+0xCAC) //RX Endpoint Error Indication Mask Set Register REPEIMSR
+#define USB_DMAQ_TQEIR (USB_base+0xCB0) //TX Queue Error Indication Register TQEIR
+//#define USB_DMAQ_TQEIMR (USB_base+0xCB4) //TX Queue Error Indication Mask Register TQEIMR
+#define USB_DMAQ_TQEIMCR (USB_base+0xCB8) //TX Queue Error Indication Mask Clear Register TQEIMCR
+#define USB_DMAQ_TQEIMSR (USB_base+0xCBC) //TX Queue Error Indication Mask Set Register TQEIMSR
+#define USB_DMAQ_TEPEIR (USB_base+0xCC0) //TX Endpoint Error Indication Register TEPEIR
+//#define USB_DMAQ_TEPEIMR (USB_base+0xCC4) //TX Endpoint Error Indication Mask Register TEPEIMR
+#define USB_DMAQ_TEPEIMCR (USB_base+0xCC8) //TX Endpoint Error Indication Mask Clear Register TEPEIMCR
+#define USB_DMAQ_TEPEIMSR (USB_base+0xCCC) //TX Endpoint Error Indication Mask Set Register TEPEIMSR
+
+#define USB_DMAQ_DFCR (USB_base+0xCF0) //Debug Flag Control Register DFCR
+#define USB_DMAQ_DFMR (USB_base+0xCF4) //Debug Flag Monitor Register DFMR
+
+#define USB_DMAQ_QCR2_TX0_ZLP 0x01000000
+#define USB_DMAQ_QCR2_TX_ZLP(n) (USB_DMAQ_QCR2_TX0_ZLP<<((n)-1))
+
+#define USB_DMAQ_QCR3_RX0_ZLP 0x01000000
+#define USB_DMAQ_QCR3_RX_ZLP(n) (USB_DMAQ_QCR3_RX0_ZLP<<((n)-1))
+
+#define USB_DMAQ_RQCSR(_n) (USB_base+0x800+(0x10*(_n))) //810 , 820
+#define USB_DMAQ_RQSAR(_n) (USB_base+0x804+(0x10*(_n)))
+#define USB_DMAQ_RQCPR(_n) (USB_base+0x808+(0x10*(_n)))
+
+#define USB_DMAQ_TQCSR(_n) (USB_base+0xA00+ (0x10*(_n-1))) //A00, A10
+#define USB_DMAQ_TQSAR(_n) (USB_base+0xA04+ (0x10*(_n-1)))
+#define USB_DMAQ_TQCPR(_n) (USB_base+0xA08+ (0x10*(_n-1)))
+
+
+#define USB_DMAQ_USBGCSR_RQ_EN (0x00010000)
+#define USB_DMAQ_USBGCSR_TQ_EN (0x00000001)
+
+//USB_DMAQ_QIMCR
+#define USB_DMAQ_QIMCR_RXEP_ERR 0x04000000
+#define USB_DMAQ_QIMCR_RXQ_ERR 0x02000000
+#define USB_DMAQ_QIMCR_RXQ_EMPTY 0x00020000
+#define USB_DMAQ_QIMCR_RX0_DONE 0x00000100
+#define USB_DMAQ_QIMCR_RX_DONE(_n) (USB_DMAQ_QIMCR_RX0_DONE << (_n)) // 0,1
+
+#define USB_DMAQ_QIMCR_TXEP_ERR 0x10000000
+#define USB_DMAQ_QIMCR_TXQ_ERR 0x08000000
+#define USB_DMAQ_QIMCR_TXQ_EMPTY 0x00010000
+#define USB_DMAQ_QIMCR_TX0_DONE 0x00000001
+#define USB_DMAQ_QIMCR_TX_DONE(_n) (USB_DMAQ_QIMCR_TX0_DONE << (_n)) // 0,1
+
+#define USB_DMAQ_QIMCR0 0x00000001
+
+
+/*USB_DMAQ_QISAR*/
+#define USB_DMAQ_QISAR_RX0_DONE 0x00000100
+#define USB_DMAQ_QISAR_RX_DONE(n) (USB_DMAQ_QISAR_RX0_DONE << n) // 0,1
+
+#define USB_DMAQ_QISAR_TX0_DONE 0x00000001
+#define USB_DMAQ_QISAR_TX_DONE(n) (USB_DMAQ_QISAR_TX0_DONE << n) //0,1
+
+#define USB_DMAQ_QISAR_TXQ_EMPYT_INT 0x00010000
+#define USB_DMAQ_QISAR_RXQ_EMPTY_INT 0x00020000
+
+#define USB_DMAQ_QISAR_RXQ_ERR_INT 0x02000000
+#define USB_DMAQ_QISAR_RXEP_ERR_INT 0x04000000
+#define USB_DMAQ_QISAR_TXQ_ERR_INT 0x08000000
+#define USB_DMAQ_QISAR_TXEP_ERR_INT 0x10000000
+
+
+
+
+#define USB_PSR_CTRL_PSR_START 0x01
+#define USB_PSR_CTRL_PSR_CLEAN 0x02
+#define USB_PSR_CTRL_PSR_INTE 0x04
+
+
+
+#define USB_PSR_CTRL_FLT_OUT 0x100
+#define USB_PSR_CTRL_FLT_IN 0x200
+#define USB_PSR_CTRL_FLT_SOF 0x400
+#define USB_PSR_CTRL_FLT_SETUP 0x800
+
+#define USB_PSR_CTRL_FLT_DATA0 0x1000
+#define USB_PSR_CTRL_FLT_DATA1 0x2000
+#define USB_PSR_CTRL_FLT_DATA2 0x4000
+#define USB_PSR_CTRL_FLT_MDATA 0x8000
+
+
+#define USB_PSR_CTRL_FLT_ACK 0x10000
+#define USB_PSR_CTRL_FLT_NAK 0x20000
+#define USB_PSR_CTRL_FLT_STALL 0x40000
+#define USB_PSR_CTRL_FLT_NYET 0x80000
+
+#define USB_PSR_CTRL_FLT_ERR 0x100000
+#define USB_PSR_CTRL_FLT_SPLIT 0x200000
+#define USB_PSR_CTRL_FLT_PING 0x400000
+
+
+
+#define USB_PSR_CTRL_TR_OUT 0x1000000
+#define USB_PSR_CTRL_TR_IN 0x2000000
+#define USB_PSR_CTRL_TR_SOF 0x4000000
+#define USB_PSR_CTRL_TR_SETUP 0x8000000
+
+
+#define USB_PSR_CTRL_TR_DATA0 0x10000000
+#define USB_PSR_CTRL_TR_DATA1 0x20000000
+#define USB_PSR_CTRL_TR_DATA2 0x40000000
+#define USB_PSR_CTRL_TR_MDATA 0x80000000
+
+
+#define USB_PSR_CTRL_2_TR_ACK 0x01
+#define USB_PSR_CTRL_2_TR_NAK 0x02
+#define USB_PSR_CTRL_2_TR_STALL 0x04
+#define USB_PSR_CTRL_2_TR_NYET 0x08
+
+#define USB_PSR_CTRL_2_TR_ERR 0x10
+#define USB_PSR_CTRL_2_TR_SPLIT 0x20
+#define USB_PSR_CTRL_2_TR_PING 0x40
+
+#define USB_PSR_CTRL_2_TR_FULL 0x100
+#define USB_PSR_CTRL_2_TR_RXERROR 0x200
+
+#define USB_PSR_CTRL_2_PSR_INTR 0x1000000
+
+
+
+
+
+
+
+
+/* USB_POWER */
+#define USB_POWER_ENABLESUSPENDM (0x01) /* RW */
+#define USB_POWER_SUSPENDMODE (0x02) /* P: RO ; H: WO */ /*Read clear by the intr. register*/
+#define USB_POWER_RESUME (0x04) /* RW */
+#define USB_POWER_RESET (0x08) /* P: RO ; H: RW */
+#define USB_POWER_HSMODE (0x10) /* RO */
+#define USB_POWER_HSENAB (0x20) /* RW */
+#define USB_POWER_SOFTCONN (0x40) /* RW */
+#define USB_POWER_ISOUPDATE (0x80) /* RW */
+
+/* USB_INTRTX */
+#define USB_INTRTX_EP0 (0x01) /*RO*/
+#define USB_INTRTX_EP1 (0x02) /*RO*/
+#define USB_INTRTX_EP2 (0x04) /*RO*/
+#define USB_INTRTX_EP3 (0x08) /*RO*/
+#define USB_INTRTX_EP4 (0x10) /*RO*/
+
+/* USB_INTRRX */
+#define USB_INTRRX_EP1 (0x02) /*RO*/
+#define USB_INTRRX_EP2 (0x04) /*RO*/
+#define USB_INTRRX_EP3 (0x08) /*RO*/
+
+/* USB_INTRTXE & USB_INTRRXE */
+#define USB_INTRE_EPEN (0x01) /* RW */
+#define USB_INTRE_EPDIS (0x00) /* RW */
+
+/* USB_INTRUSB */
+#define USB_INTRUSB_SUSPEND (0x01) /*RO*/
+#define USB_INTRUSB_RESUME (0x02) /*RO*/
+#define USB_INTRUSB_RESET (0x04) /*RO*/
+#define USB_INTRUSB_BABBLE (0x04) /*RO*/
+#define USB_INTRUSB_SOF (0x08) /*RO*/
+#define USB_INTRUSB_CONN (0x10) /*RO*/
+#define USB_INTRUSB_DISCON (0x20) /*RO*/
+#define USB_INTRUSB_SESSREQ (0x40) /*RO*/
+#define USB_INTRUSB_VBUSERROR (0x80) /*RO*/
+
+/* USB_INTRUSBE */
+#define USB_INTRUSBE_SUSPEND (0x01) /*RW*/
+#define USB_INTRUSBE_RESUME (0x02) /*RW*/
+#define USB_INTRUSBE_RESET (0x04) /*RW*/
+#define USB_INTRUSBE_BABBLE (0x04) /*RW*/
+#define USB_INTRUSBE_SOF (0x08) /*RW*/
+#define USB_INTRUSBE_CONN (0x10) /*RW*/
+#define USB_INTRUSBE_DISCON (0x20) /*RW*/
+#define USB_INTRUSBE_SESSREQ (0x40) /*RW*/
+#define USB_INTRUSBE_VBUSERROR (0x80) /*RW*/
+
+/* USB_TESTMODE */
+#define USB_TESTMODE_TESTSE0NAK (0x01) /* RW */
+#define USB_TESTMODE_TESTJ (0x02) /* RW */
+#define USB_TESTMODE_TESTK (0x04) /* RW */
+#define USB_TESTMODE_TESTPACKET (0x08) /* RW */
+#define USB_TESTMODE_FORCEHS (0x10) /* RW */
+#define USB_TESTMODE_FORCEFS (0x20) /* RW */
+#define USB_TESTMODE_FIFOACCESS (0x40) /* WO, AC */
+#define USB_TESTMODE_FORCEHOST (0x80) /* RW */
+
+/* USB_DEVCTL */
+#define USB_DEVCTL_SESSION (0x01) /* RW */
+#define USB_DEVCTL_HOSTREQ (0x02) /* RW */
+#define USB_DEVCTL_HOSTMODE (0x04) /* RO */
+#define USB_DEVCTL_VBUS (0x18) /* RO */
+#define USB_DEVCTL_LSDEV (0x20) /* RO */
+#define USB_DEVCTL_FSDEV (0x40) /* RO */
+#define USB_DEVCTL_BDEVICE (0x80) /* RO */
+
+#define USB_DEVCTL_ABOVE_VBUS_VALID (0x18)
+#define USB_DEVCTL_ABOVE_A_VALID (0x10)
+#define USB_DEVCTL_ABOVE_SESSION_END (0x01)
+#define USB_DEVCTL_BELOW_SESSION_END (0x00)
+
+/* USB_CSR0 */
+#define USB_CSR0_RXPKTRDY (0x0001) /* RO */
+#define USB_CSR0_TXPKTRDY (0x0002) /* RW, AC */
+#define USB_CSR0_SENTSTALL (0x0004) /* RC */
+#define USB_CSR0_DATAEND (0x0008) /* WO, AC */
+#define USB_CSR0_SETUPEND (0x0010) /* RO */
+#define USB_CSR0_SENDSTALL (0x0020) /* WO, AC */
+#define USB_CSR0_SERVICEDRXPKTRDY (0x0040) /* WO, AC */
+#define USB_CSR0_SERVICEDSETUPEND (0x0080) /* WO, AC */
+#define USB_CSR0_FLUSHFIFO (0x0100) /* WO, AC */
+/* in Host mode */
+#define USB_CSR0_RXSTALL (0x0004)
+#define USB_CSR0_SETUPPKT (0x0008)
+#define USB_CSR0_ERROR (0x0010)
+#define USB_CSR0_REQPKT (0x0020)
+#define USB_CSR0_STATUSPKT (0x0040)
+#define USB_CSR0_NAKTIMEOUT (0x0080)
+#define USB_CSR0_FLUSHFIFO (0x0100)
+#define USB_CSR0_DISPING (0x0800)
+
+/* USB_TXMAXP */
+#define USB_TXMAXP_MAXPAYLOAD_MASK (0x07FF)
+#define USB_TXMAXP_HIGHSPEED_MASK (0xF800)
+
+/* USB_TXCSR */
+#define USB_TXCSR_TXPKTRDY (0x0001) /* RW */
+#define USB_TXCSR_FIFONOTEMPTY (0x0002) /* RO */
+#define USB_TXCSR_UNDERRUN (0x0004) /* RW */
+#define USB_TXCSR_FLUSHFIFO (0x0008) /* WO */
+#define USB_TXCSR_SENDSTALL (0x0010) /* RW */
+#define USB_TXCSR_SENTSTALL (0x0020) /* RC */
+#define USB_TXCSR_CLRDATATOG (0x0040) /* WO */
+#define USB_TXCSR_INCOMPTX (0x0080) /* RC */
+#define USB_TXCSR_SETTXPKTRDY_TWICE (0x0100) /* RC */
+#define USB_TXCSR_DMAREQMODE (0x0400) /* RW */
+#define USB_TXCSR_FRCDATATOG (0x0800) /* RW */
+#define USB_TXCSR_DMAREQENAB (0x1000) /* RW */
+#define USB_TXCSR_ISO (0x4000) /* RW */
+#define USB_TXCSR_AUTOSET (0x8000) /* RW */
+/* in Host mode */
+#define USB_TXCSR_ERROR (0x0004)
+#define USB_TXCSR_RXSTALL (0x0020)
+#define USB_TXCSR_NAKTIMEOUT (0x0080)
+
+/* USB_RXMAXP */
+#define USB_RXMAXP_MAXPAYLOAD_MASK (0x07FF)
+#define USB_RXMAXP_HIGHSPEED_MASK (0xF800)
+
+/* USB_RXCSR */
+#define USB_RXCSR_RXPKTRDY (0x0001) /* RC */
+#define USB_RXCSR_FIFOFULL (0x0002) /* RO, AC */
+#define USB_RXCSR_OVERRUN (0x0004) /* RC */
+#define USB_RXCSR_DATAERROR (0x0008) /* RO */
+#define USB_RXCSR_FLUSHFIFO (0x0010) /* WO, AC */
+#define USB_RXCSR_SENDSTALL (0x0020) /* RW */
+#define USB_RXCSR_SENTSTALL (0x0040) /* RC */
+#define USB_RXCSR_CLRDATATOG (0x0080) /* WO */
+#define USB_RXCSR_INCOMPRX (0x0100) /* RC */
+#define USB_RXCSR_KEEPERRCTATUS (0x0200) /* RC */
+#define USB_RXCSR_DMAREQMODE (0x0800) /* RW */
+#define USB_RXCSR_DISNYET (0x1000) /* RW */
+#define USB_RXCSR_PIDERROR (0x1000) /* RO */
+#define USB_RXCSR_DMAREQENAB (0x2000) /* RW */
+#define USB_RXCSR_ISO (0x4000) /* RW */
+#define USB_RXCSR_AUTOCLEAR (0x8000) /* RW */
+/* in Host mode */
+#define USB_RXCSR_ERROR (0x0004)
+#define USB_RXCSR_NAKTIMEOUT (0x0008)
+#define USB_RXCSR_REQPKT (0x0020)
+#define USB_RXCSR_RXSTALL (0x0040)
+#define USB_RXCSR_SETPEQPKT_TWICE (0x0400)
+#define USB_RXCSR_AUTOREQ (0x4000)
+
+/* USB_TXTYPE */
+#define USB_TXTYPE_EPNUM_MASK (0x0f)
+#define USB_TXTYPE_ISO (0x10)
+#define USB_TXTYPE_BULK (0x20)
+#define USB_TXTYPE_INTR (0x30)
+#define USB_TXTYPE_PROTOCOL_MASK (0x30)
+
+/* USB_RXTYPE */
+#define USB_RXTYPE_EPNUM_MASK (0x0f)
+#define USB_RXTYPE_ISO (0x10)
+#define USB_RXTYPE_BULK (0x20)
+#define USB_RXTYPE_INTR (0x30)
+#define USB_RXTYPE_PROTOCOL_MASK (0x30)
+
+/* USB_PWRUPCNT */
+#define USB_PWRUPCNT_MASK (0x0f)
+
+/* USB_FIFOSZ */
+#define USB_FIFOSZ_SIZE_MASK (0x0F)
+#define USB_FIFOSZ_DPB (0x10)
+#define USB_FIFOSZ_SIZE_8 (0x00)
+#define USB_FIFOSZ_SIZE_16 (0x01)
+#define USB_FIFOSZ_SIZE_32 (0x02)
+#define USB_FIFOSZ_SIZE_64 (0x03)
+#define USB_FIFOSZ_SIZE_128 (0x04)
+#define USB_FIFOSZ_SIZE_256 (0x05)
+#define USB_FIFOSZ_SIZE_512 (0x06)
+#define USB_FIFOSZ_SIZE_1024 (0x07)
+#define USB_FIFOSZ_SIZE_2048 (0x08)
+#define USB_FIFOSZ_SIZE_4096 (0x09)
+
+/* USB_FIFOADD */
+#define USB_FIFOADD_MASK (0x1FFF)
+
+/* USB_RXFIFOADD */
+#define USB_RXFIFOADD_DATAERRINTREN (0x8000)
+#define USB_RXFIFOADD_OVERRUNINTREN (0x4000)
+
+/* USB_FIFO2ADD */
+#define USB_FIFO2ADD_MASK (0x1FFF)
+#define USB_FIFO2ADD_EN (0x8000)
+
+/* USB_BUSPERF3 */
+#define USB_BUSPERF3_DISUSBRESET (0x0001)
+#define USB_BUSPERF3_SWRST (0x0002)
+
+
+
+/* USB_RSTINFO */
+#define USB_RSTINFO_WTFSSE0 (0x00F0)
+#define USB_RSTINFO_WTCHRP (0x000F)
+
+
+
+/* USB_L1INTS */
+#define USB_L1INTS_TX_INT_STATUS (0x0001)
+#define USB_L1INTS_RX_INT_STATUS (0x0002)
+#define USB_L1INTS_USBCOM_INT_STATUS (0x0004)
+#define USB_L1INTS_DMA_INT_STATUS (0x0008)
+#define USB_L1INTS_PSR_INT_STATUS (0x0010)
+#define USB_L1INTS_QINT_STATUS (0x0020)
+#define USB_L1INTS_QHIF_INT_STATUS (0x0040)
+#define USB_L1INTS_DPDM_INT_STATUS (0x0080)
+#define USB_L1INTS_VBUSVALID_INT_STATUS (0x0100)
+#define USB_L1INTS_IDDIG_INT_STATUS (0x0200)
+#define USB_L1INTS_DRVVBUS_INT_STATUS (0x0400)
+#define USB_L1INTS_POWERDOWN_INT_STATUS (0x0800)
+
+
+/* USB_L1INTM */
+#define USB_L1INTM_TX_INT_UNMASK (0x0001)
+#define USB_L1INTM_RX_INT_UNMASK (0x0002)
+#define USB_L1INTM_USBCOM_INT_UNMASK (0x0004)
+#define USB_L1INTM_DMA_INT_UNMASK (0x0008)
+#define USB_L1INTM_PSR_INT_UNMASK (0x0010)
+#define USB_L1INTM_QINT_UNMASK (0x0020)
+#define USB_L1INTM_QHIF_INT_UNMASK (0x0040)
+#define USB_L1INTM_DPDM_INT_UNMASK (0x0080)
+#define USB_L1INTM_VBUSVALID_INT_UNMASK (0x0100)
+#define USB_L1INTM_IDDIG_INT_UNMASK (0x0200)
+#define USB_L1INTM_DRVVBUS_INT_UNMASK (0x0400)
+#define USB_L1INTM_POWERDOWN_INT_UNMASK (0x0800)
+
+
+/* USB_L1INTP */
+#define USB_L1INTP_VBUSVALID_INT_POL (0x0100)
+#define USB_L1INTP_IDDIG_INT_POL (0x0200)
+#define USB_L1INTP_DRVVBUS_INT_POL (0x0400)
+#define USB_L1INTP_POWERDOWN_INT_POL (0x0800)
+
+
+/* USB_L1INTC */
+#define USB_L1INTC_USB_INT_SYNC (0x0001)
+
+
+
+
+//#define USB_DMA_LIMITER_MASK 0xFFFF00FF
+
+
+
+/* USB_DMACNTL */
+#define USB_DMACNTL_DMAEN (0x0001)
+#define USB_DMACNTL_DMADIR (0x0002)
+#define USB_DMACNTL_DMAMODE (0x0004)
+#define USB_DMACNTL_INTEN (0x0008)
+#define USB_DMACNTL_EP_MASK (0x00F0)
+#define USB_DMACNTL_BUSERR (0x0100)
+//#define USB_DMACNTL_BURSTMODE_MASK (0x0600)
+#define USB_DMACNTL_BURSTMODE_MASK (0x0000)
+#define USB_DMACNTL_DMACHEN (0x0800)
+
+
+/* USB_DMA_TIMER */
+#define USB_DMA_TIMER_ENTIMER (0x0080)
+#define USB_DMA_TIMER_TIMEOUT_MASK (0x007F)
+#define USB_DMA_TIMER_TIMEOUT_STATUS (0x0100) /* W1C */
+
+
+#define USB_DMACNTL_DMAEN_ACTIVE (0x8000)
+#define USB_DMACNTL_DMAEN_STOP (0x0004)
+#define USB_DMACNTL_DMAEN_RESUME (0x0002)
+#define USB_DMACNTL_DMAEN_START (0x0001)
+
+
+
+#define USB_DBG_PRB_OPSTATE_MASK (0x0000003F)
+#define USB_DBG_PRB_LINESTATE_MASK (0x000000C0)
+
+//========================definition of global value===================//
+/* descriptor setting limitation */
+
+
+#define USB_FIFO_START_ADDRESS 64
+
+#define USB_BULK_FIFO_UNIT_SIZE 512
+
+#ifdef __ISO_HB__
+#define USB_ISO_FIFO_UNIT_SIZE 3072
+#else
+#define USB_ISO_FIFO_UNIT_SIZE 1024
+#endif
+
+#ifdef __INTR_HB__
+#define USB_INTR_FIFO_UNIT_SIZE 3072
+#else
+#define USB_INTR_FIFO_UNIT_SIZE 32
+#endif
+
+
+//========================definition of PHY===================//
+
+#if (defined(DRV_USB_PHY_U40_IP)) //MT6575
+
+#ifdef __USB_HS_SLEW_RATE_CAL__
+#define USB_HS_SLEW_RATE_CAL_TIME_WINDOW 0x400
+#define USB_HS_SLEW_RATE_CAL_A 28
+#define USB_HS_SLEW_RATE_CAL_FRA (1000)
+
+#define USB_FMCR0 (USBSIF_base+0xF00) /* RW */
+#define USB_FMCR1 (USBSIF_base+0xF04) /* RW */
+#define USB_FMCR2 (USBSIF_base+0xF08) /* RW */
+#define USB_FMMONR0 (USBSIF_base+0xF0C) /* RW */
+#define USB_FMMONR1 (USBSIF_base+0xF10) /* RW */
+#endif //USB_HS_SLEW_RATE_CAL
+
+#define USB_U2PHYAC0 (USBSIF_base+0x800) //USB2.0 PHYA Common Registers
+#define USB_U2PHYAC1 (USBSIF_base+0x804) //USB2.0 PHYA Common Registers
+#define USB_U2PHYAC2 (USBSIF_base+0x808) //USB2.0 PHYA Common Registers
+#define USB_U2PHYACR0 (USBSIF_base+0x810) //USB2.0 PHYA Control Registers
+#define USB_U2PHYACR1 (USBSIF_base+0x814) //USB2.0 PHYA Control Registers
+#define USB_U2PHYACR2 (USBSIF_base+0x818) //USB2.0 PHYA Control Registers
+#define USB_U2PHYACR3 (USBSIF_base+0x81C) //USB2.0 PHYA Control Registers
+#define USB_U2PHYACR4 (USBSIF_base+0x820) //USB2.0 PHYA Control Registers
+#define USB_U2PHYDCR0 (USBSIF_base+0x860) //USB2.0 PHYD Control Registers
+#define USB_U2PHYDCR1 (USBSIF_base+0x864) //USB2.0 PHYD Control Registers
+#define USB_U2PHYDTM0 (USBSIF_base+0x868) //USB2.0 PHYD TestMode Registers
+#define USB_U2PHYDTM1 (USBSIF_base+0x86C) //USB2.0 PHYD TestMode Registers
+#define USB_U2PHYDMON0 (USBSIF_base+0x870) //USB2.0 PHYD Monitor Registers
+#define USB_U2PHYDMON1 (USBSIF_base+0x874) //USB2.0 PHYD Monitor Registers
+#define USB_U2PHYDMON2 (USBSIF_base+0x878) //USB2.0 PHYD Monitor Registers
+#define USB_U1PHYCR0 (USBSIF_base+0x8C0) //USB1.1 PHY Control Registers
+#define USB_U1PHYCR1 (USBSIF_base+0x8C4) //USB1.1 PHY Control Registers
+#define USB_U1PHYCR2 (USBSIF_base+0x8C8) //USB1.1 PHY Control Registers
+#define USB_REGFPPC (USBSIF_base+0x8E0) //RegFile Per-Page Common Registers
+#define USB_VERSIONC (USBSIF_base+0x8F0) //Version Code
+#define USB_REGFCOM (USBSIF_base+0x8FC) //RegFile Common Registers
+
+#define USB_FMMONR1 (USBSIF_base+0xF10) //
+
+
+#define USB_U2PHYDTM0_force_uart_en (1<<26)
+#define USB_U2PHYDTM0_force_suspendm (1<<18)
+#define USB_U2PHYDTM0_RG_SUSPENDM (1<<3)
+#define USB_U2PHYDTM1_RG_UART_EN (1<<16)
+#define USB_U2PHYAC0_RG_USB20_USBPLL_FBDIV_6_0_CLR (0x7F<<16) //[6:0]
+#define USB_U2PHYAC0_RG_USB20_USBPLL_FBDIV_6_0 (9<<16) //[6:0]
+#define USB_U2PHYACR2_RG_USB20_OTG_VBUSCMP_EN (1<<27)
+#define USB_U2PHYACR3_RG_USB20_PHY_REV_7 (1<<7)
+#define USB_U2PHYACR4_RG_USB20_DP_100K_EN (1<<16)
+#define USB_U2PHYACR4_RG_USB20_DM_100K_EN (1<<17)
+#define USB_U2PHYDTM0_RG_DPPULLDOWN (1<<6)
+#define USB_U2PHYDTM0_RG_DMPULLDOWN (1<<7)
+#define USB_U2PHYDTM0_RG_XCVRSEL_1_0_CLR (0x3<<4) //[1:0]
+#define USB_U2PHYDTM0_RG_XCVRSEL_1_0 (0x1<<4) //[1:0]
+#define USB_U2PHYDTM0_RG_DATAIN_3_0_CLR (0xF<<10) //[3:0]
+#define USB_U2PHYDTM0_force_dp_pulldown (1<<20)
+#define USB_U2PHYDTM0_force_dm_pulldown (1<<21)
+#define USB_U2PHYDTM0_force_termsel (1<<17)
+#define USB_U2PHYDTM0_force_xcvrsel (1<<19)
+#define USB_U2PHYDTM0_force_datain (1<<23)
+#define USB_U2PHYDTM0_RG_TERMSEL (1<<2)
+#define USB_U2PHYDCR1_RG_PLL_STABL (1<<19)
+#define USB_U2PHYDMON1_USB20_LINE_STATE_DP (1<<22)
+#define USB_U2PHYDMON1_USB20_LINE_STATE_DM (1<<23)
+#define USB_U2PHYAC0_RG_USB20_INTR_EN (1<<14)
+
+#define USB_U2PHYACR0_RG_USB20_HSTX_SRCAL_EN (1<<23)
+#define USB_FMMONR1_RG_FRCK_EN (1<<8)
+#define USB_U2PHYACR0_RG_USB20_HSTX_SRCTRL_CLR (0x7<<16)
+
+
+#elif (defined(DRV_USB_PHY_M60_IP))
+
+#ifdef __USB_HS_SLEW_RATE_CAL__
+#define USB_HS_SLEW_RATE_CAL_TIME_WINDOW 0x400
+#define USB_HS_SLEW_RATE_CAL_A 28
+#define USB_HS_SLEW_RATE_CAL_FRA (1000)
+#define USB_FMMONR1_RG_FRCK_EN (1<<8)
+
+#define USB_FMCR0 (USBSIF_base+0xF00) /* RW */
+#define USB_FMCR1 (USBSIF_base+0xF04) /* RW */
+#define USB_FMCR2 (USBSIF_base+0xF08) /* RW */
+#define USB_FMMONR0 (USBSIF_base+0xF0C) /* RW */
+#define USB_FMMONR1 (USBSIF_base+0xF10) /* RW */
+#endif //USB_HS_SLEW_RATE_CAL
+
+#define USB_U2PHYAC0 (USBSIF_base+0x800) //USB2.0 PHYA Common Registers
+#define USB_U2PHYAC1 (USBSIF_base+0x804) //USB2.0 PHYA Common Registers
+#define USB_U2PHYAC2 (USBSIF_base+0x808) //USB2.0 PHYA Common Registers
+#define USB_U2PHYACR0 (USBSIF_base+0x810) //USB2.0 PHYA Control Registers
+#define USB_U2PHYACR1 (USBSIF_base+0x814) //USB2.0 PHYA Control Registers
+#define USB_U2PHYACR2 (USBSIF_base+0x818) //USB2.0 PHYA Control Registers
+#define USB_U2PHYACR3 (USBSIF_base+0x81C) //USB2.0 PHYA Control Registers
+#define USB_U2PHYACR4 (USBSIF_base+0x820) //USB2.0 PHYA Control Registers
+#define USB_U2PHYDCR0 (USBSIF_base+0x860) //USB2.0 PHYD Control Registers
+#define USB_U2PHYDCR1 (USBSIF_base+0x864) //USB2.0 PHYD Control Registers
+#define USB_U2PHYDTM0 (USBSIF_base+0x868) //USB2.0 PHYD TestMode Registers
+#define USB_U2PHYDTM1 (USBSIF_base+0x86C) //USB2.0 PHYD TestMode Registers
+#define USB_U2PHYDMON0 (USBSIF_base+0x870) //USB2.0 PHYD Monitor Registers
+#define USB_U2PHYDMON1 (USBSIF_base+0x874) //USB2.0 PHYD Monitor Registers
+#define USB_U2PHYDMON2 (USBSIF_base+0x878) //USB2.0 PHYD Monitor Registers
+#define USB_U1PHYCR0 (USBSIF_base+0x8C0) //USB1.1 PHY Control Registers
+#define USB_U1PHYCR1 (USBSIF_base+0x8C4) //USB1.1 PHY Control Registers
+#define USB_U1PHYCR2 (USBSIF_base+0x8C8) //USB1.1 PHY Control Registers
+#define USB_REGFPPC (USBSIF_base+0x8E0) //RegFile Per-Page Common Registers
+#define USB_VERSIONC (USBSIF_base+0x8F0) //Version Code
+#define USB_REGFCOM (USBSIF_base+0x8FC) //RegFile Common Registers
+
+#define USB_U2PHYACR0_RG_USB20_HSTX_SRCTRL_CLR (0x7<<16)
+
+#define USB_U2PHYACR0_RG_USB20_HSTX_SRCTRL (0x5<<16)
+#define USB_U2PHYACR0_RG_USB20_HSTX_SRCAL_EN (0x1<<23)
+
+#define USB_U2PHYACR1_RG_USB20_DM_ABIST_SOURCE_EN (0x1<<15)
+
+#define USB_U2PHYDTM0_force_uart_en (1<<26)
+#define USB_U2PHYDTM0_force_suspendm (1<<18)
+#define USB_U2PHYDTM0_RG_SUSPENDM (1<<3)
+#define USB_U2PHYDTM1_RG_UART_EN (1<<16)
+#define USB_U2PHYAC0_RG_USB20_USBPLL_FBDIV_6_0_CLR (0x7F<<16) //[6:0]
+#define USB_U2PHYAC0_RG_USB20_USBPLL_FBDIV_6_0 (9<<16) //[6:0]
+#define USB_U2PHYACR2_RG_USB20_OTG_VBUSCMP_EN (1<<27)
+#define USB_U2PHYACR3_RG_USB20_PHY_REV_7 (1<<7)
+#define USB_U2PHYACR3_RG_USB20_HS_TERM_EN_MODE (0x2<<13)
+#define USB_U2PHYACR3_RG_USB20_HS_TERM_EN_MODE_CLR (0x3<<13)
+#define USB_U2PHYACR4_RG_USB20_DP_100K_EN (1<<16)
+#define USB_U2PHYACR4_RG_USB20_DM_100K_EN (1<<17)
+#define USB_U2PHYDTM0_RG_DPPULLDOWN (1<<6)
+#define USB_U2PHYDTM0_RG_DMPULLDOWN (1<<7)
+#define USB_U2PHYDTM0_RG_XCVRSEL_1_0_CLR (0x3<<4) //[1:0]
+#define USB_U2PHYDTM0_RG_XCVRSEL_1_0 (0x1<<4) //[1:0]
+#define USB_U2PHYDTM0_RG_DATAIN_3_0_CLR (0xF<<10) //[3:0]
+#define USB_U2PHYDTM0_force_dp_pulldown (1<<20)
+#define USB_U2PHYDTM0_force_dm_pulldown (1<<21)
+#define USB_U2PHYDTM0_force_termsel (1<<17)
+#define USB_U2PHYDTM0_force_xcvrsel (1<<19)
+#define USB_U2PHYDTM0_force_datain (1<<23)
+#define USB_U2PHYDTM0_RG_TERMSEL (1<<2)
+#define USB_U2PHYDCR1_RG_PLL_STABL (1<<19)
+#define USB_U2PHYDMON1_USB20_LINE_STATE_DP (1<<22)
+#define USB_U2PHYDMON1_USB20_LINE_STATE_DM (1<<23)
+#define USB_U2PHYAC0_RG_USB20_INTR_EN (1<<14)
+
+#endif
+
+
+
+#elif (defined(DRV_USB_IP_V3))
+
+//=============Controller===================//
+#define USB_FADDR_HCD(_baseaddr) (_baseaddr+0x00) /* RW */
+#define USB_POWER_HCD(_baseaddr) (_baseaddr+0x01)
+#define USB_INTRTX_HCD(_baseaddr) (_baseaddr+0x02) /* 16-bit, status, read only */
+#define USB_INTRRX_HCD(_baseaddr) (_baseaddr+0x04) /* 16-bit, status, read only */
+#define USB_INTRTXE_HCD(_baseaddr) (_baseaddr+0x06) /* 16-bit, RW */
+#define USB_INTRRXE_HCD(_baseaddr) (_baseaddr+0x08) /* 16-bit, RW */
+#define USB_INTRUSB_HCD(_baseaddr) (_baseaddr+0x0A) /* 8-bit, status, read only*/
+#define USB_INTRUSBE_HCD(_baseaddr) (_baseaddr+0x0B) /* 8-bit, RW */
+#define USB_FRAME_HCD(_baseaddr) (_baseaddr+0x0C) /* 16-bit, read only */ /*Max Frame length = 11 bits*/
+#define USB_INDEX_HCD(_baseaddr) (_baseaddr+0x0E) /* RW, 4bit available*/
+#define USB_TESTMODE_HCD(_baseaddr) (_baseaddr+0x0F) /* RW, 8-bit */
+
+#define USB_CSR0_HCD(_baseaddr) (_baseaddr+0x12) /* 16-bit */
+#define USB_COUNT0_HCD(_baseaddr) (_baseaddr+0x18) /* RO, EP0 only*/
+#define USB_NAKLIMIT0_HCD(_baseaddr) (_baseaddr+0x1B) /* RW, host mode only*/
+#define USB_TXMAXP_HCD(_baseaddr) (_baseaddr+0x10) /* 16-bit, RW*/
+#define USB_TXCSR_HCD(_baseaddr) (_baseaddr+0x12)
+#define USB_RXMAXP_HCD(_baseaddr) (_baseaddr+0x14) /* 16-bit, RW*/
+#define USB_RXCSR_HCD(_baseaddr) (_baseaddr+0x16)
+#define USB_RXCOUNT_HCD(_baseaddr) (_baseaddr+0x18) /* RO, 14bits */
+#define USB_TXTYPE_HCD(_baseaddr) (_baseaddr+0x1A) /* RW, host mode only */
+#define USB_TXINTERVAL_HCD(_baseaddr) (_baseaddr+0x1B) /* RW, host mode only */
+#define USB_RXTYPE_HCD(_baseaddr) (_baseaddr+0x1C) /* RW, host mode only */
+#define USB_RXINTERVAL_HCD(_baseaddr) (_baseaddr+0x1D) /* RW, host mode only */
+
+#define USB_EP0_HCD(_baseaddr) (_baseaddr+0x20) /* 4 byte as 1 queue */
+
+#define USB_DEVCTL_HCD(_baseaddr) (_baseaddr+0x60) /* 8-bit */
+#define USB_PWRUPCNT_HCD(_baseaddr) (_baseaddr+0x61) /* RW */
+#define USB_TXFIFOSZ_HCD(_baseaddr) (_baseaddr+0x62) /* RW */
+#define USB_RXFIFOSZ_HCD(_baseaddr) (_baseaddr+0x63) /* RW */
+#define USB_TXFIFOADD_HCD(_baseaddr) (_baseaddr+0x64) /* RW */
+#define USB_RXFIFOADD_HCD(_baseaddr) (_baseaddr+0x66) /* RW */
+#define USB_SWRST_HCD(_baseaddr) (_baseaddr+0x70) /* RW */
+#define USB_OPSTATE_HCD(_baseaddr) (_baseaddr+0x71) /* RW */
+#define USB_VPLEN_HCD(_baseaddr) (_baseaddr+0x7B) /* RW, 8-bits */
+#define USB_RSTINFO_HCD(_baseaddr) (_baseaddr+0x7F) /* RW */
+
+#define USB_EPn_TXCSR_HCD(_baseaddr,_n) (_baseaddr+0x102+(0x10*(_n))) /* R */
+#define USB_EPn_RXCSR_HCD(_baseaddr,_n) (_baseaddr+0x106+(0x10*(_n))) /* R */
+
+#define USB_DMAINTR_HCD(_baseaddr) (_baseaddr+0x200) /* 8-bits, W0C */
+#define USB_DMALIMITER_HCD(_baseaddr,_n) (_baseaddr+0x200+(0x10*(_n))) /* 8-bits, RW */
+#define USB_DMACNTL_HCD(_baseaddr,_n) (_baseaddr+0x1F4+(0x10*(_n))) /* RW, _n = 1~6 */
+#define USB_DMAADDR_HCD(_baseaddr,_n) (_baseaddr+0x1F8+(0x10*(_n))) /* RW, _n = 1~6 */
+#define USB_DMACNT_HCD(_baseaddr,_n) (_baseaddr+0x1FC+(0x10*(_n))) /* RW, _n = 1~6 */
+#define USB_RQPKTCOUNT_HCD(_baseaddr,_n) (_baseaddr+0x300+(0x04*(_n))) /* RW, 16bits, _n = 1~3, host mode RX ep only */
+#define USB_DMA_REALCNT_HCD(_baseaddr,_n) (_baseaddr+0x3F0+(0x10*(_n))) /* RO, _n = 1~6, 32bits */
+#define USB_DMA_TIMER_HCD(_baseaddr,_n) (_baseaddr+0x3F8+(0x10*(_n))) /* RW, _n = 1~6, 16bits */
+
+#define USB_DMAPPCNTL_HCD(_baseaddr,_n) (_baseaddr+0x274+(0x10*(_n))) /* RW, _n = 1~6 */
+#define USB_DMAPPADDR_HCD(_baseaddr,_n) (_baseaddr+0x278+(0x10*(_n))) /* RW, _n = 1~6 */
+#define USB_DMAPPCNT_HCD(_baseaddr,_n) (_baseaddr+0x27C+(0x10*(_n))) /* RW, _n = 1~6 */
+#define USB_DMA_PP_REALCNT_HCD(_baseaddr,_n) (_baseaddr+0x3F4+(0x10*(_n))) /* RO, _n = 1~6, 32bits */
+
+//========================================================
+#define USB_FADDR (USB_base+0x00) /* RW */
+#define USB_POWER (USB_base+0x01)
+#define USB_INTRTX (USB_base+0x02) /* 16-bit, status, read only */
+#define USB_INTRRX (USB_base+0x04) /* 16-bit, status, read only */
+#define USB_INTRTXE (USB_base+0x06) /* 16-bit, RW */
+#define USB_INTRRXE (USB_base+0x08) /* 16-bit, RW */
+#define USB_INTRUSB (USB_base+0x0A) /* 8-bit, status, read only*/
+#define USB_INTRUSBE (USB_base+0x0B) /* 8-bit, RW */
+#define USB_FRAME (USB_base+0x0C) /* 16-bit, read only */ /*Max Frame length = 11 bits*/
+#define USB_INDEX (USB_base+0x0E) /* RW, 4bit available*/
+#define USB_TESTMODE (USB_base+0x0F) /* RW, 8-bit */
+
+#define USB_CSR0 (USB_base+0x12) /* 16-bit */
+#define USB_COUNT0 (USB_base+0x18) /* RO, EP0 only*/
+#define USB_NAKLIMIT0 (USB_base+0x1B) /* RW, host mode only*/
+#define USB_TXMAXP (USB_base+0x10) /* 16-bit, RW*/
+#define USB_TXCSR (USB_base+0x12)
+#define USB_RXMAXP (USB_base+0x14) /* 16-bit, RW*/
+#define USB_RXCSR (USB_base+0x16)
+#define USB_RXCOUNT (USB_base+0x18) /* RO, 14bits */
+#define USB_TXTYPE (USB_base+0x1A) /* RW, host mode only */
+#define USB_TXINTERVAL (USB_base+0x1B) /* RW, host mode only */
+#define USB_RXTYPE (USB_base+0x1C) /* RW, host mode only */
+#define USB_RXINTERVAL (USB_base+0x1D) /* RW, host mode only */
+
+#define USB_EP0 (USB_base+0x20) /* 4 byte as 1 queue */
+
+#define USB_DEVCTL (USB_base+0x60) /* 8-bit */
+#define USB_PWRUPCNT (USB_base+0x61) /* RW */
+#define USB_TXFIFOSZ (USB_base+0x62) /* RW */
+#define USB_RXFIFOSZ (USB_base+0x63) /* RW */
+#define USB_TXFIFOADD (USB_base+0x64) /* RW */
+#define USB_RXFIFOADD (USB_base+0x66) /* RW */
+#define USB_SWRST (USB_base+0x70) /* RW */
+#define USB_OPSTATE (USB_base+0x71) /* RW */
+#define USB_VPLEN (USB_base+0x7B) /* RW, 8-bits */
+#define USB_RSTINFO (USB_base+0x7F) /* RW */
+
+#define USB_DUMMY (USB_base+0xF0) /* RW */
+
+
+#define USB_EPn_TXCSR(_n) (USB_base+0x102+(0x10*(_n))) /* R */
+#define USB_EPn_RXCSR(_n) (USB_base+0x106+(0x10*(_n))) /* R */
+
+#define USB_DMAINTR (USB_base+0x200) /* 8-bits, W0C */
+#define USB_DMALIMITER(_n) (USB_base+0x200+(0x10*(_n))) /* 8-bits, RW */
+#define USB_DMACNTL(_n) (USB_base+0x1F4+(0x10*(_n))) /* RW, _n = 1~6 */
+#define USB_DMAADDR(_n) (USB_base+0x1F8+(0x10*(_n))) /* RW, _n = 1~6 */
+#define USB_DMACNT(_n) (USB_base+0x1FC+(0x10*(_n))) /* RW, _n = 1~6 */
+#define USB_DMAPPCNTL(_n) (USB_base+0x274+(0x10*(_n))) /* RW, _n = 1~6 */
+#define USB_DMAPPADDR(_n) (USB_base+0x278+(0x10*(_n))) /* RW, _n = 1~6 */
+#define USB_DMAPPCNT(_n) (USB_base+0x27C+(0x10*(_n))) /* RW, _n = 1~6 */
+
+#define USB_RQPKTCOUNT(_n) (USB_base+0x300+(0x04*(_n))) /* RW, 16bits, _n = 1~3, host mode RX ep only */
+
+#define USB_DMA_REALCNT(_n) (USB_base+0x3F0+(0x10*(_n))) /* RO, _n = 1~6, 32bits */
+#define USB_DMA_PP_REALCNT(_n) (USB_base+0x3F4+(0x10*(_n))) /* RO, _n = 1~6, 32bits */
+#define USB_DMA_TIMER(_n) (USB_base+0x3F8+(0x10*(_n))) /* RW, _n = 1~6, 16bits */
+//===================Controller variable===========================//
+/* USB_POWER */
+#define USB_POWER_ENABLESUSPENDM (0x01) /* RW */
+#define USB_POWER_SUSPENDMODE (0x02) /* P: RO ; H: WO */ /*Read clear by the intr. register*/
+#define USB_POWER_RESUME (0x04) /* RW */
+#define USB_POWER_RESET (0x08) /* P: RO ; H: RW */
+#define USB_POWER_HSMODE (0x10) /* RO */
+#define USB_POWER_HSENAB (0x20) /* RW */
+#define USB_POWER_SOFTCONN (0x40) /* RW */
+#define USB_POWER_ISOUPDATE (0x80) /* RW */
+
+/* USB_INTRTX */
+#define USB_INTRTX_EP0 (0x01) /*RO*/
+#define USB_INTRTX_EP1 (0x02) /*RO*/
+#define USB_INTRTX_EP2 (0x04) /*RO*/
+#define USB_INTRTX_EP3 (0x08) /*RO*/
+#define USB_INTRTX_EP4 (0x10) /*RO*/
+
+/* USB_INTRRX */
+#define USB_INTRRX_EP1 (0x02) /*RO*/
+#define USB_INTRRX_EP2 (0x04) /*RO*/
+#define USB_INTRRX_EP3 (0x08) /*RO*/
+
+/* USB_INTRTXE & USB_INTRRXE */
+#define USB_INTRE_EPEN (0x01) /* RW */
+#define USB_INTRE_EPDIS (0x00) /* RW */
+
+/* USB_INTRUSB */
+#define USB_INTRUSB_SUSPEND (0x01) /*RO*/
+#define USB_INTRUSB_RESUME (0x02) /*RO*/
+#define USB_INTRUSB_RESET (0x04) /*RO*/
+#define USB_INTRUSB_BABBLE (0x04) /*RO*/
+#define USB_INTRUSB_SOF (0x08) /*RO*/
+#define USB_INTRUSB_CONN (0x10) /*RO*/
+#define USB_INTRUSB_DISCON (0x20) /*RO*/
+#define USB_INTRUSB_SESSREQ (0x40) /*RO*/
+#define USB_INTRUSB_VBUSERROR (0x80) /*RO*/
+
+/* USB_INTRUSBE */
+#define USB_INTRUSBE_SUSPEND (0x01) /*RW*/
+#define USB_INTRUSBE_RESUME (0x02) /*RW*/
+#define USB_INTRUSBE_RESET (0x04) /*RW*/
+#define USB_INTRUSBE_BABBLE (0x04) /*RW*/
+#define USB_INTRUSBE_SOF (0x08) /*RW*/
+#define USB_INTRUSBE_CONN (0x10) /*RW*/
+#define USB_INTRUSBE_DISCON (0x20) /*RW*/
+#define USB_INTRUSBE_SESSREQ (0x40) /*RW*/
+#define USB_INTRUSBE_VBUSERROR (0x80) /*RW*/
+
+/* USB_TESTMODE */
+#define USB_TESTMODE_TESTSE0NAK (0x01) /* RW */
+#define USB_TESTMODE_TESTJ (0x02) /* RW */
+#define USB_TESTMODE_TESTK (0x04) /* RW */
+#define USB_TESTMODE_TESTPACKET (0x08) /* RW */
+#define USB_TESTMODE_FORCEHS (0x10) /* RW */
+#define USB_TESTMODE_FORCEFS (0x20) /* RW */
+#define USB_TESTMODE_FIFOACCESS (0x40) /* WO, AC */
+#define USB_TESTMODE_FORCEHOST (0x80) /* RW */
+
+/* USB_DEVCTL */
+#define USB_DEVCTL_SESSION (0x01) /* RW */
+#define USB_DEVCTL_HOSTREQ (0x02) /* RW */
+#define USB_DEVCTL_HOSTMODE (0x04) /* RO */
+#define USB_DEVCTL_VBUS (0x18) /* RO */
+#define USB_DEVCTL_LSDEV (0x20) /* RO */
+#define USB_DEVCTL_FSDEV (0x40) /* RO */
+#define USB_DEVCTL_BDEVICE (0x80) /* RO */
+
+#define USB_DEVCTL_ABOVE_VBUS_VALID (0x18)
+#define USB_DEVCTL_ABOVE_A_VALID (0x10)
+#define USB_DEVCTL_ABOVE_SESSION_END (0x01)
+#define USB_DEVCTL_BELOW_SESSION_END (0x00)
+
+/* USB_CSR0 */
+#define USB_CSR0_RXPKTRDY (0x0001) /* RO */
+#define USB_CSR0_TXPKTRDY (0x0002) /* RW, AC */
+#define USB_CSR0_SENTSTALL (0x0004) /* RC */
+#define USB_CSR0_DATAEND (0x0008) /* WO, AC */
+#define USB_CSR0_SETUPEND (0x0010) /* RO */
+#define USB_CSR0_SENDSTALL (0x0020) /* WO, AC */
+#define USB_CSR0_SERVICEDRXPKTRDY (0x0040) /* WO, AC */
+#define USB_CSR0_SERVICEDSETUPEND (0x0080) /* WO, AC */
+#define USB_CSR0_FLUSHFIFO (0x0100) /* WO, AC */
+/* in Host mode */
+#define USB_CSR0_RXSTALL (0x0004)
+#define USB_CSR0_SETUPPKT (0x0008)
+#define USB_CSR0_ERROR (0x0010)
+#define USB_CSR0_REQPKT (0x0020)
+#define USB_CSR0_STATUSPKT (0x0040)
+#define USB_CSR0_NAKTIMEOUT (0x0080)
+#define USB_CSR0_FLUSHFIFO (0x0100)
+#define USB_CSR0_DISPING (0x0800)
+
+/* USB_TXMAXP */
+#define USB_TXMAXP_MAXPAYLOAD_MASK (0x07FF)
+#define USB_TXMAXP_HIGHSPEED_MASK (0xF800)
+
+/* USB_TXCSR */
+#define USB_TXCSR_TXPKTRDY (0x0001) /* RW */
+#define USB_TXCSR_FIFONOTEMPTY (0x0002) /* RO */
+#define USB_TXCSR_UNDERRUN (0x0004) /* RW */
+#define USB_TXCSR_FLUSHFIFO (0x0008) /* WO */
+#define USB_TXCSR_SENDSTALL (0x0010) /* RW */
+#define USB_TXCSR_SENTSTALL (0x0020) /* RC */
+#define USB_TXCSR_CLRDATATOG (0x0040) /* WO */
+#define USB_TXCSR_INCOMPTX (0x0080) /* RC */
+#define USB_TXCSR_AUTOSET_SPKT (0x0200) /* RW */
+#define USB_TXCSR_DMAREQMODE (0x0400) /* RW */
+#define USB_TXCSR_FRCDATATOG (0x0800) /* RW */
+#define USB_TXCSR_DMAREQENAB (0x1000) /* RW */
+#define USB_TXCSR_MODE (0x2000) /* RW */
+#define USB_TXCSR_ISO (0x4000) /* RW */
+#define USB_TXCSR_AUTOSET (0x8000) /* RW */
+/* in Host mode */
+#define USB_TXCSR_ERROR (0x0004)
+#define USB_TXCSR_RXSTALL (0x0020)
+#define USB_TXCSR_NAKTIMEOUT (0x0080)
+
+/* USB_RXMAXP */
+#define USB_RXMAXP_MAXPAYLOAD_MASK (0x07FF)
+#define USB_RXMAXP_HIGHSPEED_MASK (0xF800)
+
+/* USB_RXCSR */
+#define USB_RXCSR_RXPKTRDY (0x0001) /* RC */
+#define USB_RXCSR_FIFOFULL (0x0002) /* RO, AC */
+#define USB_RXCSR_OVERRUN (0x0004) /* RC */
+#define USB_RXCSR_DATAERROR (0x0008) /* RO */
+#define USB_RXCSR_FLUSHFIFO (0x0010) /* WO, AC */
+#define USB_RXCSR_SENDSTALL (0x0020) /* RW */
+#define USB_RXCSR_SENTSTALL (0x0040) /* RC */
+#define USB_RXCSR_CLRDATATOG (0x0080) /* WO */
+#define USB_RXCSR_INCOMPRX (0x0100) /* RC */
+#define USB_RXCSR_INCOMPRXINTREN (0x0200) /* RC */
+#define USB_RXCSR_AUTOCLREN_SPKT (0x0400) /* RC */
+#define USB_RXCSR_DMAREQMODE (0x0800) /* RW */
+#define USB_RXCSR_DISNYET (0x1000) /* RW */
+#define USB_RXCSR_PIDERROR (0x1000) /* RO */
+#define USB_RXCSR_DMAREQENAB (0x2000) /* RW */
+#define USB_RXCSR_ISO (0x4000) /* RW */
+#define USB_RXCSR_AUTOCLEAR (0x8000) /* RW */
+/* in Host mode */
+#define USB_RXCSR_ERROR (0x0004)
+#define USB_RXCSR_NAKTIMEOUT (0x0008)
+#define USB_RXCSR_REQPKT (0x0020)
+#define USB_RXCSR_RXSTALL (0x0040)
+#define USB_RXCSR_PIDERROR (0x1000)
+#define USB_RXCSR_AUTOREQ (0x4000)
+
+/* USB_TXTYPE */
+#define USB_TXTYPE_EPNUM_MASK (0x0f)
+#define USB_TXTYPE_ISO (0x10)
+#define USB_TXTYPE_BULK (0x20)
+#define USB_TXTYPE_INTR (0x30)
+#define USB_TXTYPE_PROTOCOL_MASK (0x30)
+
+/* USB_RXTYPE */
+#define USB_RXTYPE_EPNUM_MASK (0x0f)
+#define USB_RXTYPE_ISO (0x10)
+#define USB_RXTYPE_BULK (0x20)
+#define USB_RXTYPE_INTR (0x30)
+#define USB_RXTYPE_PROTOCOL_MASK (0x30)
+
+/* USB_PWRUPCNT */
+#define USB_PWRUPCNT_MASK (0x0f)
+
+/* USB_FIFOSZ */
+#define USB_FIFOSZ_SIZE_MASK (0x0F)
+#define USB_FIFOSZ_DPB (0x10)
+#define USB_FIFOSZ_SIZE_8 (0x00)
+#define USB_FIFOSZ_SIZE_16 (0x01)
+#define USB_FIFOSZ_SIZE_32 (0x02)
+#define USB_FIFOSZ_SIZE_64 (0x03)
+#define USB_FIFOSZ_SIZE_128 (0x04)
+#define USB_FIFOSZ_SIZE_256 (0x05)
+#define USB_FIFOSZ_SIZE_512 (0x06)
+#define USB_FIFOSZ_SIZE_1024 (0x07)
+#define USB_FIFOSZ_SIZE_2048 (0x08)
+#define USB_FIFOSZ_SIZE_4096 (0x09)
+
+/* USB_FIFOADD */
+#define USB_FIFOADD_MASK (0x1FFF)
+
+/* USB_RXFIFOADD */
+#define USB_RXFIFOADD_DATAERRINTREN (0x8000)
+#define USB_RXFIFOADD_OVERRUNINTREN (0x4000)
+
+/* USB_FIFO2ADD */
+#define USB_FIFO2ADD_MASK (0x1FFF)
+#define USB_FIFO2ADD_EN (0x8000)
+
+/* USB_SWRST */
+#define USB_SWRST_DISUSBRESET (0x0001)
+#define USB_SWRST_SWRST (0x0002)
+#define USB_SWRST_FRC_VBUSVALID (0x0004)
+#define USB_SWRST_UNDO_SRPFIX (0x0008)
+#define USB_SWRST_REDUCE_DLY (0x0010)
+
+
+/* USB_RSTINFO */
+#define USB_RSTINFO_WTFSSE0 (0x00F0)
+#define USB_RSTINFO_WTCHRP (0x000F)
+
+/* USB_DMAINTR */
+#define USB_DMA_INTR_MASK 0xFFFFFF00
+#define USB_DMA_LIMITER_MASK 0xFFFF00FF
+#define USB_DMA_PPFINISH_MASK 0x0000FFFF
+
+/* USB_DMAPPINTR */
+#define USB_PPA_FINISH1 (0x01) /*RO*/
+#define USB_PPB_FINISH1 (0x02) /*RO*/
+#define USB_PPA_FINISH2 (0x04) /*RO*/
+#define USB_PPB_FINISH2 (0x08) /*RO*/
+#define USB_PPA_FINISH3 (0x10) /*RO*/
+#define USB_PPB_FINISH3 (0x20) /*RO*/
+#define USB_PPA_FINISH4 (0x40) /*RO*/
+#define USB_PPB_FINISH4 (0x80) /*RO*/
+
+/* USB_DMACNTL */
+#define USB_DMACNTL_DMAEN (0x0001)
+#define USB_DMACNTL_DMADIR (0x0002)
+#define USB_DMACNTL_DMAMODE (0x0004)
+#define USB_DMACNTL_INTEN (0x0008)
+#define USB_DMACNTL_EP_MASK (0x00F0)
+#define USB_DMACNTL_BUSERR (0x0100)
+#define USB_DMACNTL_BURSTMODE_MASK (0x0600)
+#define USB_DMACNTL_PPEN (0x0800)
+#define USB_DMACNTL_PPRST (0x1000)
+#define USB_DMACNTL_ENDMAMODE2 (0x2000)
+
+/* USB_DMAPPCNTL */
+#define USB_DMAPPCNTL_DMAEN (0x0001)
+
+/* USB_DMA_TIMER */
+#define USB_DMA_TIMER_ENTIMER (0x0080)
+#define USB_DMA_TIMER_TIMEOUT_MASK (0x007F)
+#define USB_DMA_TIMER_TIMEOUT_STATUS (0x0100)
+
+//========================definition of global value===================//
+/* descriptor setting limitation */
+
+#define USB_FIFO_START_ADDRESS 64
+
+#define USB_BULK_FIFO_UNIT_SIZE 512
+
+#ifdef __ISO_HB__
+#define USB_ISO_FIFO_UNIT_SIZE 3072
+#else
+#define USB_ISO_FIFO_UNIT_SIZE 1024
+#endif
+
+#ifdef __INTR_HB__
+#define USB_INTR_FIFO_UNIT_SIZE 3072
+#else
+#define USB_INTR_FIFO_UNIT_SIZE 32
+#endif
+
+
+//===================== PHY Version ==========================//
+#if (defined(DRV_USB_PHY_COST_DOWN)) //MT6268 , MT6236 , MT6253
+
+/* USB phy register */
+#define USB_PHYCR1_0 (USB_base+0x600) /* RW */
+#define USB_PHYCR1_1 (USB_base+0x601) /* RW */
+#define USB_PHYCR1_2 (USB_base+0x602) /* RW */
+#define USB_PHYCR1_3 (USB_base+0x603) /* RW */
+
+#define USB_PHYCR2_0 (USB_base+0x604) /* RW */
+#define USB_PHYCR2_1 (USB_base+0x605) /* RW */
+#define USB_PHYCR2_2 (USB_base+0x606) /* RW */
+#define USB_PHYCR2_3 (USB_base+0x607) /* RW */
+
+#define USB_PHYCR3_0 (USB_base+0x608) /* RW */
+#define USB_PHYCR3_1 (USB_base+0x609) /* RW */
+#define USB_PHYCR3_2 (USB_base+0x60A) /* RW */
+#define USB_PHYCR3_3 (USB_base+0x60B) /* RW */
+
+#define USB_PHYCR4_0 (USB_base+0x60C) /* RW */
+#define USB_PHYCR4_1 (USB_base+0x60D) /* RW */
+#define USB_PHYCR4_2 (USB_base+0x60E) /* RW */
+#define USB_PHYCR4_3 (USB_base+0x60F) /* RW */
+
+#define USB_PHYCR5_0 (USB_base+0x610) /* RW */
+#define USB_PHYCR5_1 (USB_base+0x611) /* RW */
+#define USB_PHYCR5_2 (USB_base+0x612) /* RW */
+#define USB_PHYCR5_3 (USB_base+0x613) /* RW */
+
+#define USB_PHYIR1_0 (USB_base+0x614) /* RW */
+#define USB_PHYIR1_1 (USB_base+0x615) /* RW */
+#define USB_PHYIR1_2 (USB_base+0x616) /* RW */
+#define USB_PHYIR1_3 (USB_base+0x617) /* RW */
+
+#define USB_PHYIR2_0 (USB_base+0x618) /* RW */
+#define USB_PHYIR2_1 (USB_base+0x619) /* RW */
+#define USB_PHYIR2_2 (USB_base+0x61A) /* RW */
+#define USB_PHYIR2_3 (USB_base+0x61B) /* RW */
+
+#define USB_PHYIR3_0 (USB_base+0x61C) /* RW */
+#define USB_PHYIR3_1 (USB_base+0x61D) /* RW */
+#define USB_PHYIR3_2 (USB_base+0x61E) /* RW */
+//#define USB_PHYIR3_3 (USB_base+0x61F) /* RW */
+
+#define USB_PHYIR4_0 (USB_base+0x620) /* RW */
+#define USB_PHYIR4_1 (USB_base+0x621) /* RW */
+#define USB_PHYIR4_2 (USB_base+0x622) /* RW */
+#define USB_PHYIR4_3 (USB_base+0x623) /* RW */
+
+#define USB_PHYIR5_0 (USB_base+0x624) /* RW */
+#define USB_PHYIR5_1 (USB_base+0x625) /* RW */
+#define USB_PHYIR5_2 (USB_base+0x626) /* RW */
+#define USB_PHYIR5_3 (USB_base+0x627) /* RW */
+
+#define USB_PHYIR6_0 (USB_base+0x628) /* RW */
+#define USB_PHYIR6_1 (USB_base+0x629) /* RW */
+//#define USB_PHYIR6_2 (USB_base+0x62A) /* RW */
+//#define USB_PHYIR6_3 (USB_base+0x62B) /* RW */
+
+
+
+/* USB PHY variable*/
+
+/* USB_PHY ALL*/
+#define USB_PHY_CLEAR_MASK (0x00)
+
+/* USB_PHYCR1_0 */
+#define USB_PHYCR1_0_BGR_BGR_EN (0x01)
+#define USB_PHYCR1_0_BGR_I_SRC_EN (0x02)
+#define USB_PHYCR1_0_BGR_CHIP_EN (0x04)
+#define USB_PHYCR1_0_IADJ_MASK (0x70)
+#define USB_PHYCR1_0_IADJ_MASK2 (0x40)
+#define USB_PHYCR1_0_IADJ_MASK3 (0x50)
+#define USB_PHYCR1_0_IADJ_RESISTER_SET (0x60)
+/* USB_PHYCR1_1 */
+/* USB_PHYCR1_2 */
+#define USB_PHYCR1_2_RG_PLL_DIV (0x0A)
+#define USB_PHYCR1_2_RG_PLL_DIV2 (0x08)
+#define USB_PHYCR1_2_RG_PLL_DIV3 (0x03)
+/* USB_PHYCR1_3 */
+/* USB_PHYCR2_0 */
+/* USB_PHYCR2_1 */
+/* USB_PHYCR2_2 */
+#define USB_PHYCR2_2_HS_TRIM_TH (0x08)
+#define USB_PHYCR2_2_HSDISC_DEGL (0x80)
+#define USB_PHYCR2_2_HS_DISC_TH (0x40)
+/* USB_PHYCR2_3 */
+#define USB_PHYCR2_3_PLL_EN (0x02)
+#define USB_PHYCR2_3_HS_TERMC (0x08)
+/* USB_PHYCR3_0 */
+#define USB_PHYCR3_0_CDR_FILT (0x02)
+#define USB_PHYCR3_0_EARLY_HSTX_I (0x40)
+#define USB_PHYCR3_0_HS_TX_ANA_SER_EN (0x80)
+/* USB_PHYCR3_1 */
+/* USB_PHYCR3_2 */
+#define USB_PHYCR3_2_FORCE_DATA_IN (0x02)
+#define USB_PHYCR3_2_FORCE_TX_VALID (0x01)
+#define USB_PHYCR3_2_FORCE_DP_PULLDOWN (0x04)
+#define USB_PHYCR3_2_FORCE_DM_PULLDOWN (0x08)
+#define USB_PHYCR3_2_FORCE_DP_DM_PULLDOWN (0x0C)
+#define USB_PHYCR3_2_FORCE_DRV_VBUS (0x10)
+/* USB_PHYCR3_3 */
+#define USB_PHYCR3_3_FORCE_OP_MODE (0x01)
+#define USB_PHYCR3_3_FORCE_TERM_SELECT (0x02)
+#define USB_PHYCR3_3_FORCE_SUSPENDM (0x04)
+#define USB_PHYCR3_3_FORCE_XCVR_SELECT (0x08)
+#define USB_PHYCR3_3_FORCE_DP_HIGH (0x0B)
+#define USB_PHYCR3_3_FORCE_IDPULLUP (0x20)
+#define USB_PHYCR3_3_UTMI_MUXSEL (0x10)
+/* USB_PHYCR4_0 */
+#define USB_PHYCR4_0_FORCE_USB_CLKOFF (0x20)
+#define USB_PHYCR4_0_FORCE_AUX_EN (0x80)
+#define USB_PHYCR4_0_FORCE_OTG_PROBE (0x40)
+#define USB_PHYCR4_0_FORCE_BVALID (0x10)
+#define USB_PHYCR4_0_FORCE_IDDIG (0x08)
+#define USB_PHYCR4_0_FORCE_VBUSVALID (0x04)
+#define USB_PHYCR4_0_FORCE_SESSEND (0x02)
+#define USB_PHYCR4_0_FORCE_AVALID (0x01)
+/* USB_PHYCR4_1 */
+#define USB_PHYCR4_1_FORCE_BGR_ON (0x4F)
+/* USB_PHYCR4_2 */
+/* USB_PHYCR4_3 */
+#define USB_PHYCR4_3_UART_MODE (0x08)
+#define USB_PHYCR4_3_OTG_RESET_EN (0x80)
+/* USB_PHYCR5_0 */
+/* USB_PHYCR5_1 */
+#define USB_PHYIR5_1_RG_SQTH0 (0x03)
+#define USB_PHYIR5_1_RG_RG_RCVB0 (0x20)
+#define USB_PHYIR5_1_RG_RG_SQB0 (0x40)
+/* USB_PHYCR5_2 */
+/* USB_PHYCR5_3 */
+#define USB_PHYCR5_3_TERM_SELECT (0x04)
+#define USB_PHYCR5_3_XCVR_SELECT_MASK (0x30)
+#define USB_PHYCR5_3_XCVR_SELECT_L (0x10)
+#define USB_PHYCR5_3_DP_PULL_DOWN (0x40)
+#define USB_PHYCR5_3_DM_PULL_DOWN (0x80)
+#define USB_PHYCR5_3_DP_DM_PULL_DOWN (0xC0)
+#define USB_PHYCR5_3_OP_MODE (0x01)
+#define USB_PHYCR5_3_SUSPENDM (0x08)
+/* USB_PHYIR1_0 */
+#define USB_PHYIR1_0_IDPULLUP (0x01)
+#define USB_PHYIR1_0_DRVVBUS (0x02)
+#define USB_PHYIR1_0_TX_VALID (0x04)
+/* USB_PHYIR1_1 */
+#define USB_PHYIR1_1_RG_DM1_ABIST_SELE (0x0A)
+/* USB_PHYIR1_2 */
+/* USB_PHYIR1_3 */
+/* USB_PHYIR2_0 */
+/* USB_PHYIR2_1 */
+/* USB_PHYIR2_2 */
+/* USB_PHYIR2_3 */
+/* USB_PHYIR3_0 */
+#define USB_PHYIR3_0_LINESTATE_DP (0x40)
+#define USB_PHYIR3_0_LINESTATE_DM (0x80)
+/* USB_PHYIR3_1 */
+#define USB_PHYIR3_1_SESSEND (0x02)
+#define USB_PHYIR3_1_IDDIG (0x08)
+/* USB_PHYIR3_2 */
+#define USB_PHYIR3_2_IDDIG (0x08)
+/* USB_PHYIR3_3 */
+/* USB_PHYIR4_0 */
+#define USB_PHYIR4_0_HS_TERMC_MASK (0x70)
+#define USB_PHYIR4_0_RG_CALIB_SELE0_ENABLE (0xC0)
+#define USB_PHYIR4_0_RG_CALIB_SELE0_DISABLE (0x40)
+#define USB_PHYIR4_0_RG_TX_I_TRIM0 (0x03)
+#define USB_PHYIR4_0_RG_CALIB_SELE0 (0x50)
+#define USB_PHYIR4_0_RG_CALIB_SELE0_2 (0x60)
+/* USB_PHYIR4_1 */
+/* USB_PHYIR4_2 */
+#define USB_PHYIR4_2_RG_HSTX_SRCTRL0 (0x01)
+#define USB_PHYIR4_2_RG_HSTX_DBIST0 (0xC0)
+/* USB_PHYIR4_3 */
+#define USB_PHYIR4_3_DEGLICH (0xAA)
+#define USB_PHYIR4_3_RG_DISCD (0x02)
+/* USB_PHYIR5_0 */
+/* USB_PHYIR5_1 */
+#define USB_PHYIR5_1_RG_SQTH0 (0x03)
+/* USB_PHYIR5_2 */
+/* USB_PHYIR5_3 */
+/* USB_PHYIR6_0 */
+#define USB_PHYIR6_0_RG_DP_100K_EN (0x01)
+#define USB_PHYIR6_0_RG_DM_100K_EN (0x02)
+/* USB_PHYIR6_1 */
+#define USB_PHYIR6_1_BGR_DIV_L (0x10)
+#define USB_PHYIR6_1_RG_OTG_VBUSTH (0x00)
+#define USB_PHYIR6_1_VBUSCMP_EN (0x04)
+/* USB_PHYIR6_2 */
+/* USB_PHYIR6_3 */
+
+
+#elif (defined(DRV_USB_PHY_U65_IP)) //MT62776 , MT6251 , MT6255
+
+#ifdef __USB_HS_SLEW_RATE_CAL__
+#define USB_HS_SLEW_RATE_CAL_TIME_WINDOW 0x400
+#define USB_HS_SLEW_RATE_CAL_A 3
+#define USB_HS_SLEW_RATE_CAL_FRA (66)
+
+#define USB_FMCR0 (USB_base+0xF00) /* RW */
+#define USB_FMCR1 (USB_base+0xF04) /* RW */
+#define USB_FMCR2 (USB_base+0xF08) /* RW */
+#define USB_FMMONR0 (USB_base+0xF0C) /* RW */
+#define USB_FMMONR1 (USB_base+0xF10) /* RW */
+#endif //USB_HS_SLEW_RATE_CAL
+
+/* USB phy register */
+#define USB_U2PHYAC0_0 (USB_base+0x800) /* RW */
+#define USB_U2PHYAC0_1 (USB_base+0x801) /* RW */
+#define USB_U2PHYAC0_2 (USB_base+0x802) /* RW */
+#define USB_U2PHYAC0_3 (USB_base+0x803) /* RW */
+
+#define USB_U2PHYAC1_0 (USB_base+0x804) /* RW */
+#define USB_U2PHYAC1_1 (USB_base+0x805) /* RW */
+#define USB_U2PHYAC1_2 (USB_base+0x806) /* RW */
+#define USB_U2PHYAC1_3 (USB_base+0x807) /* RW */
+
+#define USB_U2PHYACR0_0 (USB_base+0x810) /* RW */
+#define USB_U2PHYACR0_1 (USB_base+0x811) /* RW */
+#define USB_U2PHYACR0_2 (USB_base+0x812) /* RW */
+#define USB_U2PHYACR0_3 (USB_base+0x813) /* RW */
+
+#define USB_U2PHYACR1_0 (USB_base+0x814) /* RW */
+#define USB_U2PHYACR1_1 (USB_base+0x815) /* RW */
+#define USB_U2PHYACR1_2 (USB_base+0x816) /* RW */
+#define USB_U2PHYACR1_3 (USB_base+0x817) /* RW */
+
+#define USB_U2PHYACR2_0 (USB_base+0x818) /* RW */
+#define USB_U2PHYACR2_1 (USB_base+0x819) /* RW */
+#define USB_U2PHYACR2_2 (USB_base+0x81A) /* RW */
+#define USB_U2PHYACR2_3 (USB_base+0x81B) /* RW */
+
+#define USB_U2PHYACR3_0 (USB_base+0x81C) /* RW */
+#define USB_U2PHYACR3_1 (USB_base+0x81D) /* RW */
+#define USB_U2PHYACR3_2 (USB_base+0x81E) /* RW */
+#define USB_U2PHYACR3_3 (USB_base+0x81F) /* RW */
+
+#define USB_U2PHYACR4_0 (USB_base+0x820) /* RW */
+#define USB_U2PHYACR4_1 (USB_base+0x821) /* RW */
+#define USB_U2PHYACR4_2 (USB_base+0x822) /* RW */
+#define USB_U2PHYACR4_3 (USB_base+0x823) /* RW */
+
+#define USB_U2PHYACHG_0 (USB_base+0x824) /* RW */
+#define USB_U2PHYACHG_1 (USB_base+0x825) /* RW */
+#define USB_U2PHYACHG_2 (USB_base+0x826) /* RW */
+#define USB_U2PHYACHG_3 (USB_base+0x827) /* RW */
+
+#define USB_U2PHYDCR0_0 (USB_base+0x860) /* RW */
+#define USB_U2PHYDCR0_1 (USB_base+0x861) /* RW */
+#define USB_U2PHYDCR0_2 (USB_base+0x862) /* RW */
+#define USB_U2PHYDCR0_3 (USB_base+0x863) /* RW */
+
+#define USB_U2PHYDCR1_0 (USB_base+0x864) /* RW */
+#define USB_U2PHYDCR1_1 (USB_base+0x865) /* RW */
+#define USB_U2PHYDCR1_2 (USB_base+0x866) /* RW */
+#define USB_U2PHYDCR1_3 (USB_base+0x867) /* RW */
+
+#define USB_U2PHYDTM0_0 (USB_base+0x868) /* RW */
+#define USB_U2PHYDTM0_1 (USB_base+0x869) /* RW */
+#define USB_U2PHYDTM0_2 (USB_base+0x86A) /* RW */
+#define USB_U2PHYDTM0_3 (USB_base+0x86B) /* RW */
+
+#define USB_U2PHYDTM1_0 (USB_base+0x86C) /* RW */
+#define USB_U2PHYDTM1_1 (USB_base+0x86D) /* RW */
+#define USB_U2PHYDTM1_2 (USB_base+0x86E) /* RW */
+#define USB_U2PHYDTM1_3 (USB_base+0x86F) /* RW */
+
+#define USB_U2PHYDMON0_0 (USB_base+0x870) /* RW */
+#define USB_U2PHYDMON0_1 (USB_base+0x871) /* RW */
+#define USB_U2PHYDMON0_2 (USB_base+0x872) /* RW */
+#define USB_U2PHYDMON0_3 (USB_base+0x873) /* RW */
+
+#define USB_U1PHYCR0_0 (USB_base+0x8C0) /* RW */
+#define USB_U1PHYCR0_1 (USB_base+0x8C1) /* RW */
+#define USB_U1PHYCR0_2 (USB_base+0x8C2) /* RW */
+#define USB_U1PHYCR0_3 (USB_base+0x8C3) /* RW */
+
+#define USB_U1PHYCR1_0 (USB_base+0x8C4) /* RW */
+#define USB_U1PHYCR1_1 (USB_base+0x8C5) /* RW */
+#define USB_U1PHYCR1_2 (USB_base+0x8C6) /* RW */
+#define USB_U1PHYCR1_3 (USB_base+0x8C7) /* RW */
+
+#define USB_U1PHYCR2_0 (USB_base+0x8C8) /* RW */
+#define USB_U1PHYCR2_1 (USB_base+0x8C9) /* RW */
+#define USB_U1PHYCR2_2 (USB_base+0x8CA) /* RW */
+#define USB_U1PHYCR2_3 (USB_base+0x8CB) /* RW */
+
+#define USB_U1PHYACHG_0 (USB_base+0x8CC) /* RW */
+#define USB_U1PHYACHG_1 (USB_base+0x8CD) /* RW */
+#define USB_U1PHYACHG_2 (USB_base+0x8CE) /* RW */
+#define USB_U1PHYACHG_3 (USB_base+0x8CF) /* RW */
+
+#define USB_REGFPPC_0 (USB_base+0x8E0) /* RW */
+#define USB_REGFPPC_1 (USB_base+0x8E1) /* RW */
+#define USB_REGFPPC_2 (USB_base+0x8E2) /* RW */
+#define USB_REGFPPC_3 (USB_base+0x8E3) /* RW */
+
+#define USB_VERSIONC_0 (USB_base+0x8F0) /* RW */
+#define USB_VERSIONC_1 (USB_base+0x8F1) /* RW */
+#define USB_VERSIONC_2 (USB_base+0x8F2) /* RW */
+#define USB_VERSIONC_3 (USB_base+0x8F3) /* RW */
+
+#define USB_REGFCOM_0 (USB_base+0x8FC) /* RW */
+#define USB_REGFCOM_1 (USB_base+0x8FD) /* RW */
+#define USB_REGFCOM_2 (USB_base+0x8FE) /* RW */
+#define USB_REGFCOM_3 (USB_base+0x8FF) /* RW */
+
+
+/* USB PHY variable*/
+
+/* USB_U2PHYAC0_0 */
+#define USB_U2PHYAC0_0_RG_BGR_BGR_EN (0x01)
+#define USB_U2PHYAC0_0_RG_BGR_ISRC_EN (0x02)
+#define USB_U2PHYAC0_0_RG_BGR_CHP_EN (0x04)
+#define USB_U2PHYAC0_0_RG_REF_INTR_EN (0x80)
+/* USB_U2PHYAC0_1 */
+/* USB_U2PHYAC0_2 */
+#define USB_U2PHYAC0_2_RG_PLL_DIV (0x0A)
+#define USB_U2PHYAC0_2_RG_PLL_DIV_MASK (0x3F)
+/* USB_U2PHYAC0_3 */
+/* USB_U2PHYAC1_0 */
+/* USB_U2PHYAC1_1 */
+/* USB_U2PHYAC1_2 */
+/* USB_U2PHYAC1_3 */
+/* USB_U2PHYACR0_0 */
+#define USB_U2PHYACR0_0_RG_LS_CROSS (0x08)
+#define USB_U2PHYACR0_0_RG_FS_CROSS (0x02)
+#define USB_U2PHYACR0_0_RG_FS_CROSS_MASK (0x03)
+#define USB_U2PHYACR0_0_RG_LS_CROSS_MASK (0x0C)
+#define USB_U2PHYACR0_0_RG_PUPD_BIST_EN (0x10)
+/* USB_U2PHYACR0_1 */
+#define USB_U2PHYACR0_1_RG_EN_PU_DP (0x80)
+#define USB_U2PHYACR0_1_RG_EN_PD_DP (0x40)
+/* USB_U2PHYACR0_2 */
+/* USB_U2PHYACR0_3 */
+/* USB_U2PHYACR1_0 */
+#define USB_U2PHYACR1_0_RG_EN_PU_DM (0x80)
+#define USB_U2PHYACR1_0_RG_EN_PD_DM (0x40)
+#define USB_U2PHYACR1_0_RG_HS_TERM_EN_MODE (0x20)
+/* USB_U2PHYACR1_1 */
+#define USB_U2PHYACR1_1_RG_HSTX_SRCTRL_MASK (0x07)
+#define USB_U2PHYACR1_1_RG_HSTX_SRCTRL (0x01)
+/* USB_U2PHYACR1_2 */
+#define USB_U2PHYACR1_2_RG_DISCD_MASK (0x03)
+#define USB_U2PHYACR1_2_RG_DISCD (0x02)
+/* USB_U2PHYACR1_3 */
+/* USB_U2PHYACR2_0 */
+#define USB_U2PHYACR2_0_RG_SQTH (0x03)
+#define USB_U2PHYACR2_0_RG_SQTH_MASK (0x07)
+#define USB_U2PHYACR2_0_RG_SQB (0x40)
+#define USB_U2PHYACR2_0_RG_RCVB (0x20)
+#define USB_U2PHYACR2_0_RG_DISCB (0x10)
+/* USB_U2PHYACR2_1 */
+#define USB_U2PHYACR2_1_RG_DP_ABIST_SOURCE_EN (0x20)
+/* USB_U2PHYACR2_2 */
+#define USB_U2PHYACR2_2_RG_DM_ABIST_SOURCE_EN (0x20)
+/* USB_U2PHYACR2_3 */
+#define USB_U2PHYACR2_3_RG_OTG_VBUSCMP_EN (0x04)
+#define USB_U2PHYACR2_3_RG_DM_100K_EN (0x02)
+#define USB_U2PHYACR2_3_RG_DP_100K_EN (0x01)
+/* USB_U2PHYACR3_0 */
+#define USB_U2PHYACR3_0_RG_OTG_VBUSTH (0x40)
+/* USB_U2PHYACR3_1 */
+#define USB_U2PHYACR3_2_RG_USBRESERVED_6 (0x40)
+/* USB_U2PHYACR3_2 */
+#define USB_U2PHYACR3_2_RG_USBRESERVED_10 (0x04)
+/* USB_U2PHYACR3_3 */
+#define USB_U2PHYACR3_3_RG_USBRESERVED (0x20)
+/* USB_U2PHYACR4_0 */
+/* USB_U2PHYACR4_1 */
+/* USB_U2PHYACR4_2 */
+/* USB_U2PHYACR4_3 */
+/* USB_U2PHYACHG_0 */
+#define USB_U2PHYACHG_0_RG_CHGDT_IOUT_SEL (0x03)
+#define USB_U2PHYACHG_0_RG_CHGDT_IUP_SEL_MASK (0x0C)
+#define USB_U2PHYACHG_0_RG_CHGDT_IUP_SEL (0x04)
+#define USB_U2PHYACHG_0_RG_CHGDT_IDN_SEL (0x30)
+#define USB_U2PHYACHG_0_RG_CHGDT_COMP_SEL (0xC0)
+/* U2PHYACHG_1 */
+#define USB_U2PHYACHG_1_RG_CHGDT_VREF_SEL (0x03)
+#define USB_U2PHYACHG_1_RG_CHGDT_OPOUT_SEL (0x0C)
+#define USB_U2PHYACHG_1_RG_CHGDT_IREF_SEL (0x30)
+/* U2PHYACHG_2 */
+#define USB_U2PHYACHG_2_RG_CHGDT_EN_SEL_MASK (0x0F)
+#define USB_U2PHYACHG_2_RG_CHGDT_EN_SEL (0x08)
+#define USB_U2PHYACHG_2_RG_EN_CHGDT (0x10)
+/* U2PHYACHG_3 */
+#define USB_U2PHYACHG_3_RG_CHGDT_RESERVED (0xFF)
+#define USB_U2PHYACHG_3_RG_CHGDT_IREF_EN (0x40)
+#define USB_U2PHYACHG_3_RG_CHGDT_ISINK_EN (0x20)
+/* USB_U2PHYDCR0_0 */
+#define USB_U2PHYDCR0_0_RG_EARLY_HSTX_I (0x40)
+#define USB_U2PHYDCR0_0_RG_HSTX_ANA_SER_EN (0x80)
+/* USB_U2PHYDCR0_1 */
+/* USB_U2PHYDCR0_2 */
+/* USB_U2PHYDCR0_3 */
+#define USB_U2PHYDCR0_3_RG_PLL_STABLE (0x02)
+/* USB_U2PHYDCR1_0 */
+/* USB_U2PHYDCR1_1 */
+/* USB_U2PHYDCR1_2 */
+#define USB_U2PHYDCR1_2_RG_UART_EN (0x40)
+#define USB_U2PHYDCR1_2_RG_USB_CLKEN (0x20)
+/* USB_U2PHYDCR1_3 */
+#define USB_U2PHYDCR1_3_RG_PHYD_RESERVE_2 (0x04)
+/* USB_U2PHYDTM0_0 */
+#define USB_U2PHYDTM0_0_RG_DMPULLDOWN (0x80)
+#define USB_U2PHYDTM0_0_RG_DPPULLDOWN (0x40)
+#define USB_U2PHYDTM0_0_RG_XCVRSEL_MASK (0x30)
+#define USB_U2PHYDTM0_0_RG_RG_XCVRSEL (0x10)
+#define USB_U2PHYDTM0_0_RG_SUSPENDM (0x08)
+#define USB_U2PHYDTM0_0_RG_TERMSEL (0x04)
+#define USB_U2PHYDTM0_0_RG_OPMODE (0x01)
+/* USB_U2PHYDTM0_1 */
+#define USB_U2PHYDTM0_1_UTMI_MUSEL (0x80)
+#define USB_U2PHYDTM0_1_RG_DATAIN_MASK (0x3C)
+#define USB_U2PHYDTM0_1_RG_DATAIN (0x00)
+/* USB_U2PHYDTM0_2 */
+#define USB_U2PHYDTM0_2_FORCE_DATAIN (0x80)
+#define USB_U2PHYDTM0_2_FORCE_DM_PULLDOWN (0x20)
+#define USB_U2PHYDTM0_2_FORCE_DP_PULLDOWN (0x10)
+#define USB_U2PHYDTM0_2_FORCE_XCVRSEL (0x08)
+#define USB_U2PHYDTM0_2_FORCE_SUSPENDM (0x04)
+#define USB_U2PHYDTM0_2_FORCE_TERMSEL (0x02)
+/* USB_U2PHYDTM0_3 */
+#define USB_U2PHYDTM0_3_FORCE_UART_EN (0x04)
+/* USB_U2PHYDTM1_0 */
+#define USB_U2PHYDTM1_0_RG_SESSEND (0x10)
+#define USB_U2PHYDTM1_0_RG_IDPULLUP (0x01)
+/* USB_U2PHYDTM1_1 */
+#define USB_U2PHYDTM1_1_FORCE_IDPULLUP (0x01)
+/* USB_U2PHYDTM1_2 */
+/* USB_U2PHYDTM1_3 */
+/* USB_U2PHYDMON0_0 */
+/* USB_U2PHYDMON0_1 */
+/* USB_U2PHYDMON0_2 */
+#define USB_U2PHYDMON0_2_LINESTATE_DP (0x40)
+#define USB_U2PHYDMON0_2_LINESTATE_DM (0x80)
+/* USB_U2PHYDMON0_3 */
+#define USB_U2PHYDMON0_3_VBUSVALID_MAC (0x04)
+#define USB_U2PHYDMON0_3_IDDIG_MAC (0x08)
+/* USB_U1PHYCR0_0 */
+/* USB_U1PHYCR0_1 */
+#define USB_U1PHYCR0_1_RG_USB11_FSLS_ENBGRI (0x08)
+/* USB_U1PHYCR0_2 */
+/* USB_U1PHYCR0_3 */
+/* USB_U1PHYCR1_0 */
+/* USB_U1PHYCR1_1 */
+#define USB_U1PHYCR1_1_RG_USB11_USBRESERVED (0x01)
+#define USB_U1PHYCR1_1_RG_USB11_USBRESERVED_PMU (0x80)
+/* USB_U1PHYCR1_2 */
+/* USB_U1PHYCR1_3 */
+/* USB_U1PHYCR2_0 */
+/* USB_U1PHYCR2_1 */
+/* USB_U1PHYCR2_2 */
+/* USB_U1PHYCR2_3 */
+/* USB_U1PHYACHG_0 */
+/* USB_U1PHYACHG_1 */
+/* USB_U1PHYACHG_2 */
+/* USB_U1PHYACHG_3 */
+/* USB_REGFPPC_0 */
+/* USB_REGFPPC_1 */
+/* USB_REGFPPC_2 */
+/* USB_REGFPPC_3 */
+/* USB_VERSIONC_0 */
+/* USB_VERSIONC_1 */
+/* USB_VERSIONC_2 */
+/* USB_VERSIONC_3 */
+/* USB_REGFCOM_0 */
+/* USB_REGFCOM_1 */
+/* USB_REGFCOM_2 */
+/* USB_REGFCOM_3 */
+
+#elif (defined(DRV_USB_PHY_M60_IP)) //MT6256E2
+
+#ifdef __USB_HS_SLEW_RATE_CAL__
+#define USB_HS_SLEW_RATE_CAL_TIME_WINDOW 0x400
+#define USB_HS_SLEW_RATE_CAL_A 28
+#define USB_HS_SLEW_RATE_CAL_FRA (1000)
+#define USB_FMMONR1_RG_FRCK_EN (1<<8)
+
+#define USB_FMCR0 (USB_base+0xF00) /* RW */
+#define USB_FMCR1 (USB_base+0xF04) /* RW */
+#define USB_FMCR2 (USB_base+0xF08) /* RW */
+#define USB_FMMONR0 (USB_base+0xF0C) /* RW */
+#define USB_FMMONR1 (USB_base+0xF10) /* RW */
+#endif //USB_HS_SLEW_RATE_CAL
+
+#define USB_U2PHYAC0 (USB_base+0x800) //USB2.0 PHYA Common Registers
+#define USB_U2PHYAC1 (USB_base+0x804) //USB2.0 PHYA Common Registers
+#define USB_U2PHYAC2 (USB_base+0x808) //USB2.0 PHYA Common Registers
+#define USB_U2PHYACR0 (USB_base+0x810) //USB2.0 PHYA Control Registers
+#define USB_U2PHYACR1 (USB_base+0x814) //USB2.0 PHYA Control Registers
+#define USB_U2PHYACR2 (USB_base+0x818) //USB2.0 PHYA Control Registers
+#define USB_U2PHYACR3 (USB_base+0x81C) //USB2.0 PHYA Control Registers
+#define USB_U2PHYACR4 (USB_base+0x820) //USB2.0 PHYA Control Registers
+#define USB_U2PHYDCR0 (USB_base+0x860) //USB2.0 PHYD Control Registers
+#define USB_U2PHYDCR1 (USB_base+0x864) //USB2.0 PHYD Control Registers
+#define USB_U2PHYDTM0 (USB_base+0x868) //USB2.0 PHYD TestMode Registers
+#define USB_U2PHYDTM1 (USB_base+0x86C) //USB2.0 PHYD TestMode Registers
+#define USB_U2PHYDMON0 (USB_base+0x870) //USB2.0 PHYD Monitor Registers
+#define USB_U2PHYDMON1 (USB_base+0x874) //USB2.0 PHYD Monitor Registers
+#define USB_U2PHYDMON2 (USB_base+0x878) //USB2.0 PHYD Monitor Registers
+#define USB_U1PHYCR0 (USB_base+0x8C0) //USB1.1 PHY Control Registers
+#define USB_U1PHYCR1 (USB_base+0x8C4) //USB1.1 PHY Control Registers
+#define USB_U1PHYCR2 (USB_base+0x8C8) //USB1.1 PHY Control Registers
+#define USB_REGFPPC (USB_base+0x8E0) //RegFile Per-Page Common Registers
+#define USB_VERSIONC (USB_base+0x8F0) //Version Code
+#define USB_REGFCOM (USB_base+0x8FC) //RegFile Common Registers
+
+#define USB_U2PHYACR0_RG_USB20_HSTX_SRCTRL_CLR (0x7<<16)
+
+#define USB_U2PHYACR0_RG_USB20_HSTX_SRCTRL (0x5<<16)
+#define USB_U2PHYACR0_RG_USB20_HSTX_SRCAL_EN (0x1<<23)
+
+#define USB_U2PHYACR1_RG_USB20_DM_ABIST_SOURCE_EN (0x1<<15)
+
+#define USB_U2PHYDTM0_force_uart_en (1<<26)
+#define USB_U2PHYDTM0_force_suspendm (1<<18)
+#define USB_U2PHYDTM0_RG_SUSPENDM (1<<3)
+#define USB_U2PHYDTM1_RG_UART_EN (1<<16)
+#define USB_U2PHYAC0_RG_USB20_USBPLL_FBDIV_6_0_CLR (0x7F<<16) //[6:0]
+#define USB_U2PHYAC0_RG_USB20_USBPLL_FBDIV_6_0 (9<<16) //[6:0]
+#define USB_U2PHYACR2_RG_USB20_OTG_VBUSCMP_EN (1<<27)
+#define USB_U2PHYACR3_RG_USB20_PHY_REV_7 (1<<7)
+#define USB_U2PHYACR3_RG_USB20_HS_TERM_EN_MODE (0x2<<13)
+#define USB_U2PHYACR3_RG_USB20_HS_TERM_EN_MODE_CLR (0x3<<13)
+#define USB_U2PHYACR4_RG_USB20_DP_100K_EN (1<<16)
+#define USB_U2PHYACR4_RG_USB20_DM_100K_EN (1<<17)
+#define USB_U2PHYDTM0_RG_DPPULLDOWN (1<<6)
+#define USB_U2PHYDTM0_RG_DMPULLDOWN (1<<7)
+#define USB_U2PHYDTM0_RG_XCVRSEL_1_0_CLR (0x3<<4) //[1:0]
+#define USB_U2PHYDTM0_RG_XCVRSEL_1_0 (0x1<<4) //[1:0]
+#define USB_U2PHYDTM0_RG_DATAIN_3_0_CLR (0xF<<10) //[3:0]
+#define USB_U2PHYDTM0_force_dp_pulldown (1<<20)
+#define USB_U2PHYDTM0_force_dm_pulldown (1<<21)
+#define USB_U2PHYDTM0_force_termsel (1<<17)
+#define USB_U2PHYDTM0_force_xcvrsel (1<<19)
+#define USB_U2PHYDTM0_force_datain (1<<23)
+#define USB_U2PHYDTM0_RG_TERMSEL (1<<2)
+#define USB_U2PHYDCR1_RG_PLL_STABL (1<<19)
+#define USB_U2PHYDMON1_USB20_LINE_STATE_DP (1<<22)
+#define USB_U2PHYDMON1_USB20_LINE_STATE_DM (1<<23)
+#define USB_U2PHYAC0_RG_USB20_INTR_EN (1<<14)
+
+#elif (defined(DRV_USB_PHY_U40_IP)) //future chip
+
+
+#else // Old PHY (MT6235 / MT6238 /MT6516 /MT6268A / MT6253T)
+
+/* USB phy register */
+#define USB_PHYCR1_0 (USB_base+0x600) /* RW */
+#define USB_PHYCR1_1 (USB_base+0x601) /* RW */
+#define USB_PHYCR1_2 (USB_base+0x602) /* RW */
+#define USB_PHYCR1_3 (USB_base+0x603) /* RW */
+
+#define USB_PHYCR2_0 (USB_base+0x604) /* RW */
+#define USB_PHYCR2_1 (USB_base+0x605) /* RW */
+#define USB_PHYCR2_2 (USB_base+0x606) /* RW */
+#define USB_PHYCR2_3 (USB_base+0x607) /* RW */
+
+#define USB_PHYCR3_0 (USB_base+0x608) /* RW */
+#define USB_PHYCR3_1 (USB_base+0x609) /* RW */
+#define USB_PHYCR3_2 (USB_base+0x60A) /* RW */
+#define USB_PHYCR3_3 (USB_base+0x60B) /* RW */
+
+#define USB_PHYCR4_0 (USB_base+0x60C) /* RW */
+#define USB_PHYCR4_1 (USB_base+0x60D) /* RW */
+#define USB_PHYCR4_2 (USB_base+0x60E) /* RW */
+#define USB_PHYCR4_3 (USB_base+0x60F) /* RW */
+
+#define USB_PHYCR5_0 (USB_base+0x610) /* RW */
+#define USB_PHYCR5_1 (USB_base+0x611) /* RW */
+#define USB_PHYCR5_2 (USB_base+0x612) /* RW */
+#define USB_PHYCR5_3 (USB_base+0x613) /* RW */
+
+#define USB_PHYIR1_0 (USB_base+0x614) /* RW */
+#define USB_PHYIR1_1 (USB_base+0x615) /* RW */
+#define USB_PHYIR1_2 (USB_base+0x616) /* RW */
+#define USB_PHYIR1_3 (USB_base+0x617) /* RW */
+
+#define USB_PHYIR2_0 (USB_base+0x618) /* RW */
+#define USB_PHYIR2_1 (USB_base+0x619) /* RW */
+#define USB_PHYIR2_2 (USB_base+0x61A) /* RW */
+#define USB_PHYIR2_3 (USB_base+0x61B) /* RW */
+
+
+/* USB PHY variable*/
+/* USB_PHY ALL*/
+#define USB_PHY_CLEAR_MASK (0x00)
+
+/* USB_PHYCR1_0 */
+#define USB_PHYCR1_0_PLL_EN (0x80)
+
+/* USB_PHYCR1_1 */
+#define USB_PHYCR1_1_PLL_CCP_SET (0x30)
+#define USB_PHYCR1_1_PLL_CCP_MASK (0xF0)
+
+/* USB_PHYCR1_2 */
+#define USB_PHYCR1_2_PLL_VCOG_H (0x08)
+#define USB_PHYCR1_2_HS_RCVB (0x40)
+
+/* USB_PHYCR2_0 */
+#define USB_PHYCR2_0_HS_SQB_MASK (0x0F)
+#define USB_PHYCR2_0_HS_SQD_MASK (0xF0)
+#define USB_PHYCR2_0_HS_SQD_SET (0xA0)
+
+/* USB_PHYCR2_2 */
+#define USB_PHYCR2_2_FORCE_DATA_IN (0x40)
+#define USB_PHYCR2_2_FORCE_TX_VALID (0x20)
+#define USB_PHYCR2_2_HS_DISCP (0x01)
+
+/* USB_PHYCR2_3 */
+#define USB_PHYCR2_3_HS_TERMC_MASK (0x1F)
+#define USB_PHYCR2_3_FORCE_DP_PULLDOWN (0x20)
+#define USB_PHYCR2_3_FORCE_DM_PULLDOWN (0x40)
+#define USB_PHYCR2_3_FORCE_DP_DM_PULLDOWN (0x60)
+#define USB_PHYCR2_3_FORCE_DRV_VBUS (0x80)
+#define USB_PHYCR2_3_HS_TERMC (0x08)
+#define USB_PHYCR2_3_HS_TERMC2 (0x0B)
+#define USB_PHYCR2_3_FORCE_SUSPENDM (0x04)
+
+/* USB_PHYCR3_0 */
+#define USB_PHYCR3_0_IADJ_MASK (0x07)
+#define USB_PHYCR3_0_IADJ_MASK2 (0x04)
+#define USB_PHYCR3_0_IADJ_RESISTER_SET (0x06)
+#define USB_PHYCR3_0_CLEAR_MASK (0x00)
+
+/* USB_PHYCR3_2 */
+#define USB_PHYCR3_2_TEST_CTRL_MASK (0x0F)
+#define USB_PHYCR3_2_TEST_CTRL1_SET (0x02)
+#define USB_PHYCR3_2_TEST_CTRL2_SET (0x04)
+#define USB_PHYCR3_2_CLK_MODE (0x80)
+
+/* USB_PHYCR4_1 */
+#define USB_PHYCR4_1_BGR_BGR_EN (0x01)
+#define USB_PHYCR4_1_BGR_CLK_EN (0x02)
+#define USB_PHYCR4_1_BGR_I_SRC_EN (0x04)
+#define USB_PHYCR4_1_BGR_CHIP_EN (0x08)
+#define USB_PHYCR4_1_BGR_SELPH (0x10)
+#define USB_PHYCR4_1_BGR_DIV_L (0x40)
+#define USB_PHYCR4_1_FORCE_BGR_ON (0x4F)
+
+/* USB_PHYCR5_0 */
+#define USB_PHYCR5_0_VBUSCMP_EN (0x80)
+#define USB_PHYCR5_0_CDR_FILT (0x02)
+
+/* USB_PHYCR5_2 */
+#define USB_PHYCR5_2_FORCE_OP_MODE (0x01)
+#define USB_PHYCR5_2_FORCE_TERM_SELECT (0x02)
+#define USB_PHYCR5_2_FORCE_SUSPENDM (0x04)
+#define USB_PHYCR5_2_FORCE_XCVR_SELECT (0x08)
+#define USB_PHYCR5_2_FORCE_DP_HIGH (0x0B)
+#define USB_PHYCR5_2_FORCE_IDPULLUP (0x80)
+#define USB_PHYCR5_2_UTMI_MUXSEL (0x40)
+
+/* USB_PHYCR5_3 */
+#define USB_PHYCR5_3_TERM_SELECT (0x04)
+#define USB_PHYCR5_3_XCVR_SELECT_MASK (0x30)
+#define USB_PHYCR5_3_XCVR_SELECT_L (0x10)
+#define USB_PHYCR5_3_DP_PULL_DOWN (0x40)
+#define USB_PHYCR5_3_DM_PULL_DOWN (0x80)
+#define USB_PHYCR5_3_DP_DM_PULL_DOWN (0xC0)
+#define USB_PHYCR5_3_OP_MODE (0x01)
+#define USB_PHYCR5_3_SUSPENDM (0x08)
+
+/* USB_PHYIR1_0 */
+#define USB_PHYIR1_0_IDPULLUP (0x01)
+#define USB_PHYIR1_0_DRVVBUS (0x02)
+#define USB_PHYIR1_0_TX_VALID (0x04)
+
+/* USB_PHYIR1_3 */
+#define USB_PHYIR1_3_LINESTATE_DP (0x40)
+#define USB_PHYIR1_3_LINESTATE_DM (0x80)
+
+/* USB_PHYIR2_0 */
+#define USB_PHYIR2_0_SESSEND (0x02)
+
+/* USB_PHYIR2_3 */
+#define USB_PHYIR2_3_FORCE_USB_CLKOFF (0x20)
+#define USB_PHYIR2_3_FORCE_AUX_EN (0x80)
+
+
+#endif // PHY
+
+
+//USB IP V3
+#if (defined(DRV_USB_PHY_COST_DOWN))
+#define USB_LINE_STATE USB_PHYIR3_0
+#elif (defined(DRV_USB_PHY_U65_IP))
+#define USB_LINE_STATE USB_U2PHYDMON0_2
+#elif (defined(DRV_USB_PHY_M60_IP))
+#define USB_LINE_STATE USB_U2PHYDMON1
+#elif (defined(DRV_USB_PHY_U40_IP)) //future chip
+
+#else
+#define USB_LINE_STATE USB_PHYIR1_3
+#endif
+
+
+#elif (defined(DRV_USB_IP_V2))
+
+#define OTG_INT_STAT (USB_base+0x10)
+#define OTG_INT_EN (USB_base+0x14)
+#define OTG_STATUS (USB_base+0x18)
+#define OTG_CTRL (USB_base+0x1c)
+
+#define USB_FM_PKT_NUML (USB_base+0x20)
+#define USB_FM_PKT_NUMH (USB_base+0x24)
+#define USB_FM_ERR_STAT (USB_base+0x28)
+#define USB_FM_CTL (USB_base+0x2c)
+#define USB_FM_PKT_CNTL (USB_base+0x30)
+#define USB_FM_PKT_CNTH (USB_base+0x34)
+#define USB_FM_TIMEOUT (USB_base+0x38)
+#define USB_FM_STATUS (USB_base+0x3c)
+#define USB_FM_ADDITNL_STAT (USB_base+0x50)
+#define USB_FM_ENDPT (USB_base+0x68)
+#define USB_FM_INT_MASK (USB_base+0x6c)
+#define USB_PHY_EXTRA (USB_base+0x70)
+
+#define USB_INT_STAT (USB_base+0x80)
+#define USB_INT_ENB (USB_base+0x84)
+#define USB_ERR_STAT (USB_base+0x88)
+#define USB_ERR_ENB (USB_base+0x8c)
+#define USB_STAT (USB_base+0x90)
+#define USB_CTL (USB_base+0x94)
+#define USB_ADDR (USB_base+0x98)
+#define USB_BDT_PAGE_01 (USB_base+0x9c)
+#define USB_BDT_PAGE_02 (USB_base+0xb0)
+#define USB_BDT_PAGE_03 (USB_base+0xb4)
+#define USB_FRM_NUML (USB_base+0xa0)
+#define USB_FRM_NUMH (USB_base+0xa4)
+#define USB_TOKEN (USB_base+0xa8)
+#define USB_SOF_THLD (USB_base+0xac)
+#define USB_ENDPT_CTL_BASE (USB_base+0xc0)
+#define USB_ENDPT_CTL(n) (USB_ENDPT_CTL_BASE+4*n)
+
+#define USB_DMA_ENB (USB_base+0x410)
+#define USB_DMA_DIS (USB_base+0x414)
+#define USB_DMA_ADDR_CNTER_CLR (USB_base+0x418)
+#define USB_DMA_FM_SELECT (USB_base+0x41c)
+#define USB_SOFT_RST (USB_base+0x420)
+#define USB_PHY_CTL (USB_base+0x450)
+
+#define USB_FIFO_RX0_EVEN (USB_base+0x200)
+#define USB_FIFO_RX0_ODD (USB_base+0x208)
+#define USB_FIFO_TX0_EVEN (USB_base+0x210)
+#define USB_FIFO_TX0_ODD (USB_base+0x218)
+#define USB_FIFO_RX1 (USB_base+0x220)
+#define USB_FIFO_TX1 (USB_base+0x260)
+#define USB_FIFO_RX2 (USB_base+0x2a0)
+#define USB_FIFO_TX2 (USB_base+0x2e0)
+#define USB_FIFO_RX3 (USB_base+0x320)
+#define USB_FIFO_TX3 (USB_base+0x328)
+
+
+#define USB_BDT_RX0_EVEN (USB_base+0x330)
+#define USB_BDT_RX0_ODD (USB_base+0x338)
+#define USB_BDT_TX0_EVEN (USB_base+0x340)
+#define USB_BDT_TX0_ODD (USB_base+0x348)
+#define USB_BDT_RX1 (USB_base+0x350)
+#define USB_BDT_TX1 (USB_base+0x358)
+#define USB_BDT_RX2 (USB_base+0x360)
+#define USB_BDT_TX2 (USB_base+0x368)
+#define USB_BDT_RX3 (USB_base+0x370)
+#define USB_BDT_TX3 (USB_base+0x378)
+
+/* VUSB Endpoint control register masks */
+/* Define the bits within the endpoint control register */
+#define VUSB_ENDPT_HSHK_BIT (0x01)
+#define VUSB_ENDPT_STALL_BIT (0x02)
+#define VUSB_ENDPT_TX_EN_BIT (0x04)
+#define VUSB_ENDPT_RX_EN_BIT (0x08)
+#define VUSB_ENDPT_CTL_EP_CTL_DIS (0x10)
+#define VUSB_ENDPT_CTL_RETRY_DIS (0x40)
+#define VUSB_ENDPT_CTL_HOST_WO_HUB (0x80)
+
+#define VUSB_ENDPT_DISABLE (0x00)
+#define VUSB_ENDPT_CONTROL (VUSB_ENDPT_HSHK_BIT | VUSB_ENDPT_TX_EN_BIT | \
+ VUSB_ENDPT_RX_EN_BIT | VUSB_ENDPT_CTL_RETRY_DIS)
+#define VUSB_ENDPT_BULK_RX (VUSB_ENDPT_HSHK_BIT | VUSB_ENDPT_RX_EN_BIT | \
+ VUSB_ENDPT_CTL_EP_CTL_DIS | VUSB_ENDPT_CTL_RETRY_DIS)
+#define VUSB_ENDPT_BULK_TX (VUSB_ENDPT_HSHK_BIT | VUSB_ENDPT_TX_EN_BIT | \
+ VUSB_ENDPT_CTL_EP_CTL_DIS | VUSB_ENDPT_CTL_RETRY_DIS)
+#define VUSB_ENDPT_BULK_BIDIR (VUSB_ENDPT_HSHK_BIT | VUSB_ENDPT_TX_EN_BIT | \
+ VUSB_ENDPT_RX_EN_BIT | VUSB_ENDPT_CTL_EP_CTL_DIS | VUSB_ENDPT_CTL_RETRY_DIS)
+#define VUSB_ENDPT_ISO_RX (VUSB_ENDPT_RX_EN_BIT | VUSB_ENDPT_CTL_EP_CTL_DIS | \
+ VUSB_ENDPT_CTL_RETRY_DIS)
+#define VUSB_ENDPT_ISO_TX (VUSB_ENDPT_TX_EN_BIT | VUSB_ENDPT_CTL_EP_CTL_DIS | \
+ VUSB_ENDPT_CTL_RETRY_DIS)
+#define VUSB_ENDPT_ISO_BIDIR (VUSB_ENDPT_RX_EN_BIT | VUSB_ENDPT_TX_EN_BIT | \
+ VUSB_ENDPT_CTL_EP_CTL_DIS | VUSB_ENDPT_CTL_RETRY_DIS)
+
+/* VUSB Control register masks */
+#define VUSB_CTL_USB_EN (0x01)
+#define VUSB_CTL_SOF_EN (0x01)
+#define VUSB_CTL_ODD_RST (0x02)
+#define VUSB_CTL_RESUME (0x04)
+#define VUSB_CTL_HOST_MODE_EN (0x08)
+#define VUSB_CTL_RESET (0x10)
+#define VUSB_CTL_TOKEN_BUSY (0x20)
+#define VUSB_CTL_TXD_SUSPEND (0x20)
+#define VUSB_CTL_SINGLE_ENDED_0 (0x40)
+#define VUSB_CTL_JSTATE (0x80)
+
+/* VUSB Interrupt status register masks */
+#define VUSB_INT_STAT_RESET (0x01)
+#define VUSB_INT_STAT_ERROR (0x02)
+#define VUSB_INT_STAT_SOF (0x04)
+#define VUSB_INT_STAT_TOKEN_DONE (0x08)
+#define VUSB_INT_STAT_SLEEP (0x10)
+#define VUSB_INT_STAT_RESUME (0x20)
+#define VUSB_INT_STAT_ATTACH (0x40)
+#define VUSB_INT_STAT_STALL (0x80)
+
+/* VUSB Interrupt enable register masks*/
+#define VUSB_INT_ENB_RESET (0x01)
+#define VUSB_INT_ENB_ERROR (0x02)
+#define VUSB_INT_ENB_SOF (0x04)
+#define VUSB_INT_ENB_TOKEN_DONE (0x08)
+#define VUSB_INT_ENB_SLEEP (0x10)
+#define VUSB_INT_ENB_RESUME (0x20)
+#define VUSB_INT_ENB_ATTACH (0x40)
+#define VUSB_INT_ENB_STALL (0x80)
+
+/* VUSB Fast mode error status register masks */
+#define USB_FM_ERR_STA_OVR_FLW (0x80)
+#define VUSB_FM_ERR_STAT_TOKEN_DONE (0x40)
+#define VUSB_FM_ERR_SUC_ERR (0x04)
+#define VUSB_FM_ERR_NAK_ERR (0x02)
+#define VUSB_FM_ERR_SHORT_ERR (0x01)
+
+/* VUSB Fast mode control register masks */
+#define VUSB_FM_CTL_FMENB (0x1)
+#define VUSB_FM_CTL_SUCERREN (0x8)
+#define VUSB_FM_CTL_EP_RX_ODD_SHIFT 1
+#define VUSB_FM_CTL_EP_TX_ODD_SHIFT 2
+#define VUSB_FM_CTL_EP_TOG_BIT_SHIFT 6
+
+/* VUSB Fast mode endpoint register masks*/
+#define VUSB_FM_EP_TX (0x10)
+#define VUSB_FM_EP_TX_RES (0x80)
+#define VUSB_FM_EP_ENDPT_MASK (0x0f)
+
+/* VUSB FM DMA index */
+#define VUSB_FM_DMA_RX1 0
+#define VUSB_FM_DMA_TX1 1
+#define VUSB_FM_DMA_RX2 2
+#define VUSB_FM_DMA_TX2 3
+
+/* VUSB EXTRA register masks*/
+#define VUSB_PHY_RESUME_INT (0x80)
+#define VUSB_PHY_RESUME_INT_ENB (0x04)
+#define VUSB_PHY_SUSPEND (0x02)
+
+/* VUSB SOFT RST register masks*/
+#define VUSB_SOFT_RST_EN (0x01)
+
+/* VUSB BDT masks */
+#define VUSB_BDT_OWNS_BIT (1 << 7)
+#define VUSB_BDT_DATA01_BIT (1 << 6)
+#define VUSB_BDT_KEEP_BIT (1 << 5)
+#define VUSB_BDT_NINC_BIT (1 << 4)
+#define VUSB_BDT_DTS_BIT (1 << 3)
+#define VUSB_BDT_STALL_BIT (1 << 2)
+#define VUSB_BDT_BC_SHIFT 16
+#define VUSB_BDT_DATA01_SHIFT 6
+#define VUSB_BDT_BC_MASK 0x03ff0000
+
+#define VUSB_BDT_PID_MASKS (0x3C)
+#define VUSB_BDT_NAK_PID (0x28)
+#define VUSB_BDT_ERROR_PID (0x3c)
+#define VUSB_BDT_STALL_PID (0x38)
+#define VUSB_BDT_BUS_TIMEOUT_PID (0x00)
+
+
+/* OTG Interrupt Status Register Bit Masks */
+#define OTG_INT_STATUS_A_VBUS (0x01)
+#define OTG_INT_STATUS_B_SESS_END (0x04)
+#define OTG_INT_STATUS_SESS_VLD (0x08)
+#define OTG_INT_STATUS_LINE_STATE_CHANGE (0x20)
+#define OTG_INT_STATUS_1_MSEC (0x40)
+#define OTG_INT_STATUS_ID (0x80)
+
+/* OTG Interrupt Enable Register Bit Masks */
+#define OTG_INT_ENABLE_A_VBUS (0x01)
+#define OTG_INT_ENABLE_B_SESS_END (0x04)
+#define OTG_INT_ENABLE_SESS_VLD (0x08)
+#define OTG_INT_ENABLE_1_MSEC (0x40)
+#define OTG_INT_ENABLE_ID (0x80)
+
+/*OTG Status register masks*/
+#define OTG_STATUS_A_VBUS (0x01)
+#define OTG_STATUS_B_SESS_END (0x04)
+#define OTG_STATUS_SESS_VLD (0x08)
+#define OTG_STATUS_LINE_STATE_CHANGE (0x20)
+#define OTG_STATUS_1_MSEC (0x40)
+#define OTG_STATUS_ID (0x80)
+
+/*OTG Control register masks*/
+#define OTG_CTL_VBUS_DSCHG (0x01)
+#define OTG_CTL_VBUS_CHG (0x02)
+#define OTG_CTL_OTG_ENABLE (0x04)
+#define OTG_CTL_VBUS_ON (0x08)
+#define OTG_CTL_DM_LOW (0x10)
+#define OTG_CTL_DP_LOW (0x20)
+#define OTG_CTL_DM_HIGH (0x40)
+#define OTG_CTL_DP_HIGH (0x80)
+
+
+#define OTG_CTL_RESET_DP_DM (~(OTG_CTL_DM_LOW|OTG_CTL_DP_LOW|OTG_CTL_DM_HIGH|OTG_CTL_DP_HIGH))
+#define OTG_CTL_J_STATE (OTG_CTL_DP_HIGH|OTG_CTL_DM_LOW)
+#define OTG_CTL_K_STATE (OTG_CTL_DM_HIGH|OTG_CTL_DP_LOW)
+#define OTG_CTL_DP_DM_HIGH (OTG_CTL_DP_HIGH|OTG_CTL_DM_HIGH)
+#define OTG_CTL_DP_DM_LOW (OTG_CTL_DP_LOW|OTG_CTL_DM_LOW)
+
+
+/* Token register masks */
+#define VUSB_TOKEN_ENDPT (0x0f)
+#define VUSB_TOKEN_PID (0xf0)
+#define VUSB_TOKEN_OUT (0x10)
+#define VUSB_TOKEN_IN (0x90)
+#define VUSB_TOKEN_SETUP (0xd0)
+
+#elif (defined(DRV_USB_IP_V1)||defined(DRV_USB_IP_V1_PLUS))
+
+#define USB_FADDR (USB_base+0x0)
+#define USB_POWER (USB_base+0x1)
+#define USB_INTRIN1 (USB_base+0x2) /*status, read only*/
+#define USB_INTRIN2 (USB_base+0x3) /*status, read only*/
+#define USB_INTROUT1 (USB_base+0x4) /*status, read only*/
+#define USB_INTROUT2 (USB_base+0x5) /*status, read only*/
+#define USB_INTRUSB (USB_base+0x6) /*status, read only*/
+#define USB_INTRIN1E (USB_base+0x7)
+#define USB_INTRIN2E (USB_base+0x8)
+#define USB_INTROUT1E (USB_base+0x9)
+#define USB_INTROUT2E (USB_base+0xa)
+#define USB_INTRUSBE (USB_base+0xb)
+#define USB_FRAME1 (USB_base+0xc) /*read only*/
+#define USB_FRAME2 (USB_base+0xd) /*read only*/ /*Max Frame length = 11 bits*/
+#define USB_INDEX (USB_base+0xe) /*RW, 4bit available*/
+#define USB_RSTCTRL (USB_base+0xf)
+
+#define USB_INMAXP (USB_base+0x10) /*RW*/
+#define USB_CSR0 (USB_base+0x11)
+#define USB_INCSR1 (USB_base+0x11)
+#define USB_INCSR2 (USB_base+0x12)
+#define USB_OUTMAXP (USB_base+0x13) /*RW*/
+#define USB_OUTCSR1 (USB_base+0x14)
+#define USB_OUTCSR2 (USB_base+0x15)
+#define USB_COUNT0 (USB_base+0x16) /*RO, EP0 only*/
+#define USB_OUTCOUNT1 (USB_base+0x16)
+#define USB_OUTCOUNT2 (USB_base+0x17) /*RO,11bits*/
+
+#define USB_EP0 (USB_base+0x20) /*4 byte as 1 queue*/
+
+#define USB_ENABLE (USB_base+0x230)
+
+#if defined(DRV_USB_IP_V1_PLUS)
+#define USB_PHY_CONTROL (USB_base+0x240)
+#define USB_PHY_CONTROL_PUB (0x01)
+#define USB_PHY_CONTROL_TOF (0x10)
+#endif
+
+/*USB_FADDR*/
+#define USB_FADDR_ADDRMASK (0x7f) /*RO*/
+#define USB_FADDR_UPDATE (0x80) /*RW*/
+
+/*USB_POWER*/
+#define USB_POWER_SETSUSPEND (0x01) /*RW*/
+#define USB_POWER_SUSPENDSTAT (0x02) /*RO*/ /*Read clear by the intr. register*/
+#define USB_POWER_RESUME (0x04) /*RW*/
+#define USB_POWER_RESET (0x08) /*RO*/
+#define USB_POWER_SWRSTENAB (0x10) /*RW*/
+#define USB_POWER_ISOUPDATE (0x80) /*RW*/
+
+/*USB_RSTCTRL*/
+#define USB_RSTCTRL_SWRST (0x80) /*RW*/
+
+/*USB_INTRIN1, USB_INTRIN2 is not needed*/
+#define USB_INTRIN1_EP0 (0x01) /*RO*/
+#define USB_INTRIN1_EP1 (0x02) /*RO*/
+#define USB_INTRIN1_EP2 (0x04) /*RO*/
+#define USB_INTRIN1_EP3 (0x08) /*RO*/
+
+/*USB_INTROUT1, USB_INTROUT2 is not needed*/
+#define USB_INTROUT1_EP1 (0x02) /*RO*/
+#define USB_INTROUT1_EP2 (0x04) /*RO*/
+
+/*USB_INTRUSB*/
+#define USB_INTRUSB_SUSPEND (0x01) /*RO*/
+#define USB_INTRUSB_RESUME (0x02) /*RO*/
+#define USB_INTRUSB_RESET (0x04) /*RO*/
+#define USB_INTRUSB_SOF (0x08) /*RO*/
+
+/*USB_INTRIN1E, USB_INTRIN2E is not needed*/
+#define USB_INTRIN1E_EPEN (0x01) /*RW*/
+
+/*USB_INTROUT1E, USB_INTROUT2E is not needed*/
+#define USB_INTROUT1E_EPEN (0x01) /*RW*/
+
+/*USB_INTRUSBE*/
+#define USB_INTRUSBE_SUSPEND (0x01) /*RW*/
+#define USB_INTRUSBE_RESUME (0x02) /*RW*/
+#define USB_INTRUSBE_RESET (0x04) /*RW*/
+#define USB_INTRUSBE_SOF (0x08) /*RW*/
+
+/*USB_INMAXP*/
+#define USB_INMAXP_MASK (0xff) /*RW*/
+
+/*USB_OUTMAXP*/
+#define USB_OUTMAXP_MASK (0xff) /*RW*/
+
+/*USB_CSR0*/
+#define USB_CSR0_OUTPKTRDY (0x01) /*RO*/
+#define USB_CSR0_INPKTRDY (0x02) /*RW,AC*/
+#define USB_CSR0_SENTSTALL (0x04) /*RC*/
+#define USB_CSR0_DATAEND (0x08) /*WO,AC*/
+#define USB_CSR0_SETUPEND (0x10) /*RO*/
+#define USB_CSR0_SENDSTALL (0x20) /*WO,AC*/
+#define USB_CSR0_SERVICEDOUTPKTRDY (0x40) /*WO,AC*/
+#define USB_CSR0_SERVICESETUPEND (0x80) /*WO,AC*/
+
+/*USB_INCSR1*/
+#define USB_INCSR1_INPKTRDY (0x01) /*RW*/
+#define USB_INCSR1_FIFONOTEMPTY (0x02) /*RC*/
+#define USB_INCSR1_UNDERRUN (0x04) /*RC*/
+#define USB_INCSR1_FLUSHFIFO (0x08) /*WO*/
+#define USB_INCSR1_SENDSTALL (0x10) /*RW*/
+#define USB_INCSR1_SENTSTALL (0x20) /*RC*/
+#define USB_INCSR1_CLRDATATOG (0x40) /*WO*/
+
+/*USB_INCSR2*/
+#define USB_INCSR2_FRCDATATOG (0x08) /*RW*/
+#define USB_INCSR2_DMAENAB (0x10) /*RW*/
+#define USB_INCSR2_MODE (0x20) /*RW*/
+#define USB_INCSR2_ISO (0x40) /*RW*/
+#define USB_INCSR2_AUTOSET (0x80) /*RW*/
+
+/*USB_OUTCSR1*/
+#define USB_OUTCSR1_OUTPKTRDY (0x01) /*RC*/
+#define USB_OUTCSR1_FIFOFULL (0x02) /*R,AC*/
+#define USB_OUTCSR1_OVERRUN (0x04) /*RC*/
+#define USB_OUTCSR1_DATAERROR (0x08) /*RO*/
+#define USB_OUTCSR1_FLUSHFIFO (0x10) /*WO,AC*/
+#define USB_OUTCSR1_SENDSTALL (0x20) /*RW*/
+#define USB_OUTCSR1_SENTSTALL (0x40) /*RC*/
+#define USB_OUTCSR1_CLRDATATOG (0x80) /*WO*/
+
+/*USB_OUTCSR2*/
+#define USB_OUTCSR2_DMAMODE (0x10) /*RW*/
+#define USB_OUTCSR2_DMAENAB (0x20) /*RW*/
+#define USB_OUTCSR2_ISO (0x40) /*RW*/
+#define USB_OUTCSR2_AUTOCLEAR (0x80) /*RW*/
+
+/*USB_ENABLE*/
+#define USB_ENABLE_EN (0x1) /*WO*/
+#define USB_ENABLE_DIS (0x0) /*WO*/
+
+#if (defined(DRV_USB_PHY_U65_IP)) //MT6276 , MT6251
+
+/* USB phy register */
+#define USB_U1PHYCR0_0 (USB_base+0x8C0) /* RW */
+#define USB_U1PHYCR0_1 (USB_base+0x8C1) /* RW */
+#define USB_U1PHYCR0_2 (USB_base+0x8C2) /* RW */
+#define USB_U1PHYCR0_3 (USB_base+0x8C3) /* RW */
+
+#define USB_U1PHYCR1_0 (USB_base+0x8C4) /* RW */
+#define USB_U1PHYCR1_1 (USB_base+0x8C5) /* RW */
+#define USB_U1PHYCR1_2 (USB_base+0x8C6) /* RW */
+#define USB_U1PHYCR1_3 (USB_base+0x8C7) /* RW */
+
+#define USB_U1PHYCR2_0 (USB_base+0x8C8) /* RW */
+#define USB_U1PHYCR2_1 (USB_base+0x8C9) /* RW */
+#define USB_U1PHYCR2_2 (USB_base+0x8CA) /* RW */
+#define USB_U1PHYCR2_3 (USB_base+0x8CB) /* RW */
+
+#define USB_U1PHYACHG_0 (USB_base+0x8CC) /* RW */
+#define USB_U1PHYACHG_1 (USB_base+0x8CD) /* RW */
+#define USB_U1PHYACHG_2 (USB_base+0x8CE) /* RW */
+#define USB_U1PHYACHG_3 (USB_base+0x8CF) /* RW */
+
+#define USB_REGFPPC_0 (USB_base+0x8E0) /* RW */
+#define USB_REGFPPC_1 (USB_base+0x8E1) /* RW */
+#define USB_REGFPPC_2 (USB_base+0x8E2) /* RW */
+#define USB_REGFPPC_3 (USB_base+0x8E3) /* RW */
+
+#define USB_VERSIONC_0 (USB_base+0x8F0) /* RW */
+#define USB_VERSIONC_1 (USB_base+0x8F1) /* RW */
+#define USB_VERSIONC_2 (USB_base+0x8F2) /* RW */
+#define USB_VERSIONC_3 (USB_base+0x8F3) /* RW */
+
+#define USB_REGFCOM_0 (USB_base+0x8FC) /* RW */
+#define USB_REGFCOM_1 (USB_base+0x8FD) /* RW */
+#define USB_REGFCOM_2 (USB_base+0x8FE) /* RW */
+#define USB_REGFCOM_3 (USB_base+0x8FF) /* RW */
+
+
+/* USB PHY variable*/
+/* USB_U1PHYCR0_0 */
+/* USB_U1PHYCR0_1 */
+#define USB_U1PHYCR0_1_RG_USB11_PUPD_BIST_EN (0x01)
+#define USB_U1PHYCR0_1_RG_USB11_FSLS_ENBGRI (0x08)
+/* USB_U1PHYCR0_2 */
+#define USB_U1PHYCR0_2_RG_USB11_EN_PD_DP (0x01)
+#define USB_U1PHYCR0_2_RG_USB11_EN_PU_DP (0x02)
+#define USB_U1PHYCR0_2_RG_USB11_EN_PD_DM (0x04)
+#define USB_U1PHYCR0_2_RG_USB11_EN_PU_DM (0x08)
+#define USB_U1PHYCR0_2_RG_USB11_DP_100K_EN (0x10)
+#define USB_U1PHYCR0_2_RG_USB11_DM_100K_EN (0x20)
+/* USB_U1PHYCR0_3 */
+#define USB_U1PHYCR0_3_RG_USB11_DP_ABIST_SOURCE_EN (0x80)
+/* USB_U1PHYCR1_0 */
+#define USB_U1PHYCR1_0_RG_USB11_DM_ABIST_SOURCE_EN (0x80)
+/* USB_U1PHYCR1_1 */
+#define USB_U1PHYCR1_1_RG_USB11_USBRESERVED (0x01)
+#define USB_U1PHYCR1_1_RG_USB11_USBRESERVED_PMU (0x80)
+/* USB_U1PHYCR1_2 */
+/* USB_U1PHYCR1_3 */
+/* USB_U1PHYCR2_0 */
+/* USB_U1PHYCR2_1 */
+#define USB_U1PHYCR2_1_AD_USB11_RXP (0x01)
+#define USB_U1PHYCR2_1_AD_USB11_RXM (0x02)
+/* USB_U1PHYCR2_2 */
+/* USB_U1PHYCR2_3 */
+/* USB_U1PHYACHG_0 */
+/* USB_U1PHYACHG_1 */
+/* USB_U1PHYACHG_2 */
+/* USB_U1PHYACHG_3 */
+/* USB_REGFPPC_0 */
+/* USB_REGFPPC_1 */
+/* USB_REGFPPC_2 */
+/* USB_REGFPPC_3 */
+/* USB_VERSIONC_0 */
+/* USB_VERSIONC_1 */
+/* USB_VERSIONC_2 */
+/* USB_VERSIONC_3 */
+/* USB_REGFCOM_0 */
+/* USB_REGFCOM_1 */
+/* USB_REGFCOM_2 */
+/* USB_REGFCOM_3 */
+#elif defined(DRV_USB_PHY_T55_IP)
+#define USB_U1PHYCR0 (USB_base+0x8C0) //USB1.1 PHY Control Registers
+#define USB_U1PHYCR1 (USB_base+0x8C4) //USB1.1 PHY Control Registers
+#define USB_U1PHYCR2 (USB_base+0x8C8) //USB1.1 PHY Control Registers
+#define U1PHYCR0_RG_USB11_FSLS_ENBGRI (1<<11) //BIT11
+#define U1PHYCR1_RG_USB11_PHY_REV_7 (1<<15) //BIT15
+#endif //DRV_USB_PHY_U65_IP
+
+#endif //(defined(DRV_USB_IP_V1)||defined(DRV_USB_IP_V1_PLUS))
+
+#define USB_MAX_FEATURE_NUM 4
+
+#if (defined(DRV_USB_PHY_CALIBRATION)&& defined(DRV_USB_PHY_COST_DOWN))
+#define ABIST_FMTR_CON0 (MIXED_base+0xF80)
+#define ABIST_FMTR_CON1 (MIXED_base+0xF84)
+#define ABIST_FMTR_DATA (MIXED_base+0xF88)
+
+#define TIME_WINDOW 0x200
+#define FRA (65.8)
+#endif //SR_Calibration
+
+#ifdef __IC_USB_ENABLE__
+#define ICUSB_MAX_TX_EP_NUM 3
+#define ICUSB_MAX_RX_EP_NUM 4
+#define ICUSB_MAX_EP_NUM 4
+
+#define ICUSB_MAX_DMA_NUM 4
+
+#define ICUSB_MAX_FIFO_SIZE 1024
+
+#define ICUSB_FIFO_START_ADDRESS 64
+
+#define ICUSB_BULK_FIFO_UNIT_SIZE 64
+
+#define MAX_ICUSB_NUM 1
+#endif
+
+#endif /* USB_HW_H */
+
diff --git a/mcu/driver/connectivity/usb_driver/inc/usb_memory_def.h b/mcu/driver/connectivity/usb_driver/inc/usb_memory_def.h
new file mode 100644
index 0000000..d45fe36
--- /dev/null
+++ b/mcu/driver/connectivity/usb_driver/inc/usb_memory_def.h
@@ -0,0 +1,172 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usb_memory_def.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb memory usage calculation.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USB_MEMORY_H
+#define USB_MEMORY_H
+
+
+#include "usb_custom_def.h"
+
+
+//===================== Single Feature Set ===================//
+#ifdef __USB_MASS_STORAGE_ENABLE__
+#define USB_MS_FUNCTION_SIZE (USBMS_MAX_BUFFERSIZE)
+#else
+#define USB_MS_FUNCTION_SIZE 0
+#endif
+
+#ifdef __MTP_ENABLE__
+#define USB_MTP_FUNCTION_SIZE (USB_IMAGE_MTP_MAX_BUFFERSIZE)
+#else
+#define USB_MTP_FUNCTION_SIZE 0
+#endif
+
+#ifdef __USB_COM_PORT_ENABLE__
+#define USB_COM_FUNCTION_SIZE ((USB_ACM_RX_BUFFER_NUM*USB_ACM_RX_BUFFER_SIZE)+USB_RX_RING_BUFFER_1_SIZE+USB_TX_RING_BUFFER_1_SIZE+USB_TXISR_RING_BUFFER_SIZE)
+#else
+#define USB_COM_FUNCTION_SIZE 0
+#endif
+
+#ifdef WEBCAM_SUPPORT
+#define USB_WEBCAM_FUNCTION_SIZE (USBVIDEO_MAX_PAYLOAD_LENGTH)
+#else
+#define USB_WEBCAM_FUNCTION_SIZE 0
+#endif
+
+#define USB_ISD_FUNCTION_SIZE 0
+
+
+
+//================== Calculation =====================//
+
+#if USB_MS_FUNCTION_SIZE > USB_MTP_FUNCTION_SIZE
+ #define USB_MAX_STEMP1 USB_MS_FUNCTION_SIZE
+#else
+ #define USB_MAX_STEMP1 USB_MTP_FUNCTION_SIZE
+#endif
+
+#if USB_COM_FUNCTION_SIZE > USB_WEBCAM_FUNCTION_SIZE
+ #define USB_MAX_STEMP2 USB_COM_FUNCTION_SIZE
+#else
+ #define USB_MAX_STEMP2 USB_WEBCAM_FUNCTION_SIZE
+#endif
+
+
+#if USB_MAX_STEMP1 > USB_MAX_STEMP2
+ #define USB_MAX_STEMP3 USB_MAX_STEMP1
+#else
+ #define USB_MAX_STEMP3 USB_MAX_STEMP2
+#endif
+
+
+#if USB_MAX_STEMP3 > USB_ISD_FUNCTION_SIZE
+ #define USB_MAX_STEMP4 USB_MAX_STEMP3
+#else
+ #define USB_MAX_STEMP4 USB_ISD_FUNCTION_SIZE
+#endif
+
+
+// single function max size
+#define USB_MAX_SINGLE_TEMP USB_MAX_STEMP4
+
+
+#define USB_MAX_MEMORY_SIZE (USB_MAX_SINGLE_TEMP + USB_DESCRIPTOR_SIZE)
+
+
+//===================== Composite Feature Set ==============================//
+
+
+
+
+#endif //USB_MEMORY_H
diff --git a/mcu/driver/connectivity/usb_driver/inc/usb_phy_drv.h b/mcu/driver/connectivity/usb_driver/inc/usb_phy_drv.h
new file mode 100644
index 0000000..939fd6a
--- /dev/null
+++ b/mcu/driver/connectivity/usb_driver/inc/usb_phy_drv.h
@@ -0,0 +1,90 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usb_phy_drv.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for usb phy hardware related function definitions
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ *
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USB_PHY_DRV_H
+#define USB_PHY_DRV_H
+
+//#include "usb_drv.h"
+
+// MoDIS parser skip start
+#if (defined(__USB_AND_UART_WITH_ONE_GPIO__)||defined(__USB_AND_UART_WITH_ONE_PORT__))
+extern void USB_UART_Share(kal_bool usb_mode);
+#endif
+
+
+extern void USB_PHY_Initialize(void);
+
+#if defined(DRV_USB_PHY_CALIBRATION)
+extern void USB_SR_Calibration(void);
+#endif
+
+
+
+// MoDIS parser skip end
+
+#endif //USB_PHY_DRV_H
+
+
+
diff --git a/mcu/driver/connectivity/usb_driver/inc/usblog_drv.h b/mcu/driver/connectivity/usb_driver/inc/usblog_drv.h
new file mode 100644
index 0000000..c5a90d0
--- /dev/null
+++ b/mcu/driver/connectivity/usb_driver/inc/usblog_drv.h
@@ -0,0 +1,226 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usblog_drv.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for USB logging hardware related function definitions
+ *
+ * Author:
+ * -------
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USB_LOGGING_DRV_H
+#define USB_LOGGING_DRV_H
+
+//#include "kal_non_specific_general_types.h"
+
+
+
+
+#if defined(DRV_USB_LOGGING_V5) || defined(DRV_USB_LOGGING_V6) || defined(DRV_USB_LOGGING_V8)
+#if !defined(DRV_USB_LOGGING_V5_SINGLE_DSP)
+#define USBACM_LOGGING_DSP_SOURCE_NUM 2
+#else
+#define USBACM_LOGGING_DSP_SOURCE_NUM 1
+#endif
+#define USBACM_LOGGING_3G_SOURCE_NUM 3 //v6 dose not support 3G logging.
+#define USBACM_LOGGING_TOTAL_SOURCE_NUM (USBACM_LOGGING_DSP_SOURCE_NUM)
+
+#endif //logging source number
+
+
+//#ifdef __MODEM_3G_LOGGING__
+#if defined(DRV_USB_LOGGING_V5)||defined(DRV_USB_LOGGING_V8)
+/* 3G MODEM part */
+#define USB_LOGGING_3G_BUFFER1_NUM 4
+#define USB_LOGGING_3G_BUFFER2_NUM 4
+#define USB_LOGGING_3G_BUFFER3_NUM 5
+#define USB_LOGGING_3G_BUFFER4_NUM 2
+#define USB_LOGGING_3G_BUFFER1_SIZE (1024*4)
+#define USB_LOGGING_3G_BUFFER2_SIZE (1024*4)
+#define USB_LOGGING_3G_BUFFER3_SIZE (1024*4)
+#define USB_LOGGING_3G_BUFFER4_SIZE (1024*16)
+#endif
+
+//#endif /* __MODEM_3G_LOGGING__ */
+
+
+/* HISR handler function type */
+typedef void (*usb_log_hdlr_ptr)(void);
+typedef void (*usb_mdci_hdlr_ptr)(kal_uint32 addr, kal_uint32 len, kal_uint32 index);
+
+#if defined(DRV_USB_LOGGING_V5)
+extern void USB_LOGGING_DSP_Clear_Buff(kal_uint8 channel, kal_uint8 index);
+extern kal_uint16 USB_LOGGING_Get_DSP_Status(kal_uint8 channel);
+extern void USB_LOGGING_DSP_Init(kal_uint8 channel, kal_uint8* addr);
+extern void USB_LOGGING_Register_DSP_Hldr(usb_log_hdlr_ptr log_dsp1_hdlr, usb_log_hdlr_ptr log_dsp2_hdlr);
+extern void USB_LOGGING_DSP_Start(void);
+extern void USB_LOGGING_DSP_Stop(void);
+extern void USB_LOGGING_DSP_Drv_Create_ISR(void);
+extern void USB_LOGGING_DSP_Drv_Activate_ISR(void);
+#elif defined(DRV_USB_LOGGING_V8)
+ extern kal_uint8 USB_LOGGING_Get_Buff_Num(kal_uint8 buf_index);
+ extern kal_uint32 USB_LOGGING_Get_Buff_Size(kal_uint8 buf_index);
+ extern void USB_LOGGING_Clear_Buff(kal_uint8 buf_index, kal_uint8 index);
+ extern kal_uint16 USB_LOGGING_Get_DSP1_Status(void);
+ extern kal_uint16 USB_LOGGING_Get_DSP2_Status(void);
+ extern void USB_LOGGING_DSP_Init(kal_uint8 channel, kal_uint8* addr);
+ extern void USB_LOGGING_Register_DSP_Hldr(usb_mdci_hdlr_ptr mdci_hdlr);
+ extern void USB_LOGGING_DSP_Start(void);
+ extern void USB_LOGGING_DSP_Stop(void);
+ extern void USB_LOGGING_DSP_Drv_Create_ISR(void);
+ extern void USB_LOGGING_DSP_Drv_Activate_ISR(void);
+ extern void USB_LOGGING_Register_3G_Hldr(usb_log_hdlr_ptr log_3g_hdlr);
+ extern void USB_LOGGING_3G_HISR(void);
+
+#endif
+
+#endif /* USB_LOGGING_DRV_H */
+
diff --git a/mcu/driver/connectivity/usb_driver/inc/usblog_hw.h b/mcu/driver/connectivity/usb_driver/inc/usblog_hw.h
new file mode 100644
index 0000000..e981373
--- /dev/null
+++ b/mcu/driver/connectivity/usb_driver/inc/usblog_hw.h
@@ -0,0 +1,174 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usblog_hw.h
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file intends for USB logging tool hardware register definitions
+ *
+ * Author:
+ * -------
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+#ifndef USB_LOGGING_HW_H
+#define USB_LOGGING_HW_H
+
+
+#endif /* USB_LOGGING_HW_H */
+
diff --git a/mcu/driver/connectivity/usb_driver/src/dcl_otg_drv.c b/mcu/driver/connectivity/usb_driver/src/dcl_otg_drv.c
new file mode 100644
index 0000000..b6ae315
--- /dev/null
+++ b/mcu/driver/connectivity/usb_driver/src/dcl_otg_drv.c
@@ -0,0 +1,3075 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * dcl_otg_drv.c
+ *
+ * Project:
+ * --------
+ * Maui_sw
+ *
+ * Description:
+ * ------------
+ * This file defines the DCL common definitions for USB OTG driver.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+
+#if defined(__OTG_ENABLE__) && !defined(DRV_USB_OFF)
+
+
+#include "drv_comm.h"
+#include "reg_base.h"
+#include "drvpdn.h"
+#include "intrCtrl.h"
+#include "drv_hisr.h"
+#include "gpio_hw.h"
+#include "gpio_sw.h"
+//#include "stack_common.h"
+#include "kal_public_defs.h" //MSBB change #include "stack_msgs.h"
+#include "kal_public_api.h" //#include "stack_ltlcom.h" //MSBB change #include "app_ltlcom.h" /* Task message communiction */
+#include "isrentry.h"
+#include "eint.h"
+#include "usb_hw.h"
+#include "otg_drv.h"
+#include "otg_drv_pri.h"
+#include "usb_hcd.h"
+#include "usb_hcd_pri.h"
+#include "usb_drv.h"
+#include "usb_drv_pri.h"
+//#include "usb_custom.h"
+#include "otg_if.h"
+#include "usb_debug_tool.h"
+#include "usb_trc.h"
+#include "dcl.h"
+#include "usb_adap.h"
+//#include "kal_non_specific_general_types.h"
+//#include "kal_release.h"
+#include "kal_trace.h"
+#include "kal_public_api.h" //#include "stack_ltlcom.h"
+#include "kal_public_defs.h" //MSBB change #include "stack_config.h"
+#include "kal_general_types.h"
+#include "kal_public_api.h"
+#include "drv_msgid.h"
+
+
+//#if (defined(MT6326))
+//#include "pmic6326_sw.h"
+//#include "i2c_dual_sw.h"
+//#endif
+
+
+static OTG_Drv_Info g_OtgInfo;
+static kal_bool g_otg_idpin_state;
+extern kal_bool OTG_IDPIN_CABLE_PLUGIN_LEVEL;
+extern kal_uint8 INT_Exception_Enter;/* Exception flag*/
+
+static void OTG_Set_Plug_Type(OTG_PLUG_TYPE type);
+static kal_bool OTG_Is_B_Session_Valid(void);
+
+static void OTG_Timeout_Hdlr(void *parameter);
+static void OTG_Start_Timer(OTG_TIMER_TYPE type, kal_uint32 ticks);
+static void OTG_Stop_Timer(void);
+static OTG_TIMER_TYPE OTG_Get_TimerType(void);
+
+static kal_bool OTG_Is_TimerOut(OTG_TIMER_TYPE type);
+static kal_bool OTG_Is_TimerActive(void);
+static void OTG_Process_A_Idle(void);
+static void OTG_Process_A_Wait_BCon(void);
+static void OTG_Process_A_Host(void);
+static void OTG_Process_A_Suspend(void);
+static void OTG_Process_A_Peripheral(void);
+static void OTG_Process_A_Wait_VFall(void);
+static void OTG_Process_B_Idle(void);
+static void OTG_Process_B_Session_Valid(void);
+static void OTG_Process_B_SRP_Init(void);
+static void OTG_Process_B_Peripheral(void);
+static void OTG_Process_B_Wait_ACon(void);
+static void OTG_Process_B_Host(void);
+static void OTG_State_Machine(void);
+
+static void OTGDMA_HISR(void);
+static void OTGDMAQ_HISR(void);
+static void OTGDMA_LISR(void);
+static void OTG_LISR(void);
+
+static void OTG_ID_EINT_HISR(void);
+
+
+
+/************************************************************
+ A plug detection functions
+*************************************************************/
+
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#if defined(DRV_USB_PHY_U65_IP)
+/* under construction !*/
+/* under construction !*/
+#endif
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+
+static void OTG_ID_EINT_HISR(void)
+{
+ ilm_struct *maplug_ilm;
+ kal_uint8 otg_idpin_eint = custom_eint_get_channel(otg_idpin_eint_chann);
+
+ if(g_otg_idpin_state != OTG_IDPIN_CABLE_PLUGIN_LEVEL)
+ {
+ USB_Dbg_Trace(USB_HOST_A_CABLE_PLUG_OUT, (kal_uint32)g_OtgInfo.otg_state, 0);
+
+#if (defined(DRV_USB_PHY_COST_DOWN))
+ USB_DRV_SetBits8(USB_PHYIR3_2, USB_PHYIR3_2_IDDIG);
+ USB_DRV_SetBits8(USB_PHYCR4_0,USB_PHYCR4_0_FORCE_IDDIG);
+#endif
+
+ /* USB IRQ is masked so there is no expected interrupt */
+ #if defined(DRV_USB_IP_V3)
+ if(g_OtgInfo.otg_state == OTG_STATE_A_HOST)
+ {
+ if(USB_HCD_Get_UnMask_Irq(0) == KAL_FALSE)
+ {
+ USB_Dbg_Trace(USB_A_CABLE_OUT_BUT_NO_DISCONN, 1, 1);
+ USB_HCD_Disconn_Hdlr(0);
+ }
+ else
+ {
+ USB_Dbg_Trace(USB_A_CABLE_OUT_BUT_NO_DISCONN, USB_DRV_Reg8(USB_LINE_STATE), USB_DRV_Reg8(USB_OPSTATE));
+ }
+ }
+ else if(g_OtgInfo.otg_state == OTG_STATE_A_PERIPHERAL)
+ {
+ if(USB_HW_Get_UnMask_Irq() == KAL_FALSE)
+ {
+ USB_Dbg_Trace(USB_A_CABLE_OUT_BUT_NO_DISCONN, 2, 0);
+ g_OtgInfo.otg_state = OTG_STATE_A_WAIT_BCON;
+ }
+ else
+ {
+ USB_Dbg_Trace(USB_A_CABLE_OUT_BUT_NO_DISCONN, USB_DRV_Reg8(USB_LINE_STATE), USB_DRV_Reg8(USB_OPSTATE));
+ }
+ }
+ #endif
+
+ OTG_Set_Plug_Type(OTG_PLUG_B);
+
+ DRV_BuildPrimitive(maplug_ilm,
+ stack_get_active_module_id(),
+ MOD_USB,
+ MSG_ID_USB_A_PLUGOUT_IND,
+ NULL);
+
+ msg_send_ext_queue(maplug_ilm);
+ }
+ else
+ {
+ USB_Dbg_Trace(USB_HOST_A_CABLE_PLUG_IN, 0, 0);
+
+ /* Open AHB clock, then we can set USB IP's registers */
+#if defined(__OLD_PDN_ARCH__)
+#if defined(__OLD_PDN_DEFINE__)
+ USB_DRV_WriteReg(DRVPDN_CON0_CLR, DRVPDN_CON0_USB);
+#elif defined(__CLKG_DEFINE__)
+ USB_DRV_WriteReg(CG_CLR0, CG_CON0_USB);
+#endif
+#else
+ DRVPDN_Disable(PDN_USB);
+#endif
+
+ OTG_Set_Plug_Type(OTG_PLUG_A);
+
+#if (defined(DRV_USB_PHY_COST_DOWN))
+ USB_DRV_ClearBits8(USB_PHYIR3_2, USB_PHYIR3_2_IDDIG);
+ USB_DRV_SetBits8(USB_PHYCR4_0, USB_PHYCR4_0_FORCE_IDDIG);
+#endif
+
+ DRV_BuildPrimitive(maplug_ilm,
+ stack_get_active_module_id(),
+ MOD_USB,
+ MSG_ID_USB_A_PLUGIN_IND,
+ NULL);
+ msg_send_ext_queue(maplug_ilm);
+ }
+
+ g_otg_idpin_state = (g_otg_idpin_state == KAL_FALSE)?(KAL_TRUE):(KAL_FALSE);
+ EINT_Set_Polarity(otg_idpin_eint, g_otg_idpin_state);
+
+#if 0 // (defined(MT6326))
+/* under construction !*/
+/* under construction !*/
+#if defined(__OLD_PDN_ARCH__)
+#if defined(__OLD_PDN_DEFINE__)
+/* under construction !*/
+#elif defined(__CLKG_DEFINE__)
+/* under construction !*/
+#endif
+#else
+/* under construction !*/
+#endif
+/* under construction !*/
+#endif
+
+
+ EINT_UnMask(otg_idpin_eint);
+}
+
+
+static void OTG_Set_Plug_Type(OTG_PLUG_TYPE type)
+{
+ g_OtgInfo.plug_type = type;
+}
+
+
+
+void OTG_Set_Status(OTG_STATUS_TYPE type, kal_bool set)
+{
+ kal_bool b_process_state_machine = KAL_FALSE;
+ kal_uint32 savedMask;
+
+
+ USB_Dbg_Trace(USB_OTG_SET_STATUS, (kal_uint32)type, (kal_uint32)set);
+
+ switch(type)
+ {
+ case OTG_STATUS_A_BUS_REQUEST:
+ g_OtgInfo.a_bus_req = set;
+ break;
+ case OTG_STATUS_A_DETECT_B_CONN:
+ g_OtgInfo.a_detect_b_conn = set;
+ break;
+ case OTG_STATUS_A_DETECT_B_SUSPEND:
+ g_OtgInfo.a_detect_b_suspend = set;
+ break;
+ case OTG_STATUS_A_DETECT_B_RESUME:
+ g_OtgInfo.a_detect_b_resume = set;
+ break;
+ case OTG_STATUS_A_DETECT_B_DATA_PLS:
+ g_OtgInfo.a_detect_b_data_pls = set;
+ break;
+ case OTG_STATUS_A_SUSPEND_REQUEST:
+ g_OtgInfo.a_suspend_req = set;
+ break;
+ case OTG_STATUS_A_RESUME_REQUEST:
+ g_OtgInfo.a_resume_req = set;
+ break;
+ case OTG_STATUS_A_SET_B_HNP_ENABLE:
+ g_OtgInfo.a_set_b_hnp_enable = set;
+ break;
+ case OTG_STATUS_B_SESSION_VALID:
+ g_OtgInfo.b_session_valid = set;
+ break;
+ case OTG_STATUS_B_SUSPEND_REQUEST:
+ g_OtgInfo.b_suspend_req = set;
+ break;
+ case OTG_STATUS_B_DETECT_A_CONN:
+ g_OtgInfo.b_detect_a_conn = set;
+ break;
+ case OTG_STATUS_B_DETECT_A_SUSPEND:
+ g_OtgInfo.b_detect_a_suspend = set;
+ break;
+ case OTG_STATUS_B_DETECT_A_RESUME:
+ g_OtgInfo.b_detect_a_resume = set;
+ break;
+ case OTG_STATUS_B_DETECT_A_RESET:
+ g_OtgInfo.b_detect_a_reset = set;
+ break;
+ case OTG_STATUS_B_SRP_REQUEST:
+ g_OtgInfo.b_srp_request = set;
+ break;
+ case OTG_STATUS_B_HNP_ENABLE:
+ g_OtgInfo.b_hnp_enable = set;
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+
+ /* Process OTG state machine*/
+ savedMask = SaveAndSetIRQMask();
+ if(g_OtgInfo.b_processing == KAL_FALSE)
+ {
+ g_OtgInfo.b_processing = KAL_TRUE;
+ b_process_state_machine = KAL_TRUE;
+ }
+ RestoreIRQMask(savedMask);
+
+ if(b_process_state_machine == KAL_TRUE)
+ {
+ OTG_State_Machine();
+ g_OtgInfo.b_processing = KAL_FALSE;
+ }
+
+ if((g_OtgInfo.suspend_and_conn_intr == KAL_TRUE)&&(g_OtgInfo.otg_state == OTG_STATE_B_WAIT_ACON))
+ {
+ g_OtgInfo.suspend_and_conn_intr = KAL_FALSE;
+ USB_HCD_Conn_Hdlr(0);
+ }
+}
+
+
+OTG_PLUG_TYPE OTG_Get_Plug_Type(void)
+{
+ return g_OtgInfo.plug_type;
+}
+
+
+OTG_STATE OTG_Get_State(void)
+{
+ return g_OtgInfo.otg_state;
+}
+
+
+kal_uint8 OTG_Get_Intr_Status(void)
+{
+ return g_OtgInfo.otg_intr_status;
+}
+
+
+void OTG_Set_Conn_Intr_With_Suspend(void)
+{
+ g_OtgInfo.suspend_and_conn_intr = KAL_TRUE;
+}
+
+
+void OTG_Set_Disconn_Status(void)
+{
+ g_OtgInfo.disconn_and_conn_intr = KAL_TRUE;
+}
+
+
+kal_bool OTG_Is_B_Process_SRP(void)
+{
+ return g_OtgInfo.b_srp_request;
+}
+
+
+
+
+
+static kal_bool OTG_Is_B_Session_Valid(void)
+{
+ kal_bool ret = KAL_FALSE;
+ kal_uint8 usbdevice = (USB_DRV_Reg8(USB_DEVCTL)&USB_DEVCTL_VBUS);
+
+
+ if((usbdevice == USB_DEVCTL_ABOVE_VBUS_VALID)||(usbdevice == USB_DEVCTL_ABOVE_A_VALID))
+ ret = KAL_TRUE;
+
+ return ret;
+}
+
+
+/************************************************************
+ Timer functions
+*************************************************************/
+
+/* GPT timeout handler */
+static void OTG_Timeout_Hdlr(void *parameter)
+{
+ DclSGPT_Control((DCL_HANDLE)(g_OtgInfo.gpt_handle), SGPT_CMD_STOP, 0);
+// GPTI_StopItem(g_OtgInfo.gpt_handle);
+
+ g_OtgInfo.timer_out = KAL_TRUE;
+
+ USB_Dbg_Trace(USB_OTG_TIMEOUT_HDLR, (kal_uint32)g_OtgInfo.timer_type, USB_DRV_Reg8(USB_POWER));
+
+ if(OTG_Is_TimerOut(OTG_TIMER_B_CHECK_A_RESUME) == KAL_TRUE)
+ {
+ if((USB_DRV_Reg8(USB_LINE_STATE)&0xC0) == 0x80)
+ {
+ /* K resume! */
+ /* Stop the timer, let state machine see as resume */
+ OTG_Stop_Timer();
+
+ /* K resume! */
+ g_OtgInfo.b_detect_a_resume = KAL_TRUE;
+ }
+ }
+
+ /* Process OTG state machine*/
+ if(g_OtgInfo.b_processing == KAL_FALSE)
+ {
+// g_OtgInfo.b_processing = KAL_TRUE;
+ OTG_State_Machine();
+// g_OtgInfo.b_processing = KAL_FALSE;
+ }
+}
+
+
+/* The tick unit is ms */
+static void OTG_Start_Timer(OTG_TIMER_TYPE type, kal_uint32 ticks)
+{
+ SGPT_CTRL_START_T start;
+
+ if(g_OtgInfo.timer_on==KAL_TRUE)
+ EXT_ASSERT(0, (kal_uint32)g_OtgInfo.timer_on, (kal_uint32)g_OtgInfo.timer_type, (kal_uint32)g_OtgInfo.timer_out);
+
+ g_OtgInfo.timer_type = type;
+ g_OtgInfo.timer_on = KAL_TRUE;
+ g_OtgInfo.timer_out = KAL_FALSE;
+
+ /* IP V3 only have GPT timer */
+ if (ticks < 10)
+ ticks = 10;
+
+ start.u2Tick = ticks/10;
+ start.pfCallback = OTG_Timeout_Hdlr;
+ start.vPara = &g_OtgInfo;
+ DclSGPT_Control((DCL_HANDLE)(g_OtgInfo.gpt_handle), SGPT_CMD_START, (DCL_CTRL_DATA_T*)&start);
+
+}
+
+
+/* stop the timer */
+static void OTG_Stop_Timer(void)
+{
+ DclSGPT_Control((DCL_HANDLE)(g_OtgInfo.gpt_handle), SGPT_CMD_STOP, 0);
+// GPTI_StopItem(g_OtgInfo.gpt_handle);
+
+ g_OtgInfo.timer_on = KAL_FALSE;
+ g_OtgInfo.timer_out = KAL_FALSE;
+ g_OtgInfo.timer_type = OTG_TIMER_NONE;
+}
+
+
+/* return KAL_TRUE if "type" timer is timeout */
+static kal_bool OTG_Is_TimerOut(OTG_TIMER_TYPE type)
+{
+ kal_bool ret = KAL_FALSE;
+
+
+ if((g_OtgInfo.timer_out == KAL_TRUE)&&(g_OtgInfo.timer_type == type))
+ ret = KAL_TRUE;
+
+ return ret;
+}
+
+
+/* return if any timer is active*/
+static kal_bool OTG_Is_TimerActive(void)
+{
+ kal_bool ret = KAL_FALSE;
+
+ if((g_OtgInfo.timer_on == KAL_TRUE) || (g_OtgInfo.timer_out == KAL_TRUE))
+ ret = KAL_TRUE;
+
+ return ret;
+}
+
+
+/* Return active timer type */
+static OTG_TIMER_TYPE OTG_Get_TimerType(void)
+{
+ return g_OtgInfo.timer_type;
+}
+
+
+/************************************************************
+ state machine functions
+*************************************************************/
+
+/* Go from Vbus error */
+static void OTG_Process_A_Vbus_Fail(void)
+{
+ g_OtgInfo.otg_state = OTG_STATE_A_WAIT_VFALL;
+
+ /* Turn off VBUS "auto" */
+ USB_HCD_VBusEnable(0, KAL_FALSE);
+
+ if(g_OtgInfo.host_up == KAL_TRUE)
+ {
+ g_OtgInfo.host_up = KAL_FALSE;
+ g_OtgInfo.a_host_stop_hdlr();
+ g_OtgInfo.host_down_hdlr();
+ }
+
+ if(g_OtgInfo.device_up == KAL_TRUE)
+ {
+ g_OtgInfo.device_up = KAL_FALSE;
+ g_OtgInfo.device_down_hdlr();
+ }
+
+ if(g_OtgInfo.a_process_hnp == KAL_TRUE)
+ {
+// ASSERT(0);
+ g_OtgInfo.a_process_hnp = KAL_FALSE;
+ /* OTG_A_HNP_Fail_Hdlr(void) */
+ /* OTG_Display_Message(OTG_DISPLAY_MSG_HNP_STOP); */
+ g_OtgInfo.a_hnp_fail_hdlr();
+ }
+ else
+ {
+ /* device draws too much current */
+ /* void OTG_A_VRise_Fail_Hdlr(void) */
+ /* OTG_Display_Message(OTG_DISPLAY_MSG_UN_SUPPORT); */
+ g_OtgInfo.a_vrise_fail_hdlr();
+ }
+
+ OTG_Start_Timer(OTG_TIMER_A_CHECK_VFALL, TA_CHECK_VFALL);
+ OTG_Process_A_Wait_VFall();
+}
+
+
+static void OTG_Process_A_Idle(void)
+{
+ if(OTG_Get_Plug_Type() == OTG_PLUG_B)
+ {
+ // A cable plug out, A device return to A_ldle, then gp to B_idle
+ // from OTG_Process_A_Wait_VFall
+ g_OtgInfo.otg_state = OTG_STATE_B_IDLE;
+ OTG_Process_B_Idle();
+ return;
+ }
+
+ /* A detect SRP */
+ if(g_OtgInfo.a_detect_b_data_pls == KAL_TRUE)
+ {
+ g_OtgInfo.a_detect_b_data_pls = KAL_FALSE;
+#ifdef OTG_A_NOT_INSERTION_BASE
+ g_OtgInfo.a_bus_req = KAL_TRUE;
+#endif
+ }
+#ifdef OTG_A_NOT_INSERTION_BASE
+/*
+ else if(OTG_Is_TimerOut(OTG_TIMER_A_ATTATCH_DEBOUNCE) == KAL_TRUE)
+ {
+ OTG_Stop_Timer();
+
+ if(g_OtgInfo.host_up == KAL_FALSE)
+ {
+ g_OtgInfo.host_up = KAL_TRUE;
+ g_OtgInfo.host_up_hdlr();
+ }
+ }
+ else if(g_OtgInfo.a_detect_b_resume == KAL_TRUE)
+ {
+ // compliance test
+ // deassert resume
+ g_OtgInfo.a_detect_b_resume = KAL_FALSE;
+
+ ASSERT(0);
+// USB_DRV_SetBits8(USB_POWER, USB_POWER_RESUME);
+// OTG_Start_Timer(OTG_TIMER_A_RESUME, TA_RESUME);
+ }
+*/
+
+ USB_DRV_WriteReg8(USB_INTRUSBE, USB_INTRUSBE_SESSREQ);
+#endif
+
+ if(g_OtgInfo.a_bus_req == KAL_TRUE)
+ {
+ /* In case go here and SRP timer is still on*/
+ OTG_Stop_Timer();
+
+ /* If device is up, pull it down */
+ if(g_OtgInfo.device_up == KAL_TRUE)
+ {
+ /* For 1. B in 2. A in 3. B out case */
+ g_OtgInfo.device_up = KAL_FALSE;
+ g_OtgInfo.device_down_hdlr();
+ }
+
+ /* Software reset */
+#if defined(DRV_USB_IP_V3)
+ USB_DRV_WriteReg(USB_SWRST, USB_SWRST_DISUSBRESET);
+#elif defined(DRV_USB_IP_V4)
+ USB_DRV_SetBits(USB_BUSPERF3, USB_BUSPERF3_DISUSBRESET);
+#endif
+
+
+ /* Enable system interrupts, but disable all ep interrupts */
+ USB_EnSysIntr();
+
+ USB_Dbg_Trace(USB_OTG_STATE_FROM_A_IDLE_TO_A_WAIT_BCON, 0, 0);
+ /* Turn on VBUS, and wait B connect or VBUS error */
+ g_OtgInfo.otg_state = OTG_STATE_A_WAIT_BCON;
+
+#ifdef __OTG_A_PERIODIC_VBUS_CYCLE__
+ OTG_Start_Timer(OTG_TIMER_A_VBUS_PERIOD_VON, TA_VBUS_PERIOD_VON);
+#endif
+
+ USB_HCD_VBusEnable(0, KAL_TRUE);
+
+ if(g_OtgInfo.host_up == KAL_FALSE)
+ {
+ g_OtgInfo.host_up = KAL_TRUE;
+ g_OtgInfo.host_up_hdlr();
+ }
+ }
+#ifdef OTG_A_NOT_INSERTION_BASE
+/*
+ else
+ {
+ // for compliance test
+ // start timer to debounce attatch
+ if(g_OtgInfo.host_up == KAL_FALSE)
+ {
+ OTG_Start_Timer(OTG_TIMER_A_ATTATCH_DEBOUNCE, TA_ATTATCH_DEBOUNCE);
+ }
+ }
+*/
+#endif
+}
+
+
+static void OTG_Process_A_Wait_BCon(void)
+{
+ if (g_OtgInfo.a_detect_b_conn == KAL_TRUE)
+ {
+#ifdef __OTG_A_PERIODIC_VBUS_CYCLE__
+ OTG_Stop_Timer();
+#endif
+ USB_Dbg_Trace(USB_OTG_STATE_FROM_A_WAIT_BCON_TO_A_HOST, 0, 0);
+ g_OtgInfo.otg_state = OTG_STATE_A_HOST;
+ }
+ else if(OTG_Get_TimerType() == OTG_TIMER_A_RESUME)
+ {
+// ASSERT(0);
+ OTG_Stop_Timer();
+ USB_DRV_ClearBits8(USB_POWER, USB_POWER_RESUME);
+ }
+#ifdef __OTG_A_PERIODIC_VBUS_CYCLE__
+ else if(OTG_Is_TimerOut(OTG_TIMER_A_VBUS_PERIOD_VON) == KAL_TRUE)
+ {
+ OTG_Stop_Timer();
+ USB_Dbg_Trace(USB_OTG_STATE_A_WAIT_BCON_TURN_OFF_VBUS, 0, 0);
+
+ g_OtgInfo.otg_state = OTG_STATE_A_WAIT_VFALL;
+
+ /* Turn off VBUS */
+ USB_HCD_VBusEnable(0, KAL_FALSE);
+
+ if(g_OtgInfo.host_up == KAL_TRUE)
+ {
+ g_OtgInfo.host_up = KAL_FALSE;
+ g_OtgInfo.a_host_stop_hdlr();
+ g_OtgInfo.host_down_hdlr();
+ }
+
+ OTG_Start_Timer(OTG_TIMER_A_VBUS_PERIOD_VFALL, TA_VBUS_PERIOD_VFALL);
+ }
+#endif
+#ifdef OTG_A_NOT_INSERTION_BASE
+/*
+ else if(OTG_Is_TimerOut(OTG_TIMER_A_WAIT_BCON) == KAL_TRUE)
+ {
+ OTG_Stop_Timer();
+ g_OtgInfo.a_bus_req=KAL_FALSE;
+ g_OtgInfo.otg_state = OTG_STATE_A_WAIT_VFALL;
+ USB_DRV_SetBits8(USB_POWER, USB_POWER_SUSPENDMODE);
+ // Turn off VBUS
+ USB_DRV_ClearBits8(OTG_CTRL, OTG_CTL_VBUS_ON);
+
+ g_OtgInfo.a_no_response_hdlr();
+
+ OTG_Start_Timer(OTG_TIMER_A_CHECK_VFALL, TA_CHECK_VFALL);
+ OTG_Process_A_Wait_VFall();
+ }
+
+ if(g_OtgInfo.otg_state == OTG_STATE_A_WAIT_BCON)
+ {
+ if(OTG_Is_TimerActive() == KAL_TRUE)
+ {
+ if(OTG_Get_TimerType() != OTG_TIMER_NONE)
+ {
+ OTG_Stop_Timer();
+ OTG_Start_Timer(OTG_TIMER_A_WAIT_BCON, TA_WAIT_BCON);
+ }
+ else
+ {
+ ASSERT(0);
+ }
+ }
+ else
+ {
+// OTG_Stop_Timer();
+ OTG_Start_Timer(OTG_TIMER_A_WAIT_BCON, TA_WAIT_BCON);
+ }
+ }
+*/
+#endif
+}
+
+
+static void OTG_Process_A_Host(void)
+{
+#ifdef OTG_A_NOT_INSERTION_BASE
+/*
+ if(OTG_Get_TimerType() == OTG_TIMER_A_WAIT_BCON)
+ {
+ OTG_Stop_Timer();
+ }
+*/
+#endif
+
+ /*
+ ** If mini B plug is removed RESET (DETACH) interrupt will
+ ** happen on A-Device.The DETACH will processed by the host
+ ** ISR and set a_detect_b_conn to FALSE
+ */
+ if((g_OtgInfo.a_detect_b_conn == KAL_FALSE)&&(g_OtgInfo.a_detect_b_resume ==KAL_FALSE))
+ {
+ USB_Dbg_Trace(USB_OTG_STATE_FROM_A_HOST_TO_A_WAIT_BCON, 0, 0);
+ g_OtgInfo.otg_state = OTG_STATE_A_WAIT_BCON;
+
+ g_OtgInfo.a_host_stop_hdlr();
+
+ /* When A device detect conn and disconn intr at the same time, always turn off Vbus and then turn on Vbus */
+ if(g_OtgInfo.disconn_and_conn_intr == KAL_TRUE)
+ {
+ g_OtgInfo.disconn_and_conn_intr = KAL_FALSE;
+
+ USB_Dbg_Trace(USB_OTG_STATE_A_WAIT_BCON_TURN_OFF_VBUS, 0, 0);
+
+ g_OtgInfo.otg_state = OTG_STATE_A_WAIT_VFALL;
+
+ /* Turn off VBUS*/
+ USB_HCD_VBusEnable(0, KAL_FALSE);
+
+ if(g_OtgInfo.host_up == KAL_TRUE)
+ {
+ g_OtgInfo.host_up = KAL_FALSE;
+ g_OtgInfo.host_down_hdlr();
+ }
+
+ OTG_Start_Timer(OTG_TIMER_A_VBUS_PERIOD_VFALL, TA_VBUS_PERIOD_VFALL);
+ }
+#ifdef __OTG_A_PERIODIC_VBUS_CYCLE__
+ else if(g_OtgInfo.a_bus_req == KAL_TRUE)
+ {
+ /* When A cable out, wait a moment and then turn off Vbus */
+ OTG_Start_Timer(OTG_TIMER_A_VBUS_PERIOD_VON, TA_VBUS_PERIOD_VON);
+ }
+#endif
+
+#ifdef OTG_A_NOT_INSERTION_BASE
+ USB_Dbg_Trace(USB_OTG_STATE_A_WAIT_BCON_TURN_OFF_VBUS, 0, 0);
+
+ g_OtgInfo.otg_state = OTG_STATE_A_WAIT_VFALL;
+
+ /* Turn off VBUS */
+ USB_HCD_VBusEnable(0, KAL_FALSE);
+
+ if(g_OtgInfo.host_up == KAL_TRUE)
+ {
+ g_OtgInfo.host_up = KAL_FALSE;
+ g_OtgInfo.host_down_hdlr();
+ }
+#endif
+ }
+ /************ Starting HNP **************************************
+ ** When the A-device is in the a_host state and has set the dual-role
+ ** B-device's HNP enable bit (b_hnp_enable = TRUE ie, a_suspend_req
+ ** = TRUE) the A-device shall place the connection to the B-device into
+ ** Suspend when it is finished using the bus. We can go to the
+ ** suspend state also if user want to power down.
+ */
+ else if((g_OtgInfo.a_set_b_hnp_enable == KAL_TRUE)&&(g_OtgInfo.a_detect_b_resume ==KAL_FALSE))
+ {
+ USB_Dbg_Trace(USB_OTG_STATE_FROM_A_HOST_TO_A_SUSPEND, 0, 0);
+ g_OtgInfo.otg_state = OTG_STATE_A_SUSPEND;
+ USB_DRV_SetBits8(USB_POWER, (USB_POWER_SUSPENDMODE|USB_POWER_SOFTCONN));
+
+ /* When A idle, B can decide to enter HNP process more than 200ms */
+// OTG_Start_Timer(OTG_TIMER_A_IDLE_BDIS, TA_AIDL_BDIS);
+
+ g_OtgInfo.a_process_hnp = KAL_TRUE;
+ }
+ /* A request to suspend the bus */
+ else if(g_OtgInfo.a_suspend_req == KAL_TRUE)
+ {
+ USB_Dbg_Trace(USB_OTG_STATE_FROM_A_HOST_TO_A_SUSPEND, 0, 0);
+ g_OtgInfo.otg_state = OTG_STATE_A_SUSPEND;
+ USB_DRV_SetBits8(USB_POWER, USB_POWER_SUSPENDMODE);
+ g_OtgInfo.a_suspend_req = KAL_FALSE;
+ }
+ /* This may be because B device is not supported by this A device */
+ else if(g_OtgInfo.a_bus_req == KAL_FALSE)
+ {
+ g_OtgInfo.otg_state = OTG_STATE_A_WAIT_VFALL;
+
+ USB_DRV_SetBits8(USB_POWER, USB_POWER_SUSPENDMODE);
+
+ /* Turn off VBUS*/
+ USB_HCD_VBusEnable(0, KAL_FALSE);
+
+ USB_DRV_ClearBits8(USB_INTRUSBE, USB_INTRUSBE_SESSREQ);
+
+ if(g_OtgInfo.host_up == KAL_TRUE)
+ {
+ g_OtgInfo.host_up = KAL_FALSE;
+ g_OtgInfo.a_host_stop_hdlr();
+ g_OtgInfo.host_down_hdlr();
+ }
+
+ if(g_OtgInfo.device_up == KAL_TRUE)
+ {
+ g_OtgInfo.device_up = KAL_FALSE;
+ g_OtgInfo.device_down_hdlr();
+ }
+
+ OTG_Start_Timer(OTG_TIMER_A_CHECK_VFALL, TA_CHECK_VFALL);
+ OTG_Process_A_Wait_VFall();
+ }
+ else if(OTG_Is_TimerOut(OTG_TIMER_A_RESUME) == KAL_TRUE)
+ {
+ /* host resume 20ms timeout */
+ OTG_Stop_Timer();
+ USB_DRV_ClearBits8(USB_POWER, USB_POWER_RESUME);
+ }
+}
+
+
+static void OTG_Process_A_Suspend(void)
+{
+ /* HNP failed */
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+ /* a_detect_b_conn = FALSE if a disconn interrupt happens and it will set by
+ ** the application; a_set_b_hnp_en is false as default and set to
+ ** if the request is not stalled
+ */
+ if((g_OtgInfo.a_detect_b_conn == KAL_FALSE)&&(g_OtgInfo.a_set_b_hnp_enable == KAL_FALSE))
+ {
+ USB_Dbg_Trace(USB_OTG_STATE_FROM_A_SUSPEND_TO_A_WAIT_BCON, 0, 0);
+ g_OtgInfo.otg_state = OTG_STATE_A_WAIT_BCON;
+ }
+ /*
+ ** If the B-device disconnects after the bus has been suspended,
+ ** then this is an indication that the B-device is attempting
+ ** to become Host. When the A-device detects the disconnect
+ ** from the B-device, it shall turn on its D+ pull-up resistor
+ ** within 3 ms (TA_BDIS_ACON max) to acknowledge
+ ** the request from the B-device.
+ */
+ else if((g_OtgInfo.a_detect_b_conn == KAL_FALSE)&&(g_OtgInfo.a_set_b_hnp_enable==KAL_TRUE))
+ {
+ /* Must execute within 3ms */
+ /* stop OTG_TIMER_A_IDLE_BDIS timer */
+// OTG_Stop_Timer();
+
+ /* start up device */
+ if((g_OtgInfo.host_up == KAL_FALSE)||(g_OtgInfo.device_up == KAL_TRUE))
+ EXT_ASSERT(0, (kal_uint32)g_OtgInfo.host_up, (kal_uint32)g_OtgInfo.device_up, 0);
+
+ g_OtgInfo.host_up = KAL_FALSE;
+ g_OtgInfo.host_down_hdlr();
+ g_OtgInfo.device_up = KAL_TRUE;
+ g_OtgInfo.device_up_hdlr();
+
+ USB_Dbg_Trace(USB_OTG_STATE_FROM_A_SUSPEND_TO_A_PERIPHERAL, 0, 0);
+ g_OtgInfo.otg_state = OTG_STATE_A_PERIPHERAL;
+ g_OtgInfo.a_set_b_hnp_enable = KAL_FALSE;
+ g_OtgInfo.a_process_hnp = KAL_FALSE;
+ g_OtgInfo.a_hnp_stop_hdlr();
+ }
+ else if (g_OtgInfo.a_resume_req == KAL_TRUE)
+ {
+ /* stop OTG_TIMER_A_IDLE_BDIS timer */
+// OTG_Stop_Timer();
+
+ if(g_OtgInfo.a_process_hnp == KAL_TRUE)
+ {
+ g_OtgInfo.a_process_hnp = KAL_FALSE;
+ g_OtgInfo.a_hnp_fail_hdlr();
+ }
+
+ USB_Dbg_Trace(USB_OTG_STATE_FROM_A_SUSPEND_TO_A_HOST, 0, 0);
+ g_OtgInfo.otg_state = OTG_STATE_A_HOST;
+
+ USB_DRV_SetBits8(USB_POWER, USB_POWER_RESUME);
+ g_OtgInfo.a_resume_req = KAL_FALSE;
+ OTG_Start_Timer(OTG_TIMER_A_RESUME, TA_RESUME);
+ }
+ /* OPT remote wakeup */
+ else if(g_OtgInfo.a_detect_b_resume == KAL_TRUE)
+ {
+ /* A-host detect B-device send remote wakeup resume */
+
+ /* stop OTG_TIMER_A_IDLE_BDIS timer */
+// OTG_Stop_Timer();
+
+ g_OtgInfo.a_detect_b_resume = KAL_FALSE;
+
+ if(g_OtgInfo.a_process_hnp == KAL_TRUE)
+ {
+ g_OtgInfo.a_process_hnp = KAL_FALSE;
+ g_OtgInfo.a_hnp_fail_hdlr();
+ }
+
+ USB_Dbg_Trace(USB_OTG_STATE_FROM_A_SUSPEND_TO_A_HOST, 0, 0);
+ g_OtgInfo.otg_state = OTG_STATE_A_HOST;
+ g_OtgInfo.a_set_b_hnp_enable = KAL_FALSE;
+ USB_DRV_ClearBits8(USB_POWER, USB_POWER_SOFTCONN);
+ /* IP resume automatically, wait 20ms to clear resume bit */
+ OTG_Start_Timer(OTG_TIMER_A_RESUME, TA_RESUME);
+ }
+}
+
+
+static void OTG_Process_A_Peripheral(void)
+{
+ /* In the current design, do not allow host init again*/
+ /*
+ ** A-device detects lack of bus activity for more than 3 ms
+ ** (TA_BIDL_ADIS min) and turns off its D+ pull-up. Alternatively,
+ ** if the A-device has no further need to communicate with the
+ ** B-device, the A-device may turn off VBUS and end the session.
+ ** SUSPEND will be processed by the device ISR a_detect_b_suspend
+ ** variable will be set by the application
+ ** The following will be done when this happens:
+ **
+ ** - disconnect its pull up
+ ** - allow time for the data line to discharge
+ ** - check if the B-device has connected its pull up
+ */
+ if((g_OtgInfo.a_detect_b_suspend == KAL_TRUE)&&(OTG_Is_TimerActive() == KAL_FALSE))
+ {
+ g_OtgInfo.a_detect_b_suspend = KAL_FALSE;
+
+ /* start up host */
+ if((g_OtgInfo.device_up == KAL_FALSE)||(g_OtgInfo.host_up == KAL_TRUE))
+ EXT_ASSERT(0, (kal_uint32)g_OtgInfo.device_up, (kal_uint32)g_OtgInfo.host_up, 0);
+
+ g_OtgInfo.device_up = KAL_FALSE;
+ g_OtgInfo.device_down_hdlr();
+ g_OtgInfo.host_up = KAL_TRUE;
+ g_OtgInfo.host_up_hdlr();
+
+ /* Clear softconn bit */
+ USB_DRV_ClearBits8(USB_POWER, USB_POWER_SOFTCONN);
+
+ USB_Dbg_Trace(USB_OTG_STATE_FROM_A_PERIPHERAL_TO_A_WAIT_BCON, 0, 0);
+ g_OtgInfo.otg_state = OTG_STATE_A_WAIT_BCON;
+ }
+
+// official should be this , but not suitable for OPT test
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+}
+
+
+static void OTG_Process_A_Wait_VFall(void)
+{
+ if((OTG_Is_B_Session_Valid() == KAL_FALSE)
+ ||(OTG_Get_Plug_Type() == OTG_PLUG_B))
+ {
+ USB_Dbg_Trace(USB_OTG_STATE_FROM_A_WAIT_VFAIL_TO_A_IDLE, 0, 0);
+ g_OtgInfo.otg_state = OTG_STATE_A_IDLE;
+
+ #ifdef __OTG_A_PERIODIC_VBUS_CYCLE__
+ if(OTG_Get_TimerType() == OTG_TIMER_A_VBUS_PERIOD_VFALL)
+ g_OtgInfo.a_bus_req = KAL_TRUE;
+ else
+ g_OtgInfo.a_bus_req = KAL_FALSE;
+ #else
+ g_OtgInfo.a_bus_req = KAL_FALSE;
+ #endif
+ OTG_Stop_Timer();
+
+ /* In current design, conditions that may go here are
+ 1. B device draws too much current
+ 2. A device dose not recognize B device and B device dose not take HNP
+ 3. B device return from HNP host
+ */
+
+ /* Only set g_OtgInfo.b_is_vbus_power_on = KAL_FALSE when A cable is plugged out */
+
+ OTG_Process_A_Idle();
+ return;
+ }
+#ifdef OTG_A_NOT_INSERTION_BASE
+/*
+ else if(g_OtgInfo.a_detect_b_resume == KAL_TRUE)
+ {
+ // compliance test
+ // deassert resume
+ g_OtgInfo.a_detect_b_resume = KAL_FALSE;
+
+ ASSERT(0);
+// USB_DRV_SetBits8(USB_POWER, USB_POWER_RESUME);
+// OTG_Start_Timer(OTG_TIMER_A_RESUME, TA_RESUME);
+ }
+*/
+#endif
+
+ if(OTG_Is_TimerOut(OTG_TIMER_A_CHECK_VFALL) == KAL_TRUE)
+ {
+ OTG_Stop_Timer();
+ OTG_Start_Timer(OTG_TIMER_A_CHECK_VFALL, TA_CHECK_VFALL);
+ }
+}
+
+
+static void OTG_Process_B_Idle(void)
+{
+ /* Cable plugged out */
+ /* If host or device is up, pull it down*/
+ if(g_OtgInfo.host_up == KAL_TRUE)
+ {
+ g_OtgInfo.host_up = KAL_FALSE;
+ g_OtgInfo.host_down_hdlr();
+ }
+
+ if(g_OtgInfo.device_up == KAL_TRUE)
+ {
+ g_OtgInfo.device_up = KAL_FALSE;
+ g_OtgInfo.device_down_hdlr();
+ }
+
+ /*
+ ** When a B-device detects that the voltage on VBUS is greater
+ ** than the B-Device Session Valid threshold (VSESS_VLD),
+ ** then the B-device shall consider a session to be in progress.
+ ** After the VBUS voltage crosses this threshold, the B-device
+ ** shall assert either the D+ or D- data-line within 100 ms.
+ */
+ if(g_OtgInfo.b_session_valid == KAL_TRUE)
+ {
+ /* SRP succeed */
+ OTG_Process_B_Session_Valid();
+ }
+ else if(g_OtgInfo.b_srp_request == KAL_TRUE)
+ {
+ /* ********* Starting SRP *****************************************
+ ** When the B-device detects that VBUS has gone below its Session End
+ ** threshold and detects that both D+ and D- have been low (SE0) for
+ ** at least 2 ms (TB_SE0_SRP min), then any previous session on the
+ ** A-device is over and a new session may start. The B-device may
+ ** initiate the SRP any time the initial conditions of Section 5.3.2
+ ** are met.
+ */
+ /* Wait 2ms is used only to make sure that host detect disconnect */
+
+ /* Start the fail timer, OPT will wait 5s to vrise Vbus */
+ OTG_Start_Timer(OTG_TIMER_B_SRP_FAIL, TB_SRP_FAIL);
+ USB_DRV_SetBits8(USB_DEVCTL, USB_DEVCTL_SESSION);
+// kal_sleep_task(9);
+ kal_sleep_task(22);
+ USB_DRV_ClearBits8(USB_POWER, USB_POWER_SOFTCONN);
+
+ g_OtgInfo.otg_state = OTG_STATE_B_SRP_INIT;
+ }
+}
+
+
+static void OTG_Process_B_Session_Valid(void)
+{
+ /* Init device */
+ if(g_OtgInfo.device_up == KAL_TRUE)
+ EXT_ASSERT(0, (kal_uint32)g_OtgInfo.device_up, 0, 0);
+
+ g_OtgInfo.device_up = KAL_TRUE;
+
+ g_OtgInfo.otg_state = OTG_STATE_B_PERIPHERAL;
+ // because device up handler will enable interrupt, change state first
+
+ g_OtgInfo.device_up_hdlr();
+
+ g_OtgInfo.b_srp_request = KAL_FALSE;
+
+ USB_Dbg_Trace(USB_OTG_STATE_FROM_B_IDLE_TO_B_PERIPHERAL, 0, 0);
+// g_OtgInfo.otg_state = OTG_STATE_B_PERIPHERAL;
+}
+
+
+static void OTG_Process_B_SRP_Init(void)
+{
+ /*
+ ** When a B-device detects that the voltage on VBUS is greater than the
+ ** B-Device Session Valid threshold (VSESS_VLD), then the B-device
+ ** shall consider a session to be in progress. After the VBUS voltage
+ ** crosses this threshold, the B-device shall assert either the D+ or
+ ** D- data-line within 100 ms(TB_SVLD_BCON max).
+ */
+ if(g_OtgInfo.b_session_valid == KAL_TRUE)
+ {
+ /* This section is executed in USB EINT context */
+ /* SRP OK */
+ OTG_Stop_Timer();
+ /* OTG_B_SRP_Stop_Hdlr(void) */
+ /* OTG_Display_Message(OTG_DISPLAY_MSG_STOP_CONNECTING); */
+ g_OtgInfo.b_srp_stop_hdlr();
+ OTG_Process_B_Session_Valid();
+ }
+ else if (OTG_Is_TimerOut(OTG_TIMER_B_SRP_FAIL) == KAL_TRUE)
+ {
+ /*
+ ** The error call back have the following requirement:
+ ** After initiating SRP, the B-device is required to wait at least
+ ** 5 seconds (TB_TB_SRP_FAIL min) for the A-device to respond,
+ ** before informing the user that the communication attempt
+ ** has failed.
+ **
+ */
+
+ /* SRP fail */
+ OTG_Stop_Timer();
+
+ g_OtgInfo.b_srp_request = KAL_FALSE;
+ g_OtgInfo.otg_state = OTG_STATE_B_IDLE;
+
+ /* OTG_B_SRP_Fail_Hdlr(void) */
+ /* OTG_Display_Message(OTG_DISPLAY_MSG_NO_RESPONSE); */
+ g_OtgInfo.b_srp_fail_hdlr();
+
+ OTG_Process_B_Idle();
+ }
+}
+
+
+static void OTG_Process_B_Peripheral(void)
+{
+ /* b_detect_a_suspend will be processed by the DEVICE ISR */
+ /*
+ ** B-device detects that bus is idle for more than 4 ms
+ ** (TB_AIDL_BDIS min) and begins HNP by turning off pull-up on D+.
+ ** This allows the bus to discharge to the SE0 state.
+ ** The following will be done when this happens:
+ **
+ ** disconnect its pull up
+ ** allow time for the data line to discharge
+ ** check if the A-device has connected its pull up
+ */
+ if((g_OtgInfo.b_hnp_enable == KAL_TRUE)&&(g_OtgInfo.b_detect_a_suspend == KAL_TRUE))
+ {
+// OTG_Stop_Timer();
+// USB_DRV_WriteReg8(USB_INTRUSBE, 0xFF);
+
+ g_OtgInfo.b_detect_a_suspend = KAL_FALSE;
+
+ /* Start up host */
+ if((g_OtgInfo.device_up == KAL_FALSE) ||(g_OtgInfo.host_up == KAL_TRUE))
+ EXT_ASSERT(0, (kal_uint32)g_OtgInfo.device_up, (kal_uint32)g_OtgInfo.host_up, 0);
+
+ /* To prevent a case that A-device suspend but it does not do HNP correctly, so B-device must go back to peripheral */
+ /* In this case, we do not want to UEM see cable in/out event */
+ g_OtgInfo.device_up = KAL_FALSE;
+ /* Do not execute device_down_hdlr yet */
+// g_OtgInfo.device_down_hdlr();
+ g_OtgInfo.b_device_down_pending = KAL_TRUE;
+ USB_Dbg_Trace(USB_OTG_B_DEVICE_PENDING_DOWN_HDLR, 0, 1);
+
+ g_OtgInfo.host_up = KAL_TRUE;
+ g_OtgInfo.host_up_hdlr();
+
+ USB_Dbg_Trace(USB_OTG_STATE_FROM_B_PERIPHERAL_TO_B_WAIT_ACON, 0, 0);
+ g_OtgInfo.otg_state = OTG_STATE_B_WAIT_ACON;
+
+ if(g_OtgInfo.suspend_and_conn_intr == KAL_FALSE)
+ {
+ // Start timer to check if A resume
+ OTG_Start_Timer(OTG_TIMER_B_CHECK_A_RESUME, TB_CHECK_A_RESUME);
+ }
+ }
+}
+
+
+static void OTG_Process_B_Wait_ACon(void)
+{
+ /*
+ ** After waiting long enough to insure that the D+ line
+ ** cannot be high due to the residual effect of the B-device
+ ** pull-up,(see Section 5.1.9), the B-device sees that the
+ ** D+ line is high and D- low, (i.e. J state). This indicates
+ ** that the A-device has recognized the HNP request from the
+ ** B-device. At this point, the B-device becomes Host and
+ ** asserts bus reset to start using the bus. The B-device
+ ** must assert the bus reset (SE0) within 1 ms (TB_ACON_BSE0 max)
+ ** of the time that the A-device turns on its
+ ** pull-up.
+ */
+ /* After A connect interrupt, B host must reset within 1ms */
+ /* Conn will be processed by the USB_HCD_HISR */
+ if(g_OtgInfo.b_detect_a_conn == KAL_TRUE)
+ {
+ OTG_Stop_Timer();
+
+ /* Execute device_down_hdlr when B device become host */
+ if(g_OtgInfo.b_device_down_pending == KAL_TRUE)
+ {
+ g_OtgInfo.b_device_down_pending = KAL_FALSE;
+ g_OtgInfo.device_down_hdlr();
+ USB_Dbg_Trace(USB_OTG_B_DEVICE_PENDING_DOWN_HDLR, 0, 2);
+ }
+
+ g_OtgInfo.b_suspend_req = KAL_FALSE;
+ g_OtgInfo.b_hnp_enable = KAL_FALSE;
+// USB_DRV_ClearBits8(USB_DEVCTL, USB_DEVCTL_HOSTREQ);
+ USB_DRV_ClearBits8(USB_POWER, USB_POWER_SOFTCONN);
+
+ USB_Dbg_Trace(USB_OTG_STATE_FROM_B_WAIT_ACON_TO_B_HOST, 0, 0);
+ g_OtgInfo.otg_state = OTG_STATE_B_HOST;
+ }
+ /*
+ ** While waiting in the b_wait_acon state, the B-device
+ ** may detect a K state on the bus. This indicates that the
+ ** A-device is signaling a resume condition and is retaining
+ ** control of the bus. In this case, the B-device will return
+ ** to the b_peripheral state.
+ */
+ /*
+ ** If the B-device at any time detects more than 3.125 ms of SE0
+ ** (TB_ASE0_BRST min), then this is an indication that the
+ ** A-device is remaining Host and is resetting the bus. In this
+ ** case the B-device shall return to the b_peripheral state
+ ** and start to process the bus reset before TB_ASE0_BRST max.
+ */
+ /*
+ ** b_detect_a_resume will be set by the host ISR when K state is
+ ** detected if (b_detect_a_resume || b_ase0_brst_tmr)
+ */
+ else if (OTG_Is_TimerOut(OTG_TIMER_B_CHECK_A_RESUME) == KAL_TRUE)
+ {
+ /* Stop the timer */
+ OTG_Stop_Timer();
+
+ // Start timer to wait A to connect
+ OTG_Start_Timer(OTG_TIMER_B_ASE0_BRST, TB_ASE0_BRST);
+ }
+ else if ((g_OtgInfo.b_detect_a_resume == KAL_TRUE)||(g_OtgInfo.b_detect_a_reset == KAL_TRUE)||(OTG_Is_TimerOut(OTG_TIMER_B_ASE0_BRST) == KAL_TRUE))
+ {
+ /* A suspend and then resume */
+ g_OtgInfo.b_detect_a_resume = KAL_FALSE;
+ /* A suspend and then reset */
+ g_OtgInfo.b_detect_a_reset = KAL_FALSE;
+ g_OtgInfo.b_hnp_enable = KAL_FALSE;
+
+ /* HNP fail, this is caused by A-device does not pull up D+ */
+ /***********************************************************
+ OPT test 5.8 and 5.9 require that we must display a message
+ when a HNP fails. This event should allow the application
+ to know that HNP failed with Host.
+ ***********************************************************/
+ if(OTG_Is_TimerOut(OTG_TIMER_B_ASE0_BRST) == KAL_TRUE)
+ {
+ /* time out */
+ /* OTG_B_HNP_Fail_Hdlr(void) */
+ /* OTG_Display_Message(OTG_DISPLAY_MSG_NO_RESPONSE); */
+ g_OtgInfo.b_hnp_fail_hdlr();
+ #ifndef __OTG_SRP_HNP_APP_FIXED__
+ /* If cable quality is very bad, we try to use full speed */
+ USB_DRV_ClearBits8(USB_POWER, USB_POWER_HSENAB);
+ #endif
+ }
+
+ /* Stop the timer */
+ OTG_Stop_Timer();
+
+ /* Start up device */
+ if((g_OtgInfo.host_up == KAL_FALSE)||(g_OtgInfo.device_up == KAL_TRUE))
+ EXT_ASSERT(0, (kal_uint32)g_OtgInfo.host_up, (kal_uint32)g_OtgInfo.device_up, 0);
+
+ g_OtgInfo.host_up = KAL_FALSE;
+ g_OtgInfo.host_down_hdlr();
+
+ g_OtgInfo.device_up = KAL_TRUE;
+
+ if(g_OtgInfo.b_device_down_pending == KAL_TRUE)
+ {
+ g_OtgInfo.b_device_down_pending = KAL_FALSE;
+ USB_Dbg_Trace(USB_OTG_B_DEVICE_PENDING_DOWN_HDLR, 0, 3);
+ }
+ else
+ {
+ g_OtgInfo.device_up_hdlr();
+ }
+
+ /* Clear this bit make DP re-connect */
+ USB_DRV_ClearBits8(USB_DEVCTL, USB_DEVCTL_HOSTREQ);
+
+ USB_Dbg_Trace(USB_OTG_STATE_FROM_B_WAIT_ACON_TO_B_PERIPHERAL, 0, 0);
+ g_OtgInfo.otg_state = OTG_STATE_B_PERIPHERAL;
+ }
+}
+
+
+static void OTG_Process_B_Host(void)
+{
+ /* HNP phase 2, B transfer from host to peripheral, or A peripheral want to disconnect */
+ if((g_OtgInfo.b_suspend_req == KAL_TRUE)||(g_OtgInfo.b_detect_a_conn == KAL_FALSE))
+ {
+ /* Start up device */
+ if((g_OtgInfo.host_up == KAL_FALSE)||(g_OtgInfo.device_up == KAL_TRUE))
+ EXT_ASSERT(0, (kal_uint32)g_OtgInfo.host_up, (kal_uint32)g_OtgInfo.device_up, 0);
+
+ g_OtgInfo.host_up = KAL_FALSE;
+ g_OtgInfo.host_down_hdlr();
+
+ /* Set suspend */
+ if(g_OtgInfo.b_suspend_req == KAL_TRUE)
+ {
+ USB_DRV_SetBits8(USB_POWER, USB_POWER_SUSPENDMODE);
+ }
+
+ g_OtgInfo.device_up = KAL_TRUE;
+ g_OtgInfo.device_up_hdlr();
+
+ USB_Dbg_Trace(USB_OTG_STATE_FROM_B_HOST_TO_B_PERIPHERAL, USB_DRV_Reg8(USB_POWER), 3);
+ g_OtgInfo.otg_state = OTG_STATE_B_PERIPHERAL;
+ }
+}
+
+
+
+
+
+static void OTG_State_Machine(void)
+{
+ static kal_bool b_processing = KAL_FALSE;
+
+
+ if(b_processing == KAL_TRUE)
+ ASSERT(0);
+
+ b_processing = KAL_TRUE;
+
+ switch(g_OtgInfo.otg_state)
+ {
+ case OTG_STATE_START:
+ USB_Dbg_Trace(USB_OTG_STATE_START, 0, 0);
+ if(OTG_Get_Plug_Type() == OTG_PLUG_B)
+ {
+ g_OtgInfo.otg_state = OTG_STATE_B_IDLE;
+ OTG_Process_B_Idle();
+ }
+ else
+ {
+ /* ID is false when A device is identified */
+ #ifdef OTG_A_NOT_INSERTION_BASE
+ /* for SRP compliance test */
+ /* When mini a plug in, turn on VBUS only after SPR */
+ g_OtgInfo.a_bus_req = KAL_FALSE;
+ #else
+ g_OtgInfo.a_bus_req = KAL_TRUE;
+ #endif
+ g_OtgInfo.otg_state = OTG_STATE_A_IDLE;
+ OTG_Process_A_Idle();
+ }
+ break;
+ case OTG_STATE_A_IDLE:
+ USB_Dbg_Trace(USB_OTG_STATE_A_IDLE, 0, 0);
+ OTG_Process_A_Idle();
+ break;
+ case OTG_STATE_A_WAIT_BCON:
+ USB_Dbg_Trace(USB_OTG_STATE_A_WAIT_BCON, (kal_uint32)g_OtgInfo.a_detect_b_conn, 0);
+ OTG_Process_A_Wait_BCon();
+ break;
+ case OTG_STATE_A_HOST:
+ USB_Dbg_Trace(USB_OTG_STATE_A_HOST, 0, 0);
+ OTG_Process_A_Host();
+ break;
+ case OTG_STATE_A_SUSPEND:
+ USB_Dbg_Trace(USB_OTG_STATE_A_SUSPEND, 0, 0);
+ OTG_Process_A_Suspend();
+ break;
+ case OTG_STATE_A_PERIPHERAL:
+ USB_Dbg_Trace(USB_OTG_STATE_A_PERIPHERALE, (kal_uint32)g_OtgInfo.a_detect_b_suspend, 0);
+ OTG_Process_A_Peripheral();
+ break;
+ case OTG_STATE_A_WAIT_VFALL:
+ USB_Dbg_Trace(USB_OTG_STATE_A_WAIT_VFALL, 0, 0);
+ OTG_Process_A_Wait_VFall();
+ break;
+ case OTG_STATE_B_IDLE:
+ USB_Dbg_Trace(USB_OTG_STATE_B_IDLE, 0, 0);
+ OTG_Process_B_Idle();
+ break;
+ case OTG_STATE_B_SRP_INIT:
+ USB_Dbg_Trace(USB_OTG_STATE_B_SRP_INIT, 0, 0);
+ OTG_Process_B_SRP_Init();
+ break;
+ case OTG_STATE_B_PERIPHERAL:
+ USB_Dbg_Trace(USB_OTG_STATE_B_PERIPHERAL, (kal_uint32)g_OtgInfo.b_hnp_enable, (kal_uint32)g_OtgInfo.b_detect_a_suspend);
+ OTG_Process_B_Peripheral();
+ break;
+ case OTG_STATE_B_WAIT_ACON:
+ USB_Dbg_Trace(USB_OTG_STATE_B_WAIT_ACON, (kal_uint32)g_OtgInfo.b_detect_a_conn, 0);
+ OTG_Process_B_Wait_ACon();
+ break;
+ case OTG_STATE_B_HOST:
+ USB_Dbg_Trace(USB_OTG_STATE_B_HOST, (kal_uint32)g_OtgInfo.b_suspend_req, (kal_uint32)g_OtgInfo.b_detect_a_conn);
+ OTG_Process_B_Host();
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+
+ b_processing = KAL_FALSE;
+}
+
+
+
+
+/************************************************************
+ HISR/LISR interrupt handler
+*************************************************************/
+void OTG_Set_Intr()
+{
+ volatile kal_uint8 IntrUSB;
+
+ IntrUSB = USB_DRV_Reg8(USB_INTRUSB);
+ g_OtgInfo.otg_intr_status = IntrUSB;
+}
+
+
+
+
+static void OTGDMA_HISR(void)
+{
+ kal_uint8 DMAIntr;
+ kal_uint32 index;
+
+
+#if defined(DRV_USB_IP_V3)
+ DMAIntr = USB_DRV_Reg8(USB_DMAINTR);
+#elif defined(DRV_USB_IP_V4)
+ DMAIntr = USB_DRV_Reg8(USB_DMA_INTR_STATUS);
+#endif
+
+
+ while(DMAIntr != 0)
+ {
+ for(index = 0; index < MAX_DMA_NUM; index++)
+ {
+ if((DMAIntr&(1<<index)) != 0)
+ {
+#if defined(DRV_USB_IP_V3)
+ // write 0 clear first, then do call back function, order is very important !!!
+ USB_DRV_WriteReg8(USB_DMAINTR, ~(0x01<<index));
+#elif defined(DRV_USB_IP_V4)
+ // write 1 clear first, then do call back function, order is very important !!!
+ USB_DRV_WriteReg8(USB_DMA_INTR_STATUS, (0x01<<index));
+#endif
+ if ((USB_HCD_DMA_Get_Run_Status(0, index+1) == KAL_TRUE)||(g_UsbDrvInfo.dma_running[index] == KAL_TRUE))
+ {
+ // cannot be host & device at the same time
+ if ((USB_HCD_DMA_Get_Run_Status(0, index+1) == KAL_TRUE)&&(g_UsbDrvInfo.dma_running[index] == KAL_TRUE))
+ ASSERT(0);
+
+ /* DMA channel index+1 have interrupt */
+ if(USB_DRV_Reg32(USB_DMA_REALCNT(index+1)) != 0)
+ {
+ if(USB_HCD_DMA_Get_Run_Status(0, index+1) == KAL_TRUE)
+ {
+ USB_HCD_DMA_Callback(0, index+1);
+ }
+ else if(g_UsbDrvInfo.dma_running[index] == KAL_TRUE)
+ {
+ USB_DMA_Callback(index+1);
+ }
+ }
+ else
+ {
+ if(USB_Check_DMA_Time_Out(index+1) == KAL_TRUE)
+ {
+ if(USB_HCD_DMA_Get_Run_Status(0, index+1) == KAL_TRUE)
+ {
+ USB_HCD_DMA_Callback(0, index+1);
+ }
+ else if(g_UsbDrvInfo.dma_running[index] == KAL_TRUE)
+ {
+ USB_DMA_Callback(index+1);
+ }
+ }
+ else
+ {
+ drv_trace4(TRACE_FUNC, (kal_uint32)USB_OTG_DMA_STATUS, USB_DRV_Reg32(USB_DMA_REALCNT(index+1)),USB_DRV_Reg32(USB_DMACNT(index+1)), USB_HCD_DMA_Get_Run_Status(0, index+1), g_UsbDrvInfo.dma_running[index]);
+// ASSERT(0);
+ }
+ // DMA timer time out
+
+ /*
+ if(index == 0)
+ {
+ // set address
+ USB_DMA_Callback(index+1);
+ }
+ else
+ {
+ USB_DRV_SetBits(USB_DMACNTL(index+1), USB_DMACNTL_DMAEN);
+ }
+ */
+ }
+ }
+ }
+ }
+
+ /* Read register again to see if any interrupt is generated again */
+ /* if ping pong buffer serve done, then we do call back function here */
+#if defined(DRV_USB_IP_V3)
+ DMAIntr = USB_DRV_Reg8(USB_DMAINTR);
+#elif defined(DRV_USB_IP_V4)
+ DMAIntr = USB_DRV_Reg8(USB_DMA_INTR_STATUS);
+#endif
+
+ }
+
+#if defined(DRV_USB_IP_V3)
+ IRQClearInt(IRQ_USBDMA_CODE);
+ IRQUnmask(IRQ_USBDMA_CODE);
+#endif
+}
+
+
+
+
+
+#if defined(DRV_USB_IP_V4)
+
+static void OTGDMAQ_HISR(void)
+{
+ volatile kal_uint32 DMAQIntr;
+ static kal_uint32 temp;
+ kal_uint32 index;
+ kal_uint8 ep_num;
+
+ DMAQIntr = DRV_Reg32(USB_DMAQ_QISAR);
+
+ while(DMAQIntr != 0)
+ {
+ DRV_WriteReg32(USB_DMAQ_QISAR, DMAQIntr); //write 1 clear
+
+ for (index = 0; index < DMAQ_MAX_NUMBERS; index++)
+ {
+ ep_num = index + 1; // DMAQ 0 mapping to EP 1 , DMAQ 1 mapping to EP 2
+
+ if (DMAQIntr & USB_DMAQ_QISAR_TXQ_EMPYT_INT) // can check DMAQ Activate bit
+ {
+ DRV_WriteReg32(USB_DMAQ_TQEMIR,DRV_Reg32(USB_DMAQ_TQEMIR));
+ }
+
+ if (DMAQIntr & USB_DMAQ_QISAR_RXQ_EMPTY_INT) // can check DMAQ Activate bit
+ {
+ DRV_WriteReg32(USB_DMAQ_RQEMIR,DRV_Reg32(USB_DMAQ_RQEMIR));
+ }
+
+ if (DMAQIntr & USB_DMAQ_QISAR_RXQ_ERR_INT)
+ {
+ if (DRV_Reg32(USB_DMAQ_RQEIR) & (USB_DMAQ_QIMCR0 << index))
+ {
+ ASSERT(0); // Error handler
+ DRV_WriteReg32(USB_DMAQ_RQEIR, DRV_Reg32(USB_DMAQ_RQEIR)); //write 1 clear
+ }
+ }
+
+ if (DMAQIntr & USB_DMAQ_QISAR_TXQ_ERR_INT)
+ {
+ if (DRV_Reg32(USB_DMAQ_TQEIR)& (USB_DMAQ_QIMCR0 << index))
+ {
+ ASSERT(0); // Error handler
+ DRV_WriteReg32(USB_DMAQ_TQEIR, DRV_Reg32(USB_DMAQ_TQEIR)); //write 1 clear
+ }
+ }
+
+ if (DMAQIntr & USB_DMAQ_QISAR_RXEP_ERR_INT)
+ {
+ if (DRV_Reg32(USB_DMAQ_REPEIR) & (USB_DMAQ_QIMCR0 << index))
+ {
+ ASSERT(0); // Error handler
+ DRV_WriteReg32(USB_DMAQ_REPEIR, DRV_Reg32(USB_DMAQ_REPEIR)); //write 1 clear
+ }
+ }
+
+ if (DMAQIntr & USB_DMAQ_QISAR_TXEP_ERR_INT)
+ {
+ if (DRV_Reg32(USB_DMAQ_TEPEIR) & (USB_DMAQ_QIMCR0 << index))
+ {
+ ASSERT(0); // Error handler
+ DRV_WriteReg32(USB_DMAQ_TEPEIR, DRV_Reg32(USB_DMAQ_TEPEIR)); //write 1 clear
+ }
+ }
+
+
+ if (DMAQIntr & USB_DMAQ_QISAR_RX_DONE(index)) // IOC trigger interrupt
+ { // this GPD transfer done, HW is still reading next GPD
+
+ if(USB_HCD_DMA_Get_Run_Status(0, index+1) == KAL_TRUE)
+ {
+ USB_HCD_DMAQ_Callback(0,index,USB_EP_RX_DIR);
+ }
+ else if(g_UsbDrvInfo.dma_running[index] == KAL_TRUE)
+ {
+ USB_DMA_Callback(index+1);
+ }
+ }
+
+ if (DMAQIntr & USB_DMAQ_QISAR_TX_DONE(index))
+ {
+ if(USB_HCD_DMA_Get_Run_Status(0, index+1) == KAL_TRUE)
+ {
+ USB_HCD_DMAQ_Callback(0,index,USB_EP_TX_DIR);
+}
+ else if(g_UsbDrvInfo.dma_running[index] == KAL_TRUE)
+ {
+ USB_DMA_Callback(index+1);
+ }
+ }
+ }
+
+ /* Read register again to see if any interrupt is generated again */
+ /* if pong pong buffer serve done, then we do call back function here */
+ DMAQIntr = DRV_Reg32(USB_DMAQ_QISAR);
+ DRV_WriteReg32(USB_DMAQ_QISAR, DMAQIntr); //write 1 clear
+ }
+
+}
+#endif
+
+
+static void OTGDMA_LISR(void)
+{
+ kal_uint8 DMAIntr;
+
+#if defined(DRV_USB_IP_V3)
+
+ IRQMask(IRQ_USBDMA_CODE);
+ drv_active_hisr(DRV_USBDMA_HISR_ID);
+ DMAIntr = USB_DRV_Reg8(USB_DMAINTR);
+ USB_Dbg_Trace(USB_DMA_LISR, DMAIntr, 0);
+ ASSERT(DMAIntr != 0);
+#endif
+}
+
+void OTG_HISR(void)
+{
+ kal_bool b_dev_unmask_irq = KAL_TRUE;
+ volatile kal_uint8 IntrUSB;
+#ifdef __MEUT__
+ kal_bool b_otg_hisr_is_handled = KAL_FALSE;
+#endif
+
+
+ IntrUSB = USB_DRV_Reg8(USB_INTRUSB);
+ g_OtgInfo.otg_intr_status = IntrUSB;
+ USB_Dbg_Trace(USB_OTG_HISR, IntrUSB, USB_DRV_Reg8(USB_POWER));
+
+#ifdef __MEUT__
+ if ((IntrUSB == 0)&&(g_OtgInfo.host_up == KAL_FALSE)&&(g_OtgInfo.device_up == KAL_FALSE))
+ {
+ if ((USB_DRV_Reg(USB_INTRTX)== 0)&&(USB_DRV_Reg(USB_INTRRX)== 0))
+ b_otg_hisr_is_handled = KAL_TRUE;
+ }
+
+ if(IntrUSB != 0)
+ {
+ b_otg_hisr_is_handled = KAL_TRUE;
+ }
+#endif
+
+ if((IntrUSB&USB_INTRUSB_RESET) != 0)
+ {
+ if(OTG_Get_State() == OTG_STATE_B_WAIT_ACON)
+ {
+ USB_Dbg_Trace(USB_OTG_RESET, 0, 0);
+ OTG_Set_Status(OTG_STATUS_B_DETECT_A_RESET, KAL_TRUE);
+ }
+ }
+
+ if((IntrUSB&USB_INTRUSB_RESUME) != 0)
+ {
+ if((g_OtgInfo.device_up == KAL_FALSE)&&(g_OtgInfo.otg_state == OTG_STATE_B_WAIT_ACON))
+ {
+ USB_Dbg_Trace(USB_OTG_RESUME, 0, 0);
+ OTG_Set_Status(OTG_STATUS_B_DETECT_A_RESUME, KAL_TRUE);
+ }
+ }
+
+ /* SRP detection, Only A-device */
+ if((IntrUSB&USB_INTRUSB_SESSREQ) != 0)
+ {
+ USB_Dbg_Trace(USB_OTG_SESSREQ, USB_DRV_Reg8(USB_OPSTATE), USB_DRV_Reg8(USB_DEVCTL));
+ drv_trace4(TRACE_FUNC, (kal_uint32)USB_OTG_SESSION_REQUEST, IntrUSB, USB_DRV_Reg8(USB_POWER), USB_DRV_Reg8(USB_LINE_STATE), USB_DRV_Reg8(USB_OPSTATE));
+
+ if((OTG_Get_Plug_Type() == OTG_PLUG_A)&&(g_OtgInfo.otg_state != OTG_STATE_A_WAIT_VFALL))
+ { //receive un-expected interrupt after Vbus error
+ OTG_Set_Status(OTG_STATUS_A_DETECT_B_DATA_PLS, KAL_TRUE);
+ }
+ else
+ {
+ if(USB_DRV_Reg8(USB_OPSTATE) != 0x00)
+ ASSERT(0);
+ //receive babble interrupt will force HW jump to idle state (0x00)--> cannot receive session interrupt.
+ }
+ }
+
+ /* VBUS error, A device only */
+ if((IntrUSB&USB_INTRUSB_VBUSERROR) != 0)
+ {
+ if(OTG_Get_Plug_Type() == OTG_PLUG_A)
+ {
+ drv_trace0(TRACE_FUNC, (kal_uint32)USB_OTG_VBUS_FALL_DOWN);
+
+ /* IP detect every 543ms, Vbus is still lower than 4.4V it will issue this intr and auto turn off Vbus */
+ OTG_Process_A_Vbus_Fail();
+ }
+ else
+ {
+ ASSERT(0);
+ }
+ }
+
+ if((IntrUSB&USB_INTRUSB_CONN) != 0)
+ {
+
+ }
+
+ if(g_OtgInfo.host_up == KAL_TRUE)
+ {
+ /* set TRUE in A_WAIT_BCON */
+ /* set TRUE in B_WAIT_ACON */
+ /* set FALSE in OTG_STATE_A_PERIPHERAL */
+ /* set FALSE in OTG_STATE_B_PERIPHERAL */
+ /* set FALSE in B_IDLE */
+ /* set FALSE in OTG_STATE_A_WAIT_VFALL */
+ /* Host mode */
+ USB_HCD_HISR();
+ b_dev_unmask_irq = USB_HCD_Get_UnMask_Irq(0);
+
+#ifdef __MEUT__
+ b_otg_hisr_is_handled = KAL_TRUE;
+#endif
+
+ #ifdef __OTG_SRP_HNP_APP_FIXED__
+ /* Mask USB IRQ to prevent host reset too fast, even USB device does not become MS yet */
+ /* From A suspend to A peripheral */
+ if(g_OtgInfo.device_up == KAL_TRUE)
+ {
+ b_dev_unmask_irq = USB_HW_Get_UnMask_Irq();
+ }
+ #endif
+ }
+ else if(g_OtgInfo.device_up == KAL_TRUE)
+ {
+ /* set TRUE in OTG_STATE_A_PERIPHERAL */
+ /* set TRUE in OTG_STATE_B_PERIPHERAL */
+ /* set FALSE in OTG_STATE_A_WAIT_VFALL */
+ /* set FALSE in OTG_STATE_A_WAIT_VRISE & A_IDLE */
+ /* set FALSE in OTG_STATE_A_WAIT_BCON */
+ /* set FALSE in OTG_STATE_B_WAIT_ACON */
+ /* set FALSE in OTG_STATE_B_IDLE */
+ /* Device mode */
+ USB_HISR();
+ b_dev_unmask_irq = USB_HW_Get_UnMask_Irq();
+
+#ifdef __MEUT__
+ b_otg_hisr_is_handled = KAL_TRUE;
+#endif
+ }
+
+ if((IntrUSB&USB_INTRUSB_DISCON) != 0)
+ {
+
+ }
+
+ if((IntrUSB&USB_INTRUSB_SUSPEND) != 0)
+ {
+
+ }
+
+ //debug used
+ if((IntrUSB&USB_INTRUSB_SOF) != 0)
+ {
+// USB_Dbg_Trace(USB_OTG_SOF, USB_DRV_Reg8(USB_LINE_STATE), USB_DRV_Reg8(USB_OPSTATE));
+// USB_Dbg_Trace(USB_OTG_SOF, USB_DRV_Reg8(USB_DEVCTL), USB_DRV_Reg8(USB_PHYIR2_0));
+ }
+
+#ifdef __MEUT__
+ if((b_otg_hisr_is_handled == KAL_FALSE) && (INT_Exception_Enter ==0))
+ EXT_ASSERT(0, USB_DRV_Reg(USB_INTRTX), USB_DRV_Reg(USB_INTRRX), 0);
+#endif
+
+#if defined(DRV_USB_IP_V4)
+ OTGDMA_HISR();
+
+ OTGDMAQ_HISR();
+#endif
+
+ /* Clear interrupt and unmask interrupt */
+ IRQClearInt(IRQ_USB_CODE);
+ g_OtgInfo.is_ProOTGHISR = KAL_FALSE;
+
+ if((g_OtgInfo.b_unmask_irq == KAL_TRUE)&&(b_dev_unmask_irq == KAL_TRUE))
+ {
+ IRQUnmask(IRQ_USB_CODE);
+ }
+ else
+ {
+ USB_Dbg_Trace(USB_OTG_MASK_HISR, (kal_uint32)g_OtgInfo.b_unmask_irq, (kal_uint32)b_dev_unmask_irq);
+ }
+}
+
+
+static void OTG_LISR(void)
+{
+ IRQMask(IRQ_USB_CODE);
+ g_OtgInfo.is_ProOTGHISR = KAL_TRUE;
+ drv_active_hisr(DRV_USB_HISR_ID);
+}
+
+
+/* Global variables */
+#define DCL_OTG_DRV_HANDLE 0x00004000
+#define DCL_OTG_DRV_CHECK_HANDLE_IS_VALID(handle) ((handle)&DCL_OTG_DRV_HANDLE)
+
+
+/* static variables */
+static kal_bool g_OTG_Drv_Init = KAL_FALSE;
+static kal_bool g_OTG_Drv_Open = KAL_FALSE;
+
+
+
+/*************************************************************************
+* FUNCTION
+* DclOTG_DRV_Initialize
+*
+* DESCRIPTION
+* This function is to initialize OTG module
+* It should be called before user register USB EINT handler and only called once
+*
+* PARAMETERS
+* None
+*
+* RETURNS
+* STATUS_OK : command is executed successfully.
+* STATUS_INVALID_OPERATION : already initialized.
+*
+*************************************************************************/
+DCL_STATUS DclOTG_DRV_Initialize(void)
+{
+ if(g_OTG_Drv_Init == KAL_TRUE)
+ {
+ /* Already initialized */
+ return STATUS_INVALID_OPERATION;
+ }
+ else
+ {
+ g_OTG_Drv_Init = KAL_TRUE;
+// USB_Initialize_Drv_Phase1();
+ return STATUS_OK;
+ }
+}
+
+
+/*************************************************************************
+* FUNCTION
+* DclOTG_DRV_Open
+*
+* DESCRIPTION
+* This function is to open the OTG module and return a valid handle
+*
+* PARAMETERS
+* dev: only valid for DCL_USB
+* flags: no sepcial flags is needed. Please use FLAGS_NONE
+*
+* RETURNS
+* DCL_HANDLE_INVALID: Open failed
+* DCL_HANDLE_OCCUPIED: Already opened
+* Other value: A valid handle
+*
+*************************************************************************/
+DCL_HANDLE DclOTG_DRV_Open(DCL_DEV dev, DCL_FLAGS flags)
+{
+ if(dev != DCL_USB)
+ {
+ ASSERT(0);
+ return (DCL_HANDLE)DCL_HANDLE_INVALID;
+ }
+ else
+ {
+ g_OTG_Drv_Open = KAL_TRUE;
+ return (DCL_HANDLE)DCL_OTG_DRV_HANDLE;
+ }
+}
+
+/*************************************************************************
+* FUNCTION
+* DclOTG_DRV_Close
+*
+* DESCRIPTION
+* This function is to close the OTG module.
+*
+* PARAMETERS
+* handle: the returned handle value of DclOTG_DRV_Open
+*
+* RETURNS
+* STATUS_INVALID_OPERATION: OTG module does not open yet, but user want to close
+* STATUS_INVALID_DCL_HANDLE: Use invalid handle to close
+* STATUS_OK
+*
+*************************************************************************/
+DCL_STATUS DclOTG_DRV_Close(DCL_HANDLE handle)
+{
+ /* Check open or not and handle validity */
+
+ if(DCL_OTG_DRV_CHECK_HANDLE_IS_VALID(handle) == 0)
+ {
+ ASSERT(0);
+
+// if(g_OTG_Drv_Open == KAL_FALSE)
+// return STATUS_INVALID_OPERATION;
+// else
+// return STATUS_INVALID_DCL_HANDLE;
+ }
+
+// g_OTG_Drv_Open = KAL_FALSE;
+
+ return STATUS_OK;
+}
+
+
+/*************************************************************************
+* FUNCTION
+* DclOTG_DRV_ReadData
+*
+* DESCRIPTION
+* This function is not supported for the OTG module now.
+*
+* PARAMETERS
+* N/A
+*
+* RETURNS
+* STATUS_UNSUPPORTED
+*
+*************************************************************************/
+DCL_STATUS DclOTG_DRV_ReadData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
+{
+ /* Check open or not and handle validity */
+/*
+ if((g_OTG_Drv_Open == KAL_FALSE)||(DCL_OTG_DRV_CHECK_HANDLE_IS_VALID(handle) == 0))
+ {
+ ASSERT(0);
+
+ if(g_OTG_Drv_Open == KAL_FALSE)
+ return STATUS_INVALID_OPERATION;
+ else
+ return STATUS_INVALID_DCL_HANDLE;
+ }
+*/
+ return STATUS_UNSUPPORTED;
+}
+
+
+
+/*************************************************************************
+* FUNCTION
+* DclOTG_DRV_WriteData
+*
+* DESCRIPTION
+* This function is not supported for the OTG module now.
+*
+* PARAMETERS
+* N/A
+*
+* RETURNS
+* STATUS_UNSUPPORTED
+*
+*************************************************************************/
+DCL_STATUS DclOTG_DRV_WriteData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
+{
+ /* Check open or not and handle validity */
+/*
+ if((g_OTG_Drv_Open == KAL_FALSE)||(DCL_OTG_DRV_CHECK_HANDLE_IS_VALID(handle) == 0))
+ {
+ ASSERT(0);
+
+ if(g_OTG_Drv_Open == KAL_FALSE)
+ return STATUS_INVALID_OPERATION;
+ else
+ return STATUS_INVALID_DCL_HANDLE;
+ }
+*/
+ return STATUS_UNSUPPORTED;
+}
+
+
+
+/*************************************************************************
+* FUNCTION
+* DclOTG_DRV_Configure
+*
+* DESCRIPTION
+* This function is not supported for the OTG module now.
+*
+* PARAMETERS
+* N/A
+*
+* RETURNS
+* STATUS_UNSUPPORTED
+*
+*************************************************************************/
+DCL_STATUS DclOTG_DRV_Configure(DCL_HANDLE handle, DCL_CONFIGURE_T *configure)
+{
+ /* Check open or not and handle validity */
+/*
+ if((g_OTG_Drv_Open == KAL_FALSE)||(DCL_OTG_DRV_CHECK_HANDLE_IS_VALID(handle) == 0))
+ {
+ ASSERT(0);
+
+ if(g_OTG_Drv_Open == KAL_FALSE)
+ return STATUS_INVALID_OPERATION;
+ else
+ return STATUS_INVALID_DCL_HANDLE;
+ }
+*/
+ return STATUS_UNSUPPORTED;
+}
+
+
+
+/*************************************************************************
+* FUNCTION
+* DclOTG_DRV_RegisterCallback
+*
+* DESCRIPTION
+* This function is not supported for the OTG module now.
+*
+* PARAMETERS
+* N/A
+*
+* RETURNS
+* STATUS_UNSUPPORTED
+*
+*************************************************************************/
+DCL_STATUS DclOTG_DRV_RegisterCallback(DCL_HANDLE handle, DCL_EVENT event, PFN_DCL_CALLBACK callback)
+{
+ /* Check open or not and handle validity */
+/*
+ if((g_OTG_Drv_Open == KAL_FALSE)||(DCL_OTG_DRV_CHECK_HANDLE_IS_VALID(handle) == 0))
+ {
+ ASSERT(0);
+
+ if(g_OTG_Drv_Open == KAL_FALSE)
+ return STATUS_INVALID_OPERATION;
+ else
+ return STATUS_INVALID_DCL_HANDLE;
+ }
+*/
+ return STATUS_UNSUPPORTED;
+}
+
+
+
+/*******************************************************************************
+ Control functions for OTG_DRV
+ *******************************************************************************/
+static DCL_STATUS DCL_USB_CTRL_API_OTG_Init_Drv_Info(DCL_CTRL_DATA_T *data)
+{
+ g_OtgInfo.otg_state = OTG_STATE_START;
+
+ g_OtgInfo.host_up_hdlr = NULL;
+ g_OtgInfo.host_down_hdlr = NULL;
+ g_OtgInfo.device_up_hdlr = NULL;
+ g_OtgInfo.device_down_hdlr = NULL;
+ g_OtgInfo.a_host_stop_hdlr = NULL;
+ g_OtgInfo.b_hnp_fail_hdlr = NULL;
+ g_OtgInfo.a_vrise_fail_hdlr = NULL;
+ g_OtgInfo.b_srp_fail_hdlr = NULL;
+ g_OtgInfo.b_srp_stop_hdlr = NULL;
+
+ g_OtgInfo.a_bus_req = KAL_TRUE;
+ g_OtgInfo.a_detect_b_conn = KAL_FALSE;
+ g_OtgInfo.a_detect_b_suspend = KAL_FALSE;
+ g_OtgInfo.a_detect_b_resume = KAL_FALSE;
+ g_OtgInfo.a_suspend_req = KAL_FALSE;
+ g_OtgInfo.a_resume_req = KAL_FALSE;
+ g_OtgInfo.a_set_b_hnp_enable = KAL_FALSE;
+
+ g_OtgInfo.b_suspend_req = KAL_FALSE;
+ g_OtgInfo.b_detect_a_conn = KAL_FALSE;
+ g_OtgInfo.b_detect_a_suspend = KAL_FALSE;
+ g_OtgInfo.b_detect_a_resume = KAL_FALSE;
+ g_OtgInfo.b_srp_request = KAL_FALSE;
+ g_OtgInfo.b_hnp_enable = KAL_FALSE;
+
+
+ g_OtgInfo.suspend_and_conn_intr = KAL_FALSE;
+ g_OtgInfo.disconn_num = 0;
+
+ g_OtgInfo.timer_on = KAL_FALSE;
+ g_OtgInfo.timer_out = KAL_FALSE;
+ g_OtgInfo.timer_type = OTG_TIMER_NONE;
+
+ g_OtgInfo.device_up = KAL_FALSE;
+ g_OtgInfo.host_up = KAL_FALSE;
+
+ g_OtgInfo.b_processing = KAL_FALSE;
+
+ g_OtgInfo.b_unmask_irq = KAL_TRUE;
+ g_OtgInfo.is_ProOTGHISR = KAL_FALSE;
+
+ if ((g_OtgInfo.gpt_handle == 0)||(g_OtgInfo.gpt_handle == 0x7F))
+ g_OtgInfo.gpt_handle = DclSGPT_Open(DCL_GPT_CB, 0);
+// GPTI_GetHandle(&g_OtgInfo.gpt_handle);
+
+ return STATUS_OK;
+}
+
+
+static DCL_STATUS DCL_USB_CTRL_API_OTG_Release_Drv_Info(DCL_CTRL_DATA_T *data)
+{
+ DCL_HANDLE handle;
+ g_OtgInfo.otg_state = OTG_STATE_START;
+
+ g_OtgInfo.host_up_hdlr = NULL;
+ g_OtgInfo.host_down_hdlr = NULL;
+ g_OtgInfo.device_up_hdlr = NULL;
+ g_OtgInfo.device_down_hdlr = NULL;
+ g_OtgInfo.a_host_stop_hdlr = NULL;
+ g_OtgInfo.b_hnp_fail_hdlr = NULL;
+ g_OtgInfo.a_vrise_fail_hdlr = NULL;
+ g_OtgInfo.b_srp_fail_hdlr = NULL;
+ g_OtgInfo.b_srp_stop_hdlr = NULL;
+
+ g_OtgInfo.a_bus_req = KAL_TRUE;
+ g_OtgInfo.a_detect_b_conn = KAL_FALSE;
+ g_OtgInfo.a_detect_b_suspend = KAL_FALSE;
+ g_OtgInfo.a_detect_b_resume = KAL_FALSE;
+ g_OtgInfo.a_suspend_req = KAL_FALSE;
+ g_OtgInfo.a_resume_req = KAL_FALSE;
+ g_OtgInfo.a_set_b_hnp_enable = KAL_FALSE;
+
+ g_OtgInfo.b_suspend_req = KAL_FALSE;
+ g_OtgInfo.b_detect_a_conn = KAL_FALSE;
+ g_OtgInfo.b_detect_a_suspend = KAL_FALSE;
+ g_OtgInfo.b_detect_a_resume = KAL_FALSE;
+ g_OtgInfo.b_srp_request = KAL_FALSE;
+ g_OtgInfo.b_hnp_enable = KAL_FALSE;
+
+ g_OtgInfo.timer_on = KAL_FALSE;
+ g_OtgInfo.timer_out = KAL_FALSE;
+ g_OtgInfo.timer_type = OTG_TIMER_NONE;
+
+ g_OtgInfo.device_up = KAL_FALSE;
+ g_OtgInfo.host_up = KAL_FALSE;
+
+ g_OtgInfo.b_processing = KAL_FALSE;
+
+ g_OtgInfo.b_unmask_irq = KAL_TRUE;
+ g_OtgInfo.is_ProOTGHISR = KAL_FALSE;
+
+ if((g_OtgInfo.gpt_handle != 0)&&(g_OtgInfo.gpt_handle != 0x7F))
+ {
+ handle = (DCL_HANDLE)g_OtgInfo.gpt_handle;
+ g_OtgInfo.gpt_handle = DclSGPT_Close(&handle);
+ }
+// GPTI_ReleaseHandle(&g_OtgInfo.gpt_handle);
+
+ return STATUS_OK;
+}
+
+
+static DCL_STATUS DCL_USB_CTRL_API_OTG_Register_Drv_Info(DCL_CTRL_DATA_T *data)
+{
+ OTG_DRV_CTRL_REGISTER_DRV_INFO_T *prregister_drv_info;
+ OTG_DRV_HDLR_TYPE type;
+ otg_intr_handler_ptr hdlr;
+
+
+ prregister_drv_info = &data->rOTG_Drv_Info;
+ type = (OTG_DRV_HDLR_TYPE)prregister_drv_info->type;
+ hdlr = (otg_intr_handler_ptr)prregister_drv_info->hdlr;
+
+ switch(type)
+ {
+ case OTG_DRV_HDLR_HOST_UP:
+ g_OtgInfo.host_up_hdlr = hdlr;
+ break;
+ case OTG_DRV_HDLR_HOST_DOWN:
+ g_OtgInfo.host_down_hdlr = hdlr;
+ break;
+ case OTG_DRV_HDLR_DEVICE_UP:
+ g_OtgInfo.device_up_hdlr = hdlr;
+ break;
+ case OTG_DRV_HDLR_DEVICE_DOWN:
+ g_OtgInfo.device_down_hdlr = hdlr;
+ break;
+ case OTG_DRV_HDLR_A_VRISE_FAIL:
+ g_OtgInfo.a_vrise_fail_hdlr = hdlr;
+ break;
+ case OTG_DRV_HDLR_A_HNP_FAIL:
+ g_OtgInfo.a_hnp_fail_hdlr = hdlr;
+ break;
+ case OTG_DRV_HDLR_A_HNP_STOP:
+ g_OtgInfo.a_hnp_stop_hdlr = hdlr;
+ break;
+ case OTG_DRV_HDLR_A_NO_RESPONSE:
+ g_OtgInfo.a_no_response_hdlr = hdlr;
+ break;
+ case OTG_DRV_HDLR_B_HNP_FAIL:
+ g_OtgInfo.b_hnp_fail_hdlr = hdlr;
+ break;
+ case OTG_DRV_HDLR_B_SRP_FAIL:
+ g_OtgInfo.b_srp_fail_hdlr = hdlr;
+ break;
+ case OTG_DRV_HDLR_B_SRP_STOP:
+ g_OtgInfo.b_srp_stop_hdlr = hdlr;
+ break;
+ case OTG_DRV_HDLR_B_SRP_EXCEPTION_STOP:
+ g_OtgInfo.b_srp_exception_stop_hdlr = hdlr;
+ break;
+ case OTG_DRV_HDLR_A_HOST_STOP:
+ g_OtgInfo.a_host_stop_hdlr = hdlr;
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+
+
+ return STATUS_OK;
+}
+
+
+static DCL_STATUS DCL_USB_CTRL_API_OTG_Drv_Create_ISR(DCL_CTRL_DATA_T *data)
+{
+#if defined(DRV_USB_IP_V3)
+
+ IRQ_Register_LISR(IRQ_USB_CODE, OTG_LISR, "OTG");
+ DRV_Register_HISR(DRV_USB_HISR_ID, OTG_HISR);
+#endif
+ return STATUS_OK;
+}
+
+
+static DCL_STATUS DCL_USB_CTRL_API_OTG_Drv_Activate_ISR(DCL_CTRL_DATA_T *data)
+{
+ g_OtgInfo.b_unmask_irq = KAL_TRUE;
+#if defined(DRV_USB_IP_V3)
+ IRQSensitivity(IRQ_USB_CODE,LEVEL_SENSITIVE);
+ IRQUnmask(IRQ_USB_CODE);
+#endif
+ return STATUS_OK;
+}
+
+
+static DCL_STATUS DCL_USB_CTRL_API_OTGDMA_Drv_Create_ISR(DCL_CTRL_DATA_T *data)
+{
+#if defined(DRV_USB_IP_V3)
+ IRQ_Register_LISR(IRQ_USBDMA_CODE, OTGDMA_LISR, "OTGDMA");
+ DRV_Register_HISR(DRV_USBDMA_HISR_ID, OTGDMA_HISR);
+#endif
+ return STATUS_OK;
+}
+
+
+static DCL_STATUS DCL_USB_CTRL_API_OTGDMA_Drv_Activate_ISR(DCL_CTRL_DATA_T *data)
+{
+#if defined(DRV_USB_IP_V3)
+
+ IRQSensitivity(IRQ_USBDMA_CODE, LEVEL_SENSITIVE);
+ IRQUnmask(IRQ_USBDMA_CODE);
+#endif
+ return STATUS_OK;
+}
+
+
+static DCL_STATUS DCL_USB_CTRL_API_OTG_Init_Drv(DCL_CTRL_DATA_T *data)
+{
+ kal_bool b_process_state_machine = KAL_FALSE;
+ kal_uint32 savedMask;
+
+ /* Software reset */
+#if defined(DRV_USB_IP_V3)
+ USB_DRV_WriteReg(USB_SWRST, (USB_SWRST_DISUSBRESET|USB_SWRST_SWRST));
+#elif defined(DRV_USB_IP_V4)
+ USB_DRV_SetBits(USB_BUSPERF3, (USB_BUSPERF3_DISUSBRESET|USB_BUSPERF3_SWRST));
+#endif
+// USB_DRV_WriteReg8(USB_RSTINFO, 0xA6);
+ USB_DRV_WriteReg8(USB_RSTINFO, 0xA0);
+
+ /* Set USB_POWER_ISOUPDATE will make ISO pipe with DMA abnormally */
+// USB_DRV_SetBits8(USB_POWER, (USB_POWER_ISOUPDATE|USB_POWER_ENABLESUSPENDM));
+ USB_DRV_SetBits8(USB_POWER, (USB_POWER_ENABLESUSPENDM));
+
+ USB_DRV_ClearBits8(USB_POWER, USB_POWER_HSENAB);
+
+ /* SRP Vbus pulsing duration */
+ USB_DRV_WriteReg8(USB_VPLEN, 0x02);
+
+#if (defined(DRV_USB_PHY_COST_DOWN))
+ USB_DRV_WriteReg8(USB_PHYIR4_3, USB_PHYIR4_3_DEGLICH);
+#elif (defined(DRV_USB_PHY_U65_IP))
+
+#elif (defined(DRV_USB_PHY_U40_IP))
+
+#else //Old PHY version
+ /* Change phy register setting */
+ USB_DRV_WriteReg8(USB_PHYCR3_3, 0x67);
+ USB_DRV_WriteReg8(USB_PHYCR2_0, 0x00);
+#endif
+
+ savedMask = SaveAndSetIRQMask();
+ if(g_OtgInfo.b_processing == KAL_FALSE)
+ {
+ g_OtgInfo.b_processing = KAL_TRUE;
+ b_process_state_machine = KAL_TRUE;
+ }
+ RestoreIRQMask(savedMask);
+
+ if(b_process_state_machine == KAL_TRUE)
+ {
+ OTG_State_Machine();
+ g_OtgInfo.b_processing = KAL_FALSE;
+ }
+
+ return STATUS_OK;
+}
+
+static DCL_STATUS DCL_USB_CTRL_API_OTG_Set_Plug_Type(DCL_CTRL_DATA_T *data)
+{
+ OTG_DRV_CTRL_GET_PLUG_TYPE_T *prget_plug_type;
+
+ prget_plug_type = &data->rOTG_Plug_Type;
+ OTG_Set_Plug_Type(prget_plug_type->type);
+ return STATUS_OK;
+}
+
+
+static DCL_STATUS DCL_USB_CTRL_API_OTG_Get_Plug_Type(DCL_CTRL_DATA_T *data)
+{
+ OTG_DRV_CTRL_GET_PLUG_TYPE_T *prget_plug_type;
+
+
+ prget_plug_type = &data->rOTG_Plug_Type;
+ prget_plug_type->type = (DCL_OTG_PLUG_TYPE)g_OtgInfo.plug_type;
+ return STATUS_OK;
+}
+
+
+static DCL_STATUS DCL_USB_CTRL_API_OTG_A_Suspend_Req(DCL_CTRL_DATA_T *data)
+{
+ if(g_OtgInfo.otg_state != OTG_STATE_A_HOST)
+ return STATUS_FAIL;
+
+ /* suspend only effect when A_HOST state */
+ OTG_Set_Status(OTG_STATUS_A_SUSPEND_REQUEST, KAL_TRUE);
+ return STATUS_OK;
+}
+
+
+static DCL_STATUS DCL_USB_CTRL_API_OTG_A_Resume_Req(DCL_CTRL_DATA_T *data)
+{
+ if(g_OtgInfo.otg_state != OTG_STATE_A_SUSPEND)
+ return STATUS_FAIL;
+
+ OTG_Set_Status(OTG_STATUS_A_RESUME_REQUEST, KAL_TRUE);
+ return STATUS_OK;
+}
+
+
+static DCL_STATUS DCL_USB_CTRL_API_OTG_A_Stop_Host(DCL_CTRL_DATA_T *data)
+{
+ if(g_OtgInfo.otg_state != OTG_STATE_A_HOST)
+ return STATUS_FAIL;
+
+ OTG_Set_Status(OTG_STATUS_A_BUS_REQUEST, KAL_FALSE);
+ return STATUS_OK;
+}
+
+
+static DCL_STATUS DCL_USB_CTRL_API_OTG_A_Start_HNP(DCL_CTRL_DATA_T *data)
+{
+ if(g_OtgInfo.otg_state != OTG_STATE_A_HOST)
+ return STATUS_FAIL;
+
+ OTG_Set_Status(OTG_STATUS_A_SET_B_HNP_ENABLE, KAL_TRUE);
+ return STATUS_OK;
+}
+
+
+static DCL_STATUS DCL_USB_CTRL_API_OTG_B_EnDis_HNP(DCL_CTRL_DATA_T *data)
+{
+ DCL_BOOL *dcl_data_ptr = (DCL_BOOL*)data;
+ kal_bool set = (kal_bool)(*dcl_data_ptr);
+
+
+ if(g_OtgInfo.otg_state != OTG_STATE_B_PERIPHERAL)
+ return STATUS_FAIL;
+
+
+ if(set == KAL_TRUE)
+ {
+ USB_DRV_SetBits8(USB_DEVCTL, USB_DEVCTL_HOSTREQ);
+ }
+ else
+ {
+ USB_DRV_ClearBits8(USB_DEVCTL, USB_DEVCTL_HOSTREQ);
+ }
+
+ OTG_Set_Status(OTG_STATUS_B_HNP_ENABLE, set);
+
+ return STATUS_OK;
+}
+
+
+
+static DCL_STATUS DCL_USB_CTRL_API_OTG_B_Start_SRP(DCL_CTRL_DATA_T *data)
+{
+ if(g_OtgInfo.otg_state != OTG_STATE_B_IDLE)
+ return STATUS_FAIL;
+
+ OTG_Set_Status(OTG_STATUS_B_SRP_REQUEST, KAL_TRUE);
+ return STATUS_OK;
+}
+
+
+static DCL_STATUS DCL_USB_CTRL_API_OTG_B_Stop_Host(DCL_CTRL_DATA_T *data)
+{
+ if(g_OtgInfo.otg_state != OTG_STATE_B_HOST)
+ return STATUS_FAIL;
+
+ OTG_Set_Status(OTG_STATUS_B_SUSPEND_REQUEST, KAL_TRUE);
+ return STATUS_OK;
+}
+
+
+static DCL_STATUS DCL_USB_CTRL_API_OTG_B_Set_Session_Valid(DCL_CTRL_DATA_T *data)
+{
+ DCL_BOOL *dcl_data_ptr = (DCL_BOOL*)data;
+ kal_bool set = (kal_bool)(*dcl_data_ptr);
+
+
+ OTG_Set_Status(OTG_STATUS_B_SESSION_VALID, set);
+ return STATUS_OK;
+}
+
+
+static DCL_STATUS DCL_USB_CTRL_API_OTG_Get_State(DCL_CTRL_DATA_T *data)
+{
+ OTG_DRV_CTRL_GET_STATE_T *prget_state;
+
+
+ prget_state = &data->rOTG_Get_State;
+ prget_state->state = (DCL_OTG_STATE)OTG_Get_State();
+ return STATUS_OK;
+}
+
+
+static DCL_STATUS DCL_USB_CTRL_API_OTG_Enable_Device(DCL_CTRL_DATA_T *data)
+{
+ USB_DRV_SetBits8(USB_POWER, USB_POWER_SOFTCONN);
+ return STATUS_OK;
+}
+
+
+static DCL_STATUS DCL_USB_CTRL_API_OTG_Incr_Disconn_Count(DCL_CTRL_DATA_T *data)
+{
+ g_OtgInfo.disconn_num++;
+
+ /* If cable quality is very bad, we try to use full speed */
+ if(g_OtgInfo.disconn_num == 8)
+ {
+ USB_DRV_ClearBits8(USB_POWER, USB_POWER_HSENAB);
+ }
+
+ return STATUS_OK;
+}
+
+
+static DCL_STATUS DCL_USB_CTRL_API_OTG_Process_Exceptions(DCL_CTRL_DATA_T *data)
+{
+ USB_Dbg_Trace(USB_HOST_EXCEPTIONS, (kal_uint32)g_OtgInfo.otg_state, 0);
+
+ if(kal_if_hisr() == KAL_TRUE)
+ EXT_ASSERT(0, 0, 0, 0);
+
+ /* Check exception for A device */
+ if((g_OtgInfo.otg_state < OTG_STATE_B_IDLE))
+ {
+ /*
+ ** Exceptions are as follows.
+ ** 1. Transition to B_IDLE when id = TRUE.
+ ** 2. Transition to A_WAIT_VFALL when V_BUS is voltage is fallen below
+ ** 3. 4 VDC is not able to set the V_BUS voltage.
+ */
+
+ /* For A device, only A cable plug out will go here */
+ if(OTG_Get_Plug_Type() == OTG_PLUG_B)
+ {
+ /* 1. A plug out, EINT will set as OTG_PLUG_B */
+ /* stop any active timers*/
+ OTG_Stop_Timer();
+
+ /* state is in A_idle because b-device is un-supported and it does not support OTG, A device turn off Vbus */
+ if(g_OtgInfo.otg_state == OTG_STATE_A_IDLE)
+ {
+ /* Only set g_OtgInfo.b_is_vbus_power_on = KAL_FALSE when A cable is plugged out */
+
+ g_OtgInfo.otg_state = OTG_STATE_B_IDLE;
+
+ if(g_OtgInfo.b_srp_request == KAL_TRUE)
+ {
+ /* A device should not g_OtgInfo.b_srp_request == KAL_TRUE */
+ ASSERT(0);
+ /* OTG_B_SRP_Stop_Hdlr(void) */
+ /* OTG_Display_Message(OTG_DISPLAY_MSG_STOP_CONNECTING); */
+// g_OtgInfo.b_srp_stop_hdlr();
+// g_OtgInfo.b_srp_request = KAL_FALSE;
+ }
+
+ OTG_Process_B_Idle();
+ }
+ else if((g_OtgInfo.otg_state == OTG_STATE_A_WAIT_BCON)||(g_OtgInfo.otg_state == OTG_STATE_A_WAIT_VFALL)||(g_OtgInfo.otg_state == OTG_STATE_A_HOST))
+ {
+ /* 1. A_HOST receive disconn -> A_WAIT_BCON
+ 2. A_PERIPHERAL receive suspend -> A_WAIT_BCON */
+ OTG_Stop_Timer();
+
+ if(g_OtgInfo.a_process_hnp == KAL_TRUE)
+ {
+ g_OtgInfo.a_hnp_stop_hdlr();
+ g_OtgInfo.a_process_hnp = KAL_FALSE;
+ }
+
+ g_OtgInfo.otg_state = OTG_STATE_A_WAIT_VFALL;
+
+ /* Turn off VBUS */
+ USB_HCD_VBusEnable(0, KAL_FALSE);
+
+ if(g_OtgInfo.host_up == KAL_TRUE)
+ {
+ g_OtgInfo.host_up = KAL_FALSE;
+ g_OtgInfo.a_host_stop_hdlr();
+ g_OtgInfo.host_down_hdlr();
+ }
+
+ if(g_OtgInfo.device_up == KAL_TRUE)
+ {
+ g_OtgInfo.device_up = KAL_FALSE;
+ g_OtgInfo.device_down_hdlr();
+ }
+
+ OTG_Start_Timer(OTG_TIMER_A_CHECK_VFALL, TA_CHECK_VFALL);
+ OTG_Process_A_Wait_VFall();
+ }
+ else
+ {
+ ASSERT(0);
+ }
+ }
+ }
+ else
+ {
+ /*
+ ** Process B- device exceptions
+ */
+ /* mini B plug out, or B device do SRP but mini A plug in */
+ if(((g_OtgInfo.b_session_valid == KAL_TRUE)||(g_OtgInfo.otg_state == OTG_STATE_B_SRP_INIT))&&(OTG_Get_Plug_Type() == OTG_PLUG_B))
+ ASSERT(0);
+
+ if(g_OtgInfo.b_srp_request == KAL_TRUE)
+ {
+ /* In case go here and SRP timer is still on */
+ OTG_Stop_Timer();
+
+ /* OTG_B_SRP_Exception_Stop_Hdlr(void) */
+ /* OTG_Display_Message(OTG_DISPLAY_MSG_STOP_CONNECTING); */
+ g_OtgInfo.b_srp_exception_stop_hdlr();
+ g_OtgInfo.b_srp_request = KAL_FALSE;
+ }
+
+ if(OTG_Get_TimerType() == OTG_TIMER_B_ASE0_BRST)
+ OTG_Stop_Timer();
+
+ if(g_OtgInfo.b_device_down_pending == KAL_TRUE)
+ {
+ if(g_OtgInfo.device_up == KAL_TRUE)
+ ASSERT(0);
+
+ g_OtgInfo.b_device_down_pending = KAL_FALSE;
+ g_OtgInfo.device_down_hdlr();
+ USB_Dbg_Trace(USB_OTG_B_DEVICE_PENDING_DOWN_HDLR, 0, 4);
+ }
+
+ if(OTG_Get_Plug_Type() == OTG_PLUG_B)
+ {
+ /* B plug out */
+ /* Must go to there to release type */
+ g_OtgInfo.otg_state = OTG_STATE_B_IDLE;
+
+ /* Reset B-device HNP enabled state */
+ g_OtgInfo.b_hnp_enable = KAL_FALSE;
+ USB_DRV_ClearBits8(USB_DEVCTL, USB_DEVCTL_HOSTREQ);
+
+ OTG_Process_B_Idle();
+ }
+ else
+ {
+ /* A plug in */
+ g_OtgInfo.otg_state = OTG_STATE_A_IDLE;
+ g_OtgInfo.a_bus_req = KAL_TRUE;
+ OTG_Process_A_Idle();
+ }
+
+/*
+ if((OTG_Get_Plug_Type() == OTG_PLUG_A)||
+ ((g_OtgInfo.b_session_valid == KAL_FALSE)&&(g_OtgInfo.otg_state != OTG_STATE_B_SRP_INIT)))
+ {
+ if(g_OtgInfo.b_srp_request == KAL_TRUE)
+ {
+ g_OtgInfo.b_srp_stop_hdlr();
+ g_OtgInfo.b_srp_request = KAL_FALSE;
+ }
+
+ if(OTG_Get_Plug_Type() == OTG_PLUG_B)
+ {
+ g_OtgInfo.otg_state = OTG_STATE_B_IDLE;
+ OTG_Process_B_Idle();
+ }
+ else
+{
+ g_OtgInfo.otg_state = OTG_STATE_A_IDLE;
+ g_OtgInfo.a_bus_req = KAL_TRUE;
+ OTG_Process_A_Idle();
+ }
+ }
+*/
+ }
+ return STATUS_OK;
+}
+
+
+static DCL_STATUS DCL_USB_CTRL_API_OTG_Init_A_Plug_Detect(DCL_CTRL_DATA_T *data)
+{
+ kal_uint8 otg_idpin_eint = custom_eint_get_channel(otg_idpin_eint_chann);
+
+ /* Set plug type as B before we register EINT */
+ OTG_Set_Plug_Type(OTG_PLUG_B);
+
+#if defined(__OLD_PDN_ARCH__)
+#if defined(__OLD_PDN_DEFINE__)
+ USB_DRV_WriteReg(DRVPDN_CON0_CLR, DRVPDN_CON0_USB);
+#elif defined(__CLKG_DEFINE__)
+ USB_DRV_WriteReg(CG_CLR0, CG_CON0_USB);
+#endif
+#else
+ DRVPDN_Disable(PDN_USB);
+#endif
+
+
+#if defined(DRV_USB_PHY_U65_IP)
+ USB_DRV_SetBits8(USB_U2PHYDTM1_0, USB_U2PHYDTM1_0_RG_IDPULLUP);
+ USB_DRV_SetBits8(USB_U2PHYDTM1_1, USB_U2PHYDTM1_1_FORCE_IDPULLUP);
+ kal_sleep_task(50);
+#endif
+
+
+ EINT_SW_Debounce_Modify(otg_idpin_eint, 50);
+ EINT_Mask(otg_idpin_eint);
+
+ g_otg_idpin_state = OTG_IDPIN_CABLE_PLUGIN_LEVEL;
+ EINT_Registration(otg_idpin_eint, KAL_TRUE, OTG_IDPIN_CABLE_PLUGIN_LEVEL, OTG_ID_EINT_HISR, KAL_FALSE);
+ return STATUS_OK;
+}
+
+
+static DCL_STATUS DCL_USB_CTRL_API_OTG_Host_Set_VBUS_high(DCL_CTRL_DATA_T *data)
+{
+ return STATUS_FAIL;
+}
+
+
+static DCL_STATUS DCL_USB_CTRL_API_OTG_Is_Host_Turn_On_VBUS(DCL_CTRL_DATA_T *data)
+{
+ return STATUS_FAIL;
+}
+
+static DCL_STATUS DCL_USB_CTRL_API_Is_OTG_A_Cable_In(DCL_CTRL_DATA_T *data)
+{
+ OTG_DRV_CTRL_GET_Reg_T *usb_data;
+
+ usb_data = &data->rOTG_Get_State2;
+ usb_data->return_value = DCL_FALSE;
+
+#if (defined(DRV_USB_PHY_COST_DOWN))
+// if ((USB_DRV_Reg8(USB_PHYIR3_1)& USB_PHYIR3_1_IDDIG)== 0x00)
+// usb_data->return_value = DCL_TRUE;
+#elif (defined(DRV_USB_PHY_U65_IP)) // otg cable in : ox22 , without cable: 0x2A
+ if ((USB_DRV_Reg8(USB_U2PHYDMON0_3)& USB_U2PHYDMON0_3_IDDIG_MAC)== 0x00)
+ usb_data->return_value = DCL_TRUE;
+#elif (defined(DRV_USB_PHY_U40_IP))
+
+#else
+// old project doesn't support OTG
+#endif
+
+
+ return STATUS_OK;
+}
+
+static DCL_STATUS DCL_USB_CTRL_API_SRP_Init(DCL_CTRL_DATA_T *data)
+{
+ ilm_struct *usb_ilm;
+
+ DRV_BuildPrimitive(usb_ilm,
+ stack_get_active_module_id(),
+ MOD_USB,
+ MSG_ID_SRP_INIT,
+ NULL);
+ msg_send_ext_queue(usb_ilm);
+
+ return STATUS_OK;
+}
+
+
+DCL_USB_CTRL_API DCL_OTG_DRV_API_T[] =
+{
+ DCL_USB_CTRL_API_OTG_Init_Drv_Info,
+ DCL_USB_CTRL_API_OTG_Release_Drv_Info,
+ DCL_USB_CTRL_API_OTG_Register_Drv_Info,
+ DCL_USB_CTRL_API_OTG_Drv_Create_ISR,
+ DCL_USB_CTRL_API_OTG_Drv_Activate_ISR,
+ DCL_USB_CTRL_API_OTGDMA_Drv_Create_ISR,
+ DCL_USB_CTRL_API_OTGDMA_Drv_Activate_ISR,
+ DCL_USB_CTRL_API_OTG_Init_Drv,
+ DCL_USB_CTRL_API_OTG_Get_Plug_Type,
+ DCL_USB_CTRL_API_OTG_A_Suspend_Req,
+ DCL_USB_CTRL_API_OTG_A_Resume_Req,
+ DCL_USB_CTRL_API_OTG_A_Stop_Host,
+ DCL_USB_CTRL_API_OTG_A_Start_HNP,
+ DCL_USB_CTRL_API_OTG_B_EnDis_HNP,
+ DCL_USB_CTRL_API_OTG_B_Start_SRP,
+ DCL_USB_CTRL_API_OTG_B_Stop_Host,
+ DCL_USB_CTRL_API_OTG_B_Set_Session_Valid,
+ DCL_USB_CTRL_API_OTG_Get_State,
+ DCL_USB_CTRL_API_OTG_Enable_Device,
+ DCL_USB_CTRL_API_OTG_Incr_Disconn_Count,
+ DCL_USB_CTRL_API_OTG_Process_Exceptions,
+ DCL_USB_CTRL_API_OTG_Init_A_Plug_Detect,
+ DCL_USB_CTRL_API_OTG_Host_Set_VBUS_high,
+ DCL_USB_CTRL_API_OTG_Is_Host_Turn_On_VBUS,
+ DCL_USB_CTRL_API_Is_OTG_A_Cable_In,
+ DCL_USB_CTRL_API_SRP_Init,
+ DCL_USB_CTRL_API_OTG_Set_Plug_Type
+};
+
+
+#ifdef __OTG_SRP_HNP_APP_FIXED__
+void OTG_Set_Vbus_ON(void)
+{
+ OTG_Set_Status(OTG_STATUS_A_DETECT_B_DATA_PLS, KAL_TRUE);
+}
+#endif
+
+/*************************************************************************
+* FUNCTION
+* DclOTG_DRV_Control
+*
+* DESCRIPTION
+* This function is to send command to control the OTG module.
+*
+* PARAMETERS
+* handle: A valid handle return by DclOTG_DRV_Open()
+* cmd: A control command for OTG module
+// Should be added
+*
+* data: The data of the control command
+// Should be added
+*
+* RETURNS
+* STATUS_OK: command is executed successfully.
+* STATUS_FAIL: command is failed.
+* STATUS_INVALID_CMD: It's a invalid command.
+*
+*************************************************************************/
+DCL_STATUS DclOTG_DRV_Control(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
+{
+ /* Check open or not and handle validity */
+ if((g_OTG_Drv_Open == KAL_FALSE)||(DCL_OTG_DRV_CHECK_HANDLE_IS_VALID(handle) == 0))
+ {
+ ASSERT(0);
+
+ if(g_OTG_Drv_Open == KAL_FALSE)
+ return STATUS_INVALID_OPERATION;
+ else
+ return STATUS_INVALID_DCL_HANDLE;
+ }
+
+ return DCL_OTG_DRV_API_T[cmd](data);
+}
+
+
+#endif /* #if defined(__OTG_ENABLE__) && !defined(DRV_USB_OFF) */
+
+
+
+
diff --git a/mcu/driver/connectivity/usb_driver/src/dcl_usb_drv.c b/mcu/driver/connectivity/usb_driver/src/dcl_usb_drv.c
new file mode 100644
index 0000000..f35d5e5
--- /dev/null
+++ b/mcu/driver/connectivity/usb_driver/src/dcl_usb_drv.c
@@ -0,0 +1,934 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * dcl_usb_drv.c
+ *
+ * Project:
+ * --------
+ * Maui_sw
+ *
+ * Description:
+ * ------------
+ * This file defines the DCL common definitions for USB driver.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
+
+
+#include "drv_comm.h"
+#include "reg_base.h"
+#include "init.h"
+#include "cache_sw.h"
+#include "drvpdn.h"
+#include "intrCtrl.h"
+#include "drv_hisr.h"
+#include "dma_hw.h"
+#include "dma_sw.h"
+#include "upll_ctrl.h"
+
+#include "usb_hw.h"
+#include "usb_drv.h"
+#include "usb_phy_drv.h"
+#include "usb_drv_pri.h"
+#include "usb_custom.h"
+
+#ifdef __OTG_ENABLE__
+#include "otg_drv.h"
+#include "otg_if.h"
+//#include "usb_hcd.h"
+//#include "usb_hcd_pri.h"
+#endif
+
+#include "usb_debug_tool.h"
+#include "usb_trc.h"
+#include "dcl.h"
+
+#if !defined(__MEUT__) && !defined(__L1_STANDALONE__)
+#include "nvram_data_items.h"
+#include "nvram_interface.h"
+#endif
+
+//#include "kal_release.h"
+#include "kal_trace.h"
+#include "kal_general_types.h"
+#include "kal_public_api.h"
+#include "sync_data.h"
+
+#if defined(DRV_USB_POWER_DOWN_SUPPORT)
+#include "eint.h"
+#include "RM_public.h"
+#endif
+
+
+/* usb pdn register setting to check re-entry */
+static kal_bool PDN_USB_flag = KAL_FALSE;
+/* USBDL flag in meta mode */
+static kal_bool USBDL_mode = KAL_FALSE;
+static kal_bool USB_Fast_Meta_mode = KAL_FALSE;
+
+
+#if defined(DRV_USB_POWER_DOWN_SUPPORT)&&defined(MTK_SLEEP_ENABLE)
+extern void RM_Usb_Lock_Clock( kal_bool lock ); //lock 26MHz
+extern kal_uint8 L1SM_GetHandle(void);
+extern void L1SM_SleepEnable(kal_uint8 handle);
+extern void L1SM_SleepDisable(kal_uint8 handle);
+static kal_uint8 usb_pdn_handle;
+#define EINT_USB_PWRDWN 0x07 //it should be replaced by tool_gen
+#endif
+
+
+
+
+static DCL_STATUS DCL_USB_CTRL_API_USB_PDNmode(DCL_CTRL_DATA_T *data);
+static DCL_STATUS DCL_USB_CTRL_API_USBDL_Update_USB_Download_Mode(DCL_CTRL_DATA_T *data);
+static DCL_STATUS DCL_USB_CTRL_API_USBDL_Is_USB_Download_Mode(DCL_CTRL_DATA_T *data);
+static DCL_STATUS DCL_USB_CTRL_API_USBDL_Is_USB_Fast_Meta_Mode(DCL_CTRL_DATA_T *data);
+static void USB_PDNEnable(void);
+static void USB_PDNDisable(void);
+
+/* Exception flag*/
+extern kal_uint8 INT_Exception_Enter;
+extern kal_bool INT_QueryIsROMSpace(kal_uint32 addr);
+
+
+
+DCL_STATUS DclUSB_DRV_Initialize(void)
+{
+ return STATUS_OK;
+}
+
+
+DCL_HANDLE DclUSB_DRV_Open(DCL_DEV dev, DCL_FLAGS flags)
+{
+ return (DCL_HANDLE)DCL_HANDLE_NONE;
+}
+
+
+DCL_STATUS DclUSB_DRV_ReadData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
+{
+ return STATUS_UNSUPPORTED;
+}
+
+
+DCL_STATUS DclUSB_DRV_WriteData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
+{
+ return STATUS_UNSUPPORTED;
+}
+
+
+DCL_STATUS DclUSB_DRV_Configure(DCL_HANDLE handle, DCL_CONFIGURE_T *configure)
+{
+ return STATUS_UNSUPPORTED;
+}
+
+
+DCL_STATUS DclUSB_DRV_RegisterCallback(DCL_HANDLE handle, DCL_EVENT event, DCL_UINT8 index,void *class_handler)
+{
+ return STATUS_UNSUPPORTED;
+}
+
+
+DCL_STATUS DclUSB_DRV_Close(DCL_HANDLE handle)
+{
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DclUSB_DRV_Control(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
+{
+ switch(cmd)
+ {
+ case USB_DRV_CMD_PDN_ENABLE:
+ DCL_USB_CTRL_API_USB_PDNmode(data);
+ break;
+
+ case USB_DRV_CMD_USBDL_UPDATE_USB_DL_MODE:
+ DCL_USB_CTRL_API_USBDL_Update_USB_Download_Mode(data);
+ break;
+
+ case USB_DRV_CMD_USBDL_IS_USB_DL_MODE:
+ DCL_USB_CTRL_API_USBDL_Is_USB_Download_Mode(data);
+ break;
+
+ case USB_DRV_CMD_USBDL_IS_USB_FAST_META_MODE:
+ DCL_USB_CTRL_API_USBDL_Is_USB_Fast_Meta_Mode(data);
+ break;
+
+ default:
+ ASSERT(0);
+ break;
+ }
+
+ return STATUS_OK;
+}
+
+
+
+
+#if (defined(DRV_USB_IP_V1)||defined(DRV_USB_IP_V1_PLUS)||defined(DRV_USB_IP_V2)||defined(DRV_USB_IP_V3)||defined(DRV_USB_IP_V4))
+
+/************************************************************
+ USB PDN
+*************************************************************/
+
+/* USB PDN enable */
+static void USB_PDNEnable(void)
+{
+#if !defined(DRV_USB_OFF)
+
+#if defined(DRV_USB_POWER_DOWN_SUPPORT)
+ PDN_SET(PDN_USB);
+#else
+ #if defined(__OLD_PDN_ARCH__)
+
+ #if defined(__OLD_PDN_DEFINE__)
+ DRVPDN_Enable(DRVPDN_CON0, DRVPDN_CON0_USB, PDN_USB);
+ #elif defined(__CLKG_DEFINE__)
+ DRVPDN_Enable(CG_CON0, CG_CON0_USB, PDN_USB);
+ #endif
+
+ #else
+ DRVPDN_Enable(PDN_USB);
+ #endif
+#endif
+
+
+ PDN_USB_flag = KAL_FALSE;
+#endif /*!defined(DRV_USB_OFF)*/
+}
+
+
+/* USB PDN disable */
+static void USB_PDNDisable(void)
+{
+#if !defined(DRV_USB_OFF)
+
+#if defined(DRV_USB_POWER_DOWN_SUPPORT)
+ PDN_CLR(PDN_USB);
+#else
+ #if defined(__OLD_PDN_ARCH__)
+ #if defined(__OLD_PDN_DEFINE__)
+ DRVPDN_Disable(DRVPDN_CON0, DRVPDN_CON0_USB, PDN_USB);
+ #elif defined(__CLKG_DEFINE__)
+ DRVPDN_Disable(CG_CON0, CG_CON0_USB, PDN_USB);
+ #endif
+
+ #else
+ DRVPDN_Disable(PDN_USB);
+ #endif
+#endif
+
+
+ if(PDN_USB_flag == KAL_TRUE)
+ ASSERT(0);
+ PDN_USB_flag = KAL_TRUE;
+#endif /*!defined(DRV_USB_OFF)*/
+}
+
+#endif
+
+
+/************************************************************
+ Functions that is used whether USB_ENABLE is turned on or not
+*************************************************************/
+
+static DCL_STATUS DCL_USB_CTRL_API_USB_PDNmode(DCL_CTRL_DATA_T *data)
+{
+#if (defined(DRV_USB_IP_V1)||defined(DRV_USB_IP_V1_PLUS)||defined(DRV_USB_IP_V2)||defined(DRV_USB_IP_V3)||defined(DRV_USB_IP_V4))
+ DCL_BOOL *dcl_data_ptr = (DCL_BOOL*)data;
+ kal_bool pdn_en = (kal_bool)(*dcl_data_ptr);
+ volatile kal_uint32 delay;
+
+
+ if(pdn_en == KAL_TRUE)
+ {
+ /* Power down */
+ IRQMask(IRQ_USB_CODE);
+#if defined(DRV_USB_IP_V3)||defined(DRV_USB_IP_V4)
+ #if defined(DRV_USB_IP_V3)
+ IRQMask(IRQ_USBDMA_CODE);
+ #endif
+
+ USB_DRV_ClearBits8(USB_POWER, USB_POWER_SOFTCONN);
+
+//use UTMI to remove PHY 45 ohm resistor
+#if (defined(DRV_USB_PHY_COST_DOWN))
+ //reg[60B] bit 3,1,0 = 1
+ USB_DRV_SetBits8(USB_PHYCR3_3, (USB_PHYCR3_3_FORCE_XCVR_SELECT|USB_PHYCR3_3_FORCE_TERM_SELECT|USB_PHYCR3_3_FORCE_OP_MODE));
+ //reg[613] bit[2:0] = 101 , bit[5:4] = 01
+ USB_DRV_ClearBits8(USB_PHYCR5_3,0x37);
+#if defined(DRV_MT6236_VERSION_CONTROL)
+ USB_DRV_SetBits8(USB_PHYCR5_3, (USB_PHYCR5_3_XCVR_SELECT_L|USB_PHYCR5_3_TERM_SELECT|USB_PHYCR5_3_OP_MODE));
+#else
+ USB_DRV_SetBits8(USB_PHYCR5_3, (USB_PHYCR5_3_XCVR_SELECT_L|USB_PHYCR5_3_TERM_SELECT|USB_PHYCR5_3_OP_MODE|USB_PHYCR5_3_SUSPENDM));
+#endif
+
+#elif (defined(DRV_USB_PHY_U65_IP))
+
+// USB_DRV_ClearBits8(USB_U2PHYDTM0_0,USB_U2PHYDTM0_0_RG_SUSPENDM);
+// USB_DRV_SetBits8(USB_U2PHYDTM0_2,USB_U2PHYDTM0_2_FORCE_SUSPENDM);
+
+// for(delay=0; delay <10; delay++) ; /* wait for stable*/
+
+// USB_DRV_ClearBits8(USB_U2PHYAC0_0,(USB_U2PHYAC0_0_RG_BGR_BGR_EN|USB_U2PHYAC0_0_RG_BGR_ISRC_EN|USB_U2PHYAC0_0_RG_BGR_CHP_EN));
+#elif (defined(DRV_USB_PHY_M60_IP))
+
+#elif (defined(DRV_USB_PHY_U40_IP))
+
+#else //Old PHY version
+ //reg[612] bit 3,1,0 = 1
+ USB_DRV_SetBits8(USB_PHYCR5_2, (USB_PHYCR5_2_FORCE_XCVR_SELECT|USB_PHYCR5_2_FORCE_TERM_SELECT|USB_PHYCR5_2_FORCE_OP_MODE));
+ //reg[613] bit[2:0] = 101 , bit[5:4] = 01
+ USB_DRV_ClearBits8(USB_PHYCR5_3,0x37);
+ USB_DRV_SetBits8(USB_PHYCR5_3, (USB_PHYCR5_3_XCVR_SELECT_L|USB_PHYCR5_3_TERM_SELECT|USB_PHYCR5_3_OP_MODE));
+#endif //use UTMI to remove PHY 45 ohm resistor
+ USB_DRV_WriteReg(USB_INTRTXE, 0);
+ USB_DRV_WriteReg(USB_INTRRXE, 0);
+ USB_DRV_WriteReg8(USB_INTRUSBE, 0);
+
+ #ifdef __OTG_ENABLE__
+ if(((USB_DRV_Reg8(USB_DEVCTL)&USB_DEVCTL_SESSION) != 0)&&(USB_DRV_Reg8(USB_OPSTATE) == 0x21))
+ {
+ USB_DRV_WriteReg8(USB_DEVCTL, 0x00);
+
+ delay = 0;
+
+#if (defined(DRV_USB_PHY_COST_DOWN))
+ while((USB_DRV_Reg8(USB_PHYIR3_1) != USB_PHYIR3_1_SESSEND)&&(delay <= 40))
+#elif (defined(DRV_USB_PHY_U65_IP))
+ #if defined(DRV_USB_IP_V3)
+ USB_DRV_Reg8(USB_DUMMY);
+ #endif
+ while((USB_DRV_Reg8(USB_U2PHYDTM1_0) != USB_U2PHYDTM1_0_RG_SESSEND)&&(delay <= 40))
+#elif (defined(DRV_USB_PHY_M60_IP))
+#elif (defined(DRV_USB_PHY_U40_IP))
+
+#else //Old PHY version
+ while((USB_DRV_Reg8(USB_PHYIR2_0) != USB_PHYIR2_0_SESSEND)&&(delay <= 40))
+#endif
+ {
+ delay++;
+
+ if(kal_if_hisr() == KAL_FALSE)
+ {
+ kal_sleep_task(1);
+ }
+ }
+
+ if(delay == 41)
+ {
+ drv_trace0(TRACE_FUNC, (kal_uint32)USB_PDN_LOOP_FAIL);
+ }
+ }
+ #endif
+
+ USB_DRV_Reg8(USB_INTRUSB);
+ USB_DRV_Reg(USB_INTRTX);
+
+ #if defined(DRV_USB_IP_V4)
+ USB_DRV_WriteReg(USB_INTRRX, 0xFFFF); // write 1 clear
+ #else
+ USB_DRV_WriteReg(USB_INTRRX, 0); // write 0 clear
+ #endif
+
+
+#if (defined(__USB_AND_UART_WITH_ONE_GPIO__)||defined(__USB_AND_UART_WITH_ONE_PORT__))
+ USB_UART_Share(KAL_FALSE);
+#endif
+
+#else /* defined(DRV_USB_IP_V3)||defined(DRV_USB_IP_V4) */
+
+ /* disable sequence:1. GPIO(D+), 2. USB(USB register), 3. PDN_USB(USB power), 4. UPLL */
+
+ #if defined(DRV_USB_IP_V2)
+ USB_DRV_WriteReg8(USB_CTL, 0x00);
+ USB_DRV_WriteReg8(USB_INT_ENB, 0x00);
+ USB_DRV_WriteReg8(OTG_INT_EN, 0x00);
+ USB_DRV_WriteReg8(USB_SOFT_RST, VUSB_SOFT_RST_EN);
+ for(delay=0;delay<10;delay++) ; /* wait for stable*/
+
+ #elif (defined(DRV_USB_IP_V1)||defined(DRV_USB_IP_V1_PLUS))
+
+ #if (defined(DRV_USB_PHY_U65_IP)) //MT6251 = MAC (IP_Plus) + PHY (unit PHY IP)
+ USB_DRV_ClearBits8(USB_U1PHYCR0_1, USB_U1PHYCR0_1_RG_USB11_FSLS_ENBGRI);
+ USB_DRV_ClearBits8(USB_PHY_CONTROL, USB_PHY_CONTROL_PUB);
+ #elif (defined(DRV_USB_PHY_T55_IP))
+ USB_DRV_ClearBits32(USB_U1PHYCR1, U1PHYCR1_RG_USB11_PHY_REV_7);
+ USB_DRV_ClearBits32(USB_U1PHYCR0, U1PHYCR0_RG_USB11_FSLS_ENBGRI);
+ USB_DRV_ClearBits8(USB_PHY_CONTROL, USB_PHY_CONTROL_PUB);
+ #else //DRV_USB_IP_V1
+ USB_DRV_WriteReg8(USB_ENABLE, USB_ENABLE_DIS);
+ #endif
+
+ #endif
+
+ USB_PDNEnable();
+ UPLL_Disable(UPLL_OWNER_USB);
+#endif
+
+ }
+ else
+ {
+
+ /* Enable sequence: 1. UPLL, 2.PDN_USB(USB power), 3.USB(USB register), 4.GPIO(D+) */
+ UPLL_Enable(UPLL_OWNER_USB);
+ for(delay = 0; delay < 3500; delay++) ; /* wait for power stable */
+ USB_PDNDisable();
+
+#if defined(DRV_USB_IP_V3)||defined(DRV_USB_IP_V4)
+
+
+#if (defined(__USB_AND_UART_WITH_ONE_GPIO__)||defined(__USB_AND_UART_WITH_ONE_PORT__))
+ USB_UART_Share(KAL_TRUE);
+#endif
+
+
+
+ USB_DRV_WriteReg(USB_INTRTXE, 0);
+ USB_DRV_WriteReg(USB_INTRRXE, 0);
+ USB_DRV_WriteReg8(USB_INTRUSBE, 0);
+
+ USB_DRV_Reg8(USB_INTRUSB);
+ USB_DRV_Reg(USB_INTRTX);
+ #if defined(DRV_USB_IP_V4)
+ USB_DRV_WriteReg(USB_INTRRX, 0xFFFF); // write 1 clear
+ #else
+ USB_DRV_WriteReg(USB_INTRRX, 0); // write 0 clear
+ #endif
+ USB_DRV_WriteReg8(USB_DEVCTL, 0x00);
+#elif (defined(DRV_USB_IP_V1)||defined(DRV_USB_IP_V1_PLUS))
+ // clear interrupt before previous power down PDN, the interrupts are read then clear
+ USB_DRV_Reg8(USB_INTRUSB);
+ USB_DRV_Reg8(USB_INTRIN1);
+ USB_DRV_Reg8(USB_INTROUT1);
+
+ #if (defined(DRV_USB_PHY_U65_IP)) //MT6251 = MAC (IP_Plus) + PHY (unit PHY IP)
+ USB_DRV_SetBits8(USB_U1PHYCR1_1, USB_U1PHYCR1_1_RG_USB11_USBRESERVED); // USB PHY switch to USB1.1
+ USB_DRV_ClearBits8(USB_U1PHYCR1_1, USB_U1PHYCR1_1_RG_USB11_USBRESERVED_PMU); // USB PHY switch : turn off PMU
+ USB_DRV_SetBits8(USB_U1PHYCR0_1, USB_U1PHYCR0_1_RG_USB11_FSLS_ENBGRI); // USB PHY BIAS Current control
+ #elif (defined(DRV_USB_PHY_T55_IP))
+ USB_DRV_ClearBits32(USB_U1PHYCR1, U1PHYCR1_RG_USB11_PHY_REV_7);
+ USB_DRV_SetBits32(USB_U1PHYCR0, U1PHYCR0_RG_USB11_FSLS_ENBGRI);
+ for(delay = 0; delay < 1000; delay++);
+ #else
+ USB_DRV_WriteReg8(USB_ENABLE, USB_ENABLE_EN);
+ #endif
+#endif
+ }
+
+ return STATUS_OK;
+#else
+ return STATUS_INVALID_CMD;
+#endif
+}
+
+
+static DCL_STATUS DCL_USB_CTRL_API_USBDL_Update_USB_Download_Mode(DCL_CTRL_DATA_T *data)
+{
+#if (defined(DRV_USB_IP_V1)||defined(DRV_USB_IP_V1_PLUS)||defined(DRV_USB_IP_V2)||defined(DRV_USB_IP_V3)||defined(DRV_USB_IP_V4))
+#if !defined(DRV_USB_OFF)
+ #ifdef __MTK_TARGET__
+ USB_Fast_Meta_mode = (kal_bool)INT_GetSysStaByCmd(CHK_FAST_META, NULL);
+ #endif /* __MTK_TARGET__ */
+
+
+#if (defined(DRV_USB_IP_V1)||defined(DRV_USB_IP_V2))
+ /* Use a trick, if PC jump from bootloader to MAUI, and want to go into factory mode,
+ * then USB power down should be disable already
+ */
+#if defined(__CLKG_DEFINE__)
+ if((USB_DRV_Reg(CG_CON0)&CG_CON0_USB) == 0)
+#else
+ if((USB_DRV_Reg(DRVPDN_CON0)&DRVPDN_CON0_USB) == 0)
+#endif
+#elif defined(DRV_USB_IP_V3)||defined(DRV_USB_IP_V4)
+ //if USB & UART share pad, we will open USB power in bootrom.
+ // USB IP V3 use soft-connect to distinguish USB COM Port setup or not
+ if (USB_DRV_Reg8(USB_POWER)&USB_POWER_SOFTCONN)
+#elif defined(DRV_USB_IP_V1_PLUS)
+ #if defined(DRV_USB_PHY_T55_IP)
+ if ((USB_DRV_Reg8(USB_PHY_CONTROL)&USB_PHY_CONTROL_PUB)&&(USB_DRV_Reg32(USB_U1PHYCR0)&U1PHYCR0_RG_USB11_FSLS_ENBGRI))
+ #else
+ if ((USB_DRV_Reg8(USB_PHY_CONTROL)&USB_PHY_CONTROL_PUB)&&(USB_DRV_Reg8(USB_U1PHYCR0_1)&USB_U1PHYCR0_1_RG_USB11_FSLS_ENBGRI))
+ #endif
+#else
+ if(0)
+#endif
+ USBDL_mode = KAL_TRUE;
+ else
+ USBDL_mode = KAL_FALSE;
+#endif /*!defined(DRV_USB_OFF) */
+
+ return STATUS_OK;
+#else
+ return STATUS_INVALID_CMD;
+#endif
+}
+
+
+static DCL_STATUS DCL_USB_CTRL_API_USBDL_Is_USB_Download_Mode(DCL_CTRL_DATA_T *data)
+{
+ DCL_BOOL *usb_data;
+
+
+ usb_data = (DCL_BOOL *)data;
+ USBDL_mode = KAL_FALSE;
+ *usb_data = (DCL_BOOL)USBDL_mode;
+ return STATUS_OK;
+}
+
+static DCL_STATUS DCL_USB_CTRL_API_USBDL_Is_USB_Fast_Meta_Mode(DCL_CTRL_DATA_T *data)
+{
+ DCL_BOOL *usb_data;
+
+
+ usb_data = (DCL_BOOL *)data;
+ USB_Fast_Meta_mode = KAL_FALSE;
+ *usb_data = (DCL_BOOL)USB_Fast_Meta_mode;
+ return STATUS_OK;
+}
+
+void USB_EP_Bulk_HW_TxPktRdy_Enable(kal_uint32 ep_num, kal_bool enable)
+{
+#if defined(DRV_USB_IP_V4)
+ kal_uint32 savedMask;
+
+ savedMask = SaveAndSetIRQMask();
+ USB_DRV_WriteReg8(USB_INDEX, ep_num);
+ DRV_WriteReg(USB_TXCSR, USB_DMA_TX_CSR);
+ RestoreIRQMask(savedMask);
+ if(enable == KAL_TRUE)
+ {
+ USB_DRV_SetBits32((USB_HWTPR_EN), (1<<ep_num));
+ }
+ else
+ {
+ USB_DRV_ClearBits32((USB_HWTPR_EN), (1<<ep_num));
+ }
+
+#else
+ ASSERT(0);
+#endif
+}
+
+kal_uint32 USB_EP_Bulk_HW_FIFO_Addr(kal_uint32 ep_num)
+{
+#if defined(DRV_USB_IP_V4)
+ return (USB_EP0 + ep_num*4);
+#else
+ ASSERT(0);
+#endif
+}
+
+kal_uint32 USB_EP_Bulk_HW_TxPktRdy_Addr(void)
+{
+#if defined(DRV_USB_IP_V4)
+ return (USB_HWTPR);
+#else
+ ASSERT(0);
+#endif
+}
+
+void USB_EP_Bulk_HW_Set_TxPktRdy(kal_uint32 ep_num)
+{
+#if defined(DRV_USB_IP_V4)
+ USB_DRV_SetBits32((USB_HWTPR), (1<<ep_num));
+#else
+ ASSERT(0);
+#endif
+}
diff --git a/mcu/driver/connectivity/usb_driver/src/dcl_usb_hcd.c b/mcu/driver/connectivity/usb_driver/src/dcl_usb_hcd.c
new file mode 100644
index 0000000..8cc2246
--- /dev/null
+++ b/mcu/driver/connectivity/usb_driver/src/dcl_usb_hcd.c
@@ -0,0 +1,5813 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * dcl_usb_hcd.c
+ *
+ * Project:
+ * --------
+ * Maui_sw
+ *
+ * Description:
+ * ------------
+ * This file defines the DCL common definitions for USB host driver.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+#include "drv_comm.h"
+#include "reg_base.h"
+
+#include "drvpdn.h"
+#include "intrCtrl.h"
+#include "gpio_sw.h"
+#include "dma_hw.h"
+#include "dma_sw.h"
+#include "init.h"
+#include "cache_sw.h"
+
+#include "usb_hw.h"
+#include "eint.h"
+#include "usb_hcd.h"
+#include "usb_hcd_pri.h"
+#include "drv_hisr.h"
+//#include "stack_common.h" /* sap_type */
+#include "kal_public_defs.h" //MSBB change #include "stack_msgs.h" /* msg_type */
+#include "kal_public_api.h" //#include "stack_ltlcom.h" //MSBB change #include "app_ltlcom.h" /* Task message communiction */
+
+//#include "stack_common.h" /* sap_type */
+//#include "stack_msgs.h" /* msg_type */
+//#include "app_ltlcom.h" /* Task message communiction */
+#include "otg_if.h"
+#include "otg_drv.h"
+#include "usb_debug_tool.h"
+#if defined(__IC_USB_ENABLE__)
+#include "icusb_debug_tool.h"
+#endif
+#include "upll_ctrl.h"
+#include "usb_custom.h"
+#include "usb_trc.h"
+
+#include "dcl.h"
+
+#if (defined(MT6326))
+//#include "pmic6326_sw.h"
+//#include "i2c_dual_sw.h"
+#include "Dcl_pmic6326_sw.h"
+#endif
+
+
+
+
+
+//#ifdef DCL_USB_INTERFACE
+
+#if defined(__OTG_ENABLE__)||defined(__IC_USB_ENABLE__)
+
+#if defined(DRV_USB_IP_V4)
+#pragma arm section zidata = "NONCACHEDZI", rwdata = "NONCACHEDRW"
+TGPD USB_DMAQ_TX_GPD[TGPD_MAX_NUMBERS+1];
+TGPD USB_DMAQ_RX_GPD[TGPD_MAX_NUMBERS+1];
+#pragma arm section zidata, rwdata
+#endif
+
+/* Global variables */
+#define DCL_USB_HCD_HANDLE 0x00002000
+#define DCL_USB_HCD_CHECK_HANDLE_IS_VALID(handle) ((handle)&DCL_USB_HCD_HANDLE)
+
+
+/* static variables */
+static kal_bool g_USB_Hcd_Init = KAL_FALSE;
+static kal_bool g_USB_Hcd_Open = KAL_FALSE;
+
+static USB_HCD_Struct g_UsbHcdInfo[USB_IP_NUM];
+static void USB_HCD_Reset_Recovery_Timeout(void *parameter);
+static void USB_HCD_Reset_Timeout(void *parameter);
+static void USB_HCD_Delay_Reset_Timeout(void *parameter);
+static void USB_HCD_Debounce_Timeout(void *parameter);
+static void USB_HCD_Debounce_Attach(kal_uint8 usb_ip_port);
+static void USB_HCD_Process_Attach(kal_uint8 usb_ip_port);
+static void USB_HCD_Process_Detach(kal_uint8 usb_ip_port);
+
+#if defined(__IC_USB_ENABLE__)
+static void USB_HCD_Remote_Wakeup(void);
+#endif
+
+static void USB_HCD_Resume_Recovery_Timeout(void *parameter);
+static void USB_HCD_Send_Setup(USBH_Common_Struct common_str,USBH_EP_Struct usb_ep_str);
+static void USB_HCD_Send_Data(USBH_Common_Struct common_str,USBH_EP_Struct usb_ep_str);
+static void USB_HCD_Recv_Data(USBH_Common_Struct common_str,USBH_EP_Struct usb_ep_str);
+static void USB_HCD_DMA_Timeout_Hdlr(void *parameter);
+
+extern const kal_uint32 USB_BaseAddr[USB_IP_NUM];
+extern const kal_uint8 USB_IRQ_MAP[USB_IP_NUM];
+extern const kal_uint8 USBDMA_IRQ_MAP[USB_IP_NUM];
+
+
+/* EP0's FIFO address is fixed from 0~63 */
+static kal_uint32 g_HCD_FIFOadd = USB_FIFO_START_ADDRESS;
+
+const kal_uint32 USB_BaseAddr[USB_IP_NUM] =
+{
+#ifdef __USB_ENABLE__
+ USB_base,
+#endif
+
+#ifdef __IC_USB_ENABLE__
+ ICUSB1_base,
+#endif
+};
+
+const kal_uint8 USB_IRQ_MAP[USB_IP_NUM]=
+{
+#ifdef __USB_ENABLE__
+ IRQ_USB_CODE,
+#endif
+
+#ifdef __IC_USB_ENABLE__
+ IRQ_IC_USB1_CODE,
+#endif
+};
+
+#if defined(DRV_USB_IP_V3)
+const kal_uint8 USBDMA_IRQ_MAP[USB_IP_NUM]=
+{
+#ifdef __USB_ENABLE__
+ IRQ_USBDMA_CODE,
+#endif
+
+#ifdef __IC_USB_ENABLE__
+ IRQ_IC_USBDMA1_CODE,
+#endif
+};
+#endif
+
+/************************************************************
+ static basic check functions
+*************************************************************/
+
+static void USB_HCD_EP_Check(kal_uint8 usb_ip_port,kal_uint32 ep_num, USB_EP_DIRECTION direction, kal_uint32 line)
+{
+ if (usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+ if (usb_ip_port < USB_EXT_IP_NUM)
+{
+ if((ep_num == 0)||((direction == USB_EP_TX_DIR)&&(ep_num > MAX_TX_EP_NUM))||
+ ((direction == USB_EP_RX_DIR)&&(ep_num > MAX_RX_EP_NUM)))
+ EXT_ASSERT(0, ep_num, (kal_uint32)direction, line);
+ }
+#if defined(__IC_USB_ENABLE__)
+ else
+ {
+ if((ep_num == 0)||((direction == USB_EP_TX_DIR)&&(ep_num > ICUSB_MAX_TX_EP_NUM))||
+ ((direction == USB_EP_RX_DIR)&&(ep_num > ICUSB_MAX_RX_EP_NUM)))
+ EXT_ASSERT(0, ep_num, (kal_uint32)direction, line);
+ }
+#endif
+}
+
+static kal_bool USB_HCD_Speed_Read_Is_HS(kal_uint8 usb_ip_port)
+{
+ if((USB_DRV_Reg8(USB_POWER_HCD(USB_BaseAddr[usb_ip_port]))&USB_POWER_HSMODE) != 0)
+ return KAL_TRUE;
+ else
+ return KAL_FALSE;
+}
+
+kal_bool USB_HCD_Get_UnMask_Irq(kal_uint8 usb_ip_port)
+{
+ return g_UsbHcdInfo[usb_ip_port].b_unmask_irq;
+}
+
+
+static kal_bool USB_HCD_Is_High_Speed(kal_uint8 usb_ip_port)
+{
+ return g_UsbHcdInfo[usb_ip_port].b_hcd_is_high_speed;
+}
+
+static kal_bool USB_HCD_Is_RemoteWakeup_SUPPORT(kal_uint8 usb_ip_port)
+{
+ return g_UsbHcdInfo[usb_ip_port].host_common_param->support_Remote_Wakeup;
+}
+
+
+void USB_HCD_VBusEnable(kal_uint8 usb_ip_port,kal_bool enable)
+{
+ kal_uint32 delay;
+
+#if (defined(MT6326))
+ DCL_HANDLE handle;
+ PMU_CTRL_LDO_BUCK_SET_EN val;
+ PMU_CTRL_LDO_BUCK_SET_VOLTAGE volt;
+ val.enable = enable;
+ val.mod = VBUS;
+ handle = DclPMU_Open(DCL_PMU, FLAGS_NONE);
+#endif
+
+ if (usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+ if(enable == KAL_TRUE)
+ {
+
+#if (defined(MT6326))
+ volt.mod = VBUS;
+ volt.voltage = PMU_VOLT_05_300000_V;
+ DclPMU_Control(handle, LDO_BUCK_SET_VOLTAGE, (DCL_CTRL_DATA_T *)&volt);
+// dcl_pmic6326_vboost1_tune(VBOOST1_VOL_5_30_V);
+
+ DclPMU_Control(handle, LDO_BUCK_SET_EN, (DCL_CTRL_DATA_T *)&val);
+// dcl_pmic6326_boost_mode(BOOST_MODE_TYPE_I);
+// dcl_pmic6326_boost1_enable (KAL_TRUE);
+// dcl_pmic6326_vbus_enable(KAL_TRUE);
+#endif
+
+ for (delay = 0; delay < 50000; delay ++); //1000
+
+ USB_DRV_SetBits8(USB_DEVCTL_HCD(USB_BaseAddr[usb_ip_port]), USB_DEVCTL_SESSION);
+ }
+ else
+ {
+ USB_DRV_ClearBits8(USB_DEVCTL_HCD(USB_BaseAddr[usb_ip_port]), USB_DEVCTL_SESSION);
+
+#if (defined(MT6326))
+ DclPMU_Control(handle, LDO_BUCK_SET_EN, (DCL_CTRL_DATA_T *)&val);
+// dcl_pmic6326_vbus_enable(KAL_FALSE);
+#endif
+
+ }
+
+#if (defined(MT6326))
+ DclPMU_Close(handle);
+#endif
+}
+
+
+kal_bool USB_HCD_DMA_Get_Run_Status(kal_uint8 usb_ip_port, kal_uint8 dma_chan)
+{
+ return g_UsbHcdInfo[usb_ip_port].dma_running[dma_chan-1];
+}
+
+
+static void USB_HCD_EP_DMA_Running_Check(kal_uint8 usb_ip_port,kal_uint32 ep_num, USB_EP_DIRECTION direction, kal_uint32 line)
+{
+ kal_uint8 dma_chan;
+
+ dma_chan = g_UsbHcdInfo[usb_ip_port].dma_port[direction][ep_num-1];
+
+ if((dma_chan != 0)&&(USBHCD_DMA_CheckRunStat(USB_BaseAddr[usb_ip_port],dma_chan) != 0))
+ {
+ EXT_ASSERT(0, ep_num, (kal_uint32)direction, line);
+ }
+}
+
+static kal_uint8 USB_HCD_Get_DMA_Channel_Num(kal_uint8 usb_ip_port,kal_uint8 ep_num, USB_EP_DIRECTION direction)
+{
+ kal_uint8 dma_chan;
+
+ USB_HCD_EP_Check(usb_ip_port,ep_num, direction, 0);
+
+ dma_chan = g_UsbHcdInfo[usb_ip_port].dma_port[direction][ep_num-1];
+
+ if (usb_ip_port < USB_EXT_IP_NUM)
+ {
+ if(g_UsbHcdInfo[usb_ip_port].dma_channel > MAX_DMA_NUM)
+ EXT_ASSERT(0, g_UsbHcdInfo[usb_ip_port].dma_channel, MAX_DMA_NUM, 0);
+ }
+#if defined(__IC_USB_ENABLE__)
+ else
+ {
+ if(g_UsbHcdInfo[usb_ip_port].dma_channel > ICUSB_MAX_DMA_NUM)
+ EXT_ASSERT(0, g_UsbHcdInfo[usb_ip_port].dma_channel, ICUSB_MAX_DMA_NUM, 0);
+ }
+#endif
+
+ return dma_chan;
+}
+
+
+static void USB_HCD_Stop_DMA_Channel(kal_uint8 usb_ip_port,kal_uint8 ep_num, USB_EP_DIRECTION direction)
+{
+ kal_uint8 dma_chan;
+
+ dma_chan = USB_HCD_Get_DMA_Channel_Num(usb_ip_port,ep_num, direction);
+
+ if(g_UsbHcdInfo[usb_ip_port].dma_dir[dma_chan-1] == USB_EP_RX_DIR)
+ {
+ /* Stop DMA RX timer */
+ DclSGPT_Control((DCL_HANDLE)(g_UsbHcdInfo[usb_ip_port].dma_gpt_handle[ep_num-1]), SGPT_CMD_STOP, 0);
+// GPTI_StopItem(g_UsbHcdInfo[usb_ip_port].dma_gpt_handle[ep_num-1]);
+ }
+
+ /* stop DMA channel */
+ USBHCD_DMA_Stop(USB_BaseAddr[usb_ip_port],dma_chan);
+
+ /* Clear pending DMA interrupts */
+#if defined(DRV_USB_IP_V3)
+ // write 0 clear
+ USB_DRV_WriteReg32(USB_DMAINTR_HCD(USB_BaseAddr[usb_ip_port]), ~((1<<(dma_chan-1))|(0xC000<<(dma_chan*2))));
+#elif defined(DRV_USB_IP_V4)
+ // write 1 clear
+ USB_DRV_WriteReg8(USB_DMAINTR_HCD(USB_BaseAddr[usb_ip_port]), (1<<(dma_chan-1)));
+#endif
+
+ g_UsbHcdInfo[usb_ip_port].dma_pktrdy[dma_chan - 1] = KAL_FALSE;
+ g_UsbHcdInfo[usb_ip_port].dma_running[dma_chan - 1] = KAL_FALSE;
+
+}
+
+
+static void USB_HCD_Stop_All_Active_Traffic(kal_uint8 usb_ip_port)
+{
+ kal_uint32 index;
+ kal_uint32 ep_num;
+ kal_uint16 TXCSR;
+ kal_uint16 RXCSR;
+ kal_uint8 dma_channel = 0;
+
+
+ if (usb_ip_port < USB_EXT_IP_NUM)
+ dma_channel = MAX_DMA_NUM;
+#if defined(__IC_USB_ENABLE__)
+ else
+ dma_channel = ICUSB_MAX_DMA_NUM;
+#endif
+
+
+
+ /* Stop all running DMA */
+ for (index = 0; index < dma_channel; index++)
+ {
+ if(g_UsbHcdInfo[usb_ip_port].dma_running[index] == KAL_TRUE)
+ {
+ if(g_UsbHcdInfo[usb_ip_port].dma_dir[index] == USB_EP_TX_DIR)
+ {
+ ep_num = g_UsbHcdInfo[usb_ip_port].dma_tx_ep_num[index];
+
+ USB_HCD_Stop_DMA_Channel(usb_ip_port,ep_num, USB_EP_TX_DIR);
+
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), ep_num);
+ TXCSR = USB_DRV_Reg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]));
+ TXCSR |= USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG;
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), 0x00);
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), TXCSR);
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), TXCSR);
+
+ g_UsbHcdInfo[usb_ip_port].ep_tx_flush_intr[ep_num-1] = KAL_TRUE;
+
+ if(g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[ep_num-1] != NULL)
+ g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[ep_num-1](usb_ip_port,USB_HCD_DETATCH, 0);
+ }
+ else
+ {
+ ep_num = g_UsbHcdInfo[usb_ip_port].dma_rx_ep_num[index];
+
+ USB_HCD_Stop_DMA_Channel(usb_ip_port,ep_num, USB_EP_RX_DIR);
+
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), ep_num);
+ RXCSR = USB_DRV_Reg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]));
+ RXCSR |= USB_RXCSR_FLUSHFIFO|USB_RXCSR_CLRDATATOG;
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), 0x00);
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), RXCSR);
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), RXCSR);
+
+ g_UsbHcdInfo[usb_ip_port].ep_rx_flush_intr[ep_num-1] = KAL_TRUE;
+
+ if(g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num-1] != NULL)
+ g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num-1](usb_ip_port,USB_HCD_DETATCH, 0);
+ }
+ }
+ }
+
+ /* Remove and notify all queued endpoints */
+ if(g_UsbHcdInfo[usb_ip_port].ep0_fifo_intr == KAL_TRUE)
+ {
+ g_UsbHcdInfo[usb_ip_port].ep0_fifo_intr = KAL_FALSE;
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), 0);
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), USB_CSR0_FLUSHFIFO);
+
+ /* When USB host turn off Vbus, then call host down func will release ep0 handler, but before Vbus off disconn intr happen */
+ if(g_UsbHcdInfo[usb_ip_port].ep0_hdlr != NULL)
+ g_UsbHcdInfo[usb_ip_port].ep0_hdlr(usb_ip_port,USB_HCD_DETATCH, 0);
+ }
+
+ for(ep_num = 1; ep_num <= MAX_TX_EP_NUM; ep_num++)
+ {
+ if(g_UsbHcdInfo[usb_ip_port].ep_tx_fifo_intr[ep_num-1] == KAL_TRUE)
+ {
+ g_UsbHcdInfo[usb_ip_port].ep_tx_fifo_intr[ep_num-1] = KAL_FALSE;
+
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), ep_num);
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), 0x00);
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG);
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG);
+
+ g_UsbHcdInfo[usb_ip_port].ep_tx_flush_intr[ep_num-1] = KAL_TRUE;
+
+ if(g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[ep_num-1] != NULL)
+ g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[ep_num-1](usb_ip_port,USB_HCD_DETATCH, 0);
+ }
+ }
+
+ for(ep_num = 1; ep_num <= MAX_RX_EP_NUM; ep_num++)
+ {
+ if(g_UsbHcdInfo[usb_ip_port].ep_rx_fifo_intr[ep_num-1] == KAL_TRUE)
+ {
+ g_UsbHcdInfo[usb_ip_port].ep_rx_fifo_intr[ep_num-1] = KAL_FALSE;
+
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), ep_num);
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), 0x00);
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_RXCSR_FLUSHFIFO|USB_RXCSR_CLRDATATOG);
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_RXCSR_FLUSHFIFO|USB_RXCSR_CLRDATATOG);
+
+ g_UsbHcdInfo[usb_ip_port].ep_rx_flush_intr[ep_num-1] = KAL_TRUE;
+
+ if(g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num-1] != NULL)
+ g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num-1](usb_ip_port,USB_HCD_DETATCH, 0);
+ }
+ }
+
+}
+
+
+static kal_uint32 USB_HCD_EP_Rx_Pkt_Len(USBH_Common_Struct common_str,USBH_EP_Struct usb_ep_str)
+{
+ kal_uint32 savedMask;
+ kal_uint16 CSR;
+ kal_uint32 nCount = 0;
+
+ USB_HCD_EP_Check(common_str.usb_ip_port,usb_ep_str.ep_num, USB_EP_RX_DIR, 0);
+
+ savedMask = SaveAndSetIRQMask();
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[common_str.usb_ip_port]), usb_ep_str.ep_num);
+ CSR = USB_DRV_Reg(USB_RXCSR_HCD(USB_BaseAddr[common_str.usb_ip_port]));
+
+ if(CSR&USB_RXCSR_RXPKTRDY)
+ {
+ nCount = (kal_uint32)USB_DRV_Reg(USB_RXCOUNT_HCD(USB_BaseAddr[common_str.usb_ip_port]));
+ }
+ RestoreIRQMask(savedMask);
+
+ return nCount;
+}
+
+/* Return packet length for endpoint 0*/
+kal_uint32 USB_HCD_EP0_Pkt_Len(USBH_Common_Struct common_str)
+{
+ kal_uint32 savedMask;
+ kal_uint32 nCount = 0;
+ kal_uint16 CSR0;
+
+ savedMask = SaveAndSetIRQMask();
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[common_str.usb_ip_port]), 0);
+ CSR0 = USB_DRV_Reg(USB_CSR0_HCD(USB_BaseAddr[common_str.usb_ip_port]));
+
+ if(CSR0&USB_CSR0_RXPKTRDY)
+ {
+ nCount = (kal_uint32)USB_DRV_Reg8(USB_COUNT0_HCD(USB_BaseAddr[common_str.usb_ip_port]));
+ }
+ RestoreIRQMask(savedMask);
+
+ return nCount;
+}
+
+/* EP RX data already read out, clear the data */
+static void USB_HCD_EP_Bulk_Rx_Ready(kal_uint8 usb_ip_port,kal_uint8 ep_num)
+{
+ kal_uint32 savedMask;
+
+ USB_HCD_EP_Check(usb_ip_port,ep_num, USB_EP_RX_DIR, 0);
+
+ savedMask = SaveAndSetIRQMask();
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), ep_num);
+ USB_DRV_ClearBits(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_RXCSR_RXPKTRDY);
+ RestoreIRQMask(savedMask);
+
+}
+
+/* EP TX data prepared ready, set ready bit */
+static void USB_HCD_EP_Bulk_Tx_Ready(kal_uint8 usb_ip_port,kal_uint8 ep_num)
+{
+ kal_uint32 savedMask;
+
+ USB_Dbg_Trace(USB_DBG_SET_TXPKTREADY,ep_num, 0);
+ USB_HCD_EP_Check(usb_ip_port,ep_num, USB_EP_TX_DIR, 0);
+ USB_HCD_EP_DMA_Running_Check(usb_ip_port,ep_num, USB_EP_TX_DIR, 0);
+
+ savedMask = SaveAndSetIRQMask(); //DMA_Setup : clear UnderRun bit & Set TX_PkyReady at the same time
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), ep_num);
+
+ if(USB_DRV_Reg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]))&USB_TXCSR_TXPKTRDY) // check TX_PktReady bit
+ {
+ ASSERT(0);
+ }
+ USB_DRV_SetBits(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_TXCSR_TXPKTRDY);
+ RestoreIRQMask(savedMask);
+
+}
+
+
+static void USB_HCD_EP_Interval(USBH_Common_Struct common_str,USBH_EP_Struct usb_ep_str,kal_uint8 interval)
+{
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[common_str.usb_ip_port]), usb_ep_str.ep_num);
+
+ if (usb_ep_str.direction == USB_EP_TX_DIR)
+ {
+ if (usb_ep_str.ep_num == 0)
+ {
+ USB_DRV_WriteReg8(USB_NAKLIMIT0_HCD(USB_BaseAddr[common_str.usb_ip_port]),interval);
+ }
+ else
+ {
+ USB_DRV_WriteReg8(USB_TXINTERVAL_HCD(USB_BaseAddr[common_str.usb_ip_port]),interval);
+ }
+ }
+ else
+ {
+ USB_DRV_WriteReg8(USB_RXINTERVAL_HCD(USB_BaseAddr[common_str.usb_ip_port]),interval);
+ }
+}
+
+/* GPT timeout function*/
+static void USB_HCD_Debounce_Timeout(void *parameter)
+{
+ SGPT_CTRL_START_T start;
+ USB_HCD_Struct *USBD_Data = (USB_HCD_Struct *)parameter;
+ kal_uint8 usb_ip_port = USBD_Data->usb_ip_port;
+
+
+ if (usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+ DclSGPT_Control((DCL_HANDLE)(g_UsbHcdInfo[usb_ip_port].gpt_handle), SGPT_CMD_STOP, 0);
+// GPTI_StopItem(g_UsbHcdInfo[usb_ip_port].gpt_handle);
+
+ if(g_UsbHcdInfo[usb_ip_port].b_disable_attach == KAL_TRUE)
+ {
+ start.u2Tick = USB_HCD_DEBOUNCE_DELAY;
+ start.pfCallback = USB_HCD_Debounce_Timeout;
+ start.vPara = &g_UsbHcdInfo[usb_ip_port];
+ DclSGPT_Control((DCL_HANDLE)(g_UsbHcdInfo[usb_ip_port].gpt_handle), SGPT_CMD_START, (DCL_CTRL_DATA_T*)&start);
+// GPTI_StartItem(g_UsbHcdInfo[usb_ip_port].gpt_handle, USB_HCD_DEBOUNCE_DELAY,USB_HCD_Debounce_Timeout, &g_UsbHcdInfo[usb_ip_port]);
+ }
+ else
+ {
+ USB_HCD_Debounce_Attach(usb_ip_port);
+ }
+}
+
+/* Send reset signal to device*/
+static void USB_HCD_Reset_Device(kal_uint8 usb_ip_port,USB_HCD_STATUS reset_reason)
+{
+ SGPT_CTRL_START_T start;
+
+ /* Reset addr as 0 */
+ USB_DRV_WriteReg8(USB_FADDR_HCD(USB_BaseAddr[usb_ip_port]), 0);
+
+ /* Clear all endpoints' interrupts */
+ USB_DRV_Reg(USB_INTRTX_HCD(USB_BaseAddr[usb_ip_port]));
+ // write 0 clear
+ USB_DRV_WriteReg(USB_INTRRX_HCD(USB_BaseAddr[usb_ip_port]), 0);
+
+#ifdef DRV_USB_PHY_COST_DOWN //6268B
+ if (usb_ip_port < USB_EXT_IP_NUM)
+ {
+ if(OTG_Get_Plug_Type() == OTG_PLUG_A)
+ {
+ USB_DRV_WriteReg8(USB_PHYIR4_0, (USB_PHYIR4_0_RG_CALIB_SELE0_ENABLE|USB_PHYIR4_0_RG_TX_I_TRIM0));
+ USB_DRV_WriteReg8(USB_PHYCR2_2, (USB_PHYCR2_2_HS_DISC_TH|USB_PHYCR2_2_HSDISC_DEGL|USB_PHYCR2_2_HS_TRIM_TH));
+ }
+ }
+#endif
+
+ /* Set reset on the USB bus for 20ms */
+ USB_DRV_SetBits8(USB_POWER_HCD(USB_BaseAddr[usb_ip_port]), USB_POWER_RESET);
+
+ g_UsbHcdInfo[usb_ip_port].reset_reason = reset_reason;
+
+ /* Delay for the reset process to complete */
+ start.u2Tick = USB_HCD_RESET_DELAY;
+ start.pfCallback = USB_HCD_Reset_Timeout;
+ start.vPara = &g_UsbHcdInfo[usb_ip_port];
+ DclSGPT_Control((DCL_HANDLE)(g_UsbHcdInfo[usb_ip_port].gpt_handle), SGPT_CMD_START, (DCL_CTRL_DATA_T*)&start);
+// GPTI_StartItem(g_UsbHcdInfo[usb_ip_port].gpt_handle, USB_HCD_RESET_DELAY,USB_HCD_Reset_Timeout, &g_UsbHcdInfo[usb_ip_port]);
+}
+
+
+static void USB_HCD_Debounce_Attach(kal_uint8 usb_ip_port)
+{
+ if (usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+ /* Reset the device */
+ USB_HCD_Reset_Device(usb_ip_port,USB_HCD_OK);
+
+}
+
+
+static void USB_HCD_Process_Attach(kal_uint8 usb_ip_port)
+{
+ SGPT_CTRL_START_T start;
+ OTG_STATE otg_state = OTG_Get_State();
+
+ if (usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+
+ if (usb_ip_port < USB_EXT_IP_NUM)
+ {
+
+// if(((otg_state != OTG_STATE_A_SUSPEND)&&(otg_state != OTG_STATE_B_WAIT_ACON))
+// || (g_UsbHcdInfo[usb_ip_port].b_disable_attach == KAL_TRUE))
+ if((otg_state == OTG_STATE_A_WAIT_BCON)
+ ||(g_UsbHcdInfo[usb_ip_port].b_disable_attach == KAL_TRUE))
+ {
+ /* g_UsbHcdInfo[usb_ip_port].b_disable_attach == KAL_TRUE because it needs to wait FMT call message ACK */
+ /* host need at least 100ms debounce time */
+
+ /* Add for OTG function */
+ OTG_Set_Status(OTG_STATUS_A_DETECT_B_CONN, KAL_TRUE);
+
+ start.u2Tick = USB_HCD_DEBOUNCE_DELAY;
+ start.pfCallback = USB_HCD_Debounce_Timeout;
+ start.vPara = &g_UsbHcdInfo[usb_ip_port];
+ DclSGPT_Control((DCL_HANDLE)(g_UsbHcdInfo[usb_ip_port].gpt_handle), SGPT_CMD_START, (DCL_CTRL_DATA_T*)&start);
+
+// GPTI_StartItem(g_UsbHcdInfo[usb_ip_port].gpt_handle, USB_HCD_DEBOUNCE_DELAY,USB_HCD_Debounce_Timeout, &g_UsbHcdInfo[usb_ip_port]);
+ /* disable interrupt */
+ g_UsbHcdInfo[usb_ip_port].b_unmask_irq = KAL_FALSE;
+ }
+ else if (otg_state == OTG_STATE_B_WAIT_ACON)
+ {
+ /* Add for OTG function*/
+ OTG_Set_Status(OTG_STATUS_B_DETECT_A_CONN, KAL_TRUE);
+
+ /* Do HNP, B-device reset A-device automatically, need no debounce time */
+ USB_HCD_Debounce_Attach(usb_ip_port);
+ }
+ else
+ {
+ ASSERT(0);
+ }
+ }
+ else
+ { //UT Test
+ start.u2Tick = USB_HCD_DEBOUNCE_DELAY;
+ start.pfCallback = USB_HCD_Debounce_Timeout;
+ start.vPara = &g_UsbHcdInfo[usb_ip_port];
+ DclSGPT_Control((DCL_HANDLE)(g_UsbHcdInfo[usb_ip_port].gpt_handle), SGPT_CMD_START, (DCL_CTRL_DATA_T*)&start);
+
+// GPTI_StartItem(g_UsbHcdInfo[usb_ip_port].gpt_handle, USB_HCD_DEBOUNCE_DELAY,USB_HCD_Debounce_Timeout, &g_UsbHcdInfo[usb_ip_port]);
+// USB_HCD_Debounce_Attach(usb_ip_port);
+ }
+}
+
+static void USB_HCD_Reset_Resource(kal_uint8 usb_ip_port)
+{
+ g_HCD_FIFOadd = USB_FIFO_START_ADDRESS;
+ g_UsbHcdInfo[usb_ip_port].dma_channel = 0;
+ g_UsbHcdInfo[usb_ip_port].ep_tx_real_num = 0;
+ g_UsbHcdInfo[usb_ip_port].ep_rx_real_num = 0;
+}
+
+static void USB_HCD_Process_Detach(kal_uint8 usb_ip_port)
+{
+
+ if (usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+ /* Reset all the attached device specific values */
+ USB_DRV_WriteReg8(USB_FADDR_HCD(USB_BaseAddr[usb_ip_port]), 0);
+
+ /* Clear all endpoints' interrupts */
+ USB_DRV_Reg(USB_INTRTX_HCD(USB_BaseAddr[usb_ip_port]));
+ // write 0 clear
+ USB_DRV_WriteReg(USB_INTRRX_HCD(USB_BaseAddr[usb_ip_port]), 0);
+
+ g_UsbHcdInfo[usb_ip_port].b_hcd_is_high_speed = KAL_FALSE;
+
+ if (usb_ip_port < USB_EXT_IP_NUM)
+ {
+ if(OTG_Get_State() == OTG_STATE_B_IDLE)
+ {
+ ASSERT(0);
+ }
+ /* Add for OTG function */
+ if(OTG_Get_Plug_Type() == OTG_PLUG_A)
+ OTG_Set_Status(OTG_STATUS_A_DETECT_B_CONN, KAL_FALSE);
+ else
+ OTG_Set_Status(OTG_STATUS_B_DETECT_A_CONN, KAL_FALSE);
+
+ }
+ /* Call the callback function if there was one registered for a detach
+ ** event
+ */
+ if(g_UsbHcdInfo[usb_ip_port].detach_hdlr == NULL)
+ EXT_ASSERT(0, 0, 0, 0);
+ g_UsbHcdInfo[usb_ip_port].detach_hdlr(usb_ip_port,USB_HCD_OK, 0);
+
+ USB_HCD_Reset_Resource(usb_ip_port);
+
+} /* Endbody */
+
+
+/* Host detect remote wakeup */
+static void USB_HCD_Resume_Recovery_Timeout(void *parameter)
+{
+ USB_HCD_Struct *USBD_Data = (USB_HCD_Struct *)parameter;
+ kal_uint8 usb_ip_port = USBD_Data->usb_ip_port;
+
+ if (usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+ if (g_UsbHcdInfo[usb_ip_port].host_state != USBH_STATE_HOST)
+ ASSERT(0);
+
+ DclSGPT_Control((DCL_HANDLE)(g_UsbHcdInfo[usb_ip_port].gpt_handle), SGPT_CMD_STOP, 0);
+// GPTI_StopItem(g_UsbHcdInfo[usb_ip_port].gpt_handle);
+// ICUSB_Dbg_Trace(IC_USB_REMOTE_WAKEUP_DONE,0, 0);
+
+ USB_DRV_ClearBits8(USB_POWER_HCD(USB_BaseAddr[usb_ip_port]), USB_POWER_RESUME);
+
+ if(g_UsbHcdInfo[usb_ip_port].resume_hdlr != NULL)
+ g_UsbHcdInfo[usb_ip_port].resume_hdlr(usb_ip_port,USB_HCD_OK, 0);
+}
+
+
+#if defined(__IC_USB_ENABLE__)
+/* Host detect remote wakeup : called by EINT_Registration(icusb_eint) */
+static void USB_HCD_Remote_Wakeup(void)
+{
+ kal_uint8 icusb_remote_eint = 0x30;//custom_eint_get_channel(icusb_remote_eint_chann); QQ Test
+ kal_uint8 usb_ip_port = ICUSB_PORT_1; //IC USB Port
+
+ EINT_Mask(icusb_remote_eint);
+
+// IRQMask(IRQ_EIT_CODE); // mask all interrupt
+// SAL_EINT_Mask_Adv(1); // EINT1
+
+ /* Remote wakeup */
+// ICUSB_Dbg_Trace(IC_USB_REMOTE_WAKEUP, 0, 0);
+ USB_HCD_Send_Resume(usb_ip_port);
+}
+#endif
+
+
+static void USB_HCD_Resume(kal_uint8 usb_ip_port)
+{
+ if (usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+
+ if (usb_ip_port < USB_EXT_IP_NUM)
+ {
+ if(OTG_Get_State() == OTG_STATE_A_SUSPEND)
+ {
+ /* Add for OTG function */
+ OTG_Set_Status(OTG_STATUS_A_DETECT_B_RESUME, KAL_TRUE);
+ }
+
+ if(g_UsbHcdInfo[usb_ip_port].resume_hdlr != NULL)
+ g_UsbHcdInfo[usb_ip_port].resume_hdlr(usb_ip_port,USB_HCD_OK, 0);
+ }
+ else
+ {
+ ASSERT(0); //IC USB Detect remote wakeup by using EINT
+ }
+}
+
+void USB_HCD_Conn_Hdlr(kal_uint8 usb_ip_port)
+{
+ g_UsbHcdInfo[usb_ip_port].usb_ip_port = usb_ip_port;
+ USB_HCD_Stop_All_Active_Traffic(usb_ip_port);
+ USB_HCD_Process_Attach(usb_ip_port);
+ g_UsbHcdInfo[usb_ip_port].host_state = USBH_STATE_START;
+}
+
+void USB_HCD_Disconn_Hdlr(kal_uint8 usb_ip_port)
+{
+ USB_HCD_Stop_All_Active_Traffic(usb_ip_port);
+ USB_HCD_Process_Detach(usb_ip_port);
+ g_UsbHcdInfo[usb_ip_port].host_state = USBH_STATE_WAIT_BCON;
+}
+
+
+
+/* GPT timeout function*/
+static void USB_HCD_Reset_Recovery_Timeout(void *parameter)
+{
+ kal_uint32 savedMask;
+
+ USB_HCD_Struct *USBD_Data = (USB_HCD_Struct *)parameter;
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_ep_str;
+ common_str.usb_ip_port = USBD_Data->usb_ip_port;
+ usb_ep_str.ep_num = 0;
+ usb_ep_str.direction = USB_EP_TX_DIR;
+ usb_ep_str.ep_type = USB_ENDPT_CTRL;
+
+
+ if (common_str.usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+ DclSGPT_Control((DCL_HANDLE)(g_UsbHcdInfo[common_str.usb_ip_port].gpt_handle), SGPT_CMD_STOP, 0);
+// GPTI_StopItem(g_UsbHcdInfo[common_str.usb_ip_port].gpt_handle);
+
+ savedMask = SaveAndSetIRQMask();
+ /* Enable ep0 */
+
+ if (common_str.usb_ip_port < USB_EXT_IP_NUM)
+ {
+ /* Set NAK Limit, max value is 16, 16 stands for 4 seconds */
+ if(USB_HCD_Speed_Read_Is_HS(common_str.usb_ip_port) == KAL_TRUE)
+ {
+
+ USB_HCD_EP_Interval(common_str,usb_ep_str,g_UsbHcdInfo[common_str.usb_ip_port].host_common_param->ep0_interval);
+ g_UsbHcdInfo[common_str.usb_ip_port].b_hcd_is_high_speed = KAL_TRUE;
+ }
+ else
+ {
+ USB_HCD_EP_Interval(common_str,usb_ep_str,(g_UsbHcdInfo[common_str.usb_ip_port].host_common_param->ep0_interval-3));
+ g_UsbHcdInfo[common_str.usb_ip_port].b_hcd_is_high_speed = KAL_FALSE;
+ }
+ }
+ else
+ { // ICUSB only support USB1.1
+ USB_HCD_EP_Interval(common_str,usb_ep_str,(g_UsbHcdInfo[common_str.usb_ip_port].host_common_param->ep0_interval-3));
+ g_UsbHcdInfo[common_str.usb_ip_port].b_hcd_is_high_speed = KAL_FALSE;
+ }
+
+ RestoreIRQMask(savedMask);
+
+ /* Call the callback function of there was one register for the attach
+ ** event
+ */
+ if(g_UsbHcdInfo[common_str.usb_ip_port].attach_hdlr == NULL)
+ EXT_ASSERT(0, 0, 0, 0);
+ g_UsbHcdInfo[common_str.usb_ip_port].attach_hdlr(common_str.usb_ip_port,g_UsbHcdInfo[common_str.usb_ip_port].reset_reason, 0);
+
+ /* unmask USB IRQ*/
+ USB_Dbg_Trace(USB_HCD_UNMASK_HISR,1, 0);
+ g_UsbHcdInfo[common_str.usb_ip_port].b_unmask_irq = KAL_TRUE;
+
+ IRQUnmask(USB_IRQ_MAP[common_str.usb_ip_port]);
+
+}
+
+
+/* GPT timeout function*/
+static void USB_HCD_Reset_Timeout(void *parameter)
+{
+ SGPT_CTRL_START_T start;
+ USB_HCD_Struct *USBD_Data = (USB_HCD_Struct *)parameter;
+ kal_uint8 usb_ip_port = USBD_Data->usb_ip_port;
+
+ if (usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+ DclSGPT_Control((DCL_HANDLE)(g_UsbHcdInfo[usb_ip_port].gpt_handle), SGPT_CMD_STOP, 0);
+// GPTI_StopItem(g_UsbHcdInfo[usb_ip_port].gpt_handle);
+
+ /* End the reset */
+ USB_DRV_ClearBits8(USB_POWER_HCD(USB_BaseAddr[usb_ip_port]), USB_POWER_RESET);
+
+#ifdef DRV_USB_PHY_COST_DOWN //6268B
+ if (usb_ip_port < USB_EXT_IP_NUM)
+ {
+ if(OTG_Get_Plug_Type() == OTG_PLUG_A)
+ {
+ USB_DRV_WriteReg8(USB_PHYIR4_0, (USB_PHYIR4_0_RG_CALIB_SELE0_2|USB_PHYIR4_0_RG_TX_I_TRIM0));
+ }
+ }
+#endif
+
+
+ /* Delay for the reset recovery period, in USB spec. 9.2.6.2 */
+ start.u2Tick = USB_HCD_RESET_RECOVERY_DELAY;
+ start.pfCallback = USB_HCD_Reset_Recovery_Timeout;
+ start.vPara = &g_UsbHcdInfo[usb_ip_port];
+ DclSGPT_Control((DCL_HANDLE)(g_UsbHcdInfo[usb_ip_port].gpt_handle), SGPT_CMD_START, (DCL_CTRL_DATA_T*)&start);
+// GPTI_StartItem(g_UsbHcdInfo[usb_ip_port].gpt_handle, USB_HCD_RESET_RECOVERY_DELAY,USB_HCD_Reset_Recovery_Timeout, &g_UsbHcdInfo[usb_ip_port]);
+}
+
+
+/* GPT timeout function*/
+static void USB_HCD_Delay_Reset_Timeout(void *parameter)
+{
+ USB_HCD_Struct *USBD_Data = (USB_HCD_Struct *)parameter;
+ kal_uint8 usb_ip_port = USBD_Data->usb_ip_port;
+ USB_HCD_STATUS reset_reason = USBD_Data->reset_reason;
+
+ if (usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+ DclSGPT_Control((DCL_HANDLE)(g_UsbHcdInfo[usb_ip_port].gpt_handle), SGPT_CMD_STOP, 0);
+// GPTI_StopItem(g_UsbHcdInfo[usb_ip_port].gpt_handle);
+ USB_HCD_Reset_Device(usb_ip_port,reset_reason);
+}
+
+
+/* Read FIFO data from EP with sfift */
+static void USB_HCD_EPFIFORead(USBH_Common_Struct common_str,USBH_EP_Struct usb_ep_str,kal_uint16 nBytes, void *pDst)
+{
+ kal_uint16 nCount = nBytes;
+ kal_uint8 *pby;
+ kal_uint32 nAddr;
+
+ if (common_str.usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+ if((nBytes != 0)&&(pDst == NULL))
+ EXT_ASSERT(0, (kal_uint32)nBytes, 0, 0);
+
+ /* not index register */
+// USB_DRV_WriteReg8(USB_INDEX, ep_num);
+ nAddr = USB_EP0_HCD(USB_BaseAddr[common_str.usb_ip_port]) + (usb_ep_str.ep_num)*4;
+ pby = (kal_uint8 *)pDst;
+
+ /* read byte by byte */
+ while (nCount)
+ {
+ *pby++ = USB_DRV_Reg8(nAddr); //lint !e613
+ nCount--;
+ }
+
+}
+
+
+/* Write data to FIFO EP */
+static void USB_HCD_EPFIFOWrite(USBH_Common_Struct common_str,USBH_EP_Struct usb_ep_str,kal_uint16 nBytes, void *pSrc)
+{
+ kal_uint16 nCount = nBytes;
+ kal_uint8 *pby;
+ kal_uint32 nAddr;
+
+ if ( common_str.usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+ if((nBytes != 0)&&(pSrc == NULL))
+ EXT_ASSERT(0, (kal_uint32)nBytes, 0, 0);
+
+ /* not index register */
+// USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), ep_num);
+ nAddr = USB_EP0_HCD(USB_BaseAddr[common_str.usb_ip_port]) + (usb_ep_str.ep_num)*4;
+ pby = (kal_uint8 *)pSrc;
+
+ /* Write byte by byte */
+ while (nCount)
+ {
+ USB_DRV_WriteReg8(nAddr, *pby++); //lint !e613
+ nCount--;
+ }
+}
+
+
+
+/* DMA setup function */
+/* If the last one "callback_upd_run" parameter true =>
+ application decides to clear "driver dma running status" by itself*/
+
+static void USB_HCD_DMA_Setup(USBH_Common_Struct common_str,USBH_EP_Struct usb_ep_str,kal_uint32 addr, kal_uint32 length,
+ usb_dma_callback callback,kal_bool callback_upd_run, kal_bool known_size, USB_DMA_TYPE dma_type)
+{
+
+ kal_uint8 usb_ip_port = common_str.usb_ip_port;
+ kal_uint8 ep_num = usb_ep_str.ep_num;
+ USB_EP_DIRECTION direction = usb_ep_str.direction;
+ USB_ENDPT_TXFER_TYPE ep_type = usb_ep_str.ep_type;
+ kal_uint16 dma_ctrl;
+ kal_uint8 dma_chan;
+ static kal_uint32 dma_burst_mode = 0;
+ kal_uint32 savedMask;
+
+
+#ifdef __DYNAMIC_SWITCH_CACHEABILITY__
+ if((kal_bool)INT_QueryIsNonCachedRAM(addr, length) == KAL_FALSE)
+ ASSERT(0);
+#endif
+
+ if(length == 0)
+ ASSERT(0);
+
+ dma_chan = USB_HCD_Get_DMA_Channel_Num(usb_ip_port,ep_num, direction);
+
+ ASSERT(g_UsbHcdInfo[usb_ip_port].dma_running[dma_chan-1] == KAL_FALSE);
+
+ if(g_UsbHcdInfo[usb_ip_port].is_bidirection_dma[dma_chan-1] == KAL_TRUE)
+ {
+ g_UsbHcdInfo[usb_ip_port].dma_dir[dma_chan-1] = direction;
+ }
+ else
+ {
+ if(g_UsbHcdInfo[usb_ip_port].dma_dir[dma_chan-1] != direction)
+ EXT_ASSERT(0, dma_chan, (kal_uint32)g_UsbHcdInfo[usb_ip_port].dma_dir[dma_chan-1], (kal_uint32)direction);
+ }
+
+ g_UsbHcdInfo[usb_ip_port].dma_running[dma_chan-1] = KAL_TRUE;
+ g_UsbHcdInfo[usb_ip_port].dma_callback[dma_chan-1] = callback;
+ g_UsbHcdInfo[usb_ip_port].dma_callback_upd_run[dma_chan-1] = callback_upd_run;
+ g_UsbHcdInfo[usb_ip_port].dma_length[dma_chan-1] = length;
+ g_UsbHcdInfo[usb_ip_port].dma_pktrdy[dma_chan-1] = KAL_FALSE;
+
+#ifdef __WRITE_THROUGH_CACHEABLE__
+ if(direction == USB_EP_RX_DIR)
+ {
+ g_UsbHcdInfo[usb_ip_port].dma_length[dma_chan-1] = length;
+ g_UsbHcdInfo[usb_ip_port].dma_addr[dma_chan-1] = addr;
+ }
+#endif
+
+ if(direction == USB_EP_TX_DIR)
+ {
+#ifdef __USB_AUTO_SET__
+ // auto set only can use on "ep1 with channel 2", "ep2 with channel 3", and "ep3 with channel 4"
+ /* Judge if it is multiple of max packet length */
+ if(((ep_num != 1)||(dma_chan != 2))&&((ep_num != 2)||(dma_chan != 3))&&((ep_num != 3)||(dma_chan != 4)))
+ {
+#endif
+ if (length%g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].max_packet_size)
+ g_UsbHcdInfo[usb_ip_port].dma_pktrdy[dma_chan-1] = KAL_TRUE;
+#ifdef __USB_AUTO_SET__
+ }
+#endif /* __USB_AUTO_SET__ */
+ }
+ else
+ {
+ if (length%g_UsbHcdInfo[usb_ip_port].ep_rx_info[ep_num-1].max_packet_size)
+ {
+ USB_DRV_WriteReg(USB_RQPKTCOUNT_HCD(USB_BaseAddr[usb_ip_port],ep_num), (length/g_UsbHcdInfo[usb_ip_port].ep_rx_info[ep_num-1].max_packet_size)+1);
+ g_UsbHcdInfo[usb_ip_port].dma_pktrdy[dma_chan-1] = KAL_TRUE;
+ }
+ else
+ {
+ USB_DRV_WriteReg(USB_RQPKTCOUNT_HCD(USB_BaseAddr[usb_ip_port],ep_num), (length/g_UsbHcdInfo[usb_ip_port].ep_rx_info[ep_num-1].max_packet_size));
+ }
+ }
+
+ if(g_UsbHcdInfo[usb_ip_port].b_enable_dma_burst_auto_chge == KAL_TRUE)
+ dma_burst_mode++;
+ else
+ dma_burst_mode = 0x03;
+
+ /* DMA_CONFIG */
+ if(dma_type == USB_DMA0_TYPE)
+ {
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+ }
+ else if(dma_type == USB_DMA1_TYPE)
+ {
+ if(direction == USB_EP_TX_DIR)
+ {
+ savedMask = SaveAndSetIRQMask();
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), ep_num);
+
+ /* Only is configured as multiple packet DMA TX mode */
+ if(ep_type == USB_ENDPT_ISO)
+ {
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_HCD_DMA_TX_CSR_ISO);
+ }
+ else
+ {
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_HCD_DMA_TX_CSR);
+ }
+
+ #ifdef __USB_AUTO_SET__
+ if(((ep_num == 1)&&(dma_chan == 2))||((ep_num == 2)&&(dma_chan == 3))||((ep_num == 3)&&(dma_chan == 4)))
+ {
+ USB_DRV_SetBits(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_TXCSR_AUTOSET_SPKT);
+ }
+ #endif
+
+ RestoreIRQMask(savedMask);
+
+ USB_DRV_WriteReg32(USB_DMAADDR_HCD(USB_BaseAddr[usb_ip_port],dma_chan), addr);
+ USB_DRV_WriteReg32(USB_DMACNT_HCD(USB_BaseAddr[usb_ip_port],dma_chan), length);
+
+ dma_ctrl = USB_DMACNTL_DMADIR|USB_DMACNTL_DMAMODE|USB_DMACNTL_INTEN|(ep_num<<4);
+ dma_ctrl |= ((dma_burst_mode&0x03)<<9)|USB_DMACNTL_DMAEN;
+
+ USB_DRV_WriteReg(USB_DMACNTL_HCD(USB_BaseAddr[usb_ip_port],dma_chan), dma_ctrl);
+ }
+ else if(direction == USB_EP_RX_DIR)
+ {
+ /* stop DMA channel */
+ USBHCD_DMA_Stop(USB_BaseAddr[usb_ip_port],dma_chan);
+// USB_HCD_DMA_PPStop(dma_chan);
+
+ if(known_size == KAL_TRUE)
+ {
+ savedMask = SaveAndSetIRQMask();
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), ep_num);
+
+ if(ep_type == USB_ENDPT_ISO)
+ {
+// USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_HCD_DMA_RX_CSR_ISO|USB_RXCSR_REQPKT|USB_RXCSR_RXPKTRDY|USB_RXCSR_AUTOCLREN_SPKT);
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_HCD_DMA_RX_CSR_ISO|USB_RXCSR_REQPKT|USB_RXCSR_RXPKTRDY);
+ }
+ else
+ {
+// USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_HCD_DMA_RX_CSR|USB_RXCSR_REQPKT|USB_RXCSR_RXPKTRDY|USB_RXCSR_AUTOCLREN_SPKT);
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_HCD_DMA_RX_CSR|USB_RXCSR_REQPKT|USB_RXCSR_RXPKTRDY);
+ }
+
+ RestoreIRQMask(savedMask);
+ }
+ else
+ {
+ #ifdef __DMA_UNKNOWN_RX__
+ savedMask = SaveAndSetIRQMask();
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), ep_num);
+
+ if(ep_type == USB_ENDPT_ISO)
+ {
+// USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_HCD_DMA_RX_CSR_ISO|USB_RXCSR_REQPKT|USB_RXCSR_RXPKTRDY|USB_RXCSR_DMAREQMODE|USB_RXCSR_AUTOCLREN_SPKT);
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_HCD_DMA_RX_CSR_ISO|USB_RXCSR_REQPKT|USB_RXCSR_RXPKTRDY|USB_RXCSR_DMAREQMODE);
+ }
+ else
+ {
+// USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_HCD_DMA_RX_CSR|USB_RXCSR_REQPKT|USB_RXCSR_RXPKTRDY|USB_RXCSR_DMAREQMODE|USB_RXCSR_AUTOCLREN_SPKT);
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_HCD_DMA_RX_CSR|USB_RXCSR_REQPKT|USB_RXCSR_RXPKTRDY|USB_RXCSR_DMAREQMODE);
+ }
+
+ RestoreIRQMask(savedMask);
+
+ USB_Enable_DMA_Timer_Count(dma_chan, KAL_TRUE, 0x7F);
+ #else
+ ASSERT(0);
+ #endif
+ }
+
+ USB_DRV_WriteReg32(USB_DMAADDR_HCD(USB_BaseAddr[usb_ip_port],dma_chan), addr);
+ USB_DRV_WriteReg32(USB_DMACNT_HCD(USB_BaseAddr[usb_ip_port],dma_chan), length);
+
+ dma_ctrl = USB_DMACNTL_DMAMODE|USB_DMACNTL_INTEN|(ep_num<<4);
+ dma_ctrl |= ((dma_burst_mode&0x03)<<9)|USB_DMACNTL_DMAEN;
+ USB_DRV_WriteReg(USB_DMACNTL_HCD(USB_BaseAddr[usb_ip_port],dma_chan), dma_ctrl);
+ }
+ }
+#if defined(DRV_USB_IP_V3)
+
+ else if(dma_type == USB_DMA2_TYPE)
+ {
+ if(direction == USB_EP_RX_DIR)
+ {
+ if(known_size == KAL_TRUE)
+ {
+ /* stop DMA channel */
+ USBHCD_DMA_Stop(USB_BaseAddr[usb_ip_port],dma_chan);
+// USB_HCD_DMA_PPStop(dma_chan);
+
+ savedMask = SaveAndSetIRQMask();
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), ep_num);
+
+ if(ep_type == USB_ENDPT_ISO)
+ {
+// USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_HCD_DMA_RX_CSR_ISO|USB_RXCSR_REQPKT|USB_RXCSR_RXPKTRDY|USB_RXCSR_AUTOCLREN_SPKT);
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_HCD_DMA_RX_CSR_ISO|USB_RXCSR_REQPKT|USB_RXCSR_RXPKTRDY);
+
+ }
+ else
+ {
+// USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_HCD_DMA_RX_CSR|USB_RXCSR_REQPKT|USB_RXCSR_RXPKTRDY|USB_RXCSR_AUTOCLREN_SPKT);
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_HCD_DMA_RX_CSR|USB_RXCSR_REQPKT|USB_RXCSR_RXPKTRDY);
+ }
+
+ RestoreIRQMask(savedMask);
+ }
+ else
+ {
+ ASSERT(0);
+ }
+
+ USB_DRV_WriteReg32(USB_DMAADDR_HCD(USB_BaseAddr[usb_ip_port],dma_chan), addr);
+ USB_DRV_WriteReg32(USB_DMACNT_HCD(USB_BaseAddr[usb_ip_port],dma_chan), length);
+
+ dma_ctrl = USB_DMACNTL_DMAMODE|USB_DMACNTL_INTEN|(ep_num<<4)|USB_DMACNTL_ENDMAMODE2;
+ dma_ctrl |= ((dma_burst_mode&0x03)<<9)|USB_DMACNTL_DMAEN;
+
+ USB_DRV_WriteReg(USB_DMACNTL_HCD(USB_BaseAddr[usb_ip_port],dma_chan), dma_ctrl);
+ }
+ else if(direction == USB_EP_TX_DIR)
+ {
+ ASSERT(0);
+ }
+ }
+#endif
+}
+
+
+
+#if defined(DRV_USB_IP_V4)
+
+/* DMAQ setup function. */
+void USB_HCD_DMAQ_Setup(USBH_Common_Struct common_str,USBH_EP_Struct usb_ep_str, kal_uint32 addr, kal_uint32 length,kal_bool callback_upd_run,kal_uint32 buf_count)
+{
+ kal_uint8 usb_ip_port = common_str.usb_ip_port;
+ kal_uint8 ep_num = usb_ep_str.ep_num;
+ USB_EP_DIRECTION direction = usb_ep_str.direction;
+ USB_ENDPT_TXFER_TYPE ep_type = usb_ep_str.ep_type;
+ kal_uint16 dma_ctrl;
+ kal_uint8 dma_chan = ep_num;
+ kal_uint16 CSR;
+ kal_uint16 IntrOut;
+ kal_uint32 savedMask;
+ kal_uint32 index;
+ volatile kal_uint8 delay;
+ volatile kal_uint32 temp_read;
+
+ //usb_device_dma_burst_mode+
+
+ if (buf_count > TGPD_MAX_NUMBERS)
+ ASSERT(0);
+
+ if(ep_num != 1)
+ ASSERT(0);
+
+ if((length == 0)||(addr == NULL))
+ ASSERT(0);
+
+
+// g_UsbHcdInfo[usb_ip_port].dma_callback[dma_chan-1] = callback;
+ g_UsbHcdInfo[usb_ip_port].dma_callback_upd_run[dma_chan-1] = callback_upd_run;
+ g_UsbHcdInfo[usb_ip_port].dma_pktrdy[dma_chan-1] = KAL_FALSE;
+
+
+ /* DMAQ_CONFIG */
+ if(direction == USB_EP_RX_DIR)
+ {
+// DRV_WriteReg32(USB_DMAQ_RQCSR(dma_chan), USB_DMACNTL_DMAEN_STOP);
+ if ((DRV_Reg32(USB_DMAQ_RQCSR(dma_chan))&USB_DMACNTL_DMAEN_ACTIVE) > 0)
+ {
+// for (delay =0; delay < 200; delay ++);
+ temp_read = DRV_Reg32(USB_DMAQ_RQCSR(dma_chan));
+
+ while (1)
+ {
+ temp_read = DRV_Reg32(USB_DMAQ_RQCSR(dma_chan));
+ if (temp_read == 0x00)
+ break;
+ }
+
+// if ((DRV_Reg32(USB_DMAQ_RQCSR(dma_chan))&USB_DMACNTL_DMAEN_ACTIVE) > 0)
+// ASSERT(0);
+ }
+
+ /*fill GPD buffers*/
+ for (index = 0; index < RGPD_MAX_NUMBERS; index++)
+ {
+ USB_DMAQ_RX_GPD[index].flag = RGPD_FLAGS_HWO|RGPD_FLAGS_IOC; //1:HW is Owner, SW should not to access data buffer; HW will clear it to 0.
+ USB_DMAQ_RX_GPD[index].chksum = 0;//PDU_calcCksum((kal_uint8 *)(USB_DMAQ_GPD+index), 16)-1;
+ USB_DMAQ_RX_GPD[index].DataBufferLen = length;
+ USB_DMAQ_RX_GPD[index].pNext = &(USB_DMAQ_RX_GPD[index+1]);
+ USB_DMAQ_RX_GPD[index].pBuf = (kal_uint8*)addr;
+ USB_DMAQ_RX_GPD[index].bufLen = 0;
+ USB_DMAQ_RX_GPD[index].ExtLength = 0;
+ USB_DMAQ_RX_GPD[index].ZTepFlag = 0;//ep_num & RGPD_ENDPOINT;
+ }
+
+ g_UsbHcdInfo[usb_ip_port].dmaQ_rx_length[dma_chan-1]= length;
+
+ savedMask = SaveAndSetIRQMask();
+
+ DRV_WriteReg8(USB_INDEX, ep_num);
+ DRV_WriteReg(USB_RXCSR, USB_HCD_DMAQ_RX_CSR);
+
+ DRV_WriteReg32(USB_DMAQ_RQSAR(dma_chan), (USB_DMAQ_RX_GPD+2));
+ // DRV_WriteReg32(USB_DMAQ_QCR3, 0x00000000); // there should be no ZLP
+// DRV_WriteReg32(USB_DMAQ_USBGCSR, DRV_Reg32(USB_DMAQ_USBGCSR)|(USB_DMAQ_USBGCSR_RQ_EN<<(dma_chan-1)));
+// DRV_WriteReg32(USB_DMAQ_QIMCR, USB_DMAQ_QIMCR_RX_DONE(dma_chan-1)|USB_DMAQ_QIMCR_RXEP_ERR|USB_DMAQ_QIMCR_RXQ_ERR|USB_DMAQ_QIMCR_RQ_EMPTY);
+ DRV_WriteReg32(USB_DMAQ_RQSAR(dma_chan), (USB_DMAQ_RX_GPD+dma_chan-1));
+ DRV_WriteReg32(USB_DMAQ_RQCSR(dma_chan), USB_DMACNTL_DMAEN_START);
+
+ RestoreIRQMask(savedMask);
+ }
+ else
+ {
+// DRV_WriteReg32(USB_DMAQ_TQCSR(dma_chan), USB_DMACNTL_DMAEN_STOP);
+ if ((DRV_Reg32(USB_DMAQ_TQCSR(dma_chan))&USB_DMACNTL_DMAEN_ACTIVE) > 0)
+ {
+// for (delay =0; delay < 200; delay ++);
+ temp_read = DRV_Reg32(USB_DMAQ_TQCSR(dma_chan));
+
+ while (1)
+ {
+ temp_read = DRV_Reg32(USB_DMAQ_TQCSR(dma_chan));
+ if (temp_read == 0x00)
+ break;
+ }
+// if ((DRV_Reg32(USB_DMAQ_TQCSR(dma_chan))&USB_DMACNTL_DMAEN_ACTIVE) > 0)
+// ASSERT(0);
+ }
+
+ /*fill GPD buffers*/
+ for (index = 0; index < TGPD_MAX_NUMBERS; index++)
+ {
+ USB_DMAQ_TX_GPD[index].flag = TGPD_FLAGS_HWO; //1:HW is Owner, SW should not to access data buffer; HW will clear it to 0.
+ USB_DMAQ_TX_GPD[index].chksum = 0;//PDU_calcCksum((kal_uint8 *)(USB_DMAQ_GPD+index), 16)-1;
+ USB_DMAQ_TX_GPD[index].DataBufferLen = 0;
+ USB_DMAQ_TX_GPD[index].pNext = &(USB_DMAQ_TX_GPD[index+1]);
+ USB_DMAQ_TX_GPD[index].pBuf = (kal_uint8*)addr;
+ USB_DMAQ_TX_GPD[index].bufLen = length;
+ USB_DMAQ_TX_GPD[index].ExtLength = 0;
+ USB_DMAQ_TX_GPD[index].ZTepFlag = 0;//ep_num;
+}
+
+ g_UsbHcdInfo[usb_ip_port].dmaQ_tx_length[dma_chan-1]= length;
+
+ savedMask = SaveAndSetIRQMask();
+
+ DRV_WriteReg32(USB_DMAQ_TQSAR(dma_chan), (USB_DMAQ_TX_GPD+2));
+ DRV_WriteReg8(USB_INDEX, ep_num);
+ DRV_WriteReg(USB_TXCSR, USB_HCD_DMAQ_TX_CSR);
+// DRV_WriteReg32(USB_DMAQ_QCR3, 0x00000000); // there should be no ZLP
+// DRV_WriteReg32(USB_DMAQ_USBGCSR, DRV_Reg32(USB_DMAQ_USBGCSR)|(USB_DMAQ_USBGCSR_TQ_EN<<(dma_chan-1)));
+// DRV_WriteReg32(USB_DMAQ_QIMCR, USB_DMAQ_QIMCR_TX_DONE(dma_chan-1)|USB_DMAQ_QIMCR_TXEP_ERR|USB_DMAQ_QIMCR_TXQ_ERR|USB_DMAQ_QIMCR_TQ_EMPTY);
+ DRV_WriteReg32(USB_DMAQ_TQSAR(dma_chan), (USB_DMAQ_TX_GPD+dma_chan-1));
+ DRV_WriteReg32(USB_DMAQ_TQCSR(dma_chan), USB_DMACNTL_DMAEN_START);
+
+ RestoreIRQMask(savedMask);
+ }
+}
+#endif
+
+
+
+/* May run in task */
+static void USB_HCD_Send_Setup(USBH_Common_Struct common_str,USBH_EP_Struct usb_ep_str)
+{
+ kal_uint32 savedMask;
+
+
+ USB_Dbg_Trace(USB_HCD_EP0_CSR0, 1, USB_DRV_Reg8(USB_EPn_TXCSR_HCD(USB_BaseAddr[common_str.usb_ip_port], 0)));
+
+ if(usb_ep_str.ep_num != 0)
+ EXT_ASSERT(0, usb_ep_str.ep_num, 0, 0);
+
+
+ if (g_UsbHcdInfo[common_str.usb_ip_port].host_state == USBH_STATE_WAIT_BCON) // cable just plug out
+ return;
+
+
+ if ( USB_DRV_Reg8(USB_EPn_TXCSR_HCD(USB_BaseAddr[common_str.usb_ip_port], 0)) & USB_CSR0_TXPKTRDY)
+ ASSERT(0);
+
+ /* Write 8 bytes setup packet to FIFO */
+ USB_HCD_EPFIFOWrite(common_str,usb_ep_str, 8, g_UsbHcdInfo[common_str.usb_ip_port].ep0_info.p_data);
+ g_UsbHcdInfo[common_str.usb_ip_port].ep0_fifo_intr = KAL_TRUE;
+
+ savedMask = SaveAndSetIRQMask();
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[common_str.usb_ip_port]), 0);
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[common_str.usb_ip_port]), (USB_CSR0_TXPKTRDY|USB_CSR0_SETUPPKT));
+ RestoreIRQMask(savedMask);
+
+}
+
+
+/* May run in app task */
+static void USB_HCD_Send_Data(USBH_Common_Struct common_str,USBH_EP_Struct usb_ep_str)
+{
+ kal_uint16 todo;
+ kal_uint32 savedMask;
+ kal_uint8 usb_ip_port = common_str.usb_ip_port;
+ kal_uint8 ep_num = usb_ep_str.ep_num;
+
+
+
+ if(ep_num == 0)
+ {
+ if(g_UsbHcdInfo[usb_ip_port].ep0_info.b_dma_enable == KAL_TRUE)
+ {
+ ASSERT(0);
+/*
+ USB_HCD_DMA_Setup(0, USB_EP_TX_DIR, g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].ep_type, (kal_uint32)g_UsbHcdInfo[usb_ip_port].ep0_info.p_data,
+ g_UsbHcdInfo[usb_ip_port].ep0_info.data_length, KAL_FALSE, KAL_TRUE, USB_DMA0_TYPE);
+*/
+ }
+ else
+ {
+ USB_Dbg_Trace(USB_HCD_EP0_CSR0, 2, USB_DRV_Reg8(USB_EPn_TXCSR_HCD(USB_BaseAddr[usb_ip_port], 0)));
+
+ if (USB_DRV_Reg8(USB_EPn_TXCSR_HCD(USB_BaseAddr[usb_ip_port], 0)) & USB_CSR0_TXPKTRDY)
+ ASSERT(0);
+
+ if((g_UsbHcdInfo[usb_ip_port].ep0_info.data_length-g_UsbHcdInfo[usb_ip_port].ep0_info.sofar)
+ >g_UsbHcdInfo[usb_ip_port].ep0_info.max_packet_size)
+ todo = g_UsbHcdInfo[usb_ip_port].ep0_info.max_packet_size;
+ else
+ todo = g_UsbHcdInfo[usb_ip_port].ep0_info.data_length-g_UsbHcdInfo[usb_ip_port].ep0_info.sofar;
+
+ /* Write data packet to FIFO */
+ USB_HCD_EPFIFOWrite(common_str,usb_ep_str, todo, &g_UsbHcdInfo[usb_ip_port].ep0_info.p_data[g_UsbHcdInfo[usb_ip_port].ep0_info.sofar]);
+ g_UsbHcdInfo[usb_ip_port].ep0_info.sofar += todo;
+ g_UsbHcdInfo[usb_ip_port].ep0_fifo_intr = KAL_TRUE;
+
+ USB_Dbg_Trace(USB_HCD_EP0_Data, (kal_uint32)g_UsbHcdInfo[usb_ip_port].ep0_info.sofar, (kal_uint32)g_UsbHcdInfo[usb_ip_port].ep0_info.data_length);
+
+ savedMask = SaveAndSetIRQMask();
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), 0);
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), USB_CSR0_TXPKTRDY);
+ RestoreIRQMask(savedMask);
+
+ USB_Dbg_Trace(USB_HCD_SEND_DATA_DONE, ep_num, 0);
+ }
+ }
+ else
+ {
+ if((g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].b_dma_enable == KAL_TRUE)&&(g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].data_length >= 64))
+ {
+ USB_HCD_DMA_Setup(common_str,usb_ep_str,(kal_uint32)g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].p_data,
+ g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].data_length,NULL, KAL_FALSE, KAL_TRUE, USB_DMA1_TYPE);
+ }
+ else
+ {
+ if((g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].data_length-g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].sofar)
+ >g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].max_packet_size)
+ todo = g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].max_packet_size;
+ else
+ todo = g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].data_length-g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].sofar;
+
+ /* Write data packet to FIFO */
+ USB_HCD_EPFIFOWrite(common_str,usb_ep_str,g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].data_length,&g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].p_data[g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].sofar]);
+
+ g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].sofar += todo;
+ g_UsbHcdInfo[usb_ip_port].ep_tx_fifo_intr[ep_num-1] = KAL_TRUE;
+
+ savedMask = SaveAndSetIRQMask();
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), ep_num);
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_TXCSR_TXPKTRDY);
+ RestoreIRQMask(savedMask);
+
+ USB_Dbg_Trace(USB_HCD_SEND_DATA_DONE, ep_num, 0);
+ }
+ }
+}
+
+
+/* Run in HISR */
+static void USB_HCD_Recv_Data(USBH_Common_Struct common_str,USBH_EP_Struct usb_ep_str)
+{
+ SGPT_CTRL_START_T start;
+ kal_uint8 dma_chan;
+ kal_uint32 savedMask;
+ kal_uint8 usb_ip_port = common_str.usb_ip_port;
+ kal_uint8 ep_num = usb_ep_str.ep_num;
+
+ if(ep_num == 0)
+ {
+ if(g_UsbHcdInfo[usb_ip_port].ep0_info.b_dma_enable == KAL_TRUE)
+ {
+ ASSERT(0);
+/*
+ USB_HCD_DMA_Setup(0, USB_EP_RX_DIR, g_UsbHcdInfo[usb_ip_port].ep_rx_info[ep_num-1].ep_type, (kal_uint32)g_UsbHcdInfo[usb_ip_port].ep0_info.p_data,
+ g_UsbHcdInfo[usb_ip_port].ep0_info.data_length, KAL_FALSE, KAL_TRUE, USB_DMA0_TYPE);
+*/
+ }
+ else
+ {
+ USB_Dbg_Trace(USB_HCD_EP0_CSR0, 2, USB_DRV_Reg8(USB_EPn_TXCSR_HCD(USB_BaseAddr[usb_ip_port], 0)));
+
+ if (USB_DRV_Reg8(USB_EPn_TXCSR_HCD(USB_BaseAddr[usb_ip_port], 0)) & USB_CSR0_REQPKT)
+ ASSERT(0);
+
+ g_UsbHcdInfo[usb_ip_port].ep0_fifo_intr = KAL_TRUE;
+
+ savedMask = SaveAndSetIRQMask();
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), 0);
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), USB_CSR0_REQPKT);
+ RestoreIRQMask(savedMask);
+ }
+ }
+ else
+ {
+ if(g_UsbHcdInfo[usb_ip_port].ep_rx_info[ep_num-1].b_dma_enable == KAL_TRUE)
+ {
+ dma_chan = USB_HCD_Get_DMA_Channel_Num(usb_ip_port,ep_num, USB_EP_RX_DIR);
+
+ /* Receive short packet will hang */
+ start.u2Tick = USB_HCD_DMA_TIMER;
+ start.pfCallback = USB_HCD_DMA_Timeout_Hdlr;
+ start.vPara = &g_UsbHcdInfo[usb_ip_port].dma_rx_ep_num[dma_chan-1];
+ DclSGPT_Control((DCL_HANDLE)(g_UsbHcdInfo[usb_ip_port].dma_gpt_handle[ep_num-1]), SGPT_CMD_START, (DCL_CTRL_DATA_T*)&start);
+// GPTI_StartItem(g_UsbHcdInfo[usb_ip_port].dma_gpt_handle[ep_num-1], USB_HCD_DMA_TIMER,USB_HCD_DMA_Timeout_Hdlr,(void*)&g_UsbHcdInfo[usb_ip_port].dma_rx_ep_num[dma_chan-1]);
+
+ USB_HCD_DMA_Setup(common_str,usb_ep_str, (kal_uint32)g_UsbHcdInfo[usb_ip_port].ep_rx_info[ep_num-1].p_data, g_UsbHcdInfo[usb_ip_port].ep_rx_info[ep_num-1].data_length,
+ NULL,KAL_FALSE, KAL_TRUE, USB_DMA1_TYPE);
+ }
+ else
+ {
+ savedMask = SaveAndSetIRQMask();
+
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), ep_num);
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_RXCSR_REQPKT);
+ RestoreIRQMask(savedMask);
+ }
+ }
+}
+
+static kal_bool USB_HCD_Is_DoubleFIFO_SUPPORT(kal_uint8 usb_ip_port)
+{
+ return g_UsbHcdInfo[usb_ip_port].host_common_param->support_Double_FIFO;
+}
+
+
+
+
+static void USB_HCD_DMA_Timeout_Hdlr(void *parameter)
+{
+ kal_uint8* temp = (kal_uint8*)parameter;
+ kal_uint8 ep_num = *temp;
+
+// USB_HCD_Struct *USBD_Data = (USB_HCD_Struct *)parameter;
+ kal_uint8 usb_ip_port = 0;//USBD_Data->usb_ip_port;
+
+ kal_uint8 dma_chan;
+
+ dma_chan = USB_HCD_Get_DMA_Channel_Num(usb_ip_port,ep_num, USB_EP_RX_DIR);
+
+ DclSGPT_Control((DCL_HANDLE)(g_UsbHcdInfo[usb_ip_port].dma_gpt_handle[ep_num-1]), SGPT_CMD_STOP, 0);
+// GPTI_StopItem(g_UsbHcdInfo[usb_ip_port].dma_gpt_handle[ep_num-1]);
+
+ USB_Dbg_Trace(USB_HCD_DMA_TIMEOUT_ERROR, ep_num, dma_chan);
+ drv_trace0(TRACE_FUNC, (kal_uint32)USB_HCD_RX_DMA_TIMEOUT);
+
+
+ if((g_UsbHcdInfo[usb_ip_port].dma_dir[dma_chan-1] == USB_EP_TX_DIR)||(g_UsbHcdInfo[usb_ip_port].dma_running[dma_chan-1] == KAL_FALSE))
+ {
+ ASSERT(0);
+ }
+ else
+ {
+ /* stop DMA channel */
+ USBHCD_DMA_Stop(USB_BaseAddr[usb_ip_port],dma_chan);
+
+ /* Clear pending DMA interrupts */
+#ifdef DRV_USB_IP_V3
+ // write 0 clear
+ USB_DRV_WriteReg32(USB_DMAINTR_HCD(USB_BaseAddr[usb_ip_port]), ~((1<<(dma_chan-1))|(0xC000<<(dma_chan*2))));
+#else // DRV_USB_IP_V4
+ // write 1 clear
+ USB_DRV_WriteReg8(USB_DMAINTR_HCD(USB_BaseAddr[usb_ip_port]), (1<<(dma_chan-1)));
+#endif
+
+ USB_HCD_EP_Bulk_Rx_Ready(usb_ip_port,ep_num);
+ }
+
+ g_UsbHcdInfo[usb_ip_port].dma_pktrdy[dma_chan-1] = KAL_FALSE;
+
+ /* if application callback function does not request to clear drv_running set by itself, clear running state here*/
+ if(g_UsbHcdInfo[usb_ip_port].dma_callback_upd_run[dma_chan-1] == KAL_FALSE)
+ {
+ g_UsbHcdInfo[usb_ip_port].dma_running[dma_chan-1] = KAL_FALSE;
+ }
+
+ g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num-1](usb_ip_port,USB_HCD_DMA_TIMEOUT, g_UsbHcdInfo[usb_ip_port].dma_length[dma_chan-1]);
+
+}
+
+
+/* DMA callback */
+void USB_HCD_DMA_Callback(kal_uint8 usb_ip_port,kal_uint8 dma_chan)
+{
+ kal_uint8 ep_num;
+ usb_dma_callback callback;
+
+ if(dma_chan == 0)
+ ASSERT(0);
+
+ callback = g_UsbHcdInfo[usb_ip_port].dma_callback[dma_chan-1];
+ g_UsbHcdInfo[usb_ip_port].dma_callback[dma_chan-1] = NULL;
+ /*lint -save -e676 */
+ if(g_UsbHcdInfo[usb_ip_port].dma_dir[dma_chan-1] == USB_EP_TX_DIR)
+ {
+ ep_num = g_UsbHcdInfo[usb_ip_port].dma_tx_ep_num[dma_chan-1];
+ USB_HCD_EP_Check(usb_ip_port,ep_num, USB_EP_TX_DIR, 0);
+ }
+ else
+ {
+ ep_num = g_UsbHcdInfo[usb_ip_port].dma_rx_ep_num[dma_chan-1];
+ USB_HCD_EP_Check(usb_ip_port,ep_num, USB_EP_RX_DIR, 0);
+
+ DclSGPT_Control((DCL_HANDLE)(g_UsbHcdInfo[usb_ip_port].dma_gpt_handle[ep_num-1]), SGPT_CMD_STOP, 0);
+// GPTI_StopItem(g_UsbHcdInfo[usb_ip_port].dma_gpt_handle[ep_num-1]);
+
+ #ifdef __WRITE_THROUGH_CACHEABLE__
+ /* Only RX need to invalidate cache */
+ invalidate_wt_cache(g_UsbHcdInfo[usb_ip_port].dma_addr[dma_chan - 1], g_UsbHcdInfo[usb_ip_port].dma_length[dma_chan - 1]);
+ #endif
+ }
+
+ USB_Dbg_Trace(USB_HCD_DMA_CALLBACK, ep_num, dma_chan);
+
+
+ /* ep0 do not do this */
+ if(g_UsbHcdInfo[usb_ip_port].dma_pktrdy[dma_chan-1] == KAL_TRUE)
+ {
+ if(g_UsbHcdInfo[usb_ip_port].dma_dir[dma_chan-1] == USB_EP_TX_DIR)
+ {
+ USB_HCD_EP_Bulk_Tx_Ready(usb_ip_port,ep_num);
+ #ifdef __USB_AUTO_SET__
+ if(((ep_num == 1)&&(dma_chan == 2))||
+ ((ep_num == 2)&&(dma_chan == 3))||
+ ((ep_num == 3)&&(dma_chan == 4)))
+ {
+ ASSERT(0);
+ }
+ #endif
+ }
+ else if(g_UsbHcdInfo[usb_ip_port].dma_dir[dma_chan-1] == USB_EP_RX_DIR)
+ {
+ USB_HCD_EP_Bulk_Rx_Ready(usb_ip_port,ep_num);
+ }
+ }
+
+ g_UsbHcdInfo[usb_ip_port].dma_pktrdy[dma_chan-1] = KAL_FALSE;
+
+ /* if application callback function does not request to clear drv_running set by itself, clear running state here*/
+ if(g_UsbHcdInfo[usb_ip_port].dma_callback_upd_run[dma_chan-1] == KAL_FALSE)
+ {
+ g_UsbHcdInfo[usb_ip_port].dma_running[dma_chan-1] = KAL_FALSE;
+ }
+
+ if (callback != NULL)
+ {
+ callback();
+ }
+ else
+ {
+ if(g_UsbHcdInfo[usb_ip_port].dma_dir[dma_chan-1] == USB_EP_TX_DIR)
+ g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[ep_num-1](usb_ip_port,USB_HCD_OK, g_UsbHcdInfo[usb_ip_port].dma_length[dma_chan-1]);
+ else
+ g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num-1](usb_ip_port,USB_HCD_OK, g_UsbHcdInfo[usb_ip_port].dma_length[dma_chan-1]);
+ }
+ /*lint -restore */
+}
+
+
+#if defined(DRV_USB_IP_V4)
+
+void USB_HCD_DMAQ_Callback(kal_uint8 usb_ip_port,kal_uint8 index,USB_EP_DIRECTION direction)
+{
+ kal_uint8 ep_num = index+1;
+
+ if (direction == USB_EP_RX_DIR)
+ {
+
+ if (USB_DMAQ_RX_GPD[index].flag == RGPD_FLAGS_HWO)
+ ASSERT(0);
+
+ // DRV_WriteReg32(USB_DMAQ_RQCSR(index+1), USB_DMACNTL_DMAEN_STOP); // stop bit : not immediately stop DMAQ (must wait HW scheduling)
+
+ if (g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num-1] != NULL)
+ g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num-1](usb_ip_port,USB_HCD_OK, g_UsbHcdInfo[usb_ip_port].dmaQ_rx_length[index]);
+ }
+ else
+ {
+ if (USB_DMAQ_TX_GPD[index].flag == TGPD_FLAGS_HWO)
+ ASSERT(0);
+
+ // DRV_WriteReg32(USB_DMAQ_TQCSR(index+1), USB_DMACNTL_DMAEN_STOP); // stop bit : not immediately stop DMAQ (must wait HW scheduling)
+
+ if (g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[ep_num-1] != NULL)
+ g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[ep_num-1](usb_ip_port,USB_HCD_OK, g_UsbHcdInfo[usb_ip_port].dmaQ_tx_length[index]);
+ }
+
+}
+
+#endif
+
+
+
+static void USB_HCD_DMA_Stop(kal_uint8 usb_ip_port,kal_uint8 ep_num, USB_EP_DIRECTION direction)
+{
+ kal_uint8 dma_chan;
+
+
+ /* Stop running DMA */
+ USB_HCD_EP_Check(usb_ip_port,ep_num, direction, 0);
+ dma_chan = g_UsbHcdInfo[usb_ip_port].dma_port[direction][ep_num-1];
+
+ if(dma_chan != 0)
+ {
+ if(g_UsbHcdInfo[usb_ip_port].dma_running[dma_chan-1] == KAL_TRUE)
+ {
+ if((g_UsbHcdInfo[usb_ip_port].is_bidirection_dma[dma_chan-1] == KAL_FALSE)
+ &&(g_UsbHcdInfo[usb_ip_port].dma_dir[dma_chan-1] != direction))
+ {
+ ASSERT(0);
+ }
+
+ USB_HCD_Stop_DMA_Channel(usb_ip_port,ep_num, direction);
+ }
+ }
+}
+
+#if defined(DRV_USB_IP_V4)
+
+static void USB_HCD_DMAQ_Stop(kal_uint8 usb_ip_port,kal_uint8 ep_num, USB_EP_DIRECTION direction)
+{
+
+}
+#endif
+
+/*************************************************************************
+* FUNCTION
+* DclUSB_HCD_Initialize
+*
+* DESCRIPTION
+* This function is to initialize USB host module
+* It should be called before user register USB EINT handler and only called once
+*
+* PARAMETERS
+* None
+*
+* RETURNS
+* STATUS_OK : command is executed successfully.
+* STATUS_INVALID_OPERATION : already initialized.
+*
+*************************************************************************/
+DCL_STATUS DclUSB_HCD_Initialize(void)
+{
+ if(g_USB_Hcd_Init == KAL_TRUE)
+ {
+ /* Already initialized */
+ return STATUS_INVALID_OPERATION;
+ }
+ else
+ {
+ g_USB_Hcd_Init = KAL_TRUE;
+ return STATUS_OK;
+ }
+}
+
+
+/*************************************************************************
+* FUNCTION
+* DclUSB_HCD_Open
+*
+* DESCRIPTION
+* This function is to open the USB host module and return a valid handle
+*
+* PARAMETERS
+* dev: only valid for DCL_USB
+* flags: no sepcial flags is needed. Please use FLAGS_NONE
+*
+* RETURNS
+* DCL_HANDLE_INVALID: Open failed
+* DCL_HANDLE_OCCUPIED: Already opened
+* Other value: A valid handle
+*
+*************************************************************************/
+DCL_HANDLE DclUSB_HCD_Open(DCL_DEV dev, DCL_FLAGS flags)
+{
+ if(dev != DCL_USB)
+ {
+ ASSERT(0);
+ return (DCL_HANDLE)DCL_HANDLE_INVALID;
+ }
+ else
+ {
+ if(g_USB_Hcd_Open == KAL_FALSE)
+ {
+ g_USB_Hcd_Open = KAL_TRUE;
+
+ /* Do open operation */
+// USB_PDNmode(KAL_TRUE);
+ return (DCL_HANDLE)DCL_USB_HCD_HANDLE;
+ }
+ else
+ {
+ /* Call open over once */
+ return (DCL_HANDLE)DCL_HANDLE_OCCUPIED;
+ }
+ }
+}
+
+/*************************************************************************
+* FUNCTION
+* DclUSB_HCD_Close
+*
+* DESCRIPTION
+* This function is to close the USB host module.
+*
+* PARAMETERS
+* handle: the returned handle value of DclUSB_HCD_Open
+*
+* RETURNS
+* STATUS_INVALID_OPERATION: OTG module does not open yet, but user want to close
+* STATUS_INVALID_DCL_HANDLE: Use invalid handle to close
+* STATUS_OK
+*
+*************************************************************************/
+DCL_STATUS DclUSB_HCD_Close(DCL_HANDLE handle)
+{
+ /* Check open or not and handle validity */
+ if(DCL_USB_HCD_CHECK_HANDLE_IS_VALID(handle) == 0)
+ {
+ ASSERT(0);
+
+ if(g_USB_Hcd_Open == KAL_FALSE)
+ return STATUS_INVALID_OPERATION;
+ else
+ return STATUS_INVALID_DCL_HANDLE;
+ }
+
+ g_USB_Hcd_Open = KAL_FALSE;
+// USB_PDNmode(KAL_FALSE);
+ return STATUS_OK;
+}
+
+
+/*************************************************************************
+* FUNCTION
+* DclUSB_HCD_ReadData
+*
+* DESCRIPTION
+* This function is not supported for the USB host module now.
+*
+* PARAMETERS
+* N/A
+*
+* RETURNS
+* STATUS_UNSUPPORTED
+*
+*************************************************************************/
+DCL_STATUS DclUSB_HCD_ReadData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
+{
+ /* Check open or not and handle validity */
+/*
+ if((g_USB_Hcd_Open == KAL_FALSE)||(DCL_USB_HCD_CHECK_HANDLE_IS_VALID(handle) == 0))
+ {
+ ASSERT(0);
+
+ if(g_USB_Hcd_Open == KAL_FALSE)
+ return STATUS_INVALID_OPERATION;
+ else
+ return STATUS_INVALID_DCL_HANDLE;
+ }
+*/
+ return STATUS_UNSUPPORTED;
+}
+
+
+
+/*************************************************************************
+* FUNCTION
+* DclUSB_DRV_WriteData
+*
+* DESCRIPTION
+* This function is not supported for the USB host module now.
+*
+* PARAMETERS
+* N/A
+*
+* RETURNS
+* STATUS_UNSUPPORTED
+*
+*************************************************************************/
+DCL_STATUS DclUSB_HCD_WriteData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
+{
+ /* Check open or not and handle validity */
+/*
+ if((g_USB_Hcd_Open == KAL_FALSE)||(DCL_USB_HCD_CHECK_HANDLE_IS_VALID(handle) == 0))
+ {
+ ASSERT(0);
+
+ if(g_USB_Hcd_Open == KAL_FALSE)
+ return STATUS_INVALID_OPERATION;
+ else
+ return STATUS_INVALID_DCL_HANDLE;
+ }
+*/
+ return STATUS_UNSUPPORTED;
+}
+
+
+
+/*************************************************************************
+* FUNCTION
+* DclUSB_HCD_Configure
+*
+* DESCRIPTION
+* This function is not supported for the USB host module now.
+*
+* PARAMETERS
+* N/A
+*
+* RETURNS
+* STATUS_UNSUPPORTED
+*
+*************************************************************************/
+DCL_STATUS DclUSB_HCD_Configure(DCL_HANDLE handle, DCL_CONFIGURE_T *configure)
+{
+ /* Check open or not and handle validity */
+/*
+ if((g_USB_Hcd_Open == KAL_FALSE)||(DCL_USB_HCD_CHECK_HANDLE_IS_VALID(handle) == 0))
+ {
+ ASSERT(0);
+
+ if(g_USB_Hcd_Open == KAL_FALSE)
+ return STATUS_INVALID_OPERATION;
+ else
+ return STATUS_INVALID_DCL_HANDLE;
+ }
+*/
+ return STATUS_UNSUPPORTED;
+}
+
+
+
+/*************************************************************************
+* FUNCTION
+* DclUSB_HCD_RegisterCallback
+*
+* DESCRIPTION
+* This function is not supported for the USB host module now.
+*
+* PARAMETERS
+* N/A
+*
+* RETURNS
+* STATUS_UNSUPPORTED
+*
+*************************************************************************/
+DCL_STATUS DclUSB_HCD_RegisterCallback(DCL_HANDLE handle, DCL_EVENT event, PFN_DCL_CALLBACK callback)
+{
+ /* Check open or not and handle validity */
+/*
+ if((g_USB_Hcd_Open == KAL_FALSE)||(DCL_USB_HCD_CHECK_HANDLE_IS_VALID(handle) == 0))
+ {
+ ASSERT(0);
+
+ if(g_USB_Hcd_Open == KAL_FALSE)
+ return STATUS_INVALID_OPERATION;
+ else
+ return STATUS_INVALID_DCL_HANDLE;
+ }
+*/
+ return STATUS_UNSUPPORTED;
+}
+
+
+/*******************************************************************************
+ control functions for USB_HCD
+ *******************************************************************************/
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_HW_Mapping_EP(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_EP_MAPPING_T *ep_num;
+ kal_uint8 usb_ip_port;
+ USB_EP_DIRECTION direction;
+
+
+ ep_num = &data->rHCD_EP_Set;
+ usb_ip_port = (kal_uint8)ep_num->ip;
+ direction = (USB_EP_DIRECTION)ep_num->direction;
+
+ if (usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+
+ if(direction == USB_EP_TX_DIR)
+ {
+ g_UsbHcdInfo[usb_ip_port].ep_tx_real_num++;
+
+ if (((usb_ip_port < USB_EXT_IP_NUM)&& (g_UsbHcdInfo[usb_ip_port].ep_tx_real_num > MAX_TX_EP_NUM)))
+ ASSERT(0);
+
+#if defined(__IC_USB_ENABLE__)
+ if (((usb_ip_port >= USB_EXT_IP_NUM)&& (g_UsbHcdInfo[usb_ip_port].ep_tx_real_num > ICUSB_MAX_TX_EP_NUM)))
+ ASSERT(0);
+#endif
+
+ ep_num->return_value = g_UsbHcdInfo[usb_ip_port].ep_tx_real_num;
+ }
+ else
+ {
+ g_UsbHcdInfo[usb_ip_port].ep_rx_real_num++;
+
+ if (((usb_ip_port < USB_EXT_IP_NUM)&& (g_UsbHcdInfo[usb_ip_port].ep_rx_real_num > MAX_RX_EP_NUM)))
+ ASSERT(0);
+
+#if defined(__IC_USB_ENABLE__)
+ if (((usb_ip_port >= USB_EXT_IP_NUM)&& (g_UsbHcdInfo[usb_ip_port].ep_rx_real_num > ICUSB_MAX_RX_EP_NUM)))
+ ASSERT(0);
+#endif
+
+ ep_num->return_value = g_UsbHcdInfo[usb_ip_port].ep_rx_real_num;
+ }
+
+ return STATUS_OK;
+}
+
+
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Reset_Device(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_RESET_T *reset_device;
+ kal_uint8 usb_ip_port;
+ USB_HCD_STATUS reset_reason;
+// kal_uint16 IntrStatus;
+
+ reset_device = &data->rHCD_RESET;
+ usb_ip_port = (kal_uint8)reset_device->ip;
+ reset_reason = (USB_HCD_STATUS)reset_device->reset_reason;
+
+ USB_HCD_Reset_Device(usb_ip_port,reset_reason);
+
+ return STATUS_OK;
+}
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_SWRST(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_IP_NUM_T *usb_ip;
+ kal_uint8 usb_ip_port;
+
+ usb_ip = &data->rHCD_ip;
+ usb_ip_port = (kal_uint8)usb_ip->ip;
+
+#if defined(DRV_USB_IP_V3)
+ USB_DRV_WriteReg(USB_SWRST_HCD(USB_BaseAddr[usb_ip_port]), USB_SWRST_SWRST);
+#elif defined(DRV_USB_IP_V4)
+ USB_DRV_SetBits(USB_BUSPERF3_HCD(USB_BaseAddr[usb_ip_port]), USB_BUSPERF3_SWRST);
+#endif
+
+ return STATUS_OK;
+}
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_EnSysIntr(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_SYSTEM_T *system_drv;
+ kal_uint8 usb_ip_port;
+ kal_bool turn_on;
+
+ system_drv = &data->rHCD_System_Set;
+ usb_ip_port = (kal_uint8)system_drv->ip;
+ turn_on = (kal_bool)system_drv->set;
+
+ if (turn_on == KAL_TRUE)
+ {
+ USB_DRV_WriteReg8(USB_INTRUSBE_HCD(USB_BaseAddr[usb_ip_port]), ~USB_INTRUSBE_SOF);
+ }
+ else
+ {
+ USB_DRV_WriteReg8(USB_INTRUSBE_HCD(USB_BaseAddr[usb_ip_port]), USB_INTRUSBE_SOF);
+}
+
+ return STATUS_OK;
+}
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_VBusEnable(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_SYSTEM_T *system_drv;
+ kal_uint8 usb_ip_port;
+ kal_bool enable;
+
+ system_drv = &data->rHCD_System_Set;
+ usb_ip_port = (kal_uint8)system_drv->ip;
+ enable = (kal_bool)system_drv->set;
+
+ USB_HCD_VBusEnable(usb_ip_port,enable);
+
+ if (usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+ if(enable == KAL_TRUE)
+ {
+ USB_DRV_SetBits8(USB_DEVCTL_HCD(USB_BaseAddr[usb_ip_port]), USB_DEVCTL_SESSION);
+ }
+ else
+ {
+ USB_DRV_ClearBits8(USB_DEVCTL_HCD(USB_BaseAddr[usb_ip_port]), USB_DEVCTL_SESSION);
+ }
+
+ return STATUS_OK;
+
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Host_Mode_Detect(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_IP_NUM_T *usb_ip;
+ kal_uint8 usb_ip_port;
+
+ usb_ip = &data->rHCD_ip;
+ usb_ip_port = (kal_uint8)usb_ip->ip;
+
+ if (usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+ if (USB_DRV_Reg8(USB_DEVCTL_HCD(USB_BaseAddr[usb_ip_port]))& USB_DEVCTL_HOSTMODE)
+ usb_ip->return_value = KAL_TRUE;
+ else
+ usb_ip->return_value = KAL_FALSE;
+
+ return STATUS_OK;
+}
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Is_HNP_SUPPORT(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_IP_NUM_T *usb_ip;
+ kal_uint8 usb_ip_port;
+
+ usb_ip = &data->rHCD_ip;
+ usb_ip_port = (kal_uint8)usb_ip->ip;
+
+ usb_ip->return_value = g_UsbHcdInfo[usb_ip_port].host_common_param->support_HNP;
+
+ return STATUS_OK;
+}
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Is_RemoteWakeup_SUPPORT(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_IP_NUM_T *usb_ip;
+ kal_uint8 usb_ip_port;
+
+ usb_ip = &data->rHCD_ip;
+ usb_ip_port = (kal_uint8)usb_ip->ip;
+
+ usb_ip->return_value = USB_HCD_Is_RemoteWakeup_SUPPORT(usb_ip_port);
+
+ return STATUS_OK;
+}
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Is_SRP_SUPPORT(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_IP_NUM_T *usb_ip;
+ kal_uint8 usb_ip_port;
+
+ usb_ip = &data->rHCD_ip;
+ usb_ip_port = (kal_uint8)usb_ip->ip;
+
+ usb_ip->return_value = g_UsbHcdInfo[usb_ip_port].host_common_param->support_SRP;
+
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Is_High_Speed(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_IP_NUM_T *usb_ip;
+ kal_uint8 usb_ip_port;
+
+ usb_ip = &data->rHCD_ip;
+ usb_ip_port = (kal_uint8)usb_ip->ip;
+
+ usb_ip->return_value = USB_HCD_Is_High_Speed(usb_ip_port);//g_UsbHcdInfo[usb_ip_port].b_hcd_is_high_speed;
+
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Reset_Resource(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_IP_NUM_T *usb_ip;
+ kal_uint8 usb_ip_port;
+
+ usb_ip = &data->rHCD_ip;
+ usb_ip_port =(kal_uint8)usb_ip->ip;
+
+ USB_HCD_Reset_Resource(usb_ip_port);
+
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Init_Drv_Info(DCL_CTRL_DATA_T *data)
+{
+/* called by OTG_Host_Up_Hdlr */
+ kal_uint32 index;
+ USB_HCD_CTRL_IP_NUM_T *usb_ip;
+ kal_uint8 usb_ip_port;
+
+ usb_ip = &data->rHCD_ip;
+ usb_ip_port = (kal_uint8)usb_ip->ip;
+
+ if (usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+ /* interrupt handler */
+ g_UsbHcdInfo[usb_ip_port].attach_hdlr = NULL;
+ g_UsbHcdInfo[usb_ip_port].detach_hdlr = NULL;
+ g_UsbHcdInfo[usb_ip_port].resume_hdlr = NULL;
+
+ g_UsbHcdInfo[usb_ip_port].ep0_hdlr = NULL;
+ g_UsbHcdInfo[usb_ip_port].ep0_info.b_enable = KAL_FALSE;
+
+ for(index = 0; index < MAX_TX_EP_NUM; index++)
+ {
+ g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[index] = NULL;
+ g_UsbHcdInfo[usb_ip_port].ep_tx_info[index].b_enable = KAL_FALSE;
+}
+
+ for(index = 0; index < MAX_RX_EP_NUM; index++)
+ {
+ g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[index] = NULL;
+ g_UsbHcdInfo[usb_ip_port].ep_rx_info[index].b_enable = KAL_FALSE;
+ }
+
+ /* DMA parameters */
+ for(index = 0; index < MAX_EP_NUM; index++)
+ {
+ g_UsbHcdInfo[usb_ip_port].dma_port[USB_EP_TX_DIR][index] = 0;
+ g_UsbHcdInfo[usb_ip_port].dma_port[USB_EP_RX_DIR][index] = 0;
+ }
+
+ for(index = 0; index < MAX_DMA_NUM; index++)
+ {
+ g_UsbHcdInfo[usb_ip_port].dma_pktrdy[index] = KAL_FALSE;
+ g_UsbHcdInfo[usb_ip_port].dma_running[index] = KAL_FALSE;
+ g_UsbHcdInfo[usb_ip_port].dma_callback_upd_run[index] = KAL_FALSE;
+ g_UsbHcdInfo[usb_ip_port].dma_tx_ep_num[index] = 0;
+ g_UsbHcdInfo[usb_ip_port].dma_rx_ep_num[index] = 0;
+ }
+
+ g_UsbHcdInfo[usb_ip_port].b_unmask_irq = KAL_TRUE;
+
+ g_UsbHcdInfo[usb_ip_port].ep_tx_real_num = 0;
+ g_UsbHcdInfo[usb_ip_port].ep_rx_real_num = 0;
+
+ USB_HCD_Reset_Resource(usb_ip_port);
+
+ if ((g_UsbHcdInfo[usb_ip_port].gpt_handle == 0)||(g_UsbHcdInfo[usb_ip_port].gpt_handle == 0x7F))
+ g_UsbHcdInfo[usb_ip_port].gpt_handle= DclSGPT_Open(DCL_GPT_CB, 0);
+// GPTI_GetHandle(&g_UsbHcdInfo[usb_ip_port].gpt_handle);
+
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Release_Drv_Info(DCL_CTRL_DATA_T *data)
+{
+ DCL_HANDLE handle;
+ kal_uint32 index;
+ USB_HCD_CTRL_IP_NUM_T *usb_ip;
+ kal_uint8 usb_ip_port;
+
+ usb_ip = &data->rHCD_ip;
+ usb_ip_port = (kal_uint8)usb_ip->ip;
+
+ if (usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+ g_UsbHcdInfo[usb_ip_port].ep0_hdlr = NULL;
+ g_UsbHcdInfo[usb_ip_port].ep0_info.b_enable = KAL_FALSE;
+
+ for(index = 0; index < MAX_TX_EP_NUM; index++)
+ {
+ g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[index] = NULL;
+ g_UsbHcdInfo[usb_ip_port].ep_tx_info[index].b_enable = KAL_FALSE;
+ }
+
+ for(index = 0; index < MAX_RX_EP_NUM; index++)
+ {
+ g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[index] = NULL;
+ g_UsbHcdInfo[usb_ip_port].ep_rx_info[index].b_enable = KAL_FALSE;
+ }
+
+ USB_HCD_Reset_Resource(usb_ip_port);
+
+
+ handle = (DCL_HANDLE)g_UsbHcdInfo[usb_ip_port].gpt_handle;
+ g_UsbHcdInfo[usb_ip_port].gpt_handle = DclSGPT_Close(&handle);
+// GPTI_ReleaseHandle(&g_UsbHcdInfo[usb_ip_port].gpt_handle);
+
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Register_Drv_Info(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_REGISTER_DRV_INFO_T *prregister_drv_info;
+ kal_uint8 usb_ip_port;
+ kal_uint32 ep_num;
+
+ prregister_drv_info = &data->rHCD_Drv_Info;
+ usb_ip_port = (kal_uint8)prregister_drv_info->ip;
+ ep_num = (kal_uint32)prregister_drv_info->u4ep_num;
+
+
+ if (usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+ switch(prregister_drv_info->type)
+ {
+ case USB_HCD_HDLR_ATTACH:
+ g_UsbHcdInfo[usb_ip_port].attach_hdlr = (usb_hcd_intr_handler_ptr)prregister_drv_info->hdlr;
+ break;
+ case USB_HCD_HDLR_DETACH:
+ g_UsbHcdInfo[usb_ip_port].detach_hdlr = (usb_hcd_intr_handler_ptr)prregister_drv_info->hdlr;
+ break;
+ case USB_HCD_HDLR_RESUME:
+ g_UsbHcdInfo[usb_ip_port].resume_hdlr = (usb_hcd_intr_handler_ptr)prregister_drv_info->hdlr;
+ break;
+ case USB_HCD_HDLR_EP0:
+ g_UsbHcdInfo[usb_ip_port].ep0_hdlr = (usb_hcd_intr_handler_ptr)prregister_drv_info->hdlr;
+ break;
+ case USB_HCD_HDLR_EP_TX:
+ USB_HCD_EP_Check(usb_ip_port,ep_num, USB_EP_TX_DIR, 0);
+ g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[prregister_drv_info->u4ep_num -1] = (usb_hcd_intr_handler_ptr)prregister_drv_info->hdlr;
+ break;
+ case USB_HCD_HDLR_EP_RX:
+ USB_HCD_EP_Check(usb_ip_port,ep_num, USB_EP_RX_DIR, 0);
+ g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[prregister_drv_info->u4ep_num -1] = (usb_hcd_intr_handler_ptr)prregister_drv_info->hdlr;
+ break;
+ default:
+ EXT_ASSERT(0, (kal_uint32)(prregister_drv_info->type), prregister_drv_info->u4ep_num, 0);
+ break;
+ }
+
+ return STATUS_OK;
+
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Set_UnMask_Irq(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_SYSTEM_T *system_drv;
+
+ system_drv = &data->rHCD_System_Set;
+
+/* set unmask variable to control if unmask USB interruput when leaving USB HISR*/
+ g_UsbHcdInfo[(kal_uint8)(system_drv->ip)].b_unmask_irq = (kal_bool)(system_drv->set);
+
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Get_UnMask_Irq(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_IP_NUM_T *usb_ip;
+
+ usb_ip = &data->rHCD_ip;
+
+ usb_ip->return_value = g_UsbHcdInfo[(kal_uint8)(usb_ip->ip)].b_unmask_irq;
+
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Dis_Attach(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_IP_NUM_T *usb_ip;
+
+ usb_ip = &data->rHCD_ip;
+
+ g_UsbHcdInfo[(kal_uint8)(usb_ip->ip)].b_disable_attach = KAL_TRUE;
+
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_En_Attach(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_IP_NUM_T *usb_ip;
+// kal_uint8 usb_ip_port;
+
+ usb_ip = &data->rHCD_ip;
+
+ g_UsbHcdInfo[(kal_uint8)(usb_ip->ip)].b_disable_attach = KAL_FALSE;
+
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Initialize_Drv(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_IP_NUM_T *usb_ip;
+ kal_uint8 usb_ip_port;
+
+ usb_ip = &data->rHCD_ip;
+ usb_ip_port = (kal_uint8)usb_ip->ip;
+
+/* called by OTG_Host_Up_Hdlr */
+
+ if (usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+ /* Software reset */
+
+ if (usb_ip_port < USB_EXT_IP_NUM)
+ {
+ // power on in otg_mode selection
+ }
+#if defined(__IC_USB_ENABLE__)
+ else
+ {
+ IC_USB_PDNmode(KAL_FALSE);// power on PHY Clock, PHY setting
+ }
+#endif
+
+
+
+#if defined(DRV_USB_IP_V3)
+ USB_DRV_WriteReg(USB_SWRST_HCD(USB_BaseAddr[usb_ip_port]), (USB_SWRST_DISUSBRESET|USB_SWRST_SWRST));
+#elif defined(DRV_USB_IP_V4)
+ USB_DRV_SetBits(USB_BUSPERF3_HCD(USB_BaseAddr[usb_ip_port]), (USB_BUSPERF3_DISUSBRESET|USB_BUSPERF3_SWRST));
+#endif
+
+ USB_DRV_WriteReg8(USB_RSTINFO_HCD(USB_BaseAddr[usb_ip_port]), 0xA0);
+ USB_DRV_SetBits8(USB_POWER_HCD(USB_BaseAddr[usb_ip_port]), (USB_POWER_ISOUPDATE|USB_POWER_ENABLESUSPENDM));
+ USB_DRV_WriteReg8(USB_VPLEN_HCD(USB_BaseAddr[usb_ip_port]), 0x02);
+
+ g_UsbHcdInfo[usb_ip_port].host_common_param = USB_GetCustomFunc()->get_host_common_param_func();
+
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Release_Drv(DCL_CTRL_DATA_T *data)
+{
+// USB_HCD_CTRL_IP_NUM_T *usb_ip;
+// kal_uint8 usb_ip_port;
+
+// usb_ip = &data->rHCD_ip;
+// usb_ip_port = (kal_uint8)usb_ip->ip;
+
+#ifdef __IC_USB_ENABLE__
+//RG_USB11_FSLS_ENBGRI = 0
+ USB_DRV_ClearBits8(USB_U1PHYCR0_1, USB_U1PHYCR0_1_RG_USB11_FSLS_ENBGRI);
+#endif
+
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_SetAddress(DCL_CTRL_DATA_T *data)
+{
+ /* set address for hw*/
+ USB_HCD_CTRL_SET_ADDRESS_T *prset_addr;
+
+ prset_addr = &data->rHCD_Set_Addr;
+
+ if ((kal_uint8)prset_addr->ip >= USB_IP_NUM)
+ ASSERT(0);
+
+ USB_DRV_WriteReg8(USB_FADDR_HCD(USB_BaseAddr[(kal_uint8)prset_addr->ip]), prset_addr->addr);
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Resume(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_IP_NUM_T *usb_ip;
+ kal_uint8 usb_ip_port;
+
+ usb_ip = &data->rHCD_ip;
+ usb_ip_port = (kal_uint8)usb_ip->ip;
+
+ USB_HCD_Resume(usb_ip_port);
+
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Suspend(DCL_CTRL_DATA_T *data)
+{
+// USB_HCD_CTRL_IP_NUM_T *usb_ip;
+// kal_uint8 usb_ip_port;
+
+// usb_ip = &data->rHCD_ip;
+// usb_ip_port = (kal_uint8)usb_ip->ip;
+
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Delay_Reset_Device(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_DELAY_RESET_DEVICE_T *prdelay_reset_device;
+ kal_uint8 usb_ip_port;
+ SGPT_CTRL_START_T start;
+
+ prdelay_reset_device = &data->rHCD_Delay_Reset_Device;
+ usb_ip_port = (kal_uint8)prdelay_reset_device->ip;
+
+/* Reset after timeout, note that timeout unit is 10ms */
+
+ if (usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+ g_UsbHcdInfo[usb_ip_port].reset_reason = (USB_HCD_STATUS)prdelay_reset_device->result;
+
+ if((prdelay_reset_device->u4param)>0)
+ {
+ start.u2Tick = prdelay_reset_device->u4param;
+ start.pfCallback = USB_HCD_Delay_Reset_Timeout;
+ start.vPara = &g_UsbHcdInfo[usb_ip_port];
+ DclSGPT_Control((DCL_HANDLE)(g_UsbHcdInfo[usb_ip_port].gpt_handle), SGPT_CMD_START, (DCL_CTRL_DATA_T*)&start);
+// GPTI_StartItem(g_UsbHcdInfo[usb_ip_port].gpt_handle, prdelay_reset_device->u4param,USB_HCD_Delay_Reset_Timeout, &g_UsbHcdInfo[usb_ip_port]);
+ }
+ else
+ {
+ USB_HCD_Reset_Device(usb_ip_port,(USB_HCD_STATUS)prdelay_reset_device->result);
+ }
+
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Set_EP_Max_Pkt(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_EP_CTRL_FUNC_1_T *prep_ctrl_func_1;
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_ep_str;
+ USB_ENDPT_TXFER_TYPE ep_type;
+
+ prep_ctrl_func_1 = &data->rHCD_EP_Ctrl_Func_1;
+
+ common_str.if_num = (kal_uint32)prep_ctrl_func_1->common_str.if_num;
+ common_str.usb_ip_port = (kal_uint8)prep_ctrl_func_1->common_str.usb_ip_port;
+
+ usb_ep_str.ep_max_pkt_size = (kal_uint16)prep_ctrl_func_1->usb_ep_str.ep_max_pkt_size;
+ usb_ep_str.ep_num = (kal_uint8)prep_ctrl_func_1->usb_ep_str.ep_num;
+ usb_ep_str.ep_real_num = (kal_uint8)prep_ctrl_func_1->usb_ep_str.ep_real_num;
+ usb_ep_str.ep_type = (USB_ENDPT_TXFER_TYPE)prep_ctrl_func_1->usb_ep_str.ep_type;
+ usb_ep_str.direction = (USB_EP_DIRECTION)prep_ctrl_func_1->usb_ep_str.direction;
+
+
+ if (common_str.usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+ if (common_str.usb_ip_port < USB_EXT_IP_NUM)
+ {
+ if(((usb_ep_str.direction == USB_EP_TX_DIR)&&(usb_ep_str.ep_num > MAX_TX_EP_NUM))||
+ ((usb_ep_str.direction == USB_EP_RX_DIR)&&(usb_ep_str.ep_num > MAX_RX_EP_NUM)))
+ EXT_ASSERT(0, usb_ep_str.ep_num, (kal_uint32)usb_ep_str.direction, 0);
+ }
+#if defined(__IC_USB_ENABLE__)
+ else
+ {
+ if(((usb_ep_str.direction == USB_EP_TX_DIR)&&(usb_ep_str.ep_num > ICUSB_MAX_TX_EP_NUM))||
+ ((usb_ep_str.direction == USB_EP_RX_DIR)&&(usb_ep_str.ep_num > ICUSB_MAX_RX_EP_NUM)))
+ EXT_ASSERT(0, usb_ep_str.ep_num, (kal_uint32)usb_ep_str.direction, 0);
+ }
+#endif
+
+ if(usb_ep_str.ep_num == 0)
+ {
+ g_UsbHcdInfo[common_str.usb_ip_port].ep0_info.max_packet_size = usb_ep_str.ep_max_pkt_size;
+
+ if(usb_ep_str.ep_max_pkt_size > USB_EP0_MAXP)
+ EXT_ASSERT(0, usb_ep_str.ep_max_pkt_size, 0, 0);
+ }
+ else
+ {
+ if(usb_ep_str.direction == USB_EP_TX_DIR)
+ {
+ g_UsbHcdInfo[common_str.usb_ip_port].ep_tx_info[usb_ep_str.ep_num-1].max_packet_size = usb_ep_str.ep_max_pkt_size; //lint !e661
+ ep_type = g_UsbHcdInfo[common_str.usb_ip_port].ep_tx_info[usb_ep_str.ep_num-1].ep_type; //lint !e661
+ }
+ else
+ {
+ g_UsbHcdInfo[common_str.usb_ip_port].ep_rx_info[usb_ep_str.ep_num-1].max_packet_size = usb_ep_str.ep_max_pkt_size; //lint !e661 !e662
+ ep_type = g_UsbHcdInfo[common_str.usb_ip_port].ep_rx_info[usb_ep_str.ep_num-1].ep_type; //lint !e661 !e662
+ }
+
+ if(ep_type == USB_ENDPT_BULK)
+ {
+ if(USB_HCD_Is_High_Speed(common_str.usb_ip_port) == KAL_TRUE)
+ {
+ if (usb_ep_str.ep_max_pkt_size > USB_EP_BULK_MAXP_HS)
+ EXT_ASSERT(0, usb_ep_str.ep_max_pkt_size, 0, 0);
+ }
+ else
+ {
+ if (usb_ep_str.ep_max_pkt_size >USB_EP_BULK_MAXP_FS)
+ EXT_ASSERT(0, usb_ep_str.ep_max_pkt_size, 0, 0);
+ }
+ }
+ else if (ep_type == USB_ENDPT_INTR)
+ {
+
+ }
+ else if (ep_type == USB_ENDPT_ISO)
+ {
+
+ }
+ else
+ {
+ ASSERT(0);
+ }
+ }
+ return STATUS_OK;
+
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Clear_Data01(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_EP_CTRL_FUNC_1_T *prep_ctrl_func_1;
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_ep_str;
+ kal_uint32 savedMask;
+
+ prep_ctrl_func_1 = &data->rHCD_EP_Ctrl_Func_1;
+
+ common_str.if_num = (kal_uint32)prep_ctrl_func_1->common_str.if_num;
+ common_str.usb_ip_port = (kal_uint8)prep_ctrl_func_1->common_str.usb_ip_port;
+
+ usb_ep_str.ep_max_pkt_size = (kal_uint16)prep_ctrl_func_1->usb_ep_str.ep_max_pkt_size;
+ usb_ep_str.ep_num = (kal_uint8)prep_ctrl_func_1->usb_ep_str.ep_num;
+ usb_ep_str.ep_real_num = (kal_uint8)prep_ctrl_func_1->usb_ep_str.ep_real_num;
+ usb_ep_str.ep_type = (USB_ENDPT_TXFER_TYPE)prep_ctrl_func_1->usb_ep_str.ep_type;
+ usb_ep_str.direction = (USB_EP_DIRECTION)prep_ctrl_func_1->usb_ep_str.direction;
+
+/* May run in task */
+ if (common_str.usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+
+ if(usb_ep_str.ep_num == 0)
+ {
+ ASSERT(0);
+ }
+ else
+ {
+ savedMask = SaveAndSetIRQMask();
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[common_str.usb_ip_port]), usb_ep_str.ep_num);
+
+ if(usb_ep_str.direction == USB_EP_TX_DIR)
+ {
+ if((USB_DRV_Reg(USB_TXCSR_HCD(USB_BaseAddr[common_str.usb_ip_port]))&USB_TXCSR_FIFONOTEMPTY) != 0)
+ g_UsbHcdInfo[common_str.usb_ip_port].ep_tx_flush_intr[usb_ep_str.ep_num-1] = KAL_TRUE;
+
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[common_str.usb_ip_port]), 0x00);
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[common_str.usb_ip_port]), (USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG));
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[common_str.usb_ip_port]), (USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG));
+ }
+ else
+ {
+ if((USB_DRV_Reg(USB_RXCSR_HCD(USB_BaseAddr[common_str.usb_ip_port]))&USB_RXCSR_RXPKTRDY) != 0)
+ g_UsbHcdInfo[common_str.usb_ip_port].ep_rx_flush_intr[usb_ep_str.ep_num-1] = KAL_TRUE;
+
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[common_str.usb_ip_port]), 0x00);
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[common_str.usb_ip_port]), (USB_RXCSR_FLUSHFIFO|USB_RXCSR_CLRDATATOG));
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[common_str.usb_ip_port]), (USB_RXCSR_FLUSHFIFO|USB_RXCSR_CLRDATATOG));
+ }
+ RestoreIRQMask(savedMask);
+ }
+
+ return STATUS_OK;
+}
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_EP_Interval(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_EP_CTRL_FUNC_2_T *prep_ctrl_func_2;
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_ep_str;
+ kal_uint8 interval;
+
+ prep_ctrl_func_2 = &data->rHCD_EP_Ctrl_Func_2;
+
+ common_str.if_num = (kal_uint32)prep_ctrl_func_2->common_str.if_num;
+ common_str.usb_ip_port = (kal_uint8)prep_ctrl_func_2->common_str.usb_ip_port;
+
+ usb_ep_str.ep_max_pkt_size = (kal_uint16)prep_ctrl_func_2->usb_ep_str.ep_max_pkt_size;
+ usb_ep_str.ep_num = (kal_uint8)prep_ctrl_func_2->usb_ep_str.ep_num;
+ usb_ep_str.ep_real_num = (kal_uint8)prep_ctrl_func_2->usb_ep_str.ep_real_num;
+ usb_ep_str.ep_type = (USB_ENDPT_TXFER_TYPE)prep_ctrl_func_2->usb_ep_str.ep_type;
+ usb_ep_str.direction = (USB_EP_DIRECTION)prep_ctrl_func_2->usb_ep_str.direction;
+
+ interval = (kal_uint8)prep_ctrl_func_2->interval;
+
+ USB_HCD_EP_Interval(common_str,usb_ep_str,interval);
+
+ return STATUS_OK;
+}
+
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_EP0En(DCL_CTRL_DATA_T *data)
+{
+ kal_uint32 savedMask;
+ USB_HCD_CTRL_IP_NUM_T *usb_ip;
+ kal_uint8 usb_ip_port;
+
+ usb_ip = &data->rHCD_ip;
+ usb_ip_port = (kal_uint8)usb_ip->ip;
+
+
+/* May run in task */
+ if (usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+ g_UsbHcdInfo[usb_ip_port].ep0_info.b_enable = KAL_TRUE;
+ g_UsbHcdInfo[usb_ip_port].ep0_info.ep_type = USB_ENDPT_CTRL;
+
+ savedMask = SaveAndSetIRQMask();
+ /* Enable ep0 */
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), 0);
+ /* Flush ep0 FIFO */
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), USB_CSR0_FLUSHFIFO);
+ /* Enable EP0 interrupt */
+ USB_DRV_SetBits(USB_INTRTXE_HCD(USB_BaseAddr[usb_ip_port]), USB_INTRE_EPEN);
+ RestoreIRQMask(savedMask);
+
+ return STATUS_OK;
+}
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_EP0_Data_Length(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_EP_CTRL_FUNC_3_T *prep_ctrl_func_3;
+ USBH_Common_Struct common_str;
+
+ prep_ctrl_func_3 = &data->rHCD_EP_Ctrl_Func_3;
+
+ common_str.if_num = (kal_uint32)prep_ctrl_func_3->common_str.if_num;
+ common_str.usb_ip_port = (kal_uint8)prep_ctrl_func_3->common_str.usb_ip_port;
+
+ prep_ctrl_func_3->return_value = g_UsbHcdInfo[common_str.usb_ip_port].ep0_info.sofar;
+
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_EP_Rx_Pkt_Len(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_EP_CTRL_FUNC_4_T *prep_ctrl_func_4;
+// kal_uint32 savedMask;
+// kal_uint16 CSR;
+// kal_uint32 nCount = 0;
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_ep_str;
+
+ prep_ctrl_func_4 = &data->rHCD_EP_Ctrl_Func_4;
+
+ common_str.if_num = (kal_uint32)prep_ctrl_func_4->common_str.if_num;
+ common_str.usb_ip_port = (kal_uint8)prep_ctrl_func_4->common_str.usb_ip_port;
+
+ usb_ep_str.ep_max_pkt_size = (kal_uint16)prep_ctrl_func_4->usb_ep_str.ep_max_pkt_size;
+ usb_ep_str.ep_num = (kal_uint8)prep_ctrl_func_4->usb_ep_str.ep_num;
+ usb_ep_str.ep_real_num = (kal_uint8)prep_ctrl_func_4->usb_ep_str.ep_real_num;
+ usb_ep_str.ep_type = (USB_ENDPT_TXFER_TYPE)prep_ctrl_func_4->usb_ep_str.ep_type;
+ usb_ep_str.direction = (USB_EP_DIRECTION)prep_ctrl_func_4->usb_ep_str.direction;
+
+
+/* Return ep RX received packet length */
+ prep_ctrl_func_4->return_value = USB_HCD_EP_Rx_Pkt_Len(common_str,usb_ep_str);
+
+ return STATUS_OK;
+
+}
+
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Config_TxEP_Type(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_EP_CTRL_FUNC_5_T *prep_ctrl_func_5;
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_ep_str;
+ kal_bool b_is_switch_to_dma;
+ kal_uint32 savedMask;
+ kal_uint8 usb_ip_port;
+ kal_uint8 ep_num ;
+
+ prep_ctrl_func_5 = &data->rHCD_EP_Ctrl_Func_5;
+
+ common_str.if_num = (kal_uint32)prep_ctrl_func_5->common_str.if_num;
+ common_str.usb_ip_port = (kal_uint8)prep_ctrl_func_5->common_str.usb_ip_port;
+
+ usb_ep_str.ep_max_pkt_size = (kal_uint16)prep_ctrl_func_5->usb_ep_str.ep_max_pkt_size;
+ usb_ep_str.ep_num = (kal_uint8)prep_ctrl_func_5->usb_ep_str.ep_num;
+ usb_ep_str.ep_real_num = (kal_uint8)prep_ctrl_func_5->usb_ep_str.ep_real_num;
+ usb_ep_str.ep_type = (USB_ENDPT_TXFER_TYPE)prep_ctrl_func_5->usb_ep_str.ep_type;
+ usb_ep_str.direction = (USB_EP_DIRECTION)prep_ctrl_func_5->usb_ep_str.direction;
+
+ b_is_switch_to_dma = (kal_bool)prep_ctrl_func_5->set;
+ usb_ip_port = (kal_uint8)common_str.usb_ip_port;
+ ep_num = (kal_uint8)usb_ep_str.ep_num;
+
+
+ USB_HCD_EP_Check(usb_ip_port,ep_num, USB_EP_TX_DIR, 0);
+ USB_HCD_EP_DMA_Running_Check(usb_ip_port,ep_num, USB_EP_TX_DIR, 0);
+
+ g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].b_enable = KAL_TRUE;
+ g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].b_dma_enable = b_is_switch_to_dma;
+
+
+ if(b_is_switch_to_dma == KAL_TRUE)
+ {
+ if(g_UsbHcdInfo[usb_ip_port].ep_tx_enb_state[ep_num-1] == USB_EP_STATE_DMA)
+ ASSERT(0);
+
+ g_UsbHcdInfo[usb_ip_port].ep_tx_enb_state[ep_num-1] = USB_EP_STATE_DMA;
+
+ savedMask = SaveAndSetIRQMask();
+ USB_DRV_ClearBits(USB_INTRTXE_HCD(USB_BaseAddr[usb_ip_port]), (USB_INTRE_EPEN<<ep_num));
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), ep_num);
+
+ if(USB_DRV_Reg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]))&USB_TXCSR_FIFONOTEMPTY)
+ ASSERT(0);
+
+ /* Only is configured as multiple packet DMA TX mode */
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_HCD_DMA_TX_CSR);
+ RestoreIRQMask(savedMask);
+ }
+ else
+ {
+ if(g_UsbHcdInfo[usb_ip_port].ep_tx_enb_state[ep_num-1] == USB_EP_STATE_FIFO)
+ ASSERT(0);
+
+ g_UsbHcdInfo[usb_ip_port].ep_tx_enb_state[ep_num-1] = USB_EP_STATE_FIFO;
+
+ savedMask = SaveAndSetIRQMask();
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), ep_num);
+
+ /* When change ep state from DMA to FIFO, must make sure that FIFO is empty */
+ if(USB_DRV_Reg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]))&USB_TXCSR_TXPKTRDY)
+ ASSERT(0);
+
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), 0x00);
+ USB_DRV_SetBits(USB_INTRTXE_HCD(USB_BaseAddr[usb_ip_port]), (USB_INTRE_EPEN<<ep_num));
+ RestoreIRQMask(savedMask);
+ }
+
+ return STATUS_OK;
+
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Config_RxEP_Type(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_EP_CTRL_FUNC_5_T *prep_ctrl_func_5;
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_ep_str;
+ kal_bool b_is_switch_to_dma;
+ kal_uint32 savedMask;
+
+ prep_ctrl_func_5 = &data->rHCD_EP_Ctrl_Func_5;
+
+ common_str.if_num = (kal_uint32)prep_ctrl_func_5->common_str.if_num;
+ common_str.usb_ip_port = (kal_uint8)prep_ctrl_func_5->common_str.usb_ip_port;
+
+ usb_ep_str.ep_max_pkt_size = (kal_uint16)prep_ctrl_func_5->usb_ep_str.ep_max_pkt_size;
+ usb_ep_str.ep_num = (kal_uint8)prep_ctrl_func_5->usb_ep_str.ep_num;
+ usb_ep_str.ep_real_num = (kal_uint8)prep_ctrl_func_5->usb_ep_str.ep_real_num;
+ usb_ep_str.ep_type = (USB_ENDPT_TXFER_TYPE)prep_ctrl_func_5->usb_ep_str.ep_type;
+ usb_ep_str.direction = (USB_EP_DIRECTION)prep_ctrl_func_5->usb_ep_str.direction;
+
+ b_is_switch_to_dma = (kal_bool)prep_ctrl_func_5->set;
+
+
+
+/* When RX EP state is from FIFO to DMA, this function must be called before USB_EP_Bulk_Rx_Ready() */
+ USB_HCD_EP_Check(common_str.usb_ip_port,usb_ep_str.ep_num, USB_EP_RX_DIR, 0);
+ USB_HCD_EP_DMA_Running_Check(common_str.usb_ip_port,usb_ep_str.ep_num, USB_EP_RX_DIR, 0);
+
+ g_UsbHcdInfo[common_str.usb_ip_port].ep_rx_info[usb_ep_str.ep_num-1].b_enable = KAL_TRUE;
+ g_UsbHcdInfo[common_str.usb_ip_port].ep_rx_info[usb_ep_str.ep_num-1].b_dma_enable = b_is_switch_to_dma;
+
+ if(b_is_switch_to_dma == KAL_TRUE)
+ {
+ if(g_UsbHcdInfo[common_str.usb_ip_port].ep_rx_enb_state[usb_ep_str.ep_num-1] == USB_EP_STATE_DMA)
+ ASSERT(0);
+
+ g_UsbHcdInfo[common_str.usb_ip_port].ep_rx_enb_state[usb_ep_str.ep_num-1] = USB_EP_STATE_DMA;
+ savedMask = SaveAndSetIRQMask();
+ USB_DRV_ClearBits(USB_INTRRXE_HCD(USB_BaseAddr[common_str.usb_ip_port]), (USB_INTRE_EPEN << usb_ep_str.ep_num));
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[common_str.usb_ip_port]), usb_ep_str.ep_num);
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[common_str.usb_ip_port]), USB_HCD_DMA_RX_CSR|USB_RXCSR_RXPKTRDY);
+
+ RestoreIRQMask(savedMask);
+ }
+ else
+ {
+ if(g_UsbHcdInfo[common_str.usb_ip_port].ep_rx_enb_state[usb_ep_str.ep_num-1] == USB_EP_STATE_FIFO)
+ ASSERT(0);
+
+ g_UsbHcdInfo[common_str.usb_ip_port].ep_rx_enb_state[usb_ep_str.ep_num-1] = USB_EP_STATE_FIFO;
+
+ savedMask = SaveAndSetIRQMask();
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[common_str.usb_ip_port]), usb_ep_str.ep_num);
+
+ /* When we change ep state from DMA to FIFO, must make sure that FIFO is empty */
+ /* But there may be a null packet coming here in DMA callback */
+ if(USB_DRV_Reg(USB_RXCSR_HCD(USB_BaseAddr[common_str.usb_ip_port]))&USB_RXCSR_RXPKTRDY)
+ {
+ if(USB_DRV_Reg(USB_RXCOUNT_HCD(USB_BaseAddr[common_str.usb_ip_port])) == 0)
+ {
+ USB_DRV_ClearBits(USB_RXCSR_HCD(USB_BaseAddr[common_str.usb_ip_port]), USB_RXCSR_RXPKTRDY);
+ }
+ else
+ ASSERT(0);
+ }
+
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[common_str.usb_ip_port]), USB_RXCSR_RXPKTRDY);
+ USB_DRV_SetBits(USB_INTRRXE_HCD(USB_BaseAddr[common_str.usb_ip_port]), (USB_INTRE_EPEN << usb_ep_str.ep_num));
+ RestoreIRQMask(savedMask);
+ }
+
+ return STATUS_OK;
+
+}
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_TxEPInit(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_EP_CTRL_FUNC_1_T *prep_ctrl_func_1;
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_ep_str;
+ kal_uint8 usb_ip_port ;
+ kal_uint8 ep_num;
+ kal_uint8 ep_header;
+ kal_uint16 data_size;
+ USB_ENDPT_TXFER_TYPE type;
+ kal_bool double_fifo;
+
+ prep_ctrl_func_1 = &data->rHCD_EP_Ctrl_Func_1;
+
+ common_str.if_num = (kal_uint32)prep_ctrl_func_1->common_str.if_num;
+ common_str.usb_ip_port = (kal_uint8)prep_ctrl_func_1->common_str.usb_ip_port;
+
+ usb_ep_str.ep_max_pkt_size = (kal_uint16)prep_ctrl_func_1->usb_ep_str.ep_max_pkt_size;
+ usb_ep_str.ep_num = (kal_uint8)prep_ctrl_func_1->usb_ep_str.ep_num;
+ usb_ep_str.ep_real_num = (kal_uint8)prep_ctrl_func_1->usb_ep_str.ep_real_num;
+ usb_ep_str.ep_type = (USB_ENDPT_TXFER_TYPE)prep_ctrl_func_1->usb_ep_str.ep_type;
+ usb_ep_str.direction = (USB_EP_DIRECTION)prep_ctrl_func_1->usb_ep_str.direction;
+ usb_ip_port = (kal_uint8)common_str.usb_ip_port;
+
+ ep_num = (kal_uint8)usb_ep_str.ep_num;
+ ep_header = (kal_uint8)usb_ep_str.ep_real_num;
+ data_size = (kal_uint16)usb_ep_str.ep_max_pkt_size;
+ type = (USB_ENDPT_TXFER_TYPE)usb_ep_str.ep_type;
+
+ double_fifo = USB_HCD_Is_DoubleFIFO_SUPPORT(usb_ip_port);
+
+/* Run in HISR */
+ if ((usb_ip_port >= USB_EXT_IP_NUM) && (type != USB_ENDPT_BULK))
+ ASSERT(0);
+
+ if (usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+
+ USB_HCD_EP_Check(usb_ip_port,ep_num, USB_EP_TX_DIR, 0);
+ USB_HCD_EP_DMA_Running_Check(usb_ip_port,ep_num, USB_EP_TX_DIR, 0);
+
+ g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].ep_type = type;
+ g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].direction = USB_EP_TX_DIR;
+
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), ep_num);
+ /* double buffers, so flush twice */
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), 0x00);
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), (USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG));
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), (USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG));
+ USB_DRV_WriteReg(USB_TXMAXP_HCD(USB_BaseAddr[usb_ip_port]), data_size);
+
+ /* Set FIFO address here */
+ if(type == USB_ENDPT_BULK)
+ {
+ USB_DRV_WriteReg8(USB_TXTYPE_HCD(USB_BaseAddr[usb_ip_port]), USB_TXTYPE_BULK|ep_header);
+ if (usb_ip_port < USB_EXT_IP_NUM)
+ {
+ if(double_fifo == KAL_TRUE)
+ {
+ USB_DRV_WriteReg8(USB_TXFIFOSZ_HCD(USB_BaseAddr[usb_ip_port]), (USB_FIFOSZ_SIZE_512|USB_FIFOSZ_DPB));
+ USB_DRV_WriteReg(USB_TXFIFOADD_HCD(USB_BaseAddr[usb_ip_port]), (g_HCD_FIFOadd/8));
+ g_HCD_FIFOadd += USB_BULK_FIFO_UNIT_SIZE*2;
+ }
+ else
+ {
+ USB_DRV_WriteReg8(USB_TXFIFOSZ_HCD(USB_BaseAddr[usb_ip_port]), USB_FIFOSZ_SIZE_512);
+ USB_DRV_WriteReg(USB_TXFIFOADD_HCD(USB_BaseAddr[usb_ip_port]), (g_HCD_FIFOadd/8));
+ g_HCD_FIFOadd += USB_BULK_FIFO_UNIT_SIZE;
+
+ }
+ }
+#if defined(__IC_USB_ENABLE__)
+ else
+ {
+ USB_DRV_WriteReg8(USB_TXFIFOSZ_HCD(USB_BaseAddr[usb_ip_port]), (USB_FIFOSZ_SIZE_64|USB_FIFOSZ_DPB));
+ USB_DRV_WriteReg(USB_TXFIFOADD_HCD(USB_BaseAddr[usb_ip_port]), (g_HCD_FIFOadd/8));
+ g_HCD_FIFOadd += ICUSB_BULK_FIFO_UNIT_SIZE*2;
+ }
+#endif
+ }
+ else if (type == USB_ENDPT_INTR)
+ {
+ USB_DRV_WriteReg8(USB_TXTYPE_HCD(USB_BaseAddr[usb_ip_port]), USB_TXTYPE_INTR|ep_header);
+
+ if(data_size > 64)
+ ASSERT(0);
+
+#ifdef __INTR_HB__
+ USB_DRV_WriteReg8(USB_TXFIFOSZ_HCD(USB_BaseAddr[usb_ip_port]), USB_FIFOSZ_SIZE_4096);
+ USB_DRV_WriteReg(USB_TXFIFOADD_HCD(USB_BaseAddr[usb_ip_port]), (g_HCD_FIFOadd/8));
+ g_HCD_FIFOadd += USB_INTR_FIFO_UNIT_SIZE;
+#else
+ if(double_fifo == KAL_TRUE)
+ {
+ USB_DRV_WriteReg8(USB_TXFIFOSZ_HCD(USB_BaseAddr[usb_ip_port]), (USB_FIFOSZ_SIZE_32|USB_FIFOSZ_DPB));
+ USB_DRV_WriteReg(USB_TXFIFOADD_HCD(USB_BaseAddr[usb_ip_port]), (g_HCD_FIFOadd/8));
+ g_HCD_FIFOadd += USB_INTR_FIFO_UNIT_SIZE*2;
+
+ }
+ else
+ {
+ USB_DRV_WriteReg8(USB_TXFIFOSZ_HCD(USB_BaseAddr[usb_ip_port]), USB_FIFOSZ_SIZE_32);
+ USB_DRV_WriteReg(USB_TXFIFOADD_HCD(USB_BaseAddr[usb_ip_port]), (g_HCD_FIFOadd/8));
+ g_HCD_FIFOadd += USB_INTR_FIFO_UNIT_SIZE;
+ }
+#endif
+ }
+ else if (type == USB_ENDPT_ISO)
+ {
+ USB_DRV_WriteReg8(USB_TXTYPE_HCD(USB_BaseAddr[usb_ip_port]), USB_TXTYPE_ISO|ep_header);
+
+ if(data_size > 512)
+ ASSERT(0);
+
+#ifdef __ISO_HB__
+ USB_DRV_WriteReg8(USB_TXFIFOSZ_HCD(USB_BaseAddr[usb_ip_port]), USB_FIFOSZ_SIZE_4096);
+ USB_DRV_WriteReg(USB_TXFIFOADD_HCD(USB_BaseAddr[usb_ip_port]), (g_HCD_FIFOadd/8));
+ g_HCD_FIFOadd += USB_ISO_FIFO_UNIT_SIZE;
+#else
+ if(double_fifo == KAL_TRUE)
+ {
+ USB_DRV_WriteReg8(USB_TXFIFOSZ_HCD(USB_BaseAddr[usb_ip_port]), (USB_FIFOSZ_SIZE_1024|USB_FIFOSZ_DPB));
+ USB_DRV_WriteReg(USB_TXFIFOADD_HCD(USB_BaseAddr[usb_ip_port]), (g_HCD_FIFOadd/8));
+ g_HCD_FIFOadd += USB_ISO_FIFO_UNIT_SIZE*2;
+ }
+ else
+ {
+ USB_DRV_WriteReg8(USB_TXFIFOSZ_HCD(USB_BaseAddr[usb_ip_port]), USB_FIFOSZ_SIZE_1024);
+ USB_DRV_WriteReg(USB_TXFIFOADD_HCD(USB_BaseAddr[usb_ip_port]), (g_HCD_FIFOadd/8));
+ g_HCD_FIFOadd += USB_ISO_FIFO_UNIT_SIZE;
+ }
+#endif
+ }
+ else
+ {
+ ASSERT(0);
+ }
+
+ if (usb_ip_port < USB_EXT_IP_NUM)
+ {
+ if(g_HCD_FIFOadd > USB_MAX_FIFO_SIZE)
+ ASSERT(0);
+ }
+#if defined(__IC_USB_ENABLE__)
+ else
+ {
+ if(g_HCD_FIFOadd > ICUSB_MAX_FIFO_SIZE)
+ ASSERT(0);
+ }
+#endif
+
+ return STATUS_OK;
+}
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_RxEPInit(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_EP_CTRL_FUNC_1_T *prep_ctrl_func_1;
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_ep_str;
+ kal_uint8 usb_ip_port ;
+ kal_uint8 ep_num;
+ kal_uint8 ep_header;
+ kal_uint16 data_size;
+ USB_ENDPT_TXFER_TYPE type;
+ kal_bool double_fifo;
+
+ prep_ctrl_func_1 = &data->rHCD_EP_Ctrl_Func_1;
+
+ common_str.if_num = (kal_uint32)prep_ctrl_func_1->common_str.if_num;
+ common_str.usb_ip_port = (kal_uint8)prep_ctrl_func_1->common_str.usb_ip_port;
+
+ usb_ep_str.ep_max_pkt_size = (kal_uint16)prep_ctrl_func_1->usb_ep_str.ep_max_pkt_size;
+ usb_ep_str.ep_num = (kal_uint8)prep_ctrl_func_1->usb_ep_str.ep_num;
+ usb_ep_str.ep_real_num = (kal_uint8)prep_ctrl_func_1->usb_ep_str.ep_real_num;
+ usb_ep_str.ep_type = (USB_ENDPT_TXFER_TYPE)prep_ctrl_func_1->usb_ep_str.ep_type;
+ usb_ep_str.direction = (USB_EP_DIRECTION)prep_ctrl_func_1->usb_ep_str.direction;
+
+ usb_ip_port = (kal_uint8)common_str.usb_ip_port;
+ ep_num = (kal_uint8)usb_ep_str.ep_num;
+ ep_header = (kal_uint8)usb_ep_str.ep_real_num;
+ data_size = (kal_uint16)usb_ep_str.ep_max_pkt_size;
+ type = (USB_ENDPT_TXFER_TYPE)usb_ep_str.ep_type;
+
+ double_fifo = USB_HCD_Is_DoubleFIFO_SUPPORT(usb_ip_port);
+
+/* run in HISR */
+/* initialize EP RX */
+
+
+ if ((usb_ip_port >= USB_EXT_IP_NUM) && (type != USB_ENDPT_BULK))
+ ASSERT(0);
+
+ if (usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+
+
+ USB_HCD_EP_Check(usb_ip_port,ep_num, USB_EP_RX_DIR, 0);
+ USB_HCD_EP_DMA_Running_Check(usb_ip_port,ep_num, USB_EP_RX_DIR, 0);
+
+ g_UsbHcdInfo[usb_ip_port].ep_rx_info[ep_num-1].ep_type = type;
+ g_UsbHcdInfo[usb_ip_port].ep_rx_info[ep_num-1].direction = USB_EP_RX_DIR;
+
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), ep_num);
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), 0x00);
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), (USB_RXCSR_FLUSHFIFO|USB_RXCSR_CLRDATATOG));
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), (USB_RXCSR_FLUSHFIFO|USB_RXCSR_CLRDATATOG));
+ USB_DRV_WriteReg(USB_RXMAXP_HCD(USB_BaseAddr[usb_ip_port]), data_size);
+
+ /* set FIFO address here */
+ if(type == USB_ENDPT_BULK)
+ {
+ USB_DRV_WriteReg8(USB_RXTYPE_HCD(USB_BaseAddr[usb_ip_port]), (USB_RXTYPE_BULK|ep_header));
+ if (usb_ip_port < USB_EXT_IP_NUM)
+ {
+ if(double_fifo == KAL_TRUE)
+ {
+ USB_DRV_WriteReg8(USB_RXFIFOSZ_HCD(USB_BaseAddr[usb_ip_port]), (USB_FIFOSZ_SIZE_512|USB_FIFOSZ_DPB));
+ USB_DRV_WriteReg(USB_RXFIFOADD_HCD(USB_BaseAddr[usb_ip_port]), (g_HCD_FIFOadd/8));
+ g_HCD_FIFOadd += USB_BULK_FIFO_UNIT_SIZE*2;
+ }
+ else
+ {
+ USB_DRV_WriteReg8(USB_RXFIFOSZ_HCD(USB_BaseAddr[usb_ip_port]), USB_FIFOSZ_SIZE_512);
+ USB_DRV_WriteReg(USB_RXFIFOADD_HCD(USB_BaseAddr[usb_ip_port]), (g_HCD_FIFOadd/8));
+ g_HCD_FIFOadd += USB_BULK_FIFO_UNIT_SIZE;
+ }
+ }
+#if defined(__IC_USB_ENABLE__)
+ else
+ {
+ USB_DRV_WriteReg8(USB_RXFIFOSZ_HCD(USB_BaseAddr[usb_ip_port]), (USB_FIFOSZ_SIZE_64|USB_FIFOSZ_DPB));
+ USB_DRV_WriteReg(USB_RXFIFOADD_HCD(USB_BaseAddr[usb_ip_port]), (g_HCD_FIFOadd/8));
+ g_HCD_FIFOadd += ICUSB_BULK_FIFO_UNIT_SIZE*2 ;
+ }
+#endif
+ }
+ else if(type == USB_ENDPT_INTR)
+ {
+ USB_DRV_WriteReg8(USB_RXTYPE_HCD(USB_BaseAddr[usb_ip_port]), (USB_RXTYPE_INTR|ep_header));
+
+#ifdef __INTR_HB__
+ USB_DRV_WriteReg8(USB_RXFIFOSZ_HCD(USB_BaseAddr[usb_ip_port]), USB_FIFOSZ_SIZE_4096);
+ USB_DRV_WriteReg(USB_RXFIFOADD_HCD(USB_BaseAddr[usb_ip_port]), (g_HCD_FIFOadd/8));
+ g_HCD_FIFOadd += USB_INTR_FIFO_UNIT_SIZE;
+#else
+ if(double_fifo == KAL_TRUE)
+ {
+ USB_DRV_WriteReg8(USB_RXFIFOSZ_HCD(USB_BaseAddr[usb_ip_port]), (USB_FIFOSZ_SIZE_32|USB_FIFOSZ_DPB));
+ USB_DRV_WriteReg(USB_RXFIFOADD_HCD(USB_BaseAddr[usb_ip_port]), (g_HCD_FIFOadd/8));
+ g_HCD_FIFOadd += USB_INTR_FIFO_UNIT_SIZE*2;
+ }
+ else
+ {
+ USB_DRV_WriteReg8(USB_RXFIFOSZ_HCD(USB_BaseAddr[usb_ip_port]), USB_FIFOSZ_SIZE_32);
+ USB_DRV_WriteReg(USB_RXFIFOADD_HCD(USB_BaseAddr[usb_ip_port]), (g_HCD_FIFOadd/8));
+ g_HCD_FIFOadd += USB_INTR_FIFO_UNIT_SIZE;
+ }
+#endif
+ }
+ else if(type == USB_ENDPT_ISO)
+ {
+ USB_DRV_WriteReg8(USB_RXTYPE_HCD(USB_BaseAddr[usb_ip_port]), (USB_RXTYPE_ISO|ep_header));
+
+#ifdef __ISO_HB__
+ USB_DRV_WriteReg8(USB_RXFIFOSZ_HCD(USB_BaseAddr[usb_ip_port]), USB_FIFOSZ_SIZE_4096);
+ USB_DRV_WriteReg(USB_RXFIFOADD_HCD(USB_BaseAddr[usb_ip_port]), (g_HCD_FIFOadd/8));
+ g_HCD_FIFOadd += USB_ISO_FIFO_UNIT_SIZE;
+#else
+ if(double_fifo == KAL_TRUE)
+ {
+ USB_DRV_WriteReg8(USB_RXFIFOSZ_HCD(USB_BaseAddr[usb_ip_port]), (USB_FIFOSZ_SIZE_1024|USB_FIFOSZ_DPB));
+ USB_DRV_WriteReg(USB_RXFIFOADD_HCD(USB_BaseAddr[usb_ip_port]), (g_HCD_FIFOadd/8));
+ g_HCD_FIFOadd += USB_ISO_FIFO_UNIT_SIZE*2;
+ }
+ else
+ {
+ USB_DRV_WriteReg8(USB_RXFIFOSZ_HCD(USB_BaseAddr[usb_ip_port]), USB_FIFOSZ_SIZE_1024);
+ USB_DRV_WriteReg(USB_RXFIFOADD_HCD(USB_BaseAddr[usb_ip_port]), (g_HCD_FIFOadd/8));
+ g_HCD_FIFOadd += USB_ISO_FIFO_UNIT_SIZE;
+ }
+#endif
+ }
+ else
+ {
+ ASSERT(0);
+ }
+
+ if (usb_ip_port < USB_EXT_IP_NUM)
+ {
+ if(g_HCD_FIFOadd > USB_MAX_FIFO_SIZE)
+ ASSERT(0);
+ }
+#if defined(__IC_USB_ENABLE__)
+ else
+ {
+ if(g_HCD_FIFOadd > ICUSB_MAX_FIFO_SIZE)
+ ASSERT(0);
+ }
+#endif
+
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_TxEPEn(DCL_CTRL_DATA_T *data)
+{
+ kal_uint32 savedMask;
+
+ USB_HCD_CTRL_EP_ENABLE_T *prep_enable;
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_ep_str;
+ kal_uint8 interval;
+ kal_bool bDMA;
+ kal_bool bDMAQ;
+ kal_uint8 usb_ip_port;
+ kal_uint8 ep_num;
+ USB_ENDPT_TXFER_TYPE ep_type;
+
+ prep_enable = &data->rHCD_EP_Enable;
+
+ common_str.if_num = (kal_uint32)prep_enable->common_str.if_num;
+ common_str.usb_ip_port = (kal_uint8)prep_enable->common_str.usb_ip_port;
+
+ usb_ep_str.ep_max_pkt_size = (kal_uint16)prep_enable->usb_ep_str.ep_max_pkt_size;
+ usb_ep_str.ep_num = (kal_uint8)prep_enable->usb_ep_str.ep_num;
+ usb_ep_str.ep_real_num = (kal_uint8)prep_enable->usb_ep_str.ep_real_num;
+ usb_ep_str.ep_type = (USB_ENDPT_TXFER_TYPE)prep_enable->usb_ep_str.ep_type;
+ usb_ep_str.direction = (USB_EP_DIRECTION)prep_enable->usb_ep_str.direction;
+
+ interval= (kal_uint8)prep_enable->u1interval;
+ bDMA = (kal_bool)prep_enable->fgbDMA;
+ bDMAQ = (kal_bool)prep_enable->fgbDMAQ;
+ usb_ip_port= (kal_uint8)common_str.usb_ip_port;
+ ep_num = (kal_uint8)usb_ep_str.ep_num;
+ ep_type = (USB_ENDPT_TXFER_TYPE)usb_ep_str.ep_type;
+
+
+ if ((bDMA == KAL_TRUE) & (bDMAQ == KAL_TRUE))
+ ASSERT(0);
+
+
+/* Run in HISR */
+ USB_HCD_EP_Check(usb_ip_port,ep_num, USB_EP_TX_DIR, 0);
+ USB_HCD_EP_DMA_Running_Check(usb_ip_port,ep_num, USB_EP_TX_DIR, 0);
+
+ g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].b_enable = KAL_TRUE;
+ g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].b_dma_enable = bDMA;
+ g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].b_dmaQ_enable = bDMAQ;
+
+
+ savedMask = SaveAndSetIRQMask();
+
+ USB_DRV_SetBits(USB_INTRTXE_HCD(USB_BaseAddr[usb_ip_port]), (USB_INTRE_EPEN<<ep_num));
+
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), ep_num);
+
+ if(USB_HCD_Is_High_Speed(usb_ip_port) == KAL_TRUE)
+ {
+ USB_DRV_WriteReg8(USB_TXINTERVAL_HCD(USB_BaseAddr[usb_ip_port]), interval);
+ }
+ else
+ {
+ USB_DRV_WriteReg8(USB_TXINTERVAL_HCD(USB_BaseAddr[usb_ip_port]), interval-3);
+ }
+
+ if(bDMA == KAL_TRUE)
+ {
+// USB_DRV_ClearBits(USB_INTRTXE, (USB_INTRE_EPEN<<ep_num));
+
+ /* Double buffers, so flush twice */
+ if((USB_DRV_Reg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]))&USB_TXCSR_FIFONOTEMPTY) != 0)
+ g_UsbHcdInfo[usb_ip_port].ep_tx_flush_intr[ep_num-1] = KAL_TRUE;
+
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), 0x00);
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), (USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG));
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), (USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG));
+
+ /* Only is configured as multiple packet DMA TX mode */
+ if(ep_type == USB_ENDPT_ISO)
+ {
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_HCD_DMA_TX_CSR_ISO);
+ }
+ else
+ {
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_HCD_DMA_TX_CSR);
+ }
+ }
+#if (defined(DRV_USB_IP_V4)) //Unit IP
+ else if(bDMAQ == KAL_TRUE)
+ {
+ DRV_WriteReg32(USB_DMAQ_QISAR, 0xFFFFFFFF); //write 1 clear
+ DRV_WriteReg32(USB_DMAQ_TQEIR, USB_DMAQ_QIMCR0 <<(ep_num-1));
+ DRV_WriteReg32(USB_DMAQ_TQEMIMCR, USB_DMAQ_QIMCR0 <<(ep_num-1));
+ DRV_WriteReg32(USB_DMAQ_TQEIR, USB_DMAQ_QIMCR0 <<(ep_num-1));
+ DRV_WriteReg32(USB_DMAQ_TQEIMCR, USB_DMAQ_QIMCR0 <<(ep_num-1));
+ DRV_WriteReg32(USB_DMAQ_TEPEIR, USB_DMAQ_QIMCR0 <<(ep_num-1));
+ DRV_WriteReg32(USB_DMAQ_TEPEIMCR, USB_DMAQ_QIMCR0 <<(ep_num-1));
+ DRV_WriteReg32(USB_DMAQ_QIMCR, USB_DMAQ_QIMCR_TX_DONE(ep_num-1)|USB_DMAQ_QIMCR_TXEP_ERR|USB_DMAQ_QIMCR_TXQ_ERR|USB_DMAQ_QIMCR_TXQ_EMPTY);
+ }
+#endif
+ else // FIFO
+ {
+ /* double buffers, so flush twice */
+ if((USB_DRV_Reg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]))&USB_TXCSR_FIFONOTEMPTY) != 0)
+ g_UsbHcdInfo[usb_ip_port].ep_tx_flush_intr[ep_num-1] = KAL_TRUE;
+
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), 0x00);
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), (USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG));
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), (USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG));
+
+// USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), 0x00);
+// USB_DRV_SetBits(USB_INTRTXE, (USB_INTRE_EPEN<<ep_num));
+ }
+
+ RestoreIRQMask(savedMask);
+
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_RxEPEn(DCL_CTRL_DATA_T *data)
+{
+ kal_uint32 savedMask;
+ USB_HCD_CTRL_EP_ENABLE_T *prep_enable;
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_ep_str;
+ kal_uint8 interval;
+ kal_bool bDMA;
+ kal_bool bDMAQ;
+ kal_uint8 usb_ip_port;
+ kal_uint8 ep_num;
+ USB_ENDPT_TXFER_TYPE ep_type;
+
+ prep_enable = &data->rHCD_EP_Enable;
+
+ common_str.if_num = (kal_uint32)prep_enable->common_str.if_num;
+ common_str.usb_ip_port = (kal_uint8)prep_enable->common_str.usb_ip_port;
+
+ usb_ep_str.ep_max_pkt_size = (kal_uint16)prep_enable->usb_ep_str.ep_max_pkt_size;
+ usb_ep_str.ep_num = (kal_uint8)prep_enable->usb_ep_str.ep_num;
+ usb_ep_str.ep_real_num = (kal_uint8)prep_enable->usb_ep_str.ep_real_num;
+ usb_ep_str.ep_type = (USB_ENDPT_TXFER_TYPE)prep_enable->usb_ep_str.ep_type;
+ usb_ep_str.direction = (USB_EP_DIRECTION)prep_enable->usb_ep_str.direction;
+
+ interval = (kal_uint8)prep_enable->u1interval;
+ bDMA = (kal_bool)prep_enable->fgbDMA;
+ bDMAQ = (kal_bool)prep_enable->fgbDMAQ;
+ usb_ip_port = (kal_uint8)common_str.usb_ip_port;
+ ep_num = (kal_uint8)usb_ep_str.ep_num;
+ ep_type = (USB_ENDPT_TXFER_TYPE)usb_ep_str.ep_type;
+
+
+ if ((bDMA == KAL_TRUE) & (bDMAQ == KAL_TRUE))
+ ASSERT(0);
+
+
+/* Run in HISR */
+
+ USB_HCD_EP_Check(usb_ip_port,ep_num, USB_EP_RX_DIR, 0);
+ USB_HCD_EP_DMA_Running_Check(usb_ip_port,ep_num, USB_EP_RX_DIR, 0);
+
+ g_UsbHcdInfo[usb_ip_port].ep_rx_info[ep_num-1].b_enable = KAL_TRUE;
+ g_UsbHcdInfo[usb_ip_port].ep_rx_info[ep_num-1].b_dma_enable = bDMA;
+ g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].b_dmaQ_enable = bDMAQ;
+
+ savedMask = SaveAndSetIRQMask();
+
+ USB_DRV_SetBits(USB_INTRRXE_HCD(USB_BaseAddr[usb_ip_port]), (USB_INTRE_EPEN<<ep_num));
+
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), ep_num);
+
+ if(USB_HCD_Is_High_Speed(usb_ip_port) == KAL_TRUE)
+ {
+ USB_DRV_WriteReg8(USB_RXINTERVAL_HCD(USB_BaseAddr[usb_ip_port]), interval);
+ }
+ else
+ {
+ USB_DRV_WriteReg8(USB_RXINTERVAL_HCD(USB_BaseAddr[usb_ip_port]), interval-3);
+ }
+
+ if(bDMA == KAL_TRUE)
+ {
+// USB_DRV_ClearBits(USB_INTRRXE_HCD(USB_BaseAddr[usb_ip_port]), (USB_INTRE_EPEN<<ep_num));
+
+ /* maybe double buffer, so flush twice */
+ if((USB_DRV_Reg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]))&USB_RXCSR_RXPKTRDY) != 0)
+ g_UsbHcdInfo[usb_ip_port].ep_rx_flush_intr[ep_num-1] = KAL_TRUE;
+
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), 0x00);
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), (USB_RXCSR_FLUSHFIFO|USB_RXCSR_CLRDATATOG));
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), (USB_RXCSR_FLUSHFIFO|USB_RXCSR_CLRDATATOG));
+
+ if(ep_type == USB_ENDPT_ISO)
+ {
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_HCD_DMA_RX_CSR_ISO);
+ }
+ else
+ {
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_HCD_DMA_RX_CSR);
+ }
+
+ if((g_UsbHcdInfo[usb_ip_port].dma_gpt_handle[ep_num-1] == 0)||(g_UsbHcdInfo[usb_ip_port].dma_gpt_handle[ep_num-1] == 0x7F))
+ g_UsbHcdInfo[usb_ip_port].dma_gpt_handle[ep_num-1] = DclSGPT_Open(DCL_GPT_CB, 0);
+// GPTI_GetHandle(&g_UsbHcdInfo[usb_ip_port].dma_gpt_handle[ep_num-1]);
+ }
+#if (defined(DRV_USB_IP_V4)) //Unit IP
+ else if(bDMAQ == KAL_TRUE)
+ {
+ DRV_WriteReg32(USB_DMAQ_QISAR, 0xFFFFFFFF); //write 1 clear
+ DRV_WriteReg32(USB_DMAQ_RQEIR, USB_DMAQ_QIMCR0 <<(ep_num-1));
+ DRV_WriteReg32(USB_DMAQ_RQEMIMCR, USB_DMAQ_QIMCR0 <<(ep_num-1));
+ DRV_WriteReg32(USB_DMAQ_RQEIR, USB_DMAQ_QIMCR0 <<(ep_num-1));
+ DRV_WriteReg32(USB_DMAQ_RQEIMCR, USB_DMAQ_QIMCR0<<(ep_num-1));
+ DRV_WriteReg32(USB_DMAQ_REPEIR, USB_DMAQ_QIMCR0 <<(ep_num-1));
+ DRV_WriteReg32(USB_DMAQ_REPEIMCR, USB_DMAQ_QIMCR0 <<(ep_num-1));
+ DRV_WriteReg32(USB_DMAQ_QIMCR, USB_DMAQ_QIMCR_RX_DONE(ep_num-1)|USB_DMAQ_QIMCR_RXEP_ERR|USB_DMAQ_QIMCR_RXQ_ERR|USB_DMAQ_QIMCR_RXQ_EMPTY);
+ }
+#endif
+ else // FIFO
+ {
+ /* Maybe double buffer, so flush twice */
+ if((USB_DRV_Reg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]))&USB_RXCSR_RXPKTRDY) != 0)
+ g_UsbHcdInfo[usb_ip_port].ep_rx_flush_intr[ep_num-1] = KAL_TRUE;
+
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), 0x00);
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), (USB_RXCSR_FLUSHFIFO|USB_RXCSR_CLRDATATOG));
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), (USB_RXCSR_FLUSHFIFO|USB_RXCSR_CLRDATATOG));
+
+// USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), 0x00);
+// USB_DRV_SetBits(USB_INTRRXE_HCD(USB_BaseAddr[usb_ip_port]), (USB_INTRE_EPEN<<ep_num));
+ }
+
+ RestoreIRQMask(savedMask);
+
+ return STATUS_OK;
+
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_TxEPDis(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_EP_DISABLE_T *prep_disable;
+ kal_uint32 savedMask;
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_ep_str;
+ kal_bool bDMA;
+
+ prep_disable = &data->rHCD_EP_Disable;
+
+ common_str.if_num = (kal_uint32)prep_disable->common_str.if_num;
+ common_str.usb_ip_port = (kal_uint8)prep_disable->common_str.usb_ip_port;
+
+ usb_ep_str.ep_max_pkt_size = (kal_uint16)prep_disable->usb_ep_str.ep_max_pkt_size;
+ usb_ep_str.ep_num = (kal_uint8)prep_disable->usb_ep_str.ep_num;
+ usb_ep_str.ep_real_num = (kal_uint8)prep_disable->usb_ep_str.ep_real_num;
+ usb_ep_str.ep_type = (USB_ENDPT_TXFER_TYPE)prep_disable->usb_ep_str.ep_type;
+ usb_ep_str.direction = (USB_EP_DIRECTION)prep_disable->usb_ep_str.direction;
+
+ bDMA = (kal_bool)prep_disable->fgbDMA;
+
+
+/* Run in HISR */
+ USB_HCD_EP_Check(common_str.usb_ip_port,usb_ep_str.ep_num, USB_EP_TX_DIR, 0);
+ USB_HCD_EP_DMA_Running_Check(common_str.usb_ip_port,usb_ep_str.ep_num, USB_EP_TX_DIR, 0);
+
+ g_UsbHcdInfo[common_str.usb_ip_port].ep_tx_info[usb_ep_str.ep_num -1].b_enable = KAL_FALSE;
+
+ if(bDMA == KAL_TRUE)
+ {
+ USB_HCD_Stop_DMA_Channel(common_str.usb_ip_port,usb_ep_str.ep_num, usb_ep_str.direction);
+ }
+ savedMask = SaveAndSetIRQMask();
+
+ USB_DRV_ClearBits(USB_INTRTXE_HCD(USB_BaseAddr[common_str.usb_ip_port]), (USB_INTRE_EPEN << usb_ep_str.ep_num));
+
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[common_str.usb_ip_port]), usb_ep_str.ep_num);
+
+ if((USB_DRV_Reg(USB_TXCSR_HCD(USB_BaseAddr[common_str.usb_ip_port]))&USB_TXCSR_FIFONOTEMPTY) != 0)
+ g_UsbHcdInfo[common_str.usb_ip_port].ep_tx_flush_intr[usb_ep_str.ep_num-1] = KAL_TRUE;
+
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[common_str.usb_ip_port]), 0x00);
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[common_str.usb_ip_port]), (USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG));
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[common_str.usb_ip_port]), (USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG));
+ RestoreIRQMask(savedMask);
+
+
+
+ return STATUS_OK;
+
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_RxEPDis(DCL_CTRL_DATA_T *data)
+{
+ DCL_HANDLE handle;
+ USB_HCD_CTRL_EP_DISABLE_T *prep_disable;
+ kal_uint32 savedMask;
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_ep_str;
+ kal_bool bDMA;
+
+ prep_disable = &data->rHCD_EP_Disable;
+
+ common_str.if_num = (kal_uint32)prep_disable->common_str.if_num;
+ common_str.usb_ip_port = (kal_uint8)prep_disable->common_str.usb_ip_port;
+
+ usb_ep_str.ep_max_pkt_size = (kal_uint16)prep_disable->usb_ep_str.ep_max_pkt_size;
+ usb_ep_str.ep_num = (kal_uint8)prep_disable->usb_ep_str.ep_num;
+ usb_ep_str.ep_real_num = (kal_uint8)prep_disable->usb_ep_str.ep_real_num;
+ usb_ep_str.ep_type = (USB_ENDPT_TXFER_TYPE)prep_disable->usb_ep_str.ep_type;
+ usb_ep_str.direction = (USB_EP_DIRECTION)prep_disable->usb_ep_str.direction;
+
+ bDMA = (kal_bool)prep_disable->fgbDMA;
+
+
+/* Run in HISR */
+
+ USB_HCD_EP_Check(common_str.usb_ip_port,usb_ep_str.ep_num, USB_EP_RX_DIR, 0);
+ USB_HCD_EP_DMA_Running_Check(common_str.usb_ip_port,usb_ep_str.ep_num, USB_EP_RX_DIR, 0);
+
+ g_UsbHcdInfo[common_str.usb_ip_port].ep_rx_info[usb_ep_str.ep_num-1].b_enable = KAL_FALSE;
+
+ if(bDMA == KAL_TRUE)
+ {
+ USB_HCD_Stop_DMA_Channel(common_str.usb_ip_port,usb_ep_str.ep_num, usb_ep_str.direction);
+
+ handle = (DCL_HANDLE)g_UsbHcdInfo[common_str.usb_ip_port].dma_gpt_handle[usb_ep_str.ep_num-1];
+ g_UsbHcdInfo[common_str.usb_ip_port].dma_gpt_handle[usb_ep_str.ep_num-1] = DclSGPT_Close(&handle);
+
+// GPTI_ReleaseHandle(&g_UsbHcdInfo[common_str.usb_ip_port].dma_gpt_handle[usb_ep_str.ep_num-1]);
+ }
+
+ savedMask = SaveAndSetIRQMask();
+
+ USB_DRV_ClearBits(USB_INTRRXE_HCD(USB_BaseAddr[common_str.usb_ip_port]), (USB_INTRE_EPEN << usb_ep_str.ep_num));
+
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[common_str.usb_ip_port]), usb_ep_str.ep_num);
+
+ if((USB_DRV_Reg(USB_RXCSR_HCD(USB_BaseAddr[common_str.usb_ip_port]))&USB_RXCSR_RXPKTRDY) != 0)
+ g_UsbHcdInfo[common_str.usb_ip_port].ep_rx_flush_intr[usb_ep_str.ep_num-1] = KAL_TRUE;
+
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[common_str.usb_ip_port]), 0x00);
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[common_str.usb_ip_port]), (USB_RXCSR_FLUSHFIFO|USB_RXCSR_CLRDATATOG));
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[common_str.usb_ip_port]), (USB_RXCSR_FLUSHFIFO|USB_RXCSR_CLRDATATOG));
+ RestoreIRQMask(savedMask);
+
+
+ return STATUS_OK;
+}
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Send_Resume(DCL_CTRL_DATA_T *data)
+{
+ SGPT_CTRL_START_T start;
+ USB_HCD_CTRL_IP_NUM_T *usb_ip;
+ kal_uint8 usb_ip_port;
+ kal_uint32 savedMask;
+
+ usb_ip = &data->rHCD_ip;
+ usb_ip_port = (kal_uint8)usb_ip->ip;
+
+#if defined(__IC_USB_ENABLE__)
+ kal_uint8 icusb_remote_eint = 0x30;//custom_eint_get_channel(icusb_remote_eint_chann); QQ Test
+#endif
+
+ if (g_UsbHcdInfo[usb_ip_port].host_state != USBH_STATE_SUSPEND)
+ return STATUS_OK; // just receive remote wakeup from Device
+
+
+ savedMask = SaveAndSetIRQMask();
+
+ g_UsbHcdInfo[usb_ip_port].host_state = USBH_STATE_HOST;
+
+#if defined(__IC_USB_ENABLE__)
+ if (usb_ip_port >= USB_EXT_IP_NUM) // ICUSB : Send Resume --> Disable Remote Wakeup detection interrupt
+ {
+ EINT_Mask(icusb_remote_eint);
+ // clear EINT interrupt
+ }
+#endif
+
+ USB_DRV_SetBits8(USB_POWER_HCD(USB_BaseAddr[usb_ip_port]), USB_POWER_RESUME); //send K
+
+ RestoreIRQMask(savedMask);
+
+ start.u2Tick = USB_HCD_RESUME_DELAY;
+ start.pfCallback = USB_HCD_Resume_Recovery_Timeout;
+ start.vPara = &g_UsbHcdInfo[usb_ip_port];
+ DclSGPT_Control((DCL_HANDLE)(g_UsbHcdInfo[usb_ip_port].gpt_handle), SGPT_CMD_START, (DCL_CTRL_DATA_T*)&start);
+
+// GPTI_StartItem(g_UsbHcdInfo[usb_ip_port].gpt_handle, USB_HCD_RESUME_DELAY,USB_HCD_Resume_Recovery_Timeout, &g_UsbHcdInfo[usb_ip_port]);
+
+ return STATUS_OK;
+
+
+}
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Send_Suspend(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_IP_NUM_T *usb_ip;
+ kal_uint8 usb_ip_port;
+ usb_ip = &data->rHCD_ip;
+ usb_ip_port = (kal_uint8)usb_ip->ip;
+
+
+// This API is called by Task level : Host want to suspend device
+
+#if defined(__IC_USB_ENABLE__)
+ kal_uint8 icusb_remote_eint = 0x30;//custom_eint_get_channel(icusb_remote_eint_chann); QQ Test
+#endif
+
+ if (usb_ip_port >= USB_IP_NUM)
+ ASSERT(0);
+
+
+ USB_DRV_SetBits8(USB_POWER_HCD(USB_BaseAddr[usb_ip_port]), USB_POWER_SUSPENDMODE);
+
+#if defined(__IC_USB_ENABLE__)
+ if (usb_ip_port >= USB_EXT_IP_NUM) // ICUSB Remoate Wakeup detection
+ {
+ EINT_Registration(icusb_remote_eint, KAL_FALSE, KAL_TRUE, USB_HCD_Remote_Wakeup, KAL_FALSE);
+ EINT_UnMask(icusb_remote_eint);
+ }
+
+// IRQ_Register_LISR(IRQ_EIT_CODE, IC_USB_Remote_Wakeup, "ICUSB_EINT"); // register ISR for the EINT
+// IRQSensitivity(IRQ_EIT_CODE,LEVEL_SENSITIVE); // setup EINT's polarity
+// SAL_EINT_Set_Sens(1, LEVEL_SENSITIVE); // EINT 1
+// SAL_EINT_EnableDomain(0, 1, 1);
+// SAL_EINT_Control(1, 0,10);
+#endif
+
+ g_UsbHcdInfo[usb_ip_port].host_state = USBH_STATE_SUSPEND;
+
+ return STATUS_OK;
+
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Send_Req(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_EP_DATA_TXFER_T *prep_data_txfer;
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_ep_str;
+
+ prep_data_txfer = &data->rHCD_EP_Data_Txfer;
+
+ common_str.if_num = (kal_uint32)prep_data_txfer->common_str.if_num;
+ common_str.usb_ip_port = (kal_uint8)prep_data_txfer->common_str.usb_ip_port;
+
+ usb_ep_str.ep_max_pkt_size = (kal_uint16)prep_data_txfer->usb_ep_str.ep_max_pkt_size;
+ usb_ep_str.ep_num = (kal_uint8)prep_data_txfer->usb_ep_str.ep_num;
+ usb_ep_str.ep_real_num = (kal_uint8)prep_data_txfer->usb_ep_str.ep_real_num;
+ usb_ep_str.ep_type = (USB_ENDPT_TXFER_TYPE)prep_data_txfer->usb_ep_str.ep_type;
+ usb_ep_str.direction = (USB_EP_DIRECTION)prep_data_txfer->usb_ep_str.direction;
+
+/* May run in app task */
+ USB_HCD_EP_Check(common_str.usb_ip_port,usb_ep_str.ep_num, USB_EP_TX_DIR, 0);
+
+ if(g_UsbHcdInfo[common_str.usb_ip_port].ep_tx_info[usb_ep_str.ep_num-1].b_enable == KAL_FALSE)
+ prep_data_txfer->return_value = KAL_FALSE;
+ else
+ prep_data_txfer->return_value = KAL_TRUE;
+
+ g_UsbHcdInfo[common_str.usb_ip_port].ep_tx_info[usb_ep_str.ep_num-1].p_data = prep_data_txfer->pData;
+ g_UsbHcdInfo[common_str.usb_ip_port].ep_tx_info[usb_ep_str.ep_num-1].data_length = prep_data_txfer->u2nBytes;
+ g_UsbHcdInfo[common_str.usb_ip_port].ep_tx_info[usb_ep_str.ep_num-1].sofar = 0;
+
+
+ USB_HCD_Send_Data(common_str,usb_ep_str);
+
+ return STATUS_OK;
+
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Recv_Req(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_EP_DATA_TXFER_T *prep_data_txfer;
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_ep_str;
+
+ prep_data_txfer = &data->rHCD_EP_Data_Txfer;
+
+ common_str.if_num = (kal_uint32)prep_data_txfer->common_str.if_num;
+ common_str.usb_ip_port = (kal_uint8)prep_data_txfer->common_str.usb_ip_port;
+
+ usb_ep_str.ep_max_pkt_size = (kal_uint16)prep_data_txfer->usb_ep_str.ep_max_pkt_size;
+ usb_ep_str.ep_num = (kal_uint8)prep_data_txfer->usb_ep_str.ep_num;
+ usb_ep_str.ep_real_num = (kal_uint8)prep_data_txfer->usb_ep_str.ep_real_num;
+ usb_ep_str.ep_type = (USB_ENDPT_TXFER_TYPE)prep_data_txfer->usb_ep_str.ep_type;
+ usb_ep_str.direction = (USB_EP_DIRECTION)prep_data_txfer->usb_ep_str.direction;
+
+/* Run in HISR */
+ USB_HCD_EP_Check(common_str.usb_ip_port,usb_ep_str.ep_num, USB_EP_RX_DIR, 0);
+
+ if(g_UsbHcdInfo[common_str.usb_ip_port].ep_rx_info[usb_ep_str.ep_num-1].b_enable == KAL_FALSE)
+ prep_data_txfer->return_value = KAL_FALSE;
+ else
+ prep_data_txfer->return_value = KAL_TRUE;
+
+ g_UsbHcdInfo[common_str.usb_ip_port].ep_rx_info[usb_ep_str.ep_num-1].p_data = prep_data_txfer->pData;
+ g_UsbHcdInfo[common_str.usb_ip_port].ep_rx_info[usb_ep_str.ep_num-1].data_length = prep_data_txfer->u2nBytes;
+ g_UsbHcdInfo[common_str.usb_ip_port].ep_rx_info[usb_ep_str.ep_num-1].sofar = 0;
+
+
+ USB_HCD_Recv_Data(common_str,usb_ep_str);
+
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_EP0_Setup_Req(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_EP0_SETUP_REQ_T *prep0_setup_req;
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_ep_str;
+
+ prep0_setup_req = &data->rHCD_EP0_Setup_Req;
+
+ common_str.if_num = (kal_uint32)prep0_setup_req->common_str.if_num;
+ common_str.usb_ip_port = (kal_uint8)prep0_setup_req->common_str.usb_ip_port;
+
+ usb_ep_str.ep_max_pkt_size = (kal_uint16)prep0_setup_req->usb_ep_str.ep_max_pkt_size;
+ usb_ep_str.ep_num = (kal_uint8)prep0_setup_req->usb_ep_str.ep_num;
+ usb_ep_str.ep_real_num = (kal_uint8)prep0_setup_req->usb_ep_str.ep_real_num;
+ usb_ep_str.ep_type = (USB_ENDPT_TXFER_TYPE)prep0_setup_req->usb_ep_str.ep_type;
+ usb_ep_str.direction = (USB_EP_DIRECTION)prep0_setup_req->usb_ep_str.direction;
+
+/* May run in task */
+ g_UsbHcdInfo[common_str.usb_ip_port].ep0_setup = KAL_TRUE;
+ g_UsbHcdInfo[common_str.usb_ip_port].ep0_info.p_data = prep0_setup_req->pSrc;
+ g_UsbHcdInfo[common_str.usb_ip_port].ep0_info.data_length = prep0_setup_req->u2nBytes;
+ g_UsbHcdInfo[common_str.usb_ip_port].ep0_info.sofar = 0;
+
+
+ USB_HCD_Send_Setup(common_str,usb_ep_str);
+
+ USB_Dbg_Trace(USB_HCD_EP0_Setup, 0, (kal_uint32)g_UsbHcdInfo[common_str.usb_ip_port].ep0_info.data_length);
+
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_EP0_Data_Req(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_EP0_DATA_REQ_T *prep0_data_req;
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_ep_str;
+
+ prep0_data_req = &data->rHCD_EP0_Data_Req;
+
+ common_str.if_num = (kal_uint32)prep0_data_req->common_str.if_num;
+ common_str.usb_ip_port = (kal_uint8)prep0_data_req->common_str.usb_ip_port;
+
+ usb_ep_str.ep_max_pkt_size = (kal_uint16)prep0_data_req->usb_ep_str.ep_max_pkt_size;
+ usb_ep_str.ep_num = (kal_uint8)prep0_data_req->usb_ep_str.ep_num;
+ usb_ep_str.ep_real_num = (kal_uint8)prep0_data_req->usb_ep_str.ep_real_num;
+ usb_ep_str.ep_type = (USB_ENDPT_TXFER_TYPE)prep0_data_req->usb_ep_str.ep_type;
+ usb_ep_str.direction = (USB_EP_DIRECTION)prep0_data_req->usb_ep_str.direction;
+
+
+/* Run in HISR */
+ g_UsbHcdInfo[common_str.usb_ip_port].ep0_info.direction = usb_ep_str.direction;
+ g_UsbHcdInfo[common_str.usb_ip_port].ep0_info.p_data = prep0_data_req->pData;
+ g_UsbHcdInfo[common_str.usb_ip_port].ep0_info.data_length = prep0_data_req->u2nBytes;
+ g_UsbHcdInfo[common_str.usb_ip_port].ep0_info.sofar = 0;
+
+ USB_Dbg_Trace(USB_HCD_EP0_Data, 0, (kal_uint32)g_UsbHcdInfo[common_str.usb_ip_port].ep0_info.data_length);
+
+
+
+ if(usb_ep_str.direction == USB_EP_TX_DIR)
+ USB_HCD_Send_Data(common_str,usb_ep_str);
+ else
+ USB_HCD_Recv_Data(common_str,usb_ep_str);
+
+ return STATUS_OK;
+
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_EP0_Status_Req(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_EP0_STATUS_REQ_T *prep0_status_req;
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_ep_str;
+ kal_uint32 savedMask;
+
+ prep0_status_req = &data->rHCD_EP0_Status_Req;
+
+ common_str.if_num = (kal_uint32)prep0_status_req->common_str.if_num;
+ common_str.usb_ip_port = (kal_uint8)prep0_status_req->common_str.usb_ip_port;
+
+ usb_ep_str.ep_max_pkt_size = (kal_uint16)prep0_status_req->usb_ep_str.ep_max_pkt_size;
+ usb_ep_str.ep_num = (kal_uint8)prep0_status_req->usb_ep_str.ep_num;
+ usb_ep_str.ep_real_num = (kal_uint8)prep0_status_req->usb_ep_str.ep_real_num;
+ usb_ep_str.ep_type = (USB_ENDPT_TXFER_TYPE)prep0_status_req->usb_ep_str.ep_type;
+ usb_ep_str.direction = (USB_EP_DIRECTION)prep0_status_req->usb_ep_str.direction;
+
+/* Run in HISR */
+ g_UsbHcdInfo[common_str.usb_ip_port].ep0_status = KAL_TRUE;
+ g_UsbHcdInfo[common_str.usb_ip_port].ep0_fifo_intr = KAL_TRUE;
+
+ USB_Dbg_Trace(USB_HCD_EP0_Status, 0, (kal_uint32)usb_ep_str.direction);
+ USB_Dbg_Trace(USB_HCD_EP0_CSR0, 3, USB_DRV_Reg8(USB_EPn_TXCSR_HCD(USB_BaseAddr[common_str.usb_ip_port], 0)));
+
+
+ if (USB_DRV_Reg8(USB_EPn_TXCSR_HCD(USB_BaseAddr[common_str.usb_ip_port], 0)) & USB_CSR0_STATUSPKT)
+ ASSERT(0);
+
+ savedMask = SaveAndSetIRQMask();
+
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[common_str.usb_ip_port]), 0);
+
+ if(usb_ep_str.direction == USB_EP_TX_DIR)
+ {
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[common_str.usb_ip_port]), (USB_CSR0_TXPKTRDY|USB_CSR0_STATUSPKT));
+ }
+ else
+ {
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[common_str.usb_ip_port]), (USB_CSR0_REQPKT|USB_CSR0_STATUSPKT));
+ }
+ RestoreIRQMask(savedMask);
+
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Switch_DMA_Burst_mode(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_SYSTEM_T *system_drv;
+ kal_uint8 usb_ip_port;
+ kal_bool b_enable;
+
+ system_drv = &data->rHCD_System_Set;
+ usb_ip_port = (kal_uint8)system_drv->ip;
+ b_enable = (kal_bool)system_drv->set;
+
+ if(b_enable == KAL_TRUE)
+ g_UsbHcdInfo[usb_ip_port].b_enable_dma_burst_auto_chge = KAL_TRUE;
+ else
+ g_UsbHcdInfo[usb_ip_port].b_enable_dma_burst_auto_chge = KAL_FALSE;
+
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Register_DMA_Channel(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_DMA_CTRL_FUNC_1_T *prdma_ctrl_func_1;
+ kal_uint8 usb_ip_port;
+ kal_uint8 ep_num;
+ USB_EP_DIRECTION direction;
+ kal_uint8 chan_num;
+ kal_bool same_chan;
+
+ prdma_ctrl_func_1 = &data->rHCD_DMA_Ctrl_Func_1;
+ usb_ip_port = (kal_uint8)prdma_ctrl_func_1->ip;
+ ep_num = (kal_uint8)prdma_ctrl_func_1->u1ep_num;
+ direction = (USB_EP_DIRECTION)prdma_ctrl_func_1->direction;
+ chan_num = (kal_uint8)prdma_ctrl_func_1->u1chan_num;
+ same_chan = (kal_bool)prdma_ctrl_func_1->fgsame_chan;
+
+/* Register DMA channel number for logical endpoint */
+ if (usb_ip_port < USB_EXT_IP_NUM)
+ {
+ if(g_UsbHcdInfo[usb_ip_port].dma_channel > MAX_DMA_NUM)
+ EXT_ASSERT(0, g_UsbHcdInfo[usb_ip_port].dma_channel, MAX_DMA_NUM, 0);
+ }
+#if defined(__IC_USB_ENABLE__)
+ else
+ {
+ if(g_UsbHcdInfo[usb_ip_port].dma_channel > ICUSB_MAX_DMA_NUM)
+ EXT_ASSERT(0, g_UsbHcdInfo[usb_ip_port].dma_channel, ICUSB_MAX_DMA_NUM, 0);
+ }
+#endif
+
+ if(same_chan == KAL_TRUE)
+ {
+ USB_HCD_EP_Check(usb_ip_port,ep_num, USB_EP_TX_DIR, 0);
+ USB_HCD_EP_Check(usb_ip_port,ep_num, USB_EP_RX_DIR, 0);
+
+ g_UsbHcdInfo[usb_ip_port].is_bidirection_dma[chan_num-1] = KAL_TRUE;
+ /* the same channel */
+ g_UsbHcdInfo[usb_ip_port].dma_port[USB_EP_TX_DIR][ep_num-1] = chan_num;
+ g_UsbHcdInfo[usb_ip_port].dma_port[USB_EP_RX_DIR][ep_num-1] = chan_num;
+ g_UsbHcdInfo[usb_ip_port].dma_tx_ep_num[chan_num-1] = ep_num;
+ g_UsbHcdInfo[usb_ip_port].dma_rx_ep_num[chan_num-1] = ep_num;
+ }
+ else
+ {
+ USB_HCD_EP_Check(usb_ip_port,ep_num, direction, 0);
+
+ g_UsbHcdInfo[usb_ip_port].is_bidirection_dma[chan_num-1] = KAL_FALSE;
+ g_UsbHcdInfo[usb_ip_port].dma_dir[chan_num-1] = direction;
+ g_UsbHcdInfo[usb_ip_port].dma_port[direction][ep_num-1] = chan_num;
+
+ if(direction == USB_EP_TX_DIR)
+ {
+ g_UsbHcdInfo[usb_ip_port].dma_tx_ep_num[chan_num-1] = ep_num;
+ }
+ else
+ {
+ g_UsbHcdInfo[usb_ip_port].dma_rx_ep_num[chan_num-1] = ep_num;
+ }
+ }
+
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Get_DMA_Real_Count(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_DMA_CTRL_FUNC_2_T *prdma_ctrl_func_2;
+ kal_uint8 usb_ip_port;
+ kal_uint8 ep_num;
+ USB_EP_DIRECTION direction;
+
+ prdma_ctrl_func_2 = &data->rHCD_DMA_Ctrl_Func_2;
+ usb_ip_port = (kal_uint8)prdma_ctrl_func_2->ip;
+ ep_num = (kal_uint8)prdma_ctrl_func_2->u1ep_num;
+ direction = (USB_EP_DIRECTION)prdma_ctrl_func_2->direction;
+
+
+
+ USB_HCD_EP_Check(usb_ip_port,ep_num, direction, 0);
+ prdma_ctrl_func_2->return_value = USB_DRV_Reg32(USB_DMA_REALCNT_HCD(USB_BaseAddr[usb_ip_port],g_UsbHcdInfo[usb_ip_port].dma_port[direction][ep_num-1]));
+
+ return STATUS_OK;
+
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Get_DMA_Channel(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_DMA_CHANNEL_FUNC_T *prdma_func;
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_tx_str;
+ USBH_EP_Struct usb_rx_str;
+ USB_EP_DIRECTION direction;
+ kal_bool same_chan;
+ kal_uint8 usb_ip_port;
+ kal_uint8 ep_tx_num;
+ kal_uint8 ep_rx_num;
+
+ prdma_func = &data->rHCD_DMA_Channel_Func;
+
+ common_str.if_num = (kal_uint32)prdma_func->common_str.if_num;
+ common_str.usb_ip_port = (kal_uint8)prdma_func->common_str.usb_ip_port;
+
+ usb_tx_str.ep_max_pkt_size = (kal_uint16)prdma_func->usb_tx_str.ep_max_pkt_size;
+ usb_tx_str.ep_num = (kal_uint8)prdma_func->usb_tx_str.ep_num;
+ usb_tx_str.ep_real_num = (kal_uint8)prdma_func->usb_tx_str.ep_real_num;
+ usb_tx_str.ep_type = (USB_ENDPT_TXFER_TYPE)prdma_func->usb_tx_str.ep_type;
+ usb_tx_str.direction = (USB_EP_DIRECTION)prdma_func->usb_tx_str.direction;
+
+ usb_rx_str.ep_max_pkt_size = (kal_uint16)prdma_func->usb_rx_str.ep_max_pkt_size;
+ usb_rx_str.ep_num = (kal_uint8)prdma_func->usb_rx_str.ep_num;
+ usb_rx_str.ep_real_num = (kal_uint8)prdma_func->usb_rx_str.ep_real_num;
+ usb_rx_str.ep_type = (USB_ENDPT_TXFER_TYPE)prdma_func->usb_rx_str.ep_type;
+ usb_rx_str.direction = (USB_EP_DIRECTION)prdma_func->usb_rx_str.direction;
+
+
+ direction = (USB_EP_DIRECTION)prdma_func->direction;
+ same_chan = (kal_bool)prdma_func->same_chan;
+ usb_ip_port = (kal_uint8)common_str.usb_ip_port;
+ ep_tx_num = (kal_uint8)usb_tx_str.ep_num;
+ ep_rx_num = (kal_uint8)usb_rx_str.ep_num;
+
+ g_UsbHcdInfo[usb_ip_port].dma_channel++;
+
+ if (usb_ip_port < USB_EXT_IP_NUM)
+ {
+ if(g_UsbHcdInfo[usb_ip_port].dma_channel > MAX_DMA_NUM)
+ EXT_ASSERT(0, g_UsbHcdInfo[usb_ip_port].dma_channel, MAX_DMA_NUM, 0);
+ }
+#if defined(__IC_USB_ENABLE__)
+ else
+ {
+ if(g_UsbHcdInfo[usb_ip_port].dma_channel > ICUSB_MAX_DMA_NUM)
+ EXT_ASSERT(0, g_UsbHcdInfo[usb_ip_port].dma_channel, ICUSB_MAX_DMA_NUM, 0);
+ }
+#endif
+
+ if(same_chan == KAL_TRUE)
+ {
+ USB_HCD_EP_Check(usb_ip_port,ep_tx_num, USB_EP_TX_DIR, 0);
+ USB_HCD_EP_Check(usb_ip_port,ep_rx_num, USB_EP_RX_DIR, 0);
+
+ g_UsbHcdInfo[usb_ip_port].is_bidirection_dma[g_UsbHcdInfo[usb_ip_port].dma_channel-1] = KAL_TRUE;
+ /* the same channel */
+ g_UsbHcdInfo[usb_ip_port].dma_port[USB_EP_TX_DIR][ep_tx_num-1] = g_UsbHcdInfo[usb_ip_port].dma_channel;
+ g_UsbHcdInfo[usb_ip_port].dma_port[USB_EP_RX_DIR][ep_rx_num-1] = g_UsbHcdInfo[usb_ip_port].dma_channel;
+ g_UsbHcdInfo[usb_ip_port].dma_tx_ep_num[g_UsbHcdInfo[usb_ip_port].dma_channel-1] = ep_tx_num;
+ g_UsbHcdInfo[usb_ip_port].dma_rx_ep_num[g_UsbHcdInfo[usb_ip_port].dma_channel-1] = ep_rx_num;
+ }
+ else
+ {
+ g_UsbHcdInfo[usb_ip_port].is_bidirection_dma[g_UsbHcdInfo[usb_ip_port].dma_channel-1] = KAL_FALSE;
+ g_UsbHcdInfo[usb_ip_port].dma_dir[g_UsbHcdInfo[usb_ip_port].dma_channel-1] = direction;
+
+ if(direction == USB_EP_TX_DIR)
+ {
+ USB_HCD_EP_Check(usb_ip_port,ep_tx_num, USB_EP_TX_DIR, 0);
+ g_UsbHcdInfo[usb_ip_port].dma_port[direction][ep_tx_num-1] = g_UsbHcdInfo[usb_ip_port].dma_channel;
+ g_UsbHcdInfo[usb_ip_port].dma_tx_ep_num[g_UsbHcdInfo[usb_ip_port].dma_channel-1] = ep_tx_num;
+ }
+ else
+ {
+ USB_HCD_EP_Check(usb_ip_port,ep_rx_num, USB_EP_RX_DIR, 0);
+ g_UsbHcdInfo[usb_ip_port].dma_port[direction][ep_rx_num-1] = g_UsbHcdInfo[usb_ip_port].dma_channel;
+ g_UsbHcdInfo[usb_ip_port].dma_rx_ep_num[g_UsbHcdInfo[usb_ip_port].dma_channel-1] = ep_rx_num;
+ }
+ }
+
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Stop_DMA_Channel(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_EP_CTRL_FUNC_1_T *prep_ctrl_func_1;
+// kal_uint8 dma_chan;
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_ep_str;
+
+ prep_ctrl_func_1 = &data->rHCD_EP_Ctrl_Func_1;
+
+ common_str.if_num = (kal_uint32)prep_ctrl_func_1->common_str.if_num;
+ common_str.usb_ip_port = (kal_uint8)prep_ctrl_func_1->common_str.usb_ip_port;
+
+ usb_ep_str.ep_max_pkt_size = (kal_uint16)prep_ctrl_func_1->usb_ep_str.ep_max_pkt_size;
+ usb_ep_str.ep_num = (kal_uint8)prep_ctrl_func_1->usb_ep_str.ep_num;
+ usb_ep_str.ep_real_num = (kal_uint8)prep_ctrl_func_1->usb_ep_str.ep_real_num;
+ usb_ep_str.ep_type = (USB_ENDPT_TXFER_TYPE)prep_ctrl_func_1->usb_ep_str.ep_type;
+ usb_ep_str.direction = (USB_EP_DIRECTION)prep_ctrl_func_1->usb_ep_str.direction;
+
+ USB_HCD_Stop_DMA_Channel(common_str.usb_ip_port,usb_ep_str.ep_num, usb_ep_str.direction);
+
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Free_DMA_Channel(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_DMA_CHANNEL_FUNC_T *prdma_func;
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_tx_str;
+ USBH_EP_Struct usb_rx_str;
+ USB_EP_DIRECTION direction;
+ kal_bool same_chan;
+ kal_uint8 dma_chan;
+ kal_uint8 usb_ip_port;
+ kal_uint8 ep_tx_num;
+ kal_uint8 ep_rx_num;
+
+ prdma_func = &data->rHCD_DMA_Channel_Func;
+
+ common_str.if_num = (kal_uint32)prdma_func->common_str.if_num;
+ common_str.usb_ip_port = (kal_uint8)prdma_func->common_str.usb_ip_port;
+
+ usb_tx_str.ep_max_pkt_size = (kal_uint16)prdma_func->usb_tx_str.ep_max_pkt_size;
+ usb_tx_str.ep_num = (kal_uint8)prdma_func->usb_tx_str.ep_num;
+ usb_tx_str.ep_real_num = (kal_uint8)prdma_func->usb_tx_str.ep_real_num;
+ usb_tx_str.ep_type = (USB_ENDPT_TXFER_TYPE)prdma_func->usb_tx_str.ep_type;
+ usb_tx_str.direction = (USB_EP_DIRECTION)prdma_func->usb_tx_str.direction;
+
+ usb_rx_str.ep_max_pkt_size = (kal_uint16)prdma_func->usb_rx_str.ep_max_pkt_size;
+ usb_rx_str.ep_num = (kal_uint8)prdma_func->usb_rx_str.ep_num;
+ usb_rx_str.ep_real_num = (kal_uint8)prdma_func->usb_rx_str.ep_real_num;
+ usb_rx_str.ep_type = (USB_ENDPT_TXFER_TYPE)prdma_func->usb_rx_str.ep_type;
+ usb_rx_str.direction = (USB_EP_DIRECTION)prdma_func->usb_rx_str.direction;
+
+ direction = (USB_EP_DIRECTION)prdma_func->direction;
+ same_chan = (kal_bool)prdma_func->same_chan;
+ usb_ip_port = (kal_uint8)common_str.usb_ip_port;
+ ep_tx_num = (kal_uint8)usb_tx_str.ep_num;
+ ep_rx_num = (kal_uint8)usb_rx_str.ep_num;
+
+
+
+/* Stop and free DMA channel resource */
+ if(same_chan == KAL_TRUE)
+ {
+ USB_HCD_EP_Check(usb_ip_port,ep_tx_num, USB_EP_TX_DIR, 0);
+ USB_HCD_EP_Check(usb_ip_port,ep_rx_num, USB_EP_RX_DIR, 0);
+
+ dma_chan = g_UsbHcdInfo[usb_ip_port].dma_port[USB_EP_TX_DIR][ep_tx_num-1];
+
+ /* Get DMA channel in start func, but free DMA clannel in detach func */
+ if(dma_chan != 0)
+ {
+ USB_HCD_Stop_DMA_Channel(usb_ip_port,ep_tx_num, USB_EP_TX_DIR);
+
+ if(g_UsbHcdInfo[usb_ip_port].is_bidirection_dma[dma_chan-1] == KAL_FALSE)
+ {
+ ASSERT(0);
+ }
+
+ g_UsbHcdInfo[usb_ip_port].dma_tx_ep_num[dma_chan-1] = 0;
+ g_UsbHcdInfo[usb_ip_port].dma_rx_ep_num[dma_chan-1] = 0;
+ /* Must clear two dma port */
+ g_UsbHcdInfo[usb_ip_port].dma_port[USB_EP_TX_DIR][ep_tx_num-1] = 0;
+ g_UsbHcdInfo[usb_ip_port].dma_port[USB_EP_RX_DIR][ep_rx_num-1] = 0;
+ }
+ }
+ else
+ {
+ if(direction == USB_EP_TX_DIR)
+ {
+ USB_HCD_EP_Check(usb_ip_port,ep_tx_num, USB_EP_TX_DIR, 0);
+
+ dma_chan = g_UsbHcdInfo[usb_ip_port].dma_port[USB_EP_TX_DIR][ep_tx_num-1];
+
+ if(dma_chan != 0)
+ {
+ USB_HCD_Stop_DMA_Channel(usb_ip_port,ep_tx_num, USB_EP_TX_DIR);
+
+ if(g_UsbHcdInfo[usb_ip_port].is_bidirection_dma[dma_chan-1] == KAL_TRUE)
+ {
+ ASSERT(0);
+ }
+
+ g_UsbHcdInfo[usb_ip_port].dma_tx_ep_num[dma_chan-1] = 0;
+ g_UsbHcdInfo[usb_ip_port].dma_port[USB_EP_TX_DIR][ep_tx_num-1] = 0;
+ }
+ }
+ else
+ {
+ USB_HCD_EP_Check(usb_ip_port,ep_rx_num, USB_EP_RX_DIR, 0);
+
+ dma_chan = g_UsbHcdInfo[usb_ip_port].dma_port[USB_EP_RX_DIR][ep_rx_num-1];
+
+ if(dma_chan != 0)
+ {
+ USB_HCD_Stop_DMA_Channel(usb_ip_port,ep_rx_num, USB_EP_RX_DIR);
+
+ if(g_UsbHcdInfo[usb_ip_port].is_bidirection_dma[dma_chan-1] == KAL_TRUE)
+ {
+ ASSERT(0);
+ }
+
+ g_UsbHcdInfo[usb_ip_port].dma_rx_ep_num[dma_chan-1] = 0;
+ g_UsbHcdInfo[usb_ip_port].dma_port[USB_EP_RX_DIR][ep_rx_num-1] = 0;
+ }
+ }
+ }
+
+ return STATUS_OK;
+}
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_EPFIFORead(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_EP_DATA_TXFER_T *prep_data_txfer;
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_ep_str;
+ kal_uint16 nCount;
+// kal_uint8 *pby;
+// kal_uint32 nAddr;
+
+ prep_data_txfer = &data->rHCD_EP_Data_Txfer;
+
+ common_str.if_num = (kal_uint32)prep_data_txfer->common_str.if_num;
+ common_str.usb_ip_port = (kal_uint8)prep_data_txfer->common_str.usb_ip_port;
+
+ usb_ep_str.ep_max_pkt_size = (kal_uint16)prep_data_txfer->usb_ep_str.ep_max_pkt_size;
+ usb_ep_str.ep_num = (kal_uint8)prep_data_txfer->usb_ep_str.ep_num;
+ usb_ep_str.ep_real_num = (kal_uint8)prep_data_txfer->usb_ep_str.ep_real_num;
+ usb_ep_str.ep_type = (USB_ENDPT_TXFER_TYPE)prep_data_txfer->usb_ep_str.ep_type;
+ usb_ep_str.direction = (USB_EP_DIRECTION)prep_data_txfer->usb_ep_str.direction;
+
+ nCount = (kal_uint16)prep_data_txfer->u2nBytes;
+
+
+ USB_HCD_EPFIFORead(common_str,usb_ep_str,nCount,prep_data_txfer->pData);
+
+ return STATUS_OK;
+}
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_EPFIFOWrite(DCL_CTRL_DATA_T *data)
+{
+
+ USB_HCD_CTRL_EP_DATA_TXFER_T *prep_data_txfer;
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_ep_str;
+ kal_uint16 nCount;
+// kal_uint8 *pby;
+// kal_uint32 nAddr;
+
+ prep_data_txfer = &data->rHCD_EP_Data_Txfer;
+
+ common_str.if_num = (kal_uint32)prep_data_txfer->common_str.if_num;
+ common_str.usb_ip_port = (kal_uint8)prep_data_txfer->common_str.usb_ip_port;
+
+ usb_ep_str.ep_max_pkt_size = (kal_uint16)prep_data_txfer->usb_ep_str.ep_max_pkt_size;
+ usb_ep_str.ep_num = (kal_uint8)prep_data_txfer->usb_ep_str.ep_num;
+ usb_ep_str.ep_real_num = (kal_uint8)prep_data_txfer->usb_ep_str.ep_real_num;
+ usb_ep_str.ep_type = (USB_ENDPT_TXFER_TYPE)prep_data_txfer->usb_ep_str.ep_type;
+ usb_ep_str.direction = (USB_EP_DIRECTION)prep_data_txfer->usb_ep_str.direction;
+
+ nCount = (kal_uint16)prep_data_txfer->u2nBytes;
+
+
+ USB_HCD_EPFIFOWrite(common_str,usb_ep_str,nCount,prep_data_txfer->pData);
+
+ return STATUS_OK;
+
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_DMA_Setup(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_DMA_SETUP_FUNC_T *prdma_setup_func;
+// kal_uint16 dma_ctrl;
+// kal_uint8 dma_chan;
+// kal_uint32 dma_burst_mode = 0;
+// kal_uint32 savedMask;
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_ep_str;
+// kal_uint8 usb_ip_port;
+// kal_uint8 ep_num ;
+// USB_EP_DIRECTION direction;
+// USB_ENDPT_TXFER_TYPE ep_type;
+ kal_uint32 addr;
+ kal_uint32 length;
+ usb_dma_callback callback;
+ kal_bool callback_upd_run;
+ kal_bool known_size;
+ USB_DMA_TYPE dma_type;
+
+ prdma_setup_func = &data->rHCD_DMA_Setup_Func;
+
+ common_str.if_num = (kal_uint32)prdma_setup_func->common_str.if_num;
+ common_str.usb_ip_port = (kal_uint8)prdma_setup_func->common_str.usb_ip_port;
+
+ usb_ep_str.ep_max_pkt_size = (kal_uint16)prdma_setup_func->usb_ep_str.ep_max_pkt_size;
+ usb_ep_str.ep_num = (kal_uint8)prdma_setup_func->usb_ep_str.ep_num;
+ usb_ep_str.ep_real_num = (kal_uint8)prdma_setup_func->usb_ep_str.ep_real_num;
+ usb_ep_str.ep_type = (USB_ENDPT_TXFER_TYPE)prdma_setup_func->usb_ep_str.ep_type;
+ usb_ep_str.direction = (USB_EP_DIRECTION)prdma_setup_func->usb_ep_str.direction;
+
+// usb_ip_port = (kal_uint8)common_str.usb_ip_port;
+// ep_num = (kal_uint8)usb_ep_str.ep_num;
+// direction = (USB_EP_DIRECTION)usb_ep_str.direction;
+// ep_type = (USB_ENDPT_TXFER_TYPE)usb_ep_str.ep_type;
+ addr = (kal_uint32)prdma_setup_func->u4addr;
+ length = (kal_uint32)prdma_setup_func->u4length;
+ callback = (usb_dma_callback)prdma_setup_func->callback;
+ callback_upd_run = (kal_bool)prdma_setup_func->fgcallback_upd_run;
+ known_size = (kal_bool)prdma_setup_func->fgknown_size;
+ dma_type = (USB_DMA_TYPE)prdma_setup_func->dma_type;
+
+
+ USB_HCD_DMA_Setup(common_str,usb_ep_str,addr,length,callback,callback_upd_run,known_size,dma_type);
+
+ return STATUS_OK;
+
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Disconn_Hdlr(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_IP_NUM_T *usb_ip;
+ kal_uint8 usb_ip_port;
+
+ usb_ip = &data->rHCD_ip;
+ usb_ip_port = (kal_uint8)usb_ip->ip;
+
+
+ USB_HCD_Disconn_Hdlr(usb_ip_port);
+
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_Conn_Hdlr(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_CTRL_IP_NUM_T *usb_ip;
+ kal_uint8 usb_ip_port;
+
+ usb_ip = &data->rHCD_ip;
+ usb_ip_port = (kal_uint8)usb_ip->ip;
+
+/* Although we stop all eps' activities when we process disconn hdlr, but there may be some eps still are accessed after disconn intr because APP layer did read/write cmds */
+
+ USB_HCD_Conn_Hdlr(usb_ip_port);
+
+ return STATUS_OK;
+
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_VBUS_OFF(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_VBusEnable(0, KAL_FALSE);
+
+ return STATUS_OK;
+}
+
+
+void USB_HCD_HISR(void)
+{
+ kal_uint8 IntrUSB;
+ kal_uint16 IntrTx;
+ kal_uint16 IntrRx;
+ kal_uint16 CSR0;
+ kal_uint16 TXCSR;
+ kal_uint16 RXCSR;
+ kal_uint32 ep_num = 0;
+ kal_uint32 pkt_length;
+ kal_uint16 todo;
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_ep_str;
+ kal_uint8 usb_ip_port = 0;
+
+ common_str.usb_ip_port = usb_ip_port;
+
+ // Read and clear!!
+ IntrUSB = OTG_Get_Intr_Status();
+
+
+#if defined(DRV_USB_IP_V3)
+ // Read and clear!!
+ IntrTx = USB_DRV_Reg(USB_INTRTX_HCD(USB_BaseAddr[usb_ip_port]));
+ // Write 0 clear
+ IntrRx = USB_DRV_Reg(USB_INTRRX_HCD(USB_BaseAddr[usb_ip_port]));
+ USB_DRV_WriteReg(USB_INTRRX_HCD(USB_BaseAddr[usb_ip_port]), ~IntrRx);
+#else
+ // Write 1 clear
+ IntrTx = USB_DRV_Reg(USB_INTRTX_HCD(USB_BaseAddr[usb_ip_port]));
+ USB_DRV_WriteReg(USB_INTRTX_HCD(USB_BaseAddr[usb_ip_port]), IntrTx);
+
+ // Write 1 clear
+ IntrRx = USB_DRV_Reg(USB_INTRRX_HCD(USB_BaseAddr[usb_ip_port]));
+ USB_DRV_WriteReg(USB_INTRRX_HCD(USB_BaseAddr[usb_ip_port]), IntrRx);
+#endif
+
+
+ if((IntrUSB&USB_INTRUSB_RESUME) != 0)
+ {
+ if (USB_HCD_Is_RemoteWakeup_SUPPORT(usb_ip_port) == KAL_TRUE)
+ {
+ /* Remote wakeup */
+ USB_Dbg_Trace(USB_HCD_RESUME, 0, 0);
+ USB_HCD_Resume(usb_ip_port);
+ }
+ }
+
+ if((IntrUSB&USB_INTRUSB_CONN) != 0)
+ {
+ /* A or B side plug out will both trigger this dis_conn interrupt */
+ if((IntrUSB&USB_INTRUSB_DISCON) != 0)
+ {
+ USB_Dbg_Trace(USB_HCD_CONN_AND_DISCONN, USB_DRV_Reg8(USB_LINE_STATE), 0);
+ drv_trace0(TRACE_FUNC, (kal_uint32)USB_HCD_CONN_AND_DISCONN_INTR);
+ IntrTx = 0;
+ IntrRx = 0;
+ OTG_Set_Disconn_Status();
+ USB_HCD_Disconn_Hdlr(usb_ip_port);
+ return;
+ }
+
+ USB_Dbg_Trace(USB_HCD_CONN, USB_DRV_Reg8(USB_LINE_STATE), 0);
+ drv_trace0(TRACE_FUNC, (kal_uint32)USB_HCD_CONN_INTR);
+ USB_HCD_Conn_Hdlr(usb_ip_port);
+ }
+
+ if((IntrUSB&USB_INTRUSB_BABBLE) != 0)
+ {
+ if((OTG_Get_State() == OTG_STATE_A_HOST)||(OTG_Get_State() == OTG_STATE_B_HOST))
+ {
+ USB_Dbg_Trace(USB_HCD_BABBLE, USB_DRV_Reg8(USB_OPSTATE_HCD(USB_BaseAddr[usb_ip_port])),USB_DRV_Reg8(USB_DEVCTL_HCD(USB_BaseAddr[usb_ip_port])));
+ drv_trace0(TRACE_FUNC, (kal_uint32)USB_HCD_BABBLE_INTR);
+
+ //B-Device doesn't need to clear session bit
+ if ((USB_DRV_Reg8(USB_DEVCTL_HCD(USB_BaseAddr[usb_ip_port])) & USB_DEVCTL_BDEVICE) == 0)
+ USB_HCD_VBusEnable(usb_ip_port,KAL_FALSE);
+
+ /* Disable all USB interrupts */
+ USB_DRV_WriteReg8(USB_INTRUSBE_HCD(USB_BaseAddr[usb_ip_port]), 0x00);
+
+ /* handle as disconnect intr to prevent upper laype still wait the events */
+ USB_HCD_Disconn_Hdlr(usb_ip_port);
+ }
+ }
+
+ /* Check for endpoint 0 interrupt */
+ if(IntrTx&USB_INTRTX_EP0)
+ {
+ if(g_UsbHcdInfo[usb_ip_port].ep0_hdlr == NULL)
+ ASSERT(0);
+
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), 0);
+ CSR0 = USB_DRV_Reg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]));
+
+ USB_Dbg_Trace(USB_HCD_EP0_INTR, CSR0, 0);
+
+ usb_ep_str.ep_num = 0;
+ usb_ep_str.ep_type = USB_ENDPT_CTRL;
+
+ if(CSR0&USB_CSR0_RXSTALL)
+ {
+ drv_trace1(TRACE_FUNC, (kal_uint32)USB_HCD_TX_EPN_STALL, 0);
+
+ g_UsbHcdInfo[usb_ip_port].ep0_fifo_intr = KAL_FALSE;
+ g_UsbHcdInfo[usb_ip_port].ep0_setup = KAL_FALSE;
+ g_UsbHcdInfo[usb_ip_port].ep0_status = KAL_FALSE;
+
+ CSR0 &= ~USB_CSR0_RXSTALL;
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), CSR0);
+ g_UsbHcdInfo[usb_ip_port].ep0_hdlr(usb_ip_port,USB_HCD_STALL, 0);
+ }
+ else if (CSR0&USB_CSR0_ERROR)
+ {
+ drv_trace1(TRACE_FUNC, (kal_uint32)USB_HCD_TX_EPN_ERROR, 0);
+
+ /* Bad cable */
+ g_UsbHcdInfo[usb_ip_port].ep0_fifo_intr = KAL_FALSE;
+ g_UsbHcdInfo[usb_ip_port].ep0_setup = KAL_FALSE;
+ g_UsbHcdInfo[usb_ip_port].ep0_status = KAL_FALSE;
+
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), USB_CSR0_ERROR);
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), USB_CSR0_FLUSHFIFO);
+ g_UsbHcdInfo[usb_ip_port].ep0_hdlr(usb_ip_port,USB_HCD_NO_RESPONSE, 0);
+ }
+ else if (CSR0&USB_CSR0_NAKTIMEOUT)
+ {
+ drv_trace1(TRACE_FUNC, (kal_uint32)USB_HCD_TX_EPN_TIMEOUT, 0);
+
+ g_UsbHcdInfo[usb_ip_port].ep0_fifo_intr = KAL_FALSE;
+ g_UsbHcdInfo[usb_ip_port].ep0_setup = KAL_FALSE;
+ g_UsbHcdInfo[usb_ip_port].ep0_status = KAL_FALSE;
+
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), USB_CSR0_NAKTIMEOUT);
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), USB_CSR0_FLUSHFIFO);
+ g_UsbHcdInfo[usb_ip_port].ep0_hdlr(usb_ip_port,USB_HCD_TIMEOUT, 0);
+ }
+ else if (CSR0&USB_CSR0_RXSTALL)
+ {
+ drv_trace1(TRACE_FUNC, (kal_uint32)USB_HCD_TX_EPN_STALL, 0);
+
+ /* Clear STALL bit */
+ CSR0 &= ~USB_CSR0_RXSTALL;
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), CSR0);
+
+ g_UsbHcdInfo[usb_ip_port].ep0_hdlr(usb_ip_port,USB_HCD_STALL, 0);
+
+ }
+ else
+ {
+ USB_Dbg_Trace(USB_HCD_EP0_INTR, (kal_uint32)g_UsbHcdInfo[usb_ip_port].ep0_setup, (kal_uint32)g_UsbHcdInfo[usb_ip_port].ep0_status);
+
+ if(g_UsbHcdInfo[usb_ip_port].ep0_fifo_intr == KAL_TRUE)
+ {
+ g_UsbHcdInfo[usb_ip_port].ep0_fifo_intr = KAL_FALSE;
+
+ if(g_UsbHcdInfo[usb_ip_port].ep0_setup == KAL_TRUE)
+ {
+ /* Setup and status packet must be single packet */
+ g_UsbHcdInfo[usb_ip_port].ep0_setup = KAL_FALSE;
+
+ if(CSR0&USB_CSR0_SETUPPKT)
+ {
+ CSR0 &= ~(USB_CSR0_SETUPPKT|USB_CSR0_TXPKTRDY);
+ CSR0 |= USB_CSR0_FLUSHFIFO;
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), CSR0);
+ g_UsbHcdInfo[usb_ip_port].ep0_hdlr(usb_ip_port,USB_HCD_NO_RESPONSE, 0);
+ }
+ else
+ {
+ g_UsbHcdInfo[usb_ip_port].ep0_hdlr(usb_ip_port,USB_HCD_OK, g_UsbHcdInfo[usb_ip_port].ep0_info.sofar);
+ }
+ }
+ else if(g_UsbHcdInfo[usb_ip_port].ep0_status == KAL_TRUE)
+ {
+ g_UsbHcdInfo[usb_ip_port].ep0_status = KAL_FALSE;
+
+ /* Clear status bit */
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), 0x00);
+ g_UsbHcdInfo[usb_ip_port].ep0_hdlr(usb_ip_port,USB_HCD_OK, g_UsbHcdInfo[usb_ip_port].ep0_info.sofar);
+ }
+ else if(g_UsbHcdInfo[usb_ip_port].ep0_info.direction == USB_EP_RX_DIR)
+ {
+ /* Read the receive packet length */
+ pkt_length = USB_HCD_EP0_Pkt_Len(common_str);
+
+ if((g_UsbHcdInfo[usb_ip_port].ep0_info.sofar + pkt_length) > g_UsbHcdInfo[usb_ip_port].ep0_info.data_length)
+ {
+ pkt_length = g_UsbHcdInfo[usb_ip_port].ep0_info.data_length - g_UsbHcdInfo[usb_ip_port].ep0_info.sofar;
+ }
+
+ USB_HCD_EPFIFORead(common_str,usb_ep_str, pkt_length, &g_UsbHcdInfo[usb_ip_port].ep0_info.p_data[g_UsbHcdInfo[usb_ip_port].ep0_info.sofar]);
+
+ g_UsbHcdInfo[usb_ip_port].ep0_info.sofar += pkt_length;
+
+ USB_Dbg_Trace(USB_HCD_EP0_Data, (kal_uint32)g_UsbHcdInfo[usb_ip_port].ep0_info.sofar, (kal_uint32)g_UsbHcdInfo[usb_ip_port].ep0_info.data_length);
+ CSR0 &= ~USB_CSR0_RXPKTRDY;
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), CSR0);
+
+ drv_trace2(TRACE_FUNC, (kal_uint32)USB_HCD_EP0,g_UsbHcdInfo[usb_ip_port].ep0_info.sofar, g_UsbHcdInfo[usb_ip_port].ep0_info.data_length);
+
+ if((g_UsbHcdInfo[usb_ip_port].ep0_info.sofar == g_UsbHcdInfo[usb_ip_port].ep0_info.data_length)
+ ||(pkt_length < g_UsbHcdInfo[usb_ip_port].ep0_info.max_packet_size))
+ {
+ /* callback to USB stack */
+ drv_trace4(TRACE_FUNC, (kal_uint32)USB_HCD_EP0_RX,g_UsbHcdInfo[usb_ip_port].ep0_info.sofar, g_UsbHcdInfo[usb_ip_port].ep0_info.data_length,g_UsbHcdInfo[usb_ip_port].ep0_info.max_packet_size,0);
+ g_UsbHcdInfo[usb_ip_port].ep0_hdlr(usb_ip_port,USB_HCD_OK, g_UsbHcdInfo[usb_ip_port].ep0_info.sofar);
+ }
+ else
+ {
+ /* Receive this pcket, and request for next packet */
+ g_UsbHcdInfo[usb_ip_port].ep0_fifo_intr = KAL_TRUE;
+ CSR0 &= ~USB_CSR0_RXPKTRDY;
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), CSR0);
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), (CSR0|USB_CSR0_REQPKT));
+ }
+ }
+ else if(g_UsbHcdInfo[usb_ip_port].ep0_info.direction == USB_EP_TX_DIR)
+ {
+ if((g_UsbHcdInfo[usb_ip_port].ep0_info.data_length-g_UsbHcdInfo[usb_ip_port].ep0_info.sofar)
+ >g_UsbHcdInfo[usb_ip_port].ep0_info.max_packet_size)
+ pkt_length = g_UsbHcdInfo[usb_ip_port].ep0_info.max_packet_size;
+ else
+ pkt_length = g_UsbHcdInfo[usb_ip_port].ep0_info.data_length-g_UsbHcdInfo[usb_ip_port].ep0_info.sofar;
+
+ if (pkt_length == 0) //all data has already sent out
+ {
+ g_UsbHcdInfo[usb_ip_port].ep0_hdlr(usb_ip_port,USB_HCD_OK, g_UsbHcdInfo[usb_ip_port].ep0_info.sofar);
+ }
+ else
+ {
+ /* Write data packet to FIFO */
+ USB_HCD_EPFIFOWrite(common_str,usb_ep_str, pkt_length, &g_UsbHcdInfo[usb_ip_port].ep0_info.p_data[g_UsbHcdInfo[usb_ip_port].ep0_info.sofar]);
+ g_UsbHcdInfo[usb_ip_port].ep0_info.sofar += pkt_length;
+ g_UsbHcdInfo[usb_ip_port].ep0_fifo_intr = KAL_TRUE;
+
+ USB_Dbg_Trace(USB_HCD_EP0_Data, (kal_uint32)g_UsbHcdInfo[usb_ip_port].ep0_info.sofar, (kal_uint32)g_UsbHcdInfo[usb_ip_port].ep0_info.data_length);
+
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), 0);
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), USB_CSR0_TXPKTRDY);
+ }
+
+ USB_Dbg_Trace(USB_HCD_SEND_DATA_DONE, ep_num, 0);
+ }
+ }
+ else
+ {
+ USB_Dbg_Trace(USB_HCD_UNEXPECTED_EP0_INTR, 0, 0);
+ }
+ }
+ }
+
+ /* Check for Bulk TX interrupt */
+ /* TX interrupt : 1.TxPktRdy is clear, 2. RXSTALL is set */
+ for(ep_num = 1; ep_num <= MAX_TX_EP_NUM; ep_num++)
+ {
+ if (IntrTx&(0x01 <<ep_num))
+ {
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), ep_num);
+ TXCSR = USB_DRV_Reg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]));
+
+ USB_Dbg_Trace(USB_HCD_EPN_TX_INTR, ep_num, TXCSR);
+
+ usb_ep_str.ep_num = ep_num;
+ usb_ep_str.direction = USB_EP_TX_DIR;
+
+ if((TXCSR&USB_TXCSR_RXSTALL) != 0)
+ {
+ drv_trace1(TRACE_FUNC, (kal_uint32)USB_HCD_TX_EPN_STALL, ep_num);
+
+ g_UsbHcdInfo[usb_ip_port].ep_tx_fifo_intr[ep_num-1] = KAL_FALSE;
+
+ /* Stop running DMA */
+ USB_HCD_DMA_Stop(usb_ip_port,ep_num, USB_EP_TX_DIR);
+
+ /* Clear RXSTALL bit */
+ TXCSR &= ~USB_TXCSR_RXSTALL;
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), TXCSR);
+
+ if(g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[ep_num-1] != NULL)
+ g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[ep_num-1](usb_ip_port,USB_HCD_STALL, (kal_uint32)USB_EP_TX_DIR);
+ }
+ else if((TXCSR&USB_TXCSR_ERROR) != 0)
+ {
+ drv_trace1(TRACE_FUNC, (kal_uint32)USB_HCD_TX_EPN_ERROR, ep_num);
+
+ g_UsbHcdInfo[usb_ip_port].ep_tx_fifo_intr[ep_num-1] = KAL_FALSE;
+
+ /* Because of bad cable */
+ /* Stop running DMA */
+ USB_HCD_DMA_Stop(usb_ip_port,ep_num, USB_EP_TX_DIR);
+
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_TXCSR_ERROR);
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), (USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG));
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), (USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG));
+
+ g_UsbHcdInfo[usb_ip_port].ep_tx_flush_intr[ep_num-1] = KAL_TRUE;
+
+ if(g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[ep_num-1] != NULL)
+ g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[ep_num-1](usb_ip_port,USB_HCD_NO_RESPONSE, (kal_uint32)USB_EP_TX_DIR);
+ }
+ else if((TXCSR&USB_TXCSR_NAKTIMEOUT) != 0)
+ {
+ drv_trace1(TRACE_FUNC, (kal_uint32)USB_HCD_TX_EPN_TIMEOUT, ep_num);
+
+ g_UsbHcdInfo[usb_ip_port].ep_tx_fifo_intr[ep_num-1] = KAL_FALSE;
+
+ /* Because of bad cable */
+ /* Stop running DMA */
+ USB_HCD_DMA_Stop(usb_ip_port,ep_num, USB_EP_TX_DIR);
+
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_TXCSR_NAKTIMEOUT);
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), (USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG));
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), (USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG));
+
+ g_UsbHcdInfo[usb_ip_port].ep_tx_flush_intr[ep_num-1] = KAL_TRUE;
+
+ if(g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[ep_num-1] != NULL)
+ g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[ep_num-1](usb_ip_port,USB_HCD_TIMEOUT, (kal_uint32)USB_EP_TX_DIR);
+ }
+ else
+ {
+ if(g_UsbHcdInfo[usb_ip_port].ep_tx_fifo_intr[ep_num-1] == KAL_TRUE)
+ {
+ g_UsbHcdInfo[usb_ip_port].ep_tx_fifo_intr[ep_num-1] = KAL_FALSE;
+
+ if(g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].data_length == g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].sofar)
+ {
+ if(g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[ep_num-1] != NULL)
+ g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[ep_num-1](usb_ip_port,USB_HCD_OK, g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].data_length);
+ }
+ else
+ {
+ if((g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].data_length-g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].sofar)
+ >g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].max_packet_size)
+ todo = g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].max_packet_size;
+ else
+ todo = g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].data_length-g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].sofar;
+
+ /* Write data packet to FIFO */
+ USB_HCD_EPFIFOWrite(common_str,usb_ep_str, todo, &g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].p_data[g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].sofar]);
+// USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), ep_num);
+ g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].sofar += todo;
+ g_UsbHcdInfo[usb_ip_port].ep_tx_fifo_intr[ep_num-1] = KAL_TRUE;
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_TXCSR_TXPKTRDY);
+ }
+ }
+ else if(g_UsbHcdInfo[usb_ip_port].ep_tx_flush_intr[ep_num-1] == KAL_TRUE)
+ {
+ g_UsbHcdInfo[usb_ip_port].ep_tx_flush_intr[ep_num-1] = KAL_FALSE;
+ }
+ else
+ {
+ USB_Dbg_Trace(USB_HCD_UNEXPECTED_TX_INTR, 0, 0);
+ }
+ }
+ }
+ }
+
+ /* Check for Bulk RX interrupt */
+ /* RX interrupt : 1.RxPktRdy is set, 2. RXSTALL is set */
+ for(ep_num = 1; ep_num <= MAX_RX_EP_NUM; ep_num++)
+ {
+ if(IntrRx&(0x01<<ep_num))
+{
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), ep_num);
+ RXCSR = USB_DRV_Reg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]));
+
+ usb_ep_str.ep_num = ep_num;
+ usb_ep_str.direction = USB_EP_RX_DIR;
+
+ USB_Dbg_Trace(USB_HCD_EPN_RX_INTR, ep_num, RXCSR);
+
+ if((RXCSR&USB_RXCSR_RXSTALL) != 0)
+ {
+ drv_trace1(TRACE_FUNC, (kal_uint32)USB_HCD_RX_EPN_STALL, ep_num);
+
+ /* Stop running DMA */
+ USB_HCD_DMA_Stop(usb_ip_port,ep_num, USB_EP_RX_DIR);
+
+ RXCSR &= ~USB_RXCSR_RXSTALL;
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), RXCSR);
+
+ if(g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num-1] != NULL)
+ g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num-1](usb_ip_port,USB_HCD_STALL, (kal_uint32)USB_EP_RX_DIR);
+ }
+ else if((RXCSR&USB_RXCSR_ERROR) != 0)
+ {
+ drv_trace1(TRACE_FUNC, (kal_uint32)USB_HCD_RX_EPN_ERROR, ep_num);
+
+ /* Because of bad cable */
+ /* Stop running DMA */
+ USB_HCD_DMA_Stop(usb_ip_port,ep_num, USB_EP_RX_DIR);
+
+ RXCSR &= ~USB_RXCSR_ERROR;
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), RXCSR);
+
+ if(g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num-1] != NULL)
+ g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num-1](usb_ip_port,USB_HCD_NO_RESPONSE, (kal_uint32)USB_EP_RX_DIR);
+ }
+ else if((RXCSR&USB_RXCSR_NAKTIMEOUT) != 0)
+ {
+ drv_trace1(TRACE_FUNC, (kal_uint32)USB_HCD_RX_EPN_TIMEOUT, ep_num);
+
+ /* Because of bad cable */
+ /* Stop running DMA */
+ USB_HCD_DMA_Stop(usb_ip_port,ep_num, USB_EP_RX_DIR);
+
+ RXCSR &= ~(USB_RXCSR_NAKTIMEOUT|USB_RXCSR_REQPKT);
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), RXCSR);
+
+ if(g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num-1] != NULL)
+ g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num-1](usb_ip_port,USB_HCD_TIMEOUT, (kal_uint32)USB_EP_RX_DIR);
+ }
+ else if((RXCSR&USB_RXCSR_PIDERROR) != 0)
+ {
+ drv_trace1(TRACE_FUNC, (kal_uint32)USB_HCD_RX_EPN_PID_ERROR, ep_num);
+
+ /* Stop running DMA */
+ USB_HCD_DMA_Stop(usb_ip_port,ep_num, USB_EP_RX_DIR);
+
+ RXCSR &= ~(USB_RXCSR_PIDERROR|USB_RXCSR_REQPKT);
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), RXCSR);
+
+ if(g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num-1] != NULL)
+ g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num-1](usb_ip_port,USB_HCD_PID_ERROR, (kal_uint32)USB_EP_RX_DIR);
+
+ }
+ else if((RXCSR&USB_RXCSR_RXPKTRDY) != 0)
+ {
+ if(g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num-1] == NULL)
+ ASSERT(0);
+
+ todo = USB_HCD_EP_Rx_Pkt_Len(common_str,usb_ep_str);
+ USB_HCD_EPFIFORead(common_str,usb_ep_str, todo, &g_UsbHcdInfo[usb_ip_port].ep_rx_info[ep_num-1].p_data[g_UsbHcdInfo[usb_ip_port].ep_rx_info[ep_num-1].sofar]);
+ g_UsbHcdInfo[usb_ip_port].ep_rx_info[ep_num-1].sofar += todo;
+
+
+ if((g_UsbHcdInfo[usb_ip_port].ep_rx_info[ep_num-1].data_length == g_UsbHcdInfo[usb_ip_port].ep_rx_info[ep_num-1].sofar)||(todo < g_UsbHcdInfo[usb_ip_port].ep_rx_info[ep_num-1].max_packet_size))
+ {
+ g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num -1](usb_ip_port,USB_HCD_OK, g_UsbHcdInfo[usb_ip_port].ep_rx_info[ep_num-1].sofar);
+ }
+ else
+ {
+ g_UsbHcdInfo[usb_ip_port].ep_rx_fifo_intr[ep_num-1] = KAL_TRUE;
+ DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), ep_num);
+ DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_RXCSR_REQPKT);
+ }
+
+ }
+ else
+ {
+ if(g_UsbHcdInfo[usb_ip_port].ep_rx_flush_intr[ep_num-1] == KAL_TRUE)
+ {
+ g_UsbHcdInfo[usb_ip_port].ep_rx_flush_intr[ep_num-1] = KAL_FALSE;
+ }
+ else
+ {
+ USB_Dbg_Trace(USB_HCD_UNEXPECTED_RX_INTR, 0, 0);
+ }
+ }
+ }
+ }
+
+ /* A or B side plug out will both trigger this dis_conn interrupt */
+ if((IntrUSB&USB_INTRUSB_DISCON) != 0)
+ {
+// USB_DRV_WriteReg8(USB_INTRUSBE_HCD(USB_BaseAddr[usb_ip_port]), ~USB_INTRUSBE_SOF);
+ USB_Dbg_Trace(USB_HCD_DISCONN, USB_DRV_Reg8(USB_LINE_STATE), USB_DRV_Reg8(USB_OPSTATE_HCD(USB_BaseAddr[usb_ip_port])));
+// USB_Dbg_Trace(USB_HCD_DISCONN, USB_DRV_Reg8(USB_DEVCTL), 0);
+ drv_trace0(TRACE_FUNC, (kal_uint32)USB_HCD_DISCONN_INTR);
+ USB_HCD_Disconn_Hdlr(usb_ip_port);
+ }
+
+ if((IntrUSB&USB_INTRUSB_SUSPEND) != 0)
+ {
+
+ }
+}
+
+DCL_STATUS DCL_USB_CTRL_API_USB_HCD_HISR(DCL_CTRL_DATA_T *data)
+{
+ USB_HCD_HISR();
+
+ return STATUS_OK;
+}
+
+#if defined(__IC_USB_ENABLE__)
+
+
+static void IC_USBDMA_HISR(void)
+{
+ kal_uint8 DMAIntr;
+ kal_uint32 index;
+ kal_uint8 usb_ip_port = ICUSB_PORT_1; //IC USB Port
+
+ DMAIntr = USB_DRV_Reg8(USB_DMAINTR_HCD(USB_BaseAddr[usb_ip_port]));
+
+ while(DMAIntr != 0)
+ {
+ for(index = 0; index < ICUSB_MAX_DMA_NUM; index++)
+ {
+ if((DMAIntr&(1<<index)) != 0)
+ {
+ // write 0 clear first, then do call back function, order is very important !!!
+ USB_DRV_WriteReg8(USB_DMAINTR_HCD(USB_BaseAddr[usb_ip_port]), ~(0x01<<index));
+
+ /* DMA channel index+1 have interrupt */
+
+ if(USB_DRV_Reg32((USB_DMA_REALCNT_HCD(USB_BaseAddr[usb_ip_port],index+1))) != 0)
+ {
+ if(g_UsbHcdInfo[usb_ip_port].dma_running[index] == KAL_TRUE)
+ {
+ USB_HCD_DMA_Callback(usb_ip_port,index+1);
+ }
+ else
+ ASSERT(0);
+ }
+ else
+ {
+ if(USB_Check_DMA_Time_Out(usb_ip_port,index+1) == KAL_TRUE)
+ {
+ if(g_UsbHcdInfo[usb_ip_port].dma_running[index] == KAL_TRUE)
+ {
+ USB_HCD_DMA_Callback(usb_ip_port,index+1);
+ }
+ else
+ ASSERT(0);
+ }
+ else
+ {
+ ASSERT(0);
+ }
+ }
+ }
+ }
+
+ /* Read register again to see if any interrupt is generated again */
+ /* if pong pong buffer serve done, then we do call back function here */
+ DMAIntr = USB_DRV_Reg8(USB_DMAINTR_HCD(USB_BaseAddr[usb_ip_port]));
+ }
+
+ IRQClearInt(IRQ_IC_USBDMA1_CODE);
+ IRQUnmask(IRQ_IC_USBDMA1_CODE);
+}
+
+
+static void IC_USBDMA_LISR(void)
+{
+ kal_uint8 DMAIntr;
+ kal_uint8 usb_ip_port = ICUSB_PORT_1; //IC USB Port
+
+ IRQMask(IRQ_IC_USBDMA1_CODE);
+ drv_active_hisr(DRV_IC_USBDMA1_HISR_ID);
+ DMAIntr = USB_DRV_Reg8(USB_DMAINTR_HCD(USB_BaseAddr[usb_ip_port]));
+// ICUSB_Dbg_Trace(IC_USB_DMA_LISR, DMAIntr, 0);
+ ASSERT(DMAIntr != 0);
+}
+
+static void IC_USB_LISR(void)
+{
+ IRQMask(IRQ_IC_USB1_CODE);
+
+// g_UsbHcdInfo[usb_ip_port].is_ProHISR = KAL_TRUE;
+ drv_active_hisr(DRV_IC_USB1_HISR_ID);
+}
+
+static void IC_USB_HISR(void)
+{
+ kal_uint8 IntrUSB;
+ kal_uint16 IntrTx;
+ kal_uint16 IntrRx;
+ kal_uint16 CSR0;
+ kal_uint16 TXCSR;
+ kal_uint16 RXCSR;
+ kal_uint32 ep_num;
+ kal_uint32 pkt_length;
+ kal_uint16 todo;
+ kal_bool b_dev_unmask_irq = KAL_TRUE;
+ kal_bool b_host_hisr_is_handled = KAL_FALSE;
+ kal_uint8 usb_ip_port = ICUSB_PORT_1; //IC USB Port
+ USBH_Common_Struct common_str;
+ USBH_EP_Struct usb_ep_str;
+ common_str.usb_ip_port = usb_ip_port;
+
+
+ // Read and clear!!
+ IntrUSB = USB_DRV_Reg8(USB_INTRUSB_HCD(USB_BaseAddr[usb_ip_port]));
+// ICUSB_Dbg_Trace(IC_USB_DBG_HISR, IntrUSB, USB_DRV_Reg8(USB_POWER_HCD(USB_BaseAddr[usb_ip_port])));
+ IntrTx = USB_DRV_Reg(USB_INTRTX_HCD(USB_BaseAddr[usb_ip_port]));
+ // Write 0 clear
+ IntrRx = USB_DRV_Reg(USB_INTRRX_HCD(USB_BaseAddr[usb_ip_port]));
+ USB_DRV_WriteReg(USB_INTRRX_HCD(USB_BaseAddr[usb_ip_port]), ~IntrRx);
+
+
+ if(IntrUSB != 0)
+ {
+ b_host_hisr_is_handled = KAL_TRUE;
+ }
+
+ /* SRP detection, Only A-device */
+ if((IntrUSB&USB_INTRUSB_SESSREQ) != 0)
+ {
+// ASSERT(0); // there should not have SRP detection
+ }
+
+ /* VBUS error, A device only */
+ if((IntrUSB&USB_INTRUSB_VBUSERROR) != 0)
+ {
+/* IP detect every 543ms, Vbus is still lower than 4.4V it will issue this intr and auto turn off Vbus */
+// USB_DRV_ClearBits8(USB_DEVCTL, USB_DEVCTL_SESSION);
+// Power control by SIM Task , IC USB only notice SIM task
+
+ }
+
+ if((IntrUSB&USB_INTRUSB_RESUME) != 0)
+ {
+ // Remote wake up will be detected by EINT
+// USB_HCD_Resume(usb_ip_port);
+ ASSERT(0);
+ }
+
+ if((IntrUSB&USB_INTRUSB_CONN) != 0)
+ {
+ /* plug out will both trigger this dis_conn interrupt */
+ if((IntrUSB&USB_INTRUSB_DISCON) != 0)
+ {
+ ASSERT(0); // IC USB Cannot hot plug out
+ }
+
+ USB_Dbg_Trace(USB_HCD_CONN, 0, 0);
+ drv_trace0(TRACE_FUNC, (kal_uint32)USB_HCD_CONN_INTR);
+ USB_HCD_Conn_Hdlr(usb_ip_port);
+
+ //QQ SW Work Around
+// USB_DRV_ClearBits8(USB_INTRUSBE_HCD(USB_BaseAddr[usb_ip_port]), USB_INTRUSBE_CONN); // QQ SW : avoid Interrupt always trigger
+// USB_DRV_ClearBits8(USB_INTRUSBE_HCD(USB_BaseAddr[usb_ip_port]), USB_INTRUSBE_DISCON); // QQ SW : avoid Interrupt always trigger
+ }
+
+ if((IntrUSB&USB_INTRUSB_BABBLE) != 0)
+ {
+ USB_Dbg_Trace(USB_HCD_BABBLE, 0, 0);
+ drv_trace0(TRACE_FUNC, (kal_uint32)USB_HCD_BABBLE_INTR);
+
+ /* Close session */
+ USB_DRV_ClearBits8(USB_DEVCTL_HCD(USB_BaseAddr[usb_ip_port]), USB_DEVCTL_SESSION);
+
+ /* Disable all USB interrupts */
+ USB_DRV_WriteReg8(USB_INTRUSBE_HCD(USB_BaseAddr[usb_ip_port]), 0x00);
+
+ /* handle as disconnect intr to prevent upper laype still wait the events */
+ USB_HCD_Disconn_Hdlr(usb_ip_port);
+
+ ASSERT(0); //Debug
+ // IC USB only notice SIM task this serious error
+
+ }
+
+ /* Check for endpoint 0 interrupt */
+ if(IntrTx&USB_INTRTX_EP0)
+ {
+ if(g_UsbHcdInfo[usb_ip_port].ep0_hdlr == NULL)
+ ASSERT(0);
+
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), 0);
+ CSR0 = USB_DRV_Reg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]));
+
+ USB_Dbg_Trace(USB_HCD_EP0_INTR, CSR0, 0);
+
+ usb_ep_str.ep_num = 0;
+ usb_ep_str.ep_type = USB_ENDPT_CTRL;
+
+ if(CSR0&USB_CSR0_RXSTALL)
+ {
+ drv_trace1(TRACE_FUNC, (kal_uint32)USB_HCD_TX_EPN_STALL, 0);
+
+ g_UsbHcdInfo[usb_ip_port].ep0_fifo_intr = KAL_FALSE;
+ g_UsbHcdInfo[usb_ip_port].ep0_setup = KAL_FALSE;
+ g_UsbHcdInfo[usb_ip_port].ep0_status = KAL_FALSE;
+
+ CSR0 &= ~USB_CSR0_RXSTALL;
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), CSR0);
+ g_UsbHcdInfo[usb_ip_port].ep0_hdlr(usb_ip_port,USB_HCD_STALL, 0);
+ }
+ else if (CSR0&USB_CSR0_ERROR)
+ {
+ drv_trace1(TRACE_FUNC, (kal_uint32)USB_HCD_TX_EPN_ERROR, 0);
+
+ /* Bad cable */
+ g_UsbHcdInfo[usb_ip_port].ep0_fifo_intr = KAL_FALSE;
+ g_UsbHcdInfo[usb_ip_port].ep0_setup = KAL_FALSE;
+ g_UsbHcdInfo[usb_ip_port].ep0_status = KAL_FALSE;
+
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), USB_CSR0_ERROR);
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), USB_CSR0_FLUSHFIFO);
+ g_UsbHcdInfo[usb_ip_port].ep0_hdlr(usb_ip_port,USB_HCD_NO_RESPONSE, 0);
+ }
+ else if (CSR0&USB_CSR0_NAKTIMEOUT)
+ {
+ // QQ test --> Host send more then 1 Setup packet & cause Device never response. Data sage may be IN or OUT.
+ drv_trace1(TRACE_FUNC, (kal_uint32)USB_HCD_TX_EPN_TIMEOUT, 0);
+ USB_Dbg_Trace(USB_HCD_NAKTIMEOUT, 0, 0);
+
+ g_UsbHcdInfo[usb_ip_port].ep0_fifo_intr = KAL_FALSE;
+ g_UsbHcdInfo[usb_ip_port].ep0_setup = KAL_FALSE;
+ g_UsbHcdInfo[usb_ip_port].ep0_status = KAL_FALSE;
+
+ USB_DRV_WriteReg8(USB_NAKLIMIT0_HCD(USB_BaseAddr[usb_ip_port]),0x00); // QQ Test
+ USB_DRV_ClearBits(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), USB_CSR0_NAKTIMEOUT);
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), USB_CSR0_FLUSHFIFO);
+ g_UsbHcdInfo[usb_ip_port].ep0_hdlr(usb_ip_port,USB_HCD_TIMEOUT, 0);
+ }
+ else
+ {
+ USB_Dbg_Trace(USB_HCD_EP0_INTR, (kal_uint32)g_UsbHcdInfo[usb_ip_port].ep0_setup, (kal_uint32)g_UsbHcdInfo[usb_ip_port].ep0_status);
+
+ if(g_UsbHcdInfo[usb_ip_port].ep0_fifo_intr == KAL_TRUE)
+ {
+ g_UsbHcdInfo[usb_ip_port].ep0_fifo_intr = KAL_FALSE;
+
+ if(g_UsbHcdInfo[usb_ip_port].ep0_setup == KAL_TRUE)
+ {
+ /* Setup and status packet must be single packet */
+ g_UsbHcdInfo[usb_ip_port].ep0_setup = KAL_FALSE;
+
+ if(CSR0&USB_CSR0_SETUPPKT)
+ {
+ CSR0 &= ~(USB_CSR0_SETUPPKT|USB_CSR0_TXPKTRDY);
+ CSR0 |= USB_CSR0_FLUSHFIFO;
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), CSR0);
+ g_UsbHcdInfo[usb_ip_port].ep0_hdlr(usb_ip_port,USB_HCD_NO_RESPONSE, 0);
+ }
+ else
+ {
+ g_UsbHcdInfo[usb_ip_port].ep0_hdlr(usb_ip_port,USB_HCD_OK, g_UsbHcdInfo[usb_ip_port].ep0_info.sofar);
+ }
+ }
+ else if(g_UsbHcdInfo[usb_ip_port].ep0_status == KAL_TRUE)
+ {
+ g_UsbHcdInfo[usb_ip_port].ep0_status = KAL_FALSE;
+
+ /* Clear status bit */
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), 0x00);
+ g_UsbHcdInfo[usb_ip_port].ep0_hdlr(usb_ip_port,USB_HCD_OK, g_UsbHcdInfo[usb_ip_port].ep0_info.sofar);
+ }
+ else if(g_UsbHcdInfo[usb_ip_port].ep0_info.direction == USB_EP_RX_DIR)
+ {
+ /* Read the receive packet length */
+ pkt_length = USB_HCD_EP0_Pkt_Len(common_str);
+
+ if((g_UsbHcdInfo[usb_ip_port].ep0_info.sofar + pkt_length) > g_UsbHcdInfo[usb_ip_port].ep0_info.data_length)
+ {
+ pkt_length = g_UsbHcdInfo[usb_ip_port].ep0_info.data_length - g_UsbHcdInfo[usb_ip_port].ep0_info.sofar;
+}
+
+ USB_HCD_EPFIFORead(common_str,usb_ep_str, pkt_length, &g_UsbHcdInfo[usb_ip_port].ep0_info.p_data[g_UsbHcdInfo[usb_ip_port].ep0_info.sofar]);
+
+ g_UsbHcdInfo[usb_ip_port].ep0_info.sofar += pkt_length;
+
+ USB_Dbg_Trace(USB_HCD_EP0_Data, (kal_uint32)g_UsbHcdInfo[usb_ip_port].ep0_info.sofar, (kal_uint32)g_UsbHcdInfo[usb_ip_port].ep0_info.data_length);
+
+ CSR0 &= ~USB_CSR0_RXPKTRDY; //QQ Test
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), CSR0); // QQ Test
+
+
+ drv_trace2(TRACE_FUNC, (kal_uint32)USB_HCD_EP0,g_UsbHcdInfo[usb_ip_port].ep0_info.sofar, g_UsbHcdInfo[usb_ip_port].ep0_info.data_length);
+
+ if((g_UsbHcdInfo[usb_ip_port].ep0_info.sofar == g_UsbHcdInfo[usb_ip_port].ep0_info.data_length)
+ ||(pkt_length < g_UsbHcdInfo[usb_ip_port].ep0_info.max_packet_size))
+ {
+ /* callback to USB stack */
+
+// drv_trace4(TRACE_FUNC, (kal_uint32)USB_HCD_EP0_RX,0,g_UsbHcdInfo[usb_ip_port].ep0_info.sofar, g_UsbHcdInfo[usb_ip_port].ep0_info.data_length,g_UsbHcdInfo[usb_ip_port].ep0_info.max_packet_size);
+ g_UsbHcdInfo[usb_ip_port].ep0_hdlr(usb_ip_port,USB_HCD_OK, g_UsbHcdInfo[usb_ip_port].ep0_info.sofar);
+ }
+ else
+ {
+ /* Receive this pcket, and request for next packet */
+ g_UsbHcdInfo[usb_ip_port].ep0_fifo_intr = KAL_TRUE;
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), (CSR0|USB_CSR0_REQPKT));
+ }
+ }
+ else if(g_UsbHcdInfo[usb_ip_port].ep0_info.direction == USB_EP_TX_DIR)
+ {
+ if((g_UsbHcdInfo[usb_ip_port].ep0_info.data_length-g_UsbHcdInfo[usb_ip_port].ep0_info.sofar)
+ >g_UsbHcdInfo[usb_ip_port].ep0_info.max_packet_size)
+ pkt_length = g_UsbHcdInfo[usb_ip_port].ep0_info.max_packet_size;
+ else
+ pkt_length = g_UsbHcdInfo[usb_ip_port].ep0_info.data_length-g_UsbHcdInfo[usb_ip_port].ep0_info.sofar;
+
+ if (pkt_length == 0) //all data has already sent out
+ {
+ g_UsbHcdInfo[usb_ip_port].ep0_hdlr(usb_ip_port,USB_HCD_OK, g_UsbHcdInfo[usb_ip_port].ep0_info.sofar);
+ }
+ else
+ {
+ /* Write data packet to FIFO */
+ USB_HCD_EPFIFOWrite(common_str,usb_ep_str, pkt_length, &g_UsbHcdInfo[usb_ip_port].ep0_info.p_data[g_UsbHcdInfo[usb_ip_port].ep0_info.sofar]);
+ g_UsbHcdInfo[usb_ip_port].ep0_info.sofar += pkt_length;
+ g_UsbHcdInfo[usb_ip_port].ep0_fifo_intr = KAL_TRUE;
+
+ USB_Dbg_Trace(USB_HCD_EP0_Data, (kal_uint32)g_UsbHcdInfo[usb_ip_port].ep0_info.sofar, (kal_uint32)g_UsbHcdInfo[usb_ip_port].ep0_info.data_length);
+
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), 0);
+ USB_DRV_WriteReg(USB_CSR0_HCD(USB_BaseAddr[usb_ip_port]), USB_CSR0_TXPKTRDY);
+ }
+
+ USB_Dbg_Trace(USB_HCD_SEND_DATA_DONE, ep_num, 0);
+ }
+ }
+ else
+ {
+ USB_Dbg_Trace(USB_HCD_UNEXPECTED_EP0_INTR, 0, 0);
+ }
+ }
+ }
+
+ /* Check for Bulk TX interrupt */
+ /* TX interrupt : 1.TxPktRdy is clear, 2. RXSTALL is set */
+ for(ep_num = 1; ep_num <= MAX_TX_EP_NUM; ep_num++)
+ {
+ if (IntrTx&(0x01 <<ep_num))
+ {
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), ep_num);
+ TXCSR = USB_DRV_Reg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]));
+
+ USB_Dbg_Trace(USB_HCD_EPN_TX_INTR, ep_num, TXCSR);
+
+ if((TXCSR&USB_TXCSR_RXSTALL) != 0)
+ {
+ drv_trace1(TRACE_FUNC, (kal_uint32)USB_HCD_TX_EPN_STALL, ep_num);
+
+ g_UsbHcdInfo[usb_ip_port].ep_tx_fifo_intr[ep_num-1] = KAL_FALSE;
+
+ /* Stop running DMA */
+ USB_HCD_DMA_Stop(usb_ip_port,ep_num, USB_EP_TX_DIR);
+
+ /* Clear RXSTALL bit */
+ TXCSR &= ~USB_TXCSR_RXSTALL;
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), TXCSR);
+
+ if(g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[ep_num-1] != NULL)
+ g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[ep_num-1](usb_ip_port,USB_HCD_STALL, (kal_uint32)USB_EP_TX_DIR);
+ }
+ else if((TXCSR&USB_TXCSR_ERROR) != 0)
+ {
+ drv_trace1(TRACE_FUNC, (kal_uint32)USB_HCD_TX_EPN_ERROR, ep_num);
+
+ g_UsbHcdInfo[usb_ip_port].ep_tx_fifo_intr[ep_num-1] = KAL_FALSE;
+
+ /* Because of bad cable */
+ /* Stop running DMA */
+ USB_HCD_DMA_Stop(usb_ip_port,ep_num, USB_EP_TX_DIR);
+
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_TXCSR_ERROR);
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), (USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG));
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), (USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG));
+
+ g_UsbHcdInfo[usb_ip_port].ep_tx_flush_intr[ep_num-1] = KAL_TRUE;
+
+ if(g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[ep_num-1] != NULL)
+ g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[ep_num-1](usb_ip_port,USB_HCD_NO_RESPONSE, (kal_uint32)USB_EP_TX_DIR);
+ }
+ else if((TXCSR&USB_TXCSR_NAKTIMEOUT) != 0)
+ {
+ drv_trace1(TRACE_FUNC, (kal_uint32)USB_HCD_TX_EPN_TIMEOUT, ep_num);
+
+ g_UsbHcdInfo[usb_ip_port].ep_tx_fifo_intr[ep_num-1] = KAL_FALSE;
+
+ /* Because of bad cable */
+ /* Stop running DMA */
+ USB_HCD_DMA_Stop(usb_ip_port,ep_num, USB_EP_TX_DIR);
+
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_TXCSR_NAKTIMEOUT);
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), (USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG));
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), (USB_TXCSR_FLUSHFIFO|USB_TXCSR_CLRDATATOG));
+
+ g_UsbHcdInfo[usb_ip_port].ep_tx_flush_intr[ep_num-1] = KAL_TRUE;
+
+ if(g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[ep_num-1] != NULL)
+ g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[ep_num-1](usb_ip_port,USB_HCD_TIMEOUT, (kal_uint32)USB_EP_TX_DIR);
+ }
+ else
+ {
+ if(g_UsbHcdInfo[usb_ip_port].ep_tx_fifo_intr[ep_num-1] == KAL_TRUE)
+ {
+ g_UsbHcdInfo[usb_ip_port].ep_tx_fifo_intr[ep_num-1] = KAL_FALSE;
+
+ if(g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].data_length == g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].sofar)
+ {
+ if(g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[ep_num-1] != NULL)
+ g_UsbHcdInfo[usb_ip_port].ep_tx_hdlr[ep_num-1](usb_ip_port,USB_HCD_OK, g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].data_length);
+ }
+ else
+ {
+ if((g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].data_length-g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].sofar)
+ >g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].max_packet_size)
+ todo = g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].max_packet_size;
+ else
+ todo = g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].data_length-g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].sofar;
+
+ /* Write data packet to FIFO */
+ USB_HCD_EPFIFOWrite(common_str,usb_ep_str, todo, &g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].p_data[g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].sofar]);
+// USB_DRV_WriteReg8(USB_INDEX, ep_num);
+ g_UsbHcdInfo[usb_ip_port].ep_tx_info[ep_num-1].sofar += todo;
+ g_UsbHcdInfo[usb_ip_port].ep_tx_fifo_intr[ep_num-1] = KAL_TRUE;
+ USB_DRV_WriteReg(USB_TXCSR_HCD(USB_BaseAddr[usb_ip_port]), USB_TXCSR_TXPKTRDY);
+ }
+ }
+ else if(g_UsbHcdInfo[usb_ip_port].ep_tx_flush_intr[ep_num-1] == KAL_TRUE)
+ {
+ g_UsbHcdInfo[usb_ip_port].ep_tx_flush_intr[ep_num-1] = KAL_FALSE;
+ }
+ else
+ {
+ USB_Dbg_Trace(USB_HCD_UNEXPECTED_TX_INTR, 0, 0);
+ }
+ }
+ }
+ }
+
+ /* Check for Bulk RX interrupt */
+ /* RX interrupt : 1.RxPktRdy is set, 2. RXSTALL is set */
+ for(ep_num = 1; ep_num <= MAX_RX_EP_NUM; ep_num++)
+ {
+ if(IntrRx&(0x01<<ep_num))
+ {
+ USB_DRV_WriteReg8(USB_INDEX_HCD(USB_BaseAddr[usb_ip_port]), ep_num);
+ RXCSR = USB_DRV_Reg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]));
+
+ USB_Dbg_Trace(USB_HCD_EPN_RX_INTR, ep_num, RXCSR);
+
+ if((RXCSR&USB_RXCSR_RXSTALL) != 0)
+ {
+ drv_trace1(TRACE_FUNC, (kal_uint32)USB_HCD_RX_EPN_STALL, ep_num);
+
+ /* Stop running DMA */
+ USB_HCD_DMA_Stop(usb_ip_port,ep_num, USB_EP_RX_DIR);
+
+ RXCSR &= ~USB_RXCSR_RXSTALL;
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), RXCSR);
+
+ if(g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num-1] != NULL)
+ g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num-1](usb_ip_port,USB_HCD_STALL, (kal_uint32)USB_EP_RX_DIR);
+ }
+ else if((RXCSR&USB_RXCSR_ERROR) != 0)
+ {
+ drv_trace1(TRACE_FUNC, (kal_uint32)USB_HCD_RX_EPN_ERROR, ep_num);
+
+ /* Because of bad cable */
+ /* Stop running DMA */
+ USB_HCD_DMA_Stop(usb_ip_port,ep_num, USB_EP_RX_DIR);
+
+ RXCSR &= ~USB_RXCSR_ERROR;
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), RXCSR);
+
+ if(g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num-1] != NULL)
+ g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num-1](usb_ip_port,USB_HCD_NO_RESPONSE, (kal_uint32)USB_EP_RX_DIR);
+ }
+ else if((RXCSR&USB_RXCSR_NAKTIMEOUT) != 0)
+ {
+ drv_trace1(TRACE_FUNC, (kal_uint32)USB_HCD_RX_EPN_TIMEOUT, ep_num);
+
+ /* Because of bad cable */
+ /* Stop running DMA */
+ USB_HCD_DMA_Stop(usb_ip_port,ep_num, USB_EP_RX_DIR);
+
+ RXCSR &= ~(USB_RXCSR_NAKTIMEOUT|USB_RXCSR_REQPKT);
+ USB_DRV_WriteReg(USB_RXCSR_HCD(USB_BaseAddr[usb_ip_port]), RXCSR);
+
+ if(g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num-1] != NULL)
+ g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num-1](usb_ip_port,USB_HCD_TIMEOUT, (kal_uint32)USB_EP_RX_DIR);
+ }
+ else if((RXCSR&USB_RXCSR_RXPKTRDY) != 0)
+ {
+ if(g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num-1] != NULL)
+ {
+ g_UsbHcdInfo[usb_ip_port].ep_rx_hdlr[ep_num -1](usb_ip_port,USB_HCD_OK, g_UsbHcdInfo[usb_ip_port].ep_rx_info[ep_num-1].sofar);
+ }
+ else
+ {
+ ASSERT(0);
+ }
+ }
+ else
+ {
+ if(g_UsbHcdInfo[usb_ip_port].ep_rx_flush_intr[ep_num-1] == KAL_TRUE)
+ {
+ g_UsbHcdInfo[usb_ip_port].ep_rx_flush_intr[ep_num-1] = KAL_FALSE;
+ }
+ else
+ {
+ USB_Dbg_Trace(USB_HCD_UNEXPECTED_RX_INTR, 0, 0);
+ }
+ }
+ }
+ }
+
+ /* A or B side plug out will both trigger this dis_conn interrupt */
+ if((IntrUSB&USB_INTRUSB_DISCON) != 0)
+ {
+// USB_DRV_WriteReg8(USB_INTRUSBE_HCD(USB_BaseAddr[usb_ip_port]), ~USB_INTRUSBE_SOF);
+ USB_Dbg_Trace(USB_HCD_DISCONN, 0, USB_DRV_Reg8(USB_OPSTATE_HCD(USB_BaseAddr[usb_ip_port])));
+ drv_trace0(TRACE_FUNC, (kal_uint32)USB_HCD_DISCONN_INTR);
+ USB_HCD_Disconn_Hdlr(usb_ip_port);
+ }
+
+ b_dev_unmask_irq = USB_HCD_Get_UnMask_Irq(0);
+ b_host_hisr_is_handled = KAL_TRUE;
+
+ if((IntrUSB&USB_INTRUSB_DISCON) != 0)
+ {
+ }
+
+ if((IntrUSB&USB_INTRUSB_SUSPEND) != 0)
+ {
+ }
+
+
+ if((IntrUSB&USB_INTRUSB_SOF) != 0)
+ {
+ }
+
+ if(b_host_hisr_is_handled == KAL_FALSE)
+ EXT_ASSERT(0, USB_DRV_Reg(USB_INTRTX_HCD(USB_BaseAddr[usb_ip_port])), USB_DRV_Reg(USB_INTRRX_HCD(USB_BaseAddr[usb_ip_port])), 0);
+
+ /* Clear interrupt and unmask interrupt */
+ IRQClearInt(IRQ_IC_USB1_CODE);
+// g_UsbHcdInfo[usb_ip_port].is_ProHISR = KAL_FALSE;
+
+ if((g_UsbHcdInfo[usb_ip_port].b_unmask_irq == KAL_TRUE)&&(b_dev_unmask_irq == KAL_TRUE))
+ {
+ IRQUnmask(IRQ_IC_USB1_CODE);
+ }
+ else
+ {
+// USB_Dbg_Trace(USB_HCD_MASK_HISR, (kal_uint32)g_UsbHcdInfo[usb_ip_port].b_unmask_irq, (kal_uint32)b_dev_unmask_irq);
+ }
+
+}
+#endif // IC USB
+
+//====================DCL API =======================//
+DCL_STATUS DCL_USB_CTRL_API_IC_USB_Drv_Create_ISR(DCL_CTRL_DATA_T *data)
+{
+#if defined(__IC_USB_ENABLE__)
+ IRQ_Register_LISR(IRQ_IC_USB1_CODE, IC_USB_LISR,"ICUSB");
+ DRV_Register_HISR(DRV_IC_USB1_HISR_ID, IC_USB_HISR);
+#endif
+ return STATUS_OK;
+}
+
+DCL_STATUS DCL_USB_CTRL_API_IC_USB_Drv_Activate_ISR(DCL_CTRL_DATA_T *data)
+{
+#if defined(__IC_USB_ENABLE__)
+ kal_uint8 usb_ip_port = ICUSB_PORT_1; //IC USB Port
+
+ g_UsbHcdInfo[usb_ip_port].b_unmask_irq = KAL_TRUE;
+ IRQSensitivity(IRQ_IC_USB1_CODE,LEVEL_SENSITIVE);
+ IRQUnmask(IRQ_IC_USB1_CODE);
+#endif
+ return STATUS_OK;
+}
+
+DCL_STATUS DCL_USB_CTRL_API_IC_USBDMA_Drv_Create_ISR(DCL_CTRL_DATA_T *data)
+{
+#if defined(__IC_USB_ENABLE__)
+ IRQ_Register_LISR(IRQ_IC_USBDMA1_CODE, IC_USBDMA_LISR, "IC_USBDMA");
+ DRV_Register_HISR(DRV_IC_USBDMA1_HISR_ID, IC_USBDMA_HISR);
+#endif
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DCL_USB_CTRL_API_IC_USBDMA_Drv_Activate_ISR(DCL_CTRL_DATA_T *data)
+{
+#if defined(__IC_USB_ENABLE__)
+ IRQSensitivity(IRQ_IC_USBDMA1_CODE, LEVEL_SENSITIVE);
+ IRQUnmask(IRQ_IC_USBDMA1_CODE);
+#endif
+ return STATUS_OK;
+}
+
+DCL_STATUS DCL_USB_CTRL_API_IC_USB_PDNmode(DCL_CTRL_DATA_T *data)
+{
+#if defined(__IC_USB_ENABLE__)
+ USB_HCD_CTRL_SET_T *data;
+ kal_bool turn_off =&data->rHCD_Set;
+
+#if defined(DRV_USB_IP_V3)
+
+ if (turn_off == KAL_TRUE)
+ {
+ USB_DRV_ClearBits8(USB_U1PHYCR0_1, USB_U1PHYCR0_1_RG_USB11_FSLS_ENBGRI);
+ USB_DRV_ClearBits8(0x610d0900,0x02); // IC USB special clock source
+ }
+ else
+ {
+ USB_DRV_SetBits8(0x610d0320, 0x06); //USB PDN : ICUSB & USB20
+ USB_DRV_SetBits8(0x61140280, 0x80); // UPLL CLock
+ USB_DRV_SetBits8(0x610d0900,0x02); // IC USB special clock source
+
+ USB_DRV_ClearBits8(USB_U1PHYCR1_1, USB_U1PHYCR1_1_RG_USB11_USBRESERVED); //switch to IC USB mode
+ USB_DRV_SetBits8(USB_U1PHYCR0_1, USB_U1PHYCR0_1_RG_USB11_FSLS_ENBGRI);
+ }
+
+ return STATUS_OK;
+#endif
+#endif
+ return STATUS_INVALID_CMD;
+}
+
+
+
+
+DCL_USB_CTRL_API DCL_USB_HCD_API_T[] =
+{
+ DCL_USB_CTRL_API_USB_HCD_HW_Mapping_EP,
+ DCL_USB_CTRL_API_USB_HCD_Reset_Device,
+ DCL_USB_CTRL_API_USB_HCD_SWRST,
+ DCL_USB_CTRL_API_USB_HCD_EnSysIntr,
+ DCL_USB_CTRL_API_USB_HCD_VBusEnable,
+ DCL_USB_CTRL_API_USB_HCD_Host_Mode_Detect,
+ DCL_USB_CTRL_API_USB_HCD_Is_HNP_SUPPORT,
+ DCL_USB_CTRL_API_USB_HCD_Is_RemoteWakeup_SUPPORT,
+ DCL_USB_CTRL_API_USB_HCD_Is_SRP_SUPPORT,
+ DCL_USB_CTRL_API_USB_HCD_Is_High_Speed,
+ DCL_USB_CTRL_API_USB_HCD_Reset_Resource,
+ DCL_USB_CTRL_API_USB_HCD_Init_Drv_Info,
+ DCL_USB_CTRL_API_USB_HCD_Release_Drv_Info,
+ DCL_USB_CTRL_API_USB_HCD_Register_Drv_Info,
+ DCL_USB_CTRL_API_USB_HCD_Set_UnMask_Irq,
+ DCL_USB_CTRL_API_USB_HCD_Get_UnMask_Irq,
+ DCL_USB_CTRL_API_USB_HCD_Dis_Attach,
+ DCL_USB_CTRL_API_USB_HCD_En_Attach,
+ DCL_USB_CTRL_API_USB_HCD_Initialize_Drv,
+ DCL_USB_CTRL_API_USB_HCD_Release_Drv,
+ DCL_USB_CTRL_API_USB_HCD_SetAddress,
+ DCL_USB_CTRL_API_USB_HCD_Resume,
+ DCL_USB_CTRL_API_USB_HCD_Suspend,
+ DCL_USB_CTRL_API_USB_HCD_Delay_Reset_Device,
+ DCL_USB_CTRL_API_USB_HCD_Set_EP_Max_Pkt,
+ DCL_USB_CTRL_API_USB_HCD_Clear_Data01,
+ DCL_USB_CTRL_API_USB_HCD_EP_Interval,
+ DCL_USB_CTRL_API_USB_HCD_EP0En,
+ DCL_USB_CTRL_API_USB_HCD_EP0_Data_Length,
+ DCL_USB_CTRL_API_USB_HCD_EP_Rx_Pkt_Len,
+ DCL_USB_CTRL_API_USB_HCD_Config_TxEP_Type,
+ DCL_USB_CTRL_API_USB_HCD_TxEPInit,
+ DCL_USB_CTRL_API_USB_HCD_Config_RxEP_Type,
+ DCL_USB_CTRL_API_USB_HCD_RxEPInit,
+ DCL_USB_CTRL_API_USB_HCD_TxEPEn,
+ DCL_USB_CTRL_API_USB_HCD_RxEPEn,
+ DCL_USB_CTRL_API_USB_HCD_TxEPDis,
+ DCL_USB_CTRL_API_USB_HCD_RxEPDis,
+ DCL_USB_CTRL_API_USB_HCD_Send_Resume,
+ DCL_USB_CTRL_API_USB_HCD_Send_Suspend,
+ DCL_USB_CTRL_API_USB_HCD_Send_Req,
+ DCL_USB_CTRL_API_USB_HCD_Recv_Req,
+ DCL_USB_CTRL_API_USB_HCD_EP0_Setup_Req,
+ DCL_USB_CTRL_API_USB_HCD_EP0_Data_Req,
+ DCL_USB_CTRL_API_USB_HCD_EP0_Status_Req,
+ DCL_USB_CTRL_API_USB_HCD_Switch_DMA_Burst_mode,
+ DCL_USB_CTRL_API_USB_HCD_Register_DMA_Channel,
+ DCL_USB_CTRL_API_USB_HCD_Get_DMA_Real_Count,
+ DCL_USB_CTRL_API_USB_HCD_Get_DMA_Channel,
+ DCL_USB_CTRL_API_USB_HCD_Stop_DMA_Channel,
+ DCL_USB_CTRL_API_USB_HCD_Free_DMA_Channel,
+ DCL_USB_CTRL_API_USB_HCD_EPFIFORead,
+ DCL_USB_CTRL_API_USB_HCD_EPFIFOWrite,
+ DCL_USB_CTRL_API_USB_HCD_DMA_Setup,
+ DCL_USB_CTRL_API_USB_HCD_Disconn_Hdlr,
+ DCL_USB_CTRL_API_USB_HCD_Conn_Hdlr,
+ DCL_USB_CTRL_API_USB_HCD_HISR,
+ DCL_USB_CTRL_API_IC_USB_Drv_Create_ISR,
+ DCL_USB_CTRL_API_IC_USB_Drv_Activate_ISR,
+ DCL_USB_CTRL_API_IC_USBDMA_Drv_Create_ISR,
+ DCL_USB_CTRL_API_IC_USBDMA_Drv_Activate_ISR,
+ DCL_USB_CTRL_API_IC_USB_PDNmode,
+ DCL_USB_CTRL_API_USB_HCD_VBUS_OFF
+};
+
+
+/*************************************************************************
+* FUNCTION
+* DclUSB_HCD_Control
+*
+* DESCRIPTION
+* This function is to send command to control the USB host module.
+*
+* PARAMETERS
+* handle: A valid handle return by DclUSB_HCD_Open()
+* cmd: A control command for USB host module
+// Should be added
+*
+* data: The data of the control command
+// Should be added
+*
+* RETURNS
+* STATUS_OK: command is executed successfully.
+* STATUS_FAIL: command is failed.
+* STATUS_INVALID_CMD: It's a invalid command.
+*
+*************************************************************************/
+DCL_STATUS DclUSB_HCD_Control(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
+{
+ /* Check open or not and handle validity */
+ if((g_USB_Hcd_Open == KAL_FALSE)||(DCL_USB_HCD_CHECK_HANDLE_IS_VALID(handle) == 0))
+ {
+ ASSERT(0);
+
+ if(g_USB_Hcd_Open == KAL_FALSE)
+ return STATUS_INVALID_OPERATION;
+ else
+ return STATUS_INVALID_DCL_HANDLE;
+ }
+
+ return DCL_USB_HCD_API_T[cmd](data);
+}
+
+#else
+
+DCL_STATUS DclUSB_HCD_Initialize(void)
+{
+ return STATUS_OK;
+}
+
+
+DCL_HANDLE DclUSB_HCD_Open(DCL_DEV dev, DCL_FLAGS flags)
+{
+ return (DCL_HANDLE)DCL_HANDLE_NONE;
+}
+
+
+DCL_STATUS DclUSB_HCD_ReadData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
+{
+ return STATUS_UNSUPPORTED;
+}
+
+
+DCL_STATUS DclUSB_HCD_WriteData(DCL_HANDLE handle, DCL_BUFF *buff, DCL_BUFF_LEN buf_len, DCL_OPTIONS options)
+{
+ return STATUS_UNSUPPORTED;
+}
+
+
+DCL_STATUS DclUSB_HCD_Configure(DCL_HANDLE handle, DCL_CONFIGURE_T *configure)
+{
+ return STATUS_UNSUPPORTED;
+}
+
+
+DCL_STATUS DclUSB_HCD_RegisterCallback(DCL_HANDLE handle, DCL_EVENT event, PFN_DCL_CALLBACK callback)
+{
+ return STATUS_UNSUPPORTED;
+}
+
+
+DCL_STATUS DclUSB_HCD_Close(DCL_HANDLE handle)
+{
+ return STATUS_OK;
+}
+
+
+DCL_STATUS DclUSB_HCD_Control(DCL_HANDLE handle, DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data)
+{
+ return STATUS_OK;
+}
+
+#endif /* __OTG_ENABLE__ */
+
+//#endif /* DCL_USB_INTERFACE */
+
diff --git a/mcu/driver/connectivity/usb_driver/src/upll_ctrl.c b/mcu/driver/connectivity/usb_driver/src/upll_ctrl.c
new file mode 100644
index 0000000..c99c767
--- /dev/null
+++ b/mcu/driver/connectivity/usb_driver/src/upll_ctrl.c
@@ -0,0 +1,366 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * upll_ctrl.c
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file implements upll control functions
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+//#include "kal_non_specific_general_types.h"
+//#include "kal_release.h"
+#include "kal_public_api.h"
+#include "init.h"
+#include "drv_comm.h"
+#include "reg_base.h"
+#include "config_hw.h"
+#include "upll_ctrl.h"
+#include "usb_drv.h"
+#include "drvpdn.h"
+#include "kal_public_api.h"
+
+
+
+/* Record all upll enable owners */
+kal_uint32 g_upll_owner = 0;
+
+
+/*
+* FUNCTION
+* UPLL_Enable
+*
+* DESCRIPTION
+* This function is to enable UPLL
+*
+* CALLS
+* It is called to enable UPLL
+*
+* PARAMETERS
+* owner = UPLL owner
+*
+* RETURNS
+* None
+*
+* GLOBALS AFFECTED
+* external_global
+*/
+
+void UPLL_Enable(UPLL_OWNER owner)
+{
+#if (defined(DRV_UPLL_V1)||defined(DRV_UPLL_V2)||defined(DRV_UPLL_V3)||defined(DRV_UPLL_V4)||defined(DRV_UPLL_V5)||defined(DRV_UPLL_V6)||defined(DRV_UPLL_V7)||defined(DRV_UPLL_V8) || defined(DRV_USB_UPLL_MT50_SERIES))
+
+ kal_uint32 savedMask;
+
+ if(owner >= UPLL_OWNER_MAX)
+ EXT_ASSERT(0, (kal_uint32)owner, g_upll_owner, 0);
+
+ savedMask = SaveAndSetIRQMask();
+
+ if(g_upll_owner == 0)
+ {
+#if defined(DRV_UPLL_V1)
+ USB_DRV_SetBits(DRVPDN_CON0_CLR , DRVPDN_CON0_UPLL);
+#elif defined(DRV_UPLL_V2)
+ /* hardware issue */
+ USB_PDNDisable(USB_PDN_OWNER_UPLL);
+ USB_DRV_SetBits(DRVPDN_CON0_CLR , DRVPDN_CON0_UPLL);
+#elif defined(DRV_UPLL_V3)
+ /* select UPLL clock source from PLL */
+ USB_DRV_SetBits(PLL , 0x0040);
+#elif defined(DRV_UPLL_V4)
+ USB_DRV_ClearBits(DRVPDN_CON0 , DRVPDN_CON0_PLL2);
+ /* disable USB clock from external clock */
+ USB_DRV_ClearBits(CLK_CON , 0x4000);
+ USB_DRV_SetBits(PLLSEL , 0x0008);
+#elif defined(DRV_UPLL_V5)
+ USB_DRV_SetBits(PLL , 0x0040);
+#elif defined(DRV_UPLL_V6)
+ USB_DRV_SetBits(PDN_CON , 0x0010);
+#elif defined(DRV_UPLL_V7)
+ USB_DRV_SetBits(UPLL_CON1, 0x0002);
+#elif defined(DRV_UPLL_V8)
+ USB_DRV_SetBits(GPLL_CON0, 0x0080);
+#elif defined(DRV_USB_UPLL_MT50_SERIES)
+ if (SW_SEC_0 == INT_SW_SecVersion())
+ {
+ PDN_CLR(PDN_USB_48M);
+ }
+#endif
+
+ }
+ g_upll_owner |= 1<<(kal_uint32)owner;
+ RestoreIRQMask(savedMask);
+#endif
+
+}
+
+/*
+* FUNCTION
+* UPLL_Disable
+*
+* DESCRIPTION
+* This function is to disable UPLL
+*
+* CALLS
+* It is called to disable UPLL
+*
+* PARAMETERS
+* owner = UPLL owner
+*
+* RETURNS
+* None
+*
+* GLOBALS AFFECTED
+* external_global
+*/
+void UPLL_Disable(UPLL_OWNER owner)
+{
+#if (defined(DRV_UPLL_V1)||defined(DRV_UPLL_V2)||defined(DRV_UPLL_V3)||defined(DRV_UPLL_V4)||defined(DRV_UPLL_V5)||defined(DRV_UPLL_V6)||defined(DRV_UPLL_V7)||defined(DRV_UPLL_V8)|| defined(DRV_USB_UPLL_MT50_SERIES))
+
+ kal_uint32 savedMask;
+
+ if(owner >= UPLL_OWNER_MAX)
+ EXT_ASSERT(0, (kal_uint32)owner, g_upll_owner, 0);
+
+ savedMask = SaveAndSetIRQMask();
+ g_upll_owner &= ~(1<<(kal_uint32)owner);
+ if(g_upll_owner == 0)
+ {
+#if defined(DRV_UPLL_V1)
+ USB_DRV_SetBits(DRVPDN_CON0_SET , DRVPDN_CON0_UPLL);
+#elif defined(DRV_UPLL_V2)
+ /* hardware issue */
+ USB_PDNEnable(USB_PDN_OWNER_UPLL);
+ USB_DRV_SetBits(DRVPDN_CON0_SET , DRVPDN_CON0_UPLL);
+#elif defined(DRV_UPLL_V3)
+ /* select UPLL clock source bypassed PLL */
+ USB_DRV_ClearBits(PLL , 0x0040);
+#elif defined(DRV_UPLL_V4)
+// DRV_Reg(DRVPDN_CON0) |= (DRVPDN_CON0_PLL2);
+#elif defined(DRV_UPLL_V5)
+
+#elif defined(DRV_UPLL_V6)
+// DRV_Reg(PDN_CON)&= ~(0x0010); // set this bit will also clear MPLL
+#elif defined(DRV_UPLL_V7)
+// DRV_Reg(UPLL_CON1)&= ~(0x0002);
+#elif defined(DRV_UPLL_V8)
+ USB_DRV_ClearBits(GPLL_CON0, 0x0080);
+#elif defined(DRV_USB_UPLL_MT50_SERIES)
+ if (SW_SEC_0 == INT_SW_SecVersion())
+ {
+ PDN_SET(PDN_USB_48M);
+ }
+#endif
+ }
+ RestoreIRQMask(savedMask);
+#endif
+
+}
+
+
+
+
diff --git a/mcu/driver/connectivity/usb_driver/src/usb_dummy.c b/mcu/driver/connectivity/usb_driver/src/usb_dummy.c
new file mode 100644
index 0000000..c9ad0ac
--- /dev/null
+++ b/mcu/driver/connectivity/usb_driver/src/usb_dummy.c
@@ -0,0 +1,153 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usb_dummy.c
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file implements TST & META Dummy function
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+#include "drv_comm.h"
+#include "uart_sw.h"
+//#include "kal_non_specific_general_types.h"
+#include "kal_public_defs.h" //MSBB change #include "stack_config.h"
+
+
+//#include "reg_base.h"
+//#include "config_hw.h"
+//#include "init.h"
+//#include "cache_sw.h"
+//#include "drvpdn.h"
+//#include "intrCtrl.h"
+//#include "drv_hisr.h"
+//#include "gpio_sw.h"
+//#include "dma_hw.h"
+//#include "dma_sw.h"
+//#include "upll_ctrl.h"
+//#include "usb_hw.h"
+//#include "usb_drv.h"
+//#include "usb_drv_pri.h"
+//#include "usb_custom.h"
+
+
+void USB_Acm_Ring_Buffer_Threshold_Enable(UART_PORT port, kal_bool bset, module_type ownerid)
+{
+}
+
+kal_uint16 USB2UART_FT_Get_Max_Len(void)
+{
+ return 0;
+}
+
+void USB2UART_FT_Tx_Byte(kal_uint8* addr, kal_uint16 len)
+{
+}
+
+void USB2UART_FT_Tx_Word(kal_uint32* addr, kal_uint16 len)
+{
+}
+
+void USB2UART_FT_Tx_Stop(void)
+{
+}
+
+kal_uint16 USB2UART_FT_Rx_Byte(kal_uint8* addr, kal_uint16 len)
+{
+ return 0;
+}
+
+kal_uint8 USB_Acm_FT_Port(void)
+{
+ return 0;
+}
+
diff --git a/mcu/driver/connectivity/usb_driver/src/usb_phy_drv.c b/mcu/driver/connectivity/usb_driver/src/usb_phy_drv.c
new file mode 100644
index 0000000..d6b8cb0
--- /dev/null
+++ b/mcu/driver/connectivity/usb_driver/src/usb_phy_drv.c
@@ -0,0 +1,350 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usb_phy_drv.c
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file implements usb phy hardware related functions
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+//#include "kal_non_specific_general_types.h"
+#include "drv_features.h"
+#include "drv_comm.h"
+#include "reg_base.h"
+//#include "config_hw.h"
+#include "init.h"
+//#include "drvpdn.h"
+//#include "drv_hisr.h"
+//#include "gpio_sw.h"
+//#include "upll_ctrl.h"
+
+#include "usb_hw.h"
+#include "usb_drv.h"
+//#include "usb_drv_pri.h"
+#include "usb_phy_drv.h"
+#include "usb_custom.h"
+
+#ifdef __OTG_ENABLE__
+//#include "stack_common.h" /* sap_type */
+//#include "stack_msgs.h" /* msg_type */
+//#include "app_ltlcom.h" /* Task message communiction */
+//#include "otg_drv.h"
+//#include "otg_if.h"
+//#include "usb_hcd.h"
+//#include "usb_hcd_pri.h"
+#endif
+
+//#include "usb_debug_tool.h"
+//#include "usb_trc.h"
+
+#include "dcl.h"
+#include "dcl_pmic_features.h"
+#include "kal_general_types.h"
+
+
+
+
+#if defined(DRV_USB_IP_V1)||defined(DRV_USB_IP_V1_PLUS)||defined(DRV_USB_IP_V2)||defined(DRV_USB_IP_V3)||defined(DRV_USB_IP_V4)
+
+#if (defined(__USB_AND_UART_WITH_ONE_GPIO__)||defined(__USB_AND_UART_WITH_ONE_PORT__))
+void USB_UART_Share(kal_bool usb_mode)
+{
+#ifdef DRV_USB_PHY_USB_UART_SHARE_PAD //USB IP3
+
+
+#else //USB IP1 IP2
+ PMIC_Power_Control(KAL_FALSE);
+
+ if (usb_mode)
+ {
+ UART_and_USB_Switch(KAL_TRUE);
+ }
+ else
+ {
+ UART_and_USB_Switch(KAL_FALSE);
+ }
+#endif
+}
+#endif // defined(__USB_AND_UART_WITH_ONE_GPIO__)||defined(__USB_AND_UART_WITH_ONE_PORT__))
+#endif //(defined(DRV_USB_IP_V1)||defined(DRV_USB_IP_V1_PLUS)||defined(DRV_USB_IP_V2)||defined(DRV_USB_IP_V3)||defined(DRV_USB_IP_V4))
+
+
+
+
+
diff --git a/mcu/driver/connectivity/usb_driver/src/usblog_drv.c b/mcu/driver/connectivity/usb_driver/src/usblog_drv.c
new file mode 100644
index 0000000..bfaeecd
--- /dev/null
+++ b/mcu/driver/connectivity/usb_driver/src/usblog_drv.c
@@ -0,0 +1,296 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usblog_drv.c
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file implements USB logging hardware related functions
+ *
+ * Author:
+ * -------
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+#include "drv_comm.h"
+//#include "kal_non_specific_general_types.h"
+//#include "kal_release.h"
+#include "kal_public_api.h"
+#include "reg_base.h"
+#include "drvpdn.h"
+#include "intrCtrl.h"
+#include "drv_hisr.h"
+#include "usb_drv.h"
+#include "dsplog_hw.h"
+#include "usblog_drv.h"
+#include "init.h"
+//#include "usb_debug_tool.h"
+
+#include "kal_public_api.h"
+#include "kal_general_types.h"
+
+#ifdef DRV_USB_LOGGING_V8
+#include "mdci.h"
+#endif
+
+
diff --git a/mcu/driver/connectivity/usb_driver/src/usbms_cdrom.c b/mcu/driver/connectivity/usb_driver/src/usbms_cdrom.c
new file mode 100644
index 0000000..b1bb7f1
--- /dev/null
+++ b/mcu/driver/connectivity/usb_driver/src/usbms_cdrom.c
@@ -0,0 +1,90 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usbms_cdrom.c
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file implements usb adaption layer of CD-ROM for mass storage
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+
diff --git a/mcu/driver/connectivity/usb_driver/src/usbms_ram.c b/mcu/driver/connectivity/usb_driver/src/usbms_ram.c
new file mode 100644
index 0000000..d1b06e6
--- /dev/null
+++ b/mcu/driver/connectivity/usb_driver/src/usbms_ram.c
@@ -0,0 +1,303 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2005
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*****************************************************************************
+ *
+ * Filename:
+ * ---------
+ * usbms_ram.c
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * This file implements usb adaption layer of ram disk for mass storage
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *============================================================================
+ * HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+#ifdef __USB_MASS_STORAGE_ENABLE__
+
+#include "drv_comm.h"
+#include "usb_comm.h"
+#include "usb_drv.h"
+#include "usb.h"
+#include "usbms_drv.h"
+#include "usbms_adap.h"
+#include "usb_custom.h"
+
+
+
+/***********************************************
+ RAM Disk Related functions
+************************************************/
+#ifdef __USB_RAMDISK__
+
+static const kal_uint8 MBR[16]=
+{
+ 0x80,
+ 0x02,
+ 0x0a,
+ 0x00,
+ 0x01,
+ 0x03,
+ 0x50,
+ 0xf3,
+ 0x02,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x1e,
+ 0x00,
+ 0x00,
+ 0x00
+};
+
+
+static const kal_uint8 BRSIG[2]=
+{
+ 0x55,
+ 0xaa
+};
+
+
+static const kal_uint8 PBR[]=
+{ /*64*/
+ 0xE9,
+ 0x00,
+ 0x00,
+ 0x2A, /* 8 */
+ 0x64,
+ 0x38,
+ 0x65,
+ 0x39,
+ 0x49,
+ 0x48,
+ 0x43,
+ 0x00, /* 25 */
+ 0x02,
+ 0x01,
+ 0x01,
+ 0x00,
+ 0x01, /* 1FAT */
+ 0x10, /* 16 entries */
+ 0x00,
+ 0x1e,
+ 0x00,
+ 0xF8,
+ 0x01,
+ 0x00,
+ 0x10, /* no of tracks */
+ 0x00,
+ 0x04,
+ 0x00,
+ 0x02, /* 0x29 */
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x00,
+ 0x46,
+ 0x41,
+ 0x54,
+ 0x31,
+ 0x32,
+ 0x20,
+ 0x20,
+ 0x20,
+ 0x00,
+ 0x00
+};
+
+
+static kal_uint8 FAT_Str[3] =
+{
+ 0xf8,
+ 0xff,
+ 0xff
+};
+
+
+static kal_uint32 RAM_DISK_MEMORY[0x40000/4];
+
+void FAT_Init(void)
+{
+ kal_uint32 index;
+ kal_uint32 addr = (kal_uint32)RAM_DISK_MEMORY;
+ for(index =0;index<0x4000;index++)
+ *(volatile kal_uint8 *)(addr+index) = 0;
+
+ /*kal_mem_cpy(dst,src,len)*/
+ kal_mem_cpy((kal_uint8 *)(addr+0x1be),(kal_uint8 *)MBR,sizeof(MBR));
+ kal_mem_cpy((kal_uint8 *)(addr+0x1fe),(kal_uint8 *)BRSIG,sizeof(BRSIG));
+ kal_mem_cpy((kal_uint8 *)(addr+512*2),(kal_uint8 *)PBR,sizeof(PBR));
+ kal_mem_cpy((kal_uint8 *)(addr+512*2+0x1fe),(kal_uint8 *)BRSIG,sizeof(BRSIG));
+ kal_mem_cpy((kal_uint8 *)(addr+512*3),(kal_uint8 *)FAT_Str,sizeof(FAT_Str));
+}
+
+
+/* RAM Disk Driver APIs */
+static kal_bool usbms_read_ram( void *data, kal_uint32 LBA, kal_uint16 sec_len)
+{
+ kal_uint32 addr;
+ addr = LBA*512;
+ addr += (kal_uint32)RAM_DISK_MEMORY;
+ kal_mem_cpy(data, (void *)addr, (sec_len*512));
+ return KAL_TRUE;
+}
+
+
+static kal_bool usbms_write_ram(void *data, kal_uint32 LBA, kal_uint16 sec_len)
+{
+ kal_uint32 addr;
+ addr = LBA*512;
+ addr += (kal_uint32)RAM_DISK_MEMORY;
+ kal_mem_cpy((void *)addr, data, (sec_len*512));
+ return KAL_TRUE;
+}
+
+
+static USB_STORAGE_DEV_STATUS usbms_checkmedia_exist_ram(void)
+{
+ return USB_STORAGE_DEV_STATUS_OK;
+}
+
+
+static kal_bool usbms_format_ram(void)
+{
+ FAT_Init();
+ return KAL_TRUE;
+}
+
+
+static kal_bool usbms_prevmedia_removal_ram(kal_bool enable)
+{
+ return KAL_TRUE;
+}
+
+
+static kal_bool usbms_read_capacity_ram(kal_uint32 *max_lba, kal_uint32 *sec_len)
+{
+ *max_lba = (32-1);
+ *sec_len = 512;
+ return KAL_TRUE;
+}
+
+
+static USB_STORAGE_DEV_TYPE usbms_read_dev_type_ram(void)
+{
+ return USB_STORAGE_DEV_NONE;
+}
+
+
+USB_DiskDriver_STRUCT USB_RAM_drv =
+{
+ usbms_read_ram,
+ usbms_write_ram,
+ usbms_format_ram,
+ usbms_checkmedia_exist_ram,
+ usbms_prevmedia_removal_ram,
+ usbms_read_capacity_ram,
+ usbms_read_dev_type_ram
+};
+
+#endif /*__USB_RAMDISK__*/
+#endif /*__USB_MASS_STORAGE_ENABLE__*/