nt9856x/code/application/source/cardv/SrcCode/Gx/GxStrg/GxStrgDevice.c

166 lines
3.7 KiB
C

#include <kwrap/type.h>
#include "DxStorage.h"
#include "DxApi.h"
#include "GxStrg.h"
#include "GxStrgInt.h"
#include <kwrap/error_no.h>
UINT32 uiStrgCardCurSts = DET_CARD_REMOVED;
UINT32 uiStrgCardStatus = DET_CARD_UNKNOWN;
/*
Detect SD card is inserted or not
Detect SD card is inserted or not.
If SD card is inserted, then detect SD card write protect status and
store it in bStrgCardLock (static variable)
[KeyScan internal API]
@param void
@return void
*/
void GxStrg_Det(UINT32 DevID, DX_HANDLE StrgDXH)
{
UINT32 uiDxState = 0;
static UINT32 uiStrgCardPrevSts = DET_CARD_UNKNOWN;
static BOOL isFormat = FALSE;
if (FALSE == GxStrg_IsValidDevID(DevID)) {
DBG_WRN("Invalid DevID(%d)\r\n", DevID);
return;
}
if (FST_FS_TYPE_LINUX == g_FsType) {
uiStrgCardCurSts = GxStrgLnx_Det(DevID);
} else {
if (Dx_GetState(StrgDXH, STORAGE_STATE_INSERT, &uiDxState) == DX_OK && uiDxState == TRUE) {
uiStrgCardCurSts = DET_CARD_INSERTED;
} else {
uiStrgCardCurSts = DET_CARD_REMOVED;
}
}
// Debounce
if ((uiStrgCardCurSts == uiStrgCardPrevSts) &&
(uiStrgCardCurSts != uiStrgCardStatus)) {
isFormat = g_LnxStrgStatus[DevID].IsFormatted;
DBG_DUMP("isFormat = %lu\n", isFormat);
switch (uiStrgCardCurSts) {
case DET_CARD_INSERTED:
if (g_fpStrgCB) {
(*g_fpStrgCB)(STRG_CB_INSERTED, DevID, 0);
}
break;
case DET_CARD_REMOVED:
if (g_fpStrgCB) {
(*g_fpStrgCB)(STRG_CB_REMOVED, DevID, 0);
}
break;
case DET_CARD_UNKNOWN:
if (g_fpStrgCB) {
(*g_fpStrgCB)(STRG_CB_UNKNOWN, DevID, 0);
}
break;
}
uiStrgCardStatus = uiStrgCardCurSts;
}
if ((uiStrgCardCurSts == uiStrgCardPrevSts) &&
(uiStrgCardCurSts == uiStrgCardStatus) &&
(uiStrgCardCurSts == DET_CARD_INSERTED) &&
(isFormat == FALSE) &&
(g_LnxStrgStatus[DevID].IsFormatted == TRUE)
) {
DBG_DUMP("STRG_CB_MOUNT_FINISH from GxStrg\n");
isFormat = g_LnxStrgStatus[DevID].IsFormatted;
if (g_fpStrgCB) {
(*g_fpStrgCB)(STRG_CB_MOUNT_FINISH, DevID, 0);
}
}
uiStrgCardPrevSts = uiStrgCardCurSts;
}
void GxStrg_SetDeviceCtrl(UINT32 DevID, UINT32 data, UINT32 value)
{
if (FALSE == GxStrg_IsValidDevID(DevID)) {
DBG_WRN("Invalid DevID(%d)\r\n", DevID);
return;
}
switch (data) {
case CARD_POWER:
Dx_Control(g_pCurStrgDXH[DevID], STORAGE_CTRL_POWER, value, 0);
break;
default:
break;
}
}
/*
Get SD card status
Get SD card status
@param state
CARD_INSERT
CARD_READONLY
@return BOOL:
CARD_INSERT
TRUE -> Card is inserted, FALSE -> Card is removed
CARD_READONLY
TRUE -> Card is locked, FALSE -> Card is not locked
*/
UINT32 GxStrg_GetDeviceCtrl(UINT32 DevID, UINT32 data)
{
UINT32 uiDxState = 0;
int getv = 0;
if (FALSE == GxStrg_IsValidDevID(DevID)) {
DBG_WRN("Invalid DevID(%d)\r\n", DevID);
return getv;
}
switch (data) {
case CARD_INSERT:
if (FST_FS_TYPE_LINUX == g_FsType) {
getv = g_LnxStrgStatus[DevID].IsInserted;
} else {
getv = (Dx_GetState(g_pCurStrgDXH[DevID], STORAGE_STATE_INSERT, &uiDxState) == DX_OK && uiDxState == TRUE);
}
break;
case CARD_READONLY:
if (FST_FS_TYPE_LINUX == g_FsType) {
getv = g_LnxStrgStatus[DevID].IsReadOnly;
} else {
BOOL bLock = FALSE;
if (Dx_GetState(g_pCurStrgDXH[DevID], STORAGE_STATE_INSERT, &uiDxState) == DX_OK && uiDxState == TRUE) {
if (DX_OK == Dx_GetState(g_pCurStrgDXH[DevID], STORAGE_STATE_LOCK, &uiDxState)) {
bLock = (BOOL)uiDxState;
} else {
bLock = TRUE; //if get status failed, return as locked
}
}
getv = bLock;
}
break;
case CARD_MNTPATH:
getv = (UINT32)&g_FSInitParam[DevID].FSParam.szMountPath[0];
break;
default:
DBG_WRN("Invalid arg %d\r\n", data);
break;
}
return getv;
}