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

📄 ddi.c

📁 samsung 9908DVD源代码,
💻 C
字号:
/**********************************************************************************
 * ddi.c
 * coded by hspark@ce.cnu.ac.kr
 * date : 2001/06/23
 * modified by hjahn@ce.cnu.ac.kr
 * date : 2003/03/03
 **********************************************************************************/

#include "kernel\\mk_sys.h"
#include "kernel\\mk_ddi.h"
#include "util\\mk_lib.h"

#ifdef _MK_DDI

struct mk_ddi_struct *MK_pDDIListHead;
struct mk_ddi_struct *MK_pDDIListTail;

VOID
MK_DDIInitialize(VOID)
{
	MK_pDDIListHead = MK_NULL;
	MK_pDDIListTail = MK_NULL;
}

STATUS
MK_CreateDDI(MK_DDI *pDDI, CHAR *pName, MK_DDI_OPEN_FUNCTION Open, 
			 MK_DDI_CLOSE_FUNCTION Close, MK_DDI_READ_FUNCTION Read, 
			 MK_DDI_WRITE_FUNCTION Write, MK_DDI_IOCONTROL_FUNCTION Ctrl)
{
	INT Flags;

	MK_MemCopy((CHAR *)pDDI, 0, sizeof(MK_DDI));
	pDDI->dd_Magic = 0;			/* InActived */
	pDDI->dd_OpenCount = 0;
	pDDI->dd_OpenFunction = Open;
	pDDI->dd_CloseFunction = Close;
	pDDI->dd_ReadFunction = Read;
	pDDI->dd_WriteFunction = Write;
	pDDI->dd_IOControlFunction = Ctrl;
	MK_BlockCopy(pDDI->dd_pName, pName, MK_NAME_MAX-1);
	pDDI->dd_pName[MK_NAME_MAX-1] = '\0';

	Flags = MK_InterruptDisable();		/* Critical Region */

	pDDI->dd_pNext = MK_NULL;
	pDDI->dd_pPrev = MK_NULL;
	if(MK_pDDIListHead == MK_NULL)
	{
		MK_pDDIListHead = pDDI;
		MK_pDDIListTail = pDDI;
	}
	else
	{
		MK_pDDIListTail->dd_pNext = pDDI;
		pDDI->dd_pPrev = MK_pDDIListTail;
		MK_pDDIListTail = pDDI;
	}
	MK_InterruptRestore(Flags);

	return MK_NO_ERROR;
}

STATUS
MK_DeleteDDI(MK_DDI *pDDI)
{
	int Flags;

	MK_MemCopy((CHAR *)pDDI, 0, sizeof(MK_DDI));

	Flags = MK_InterruptDisable();		/* Critical Region */

	if(MK_pDDIListHead == MK_pDDIListTail)
	{
		MK_pDDIListHead = MK_NULL;
		MK_pDDIListTail = MK_NULL;
	}
	else
	{
		if(pDDI == MK_pDDIListHead)
		{
			MK_pDDIListHead = pDDI->dd_pNext;
			MK_pDDIListHead->dd_pPrev = MK_NULL;
		}
		else if(pDDI == MK_pDDIListTail)
		{
			MK_pDDIListTail = pDDI->dd_pPrev;
			MK_pDDIListTail->dd_pNext = MK_NULL;
		}
		else
		{
			pDDI->dd_pPrev->dd_pNext = pDDI->dd_pNext;
			pDDI->dd_pNext->dd_pPrev = pDDI->dd_pPrev;
		}
	}
	pDDI->dd_pNext = MK_NULL;
	pDDI->dd_pPrev = MK_NULL;

	MK_InterruptRestore(Flags);

	return MK_NO_ERROR;
}

STATUS
MK_Open(VOID *pFd)
{
	MK_DDI *pDDI;

	pDDI = (MK_DDI *)pFd;
	if(pDDI->dd_OpenCount == 0)
	{
		pDDI->dd_Magic = MK_DDI_MAGIC;
	}
	pDDI->dd_OpenCount++;

	return (*pDDI->dd_OpenFunction)(pFd);
}

STATUS
MK_Close(VOID *pFd)
{
	MK_DDI *pDDI;

	pDDI = (MK_DDI *)pFd;
	pDDI->dd_OpenCount--;
	if(pDDI->dd_OpenCount == 0)
	{
		pDDI->dd_Magic = 0;
	}

	return (*pDDI->dd_CloseFunction)(pFd);
}

INT
MK_Read(VOID *pFd, VOID *pAddr, INT Length)
{
	MK_DDI *pDDI;

	pDDI = (MK_DDI *)pFd;
	return (*pDDI->dd_ReadFunction)(pDDI, pAddr, Length);
}

INT
MK_Write(VOID *pFd, VOID *pAddr, INT Length)
{
	MK_DDI *pDDI;

	pDDI = (MK_DDI *)pFd;
	return (*pDDI->dd_WriteFunction)(pDDI, pAddr, Length);
}

INT
MK_IOControl(VOID *pFd, INT Function, INT Arg)
{
	MK_DDI *pDDI;

	pDDI = (MK_DDI *)pFd;
	return (*pDDI->dd_IOControlFunction)(pDDI, Function, Arg);
}

BOOLEAN
MK_IsDDIOpened(MK_DDI *pDDI)
{
	if(pDDI->dd_Magic == MK_DDI_MAGIC)
		return TRUE;
	return FALSE;
}

STATUS
MK_DDIInformation(struct mk_ddi_struct *pDDI)
{
	MK_DDI *pNext;
	INT Flags;

	Flags = MK_InterruptDisable();		/* Critical Region */

	for(pNext = MK_pDDIListHead; pNext != MK_NULL; pNext = pNext->dd_pNext)
	{
		MK_Fprintf(pDDI, "%s ", pDDI->dd_pName);
	}

	MK_Fprintf(pDDI,"\n");

	MK_InterruptRestore(Flags);

	return MK_NO_ERROR;
}


#endif /* #ifdef _MK_DDI */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -