# Begin Group "renesus"
# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=..\..\..\..\driver\serial\renesas\scidrv.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\driver\serial\renesas\scidrv.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\driver\serial\renesas\scifile.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\driver\serial\renesas\scifile.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\driver\serial\renesas\scihal.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\driver\serial\renesas\scihal.h
-# End Source File
# End Group
# Begin Group "winsock"
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\driver\serial\winsock\winsockfile.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\driver\serial\winsock\winsockfile.h
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_local.h
# End Source File
# End Group
# Begin Group "pc16550"
# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=..\..\..\..\driver\serial\pc16550\pc16550drv.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\driver\serial\pc16550\pc16550drv.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\driver\serial\pc16550\pc16550file.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\driver\serial\pc16550\pc16550file.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\driver\serial\pc16550\pc16550hal.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\driver\serial\pc16550\pc16550hal.h
-# End Source File
# End Group
# End Group
# Begin Group "ether"
# Begin Group "ne2000"
# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=..\..\..\..\driver\ether\ne2000\ne2000drv.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\driver\ether\ne2000\ne2000drv.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\driver\ether\ne2000\ne2000hal.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\driver\ether\ne2000\ne2000hal.h
-# End Source File
# End Group
# End Group
-# Begin Group "terminal"
+# Begin Group "console"
# PROP Default_Filter ""
# Begin Group "vt100"
# PROP Default_Filter ""
# Begin Source File
-SOURCE=..\..\..\..\driver\terminal\vt100\vt100con.h
+SOURCE=..\..\..\..\driver\console\vt100\vt100drv.h
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\driver\terminal\vt100\vt100con_create.c
+SOURCE=..\..\..\..\driver\console\vt100\vt100drv_getch.c
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\driver\terminal\vt100\vt100drv.h
+SOURCE=..\..\..\..\driver\console\vt100\vt100drv_local.h
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\driver\terminal\vt100\vt100drv_getch.c
+SOURCE=..\..\..\..\driver\console\vt100\vt100drv_read.c
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\driver\terminal\vt100\vt100drv_local.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\driver\terminal\vt100\vt100drv_read.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\driver\terminal\vt100\vt100drv_write.c
+SOURCE=..\..\..\..\driver\console\vt100\vt100drv_write.c
# End Source File
# End Group
# End Group
# PROP Default_Filter ""
# Begin Source File
-SOURCE=..\..\..\..\system\file\confile.c
+SOURCE=..\..\..\..\system\file\console.h
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\system\file\confile.h
+SOURCE=..\..\..\..\system\file\console_getch.c
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\system\file\console.h
+SOURCE=..\..\..\..\system\file\consoleobj.h
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\system\file\console_getch.c
+SOURCE=..\..\..\..\system\file\drvobj.h
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\system\file\consoleobj.h
+SOURCE=..\..\..\..\system\file\drvobj_create.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\system\file\drvobj_local.h
# End Source File
# Begin Source File
# Begin Group "fat"
# PROP Default_Filter ""
+# End Group
+# End Group
# Begin Source File
-SOURCE=..\..\..\..\volume\fat\fatfile.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\volume\fat\fatfile_create.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\volume\fat\fatfile_local.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\volume\fat\fatfile_read.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\volume\fat\fatvol.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\volume\fat\fatvol_clusterread.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\volume\fat\fatvol_clusterwrite.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\volume\fat\fatvol_create.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\volume\fat\fatvol_createfile.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\volume\fat\fatvol_flushfat.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\volume\fat\fatvol_getclusterbuf.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\..\..\volume\fat\fatvol_getnextcluster.c
+SOURCE=..\..\..\..\hosaplfw.h
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\volume\fat\fatvol_local.h
+SOURCE=..\..\..\..\driver\console\vt100\vt100drv_close.c
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\volume\fat\fatvol_open.c
+SOURCE=..\..\..\..\driver\console\vt100\vt100drv_create.c
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\volume\fat\fatvol_relclusterbuf.c
+SOURCE=..\..\..\..\driver\console\vt100\vt100drv_iocontrol.c
# End Source File
# Begin Source File
-SOURCE=..\..\..\..\volume\fat\fatvol_setnextcluster.c
+SOURCE=..\..\..\..\driver\console\vt100\vt100drv_open.c
# End Source File
-# End Group
-# End Group
# Begin Source File
-SOURCE=..\..\..\..\hosaplfw.h
+SOURCE=..\..\..\..\driver\console\vt100\vt100drv_seek.c
# End Source File
# End Target
# End Project
-#include "system/file/consoleobj.h"
+#include "system/file/console.h"
+#include "system/file/drvobj.h"
typedef struct c_vt100drv
{
- C_CONSOLEOBJ ConObj;
+ C_DRVOBJ DrvObj;
+
HANDLE hTty;
int iEscState;
int iEscNum;
void Vt100Drv_Create(C_VT100DRV *self, HANDLE hTty); /**< コンストラクタ */
void Vt100Drv_Delete(C_VT100DRV *self); /**< デストラクタ */
-FILE_ERR Vt100Drv_IoControl(HANDLE hFile, int iFunc, const void *pInBuf, FILE_SIZE InSize, void *pOutBuf, FILE_SIZE OutSize);
-FILE_SIZE Vt100Drv_Read(HANDLE hFile, void *pBuf, FILE_SIZE Size);
-FILE_SIZE Vt100Drv_Write(HANDLE hFile, const void *pData, FILE_SIZE Size);
#ifdef __cplusplus
}
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file vt100drv_open.c
+ * @brief %jp{VT100 ターミナルドライバ}
+ *
+ * Copyright (C) 2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "vt100drv_local.h"
+#include "system/sysapi/sysapi.h"
+
+
+FILE_ERR Vt100Drv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
+{
+ return FILE_ERR_OK;
+}
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file vt100drv_create.c
+ * @brief %jp{VT100 ターミナルドライバ}
+ *
+ * Copyright (C) 2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "vt100drv_local.h"
+#include "system/sysapi/sysapi.h"
+
+
+const T_DRVOBJ_METHODS Vt100Drv_Methods =
+ {
+ Vt100Drv_Open,
+ Vt100Drv_Close,
+ Vt100Drv_IoControl,
+ Vt100Drv_Seek,
+ Vt100Drv_Read,
+ Vt100Drv_Write,
+ Vt100Drv_Flush,
+ };
+
+
+
+/**< コンストラクタ */
+void Vt100Drv_Create(C_VT100DRV *self, HANDLE hTty)
+{
+ /* 親クラスコンストラクタ */
+ DrvObj_Create(&self->DrvObj, &Vt100Drv_Methods);
+
+ self->hTty = hTty;
+}
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file vt100drv_open.c
+ * @brief %jp{VT100 ターミナルドライバ}
+ *
+ * Copyright (C) 2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "vt100drv_local.h"
+#include "system/sysapi/sysapi.h"
+
+
+FILE_ERR Vt100Drv_Flush(struct c_drvobj *self, C_FILEOBJ *pFileObj)
+{
+ return FILE_ERR_OK;
+}
+
+
+/* end of file */
#include "vt100drv_local.h"
+#include "system/sysapi/sysapi.h"
-/**< コンストラクタ */
-void Vt100Drv_Create(C_VT100DRV *self, HANDLE hTty)
-{
- self->hTty = hTty;
-}
/* 1文字取得 */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file vt100drv_open.c
+ * @brief %jp{VT100 ターミナルドライバ}
+ *
+ * Copyright (C) 2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "vt100drv_local.h"
+#include "system/sysapi/sysapi.h"
+
+FILE_ERR Vt100Drv_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize)
+{
+ C_VT100DRV *self;
+
+ /* upper cast */
+ self = (C_VT100DRV *)pDrvObj;
+
+ switch ( iFunc )
+ {
+ case FILE_IOCTL_CON_GETCH:
+ *(int *)pInBuf = Vt100Drv_GetCh(self);
+ return FILE_ERR_OK;
+
+ default:
+ return FILE_ERR_NG;
+ }
+}
+
+
+/* end of file */
#define VT100DRV_ESC_NUM 4
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+HANDLE Vt100Drv_Open(struct c_drvobj *self, const char *pszPath, int iMode);
+FILE_ERR Vt100Drv_Close(struct c_drvobj *self, C_FILEOBJ *pFileObj);
+FILE_ERR Vt100Drv_IoControl(struct c_drvobj *self, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize);
+FILE_POS Vt100Drv_Seek(struct c_drvobj *self, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign);
+FILE_SIZE Vt100Drv_Read(struct c_drvobj *self, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size);
+FILE_SIZE Vt100Drv_Write(struct c_drvobj *self, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size);
+FILE_ERR Vt100Drv_Flush(struct c_drvobj *self, C_FILEOBJ *pFileObj);
+
+int Vt100Drv_GetCh(C_VT100DRV *self);
+
+
+#ifdef __cplusplus
+}
+#endif
+
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file vt100drv_open.c
+ * @brief %jp{VT100 ターミナルドライバ}
+ *
+ * Copyright (C) 2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "vt100drv_local.h"
+#include "system/sysapi/sysapi.h"
+
+
+
+HANDLE Vt100Drv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
+{
+ C_VT100DRV *self;
+ C_FILEOBJ *pFileObj;
+
+ /* upper cast */
+ self = (C_VT100DRV *)pDrvObj;
+
+ /* create file descriptor */
+ if ( (pFileObj = SysMem_Alloc(sizeof(*pFileObj))) == NULL )
+ {
+ return HANDLE_NULL;
+ }
+ FileObj_Create(pFileObj, pDrvObj, NULL);
+
+ return (HANDLE)pFileObj;
+}
+
+
+/* end of file */
#include "vt100drv_local.h"
-FILE_SIZE Vt100Drv_Read(C_VT100DRV *self, void *pBuf, FILE_SIZE Size)
+FILE_SIZE Vt100Drv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size)
{
+ C_VT100DRV *self;
char *pcBuf;
FILE_SIZE i;
int c;
+ /* upper cast */
+ self = (C_VT100DRV *)pDrvObj;
+
pcBuf = (char *)pBuf;
for ( i = 0; i < Size; i++ )
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file vt100drv_open.c
+ * @brief %jp{VT100 ターミナルドライバ}
+ *
+ * Copyright (C) 2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "vt100drv_local.h"
+#include "system/sysapi/sysapi.h"
+
+
+FILE_POS Vt100Drv_Seek(struct c_drvobj *self, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign)
+{
+ return FILE_ERR_NG;
+}
+
+
+/* end of file */
#include "vt100drv_local.h"
-FILE_SIZE Vt100Drv_Write(C_VT100DRV *self, const void *pData, FILE_SIZE Size)
+FILE_SIZE Vt100Drv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size)
{
- const char *pcBuf;
- FILE_SIZE i;
-
+ C_VT100DRV *self;
+ const char *pcBuf;
+ FILE_SIZE i;
+
+ /* upper cast */
+ self = (C_VT100DRV *)pDrvObj;
+
/* '\n' -> '\r\n' へ変換 */
pcBuf = (const char *)pData;
for ( i = 0; i < Size; i++ )
return i;
}
-
-#include "winsockdrv.h"
+#include "winsockdrv_local.h"
+
+
+const T_DRVOBJ_METHODS WinSockDrv_Methods =
+ {
+ WinSockDrv_Open,
+ WinSockDrv_Close,
+ WinSockDrv_IoControl,
+ WinSockDrv_Seek,
+ WinSockDrv_Read,
+ WinSockDrv_Write,
+ WinSockDrv_Flush,
+ };
/** コンストラクタ */
{
WSADATA wsaData;
struct sockaddr_in addr;
+
+ /* 親クラス初期化 */
+ DrvObj_Create(&self->DrvObj, &WinSockDrv_Methods);
WSAStartup(MAKEWORD(2,0), &wsaData);
/** オープン */
-void WinSockDrv_Open(C_WINSOCKDRV *self)
+HANDLE WinSockDrv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
{
- struct sockaddr_in client;
- int len;
+ C_WINSOCKDRV *self;
+ C_FILEOBJ *pFileObj;
+ struct sockaddr_in client;
+ int len;
+
+ /* upper cast */
+ self = (C_WINSOCKDRV *)pDrvObj;
+
+ /* create file descriptor */
+ if ( (pFileObj = SysMem_Alloc(sizeof(*pFileObj))) == NULL )
+ {
+ return HANDLE_NULL;
+ }
+ FileObj_Create(pFileObj, pDrvObj, NULL);
+ /* オープン処理 */
if ( self->iOpenCount++ == 0 )
{
len = sizeof(client);
self->sock = accept(self->sock0, (struct sockaddr *)&client, &len);
}
+
+ return (HANDLE)pFileObj;
}
/** クローズ */
-void WinSockDrv_Close(C_WINSOCKDRV *self)
+FILE_ERR WinSockDrv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
+{
+ C_WINSOCKDRV *self;
+
+ /* upper cast */
+ self = (C_WINSOCKDRV *)pDrvObj;
+
+ if ( --self->iOpenCount == 0 )
+ {
+ closesocket(self->sock);
+ }
+
+ return FILE_ERR_OK;
+}
+
+
+FILE_ERR WinSockDrv_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, const void *pInBuf, FILE_SIZE InSize, void *pOutBuf, FILE_SIZE OutSize)
+{
+ return FILE_ERR_NG;
+}
+
+
+FILE_POS WinSockDrv_Seek(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign)
{
- closesocket(self->sock);
+ return FILE_ERR_NG;
}
/** 読み出し */
-int WinSockDrv_Read(C_WINSOCKDRV *self, void *pRecvBuf, int iSize)
+FILE_SIZE WinSockDrv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size)
{
- return recv(self->sock, pRecvBuf, iSize, 0);
+ C_WINSOCKDRV *self;
+
+ /* upper cast */
+ self = (C_WINSOCKDRV *)pDrvObj;
+
+ return recv(self->sock, pBuf, Size, 0);
}
+
/** 書き込み */
-int WinSockDrv_Write(C_WINSOCKDRV *self, const void *pData, int iSize)
+FILE_SIZE WinSockDrv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size)
{
- return send(self->sock, pData, iSize, 0);
+ C_WINSOCKDRV *self;
+
+ /* upper cast */
+ self = (C_WINSOCKDRV *)pDrvObj;
+
+ return send(self->sock, pData, Size, 0);
}
+FILE_ERR WinSockDrv_Flush(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
+{
+ return FILE_ERR_OK;
+}
+
#define SIZE WINSIZE
#include <winsock2.h>
+#include "system/file/drvobj.h"
#include "system/sysapi/sysapi.h"
#include "library/container/stmbuf/stmbuf.h"
-/* SCI用ドライバ制御部 */
+/* WinSock用ドライバ制御部 */
typedef struct c_winsockdrv
{
- int iOpenCount;
- SYSEVT_HANDLE hEvtSend;
- SYSEVT_HANDLE hEvtRecv;
- SYSMTX_HANDLE hMtxSend;
- SYSMTX_HANDLE hMtxRecv;
-
- SOCKET sock0;
- SOCKET sock;
-
-
- C_STREAMBUF StmBuf;
+ C_DRVOBJ DrvObj; /* デバイスドライバクラスを継承 */
+
+ int iOpenCount;
+ SYSEVT_HANDLE hEvtSend;
+ SYSEVT_HANDLE hEvtRecv;
+ SYSMTX_HANDLE hMtxSend;
+ SYSMTX_HANDLE hMtxRecv;
+
+ SOCKET sock0;
+ SOCKET sock;
+
+ C_STREAMBUF StmBuf;
} C_WINSOCKDRV;
#endif
void WinSockDrv_Create(C_WINSOCKDRV *self, int iPortNum, int iIntNum, int iBufSize); /**< コンストラクタ */
-void WinSockDrv_Delete(C_WINSOCKDRV *self); /**< デストラクタ */
-void WinSockDrv_Open(C_WINSOCKDRV *self); /**< オープン初期化 */
-void WinSockDrv_Close(C_WINSOCKDRV *self); /**< クローズ */
-int WinSockDrv_Read(C_WINSOCKDRV *self, void *pRecvBuf, int iSize); /**< 書き込み */
-int WinSockDrv_Write(C_WINSOCKDRV *self, const void *pData, int iSize); /**< 読み出し */
#ifdef __cplusplus
}
#endif
+
#endif /* __HOS__winsockdrv_h__ */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#ifndef __HOS__winsockdrv_local_h__
+#define __HOS__winsockdrv_local_h__
+
+
+#include "winsockdrv.h"
+#include "system/file/drvobj.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+HANDLE WinSockDrv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode);
+FILE_ERR WinSockDrv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj);
+FILE_ERR WinSockDrv_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize);
+FILE_POS WinSockDrv_Seek(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign);
+FILE_SIZE WinSockDrv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size);
+FILE_SIZE WinSockDrv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size);
+FILE_ERR WinSockDrv_Flush(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __HOS__winsockdrv_local_h__ */
+
+
+/* end of file */
/* /dev/com0 に登録 */
strcpy(DevInf.szName, "com0");
- DevInf.pfncCreate = WinSockFile_Create;
- DevInf.ObjSize = sizeof(C_WINSOCKFILE);
- DevInf.pParam = &g_WinSockDrv[0];
+ DevInf.pDrvObj = (C_DRVOBJ *)&g_WinSockDrv[0];
File_AddDevice(&DevInf);
-
/* /dev/com0 の上に VT100コンソールを形成 */
hTty = File_Open("/dev/com0", FILE_MODE_READ | FILE_MODE_WRITE);
Vt100Drv_Create(&g_Vt100Drv[1], hTty);
/* /dev/con0 に登録 */
strcpy(DevInf.szName, "con0");
- DevInf.pfncCreate = Vt100Con_Create;
- DevInf.ObjSize = sizeof(C_VT100CON);
- DevInf.pParam = &g_Vt100Drv[1];
+ DevInf.pDrvObj = (C_DRVOBJ *)&g_Vt100Drv[1];
File_AddDevice(&DevInf);
hCon = File_Open("/dev/con0", FILE_MODE_READ | FILE_MODE_WRITE);
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
+SOURCE=..\..\..\..\system\file\drvobj.h
+# End Source File
+# Begin Source File
+
SOURCE=..\kernel_id.h
# End Source File
# Begin Source File
extern "C" {
#endif
-FILE_ERR Console_GetCh(HANDLE hConsole); /**< コンストラクタ */
+FILE_ERR Console_GetCh(HANDLE hConsole);
#ifdef __cplusplus
}
-FILE_ERR Console_GetCh(HANDLE hConsole)
+int Console_GetCh(HANDLE hFile)
{
- C_CONSOLEOBJ *self;
+ int c;
- self = (C_CONSOLEOBJ *)hConsole;
-
- if ( ConsoleObj_GetMethods(self)->pfncGetCh != NULL )
+ if ( File_IoControl(hFile, FILE_IOCTL_CON_GETCH, &c, sizeof(c), NULL, 0) != FILE_ERR_OK )
{
- return ConsoleObj_GetMethods(self)->pfncGetCh(hConsole);
+ return FILE_ERR_NG;
}
- return FILE_ERR_NG;
+ return c;
}
extern "C" {
#endif
-void DrvFile_Create(C_DRVFILE *self, C_DRVOBJ *pDrvObj, int iMode, const T_FILEOBJ_METHODS *pMethods); /**< コンストラクタ */
+void DrvFile_Create(C_DRVFILE *self, C_DRVOBJ *pDrvObj, int iMode); /**< コンストラクタ */
#ifdef __cplusplus
}
/** コンストラクタ */
-void DrvFile_Create(C_DRVFILE *self, C_DRVOBJ *pDrvObj, int iMode, const T_FILEOBJ_METHODS *pMethods)
+void DrvFile_Create(C_DRVFILE *self, C_DRVOBJ *pDrvObj, int iMode)
{
/* 親クラスの初期化 */
- if ( pMethods == NULL )
- {
- pMethods = &DrvFile_FileObjMethods;
- }
- FileObj_Create(&self->FileObj, pMethods);
+ FileObj_Create(&self->FileObj, &DrvFile_FileObjMethods);
/* メンバ初期化 */
self->pDrvObj = pDrvObj;
#define __HOS__drvobj_h__
-#include "system/file/file.h"
-
+#include "system/file/fileobj.h"
struct c_drvobj;
/* デバイスドライバオブジェクト基本クラス メソッドテーブル */
typedef struct t_drvobj_methods
{
- T_HANDLEOBJ_METHODS HandlObjMethods;
- FILE_ERR (*pfncClose)(struct c_drvobj *self, HANDLE hFile);
- FILE_ERR (*pfncIoControl)(struct c_drvobj *self, HANDLE hFile, int iFunc, const void *pInBuf, FILE_SIZE InSize, void *pOutBuf, FILE_SIZE OutSize);
- FILE_POS (*pfncSeek)(struct c_drvobj *self, HANDLE hFile, FILE_POS Offset, int iOrign);
- FILE_SIZE (*pfncRead)(struct c_drvobj *self, HANDLE hFile, void *pBuf, FILE_SIZE Size);
- FILE_SIZE (*pfncWrite)(struct c_drvobj *self, HANDLE hFile, const void *pData, FILE_SIZE Size);
- FILE_ERR (*pfncFlush)(struct c_drvobj *self, HANDLE hFile);
+ HANDLE (*pfncOpen)(struct c_drvobj *self, const char *pszPath, int iMode);
+ FILE_ERR (*pfncClose)(struct c_drvobj *self, C_FILEOBJ *pFileObj);
+ FILE_ERR (*pfncIoControl)(struct c_drvobj *self, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize);
+ FILE_POS (*pfncSeek)(struct c_drvobj *self, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign);
+ FILE_SIZE (*pfncRead)(struct c_drvobj *self, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size);
+ FILE_SIZE (*pfncWrite)(struct c_drvobj *self, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size);
+ FILE_ERR (*pfncFlush)(struct c_drvobj *self, C_FILEOBJ *pFileObj);
} T_DRVOBJ_METHODS;
extern "C" {
#endif
-void DrvObj_Create(C_DRVOBJ *self, const T_DRVOBJ_METHODS *pMethods); /**< コンストラクタ */
-void DrvObj_Delete(C_DRVOBJ *self); /**< デストラクタ */
-
-HANDLE DrvObj_Open(C_DRVOBJ *self, int iMode);
-#define DrvObj_Close(self, hFile) (self)->pMethods->pfncClose((self), (hFile))
-#define DrvObj_IoControl(self, hFile, iFunc, pInBuf, InSize, pOutBuf, OutSize) \
- (self)->pMethods->pfncIoControl((self), (hFile), (iFunc), (pInBuf), (InSize), (pOutBuf), (OutSize))
-#define DrvObj_Seek(self, hFile, Offset, iOrign) (self)->pMethods->pfncSeek((self), (hFile), (Offset), (iOrign))
-#define DrvObj_Read(self, hFile, pBuf, Size) (self)->pMethods->pfncRead((self), (hFile), (pBuf), (Size))
-#define DrvObj_Write(self, hFile, pData, Size) (self)->pMethods->pfncWrite((self), (hFile), (pData), (Size))
-#define DrvObj_Flush(self, hFile) (self)->pMethods->pfncFlush((self), (hFile))
-
+void DrvObj_Create(C_DRVOBJ *self, const T_DRVOBJ_METHODS *pMethods); /**< コンストラクタ */
+void DrvObj_Delete(C_DRVOBJ *self); /**< デストラクタ */
+
+#define DrvObj_Open(self, pszPath, iMode) ((self)->pMethods->pfncOpen((self), (pszPath), (iMode)))
+#define DrvObj_Close(self, pFileObj) ((self)->pMethods->pfncClose((self), (pFileObj)))
+#define DrvObj_IoControl(self, pFileObj, iFunc, pInBuf, InSize, pOutBuf, OutSize) \
+ ((self)->pMethods->pfncIoControl((self), (pFileObj), (iFunc), (pInBuf), (InSize), (pOutBuf), (OutSize)))
+#define DrvObj_Seek(self, pFileObj, Offset, iOrign) ((self)->pMethods->pfncSeek((self), (pFileObj), (Offset), (iOrign)))
+#define DrvObj_Read(self, pFileObj, pBuf, Size) ((self)->pMethods->pfncRead((self), (pFileObj), (pBuf), (Size)))
+#define DrvObj_Write(self, pFileObj, pData, Size) ((self)->pMethods->pfncWrite((self), (pFileObj), (pData), (Size)))
+#define DrvObj_Flush(self, pFileObj) ((self)->pMethods->pfncFlush((self), (pFileObj)))
#ifdef __cplusplus
}
--- /dev/null
+
+#include "drvobj_local.h"
+
+
+/**< コンストラクタ */
+void DrvObj_Create(C_DRVOBJ *self, const T_DRVOBJ_METHODS *pMethods)
+{
+ self->pMethods = pMethods;
+}
+
+
extern "C" {
#endif
-FILE_ERR DrvObj_Close(HANDLE hDrv, HANDLE hFile);
-FILE_ERR DrvObj_IoControl(HANDLE hDrv, HANDLE hFile, int iFunc, const void *pInBuf, FILE_SIZE InSize, void *pOutBuf, FILE_SIZE OutSize);
-FILE_SIZE DrvObj_Read(HANDLE hDrv, HANDLE hFile, void *pBuf, FILE_POS Pos, FILE_SIZE Size);
-FILE_SIZE DrvObj_Write(HANDLE hDrv, HANDLE hFile, const void *pData, FILE_POS Pos, FILE_SIZE Size);
-FILE_ERR DrvObj_Flush(HANDLE hDrv, HANDLE hFile);
-
#ifdef __cplusplus
}
#endif
#define FILE_SEEK_CUR 1
#define FILE_SEEK_END 2
+
/* IoControl機能コード(共通) */
-#define FILE_IOCTL_GETDEVTYPE 0x0000 /* デバイスタイプを得る */
+#define FILE_IOCTL_GETDEVINF 0x0000 /* デバイス情報を得る */
#define FILE_IOCTL_SYNC 0x0001 /* 同期する */
#define FILE_IOCTL_GETSIZE 0x0010 /* ファイルサイズを取得 */
#define FILE_IOCTL_GETREADSIZE 0x0010 /* 読み込み可能サイズ(受信バッファ内のデータ量)を取得 */
#define FILE_IOCTL_RELREADBUF 0x0021 /* リードバッファ返却(省コピー版Read) */
#define FILE_IOCTL_GETWRITEBUF 0x0030 /* ライトバッファ取得(省コピー版Write) */
#define FILE_IOCTL_SENDWRITEBUF 0x0031 /* ライトバッファ送信(省コピー版Write) */
-#define FILE_IOCTL_RELWRITEBUF 0x0032 /* ライトバッファ破棄(省コピー版Write) */
+#define FILE_IOCTL_CANWRITEBUF 0x0032 /* ライトバッファ破棄(省コピー版Write) */
+
+/* IoControl機能コード(コンソール) */
+#define FILE_IOCTL_CON_GETCH 0x0101 /* 文字読込み */
/* IoControl機能コード(シリアル通信) */
#define FILE_IOCTL_COM_GETSPEED 0x2101 /* BPS取得 */
#define FILE_IOCTL_IP_SETMASK 0x2304 /* IPサブネットマスク設定 */
/* IoControl機能コード(ユーザー定義) */
-#define FILE_IOCTL_USER 0x6000 /* 0x6000〜0x7fff あたりを使ってね */
+#define FILE_IOCTL_USER 0x6000 /* 0x6000〜0x7fff */
+
/* 型定義 */
/* デバイス情報 */
+struct c_drvobj;
typedef struct t_file_devinf
{
- char szName[FILE_MAX_NAME]; /* ファイル名 */
- FILE_ERR (*pfncCreate)(HANDLE hFile, void *pParam, int iMode); /* コンストラクタアドレス */
- int ObjSize; /* オブジェクトのサイズ */
- void *pParam; /* オブジェクトの生成パラメータ */
+ char szName[FILE_MAX_NAME]; /* デバイス名 */
+ struct c_drvobj *pDrvObj; /* デバイスドライバへの参照 */
} T_FILE_DEVINF;
#endif
/* システム */
-void File_Initialize(void); /* ファイルシステムの初期化 */
+void File_Initialize(void); /* ファイルシステムの初期化 */
-FILE_ERR File_AddVolume(const T_FILE_VOLINF *pVolInf); /* ボリュームのマウント */
-FILE_ERR File_RemoveVolume(const T_FILE_VOLINF *pVolInf); /* ボリュームのマウント */
+FILE_ERR File_AddVolume(const T_FILE_VOLINF *pVolInf); /* ボリュームのマウント */
+FILE_ERR File_RemoveVolume(const T_FILE_VOLINF *pVolInf); /* ボリュームのマウント */
-FILE_ERR File_AddDevice(const T_FILE_DEVINF *pDevInf); /* デバイスファイルの追加 */
-FILE_ERR File_RemoveDevice(const char *pszName); /* デバイスファイルの削除 */
+FILE_ERR File_AddDevice(const T_FILE_DEVINF *pDevInf); /* デバイスファイルの追加 */
+FILE_ERR File_RemoveDevice(const char *pszName); /* デバイスファイルの削除 */
/* 基本API */
HANDLE File_Open(const char *pszPatah, int iMode);
#define File_Close(hFile) Handle_Close(hFile)
-FILE_ERR File_IoControl(HANDLE hFile, int iFunc, const void *pInBuf, FILE_SIZE InSize, void *pOutBuf, FILE_SIZE OutSize);
+FILE_ERR File_IoControl(HANDLE hFile, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize);
FILE_POS File_Seek(HANDLE hFile, FILE_POS Offset, int iOrign);
FILE_SIZE File_Read(HANDLE hFile, void *pBuf, FILE_SIZE Size);
FILE_SIZE File_Write(HANDLE hFile, const void *pData, FILE_SIZE Size);
/* 拡張操作 */
-FILE_ERR File_Sync(HANDLE hFile);
FILE_POS File_GetFileSize(HANDLE hFile);
FILE_SIZE File_GetReadSize(HANDLE hFile);
FILE_SIZE File_GetWriteSize(HANDLE hFile);
*/
-#include <stdio.h>
#include "file_local.h"
#include "fileobj.h"
-FILE_ERR File_IoControl(HANDLE hFile, int iFunc, const void *pInBuf, FILE_SIZE InSize, void *pOutBuf, FILE_SIZE OutSize)
+FILE_ERR File_IoControl(HANDLE hFile, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize)
{
C_FILEOBJ *self;
self = FILE_HANDLE2OBJ(hFile);
- if ( FileObj_GetMethods(self)->pfncIoControl != NULL )
- {
- return FileObj_GetMethods(self)->pfncIoControl(hFile, iFunc, pInBuf, InSize, pOutBuf, OutSize);
- }
-
- return FILE_ERR_NG;
+ return DrvObj_IoControl(self->pDrvObj, self, iFunc, pInBuf, InSize, pOutBuf, OutSize);
}
extern C_FILE g_File;
-
#endif /* __HOS__file_local_h__ */
HANDLE File_Open(const char *pszPatah, int iMode)
{
C_FILE *self;
- HANDLE hFile;
int iNameLen;
int i;
C_FILEOBJ *self;
self = FILE_HANDLE2OBJ(hFile);
-
- if ( FileObj_GetMethods(self)->pfncRead != NULL )
- {
- return FileObj_GetMethods(self)->pfncRead(hFile, pBuf, Size);
- }
-
- return FILE_ERR_NG;
+ self->pDrvObj;
+
+ return DrvObj_Read(self->pDrvObj, self, pBuf, Size);
}
C_FILEOBJ *self;
self = FILE_HANDLE2OBJ(hFile);
-
- if ( FileObj_GetMethods(self)->pfncSeek != NULL )
- {
- return FileObj_GetMethods(self)->pfncSeek(hFile, Offset, iOrign);
- }
-
- return FILE_ERR_NG;
+
+ return DrvObj_Seek(self->pDrvObj, self, Offset, iOrign);
}
C_FILEOBJ *self;
self = FILE_HANDLE2OBJ(hFile);
-
- if ( FileObj_GetMethods(self)->pfncWrite != NULL )
- {
- return FileObj_GetMethods(self)->pfncWrite(hFile, pData, Size);
- }
-
- return FILE_ERR_NG;
+
+ return DrvObj_Write(self->pDrvObj, self, pData, Size);
}
* @file fileobj.h
* @brief %jp{ファイルオブジェクト}
*
+ * %jp{ファイルディスクリプタとして機能するクラス}
+ *
* Copyright (C) 2006 by Project HOS
* http://sourceforge.jp/projects/hos/
*/
#include "system/handle/handleobj.h"
#include "system/file/file.h"
-#include "system/file/drvobj.h"
+struct c_drvobj;
/* ファイルオブジェクトクラス基本メソッドテーブル */
typedef struct t_fileobj_methods
{
- T_HANDLEOBJ_METHODS HandlObjMethods;
- FILE_ERR (*pfncIoControl)(HANDLE hFile, int iFunc, const void *pInBuf, FILE_SIZE InSize, void *pOutBuf, FILE_SIZE OutSize);
- FILE_POS (*pfncSeek)(HANDLE hFile, FILE_POS Offset, int iOrign);
- FILE_SIZE (*pfncRead)(HANDLE hFile, void *pBuf, FILE_SIZE Size);
- FILE_SIZE (*pfncWrite)(HANDLE hFile, const void *pData, FILE_SIZE Size);
- FILE_ERR (*pfncFlush)(HANDLE hFile);
+ T_HANDLEOBJ_METHODS HandlObjMethods; /* ハンドルオブジェクトを継承 */
} T_FILEOBJ_METHODS;
/* ファイルブジェクト基本クラス定義 */
typedef struct c_fileobj
{
- C_HANDLEOBJ HandleObj; /* ハンドルオブジェクトを継承 */
- C_DRVOBJ *pDrvObj; /* デバイスドライバ本体への参照 */
+ C_HANDLEOBJ HandleObj; /* ハンドルオブジェクトを継承 */
+ struct c_drvobj *pDrvObj; /* デバイスドライバへの参照 */
} C_FILEOBJ;
+#include "drvobj.h"
+
+
/* ハンドル変換 */
#define FILE_HANDLE2OBJ(hFile) ((C_FILEOBJ *)(hFile))
extern "C" {
#endif
-void FileObj_Create(C_FILEOBJ *self, const T_FILEOBJ_METHODS* pMethods);
-void FileObj_Delete(C_FILEOBJ *self);
-#define FileObj_GetMethods(self) ((T_FILEOBJ_METHODS *)HandleObj_GetMethods(&(self)->HandleObj))
+void FileObj_Create(C_FILEOBJ *self, struct c_drvobj *pDrvObj, const T_FILEOBJ_METHODS *pMethods);
+void FileObj_Delete(HANDLE self);
#ifdef __cplusplus
}
#endif
+
+
#endif /* __HOS__file_h__ */
#include "fileobj.h"
-void FileObj_Create(C_FILEOBJ *self, const T_FILEOBJ_METHODS* pMethods)
+static const T_FILEOBJ_METHODS FileObj_FileObjMethods =
+ {
+ {FileObj_Delete}, /* デストラクタ */
+ };
+
+
+void FileObj_Create(C_FILEOBJ *self, C_DRVOBJ *pDrvObj, const T_FILEOBJ_METHODS *pMethods)
{
+ if ( pMethods == NULL ) /* オーバーライド無しなら */
+ {
+ pMethods = &FileObj_FileObjMethods;
+ }
+
+ /* 親クラスコンストラクタ */
HandleObj_Create(&self->HandleObj, &pMethods->HandlObjMethods);
+
+ self->pDrvObj = pDrvObj;
}
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file fileobj_local.h
+ * @brief %jp{ファイルオブジェクト ローカルヘッダファイル}
+ *
+ * %jp{ファイルディスクリプタとして機能するクラス}
+ *
+ * Copyright (C) 2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#ifndef __HOS__fileobj_local_h__
+#define __HOS__fileobj_local_h__
+
+
+#include "fileobj.h"
+
+
+/* ハンドル変換 */
+#define FILE_HANDLE2OBJ(hFile) ((C_FILEOBJ *)(hFile))
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void FileObj_Delete(C_FILEOBJ *self); /**< デストラクタ */
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __HOS__fileobj_local_h__ */
+
+
+/* end of file */
self = (C_VOLUMEOBJ *)hVolume;
- if ( VolumeObj_GetMethods(self)->pfncOpenFile != NULL )
+ if ( self->pMethods->pfncOpenFile == NULL )
{
- return VolumeObj_GetMethods(self)->pfncOpenFile(hVolume, pszPath, iMode);
+ return HANDLE_NULL;
}
- return HANDLE_NULL;
+ return self->pMethods->pfncOpenFile(hVolume, pszPath, iMode);
}
/* ボリューム操作オブジェクトクラス基本メソッドテーブル */
typedef struct t_volumeobj_methods
{
- T_HANDLEOBJ_METHODS HandlObjMethods;
-
HANDLE (*pfncOpenFile)(HANDLE hVolume, const char *pszPath, int iMode); /* ファイルを開く */
FILE_ERR (*pfncMakeDir)(HANDLE hVolume, const char *pszPath); /* サブディレクトリを作成 */
FILE_ERR (*pfncRemove)(HANDLE hVolume, const char *pszPath); /* ファイルを削除 */
typedef struct c_volumeobj
{
- C_HANDLEOBJ HandleObj; /* ハンドルオブジェクトを継承 */
+ const T_VOLUMEOBJ_METHODS *pMethods;
} C_VOLUMEOBJ;
+
/* ハンドル変換 */
#define VOLUME_HANDLE2OBJ(hVolume) ((C_VOLUMEOBJ *)hVolume)
-
-
-
#ifdef __cplusplus
extern "C" {
#endif
void VolumeObj_Create(C_VOLUMEOBJ *self, const T_VOLUMEOBJ_METHODS *pVolumeObjMethods);
+void VolumeObj_Delete(C_VOLUMEOBJ *self);
+
#define VolumeObj_GetMethods(self) ((T_VOLUMEOBJ_METHODS *)HandleObj_GetMethods(&(self)->HandleObj))
void VolumeObj_Create(C_VOLUMEOBJ *self, const T_VOLUMEOBJ_METHODS *pVolumeObjMethods)
{
- HandleObj_Create(&self->HandleObj, &pVolumeObjMethods->HandlObjMethods);
+ self->pMethods = pVolumeObjMethods;
}
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file devvol.h
+ * @brief %jp{デバイスドライバをファイルとして管理するボリューム}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
#ifndef __HOS__devvol_h__
#define __HOS__devvol_h__
/* テーブルの空きを検索 */
for ( i = 0; i < DEVVOL_MAX_DEVICE; i++ )
{
- if ( self->DevTable[i].ObjSize == 0 )
+ if ( self->DevTable[i].pDrvObj == NULL )
{
self->DevTable[i] = *pDevInf;
return FILE_ERR_OK;
const T_VOLUMEOBJ_METHODS DevVol_VolumeObjMethods =
{
- { DevVol_Delete }, /* デストラクタ */
DevVol_OpenFile,
NULL,
NULL,
/* 初期化 */
for ( i = 0; i < DEVVOL_MAX_DEVICE; i++ )
{
- self->DevTable[i].ObjSize = 0;
+ self->DevTable[i].pDrvObj = NULL;
}
}
#include <string.h>
#include "devvol_local.h"
#include "system/sysapi/sysapi.h"
+#include "system/file/drvobj.h"
/* ファイルを開く */
HANDLE DevVol_OpenFile(HANDLE hVolume, const char *pszPath, int iMode)
{
C_DEVVOL *self;
- HANDLE hFile;
int i;
self = (C_DEVVOL *)hVolume;
return HANDLE_NULL;
}
- /* メモリ確保 */
- hFile = (HANDLE)SysMem_Alloc(self->DevTable[i].ObjSize);
- if ( hFile == 0 )
- {
- return HANDLE_NULL;
- }
-
- /* ファイルハンドル生成 */
- if ( self->DevTable[i].pfncCreate(hFile, self->DevTable[i].pParam, iMode) != FILE_ERR_OK )
- {
- SysMem_Free((void *)hFile);
- return HANDLE_NULL;
- }
-
- return hFile;
+ return DrvObj_Open(self->DevTable[i].pDrvObj, pszPath, iMode);
}
const T_FILEOBJ_METHODS FatFile_FileObjMethods =
{
- { FatFile_Delete }, /* デストラクタ */
+/* { FatFile_Delete }, */ /* デストラクタ */
FatFile_IoControl, /* IoControl */
FatFile_Seek, /* Seek */
FatFile_Read, /* Read */