nt9856x/rtos/code/application/source/cardv/SrcCode/UIApp/UsbDiskFast/UsbDiskFast.c
2023-03-28 15:07:53 +08:00

104 lines
3.0 KiB
C
Executable File

////////////////////////////////////////////////////////////////////////////////
#include "PrjInc.h"
#include "usb2dev.h"
#include <FreeRTOS_POSIX.h>
#include <FreeRTOS_POSIX/pthread.h>
#include <comm/hwpower.h>
#include "sdio.h"
#define THIS_DBGLVL 2 // 0=FATAL, 1=ERR, 2=WRN, 3=UNIT, 4=FUNC, 5=IND, 6=MSG, 7=VALUE, 8=USER
#if 1//_TODO
#define __MODULE__ UsbCamFast
#define __DBGLVL__ 2 // 0=FATAL, 1=ERR, 2=WRN, 3=UNIT, 4=FUNC, 5=IND, 6=MSG, 7=VALUE, 8=USER
#define __DBGFLT__ "*" //*=All, [mark]=CustomClass
#include <kwrap/debug.h>
#endif
extern BOOL DrvCARD_DetStrgCard(void);
extern BOOL DrvCARD_DetStrgCardWP(void);
extern void USBMakerInit_UMSD(USB_MSDC_INFO *pUSBMSDCInfo);
static UINT32 msdcbuf_pa = 0, msdcbuf_va = 0, msdcbuf_size = 0;
ER AppInit_ModeFastUSBMSDC(void)
{
USB_MSDC_INFO MSDCInfo = {0};
MSDC_OBJ *p_msdc = Msdc_getObject(MSDC_ID_USB20);
ER retV = E_OK;
// 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 = msdcbuf_va;
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;
MSDCInfo.pStrgHandle[0] = (PSTRG_TAB)sdio_getStorageObject(STRG_OBJ_FAT1);
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;
FileSys_CloseEx('A', FST_TIME_INFINITE);
p_msdc->SetConfig(USBMSDC_CONFIG_ID_SELECT_POWER, USBMSDC_POW_BUSPOWER);
p_msdc->SetConfig(USBMSDC_CONFIG_ID_RC_DISABLESTALL, FALSE);
retV = p_msdc->Open(&MSDCInfo);
if (retV != E_OK) {
DBG_ERR("Error open USB MSDC task:%d\r\n", retV);
}
return retV;
}
THREAD_RETTYPE UsbDiskFast_InitMsdcModeThread(void *arg)
{
UINT32 pa;
void *va;
HD_RESULT hd_ret;
HD_COMMON_MEM_DDR_ID ddr_id = DDR_ID0;
printf("Enter UsbDiskFast mode...\r\n");
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;
}
//System_SetState(SYS_STATE_FS, FS_NOT_INIT);
AppInit_ModeFastUSBMSDC();
while(1) {
if (usb2dev_state_change() && DrvCARD_DetStrgCard()) {
vos_util_delay_ms(200);
} else {
MSDC_OBJ *p_msdc = Msdc_getObject(MSDC_ID_USB20);
p_msdc->Close();
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;
hwpower_set_power_key(POWER_ID_PSW1, 0xFF);
}
}
THREAD_RETURN(0);
}