?? ddi.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 + -