322 lines
8.8 KiB
C
Executable File
322 lines
8.8 KiB
C
Executable File
|
||
//#NT#2010/07/29#Lily Kao -begin
|
||
|
||
/**
|
||
Copyright Novatek Microelectronics Corp. 2005. All rights reserved.
|
||
|
||
@file AppInitUSB.c
|
||
@ingroup mIPRJAPCfg
|
||
|
||
@brief Appication initialization for USB mode
|
||
Get memory and set parameters for USB mode
|
||
|
||
@note Nothing.
|
||
|
||
@date 2010/07/29
|
||
*/
|
||
|
||
/** \addtogroup mIPRJAPCfg */
|
||
//@{
|
||
|
||
#include "AppControl/AppControl.h"
|
||
#include "PrjCfg.h"
|
||
#include "PrjInc.h"
|
||
#include "UIApp/AppLib.h"
|
||
#include "DxType.h"
|
||
#include "GxStrg.h"
|
||
#include "FileSysTsk.h"
|
||
#include "DxApi.h"
|
||
#include "DxStorage.h"
|
||
#include "UIAppUsbDisk.h"
|
||
#include <kwrap/debug.h>
|
||
|
||
#if (SDHOTPLUG_FUNCTION == ENABLE)
|
||
#include "UIApp/Photo/UIStorageCheck.h"
|
||
static BOOL m_bIsMsdcOpened = FALSE;
|
||
#endif
|
||
|
||
static DX_HANDLE pLastStrgDev = 0;
|
||
static UINT32 msdcbuf_pa = 0, msdcbuf_va = 0, msdcbuf_size = 0;
|
||
|
||
#if (LINUX_MSDC == ENABLE)
|
||
static USBIPC_MSDC_INFO gmsdc_info = {
|
||
.luns = 1,
|
||
.id_vendor = USB_VID,
|
||
.id_product = USB_PID_MSDC,
|
||
.manufacturer = USB_VENDER_STRING, 0x00,
|
||
.product = USB_PRODUCT_STRING, 0x00,
|
||
.serial = USB_SERIAL_NUM_STRING, 0x00,
|
||
};
|
||
#endif
|
||
|
||
extern void USBMakerInit_SerialNumber(void);
|
||
|
||
extern BOOL DrvCARD_DetStrgCard(void);
|
||
extern BOOL DrvCARD_DetStrgCardWP(void);
|
||
|
||
_ALIGNED(4) const static UINT8 gMSDCManuStrDesc[] = {
|
||
USB_VENDER_DESC_STRING_LEN * 2 + 2, // size of String Descriptor = 6 bytes
|
||
0x03, // 03: String Descriptor type
|
||
USB_VENDER_DESC_STRING
|
||
};
|
||
|
||
_ALIGNED(4) const static UINT8 gMSDCProdStrDesc[] = {
|
||
USB_PRODUCT_DESC_STRING_LEN * 2 + 2, // size of String Descriptor = 6 bytes
|
||
0x03, // 03: String Descriptor type
|
||
USB_PRODUCT_DESC_STRING
|
||
};
|
||
_ALIGNED(16) UINT8 gMSDCInquiryData[36] = {
|
||
0x00, 0x80, 0x05, 0x02, 0x20, 0x00, 0x00, 0x00,
|
||
//Vendor identification,
|
||
USB_VENDER_STRING,/*'\0',*/
|
||
USB_PRODUCT_STRING, '\0',
|
||
USB_PRODUCT_REVISION
|
||
};
|
||
|
||
void USBMakerInit_UMSD(USB_MSDC_INFO *pUSBMSDCInfo)
|
||
{
|
||
pUSBMSDCInfo->pManuStringDesc = (USB_STRING_DESC *)gMSDCManuStrDesc;
|
||
pUSBMSDCInfo->pProdStringDesc = (USB_STRING_DESC *)gMSDCProdStrDesc;
|
||
|
||
//USBMakerInit_SerialNumber();
|
||
pUSBMSDCInfo->pSerialStringDesc = NULL;
|
||
|
||
pUSBMSDCInfo->VID = USB_VID;
|
||
pUSBMSDCInfo->PID = USB_PID_MSDC;
|
||
|
||
pUSBMSDCInfo->pInquiryData = (UINT8 *)&gMSDCInquiryData[0];
|
||
}
|
||
|
||
/**
|
||
Initialize application for USB MSDC mode
|
||
|
||
Initialize application for USB MSDC mode.
|
||
|
||
@param void
|
||
@return void
|
||
*/
|
||
#if (LINUX_MSDC == ENABLE)
|
||
ER AppInit_ModeUSBMSDC(void)
|
||
{
|
||
ER retV = E_OK;
|
||
UINT32 lun = 0;
|
||
USBIPC_MSDC_INFO *msdc_info = &gmsdc_info;
|
||
|
||
#if (SDHOTPLUG_FUNCTION == ENABLE)
|
||
if (TRUE == m_bIsMsdcOpened || UIStorageCheck(STORAGE_CHECK_ERROR, NULL) == TRUE) {
|
||
return NVTEVT_CONSUME;
|
||
}
|
||
m_bIsMsdcOpened = TRUE;
|
||
#endif
|
||
|
||
#if (FS_MULTI_STRG_FUNC == ENABLE)
|
||
lun = 2;
|
||
#else
|
||
lun = 1;
|
||
#endif
|
||
|
||
int_setConfig(INT_CONFIG_ID_USB3_GIC_DESTINATION, CC_CORE_CA53_CORE2);
|
||
|
||
//send ipc to trigger Linux open MSDC here
|
||
msdc_info->luns = lun;
|
||
usbipc_setconfig(USBIPC_CONFIG_MSDC_INFO, (UINT32)msdc_info, 0);
|
||
usbipc_send_cmd(USBIPC_CMDID_MSDC, 1, 0);
|
||
|
||
return retV;
|
||
}
|
||
#else
|
||
ER AppInit_ModeUSBMSDC(void)
|
||
{
|
||
char *pDxName = NULL;
|
||
USB_MSDC_INFO MSDCInfo = {0};
|
||
DX_HANDLE pStrgDev = 0;
|
||
MSDC_OBJ *p_msdc = Msdc_getObject(MSDC_ID_USB20);
|
||
ER retV = E_OK;
|
||
#if (SDHOTPLUG_FUNCTION == ENABLE)
|
||
if (TRUE == m_bIsMsdcOpened || UIStorageCheck(STORAGE_CHECK_ERROR, NULL) == TRUE) {
|
||
return NVTEVT_CONSUME;
|
||
}
|
||
m_bIsMsdcOpened = TRUE;
|
||
#endif
|
||
|
||
// Get buffer memory for MSDC task, MSDC share the same buffer memory with SIDC,
|
||
// make sure the buffer memory size is enough for both
|
||
|
||
MSDCInfo.uiMsdcBufAddr_va = msdcbuf_va;
|
||
MSDCInfo.uiMsdcBufAddr_pa = msdcbuf_pa;
|
||
MSDCInfo.uiMsdcBufSize = MSDC_MIN_BUFFER_SIZE;
|
||
USBMakerInit_UMSD(&MSDCInfo);
|
||
//The callback functions for the MSDC Vendor command.
|
||
//If project doesn't need the MSDC Vendor command, set this callback function as NULL.
|
||
MSDCInfo.msdc_check_cb = NULL;
|
||
MSDCInfo.msdc_vendor_cb = NULL;
|
||
|
||
pStrgDev = Dx_GetObject(DX_CLASS_STORAGE_EXT | FS_DX_TYPE_DRIVE_A);
|
||
|
||
#if (FS_SWITCH_STRG_FUNC == ENABLE)
|
||
UINT32 uiDxState=0;
|
||
if (Dx_GetState((DX_HANDLE)pStrgDev, STORAGE_STATE_INSERT,&uiDxState)!=DX_OK || uiDxState==FALSE) {
|
||
pStrgDev = Dx_GetObject(DX_CLASS_STORAGE_EXT|FS_DX_TYPE_DRIVE_B);
|
||
}
|
||
#endif
|
||
|
||
MSDCInfo.pStrgHandle[0] = (PSTRG_TAB)Dx_Getcaps(pStrgDev, STORAGE_CAPS_HANDLE, 0);
|
||
|
||
if (Dx_GetInfo(pStrgDev, DX_INFO_NAME, &pDxName) != DX_OK) {
|
||
pDxName = NULL;
|
||
}
|
||
DBG_DUMP("handle = %lx, open = %lx, pDxName ===>%s, type=%lu, status=%lu\r\n", MSDCInfo.pStrgHandle[0], MSDCInfo.pStrgHandle[0]->Open, pDxName, MSDCInfo.pStrgHandle[0]->uiStrgType, MSDCInfo.pStrgHandle[0]->uiStrgStatus);
|
||
|
||
#if (FS_MULTI_STRG_FUNC == ENABLE)
|
||
|
||
char *pDxName2 = NULL;
|
||
DX_HANDLE pStrgDev2 = 0;
|
||
|
||
pStrgDev2 = Dx_GetObject(DX_CLASS_STORAGE_EXT | FS_DX_TYPE_DRIVE_B);
|
||
MSDCInfo.pStrgHandle[1] = (PSTRG_TAB)Dx_Getcaps(pStrgDev2, STORAGE_CAPS_HANDLE, 0);
|
||
|
||
if (Dx_GetInfo(pStrgDev2, DX_INFO_NAME, &pDxName2) != DX_OK) {
|
||
pDxName2 = NULL;
|
||
}
|
||
|
||
DBG_DUMP("handle = %lx, open = %lx, pDxName2 ===>%s, type=%lu, status=%lu\r\n", MSDCInfo.pStrgHandle[1], MSDCInfo.pStrgHandle[1]->Open, pDxName2, MSDCInfo.pStrgHandle[1]->uiStrgType, MSDCInfo.pStrgHandle[1]->uiStrgStatus);
|
||
#endif
|
||
|
||
#if (FS_MULTI_STRG_FUNC == ENABLE)
|
||
|
||
MSDCInfo.msdc_storage_detCB[0] = (MSDC_StorageDet_CB)DrvCARD_DetStrgCard;
|
||
MSDCInfo.msdc_strgLock_detCB[0] = (MSDC_StrgLockDet_CB)DrvCARD_DetStrgCardWP;
|
||
MSDCInfo.msdc_storage_detCB[1] = NULL;
|
||
MSDCInfo.msdc_strgLock_detCB[1] = NULL;
|
||
MSDCInfo.msdc_type[0] = MSDC_STRG;
|
||
MSDCInfo.msdc_type[1] = MSDC_STRG;
|
||
MSDCInfo.LUNs = 2;
|
||
|
||
#else
|
||
if (pDxName == NULL || strcmp(pDxName, "Storage_EmbMem5") == 0) {
|
||
MSDCInfo.msdc_storage_detCB[0] = NULL;
|
||
MSDCInfo.msdc_strgLock_detCB[0] = NULL;
|
||
} else if (strcmp(pDxName, "Storage_Card1") == 0) {
|
||
MSDCInfo.msdc_storage_detCB[0] = (MSDC_StorageDet_CB)DrvCARD_DetStrgCard;
|
||
MSDCInfo.msdc_strgLock_detCB[0] = (MSDC_StrgLockDet_CB)DrvCARD_DetStrgCardWP;
|
||
}
|
||
MSDCInfo.msdc_type[0] = MSDC_STRG;
|
||
MSDCInfo.LUNs = 1;
|
||
#endif
|
||
|
||
//#NT#2009/08/29#Ben Wang -Begin
|
||
// Close File System task before running USB MSDC
|
||
//GxFile_Exit();
|
||
FileSys_CloseEx('A', FST_TIME_INFINITE);
|
||
//#NT#2009/08/29#Ben Wang -end
|
||
#if (FS_MULTI_STRG_FUNC == ENABLE)
|
||
FileSys_CloseEx('B', FST_TIME_INFINITE);
|
||
#endif
|
||
//#NT#2016/12/20#Niven Cho -end
|
||
#if defined(_CPU2_LINUX_)
|
||
//#NT#2016/06/07#Niven Cho[102874] -begin
|
||
//#NT# linux must be closed after filesys closing
|
||
System_CPU2_Stop();
|
||
//#NT#2016/06/07#Niven Cho[102874] -end
|
||
#endif
|
||
#if (defined(_BSP_NA51023_) && _TODO)
|
||
//set SDIO interrupt direction to CPU1
|
||
int_setConfig(INT_CONFIG_ID_SDIO_GIC_DESTINATION, CC_CORE_CA53_CORE1);
|
||
#endif
|
||
|
||
p_msdc->SetConfig(USBMSDC_CONFIG_ID_SELECT_POWER, USBMSDC_POW_BUSPOWER);
|
||
p_msdc->SetConfig(USBMSDC_CONFIG_ID_RC_DISABLESTALL, FALSE);
|
||
// auto detect spped
|
||
//Msdc_SetConfig(USBMSDC_CONFIG_ID_SPEED, U3DEV_SPEED_HS);
|
||
|
||
#if (defined(_BSP_NA51023_) && _TODO)
|
||
int_setConfig(INT_CONFIG_ID_USB3_GIC_DESTINATION, CC_CORE_CA53_CORE1);
|
||
#endif
|
||
#if(MSDCVENDOR_NVT==ENABLE)
|
||
msdcnct_attach(&MSDCInfo);
|
||
#endif
|
||
|
||
retV = p_msdc->Open(&MSDCInfo);
|
||
if (retV != E_OK) {
|
||
DBG_ERR("Error open USB MSDC task:%d\r\n", retV);
|
||
}
|
||
return retV;
|
||
}
|
||
#endif
|
||
|
||
INT32 MSDCExe_OnOpen(VControl *pCtrl, UINT32 paramNum, UINT32 *paramArray)
|
||
{
|
||
UINT32 pa;
|
||
void *va;
|
||
HD_RESULT hd_ret;
|
||
HD_COMMON_MEM_DDR_ID ddr_id = DDR_ID0;
|
||
|
||
msdcbuf_size = MSDC_MIN_BUFFER_SIZE;
|
||
if ((hd_ret = hd_common_mem_alloc("msdcbuf", &pa, (void **)&va, msdcbuf_size, ddr_id)) != HD_OK) {
|
||
DBG_ERR("hd_common_mem_alloc failed(%d)\r\n", hd_ret);
|
||
msdcbuf_va = 0;
|
||
msdcbuf_pa = 0;
|
||
msdcbuf_size = 0;
|
||
} else {
|
||
msdcbuf_va = (UINT32)va;
|
||
msdcbuf_pa = (UINT32)pa;
|
||
}
|
||
|
||
Ux_DefaultEvent(pCtrl, NVTEVT_EXE_OPEN, paramNum, paramArray);
|
||
|
||
pLastStrgDev = GxStrg_GetDevice(0);
|
||
|
||
if (pLastStrgDev == 0) {
|
||
//PowerOn_CB() POWERON_CB_SXOPEN <20>S<EFBFBD><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ұ<EFBFBD>File System
|
||
DBG_ERR("MSDC: Wait for FS start...\r\n");
|
||
FileSys_WaitFinish();
|
||
|
||
//update
|
||
pLastStrgDev = GxStrg_GetDevice(0);
|
||
}
|
||
|
||
System_SetState(SYS_STATE_FS, FS_NOT_INIT);
|
||
|
||
return (AppInit_ModeUSBMSDC());
|
||
}
|
||
|
||
INT32 MSDCExe_OnClose(VControl *pCtrl, UINT32 paramNum, UINT32 *paramArray)
|
||
{
|
||
HD_RESULT hd_ret;
|
||
MSDC_OBJ *p_msdc = Msdc_getObject(MSDC_ID_USB20);
|
||
|
||
if ((hd_ret = hd_common_mem_free(msdcbuf_pa, (void *)msdcbuf_va)) != HD_OK) {
|
||
DBG_ERR("hd_common_mem_free failed(%d)\r\n", hd_ret);
|
||
}
|
||
msdcbuf_pa = 0;
|
||
msdcbuf_va = 0;
|
||
msdcbuf_size = 0;
|
||
|
||
#if (SDHOTPLUG_FUNCTION == ENABLE)
|
||
if (FALSE == m_bIsMsdcOpened) {
|
||
return NVTEVT_CONSUME;
|
||
}
|
||
m_bIsMsdcOpened = FALSE;
|
||
#endif
|
||
|
||
#if (LINUX_MSDC == ENABLE)
|
||
usbipc_send_cmd(USBIPC_CMDID_MSDC, 0, 0);
|
||
#else
|
||
p_msdc->Close();
|
||
#endif
|
||
|
||
|
||
Ux_DefaultEvent(pCtrl, NVTEVT_EXE_CLOSE, paramNum, paramArray);
|
||
|
||
return NVTEVT_CONSUME;
|
||
}
|
||
|
||
EVENT_ENTRY CustomMSDCObjCmdMap[] = {
|
||
{NVTEVT_EXE_OPEN, MSDCExe_OnOpen},
|
||
{NVTEVT_EXE_CLOSE, MSDCExe_OnClose},
|
||
{NVTEVT_NULL, 0}, //End of Command Map
|
||
};
|
||
|
||
CREATE_APP(CustomMSDCObj, APP_SETUP)
|
||
|