2 * Hyper Operating System Application Framework
5 * @brief %jp{NE2000互換Ether用デバイスドライバ}
7 * Copyright (C) 2006 by Project HOS
8 * http://sourceforge.jp/projects/hos/
12 #include "ne2000drv_local.h"
17 const T_DRVOBJ_METHODS Ne2000Drv_Methods =
31 void Ne2000Drv_Create(C_NE2000DRV *self, void *pRegAddr, int iIntNum)
34 SyncDrv_Create(&self->SyncDrv, &Ne2000Drv_Methods);
40 Ne2000Hal_Create(&self->Ne2000Hal, pRegAddr);
43 self->hEvtRecv = SysEvt_Create(SYSEVT_ATTR_AUTOCLEAR);
44 self->hEvtSend = SysEvt_Create(SYSEVT_ATTR_AUTOCLEAR);
47 self->hMtx = SysMtx_Create(SYSMTX_ATTR_NORMAL);
50 SysIsr_Create(iIntNum, Ne2000Drv_Isr, (VPARAM)self);
55 void Ne2000Drv_Delete(C_DRVOBJ *pDrvObj)
60 self = (C_NE2000DRV *)pDrvObj;
63 SysEvt_Delete(self->hEvtRecv);
64 SysEvt_Delete(self->hEvtSend);
65 SysMtx_Delete(self->hMtx);
68 SyncDrv_Delete(&self->SyncDrv);
73 HANDLE Ne2000Drv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
79 self = (C_NE2000DRV *)pDrvObj;
81 /* create file descriptor */
82 if ( (pFile = SysMem_Alloc(sizeof(C_SYNCFILE))) == NULL )
86 SyncFile_Create(pFile, &self->SyncDrv, NULL);
90 SysMtx_Lock(self->hMtx);
91 if ( self->iOpenCount++ == 0 )
93 Ne2000Hal_Setup(&self->Ne2000Hal);
95 SysMtx_Unlock(self->hMtx);
103 void Ne2000Drv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
109 self = (C_NE2000DRV *)pDrvObj;
110 pFile = (C_SYNCFILE *)pFileObj;
112 SysMtx_Lock(self->hMtx);
113 if ( --self->iOpenCount == 0 )
115 Ne2000Hal_Stop(&self->Ne2000Hal);
117 SysMtx_Unlock(self->hMtx);
121 SyncFile_Delete((C_SYNCFILE *)pFile);
127 FILE_SIZE Ne2000Drv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size)
131 unsigned char *pubBuf;
135 self = (C_NE2000DRV *)pDrvObj;
136 pFile = (C_SYNCFILE *)pFileObj;
139 pubBuf = (unsigned char *)pBuf;
143 SysMtx_Lock(self->hMtx);
144 iRecvSize = Ne2000Hal_Recv(&self->Ne2000Hal, pubBuf, Size);
145 SysMtx_Unlock(self->hMtx);
153 if ( pFile->cReadMode != FILE_RMODE_BLOCKING )
159 SysEvt_Wait(self->hEvtRecv);
160 SysEvt_Clear(self->hEvtRecv);
168 FILE_SIZE Ne2000Drv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size)
174 self = (C_NE2000DRV *)pDrvObj;
175 pFile = (C_SYNCFILE *)pFileObj;
177 SysMtx_Lock(self->hMtx);
178 Size = Ne2000Hal_Send(&self->Ne2000Hal, pData, Size);
179 SysMtx_Unlock(self->hMtx);
186 void Ne2000Drv_Isr(VPARAM Param)
190 self = (C_NE2000DRV *)Param;