📄 dvb_device.c
字号:
stSendMsg.u8Cmd = DEVCTRL_OPEN;
stSendMsg.unData.u32MsgData = (u32)enDeviceLun<<16 | enMediaType;
CT_OS_PutMsg(&DVB_DEVCTRL_Request_MsgQueue, &stSendMsg, CTOS_NO_WAIT);
enStatus = CT_OS_GetMsg(&DVB_DEVCTRL_Reply_MsgQueue, &stRecvMsg, &u32RecvMsgLen, CTOS_WAIT);
if (enStatus != EN_CTOS_SUCCESS)
{
DEVICE_DEBUG((" [ERROR]: %s - wait message error\n", __FUNCTION__));
goto exit1;
}
u8CmdID = stRecvMsg.u8Cmd;
u32MsgData = stRecvMsg.unData.u32MsgData;
switch(u8CmdID)
{
case DEVCTRL_OPEN_DONE:
DEVICE_DEBUG((" [STATUS]: %s - OK\n", __FUNCTION__));
enResult = EN_DEV_STATUS_SUCCESS;
#if 0//def PVR_ENABLE
if(enMediaType == EN_MEDIA_TS)
{
if(enDeviceLun == EN_DEV_CR_LUN0)
{
if(b8FreeCapacityForceUpdate[EN_DEV_CR_LUN0] == TRUE)
{
s8 s8CurParIdx = DVB_FILECTRL_GetCurrentPartitionIndex(EN_CARDREADER_DEVICE);
u8 u8ParNum = DVB_FILECTRL_GetPartitionCount (EN_CARDREADER_DEVICE);
s8 s8i = 0;
for(s8i=0; s8i<u8ParNum; s8i++)
{
DVB_FILECTRL_SetPartitionIndex (EN_CARDREADER_DEVICE, s8i);
DVB_FILECTRL_GetFreeCapacityWithCurrentPartition(EN_CARDREADER_DEVICE, TRUE);
}
if(s8i != 0 && s8CurParIdx != s8i - 1)
{
DVB_FILECTRL_SetPartitionIndex (EN_CARDREADER_DEVICE, s8CurParIdx);
}
b8FreeCapacityForceUpdate[EN_DEV_CR_LUN0] = FALSE;
}
}
else if(enDeviceLun <= EN_DEV_USB_LUN31 && enDeviceLun >= EN_DEV_USB_LUN0)
{
if(b8FreeCapacityForceUpdate[enDeviceLun-EN_DEV_USB_LUN0+1] == TRUE)
{
s8 s8CurParIdx = DVB_FILECTRL_GetCurrentPartitionIndex(EN_USB_DEVICE);
u8 u8ParNum = DVB_FILECTRL_GetPartitionCount (EN_USB_DEVICE);
s8 s8i = 0;
for(s8i=0; s8i<u8ParNum; s8i++)
{
DVB_FILECTRL_SetPartitionIndex (EN_USB_DEVICE, s8i);
DVB_FILECTRL_GetFreeCapacityWithCurrentPartition(EN_USB_DEVICE, TRUE);
}
if(s8i != 0 && s8CurParIdx != s8i - 1)
{
DVB_FILECTRL_SetPartitionIndex (EN_USB_DEVICE, s8CurParIdx);
}
b8FreeCapacityForceUpdate[enDeviceLun-EN_DEV_USB_LUN0+1] = FALSE;
}
}
}
#endif
break;
case DEVCTRL_OPEN_ERROR:
DEVICE_DEBUG((" [STATUS]: %s - OPEN ERROR\n", __FUNCTION__));
enResult = EN_DEV_STATUS_FALSE;
break;
default :
break;
}
exit1:
CT_OS_FreeSemaphore(&DVB_DEVCRL_Semaphore);
return enResult;
}
//--------------------------------------------------------------------
EN_PENDEV_STATUS DVB_DEVCTRL_Close(EN_MEDIA_TYPE enMediaType)
{
ST_PENDEV_HANDLEINFO *pstInfo = NULL;
ST_NODE *pstNode = NULL;
MSG_PARAMETER stSendMsg;
#if 0 //(GFG-002)
EN_CTOS_STATUS enStatus;
u8 u8CmdID = 0;
u32 u32MsgData = 0;
u32 u32RecvMsgLen = 0;
#endif //(GFG-002)
EN_PENDEV_STATUS enResult = EN_DEV_STATUS_FALSE;
if (FALSE == _b8DevCtrlStackInitial)
{
DEVICE_DEBUG((" [ERROR]: %s - DVB_DEVCTRL not initial\n", __FUNCTION__));
return enResult;
}
pstNode = DVB_LIST_Get_Nth_Node(&_stPenDeviceChain.stPenDeviceList, (u16)_as8PenDeviceListNode[enMediaType]);
pstInfo = *(ST_PENDEV_HANDLEINFO**)DVB_LIST_Get_Obj(pstNode);
if(FALSE == pstInfo->b8Ready)
{
DEVICE_DEBUG((" [ERROR]: %s - DVB_DEVCTRL not open\n", __FUNCTION__));
return enResult;
}
// This function will be called by timer, so it must has no waiting behavior.
//if (EN_CTOS_SUCCESS != CT_OS_WaitOnSemaphore(&DVB_DEVCRL_Semaphore, CTOS_WAIT))
//{
// DEVICE_DEBUG((" [ERROR]: %s - wait semaphore error\n", __FUNCTION__));
// return enResult;
//}
//_enMediaType = enMediaType;
stSendMsg.u8Cmd = DEVCTRL_CLOSE;
stSendMsg.unData.u32MsgData = enMediaType;
CT_OS_PutMsg(&DVB_DEVCTRL_Request_MsgQueue, &stSendMsg, CTOS_NO_WAIT);
return EN_DEV_STATUS_SUCCESS;
#if 0
enStatus = CT_OS_GetMsg(&DVB_DEVCTRL_Reply_MsgQueue, &stRecvMsg, &u32RecvMsgLen, CTOS_WAIT);
if (enStatus != EN_CTOS_SUCCESS)
{
DEVICE_DEBUG((" [ERROR]: %s - wait message error\n", __FUNCTION__));
goto exit1;
}
u8CmdID = stRecvMsg.u8Cmd;
u32MsgData = stRecvMsg.unData.u32MsgData;
switch(u8CmdID)
{
case DEVCTRL_CLOSE_DONE:
DEVICE_DEBUG((" [STATUS]: %s - OK\n", __FUNCTION__));
enResult = EN_DEV_STATUS_SUCCESS;
break;
case DEVCTRL_CLOSE_ERROR:
DEVICE_DEBUG((" [STATUS]: %s - READ ERROR\n", __FUNCTION__));
enResult = EN_DEV_STATUS_FALSE;
break;
default :
break;
}
exit1:
CT_OS_FreeSemaphore(&DVB_DEVCRL_Semaphore);
return enResult;
CT_OS_FreeSemaphore(&DVB_DEVCRL_Semaphore);
return EN_DEV_STATUS_SUCCESS;
#endif
}
//--------------------------------------------------------------------
EN_PENDEV_STATUS DVB_DEVCTRL_SwitchFs(EN_MEDIA_TYPE enMediaType)
{
ST_PENDEV_HANDLEINFO stInfo;
if(EN_DEV_STATUS_SUCCESS == DVB_DEVCTRL_LookupByMedia(enMediaType, &stInfo))
{
// to do ... switch those pointer for fs operation
//
if( (FALSE==stInfo.b8Ready) ||
(NULL==stInfo.pstDevicePartition) ||
(NULL==stInfo.pstPathChainList) ||
(NULL==stInfo.pstFileInfoList) ||
(NULL==stInfo.pstDirInfoList) ||
(NULL==stInfo.pstFileHandleList) )
{
return EN_DEV_STATUS_FALSE;
}
if(EN_DEV_CR_LUN0 == stInfo.enDeviceType)
{
#ifdef CARDREADER_ENABLE
{
FS_SwitchDevice(EN_CARDREADER_DEVICE, &stInfo);
}
#endif
}
else
{
#ifdef USB_ENABLE
{
DVB_USB_Change_LUN(stInfo.enDeviceType-EN_DEV_USB_LUN0);
FS_SwitchDevice(EN_USB_DEVICE, &stInfo);
}
#endif
}
}
return EN_DEV_STATUS_SUCCESS;
}
//--------------------------------------------------------------------
EN_PENDEV_STATUS DVB_DEVCTRL_RegisterPluginNotify(DVB_DEVCTRL_NOTIFY pfNotifyFun)
{
if(NULL == pfNotifyFun)
{
return EN_DEV_STATUS_FALSE;
}
_fpDevicePluginNotify = NULL;
_fpDevicePluginNotify = pfNotifyFun;
return EN_DEV_STATUS_SUCCESS;
}
//--------------------------------------------------------------------
EN_PENDEV_STATUS DVB_DEVCTRL_RegisterPlugoutNotify(DVB_DEVCTRL_NOTIFY pfNotifyFun, EN_MEDIA_TYPE enMediaType)
{
DEVICE_DEBUG((" [STATUS]: %s %d\n", __FUNCTION__, enMediaType));
if(NULL == pfNotifyFun)
{
return EN_DEV_STATUS_FALSE;
}
_fpDevicePlugoutNotify[enMediaType] = NULL;
if(enMediaType>=EN_MEDIA_ALBUM && enMediaType<=EN_MEDIA_TS)
{
_fpDevicePlugoutNotify[enMediaType] = pfNotifyFun;
}
return EN_DEV_STATUS_SUCCESS;
}
//--------------------------------------------------------------------
EN_PENDEV_STATUS DVB_DEVCTRL_GetLunAvailable(u32 *au32DeviceAvail)
{
u16 u16Index;
if(NULL == au32DeviceAvail)
{
return EN_DEV_STATUS_FALSE;
}
au32DeviceAvail[0] = 0;
au32DeviceAvail[1] = 0;
// cardr device status
#ifdef CARDREADER_ENABLE
{
if(TRUE == _ab8PenDeviceIsConnected[EN_DEV_CR_LUN0])
au32DeviceAvail[0] = 1;
}
#endif
// usb device status
#ifdef USB_ENABLE
#ifdef NFLASH_ENABLE
au32DeviceAvail[1]=1;
_ab8PenDeviceIsConnected[1] = TRUE;
#else
{
//ST_USB_LUN_INFO stUSBLUNInfo;
//DVB_USB_Get_LUN(0, &stUSBLUNInfo);
for(u16Index=0; u16Index<32; u16Index++)
{
if(TRUE == _ab8PenDeviceIsConnected[u16Index+1])
{
au32DeviceAvail[1] |= (1<<u16Index);
}
}
//au32DeviceAvail[1] = stUSBLUNInfo.u32LUNs;
}
#endif
#endif
return EN_DEV_STATUS_SUCCESS;
}
//--------------------------------------------------------------------
EN_PENDEV_STATUS DVB_DEVCTRL_Initial(void)
{
if(TRUE == _b8DevCtrlStackInitial)
{
return EN_DEV_STATUS_SUCCESS;
}
if(EN_CTOS_SUCCESS != CT_OS_CreateMsgQueue(&DVB_DEVCTRL_Request_MsgQueue,
"DEVQ", &u32DevCtrlRequestQueueMsg[0], DEVCTRL_QUEUE_SIZE, EN_CTOS_SUSPEND_FIFO))
{
DEVICE_DEBUG((" [ERROR]: %s - CreateRequestMsgQueue error\n", __FUNCTION__));
return FALSE;
}
if(EN_CTOS_SUCCESS != CT_OS_CreateMsgQueue(&DVB_DEVCTRL_Reply_MsgQueue,
"DEVQ", &u32DevCtrlReplyQueueMsg[0], DEVCTRL_QUEUE_SIZE, EN_CTOS_SUSPEND_FIFO))
{
CT_OS_DeleteMsgQueue(&DVB_DEVCTRL_Request_MsgQueue);
DEVICE_DEBUG((" [ERROR]: %s - CreateReplyMsgQueue error\n", __FUNCTION__));
return FALSE;
}
if(EN_CTOS_SUCCESS != CT_OS_CreateSemaphore(&DVB_DEVCRL_Semaphore,
"DEVSem", 1, EN_CTOS_SUSPEND_FIFO))
{
CT_OS_DeleteMsgQueue(&DVB_DEVCTRL_Request_MsgQueue);
CT_OS_DeleteMsgQueue(&DVB_DEVCTRL_Reply_MsgQueue);
DEVICE_DEBUG((" [ERROR]: %s - CreateSemaphore error\n", __FUNCTION__));
return FALSE;
}
if(EN_CTOS_SUCCESS != CT_OS_CreateTask(&DVB_DEVCTRL_Task,
"DEVTask", (CTOS_TASK_ENTRY_FN)dvb_devctrl_task, &_au8DevCtrlStack[0],
DVB_DEVCTRL_TASK_STACK_SIZE, DVB_DEVCTRL_TASK_PRIORITY, DVB_DEVCTRL_TIME_SLICE))
{
CT_OS_DeleteMsgQueue(&DVB_DEVCTRL_Request_MsgQueue);
CT_OS_DeleteMsgQueue(&DVB_DEVCTRL_Reply_MsgQueue);
CT_OS_DeleteSemaphore(&DVB_DEVCRL_Semaphore);
DEVICE_DEBUG((" [ERROR]: %s - CreateTask error\n", __FUNCTION__));
return FALSE;
}
if(EN_CTOS_SUCCESS != CT_OS_ResumeTask(&DVB_DEVCTRL_Task))
{
CT_OS_DeleteMsgQueue(&DVB_DEVCTRL_Request_MsgQueue);
CT_OS_DeleteMsgQueue(&DVB_DEVCTRL_Reply_MsgQueue);
CT_OS_DeleteSemaphore(&DVB_DEVCRL_Semaphore);
CT_OS_DeleteTask(&DVB_DEVCTRL_Task);
DEVICE_DEBUG((" [ERROR]: %s - ResumeTask error\n", __FUNCTION__));
return FALSE;
}
_b8DevCtrlStackInitial = TRUE;
if (EN_CTOS_SUCCESS!=CT_OS_CreateSemaphore(&stFSHoldSemaphore, "FSHOLD", 1, EN_CTOS_SUSPEND_FIFO))
return FALSE;
return EN_DEV_STATUS_SUCCESS;
}
//--------------------------------------------------------------------
void dvb_devctrl_task(void)
{
EN_CTOS_STATUS enStatus;
MSG_PARAMETER stSendMsg, stRecvMsg;
u32 u32RecvMsgLen = 0;
u8 u8CmdID = 0;
u32 u32MsgData = 0;
EN_PENDEV_LUN enDeviceLun;
EN_MEDIA_TYPE enMediaType;
EN_PENDEV_STATUS enResult;
while(1)
{
enStatus = CT_OS_GetMsg(&DVB_DEVCTRL_Request_MsgQueue, &stRecvMsg, &u32RecvMsgLen, CTOS_WAIT);
if(enStatus != EN_CTOS_SUCCESS)
{
continue;
}
u8CmdID = stRecvMsg.u8Cmd;
u32MsgData = stRecvMsg.unData.u32MsgData;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -