⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dvb_device.c

📁 DVB软件,基于CT216软件的开发源程序.
💻 C
📖 第 1 页 / 共 3 页
字号:
	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 + -