OSDN Git Service

(none)
authorryuz <ryuz>
Sun, 20 May 2007 17:03:27 +0000 (17:03 +0000)
committerryuz <ryuz>
Sun, 20 May 2007 17:03:27 +0000 (17:03 +0000)
111 files changed:
aplfw/application/example/hello/hello.c
aplfw/application/filecmd/filelist/filelist.h [new file with mode: 0755]
aplfw/application/filecmd/filelist/filelist_main.c [new file with mode: 0755]
aplfw/application/netcmd/ethersnoop/ethersnoop.h [new file with mode: 0755]
aplfw/application/netcmd/ethersnoop/ethersnoop_main.c [new file with mode: 0755]
aplfw/build/common/gmake/aplfwsrc.inc
aplfw/driver/ether/lan9000/lan9000drv.h [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000drv_close.c [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000drv_create.c [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000drv_delete.c [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000drv_flush.c [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000drv_iocontrol.c [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000drv_isr.c [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000drv_local.h [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000drv_open.c [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000drv_read.c [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000drv_seek.c [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000drv_write.c [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000hal.h [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000hal_create.c [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000hal_delete.c [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000hal_enableinterrupt.c [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000hal_getinterruptstatus.c [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000hal_getphysicaladdr.c [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000hal_local.h [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000hal_mii.c [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000hal_phyregread.c [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000hal_phyregwrite.c [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000hal_recv.c [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000hal_send.c [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000hal_setinterruptmask.c [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000hal_setup.c [new file with mode: 0755]
aplfw/driver/ether/lan9000/lan9000hal_stop.c [new file with mode: 0755]
aplfw/driver/ether/ne2000/ne2000drv.c
aplfw/driver/ether/ne2000/ne2000drv.h
aplfw/driver/ether/ne2000/ne2000drv_local.h [new file with mode: 0755]
aplfw/driver/misc/memdrv/memdrv.h [new file with mode: 0755]
aplfw/driver/misc/memdrv/memdrv_close.c [new file with mode: 0755]
aplfw/driver/misc/memdrv/memdrv_create.c [new file with mode: 0755]
aplfw/driver/misc/memdrv/memdrv_delete.c [new file with mode: 0755]
aplfw/driver/misc/memdrv/memdrv_flush.c [new file with mode: 0755]
aplfw/driver/misc/memdrv/memdrv_iocontrol.c [new file with mode: 0755]
aplfw/driver/misc/memdrv/memdrv_local.h [new file with mode: 0755]
aplfw/driver/misc/memdrv/memdrv_open.c [new file with mode: 0755]
aplfw/driver/misc/memdrv/memdrv_read.c [new file with mode: 0755]
aplfw/driver/misc/memdrv/memdrv_seek.c [new file with mode: 0755]
aplfw/driver/misc/memdrv/memdrv_write.c [new file with mode: 0755]
aplfw/driver/serial/pc16550/pc16550drv.h
aplfw/driver/serial/pc16550/pc16550drv_close.c
aplfw/driver/serial/pc16550/pc16550drv_local.h
aplfw/driver/volume/fat/fatvol.h [new file with mode: 0755]
aplfw/driver/volume/fat/fatvol_clusterread.c [new file with mode: 0755]
aplfw/driver/volume/fat/fatvol_clusterwrite.c [new file with mode: 0755]
aplfw/driver/volume/fat/fatvol_create.c [new file with mode: 0755]
aplfw/driver/volume/fat/fatvol_createfile.c [new file with mode: 0755]
aplfw/driver/volume/fat/fatvol_flushfat.c [new file with mode: 0755]
aplfw/driver/volume/fat/fatvol_getclusterbuf.c [new file with mode: 0755]
aplfw/driver/volume/fat/fatvol_getnextcluster.c [new file with mode: 0755]
aplfw/driver/volume/fat/fatvol_local.h [new file with mode: 0755]
aplfw/driver/volume/fat/fatvol_open.c [new file with mode: 0755]
aplfw/driver/volume/fat/fatvol_relclusterbuf.c [new file with mode: 0755]
aplfw/driver/volume/fat/fatvol_setnextcluster.c [new file with mode: 0755]
aplfw/sample/arm/ez_arm7/sample.c
aplfw/sample/sh/cq7144a/sample.c
aplfw/system/file/chrdrv.h
aplfw/system/file/chrdrv_delete.c [new file with mode: 0755]
aplfw/system/file/chrfile.h
aplfw/system/file/drvobj.h
aplfw/system/file/drvobj_close.c [new file with mode: 0755]
aplfw/system/file/drvobj_create.c
aplfw/system/file/drvobj_flush.c [new file with mode: 0755]
aplfw/system/file/drvobj_iocontrol.c [new file with mode: 0755]
aplfw/system/file/drvobj_open.c [new file with mode: 0755]
aplfw/system/file/drvobj_read.c [new file with mode: 0755]
aplfw/system/file/drvobj_seek.c [new file with mode: 0755]
aplfw/system/file/drvobj_write.c [new file with mode: 0755]
aplfw/system/file/file.h
aplfw/system/file/file_adddevice.c
aplfw/system/file/file_addvolume.c
aplfw/system/file/file_close.c [new file with mode: 0755]
aplfw/system/file/file_initialize.c
aplfw/system/file/file_iocontrol.c
aplfw/system/file/file_local.h
aplfw/system/file/file_open.c
aplfw/system/file/file_read.c
aplfw/system/file/file_readdir.c [new file with mode: 0755]
aplfw/system/file/file_seek.c
aplfw/system/file/file_write.c
aplfw/system/file/fileobj.h
aplfw/system/file/fileobj_create.c
aplfw/system/file/fileobj_delete.c
aplfw/system/file/sysvol.h [new file with mode: 0755]
aplfw/system/file/sysvol_adddevice.c [new file with mode: 0755]
aplfw/system/file/sysvol_close.c [new file with mode: 0755]
aplfw/system/file/sysvol_create.c [new file with mode: 0755]
aplfw/system/file/sysvol_delete.c [new file with mode: 0755]
aplfw/system/file/sysvol_iocontrol.c [new file with mode: 0755]
aplfw/system/file/sysvol_local.h [new file with mode: 0755]
aplfw/system/file/sysvol_open.c [new file with mode: 0755]
aplfw/system/file/volumeobj.h
aplfw/system/file/volumeobj_create.c
aplfw/system/file/volumeobj_makedir.c [new file with mode: 0755]
aplfw/system/file/volumeobj_remove.c [new file with mode: 0755]
aplfw/system/handle/handle_close.c
aplfw/system/handle/handleobj.h
aplfw/system/handle/handleobj_create.c
aplfw/system/handle/handleobj_delete.c
aplfw/system/process/procobj.h
aplfw/volume/dev/devvol_create.c
aplfw/volume/dev/devvol_openfile.c
kernel/build/common/gmake/shc_d.inc

index a0ab5af..f81e8db 100755 (executable)
@@ -1,3 +1,4 @@
+/* 磁七磁磁邪磁 */
 
 #include <string.h>
 #include "hosaplfw.h"
diff --git a/aplfw/application/filecmd/filelist/filelist.h b/aplfw/application/filecmd/filelist/filelist.h
new file mode 100755 (executable)
index 0000000..4e91294
--- /dev/null
@@ -0,0 +1,31 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  filelist.h
+ * @brief %jp{ファイルリストコマンド}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#ifndef __HOS__filelist_h__
+#define __HOS__filelist_h__
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int FileList_Main(int argc, char *argv[]);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __HOS__filelist_h__
+ */
+
+
+/* end of file */
diff --git a/aplfw/application/filecmd/filelist/filelist_main.c b/aplfw/application/filecmd/filelist/filelist_main.c
new file mode 100755 (executable)
index 0000000..4d957b9
--- /dev/null
@@ -0,0 +1,45 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  filelist.h
+ * @brief %jp{ファイルリストコマンド}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include "hosaplfw.h"
+#include "filelist.h"
+
+
+int FileList_Main(int argc, char *argv[])
+{
+       T_FILE_FILEINF  FileInf;
+       HANDLE                  hDir;
+       
+       if ( argc < 2 )
+       {
+               return 1;
+       }
+       
+       /* ディレクトリを開く */       
+       if ( (hDir = File_Open(argv[1], FILE_OPEN_READ | FILE_OPEN_DIR)) == HANDLE_NULL )
+       {
+               return 0;
+       }
+       
+       /* ディレクトリを読み出す */ 
+       while ( File_ReadDir(hDir, &FileInf) == FILE_ERR_OK )
+       {
+               StdIo_PrintFormat("%s\n", FileInf.szFileName);
+       }
+
+       /* ディレクトリを閉じる */    
+       File_Close(hDir);
+
+       return 0;
+}
+
+
diff --git a/aplfw/application/netcmd/ethersnoop/ethersnoop.h b/aplfw/application/netcmd/ethersnoop/ethersnoop.h
new file mode 100755 (executable)
index 0000000..8d69cd8
--- /dev/null
@@ -0,0 +1,31 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  ethersnoop.h
+ * @brief %jp{Etherモニタリング}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#ifndef __HOS__ethersnoop_h__
+#define __HOS__ethersnoop_h__
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int EtherSnoop_Main(int argc, char *argv[]);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __HOS__ethersnoop_h__
+ */
+
+
+/* end of file */
diff --git a/aplfw/application/netcmd/ethersnoop/ethersnoop_main.c b/aplfw/application/netcmd/ethersnoop/ethersnoop_main.c
new file mode 100755 (executable)
index 0000000..f18cc29
--- /dev/null
@@ -0,0 +1,57 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  filelist.h
+ * @brief %jp{ファイルリストコマンド}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include "hosaplfw.h"
+#include "ethersnoop.h"
+
+
+int EtherSnoop_Main(int argc, char *argv[])
+{
+       HANDLE                  hEther;
+       unsigned char   *pubBuf;
+       FILE_SIZE               Size;
+       FILE_SIZE               i;
+       
+       if ( argc < 2 )
+       {
+               return 1;
+       }
+       
+       /* Etherポートを開く */   
+       if ( (hEther = File_Open(argv[1], FILE_OPEN_READ)) == HANDLE_NULL )
+       {
+               return 1;
+       }
+       
+       /* バッファメモリ確保 */
+       if ( (pubBuf = Memory_Alloc(4096)) == NULL )
+       {
+               return 1;
+       }
+       
+       /* ディレクトリを読み出す */ 
+       while ( (Size = File_Read(hEther, pubBuf, 4096)) > 0 )
+       {
+               for ( i = 0; i < Size; i++ )
+               {
+                       StdIo_PrintFormat("%02x ", pubBuf[i]);
+               }
+               StdIo_PutChar('\n');
+       }
+       
+       Memory_Free(pubBuf);
+       File_Close(hEther);
+
+       return 0;
+}
+
+
index 0a71ea6..bf245d0 100755 (executable)
@@ -81,27 +81,44 @@ FILE_DIR       = $(APLFW_DIR)/system/file
 SRC_DIRS      += $(FILE_DIR)
 CSRCS         += $(FILE_DIR)/file_initialize.c                                         \
                  $(FILE_DIR)/file_open.c                                                       \
+                 $(FILE_DIR)/file_close.c                                                      \
                  $(FILE_DIR)/file_iocontrol.c                                          \
                  $(FILE_DIR)/file_seek.c                                                       \
                  $(FILE_DIR)/file_read.c                                                       \
                  $(FILE_DIR)/file_write.c                                                      \
+                 $(FILE_DIR)/file_readdir.c                                                    \
                  $(FILE_DIR)/file_getchar.c                                                    \
                  $(FILE_DIR)/file_getstring.c                                          \
                  $(FILE_DIR)/file_putchar.c                                                    \
                  $(FILE_DIR)/file_putstring.c                                          \
                  $(FILE_DIR)/file_adddevice.c                                          \
                  $(FILE_DIR)/file_addvolume.c                                          \
-                 $(FILE_DIR)/filefmt.c                                                         \
-                 $(FILE_DIR)/fileobj_create.c                                          \
-                 $(FILE_DIR)/fileobj_delete.c                                          \
-                 $(FILE_DIR)/stdfile.c                                                         \
-                 $(FILE_DIR)/console_getch.c                                           \
                  $(FILE_DIR)/drvobj_create.c                                           \
                  $(FILE_DIR)/drvobj_delete.c                                           \
+                 $(FILE_DIR)/drvobj_open.c                                                     \
+                 $(FILE_DIR)/drvobj_close.c                                                    \
+                 $(FILE_DIR)/drvobj_iocontrol.c                                                \
+                 $(FILE_DIR)/drvobj_seek.c                                                     \
+                 $(FILE_DIR)/drvobj_read.c                                                     \
+                 $(FILE_DIR)/drvobj_write.c                                                    \
+                 $(FILE_DIR)/drvobj_flush.c                                                    \
+                 $(FILE_DIR)/fileobj_create.c                                          \
+                 $(FILE_DIR)/fileobj_delete.c                                          \
+                 $(FILE_DIR)/volumeobj_create.c                                                \
+                 $(FILE_DIR)/volumeobj_makedir.c                                       \
+                 $(FILE_DIR)/volumeobj_remove.c                                                \
                  $(FILE_DIR)/chrdrv_create.c                                           \
+                 $(FILE_DIR)/chrdrv_delete.c                                           \
                  $(FILE_DIR)/chrfile_create.c                                          \
-                 $(FILE_DIR)/volume_openfile.c                                         \
-                 $(FILE_DIR)/volumeobj_create.c
+                 $(FILE_DIR)/sysvol_create.c                                           \
+                 $(FILE_DIR)/sysvol_delete.c                                           \
+                 $(FILE_DIR)/sysvol_open.c                                                     \
+                 $(FILE_DIR)/sysvol_close.c                                                    \
+                 $(FILE_DIR)/sysvol_iocontrol.c                                                \
+                 $(FILE_DIR)/sysvol_adddevice.c                                                \
+                 $(FILE_DIR)/console_getch.c                                           \
+                 $(FILE_DIR)/filefmt.c                                                         \
+                 $(FILE_DIR)/stdfile.c
 
 
 # Command
@@ -155,36 +172,6 @@ CSRCS         += $(LIST_DIR)/list_create.c                                                 \
 
 
 # --------------------------------------------------
-#  Volumes
-# --------------------------------------------------
-
-# Device Volume
-DEVVOL_DIR     = $(APLFW_DIR)/volume/dev
-SRC_DIRS      += $(DEVVOL_DIR)
-CSRCS         += $(DEVVOL_DIR)/devvol_create.c                                         \
-                 $(DEVVOL_DIR)/devvol_delete.c                                         \
-                 $(DEVVOL_DIR)/devvol_adddevice.c                                      \
-                 $(DEVVOL_DIR)/devvol_openfile.c
-
-
-# FAT Device
-#SRC_DIRS += $(APLFW_DIR)/volume/fat
-#CSRCS    += $(APLFW_DIR)/volume/fat/fatvol_clusterread.c                      \
-#            $(APLFW_DIR)/volume/fat/fatvol_clusterwrite.c                     \
-#            $(APLFW_DIR)/volume/fat/fatvol_create.c                           \
-#            $(APLFW_DIR)/volume/fat/fatvol_open.c                                     \
-#            $(APLFW_DIR)/volume/fat/fatvol_getclusterbuf.c                    \
-#            $(APLFW_DIR)/volume/fat/fatvol_getnextcluster.c           \
-#            $(APLFW_DIR)/volume/fat/fatvol_relclusterbuf.c                    \
-#            $(APLFW_DIR)/volume/fat/fatvol_setnextcluster.c           \
-#            $(APLFW_DIR)/volume/fat/fatvol_flushfat.c                         \
-#            $(APLFW_DIR)/volume/fat/fatfile_create.c                          \
-#            $(APLFW_DIR)/volume/fat/fatfile_read.c                                    \
-
-
-
-
-# --------------------------------------------------
 #  Device Drivers
 # --------------------------------------------------
 
@@ -242,6 +229,12 @@ SRC_DIRS      += $(HELLO_DIR)
 CSRCS         += $(HELLO_DIR)/hello.c
 
 
+# File List
+FILELIST_DIR   = $(APLFW_DIR)/application/filecmd/filelist
+SRC_DIRS      += $(FILELIST_DIR)
+CSRCS         += $(FILELIST_DIR)/filelist_main.c
+
+
 # Memory Dump
 MEMDUMP_DIR    = $(APLFW_DIR)/application/utility/memdump
 SRC_DIRS      += $(MEMDUMP_DIR)
diff --git a/aplfw/driver/ether/lan9000/lan9000drv.h b/aplfw/driver/ether/lan9000/lan9000drv.h
new file mode 100755 (executable)
index 0000000..b47fac2
--- /dev/null
@@ -0,0 +1,52 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  lan9000drv.h
+ * @brief %jp{LAN9000ファミリー用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#ifndef __HOS__lan9000drv_h__
+#define __HOS__lan9000drv_h__
+
+
+#include "system/sysapi/sysapi.h"
+#include "system/file/chrdrv.h"
+#include "lan9000hal.h"
+
+
+/* LAN9000ファミリー用ドライバ制御部 */
+typedef struct c_lan9000drv
+{
+       C_CHRDRV                ChrDrv;                 /* キャラクタ型デバイスドライバを継承 */
+
+       C_LAN9000HAL    Lan9000Hal;             /* ハードウェア制御クラス */
+       int                             iOpenCount;             /* オープンカウンタ */
+       int                             iIntNum;                /* 割込み番号 */
+       SYSISR_HANDLE   hIsr;                   /* 割り込みサービスハンドル */
+       SYSMTX_HANDLE   hMtx;                   /* 排他制御ミューテックス */
+       SYSEVT_HANDLE   hEvtSend;               /* 送信イベント */
+       SYSEVT_HANDLE   hEvtRecv;               /* 受信イベント */
+} C_LAN9000DRV;
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void Lan9000Drv_Create(C_LAN9000DRV *self, void *pRegAddr, int iIntNum);       /**< コンストラクタ */
+void Lan9000Drv_Delete(C_DRVOBJ *pDrvObj);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __HOS__lan9000drv_h__ */
+
+
+/* end of file */
diff --git a/aplfw/driver/ether/lan9000/lan9000drv_close.c b/aplfw/driver/ether/lan9000/lan9000drv_close.c
new file mode 100755 (executable)
index 0000000..f16255e
--- /dev/null
@@ -0,0 +1,38 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  scidrv.c
+ * @brief %jp{LAN9000用デバイスドライバ}
+ *
+ * Copyright (C) 2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "lan9000drv_local.h"
+
+
+/** クローズ */
+void Lan9000Drv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
+{
+       C_LAN9000DRV    *self;
+       C_CHRFILE               *pFile;
+       
+       /* upper cast */
+       self  = (C_LAN9000DRV *)pDrvObj;
+       pFile = (C_CHRFILE *)pFileObj;
+
+       /* クローズ処理 */
+       if ( --self->iOpenCount == 0 )
+       {
+               SysInt_Disable(self->iIntNum);
+               Lan9000Hal_Stop(&self->Lan9000Hal);
+       }
+       
+       /* ディスクリプタ削除 */
+       ChrFile_Delete(pFile);  
+       SysMem_Free(pFileObj);
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/ether/lan9000/lan9000drv_create.c b/aplfw/driver/ether/lan9000/lan9000drv_create.c
new file mode 100755 (executable)
index 0000000..a63ab39
--- /dev/null
@@ -0,0 +1,54 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  lan9000drv.h
+ * @brief %jp{LAN9000ファミリー用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "lan9000drv_local.h"
+
+
+/* 仮想関数テーブル */
+static const T_DRVOBJ_METHODS Lan9000Drv_Methods = 
+       {
+               Lan9000Drv_Delete,
+               Lan9000Drv_Open,
+               Lan9000Drv_Close,
+               Lan9000Drv_IoControl,
+               Lan9000Drv_Seek,
+               Lan9000Drv_Read,
+               Lan9000Drv_Write,
+               Lan9000Drv_Flush,
+       };
+
+
+/** コンストラクタ */
+void Lan9000Drv_Create(C_LAN9000DRV *self, void *pRegAddr, int iIntNum)
+{
+       /* 親クラスコンストラクタ呼び出し */
+       ChrDrv_Create(&self->ChrDrv, &Lan9000Drv_Methods);
+
+       /* メンバ変数初期化 */
+       self->iOpenCount = 0;
+       
+       /* Lan9000Hal 初期化 */
+       Lan9000Hal_Create(&self->Lan9000Hal, pRegAddr);
+       
+       /* イベント生成 */
+       self->hEvtRecv = SysEvt_Create();
+       self->hEvtSend = SysEvt_Create();
+
+       /* ミューテックス生成 */
+       self->hMtx = SysMtx_Create();
+
+       /* 割込み処理登録 */
+       self->iIntNum = iIntNum;
+       self->hIsr = SysIsr_Create(iIntNum, Lan9000Drv_Isr, (VPARAM)self);
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/ether/lan9000/lan9000drv_delete.c b/aplfw/driver/ether/lan9000/lan9000drv_delete.c
new file mode 100755 (executable)
index 0000000..f3f69db
--- /dev/null
@@ -0,0 +1,33 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  lan9000drv.h
+ * @brief %jp{LAN9000ファミリー用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "lan9000drv_local.h"
+
+
+/** デストラクタ */
+void Lan9000Drv_Delete(C_DRVOBJ *pDrvObj)
+{
+       C_LAN9000DRV    *self;
+       
+       /* upper cast */
+       self = (C_LAN9000DRV *)pDrvObj;
+
+       /* 割込み処理解除 */
+       SysIsr_Delete(self->hIsr);
+
+       /* 同期オブジェクト削除 */
+       SysEvt_Delete(self->hEvtRecv);
+       SysEvt_Delete(self->hEvtSend);
+       SysMtx_Delete(self->hMtx);
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/ether/lan9000/lan9000drv_flush.c b/aplfw/driver/ether/lan9000/lan9000drv_flush.c
new file mode 100755 (executable)
index 0000000..a0e42e8
--- /dev/null
@@ -0,0 +1,28 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  scidrv.c
+ * @brief %jp{LAN9000用デバイスドライバ}
+ *
+ * Copyright (C) 2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "lan9000drv_local.h"
+
+
+FILE_ERR Lan9000Drv_Flush(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
+{
+       C_LAN9000DRV    *self;
+       C_CHRFILE               *pChrFile;
+       
+       /* upper cast */
+       self     = (C_LAN9000DRV *)pDrvObj;
+       pChrFile = (C_CHRFILE *)pFileObj;
+
+       return FILE_ERR_OK;
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/ether/lan9000/lan9000drv_iocontrol.c b/aplfw/driver/ether/lan9000/lan9000drv_iocontrol.c
new file mode 100755 (executable)
index 0000000..a7603e0
--- /dev/null
@@ -0,0 +1,28 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  scidrv.c
+ * @brief %jp{LAN9000用デバイスドライバ}
+ *
+ * Copyright (C) 2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "lan9000drv_local.h"
+
+
+FILE_ERR  Lan9000Drv_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize)
+{
+       C_LAN9000DRV    *self;
+       C_CHRFILE               *pChrFile;
+       
+       /* upper cast */
+       self     = (C_LAN9000DRV *)pDrvObj;
+       pChrFile = (C_CHRFILE *)pFileObj;
+
+       return FILE_ERR_NG;
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/ether/lan9000/lan9000drv_isr.c b/aplfw/driver/ether/lan9000/lan9000drv_isr.c
new file mode 100755 (executable)
index 0000000..7a2ca78
--- /dev/null
@@ -0,0 +1,48 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  scidrv.c
+ * @brief %jp{LAN9000用デバイスドライバ}
+ *
+ * Copyright (C) 2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "lan9000drv_local.h"
+
+
+/* 受信割り込み */
+void Lan9000Drv_Isr(VPARAM Param)
+{
+       C_LAN9000DRV    *self;
+       unsigned short  uhStatus;
+
+       self = (C_LAN9000DRV *)Param;
+       
+       /* 状態取得 */
+       uhStatus = Lan9000Hal_GetInterruptStatus(&self->Lan9000Hal);
+       
+       /* 受信していたら */
+       if ( uhStatus & LAN9000HAL_ISTATUS_RCVINT )
+       {
+               SysEvt_Set(self->hEvtRecv);
+               uhStatus &= ~LAN9000HAL_IMASK_RCVINT;
+       }
+
+       /* 送信可能なら */
+       if ( uhStatus & LAN9000HAL_ISTATUS_ALLOCINT )
+       {
+               SysEvt_Set(self->hEvtSend);
+               uhStatus &= ~LAN9000HAL_IMASK_ALLOCINT;
+       }
+       
+       /* 割込みマスク更新 */
+       Lan9000Hal_SetInterruptMask(&self->Lan9000Hal, uhStatus);       
+       
+       /* 割込みクリア */
+       SysInt_Clear(self->iIntNum);
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/ether/lan9000/lan9000drv_local.h b/aplfw/driver/ether/lan9000/lan9000drv_local.h
new file mode 100755 (executable)
index 0000000..14a8404
--- /dev/null
@@ -0,0 +1,42 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  lan9000drv.h
+ * @brief %jp{LAN9000ファミリー用デバイスドライバ ローカルヘッダファイル}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#ifndef __HOS__lan9000drv_local_h__
+#define __HOS__lan9000drv_local_h__
+
+
+#include "lan9000drv.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+HANDLE    Lan9000Drv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode);
+void      Lan9000Drv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj);
+FILE_ERR  Lan9000Drv_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize);
+FILE_POS  Lan9000Drv_Seek(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign);
+FILE_SIZE Lan9000Drv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size);
+FILE_SIZE Lan9000Drv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size);
+FILE_ERR  Lan9000Drv_Flush(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj);
+
+void      Lan9000Drv_Isr(VPARAM Param);                        /* 割込み処理 */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __HOS__lan9000drv_local_h__ */
+
+
+/* end of file */
diff --git a/aplfw/driver/ether/lan9000/lan9000drv_open.c b/aplfw/driver/ether/lan9000/lan9000drv_open.c
new file mode 100755 (executable)
index 0000000..61060c6
--- /dev/null
@@ -0,0 +1,44 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  scidrv.c
+ * @brief %jp{LAN9000用デバイスドライバ}
+ *
+ * Copyright (C) 2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "lan9000drv_local.h"
+
+
+/** オープン */
+HANDLE Lan9000Drv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
+{
+       C_LAN9000DRV    *self;
+       C_CHRFILE               *pFile;
+       
+       /* upper cast */
+       self = (C_LAN9000DRV *)pDrvObj;
+
+       /* create file descriptor */
+       if ( (pFile = SysMem_Alloc(sizeof(C_CHRFILE))) == NULL )
+       {
+               return HANDLE_NULL;
+       }
+       ChrFile_Create(pFile, pDrvObj, NULL);
+
+       
+       /* オープン処理 */
+       if ( self->iOpenCount++ == 0 )
+       {
+               Lan9000Hal_Setup(&self->Lan9000Hal);
+               Lan9000Hal_SetInterruptMask(&self->Lan9000Hal, LAN9000HAL_IMASK_RCVINT);
+               SysInt_Enable(self->iIntNum);
+       }
+       
+       return (HANDLE)pFile;
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/ether/lan9000/lan9000drv_read.c b/aplfw/driver/ether/lan9000/lan9000drv_read.c
new file mode 100755 (executable)
index 0000000..013158a
--- /dev/null
@@ -0,0 +1,55 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  scidrv.c
+ * @brief %jp{LAN9000用デバイスドライバ}
+ *
+ * Copyright (C) 2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "lan9000drv_local.h"
+
+
+/** %jp{受信} */
+FILE_SIZE Lan9000Drv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size)
+{
+       C_LAN9000DRV    *self;
+       C_CHRFILE               *pFile;
+       FILE_SIZE               RecvSize;
+       unsigned short  uhStatus;
+               
+       /* upper cast */
+       self  = (C_LAN9000DRV *)pDrvObj;
+       pFile = (C_CHRFILE *)pFileObj;
+
+
+       /* クリティカルセクションに入る */
+       SysMtx_Lock(self->hMtx);
+
+       while ( (RecvSize = Lan9000Hal_Recv(&self->Lan9000Hal, pBuf, Size)) == 0 )
+       {
+               if ( pFile->cReadMode != FILE_RMODE_BLOCKING )
+               {
+                       break;
+               }
+               
+               uhStatus = Lan9000Hal_GetInterruptStatus(&self->Lan9000Hal);
+               Lan9000Hal_SetInterruptMask(&self->Lan9000Hal, (uhStatus | LAN9000HAL_IMASK_RCVINT));
+
+               /* ブロッキングなら受信イベントを待つ */
+               SysMtx_Unlock(self->hMtx);
+               SysEvt_Wait(self->hEvtRecv);
+               SysEvt_Clear(self->hEvtRecv);
+               SysMtx_Lock(self->hMtx);
+       }
+       
+       /* クリティカルセクションを出る */
+       SysMtx_Unlock(self->hMtx);
+
+       return RecvSize;
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/ether/lan9000/lan9000drv_seek.c b/aplfw/driver/ether/lan9000/lan9000drv_seek.c
new file mode 100755 (executable)
index 0000000..239935d
--- /dev/null
@@ -0,0 +1,28 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  scidrv.c
+ * @brief %jp{LAN9000用デバイスドライバ}
+ *
+ * Copyright (C) 2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "lan9000drv_local.h"
+
+
+FILE_POS Lan9000Drv_Seek(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign)
+{
+       C_LAN9000DRV    *self;
+       C_CHRFILE               *pChrFile;
+       
+       /* upper cast */
+       self     = (C_LAN9000DRV *)pDrvObj;
+       pChrFile = (C_CHRFILE *)pFileObj;
+
+       return FILE_ERR_NG;
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/ether/lan9000/lan9000drv_write.c b/aplfw/driver/ether/lan9000/lan9000drv_write.c
new file mode 100755 (executable)
index 0000000..95e57a7
--- /dev/null
@@ -0,0 +1,55 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  scidrv.c
+ * @brief %jp{LAN9000用デバイスドライバ}
+ *
+ * Copyright (C) 2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "lan9000drv_local.h"
+
+
+/** %jp{送信} */
+FILE_SIZE Lan9000Drv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size)
+{
+       C_LAN9000DRV    *self;
+       C_CHRFILE               *pFile;
+       FILE_SIZE               SendSize;
+       unsigned short  uhStatus;
+       
+       /* upper cast */
+       self  = (C_LAN9000DRV *)pDrvObj;
+       pFile = (C_CHRFILE *)pFileObj;
+
+       /* クリティカルセクションに入る */
+       SysMtx_Lock(self->hMtx);
+
+       while ( (SendSize = Lan9000Hal_Send(&self->Lan9000Hal, pData, Size)) == 0 )
+       {
+               if ( pFile->cWriteMode != FILE_WMODE_BLOCKING )
+               {
+                       break;
+               }
+               
+               /* ブロッキングなら送信割り込みを待つ */
+               uhStatus = Lan9000Hal_GetInterruptStatus(&self->Lan9000Hal);
+               Lan9000Hal_SetInterruptMask(&self->Lan9000Hal, (uhStatus | LAN9000HAL_IMASK_ALLOCINT));
+               
+               SysMtx_Unlock(self->hMtx);
+               SysEvt_Wait(self->hEvtSend);
+               SysEvt_Clear(self->hEvtSend);
+               SysMtx_Lock(self->hMtx);
+       }
+       
+       /* クリティカルセクションを出る */
+       SysMtx_Unlock(self->hMtx);
+
+       return SendSize;
+}
+
+
+
+/* end of file */
diff --git a/aplfw/driver/ether/lan9000/lan9000hal.h b/aplfw/driver/ether/lan9000/lan9000hal.h
new file mode 100755 (executable)
index 0000000..79b2dc1
--- /dev/null
@@ -0,0 +1,66 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  lan9000hal.h
+ * @brief %jp{LAN9000シリーズ用ハードウェアアクセス層}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#ifndef __HOS__lan9000hal_h__
+#define __HOS__lan9000hal_h__
+
+
+
+#define LAN9000HAL_ISTATUS_RCVINT                      0x0001
+#define LAN9000HAL_ISTATUS_TXINT                       0x0002
+#define LAN9000HAL_ISTATUS_TX_EMPTYINT         0x0004
+#define LAN9000HAL_ISTATUS_ALLOCINT                    0x0008
+#define LAN9000HAL_ISTATUS_RX_OVRNINT          0x0010
+#define LAN9000HAL_ISTATUS_EPHINT                      0x0020
+#define LAN9000HAL_ISTATUS_ERCVINT                     0x0040
+#define LAN9000HAL_ISTATUS_MDINT                       0x0080
+
+#define LAN9000HAL_IMASK_RCVINT                                0x0100
+#define LAN9000HAL_IMASK_TXINT                         0x0200
+#define LAN9000HAL_IMASK_TX_EMPTYINT           0x0400
+#define LAN9000HAL_IMASK_ALLOCINT                      0x0800
+#define LAN9000HAL_IMASK_RX_OVRNINT                    0x1000
+#define LAN9000HAL_IMASK_EPHINT                                0x2000
+#define LAN9000HAL_IMASK_ERCVINT                       0x4000
+#define LAN9000HAL_IMASK_MDINT                         0x8000
+
+
+/* ハードウェアアクセス層 */
+typedef struct c_lan9000hal
+{
+       void                    *pRegBase;                      /* レジスタのベースアドレス */
+       unsigned char   ubPhysicalAddr[6];      /* 物理アドレス */
+} C_LAN9000HAL;
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void           Lan9000Hal_Create(C_LAN9000HAL *self, void *pRegAddr);                                                          /**< %jp{コンストラクタ} */
+void           Lan9000Hal_Delete(C_LAN9000HAL *self);                                                                                          /**< %jp{デストラクタ} */
+int            Lan9000Hal_Setup(C_LAN9000HAL *self);                                                                                           /**< %jp{初期化} */
+void           Lan9000Hal_Stop(C_LAN9000HAL *self);                                                                                                    /**< %jp{停止} */
+int            Lan9000Hal_Recv(C_LAN9000HAL *self, void *pBuf, int iSize);                                                     /**< %jp{パケット受信} */
+int            Lan9000Hal_Send(C_LAN9000HAL *self, const void *pData, int iSize);                                      /**< %jp{パケット送信} */
+void           Lan9000Hal_SetInterruptMask(C_LAN9000HAL *self, unsigned short uhIntMask);                      /**< %jp{割込みマスク設定} */
+unsigned short Lan9000Hal_GetInterruptStatus(C_LAN9000HAL *self);                                                                      /**< %jp{割込み状態取得} */
+void           Lan9000Hal_GetPhysicalAddr(C_LAN9000HAL *self, unsigned char ubPhysicalAddr[6]);                /**< %jp{物理アドレス取得} */
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __HOS__lan9000hal_h__ */
+
+
+/* end of file */
diff --git a/aplfw/driver/ether/lan9000/lan9000hal_create.c b/aplfw/driver/ether/lan9000/lan9000hal_create.c
new file mode 100755 (executable)
index 0000000..54c5d92
--- /dev/null
@@ -0,0 +1,31 @@
+/**
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  lan9000hal.h
+ * @brief %jp{LAN9000シリーズ用ハードウェアアクセス層}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "system/sysapi/sysapi.h"
+#include "lan9000hal_local.h"
+
+
+/** %jp{コンストラクタ} */
+void Lan9000Hal_Create(C_LAN9000HAL *self, void *pRegAddr)
+{
+       /* メンバ変数初期化 */
+       self->pRegBase = pRegAddr;
+       self->ubPhysicalAddr[0] = 0;
+       self->ubPhysicalAddr[1] = 0;
+       self->ubPhysicalAddr[2] = 0;
+       self->ubPhysicalAddr[3] = 0;
+       self->ubPhysicalAddr[4] = 0;
+       self->ubPhysicalAddr[5] = 0;
+}
+
+
+/* end of file */
+
diff --git a/aplfw/driver/ether/lan9000/lan9000hal_delete.c b/aplfw/driver/ether/lan9000/lan9000hal_delete.c
new file mode 100755 (executable)
index 0000000..455c483
--- /dev/null
@@ -0,0 +1,22 @@
+/**
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  lan9000hal.h
+ * @brief %jp{LAN9000シリーズ用ハードウェアアクセス層}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "system/sysapi/sysapi.h"
+#include "lan9000hal_local.h"
+
+
+void Lan9000Hal_Delete(C_LAN9000HAL *self)
+{
+}
+
+
+/* end of file */
+
diff --git a/aplfw/driver/ether/lan9000/lan9000hal_enableinterrupt.c b/aplfw/driver/ether/lan9000/lan9000hal_enableinterrupt.c
new file mode 100755 (executable)
index 0000000..8727673
--- /dev/null
@@ -0,0 +1,24 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  lan9000hdl_create.c
+ * @brief %jp{LAN9000用ハードウェアアクセス層}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "lan9000hal_local.h"
+
+
+
+/** %jp{割り込み許可} */
+void Lan9000Hal_EnableInterrupt(C_LAN9000HAL *self, unsigned char flag)
+{
+       LAN9000HAL_WRITE_IER(self, flag);
+}
+
+
+
+/* end of file */
diff --git a/aplfw/driver/ether/lan9000/lan9000hal_getinterruptstatus.c b/aplfw/driver/ether/lan9000/lan9000hal_getinterruptstatus.c
new file mode 100755 (executable)
index 0000000..b4da95c
--- /dev/null
@@ -0,0 +1,35 @@
+/**
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  lan9000hal.h
+ * @brief %jp{LAN9000シリーズ用ハードウェアアクセス層}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "lan9000hal_local.h"
+
+
+/**< %jp{割込み状態取得} */
+unsigned short Lan9000Hal_GetInterruptStatus(C_LAN9000HAL *self)
+{
+       unsigned short uhOldBank;
+       unsigned short uhStatus;
+       
+       /* バンクを保存 */
+       uhOldBank = LAN9000HAL_REG_READ(self, LAN9000HAL_BANK);
+       
+       /* 割込み状態取得 */
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_BANK, 2);
+       uhStatus = LAN9000HAL_REG_READ(self, LAN9000HAL_B2_INTERRUPT);
+       
+       /* バンクを復帰 */
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_BANK, uhOldBank);
+       
+       return uhStatus;
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/ether/lan9000/lan9000hal_getphysicaladdr.c b/aplfw/driver/ether/lan9000/lan9000hal_getphysicaladdr.c
new file mode 100755 (executable)
index 0000000..042a6b9
--- /dev/null
@@ -0,0 +1,37 @@
+/**
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  lan9000hal.h
+ * @brief %jp{LAN9000シリーズ用ハードウェアアクセス層}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "system/sysapi/sysapi.h"
+#include "lan9000hal_local.h"
+
+
+/**< %jp{物理アドレス取得} */
+void Lan9000Hal_GetPhysicalAddr(C_LAN9000HAL *self, unsigned char ubPhysicalAddr[6])
+{
+       unsigned short uhData;
+
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_BANK, 1);
+
+       uhData = LAN9000HAL_REG_READ(self, LAN9000HAL_B1_IA0_1);
+       ubPhysicalAddr[0] = (unsigned char)((uhData >> 0) & 0xff);
+       ubPhysicalAddr[1] = (unsigned char)((uhData >> 8) & 0xff);
+       
+       uhData = LAN9000HAL_REG_READ(self, LAN9000HAL_B1_IA2_3);
+       ubPhysicalAddr[2] = (unsigned char)((uhData >> 0) & 0xff);
+       ubPhysicalAddr[3] = (unsigned char)((uhData >> 8) & 0xff);
+
+       uhData = LAN9000HAL_REG_READ(self, LAN9000HAL_B1_IA4_5);
+       ubPhysicalAddr[4] = (unsigned char)((uhData >> 0) & 0xff);
+       ubPhysicalAddr[5] = (unsigned char)((uhData >> 8) & 0xff);
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/ether/lan9000/lan9000hal_local.h b/aplfw/driver/ether/lan9000/lan9000hal_local.h
new file mode 100755 (executable)
index 0000000..0dcaafc
--- /dev/null
@@ -0,0 +1,82 @@
+/**
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  lan9000hal.h
+ * @brief %jp{LAN9000シリーズ用ハードウェアアクセス層}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#ifndef __HOS__lan9000hal_local_h__
+#define __HOS__lan9000hal_local_h__
+
+
+#include "lan9000hal.h"
+
+
+/* レジスタアドレスの算出 */
+#define LAN9000HAL_REG_ADDR(self, offset)                      ((volatile unsigned short *)((char *)(self)->pRegBase + ((offset))))
+
+/* レジスタ読み書き */
+#define LAN9000HAL_REG_WRITE(self, offset, data)       do { *LAN9000HAL_REG_ADDR((self), (offset)) = (unsigned short)(data); } while (0)
+#define LAN9000HAL_REG_READ(self, offset)                      (*LAN9000HAL_REG_ADDR((self), (offset)))
+
+
+/* レジスタ */
+#define LAN9000HAL_BANK                                0x0e    /* Bank */
+
+#define LAN9000HAL_B0_TCR                      0x00    /* Transmit Control Register */
+#define LAN9000HAL_B0_EPH_STATUS       0x02    /* EPH Status Register */
+#define LAN9000HAL_B0_RCR                      0x04    /* Receive Control Register */
+#define LAN9000HAL_B0_COUNTER          0x06    /* Counter Register */
+#define LAN9000HAL_B0_MIR                      0x08    /* Memory Information Register */
+#define LAN9000HAL_B0_RPCR                     0x0a
+
+#define LAN9000HAL_B1_CONFIG           0x00    /* Configuration Register */
+#define LAN9000HAL_B1_BASE                     0x02    /* Base Address Register */
+#define LAN9000HAL_B1_IA0_1                    0x04    /* Individual Register 0-1 */
+#define LAN9000HAL_B1_IA2_3                    0x06    /* Individual Register 2-3 */
+#define LAN9000HAL_B1_IA4_5                    0x08    /* Individual Register 4-5 */
+#define LAN9000HAL_B1_GENERAL          0x0a    /* General Address Register */
+#define LAN9000HAL_B1_CONTROL          0x0c    /* Control Register */
+
+#define LAN9000HAL_B2_MMU_COMMAND      0x00    /* MMU Command Register / Auto TX Start Register */
+#define LAN9000HAL_B2_PNR                      0x02    /* Packet Number Register / Allocation Result Register */
+#define LAN9000HAL_B2_FIFO_PORTS       0x04    /* FIFO Ports Register */
+#define LAN9000HAL_B2_POINTER          0x06    /* Pointer Register */
+#define LAN9000HAL_B2_DATA1                    0x08    /* Data High Register */
+#define LAN9000HAL_B2_DATA2                    0x0a    /* Data Low Register */
+#define LAN9000HAL_B2_INTERRUPT                0x0c    /* Interrupt Status Register */
+
+#define LAN9000HAL_B3_MT0_1                    0x00
+#define LAN9000HAL_B3_MT2_3                    0x02
+#define LAN9000HAL_B3_MT4_5                    0x04
+#define LAN9000HAL_B3_MT6_7                    0x06
+#define LAN9000HAL_B3_MGMT                     0x08
+#define LAN9000HAL_B3_REVISION         0x0a
+#define LAN9000HAL_B3_ERCV                     0x0c
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void           Lan9000Hal_Mii0(C_LAN9000HAL *self);                                                                                                                                                            /* MIIに0を書き込む */
+void           Lan9000Hal_Mii1(C_LAN9000HAL *self);                                                                                                                                                            /* MIIに1を書き込む */
+int            Lan9000Hal_MiiIn(C_LAN9000HAL *self);                                                                                                                                                   /* MIIからビットデータを読み込む */
+void           Lan9000Hal_MiiZ(C_LAN9000HAL *self);                                                                                                                                                            /* MIIをhigh-Zをにする */
+void           Lan9000Hal_PhyRegWrite(C_LAN9000HAL *self, unsigned short uhAddr, unsigned short uhReg, unsigned short uhData); /* PHYレジスタ書込み  */
+unsigned short Lan9000Hal_PhyRegRead(C_LAN9000HAL *self, unsigned short uhAddr, unsigned short uhReg);                                                 /* PHYレジスタ読み出し  */
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __HOS__LAN9000hal_local_h__ */
+
+
+/* end of file */
diff --git a/aplfw/driver/ether/lan9000/lan9000hal_mii.c b/aplfw/driver/ether/lan9000/lan9000hal_mii.c
new file mode 100755 (executable)
index 0000000..bc93cda
--- /dev/null
@@ -0,0 +1,67 @@
+/**
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  lan9000hal.h
+ * @brief %jp{LAN9000シリーズ用ハードウェアアクセス層}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "system/sysapi/sysapi.h"
+#include "lan9000hal_local.h"
+
+
+/* MIIに0を書き込む */
+void Lan9000Hal_Mii0(C_LAN9000HAL *self)
+{
+       unsigned short uhMask;
+       
+       uhMask = LAN9000HAL_REG_READ(self, LAN9000HAL_B3_MGMT) & 0xfff0;
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B3_MGMT, uhMask | 0x0008);
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B3_MGMT, uhMask | 0x000c);
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B3_MGMT, uhMask | 0x0008);        
+}
+
+/* MIIに1を書き込む */
+void Lan9000Hal_Mii1(C_LAN9000HAL *self)
+{
+       unsigned short uhMask;
+       
+       uhMask = LAN9000HAL_REG_READ(self, LAN9000HAL_B3_MGMT) & 0xfff0;
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B3_MGMT, uhMask | 0x0009);
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B3_MGMT, uhMask | 0x000d);
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B3_MGMT, uhMask | 0x0009);        
+}
+
+/* MIIからビットデータを読み込む */
+int Lan9000Hal_MiiIn(C_LAN9000HAL *self)
+{
+       unsigned short uhMask;
+       int            iData;
+
+       uhMask = LAN9000HAL_REG_READ(self, LAN9000HAL_B3_MGMT) & 0xfff0;
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B3_MGMT, uhMask);
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B3_MGMT, uhMask | 0x0040);
+       iData = ((LAN9000HAL_REG_READ(self, LAN9000HAL_B3_MGMT) >> 1) & 1);
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B3_MGMT, uhMask);
+       
+       return iData;
+}
+
+/* MIIをhigh-Zをにする */
+void Lan9000Hal_MiiZ(C_LAN9000HAL *self)
+{
+       unsigned short uhMask;
+
+       uhMask = LAN9000HAL_REG_READ(self, LAN9000HAL_B3_MGMT) & 0xfff0;
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B3_MGMT, uhMask);
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B3_MGMT, uhMask | 0x000c);
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B3_MGMT, uhMask); 
+}
+
+
+
+
+/* endof file */
diff --git a/aplfw/driver/ether/lan9000/lan9000hal_phyregread.c b/aplfw/driver/ether/lan9000/lan9000hal_phyregread.c
new file mode 100755 (executable)
index 0000000..78b14cc
--- /dev/null
@@ -0,0 +1,100 @@
+/**
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  lan9000hal.h
+ * @brief %jp{LAN9000シリーズ用ハードウェアアクセス層}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "system/sysapi/sysapi.h"
+#include "lan9000hal_local.h"
+
+
+
+/* PHYレジスタ読み出し  */
+unsigned short Lan9000Hal_PhyRegRead(C_LAN9000HAL *self, unsigned short uhAddr, unsigned short uhReg)
+{
+       unsigned short uhData;
+       unsigned short uhMask;
+       unsigned short uhSaveMgmt;
+       int            i;
+       
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_BANK, 3);
+
+       uhSaveMgmt = LAN9000HAL_REG_READ(self, LAN9000HAL_B3_MGMT);
+       
+       uhMask = LAN9000HAL_REG_READ(self, LAN9000HAL_B3_MGMT) & 0xfff0;
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B3_MGMT, uhMask | 0x0009);
+       
+       /* プリアンブル */
+       for ( i = 0; i < 32; i++ )
+       {
+               LAN9000HAL_REG_WRITE(self, LAN9000HAL_B3_MGMT, uhMask | 0x0009);
+               LAN9000HAL_REG_WRITE(self, LAN9000HAL_B3_MGMT, uhMask | 0x000d);
+       }
+
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B3_MGMT, uhMask | 0x0008);
+
+       /* スタート */
+       Lan9000Hal_Mii0(self);
+       Lan9000Hal_Mii1(self);
+       
+       /* リード */
+       Lan9000Hal_Mii1(self);
+       Lan9000Hal_Mii0(self);
+       
+       /* アドレス出力 */
+       for ( i = 0; i < 5; i++ )
+       {
+               if ( uhAddr & 0x10 )
+               {
+                       Lan9000Hal_Mii1(self);
+               }
+               else
+               {
+                       Lan9000Hal_Mii0(self);
+               }
+               uhAddr <<= 1;
+       }
+       
+       /* レジスタ出力 */
+       for ( i = 0; i < 5; i++ )
+       {
+               if ( uhReg & 0x10 )
+               {
+                       Lan9000Hal_Mii1(self);
+               }
+               else
+               {
+                       Lan9000Hal_Mii0(self);
+               }
+               uhReg <<= 1;
+       }
+
+       Lan9000Hal_MiiZ(self);
+       
+       /* データ読み出し */
+       uhData = 0;
+       for ( i = 0; i < 16; i++ )
+       {
+               uhData <<= 1;
+               LAN9000HAL_REG_WRITE(self, LAN9000HAL_B3_MGMT, uhMask);
+               LAN9000HAL_REG_WRITE(self, LAN9000HAL_B3_MGMT, uhMask | 0x0004);
+               uhData |= ((LAN9000HAL_REG_READ(self, LAN9000HAL_B3_MGMT) & 0x0002) >> 1);
+               LAN9000HAL_REG_WRITE(self, LAN9000HAL_B3_MGMT, uhMask);
+       }
+       
+       Lan9000Hal_MiiZ(self);
+       
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B3_MGMT, uhSaveMgmt);
+       
+       SysTim_Wait(1);
+       
+       return uhData;
+}
+
+
+/* endof file */
diff --git a/aplfw/driver/ether/lan9000/lan9000hal_phyregwrite.c b/aplfw/driver/ether/lan9000/lan9000hal_phyregwrite.c
new file mode 100755 (executable)
index 0000000..34b3104
--- /dev/null
@@ -0,0 +1,96 @@
+/**
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  lan9000hal.h
+ * @brief %jp{LAN9000シリーズ用ハードウェアアクセス層}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "system/sysapi/sysapi.h"
+#include "lan9000hal_local.h"
+
+
+/* PHYレジスタ書込み  */
+void Lan9000Hal_PhyRegWrite(C_LAN9000HAL *self, unsigned short uhAddr, unsigned short uhReg, unsigned short uhData)
+{
+       unsigned short uhMask;
+       unsigned short uhSaveMgmt;
+       int            i;
+       
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_BANK, 3);
+
+       uhSaveMgmt = LAN9000HAL_REG_READ(self, LAN9000HAL_B3_MGMT);
+       
+       uhMask = LAN9000HAL_REG_READ(self, LAN9000HAL_B3_MGMT) & 0xfff0;
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B3_MGMT, uhMask | 0x0009);
+       
+       /* プリアンブル */
+       for ( i = 0; i < 32; i++ )
+       {
+               LAN9000HAL_REG_WRITE(self, LAN9000HAL_B3_MGMT, uhMask | 0x0009);
+               LAN9000HAL_REG_WRITE(self, LAN9000HAL_B3_MGMT, uhMask | 0x000d);
+       }
+       
+       /* スタート */
+       Lan9000Hal_Mii0(self);
+       Lan9000Hal_Mii1(self);
+       
+       /* リード */
+       Lan9000Hal_Mii0(self);
+       Lan9000Hal_Mii1(self);
+       
+       /* アドレス出力 */
+       for ( i = 0; i < 5; i++ )
+       {
+               if ( uhAddr & 0x10 )
+               {
+                       Lan9000Hal_Mii1(self);
+               }
+               else
+               {
+                       Lan9000Hal_Mii0(self);
+               }
+               uhAddr <<= 1;
+       }
+       
+       /* レジスタ出力 */
+       for ( i = 0; i < 5; i++ )
+       {
+               if ( uhReg & 0x10 )
+               {
+                       Lan9000Hal_Mii1(self);
+               }
+               else
+               {
+                       Lan9000Hal_Mii0(self);
+               }
+               uhReg <<= 1;
+       }
+
+       Lan9000Hal_Mii1(self);
+       Lan9000Hal_Mii0(self);
+       
+       /* データ出力 */
+       for ( i = 0; i < 16; i++ )
+       {
+               if ( uhData & 0x8000 )
+               {
+                       Lan9000Hal_Mii1(self);
+               }
+               else
+               {
+                       Lan9000Hal_Mii0(self);
+               }
+               uhData <<= 1;
+       }
+
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B3_MGMT, uhSaveMgmt);
+       
+        SysTim_Wait(1);
+}
+
+
+/* endof file */
diff --git a/aplfw/driver/ether/lan9000/lan9000hal_recv.c b/aplfw/driver/ether/lan9000/lan9000hal_recv.c
new file mode 100755 (executable)
index 0000000..9b4d115
--- /dev/null
@@ -0,0 +1,71 @@
+/**
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  lan9000hal.h
+ * @brief %jp{LAN9000シリーズ用ハードウェアアクセス層}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "system/sysapi/sysapi.h"
+#include "lan9000hal_local.h"
+
+
+/** %jp{パケット受信} */
+int Lan9000Hal_Recv(C_LAN9000HAL *self, void *pBuf, int iSize)
+{
+       unsigned short  uhData;
+       unsigned short  uhStatus;
+       unsigned short  uhSize;
+       unsigned char   *pubBuf;
+       int                             i;
+               
+       pubBuf = (unsigned char *)pBuf;
+               
+       /* 受信チェック */
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_BANK, 2);
+       if ( !(LAN9000HAL_REG_READ(self, LAN9000HAL_B2_INTERRUPT) & 0x0001) )
+       {
+               return 0;
+       }
+
+       /* Packet number */
+       uhData = LAN9000HAL_REG_READ(self, LAN9000HAL_B2_FIFO_PORTS);
+       
+       /* Read the Status word and Byte count */
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B2_POINTER, 0xE000);
+               
+       uhStatus = LAN9000HAL_REG_READ(self, LAN9000HAL_B2_DATA1);
+       uhSize   = LAN9000HAL_REG_READ(self, LAN9000HAL_B2_DATA1) - 6;
+       
+       /* Read the packet buffer Address/Size/Data */
+       for( i = 0; i < uhSize / 2; i++ )
+       {
+               uhData = LAN9000HAL_REG_READ(self, LAN9000HAL_B2_DATA1);
+               *pubBuf++ = (unsigned char)((uhData >> 0) & 0xff);
+               *pubBuf++ = (unsigned char)((uhData >> 8) & 0xff);
+       }
+       if ( uhSize % 2 == 1 )
+       {
+               uhData = LAN9000HAL_REG_READ(self, LAN9000HAL_B2_DATA1);
+               *pubBuf++ = (unsigned char)((uhData >> 0) & 0xff);
+       }
+               
+       /* メモリ開放 */
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B2_MMU_COMMAND, 0x0080);
+       
+       /* エラーパケットは破棄 */
+       if ( uhStatus & 0xac00 )
+       {
+               return 0;
+       }
+       
+       /* サイズを返す */
+       return (int)uhSize;
+}
+
+
+/* end of file */
+
diff --git a/aplfw/driver/ether/lan9000/lan9000hal_send.c b/aplfw/driver/ether/lan9000/lan9000hal_send.c
new file mode 100755 (executable)
index 0000000..01c7335
--- /dev/null
@@ -0,0 +1,74 @@
+/**
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  lan9000hal.h
+ * @brief %jp{LAN9000シリーズ用ハードウェアアクセス層}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "system/sysapi/sysapi.h"
+#include "lan9000hal_local.h"
+
+
+/** %jp{パケット送信} */
+int Lan9000Hal_Send(C_LAN9000HAL *self, const void *pData, int iSize)
+{
+       unsigned short uhData;
+       unsigned char  *pubData;
+       int            i;
+       
+       pubData = (unsigned char *)pData;
+       
+       
+       /* バッファ割り当て未完了ならリターン */
+       if ( !(LAN9000HAL_REG_READ(self, LAN9000HAL_B2_INTERRUPT) & LAN9000HAL_ISTATUS_ALLOCINT) )
+       {
+               return 0;
+       }
+               
+       /* Write allocated packet number, setup the write pointer */
+       uhData = LAN9000HAL_REG_READ(self, LAN9000HAL_B2_PNR) & 0x3f;
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B2_PNR, uhData << 8);
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B2_POINTER, 0x4000);
+       
+       /* Write the packet buffer Status word/Byte count (Status + Byte count + pktsize + Control) */
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B2_DATA1, 0x0000);
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B2_DATA1, ((iSize+6) & ~1));
+
+       /* Write the packet buffer Address/Size/Data */
+       for ( i= 0; i < iSize / 2; i++ )
+       {
+               uhData  = *pubData++;
+               uhData |= (*pubData++) << 8;
+               LAN9000HAL_REG_WRITE(self, LAN9000HAL_B2_DATA1, uhData);
+       }
+       if ( iSize % 2 == 1 )
+       {
+               uhData  = *pubData;
+               uhData |= 0x3000;
+       }
+       else
+       {
+               uhData = 0x1000;
+       }
+       
+       /* Write Control word (Even data, No CRC) */
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B2_DATA1, uhData);
+       
+       /* Queue the packet */
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_BANK, 2);
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B2_MMU_COMMAND, 0x00c0);
+
+       /* 送信バッファ割り当て要求 */
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_BANK, 2);
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B2_MMU_COMMAND, 0x0020);
+       
+       return iSize;
+}
+
+
+/* end of file */
+
diff --git a/aplfw/driver/ether/lan9000/lan9000hal_setinterruptmask.c b/aplfw/driver/ether/lan9000/lan9000hal_setinterruptmask.c
new file mode 100755 (executable)
index 0000000..b12ef9d
--- /dev/null
@@ -0,0 +1,32 @@
+/**
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  lan9000hal.h
+ * @brief %jp{LAN9000シリーズ用ハードウェアアクセス層}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "lan9000hal_local.h"
+
+
+/**< %jp{割込みマスク設定} */
+void Lan9000Hal_SetInterruptMask(C_LAN9000HAL *self, unsigned short uhIntMask)
+{
+       unsigned short uhOldBank;
+       
+       /* バンクを保存 */
+       uhOldBank = LAN9000HAL_REG_READ(self, LAN9000HAL_BANK);
+       
+       /* 割込みマスク設定 */
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_BANK, 2);
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B2_INTERRUPT, (uhIntMask & 0xff00));
+       
+       /* バンクを復帰 */
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_BANK, uhOldBank);
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/ether/lan9000/lan9000hal_setup.c b/aplfw/driver/ether/lan9000/lan9000hal_setup.c
new file mode 100755 (executable)
index 0000000..143f73a
--- /dev/null
@@ -0,0 +1,78 @@
+/**
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  lan9000hal.h
+ * @brief %jp{LAN9000シリーズ用ハードウェアアクセス層}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "system/sysapi/sysapi.h"
+#include "lan9000hal_local.h"
+
+
+
+/** 初期化 */
+int Lan9000Hal_Setup(C_LAN9000HAL *self)
+{
+       int iTimeOut;
+       
+       /* リセット処理 */
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_BANK, 0);
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B0_RCR, 0x8000);
+
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_BANK, 1);
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B1_CONFIG, LAN9000HAL_REG_READ(self, LAN9000HAL_B1_CONFIG) | 0x8000);
+       SysTim_Wait(50);
+
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_BANK, 0);
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B0_RCR,  0x0000);
+       SysTim_Wait(50);
+
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_BANK, 2);
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B2_MMU_COMMAND,  0x0040);
+       
+       
+       /* ANEG処理 */
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_BANK, 0);
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B0_RPCR, 0x0800);
+       SysTim_Wait(100);
+       
+       Lan9000Hal_PhyRegWrite(self, 0, 0, 0x8000);
+       SysTim_Wait(50);
+
+       Lan9000Hal_PhyRegWrite(self, 0, 0, 0x3000);
+       SysTim_Wait(1500);
+       
+       iTimeOut = 0;
+       while ( !(Lan9000Hal_PhyRegRead(self, 0, 1) & 0x0020) )
+       {
+               if ( iTimeOut++ > 200 )
+               {
+                       return (-1);
+               }
+               SysTim_Wait(10);
+       }
+       
+       /* Configure the Transmit and Receive registers to allow external loopback */
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_BANK, 0);
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B0_RPCR, 0x0800);
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B0_TCR, 0x0881);
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B0_RCR, 0x0302);
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_BANK, 1);
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B1_CONFIG, LAN9000HAL_REG_READ(self, LAN9000HAL_B1_CONFIG) | 0x8000);
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B1_CONTROL,  0x5a10);     
+       SysTim_Wait(1);
+       
+       /* 送信バッファ割り当て要求 */
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_BANK, 2);
+       LAN9000HAL_REG_WRITE(self, LAN9000HAL_B2_MMU_COMMAND, 0x0020);
+       
+       return 0;
+}
+
+
+
+/* endof file */
diff --git a/aplfw/driver/ether/lan9000/lan9000hal_stop.c b/aplfw/driver/ether/lan9000/lan9000hal_stop.c
new file mode 100755 (executable)
index 0000000..509eb42
--- /dev/null
@@ -0,0 +1,23 @@
+/**
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  lan9000hal.h
+ * @brief %jp{LAN9000シリーズ用ハードウェアアクセス層}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "system/sysapi/sysapi.h"
+#include "lan9000hal_local.h"
+
+
+
+void Lan9000Hal_Stop(C_LAN9000HAL *self)
+{
+}
+
+
+
+/* endof file */
index 2f0cadc..faae013 100755 (executable)
@@ -9,16 +9,31 @@
  */
 
 
-#include "ne2000drv.h"
+#include "ne2000drv_local.h"
 
 
-static void Ne2000Drv_Isr(VPARAM Param);               /* 割り込み処理 */
+
+/* 仮想関数テーブル */
+const T_DRVOBJ_METHODS Ne2000Drv_Methods = 
+       {
+               Ne2000Drv_Delete,
+               Ne2000Drv_Open,
+               Ne2000Drv_Close,
+               Ne2000Drv_IoControl,
+               Ne2000Drv_Seek,
+               Ne2000Drv_Read,
+               Ne2000Drv_Write,
+               Ne2000Drv_Flush,
+       };
 
 
 /** コンストラクタ */
 void Ne2000Drv_Create(C_NE2000DRV *self, void *pRegAddr, int iIntNum)
 {
-       /* オープンカウンタクリア */
+       /* 親クラスコンストラクタ呼び出し */
+       ChrDrv_Create(&self->ChrDrv, &Ne2000Drv_Methods);
+
+       /* メンバ変数初期化 */
        self->iOpenCount = 0;
 
        /* Ne2000Hal 初期化 */
@@ -37,56 +52,108 @@ void Ne2000Drv_Create(C_NE2000DRV *self, void *pRegAddr, int iIntNum)
 
 
 /** デストラクタ */
-void Ne2000Drv_Delete(C_NE2000DRV *self)
+void Ne2000Drv_Delete(C_DRVOBJ *pDrvObj)
 {
+       C_NE2000DRV *self;
+       
+       /* upper cast */
+       self = (C_NE2000DRV *)pDrvObj;
+
+       /* オブジェクト削除 */
        SysEvt_Delete(self->hEvtRecv);
        SysEvt_Delete(self->hEvtSend);
        SysMtx_Delete(self->hMtx);
+       
+       /* 親クラスデストラクタ */
+       ChrDrv_Delete(&self->ChrDrv);
 }
 
 
 /** オープン */
-void Ne2000Drv_Open(C_NE2000DRV *self)
+HANDLE Ne2000Drv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
 {
-       System_Lock();
+       C_NE2000DRV *self;
+       C_CHRFILE       *pFile;
+       
+       /* upper cast */
+       self = (C_NE2000DRV *)pDrvObj;
+
+       /* create file descriptor */
+       if ( (pFile = SysMem_Alloc(sizeof(C_CHRFILE))) == NULL )
+       {
+               return HANDLE_NULL;
+       }
+       ChrFile_Create(pFile, pDrvObj, NULL);
+       
+       
+       /* オープン処理 */
+       SysMtx_Lock(self->hMtx);
        if ( self->iOpenCount++ == 0 )
        {
                Ne2000Hal_Setup(&self->Ne2000Hal);
        }
-       System_Unlock();
+       SysMtx_Unlock(self->hMtx);
+
+
+       return (HANDLE)pFile;
 }
 
 
 /** クローズ */
-void Ne2000Drv_Close(C_NE2000DRV *self)
+void Ne2000Drv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
 {
-       System_Lock();
+       C_NE2000DRV *self;
+       C_CHRFILE       *pFile;
+
+       /* upper cast */
+       self  = (C_NE2000DRV *)pDrvObj;
+       pFile = (C_CHRFILE *)pFileObj;
+       
+       SysMtx_Lock(self->hMtx);
        if ( --self->iOpenCount == 0 )
        {
                Ne2000Hal_Stop(&self->Ne2000Hal);
        }
-       System_Unlock();
+       SysMtx_Unlock(self->hMtx);
+
+
+       /* ディスクリプタ削除 */
+       ChrFile_Delete((C_CHRFILE *)pFile);     
+       SysMem_Free(pFile);
 }
 
 
 /** %jp{受信} */
-int Ne2000Drv_Read(C_NE2000DRV *self, void *pRecvBuf, int iSize)
+FILE_SIZE Ne2000Drv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size)
 {
-       unsigned char *pubBuf;
-       int iRecvSize = 0;
+       C_NE2000DRV     *self;
+       C_CHRFILE               *pFile;
+       unsigned char   *pubBuf;
+       int                             iRecvSize = 0;
+       
+       /* upper cast */
+       self  = (C_NE2000DRV *)pDrvObj;
+       pFile = (C_CHRFILE *)pFileObj;
 
-       pubBuf = (unsigned char *)pRecvBuf;
+       /* バッファ */
+       pubBuf = (unsigned char *)pBuf;
 
        for ( ; ; )
        {
                SysMtx_Lock(self->hMtx);
-               iRecvSize = Ne2000Hal_Recv(&self->Ne2000Hal, pRecvBuf, iSize);
+               iRecvSize = Ne2000Hal_Recv(&self->Ne2000Hal, pubBuf, Size);
                SysMtx_Unlock(self->hMtx);
 
                if ( iRecvSize > 0 )
                {
                        break;
                }
+               
+               /* ブロッキングでなければ抜ける */
+               if ( pFile->cReadMode != FILE_RMODE_BLOCKING )
+               {
+                       break;
+               }
 
                /* 受信イベントを待つ */
                SysEvt_Wait(self->hEvtRecv);
@@ -98,13 +165,20 @@ int Ne2000Drv_Read(C_NE2000DRV *self, void *pRecvBuf, int iSize)
 
 
 /** %jp{送信} */
-int Ne2000Drv_Write(C_NE2000DRV *self, const void *pData, int iSize)
+FILE_SIZE Ne2000Drv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size)
 {
+       C_NE2000DRV     *self;
+       C_CHRFILE               *pFile;
+       
+       /* upper cast */
+       self  = (C_NE2000DRV *)pDrvObj;
+       pFile = (C_CHRFILE *)pFileObj;
+
        SysMtx_Lock(self->hMtx);
-       iSize = Ne2000Hal_Send(&self->Ne2000Hal, pData, iSize);
+       Size = Ne2000Hal_Send(&self->Ne2000Hal, pData, Size);
        SysMtx_Unlock(self->hMtx);
        
-       return iSize;
+       return Size;
 }
 
 
index ee1cbb2..b6747c2 100755 (executable)
@@ -4,7 +4,7 @@
  * @file  ne2000drv.c
  * @brief %jp{NE2000互換Ether用デバイスドライバ}
  *
- * Copyright (C) 2006 by Project HOS
+ * Copyright (C) 2006-2007 by Project HOS
  * http://sourceforge.jp/projects/hos/
  */
 
 #define __HOS__ne2000drv_h__
 
 
-#include "ne2000hal.h"
 #include "system/sysapi/sysapi.h"
+#include "system/file/chrdrv.h"
+#include "ne2000hal.h"
 
 
 /* NE2000互換NIC制御ドライバクラス */
 typedef struct c_ne2000drv
 {
-       int           iOpenCount;
-       SYSEVT_HANDLE hEvtSend;
-       SYSEVT_HANDLE hEvtRecv;
-       SYSMTX_HANDLE hMtx;
-       C_NE2000HAL   Ne2000Hal;
+       C_CHRDRV                ChrDrv;                 /* キャラクタ型デバイスドライバを継承 */
+
+       C_NE2000HAL             Ne2000Hal;
+       int                             iOpenCount;
+       SYSEVT_HANDLE   hEvtSend;
+       SYSEVT_HANDLE   hEvtRecv;
+       SYSMTX_HANDLE   hMtx;
 } C_NE2000DRV;
 
 
@@ -33,11 +36,7 @@ extern "C" {
 #endif
 
 void Ne2000Drv_Create(C_NE2000DRV *self, void *pRegAddr, int iIntNum);         /**< コンストラクタ */
-void Ne2000Drv_Delete(C_NE2000DRV *self);                                                                      /**< デストラクタ */
-void Ne2000Drv_Open(C_NE2000DRV *self);                                                                                /**< オープン初期化 */
-void Ne2000Drv_Close(C_NE2000DRV *self);                                                                       /**< クローズ */
-int  Ne2000Drv_Read(C_NE2000DRV *self, void *pRecvBuf, int iSize);                     /**< 書き込み */
-int  Ne2000Drv_Write(C_NE2000DRV *self, const void *pData, int iSize);         /**< 読み出し */
+void Ne2000Drv_Delete(C_DRVOBJ *pDrvObj);                                                                      /**< デストラクタ */
 
 #ifdef __cplusplus
 }
diff --git a/aplfw/driver/ether/ne2000/ne2000drv_local.h b/aplfw/driver/ether/ne2000/ne2000drv_local.h
new file mode 100755 (executable)
index 0000000..97b9ac4
--- /dev/null
@@ -0,0 +1,40 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  ne2000drv.c
+ * @brief %jp{NE2000互換Ether用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#ifndef __HOS__ne2000drv_local_h__
+#define __HOS__ne2000drv_local_h__
+
+#include "ne2000drv.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+HANDLE    Ne2000Drv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode);
+void      Ne2000Drv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj);
+FILE_ERR  Ne2000Drv_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize);
+FILE_POS  Ne2000Drv_Seek(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign);
+FILE_SIZE Ne2000Drv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size);
+FILE_SIZE Ne2000Drv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size);
+FILE_ERR  Ne2000Drv_Flush(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj);
+
+void      Ne2000Drv_Isr(VPARAM Param);                 /* 割込み処理 */
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __HOS__ne2000drv_local_h__ */
+
+
+/* end of file */
diff --git a/aplfw/driver/misc/memdrv/memdrv.h b/aplfw/driver/misc/memdrv/memdrv.h
new file mode 100755 (executable)
index 0000000..52264b7
--- /dev/null
@@ -0,0 +1,51 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  memdrv.h
+ * @brief %jp{メモリマップドファイル用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#ifndef __HOS__memdrv_h__
+#define __HOS__memdrv_h__
+
+
+#include "system/sysapi/sysapi.h"
+#include "system/file/drvobj.h"
+
+
+/* ドライバ制御部 */
+typedef struct c_memdrv
+{
+       C_DRVOBJ                DrvObj;                 /* デバイスドライバを継承 */
+
+       int                             iOpenCount;             /* オープンカウンタ */
+       unsigned char   *pubMemAddr;    /* メモリの先頭アドレス */
+       FILE_POS                MemSize;                /* メモリサイズ */
+       FILE_POS                FileSize;               /* ファイルとしてのサイズ */
+       int                             iAttr;                  /* サイズを可変にするか */
+       
+       SYSMTX_HANDLE   hMtx;                   /* 排他制御用ミューテックス */
+} C_MEMDRV;
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void MemDrv_Create(C_MEMDRV *self, void *pMemAddr, FILE_POS MemSize, FILE_POS IniSize, int iValiable);         /**< コンストラクタ */
+void MemDrv_Delete(C_DRVOBJ *self);                                                                                                                                                    /**< デストラクタ */
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __HOS__memdrv_h__ */
+
+
+/* end of file */
diff --git a/aplfw/driver/misc/memdrv/memdrv_close.c b/aplfw/driver/misc/memdrv/memdrv_close.c
new file mode 100755 (executable)
index 0000000..b4988ca
--- /dev/null
@@ -0,0 +1,37 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  memdrv.h
+ * @brief %jp{メモリマップドファイル用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "memdrv_local.h"
+#include "system/sysapi/sysapi.h"
+
+
+/** クローズ */
+void MemDrv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
+{
+       C_MEMDRV                *self;
+       C_MEMDRVFILE    *pFile;
+       
+       /* upper cast */
+       self  = (C_MEMDRV *)pDrvObj;
+       pFile = (C_MEMDRVFILE *)pFileObj;
+       
+       /* クローズ処理 */
+       SysMtx_Lock(self->hMtx);
+       --self->iOpenCount;
+       SysMtx_Unlock(self->hMtx);
+       
+       /* ディスクリプタ削除 */
+       FileObj_Delete((C_FILEOBJ *)pFile);     
+       SysMem_Free(pFile);
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/misc/memdrv/memdrv_create.c b/aplfw/driver/misc/memdrv/memdrv_create.c
new file mode 100755 (executable)
index 0000000..80c8ef7
--- /dev/null
@@ -0,0 +1,49 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  memdrv.h
+ * @brief %jp{メモリマップドファイル用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "memdrv_local.h"
+
+
+/* 仮想関数テーブル */
+static const T_DRVOBJ_METHODS MemDrv_Methods = 
+       {
+               MemDrv_Delete,
+               MemDrv_Open,
+               MemDrv_Close,
+               MemDrv_IoControl,
+               MemDrv_Seek,
+               MemDrv_Read,
+               MemDrv_Write,
+               MemDrv_Flush,
+       };
+
+
+/** コンストラクタ */
+void MemDrv_Create(C_MEMDRV *self, void *pMemAddr, FILE_POS MemSize, FILE_POS IniSize, int iAttr)
+{
+       void *pMem;
+       
+       /* 親クラスコンストラクタ呼び出し */
+       DrvObj_Create(&self->DrvObj, &MemDrv_Methods);
+       
+       /* メンバ変数初期化 */
+       self->iOpenCount = 0;
+       self->pubMemAddr = pMemAddr;    /* メモリの先頭アドレス */
+       self->MemSize    = MemSize;             /* メモリサイズ */
+       self->FileSize   = IniSize;             /* ファイルとしてのサイズ */
+       self->iAttr      = iAttr;               /* 属性 */
+       
+       /* ミューテックス生成 */
+       self->hMtx = SysMtx_Create();
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/misc/memdrv/memdrv_delete.c b/aplfw/driver/misc/memdrv/memdrv_delete.c
new file mode 100755 (executable)
index 0000000..b7b179b
--- /dev/null
@@ -0,0 +1,29 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  memdrv.h
+ * @brief %jp{メモリマップドファイル用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "memdrv_local.h"
+#include "system/sysapi/sysapi.h"
+
+
+/** デストラクタ */
+void MemDrv_Delete(C_DRVOBJ *pDrvObj)
+{
+       C_MEMDRV *self;
+       
+       /* upper cast */
+       self = (C_MEMDRV *)pDrvObj;
+
+       /* オブジェクト削除 */
+       SysMtx_Delete(self->hMtx);
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/misc/memdrv/memdrv_flush.c b/aplfw/driver/misc/memdrv/memdrv_flush.c
new file mode 100755 (executable)
index 0000000..e959d56
--- /dev/null
@@ -0,0 +1,21 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  memdrv.h
+ * @brief %jp{メモリマップドファイル用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "memdrv_local.h"
+
+
+FILE_ERR MemDrv_Flush(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
+{
+       return FILE_ERR_OK;
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/misc/memdrv/memdrv_iocontrol.c b/aplfw/driver/misc/memdrv/memdrv_iocontrol.c
new file mode 100755 (executable)
index 0000000..47940e5
--- /dev/null
@@ -0,0 +1,29 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  memdrv.h
+ * @brief %jp{メモリマップドファイル用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "memdrv_local.h"
+
+
+
+FILE_ERR  MemDrv_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize)
+{
+       C_MEMDRV                *self;
+       C_MEMDRVFILE    *pFile;
+       
+       /* upper cast */
+       self  = (C_MEMDRV *)pDrvObj;
+       pFile = (C_MEMDRVFILE *)pFileObj;
+
+       return FILE_ERR_NG;
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/misc/memdrv/memdrv_local.h b/aplfw/driver/misc/memdrv/memdrv_local.h
new file mode 100755 (executable)
index 0000000..302233b
--- /dev/null
@@ -0,0 +1,48 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  memdrv_local.h
+ * @brief %jp{メモリマップドファイル用デバイスドライバ ローカルヘッダファイル}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#ifndef __HOS__memdrv_local_h__
+#define __HOS__memdrv_local_h__
+
+
+#include "memdrv.h"
+
+
+typedef struct c_memdrvfile
+{
+       C_FILEOBJ               FileObj;        /* ファイルオブジェクトを継承 */
+       
+       FILE_POS                FilePos;        /* ファイルポインタ */
+} C_MEMDRVFILE;
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+HANDLE    MemDrv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode);
+void      MemDrv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj);
+FILE_ERR  MemDrv_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize);
+FILE_POS  MemDrv_Seek(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign);
+FILE_SIZE MemDrv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size);
+FILE_SIZE MemDrv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size);
+FILE_ERR  MemDrv_Flush(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __HOS__memdrv_local_h__ */
+
+
+/* end of file */
diff --git a/aplfw/driver/misc/memdrv/memdrv_open.c b/aplfw/driver/misc/memdrv/memdrv_open.c
new file mode 100755 (executable)
index 0000000..81f421e
--- /dev/null
@@ -0,0 +1,43 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  memdrv.h
+ * @brief %jp{メモリマップドファイル用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "memdrv_local.h"
+#include "system/sysapi/sysapi.h"
+
+
+
+/** オープン */
+HANDLE MemDrv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
+{
+       C_MEMDRV                *self;
+       C_MEMDRVFILE    *pFile;
+       
+       /* upper cast */
+       self = (C_MEMDRV *)pDrvObj;
+       
+       /* create file descriptor */
+       if ( (pFile = SysMem_Alloc(sizeof(C_MEMDRVFILE))) == NULL )
+       {
+               return HANDLE_NULL;
+       }
+       FileObj_Create(&pFile->FileObj, pDrvObj, NULL);
+       pFile->FilePos = 0;
+
+       /* オープン処理 */
+       SysMtx_Lock(self->hMtx);
+       self->iOpenCount++;
+       SysMtx_Unlock(self->hMtx);
+       
+       return (HANDLE)pFile;
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/misc/memdrv/memdrv_read.c b/aplfw/driver/misc/memdrv/memdrv_read.c
new file mode 100755 (executable)
index 0000000..b5e5fdc
--- /dev/null
@@ -0,0 +1,44 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  memdrv.h
+ * @brief %jp{メモリマップドファイル用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include <string.h>
+#include "memdrv_local.h"
+
+
+
+FILE_SIZE MemDrv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size)
+{
+       C_MEMDRV                *self;
+       C_MEMDRVFILE    *pFile;
+       
+       /* upper cast */
+       self  = (C_MEMDRV *)pDrvObj;
+       pFile = (C_MEMDRVFILE *)pFileObj;
+       
+       SysMtx_Lock(self->hMtx);
+       
+       /* サイズクリップ */
+       if ( Size > self->FileSize - pFile->FilePos )
+       {
+               Size = self->FileSize - pFile->FilePos;
+       }
+       
+       /* 読み出し */
+       memcpy(pBuf, self->pubMemAddr + pFile->FilePos, Size);
+       pFile->FilePos += Size;
+       
+       SysMtx_Unlock(self->hMtx);
+       
+       return Size;
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/misc/memdrv/memdrv_seek.c b/aplfw/driver/misc/memdrv/memdrv_seek.c
new file mode 100755 (executable)
index 0000000..5e43e65
--- /dev/null
@@ -0,0 +1,57 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  memdrv.h
+ * @brief %jp{メモリマップドファイル用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "memdrv_local.h"
+
+
+FILE_POS MemDrv_Seek(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign)
+{
+       C_MEMDRV                *self;
+       C_MEMDRVFILE    *pFile;
+       
+       /* upper cast */
+       self  = (C_MEMDRV *)pDrvObj;
+       pFile = (C_MEMDRVFILE *)pFileObj;
+       
+       /* シーク */
+       switch ( iOrign )
+       {
+       case FILE_SEEK_SET:
+               pFile->FilePos  = Offset;
+               break;
+               
+       case FILE_SEEK_CUR:
+               pFile->FilePos += Offset;
+               break;
+               
+       case FILE_SEEK_END:
+               pFile->FilePos = self ->FileSize - Offset;
+               break;
+               
+       default:
+               return FILE_ERR_NG;
+       }
+       
+       /* 範囲クリップ */
+       if ( pFile->FilePos < 0 )
+       {
+               pFile->FilePos = 0;
+       }
+       if ( pFile->FilePos > self->FileSize )
+       {
+               pFile->FilePos = self->FileSize;
+       }
+
+       return pFile->FilePos;
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/misc/memdrv/memdrv_write.c b/aplfw/driver/misc/memdrv/memdrv_write.c
new file mode 100755 (executable)
index 0000000..573cca2
--- /dev/null
@@ -0,0 +1,46 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  memdrv.h
+ * @brief %jp{メモリマップドファイル用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include <string.h>
+#include "memdrv_local.h"
+
+
+
+FILE_SIZE MemDrv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size)
+{
+       C_MEMDRV                *self;
+       C_MEMDRVFILE    *pFile;
+       
+       SysMtx_Lock(self->hMtx);
+       
+       /* サイズクリップ */
+       if ( Size > self->MemSize - pFile->FilePos )
+       {
+               Size = self->MemSize - pFile->FilePos;
+       }
+       
+       /* 書込み */
+       memcpy(self->pubMemAddr + pFile->FilePos, pData, Size);
+       pFile->FilePos += Size;
+       
+       /* ファイルサイズ拡張 */
+       if ( self->FileSize < pFile->FilePos )
+       {
+               self->FileSize = pFile->FilePos;
+       }
+       
+       SysMtx_Unlock(self->hMtx);
+       
+       return Size;
+}
+
+
+/* end of file */
index b1d8429..96ee187 100755 (executable)
@@ -41,6 +41,7 @@ extern "C" {
 #endif
 
 void Pc16550Drv_Create(C_PC16550DRV *self, void *pRegAddr, unsigned int uiRegStep, int iIntNum, long lSysClock, int iBufSize); /**< コンストラクタ */
+void Pc16550Drv_Delete(C_DRVOBJ *pDrvObj);
 
 #ifdef __cplusplus
 }
index f938d16..e24cac2 100755 (executable)
 
 
 /** クローズ */
-FILE_ERR Pc16550Drv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
+void Pc16550Drv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
 {
        C_PC16550DRV    *self;
+       C_CHRFILE               *pChrFile;
        
        /* upper cast */
-       self = (C_PC16550DRV *)pDrvObj;
+       self     = (C_PC16550DRV *)pDrvObj;
+       pChrFile = (C_CHRFILE *)pFileObj;
 
        /* クローズ処理 */
        if ( --self->iOpenCount == 0 )
@@ -30,9 +32,8 @@ FILE_ERR Pc16550Drv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
        }
        
        /* ディスクリプタ削除 */
+       ChrFile_Delete(pChrFile);       
        SysMem_Free(pFileObj);
-       
-       return FILE_ERR_OK;
 }
 
 
index 70e3a97..8aa1c52 100755 (executable)
@@ -20,9 +20,8 @@
 extern "C" {
 #endif
 
-void      Pc16550Drv_Delete(C_DRVOBJ *pDrvObj);
 HANDLE    Pc16550Drv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode);
-FILE_ERR  Pc16550Drv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj);
+void      Pc16550Drv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj);
 FILE_ERR  Pc16550Drv_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize);
 FILE_POS  Pc16550Drv_Seek(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign);
 FILE_SIZE Pc16550Drv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size);
diff --git a/aplfw/driver/volume/fat/fatvol.h b/aplfw/driver/volume/fat/fatvol.h
new file mode 100755 (executable)
index 0000000..53667aa
--- /dev/null
@@ -0,0 +1,74 @@
+
+
+#ifndef __HOS__fatvol_h__
+#define __HOS__fatvol_h__
+
+
+#include "system/sysapi/sysapi.h"
+#include "system/file/volumeobj.h"
+
+
+#define FATVOL_ERR_OK          0
+#define FATVOL_ERR_NG          (-1)
+
+
+/* 型定義 */
+typedef unsigned long  FATVOL_UINT;
+
+
+/* クラスタバッファ */
+typedef struct t_fatvol_clusterbuf
+{
+       FATVOL_UINT             uiClusterNum;
+       int                             iDirty;
+       unsigned char   *pubBuf;
+} T_FATVOL_CLUSTERBUF;
+
+
+/* クラスタバッファ */
+typedef struct c_fatvol
+{
+       C_VOLUMEOBJ                     VolumeObj;                                      /* ボリュームオブジェクトを継承 */
+
+       HANDLE                          hBlockFile;                                     /**< ブロックデバイスドライバのハンドル */
+
+       int                                     iFatType;                                       /**< FATのタイプ */
+       FILE_POS                        Offset;                                         /**< ディスクのオフセット */
+       FILE_POS                        DriveSize;                                      /**< ドライブの総サイズ */
+       FATVOL_UINT                     BytesPerSector;                         /**< セクタサイズ */
+       FATVOL_UINT                     SectorsPerCluster;                      /**< クラスタサイズ */
+       FATVOL_UINT                     FatStartSector;                         /**< FATの開始セクタ番号 */
+       FATVOL_UINT                     SectorPerFat;                           /**< FATあたりのセクタ数 */
+       FATVOL_UINT                     FatNum;                                         /**< FATの個数 */
+       FATVOL_UINT                     RootDirEntryNum;                        /**< ルートディレクトリのエントリ数 */
+       FATVOL_UINT                     RootDirSector;                          /**< ルートディレクトリのセクタ */
+       FATVOL_UINT                     Cluster0Sector;                         /**< クラスタ0のセクタ番号 */
+       FATVOL_UINT                     MaxClusterNum;                          /**< 最大クラスタ番号 */
+       FATVOL_UINT                     RootDirCluster;                         /**< ルートディレクトリのクラスタ番号 */
+       
+       unsigned char           *pubFatBuf;                                     /**< FATのバッファリングメモリ */
+       unsigned char           *pubFatDirty;                           /**< FATの更新フラグ */
+       
+       T_FATVOL_CLUSTERBUF     *pClusterBuf;
+       int                                     iClusterBufNum;
+       int                                     iClusterBufIndex;
+} C_FATVOL;
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int    FatVol_Create(C_FATVOL *self, HANDLE hBlockFile);
+void   FatVol_Delete(C_DRVOBJ *self);
+
+HANDLE FatVol_CreateFile(C_FATVOL *self, FATVOL_UINT uiCluster, HANDLE hDir, int iDirEntry, int iMode);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __HOS__fatdrive_h__ */
+
+
diff --git a/aplfw/driver/volume/fat/fatvol_clusterread.c b/aplfw/driver/volume/fat/fatvol_clusterread.c
new file mode 100755 (executable)
index 0000000..7eeb054
--- /dev/null
@@ -0,0 +1,53 @@
+#include "fatvol_local.h"
+
+
+/** クラスタ読み込み */
+int FatVol_ClusterRead(
+               C_FATVOL    *self,
+               FATVOL_UINT uiCluster,
+               void        *pBuf)
+{
+       FATVOL_UINT uiPos;
+       FATVOL_UINT uiSize;
+
+       if ( uiCluster >= 0xffff0000 && (self->iFatType == FATVOL_TYPE_FAT12 || self->iFatType == FATVOL_TYPE_FAT16) )
+       {
+               /* FAT12/16 のルートディレクトリを 0xf0000000 にマップ */
+               uiCluster -= 0xf0000000;
+               
+               /* 読み出し位置移動 */
+               uiPos = (self->RootDirSector + (uiCluster * self->SectorsPerCluster)) * self->BytesPerSector;
+               if ( File_Seek(self->hBlockFile, uiPos, FILE_SEEK_SET) != uiPos )
+               {
+                       return FATVOL_ERR_NG;
+               }
+               
+               /* 読み出し */
+               uiSize = self->BytesPerSector * self->SectorsPerCluster;
+               if ( File_Read(self->hBlockFile, pBuf, uiSize) != uiSize )
+               {
+                       return FATVOL_ERR_NG;
+               }
+       }
+       else
+       {
+               /* 読み出し位置移動 */
+               uiPos = (self->Cluster0Sector + (uiCluster * self->SectorsPerCluster)) * self->BytesPerSector;
+               if ( File_Seek(self->hBlockFile, uiPos, FILE_SEEK_SET) != uiPos )
+               {
+                       return FATVOL_ERR_NG;
+               }
+
+               /* 読み出し */
+               uiSize = self->BytesPerSector * self->SectorsPerCluster;
+               if ( File_Read(self->hBlockFile, pBuf, uiSize) != uiSize )
+               {
+                       return FATVOL_ERR_NG;
+               }
+       }
+       
+       return FATVOL_ERR_OK;
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/volume/fat/fatvol_clusterwrite.c b/aplfw/driver/volume/fat/fatvol_clusterwrite.c
new file mode 100755 (executable)
index 0000000..4bf0e01
--- /dev/null
@@ -0,0 +1,54 @@
+
+#include "fatvol_local.h"
+
+
+/** クラスタ書き込み */
+int FatVol_ClusterWrite(
+               C_FATVOL    *self,
+               FATVOL_UINT uiCluster,
+               const void  *pBuf)
+{
+       FATVOL_UINT uiPos;
+       FATVOL_UINT uiSize;
+       
+       if ( uiCluster >= 0xffff0000 && (self->iFatType == FATVOL_TYPE_FAT12 || self->iFatType == FATVOL_TYPE_FAT16) )
+       {
+               /* FAT12/16 のルートディレクトリを 0xffff0000 にマップ */
+               uiCluster -= 0xf0000000;
+               
+               /* 書き出し位置移動 */
+               uiPos = (self->RootDirSector + (uiCluster * self->SectorsPerCluster)) * self->BytesPerSector;
+               if ( File_Seek(self->hBlockFile, uiPos, FILE_SEEK_SET) != uiPos )
+               {
+                       return FATVOL_ERR_NG;
+               }
+               
+               /* 書き出し */
+               uiSize = self->BytesPerSector * self->SectorsPerCluster;
+               if ( File_Write(self->hBlockFile, pBuf, uiSize) != uiSize )
+               {
+                       return FATVOL_ERR_NG;
+               }
+       }
+       else
+       {
+               /* 書き出し位置移動 */
+               uiPos = (self->Cluster0Sector + (uiCluster * self->SectorsPerCluster)) * self->BytesPerSector;
+               if ( File_Seek(self->hBlockFile, uiPos, FILE_SEEK_SET) != uiPos )
+               {
+                       return FATVOL_ERR_NG;
+               }
+               
+               /* 書き出し */
+               uiSize = self->BytesPerSector * self->SectorsPerCluster;
+               if ( File_Write(self->hBlockFile, pBuf, uiSize) != uiSize )
+               {
+                       return FATVOL_ERR_NG;
+               }
+       }
+       
+       return FATVOL_ERR_OK;
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/volume/fat/fatvol_create.c b/aplfw/driver/volume/fat/fatvol_create.c
new file mode 100755 (executable)
index 0000000..c76dd6f
--- /dev/null
@@ -0,0 +1,140 @@
+
+#include <string.h>
+#include "fatvol_local.h"
+
+
+/* 仮想関数テーブル */
+const T_VOLUMEOBJ_METHODS FatVol_VolumeObjMethods =
+{
+       {
+               FatVol_Delete,
+               FatVol_Open,
+               FatVol_Close,
+               FatVol_IoControl,
+               FatVol_Seek,
+               FatVol_Read,
+               FatVol_Write,
+               FatVol_Flush,
+       },
+       FatVol_MakeDir,
+       FatVol_Remove,
+};
+
+
+/* コンストラクタ */
+int FatVol_Create(C_FATVOL *self, HANDLE hBlockFile)
+{
+       unsigned char ubBuf[512];
+       int           i;
+       
+       /* 親クラスコンストラクタ呼び出し */
+       VolumeObj_Create(&self->VolumeObj, &FatVol_VolumeObjMethods);   
+       
+       
+       /* ドライブの設定 */
+       self->hBlockFile = hBlockFile;
+       self->Offset   = 0x33*512;      /* 一時的に ちょいインチキ */
+       
+       
+       /* サイズ取得 */
+       self->DriveSize  = File_Seek(self->hBlockFile, FILE_SEEK_END, 0);
+       self->iFatType   = FATVOL_TYPE_UNKNOWN;
+       
+       
+       /* BIOS Parameter Block */
+       File_Seek(self->hBlockFile, self->Offset, FILE_SEEK_SET);
+       File_Read(self->hBlockFile, ubBuf, 512);
+       
+       /* FAT12/16/32判定 */
+       if ( ubBuf[0x36] == 'F' && ubBuf[0x37] == 'A' && ubBuf[0x38] == 'T' && ubBuf[0x39] == '1' )
+       {
+               if ( ubBuf[0x3a] == '2' )
+               {
+                       self->iFatType = FATVOL_TYPE_FAT12;
+               }
+               else if ( ubBuf[0x3a] == '6' )
+               {
+                       self->iFatType = FATVOL_TYPE_FAT16;
+               }
+       }
+       else if ( ubBuf[0x52] == 'F' && ubBuf[0x53] == 'A' && ubBuf[0x54] == 'T' && ubBuf[0x55] == '3' && ubBuf[0x56] == '2')
+       {
+               self->iFatType = FATVOL_TYPE_FAT32;
+       }
+       
+       
+       /* フォーマット別情報解析 */
+       switch ( self->iFatType )
+       {
+       case FATVOL_TYPE_FAT12:
+       case FATVOL_TYPE_FAT16:
+               self->BytesPerSector    = ubBuf[0x0b] + ubBuf[0x0c] * 256;                      /**< セクタサイズ */
+               self->SectorsPerCluster = ubBuf[0x0d];                                                          /**< 1クラスタのセクタ数 */
+               self->RootDirEntryNum   = ubBuf[0x11] + ubBuf[0x12] * 256;                      /**< ルートディレクトリ最大エントリ数 */
+               self->FatStartSector    = ubBuf[0x0e] + ubBuf[0x0f] * 256;                      /**< FATの開始セクタ番号 */
+               self->SectorPerFat      = ubBuf[0x16] + ubBuf[0x17] * 256;                      /**< FATあたりのセクタ数 */
+               self->FatNum            = ubBuf[0x10];                                                          /**< FAT個数 */
+               self->RootDirSector     = self->FatStartSector + (self->SectorPerFat * self->FatNum);
+                                                                                                                                                       /**< ルートディレクトリ開始位置 */
+               self->Cluster0Sector    = self->RootDirSector
+                                                                               + (((self->RootDirEntryNum * 32) + self->BytesPerSector - 1) / self->BytesPerSector)
+                                                                               - (2 * self->SectorsPerCluster);        /**< クラスタ0の開始セクタ */
+                               
+               /* FATバッファ準備 */
+               self->pubFatBuf   = (unsigned char *)SysMem_Alloc(self->SectorPerFat * self->BytesPerSector);
+               self->pubFatDirty = (unsigned char *)SysMem_Alloc(self->SectorPerFat);
+
+               /* FATバッファ準備 */
+               File_Seek(self->hBlockFile, self->FatStartSector * self->BytesPerSector, FILE_SEEK_SET);
+               File_Read(self->hBlockFile, self->pubFatBuf, self->SectorPerFat * self->BytesPerSector);
+               memset(self->pubFatDirty, 0, self->SectorPerFat);
+
+               break;
+
+       case FATVOL_TYPE_FAT32:
+               break;
+       
+       default:
+               return FATVOL_ERR_NG;
+       }
+       
+       /* 最大クラスタ番号算出 */
+       switch ( self->iFatType )
+       {
+       case FATVOL_TYPE_FAT12:
+               self->MaxClusterNum = (self->SectorPerFat * self->BytesPerSector) / 3 * 2;
+               if ( self->MaxClusterNum >= 0x0ff7 )
+               {
+                       self->MaxClusterNum = 0x0ff6;
+               }
+               break;
+
+       case FATVOL_TYPE_FAT16:
+               self->MaxClusterNum = (self->SectorPerFat * self->BytesPerSector) / 2;
+               if ( self->MaxClusterNum >= 0xfff7 )
+               {
+                       self->MaxClusterNum = 0xfff6;
+               }
+               break;
+
+       case FATVOL_TYPE_FAT32:
+               self->MaxClusterNum = (self->SectorPerFat * self->BytesPerSector) / 4;
+               break;
+       }
+       
+       /* クラスタバッファ取得 */
+       self->iClusterBufIndex = 0;
+       self->iClusterBufNum   = 32;
+       self->pClusterBuf = (T_FATVOL_CLUSTERBUF *)SysMem_Alloc(sizeof(T_FATVOL_CLUSTERBUF) * self->iClusterBufNum);
+       for ( i = 0; i < self->iClusterBufNum; i++ )
+       {
+               self->pClusterBuf[i].uiClusterNum = FATVOL_CLUSTER_ENDMARKER;
+               self->pClusterBuf[i].iDirty       = 0;
+               self->pClusterBuf[i].pubBuf       = SysMem_Alloc(self->SectorsPerCluster * self->BytesPerSector);
+       }
+       
+       return FATVOL_ERR_OK;
+}
+
+
+
diff --git a/aplfw/driver/volume/fat/fatvol_createfile.c b/aplfw/driver/volume/fat/fatvol_createfile.c
new file mode 100755 (executable)
index 0000000..c657e9e
--- /dev/null
@@ -0,0 +1,28 @@
+#include <stdio.h>
+#include "system/sysapi/sysapi.h"
+#include "fatfile.h"
+#include "fatvol_local.h"
+
+
+HANDLE FatVol_CreateFile(
+               C_FATVOL    *self,
+               FATVOL_UINT uiCluster,
+               HANDLE      hDir,
+               int         iDirEntry,
+               int         iMode)
+{
+       C_FATFILE *pFatFile;
+       
+       /* オブジェクトを生成 */
+       pFatFile = (C_FATFILE *)SysMem_Alloc(sizeof(C_FATFILE));
+       if ( pFatFile == NULL )
+       {
+               return HANDLE_NULL;
+       }
+       FatFile_Create(pFatFile, self, uiCluster, hDir, iDirEntry, iMode);
+       
+       return (HANDLE)pFatFile;
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/volume/fat/fatvol_flushfat.c b/aplfw/driver/volume/fat/fatvol_flushfat.c
new file mode 100755 (executable)
index 0000000..15c6863
--- /dev/null
@@ -0,0 +1,36 @@
+
+#include <string.h>
+#include "fatvol_local.h"
+
+
+/** FATのフラッシュ */
+void FatVol_FlushFat(C_FATVOL *self)
+{
+       unsigned long i;
+       
+       /* FAT先頭へ移動 */
+       File_Seek(self->hBlockFile, self->FatStartSector * self->BytesPerSector, FILE_SEEK_SET);
+       
+       for ( i = 0; i < self->FatNum; i++ )
+       {
+               int j;
+               
+               for ( j = 0; j < self->SectorPerFat; j++ )
+               {
+                       if ( self->pubFatDirty[j] )
+                       {
+                               File_Write(self->hBlockFile, &self->pubFatBuf[j * self->BytesPerSector], self->BytesPerSector);
+                       }
+                       else
+                       {
+                               File_Seek(self->hBlockFile, self->BytesPerSector, FILE_SEEK_CUR);
+                       }
+               }
+       }
+
+       /* 更新フラグクリア */
+       memset(self->pubFatDirty, 0, self->SectorPerFat);
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/volume/fat/fatvol_getclusterbuf.c b/aplfw/driver/volume/fat/fatvol_getclusterbuf.c
new file mode 100755 (executable)
index 0000000..1374559
--- /dev/null
@@ -0,0 +1,67 @@
+
+#include "fatvol_local.h"
+
+
+/**< クラスタ読み込み */
+int FatVol_GetClusterBuf(
+               C_FATVOL    *self,
+               FATVOL_UINT uiCluster,
+               void        **ppBuf,
+               int         iRead)
+{
+       int i;
+       
+       /* 既にバッファに居ないか探索 */
+       for ( i = 0; i < self->iClusterBufNum; i++ )
+       {
+               /* 見つかれば既存バッファを返す */
+               if ( self->pClusterBuf[i].uiClusterNum == uiCluster )
+               {
+                       *ppBuf = self->pClusterBuf[i].pubBuf;
+                       return FATVOL_ERR_OK;
+               }
+       }
+       
+       /* 空のバッファを探す */
+       for ( i = 0; i < self->iClusterBufNum; i++ )
+       {
+               if ( self->pClusterBuf[i].uiClusterNum == FATVOL_CLUSTER_ENDMARKER )
+               {
+                       break;
+               }
+       }
+       
+       /* 空きが無ければ空ける */
+       if ( i >= self->iClusterBufNum )
+       {
+               /* FIFO順でフラッシュ */
+               i = self->iClusterBufIndex++;
+               
+               /* dirtyなら吐き出す */
+               if ( self->pClusterBuf[i].iDirty )
+               {
+                       if ( FatVol_ClusterWrite(self, self->pClusterBuf[i].uiClusterNum, self->pClusterBuf[i].pubBuf) != FATVOL_ERR_OK )
+                       {
+                               return FATVOL_ERR_NG;
+                       }
+                       self->pClusterBuf[i].iDirty = 0;
+               }
+               self->pClusterBuf[i].uiClusterNum = FATVOL_CLUSTER_ENDMARKER;
+       }
+       
+       /* バッファに読み込み */
+       if ( iRead )
+       {
+               if ( FatVol_ClusterRead(self, self->pClusterBuf[i].uiClusterNum, self->pClusterBuf[i].pubBuf) != FATVOL_ERR_OK )
+               {
+                       return FATVOL_ERR_NG;
+               }
+       }
+       self->pClusterBuf[i].iDirty       = 0;
+       self->pClusterBuf[i].uiClusterNum = uiCluster;
+       
+       return FATVOL_ERR_OK;   
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/volume/fat/fatvol_getnextcluster.c b/aplfw/driver/volume/fat/fatvol_getnextcluster.c
new file mode 100755 (executable)
index 0000000..ddacdd9
--- /dev/null
@@ -0,0 +1,64 @@
+
+#include <string.h>
+#include "fatvol_local.h"
+
+
+FATVOL_UINT FatVol_GetNextCluster(C_FATVOL *self, FATVOL_UINT uiCluster)
+{
+       FATVOL_UINT uiNextCluster = FATVOL_CLUSTER_ENDMARKER;
+       
+       switch ( self->iFatType )
+       {
+       case FATVOL_TYPE_FAT12:
+               /* 0xffff0000 からルートディレクトリをマップ */
+               if ( uiCluster >= 0xffff0000 )
+               {
+                       return uiCluster + 1;
+               }
+               
+               /* FAT検索 */
+               if ( uiCluster % 2 == 0 )
+               {
+                       uiNextCluster = self->pubFatBuf[(uiCluster / 2) * 3 + 0]
+                                                       + ((self->pubFatBuf[(uiCluster / 2) * 3 + 1] & 0x0f) << 8);
+               }
+               else
+               {
+                       uiNextCluster = ((self->pubFatBuf[(uiCluster / 2) * 3 + 1] >> 4) & 0xf)
+                                                       + (self->pubFatBuf[(uiCluster / 2) * 3 + 2] << 4);
+               }
+               
+               if ( uiNextCluster >= 0x0ff7 )
+               {
+                       uiNextCluster = FATVOL_CLUSTER_ENDMARKER;
+               }
+               break;
+       
+       case FATVOL_TYPE_FAT16:
+               /* 0xffff0000 からルートディレクトリをマップ */
+               if ( uiCluster >= 0xffff0000 )
+               {
+                       return uiCluster + 1;
+               }
+               
+               /* FAT検索 */
+               uiNextCluster = self->pubFatBuf[uiCluster * 2] + self->pubFatBuf[uiCluster * 2 + 1] * 256;
+               if ( uiNextCluster >= 0xfff7 )
+               {
+                       uiNextCluster = FATVOL_CLUSTER_ENDMARKER;
+               }
+               break;
+
+       case FATVOL_TYPE_FAT32:
+               uiNextCluster = self->pubFatBuf[uiCluster * 4]
+                               + self->pubFatBuf[uiCluster * 4 + 1] * 256
+                               + self->pubFatBuf[uiCluster * 4 + 2] * 256 * 256
+                               + self->pubFatBuf[uiCluster * 4 + 3] * 256 * 256 * 256;
+               break;
+       }
+       
+       return uiNextCluster;
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/volume/fat/fatvol_local.h b/aplfw/driver/volume/fat/fatvol_local.h
new file mode 100755 (executable)
index 0000000..6ae8dbe
--- /dev/null
@@ -0,0 +1,55 @@
+
+
+#ifndef __HOS__fatvol_local_h__
+#define __HOS__fatvol_local_h__
+
+
+#include "fatvol.h"
+
+
+/* 最終クラスタマーカー */
+#define FATVOL_CLUSTER_FREE                            0x00000000
+#define FATVOL_CLUSTER_ENDMARKER               0xffffffff
+
+
+/* ファイルシステムのタイプ */
+#define FATVOL_TYPE_UNKNOWN                            0
+#define FATVOL_TYPE_FAT12                              1
+#define FATVOL_TYPE_FAT16                              2
+#define FATVOL_TYPE_FAT32                              3
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+HANDLE      FatVol_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode);
+void        FatVol_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj);
+FILE_ERR    FatVol_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize);
+FILE_POS    FatVol_Seek(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign);
+FILE_SIZE   FatVol_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size);
+FILE_SIZE   FatVol_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size);
+FILE_ERR    FatVol_Flush(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj);
+
+FILE_ERR    FatVol_MakeDir(C_VOLUMEOBJ *self, const char *pszPath);                                                                    /* サブディレクトリを作成 */
+FILE_ERR    FatVol_Remove(C_VOLUMEOBJ *self, const char *pszPath);                                                                     /* ファイルを削除 */
+
+
+int         FatVol_ClusterWrite(C_FATVOL *self, FATVOL_UINT uiCluster, const void *pBuf);                      /**< クラスタ書き込み */
+int         FatVol_ClusterRead(C_FATVOL *self, FATVOL_UINT uiCluster, void *pBuf);                                     /**< クラスタ読み込み */
+int         FatVol_GetClusterBuf(C_FATVOL *self, FATVOL_UINT uiCluster, void **ppBuf, int iRead);
+int         FatVol_RelClusterBuf(C_FATVOL *self, void *ppBuf, int iDirty);                                                     
+
+FATVOL_UINT FatVol_GetNextCluster(C_FATVOL *self, FATVOL_UINT uiCluster);
+void        FatVol_SetNextCluster(C_FATVOL *self, FATVOL_UINT uiCluster, FATVOL_UINT uiNextCluster);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /*  __HOS__fatvol_local_h__ */
+
+
+/* end of file */
diff --git a/aplfw/driver/volume/fat/fatvol_open.c b/aplfw/driver/volume/fat/fatvol_open.c
new file mode 100755 (executable)
index 0000000..d8365a0
--- /dev/null
@@ -0,0 +1,132 @@
+
+#include <string.h>
+#include "fatvol_local.h"
+
+
+HANDLE FatVol_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
+{
+       C_FATVOL                *self;
+       unsigned char   ubBuf[32];
+       FATVOL_UINT             uiCluster;
+       HANDLE hDir;
+       HANDLE hFile;
+       char   szEntryName[8+3+1];
+       int    iEntryNameLen;
+       char   szName[8+3+1];
+       int    iNameLen;
+       int    iDirEntry;
+       int    i, j;
+       
+       /* upper cast */
+       self = (C_FATVOL *)pDrvObj;
+       
+       /* ルートディレクトリを開く */
+       hDir = FatVol_CreateFile(self, self->RootDirCluster, 0, 0, FILE_OPEN_READ | FILE_OPEN_WRITE | FILE_OPEN_DIR);
+       
+       for ( ; ; )
+       {
+               /* 名前の部分を検索 */
+               for ( iNameLen = 0; pszPath[iNameLen] != '\0'; iNameLen++ )
+               {
+                       if ( pszPath[iNameLen] == '/' )
+                       {
+                               szName[iNameLen] = '\0';
+                               break;
+                       }
+                       
+                       /* 大文字に変換 */
+                       if ( pszPath[iNameLen] >= 'a' && pszPath[iNameLen] <= 'z' )
+                       {
+                               szName[iNameLen] = pszPath[iNameLen] - ('a' - 'A');
+                       }
+                       else
+                       {
+                               szName[iNameLen] = pszPath[iNameLen];
+                       }
+               }
+               
+               /* ディレクトリエントリを検索 */
+               iDirEntry = -1;
+               for ( i = 0; File_Read(hDir, ubBuf, 32) == 32; i++ )
+               {
+                       /* 0なら打ち切り */
+                       if ( ubBuf[0] == 0x00 )
+                       {
+                               break;
+                       }
+                       
+                       /* 名前部分取り出し */
+                       iEntryNameLen = 0;
+                       for ( j = 0; j < 8; j++ )
+                       {
+                               if ( ubBuf[0+j] == ' ' || ubBuf[0+j] == '\0' )
+                               {
+                                       break;
+                               }
+                               szEntryName[iEntryNameLen++] = (char)ubBuf[0+j];
+                       }
+                       szEntryName[iEntryNameLen++] = '.';
+                       for ( j = 0; j < 3; j++ )
+                       {
+                               if ( ubBuf[8+j] == ' ' || ubBuf[8+j] == '\0' )
+                               {
+                                       break;
+                               }
+                               szEntryName[iEntryNameLen++] = (char)ubBuf[8+j];
+                       }
+                       szEntryName[iEntryNameLen++] = '\0';
+                       if ( iEntryNameLen > 2 && szEntryName[iEntryNameLen-1] == '.' )
+                       {
+                               szEntryName[--iEntryNameLen] = '\0';
+                       }
+                       
+                       if ( strcmp(szEntryName, szName) == 0 )
+                       {
+                               iDirEntry = i;
+                               break;
+                       }
+               }
+               
+               /* 開始クラスタ取得 */
+               uiCluster = ubBuf[0x1a] + ubBuf[0x1b]*256;
+               if ( self->iFatType == FATVOL_TYPE_FAT32 )
+               {
+                       uiCluster += ubBuf[0x14]*256*256 + ubBuf[0x15]*256*256*256;
+               }
+
+               /* パス部分の解析が終わっていればここで抜ける */
+               if ( pszPath[iNameLen] == '\0' )
+               {
+                       break;
+               }
+               
+               File_Close(hDir);
+               
+               /* サブディレクトリがなければエラー */
+               if ( iDirEntry < 0 || !(ubBuf[0x0b] & 0x10) )
+               {
+                       return HANDLE_NULL;
+               }
+               
+               /* サブディレクトリを開く */
+               hDir = FatVol_CreateFile(self, uiCluster, 0, 0, FILE_OPEN_READ | FILE_OPEN_WRITE | FILE_OPEN_DIR);
+               
+               pszPath += iNameLen;
+       }
+       
+       /* 既存ファイルがあれば */
+       if ( iDirEntry >= 0 )
+       {
+               hFile = FatVol_CreateFile(self, uiCluster, hDir, iDirEntry, iMode);
+               if ( hFile == HANDLE_NULL )
+               {
+                       File_Close(hDir);
+               }
+               return hFile;
+       }
+       
+       File_Close(hDir);
+       return HANDLE_NULL;
+}
+
+
diff --git a/aplfw/driver/volume/fat/fatvol_relclusterbuf.c b/aplfw/driver/volume/fat/fatvol_relclusterbuf.c
new file mode 100755 (executable)
index 0000000..a62e276
--- /dev/null
@@ -0,0 +1,23 @@
+
+#include <stddef.h>
+#include "fatvol_local.h"
+
+
+/**< クラスタ読み込み */
+int FatVol_RelClusterBuf(
+               C_FATVOL    *self,
+               void        *pBuf,
+               int         iDirty)
+{
+       T_FATVOL_CLUSTERBUF     *pClusterBuf;
+       
+       /* バッファ情報取得 */
+       pClusterBuf = (T_FATVOL_CLUSTERBUF *)((char *)pBuf - offsetof(T_FATVOL_CLUSTERBUF, pubBuf));
+       
+       pClusterBuf->iDirty = iDirty;
+       
+       return FATVOL_ERR_OK;   
+}
+
+
+/* end of file */
diff --git a/aplfw/driver/volume/fat/fatvol_setnextcluster.c b/aplfw/driver/volume/fat/fatvol_setnextcluster.c
new file mode 100755 (executable)
index 0000000..8b2d41f
--- /dev/null
@@ -0,0 +1,50 @@
+
+
+#include "fatvol_local.h"
+
+
+void FatVol_SetNextCluster(C_FATVOL *self, FATVOL_UINT uiCluster, FATVOL_UINT uiNextCluster)
+{
+       switch ( self->iFatType )
+       {
+       case FATVOL_TYPE_FAT12:
+               /* FAT更新 */
+               if ( uiCluster % 2 == 0 )
+               {
+                       self->pubFatBuf[(uiCluster / 2) * 3 + 0] = uiNextCluster & 0xff;
+                       self->pubFatBuf[(uiCluster / 2) * 3 + 1] = ((uiNextCluster >> 8) & 0x0f) | (self->pubFatBuf[(uiCluster / 2) * 3 + 1] & 0xf0);
+               }
+               else
+               {
+                       self->pubFatBuf[(uiCluster / 2) * 3 + 1] = ((uiNextCluster << 4) & 0xf0) | (self->pubFatBuf[(uiCluster / 2) * 3 + 1] & 0x0f);
+                       self->pubFatBuf[(uiCluster / 2) * 3 + 2] = ((uiNextCluster >> 4) & 0xff);
+               }
+
+               /* 更新フラグ設定 */
+               self->pubFatDirty[((uiCluster / 2) * 3 + 0) / self->BytesPerSector] = 1;
+               self->pubFatDirty[((uiCluster / 2) * 3 + 2) / self->BytesPerSector] = 1;
+               break;
+               
+       case FATVOL_TYPE_FAT16:
+               /* FAT更新 */
+               self->pubFatBuf[uiCluster * 2 + 0] = uiNextCluster % 256;
+               self->pubFatBuf[uiCluster * 2 + 1] = uiNextCluster / 256;
+
+               /* 更新フラグ設定 */
+               self->pubFatDirty[(uiCluster * 2) / self->BytesPerSector] = 1;
+               break;
+
+       case FATVOL_TYPE_FAT32:
+               /* FAT更新 */
+               self->pubFatBuf[uiCluster * 2 + 0] = uiNextCluster % 256;
+               self->pubFatBuf[uiCluster * 2 + 1] = (uiNextCluster / 256) % 256;
+               self->pubFatBuf[uiCluster * 2 + 2] = (uiNextCluster / 256 / 256) % 256;
+               self->pubFatBuf[uiCluster * 2 + 3] = (uiNextCluster / 256 / 256 / 256) % 256;
+
+               /* 更新フラグ設定 */
+               self->pubFatDirty[(uiCluster * 4) / self->BytesPerSector] = 1;
+       }
+}
+
+
+/* end of file */
index e4eba27..64c250a 100755 (executable)
 #include "system/shell/shell.h"
 #include "driver/serial/pc16550/pc16550drv.h"
 #include "driver/console/vt100/vt100drv.h"
-#include "application/example/hello/hello.h"
-#include "application/utility/memdump/memdump.h"
-#include "application/utility/memwrite/memwrite.h"
-#include "application/utility/memtest/memtest.h"
-#include "application/utility/keytest/keytest.h"
+#include "apl/hello/hello.h"
+#include "apl/util/memdump/memdump.h"
+#include "apl/util/memwrite/memwrite.h"
+#include "apl/util/memtest/memtest.h"
+#include "apl/util/keytest/keytest.h"
 
 
 long         g_SystemHeap[64 * 1024 / sizeof(long)];
index cae8809..5dcb562 100755 (executable)
 #include "system/shell/shell.h"
 #include "driver/serial/renesas/scidrv.h"
 #include "driver/console/vt100/vt100drv.h"
-#include "apl/hello/hello.h"
-#include "apl/util/memdump/memdump.h"
-#include "apl/util/memwrite/memwrite.h"
-#include "apl/util/memtest/memtest.h"
-#include "apl/util/keytest/keytest.h"
+#include "application/example/hello/hello.h"
+#include "application/filecmd/filelist/filelist.h"
+#include "application/utility/memdump/memdump.h"
+#include "application/utility/memwrite/memwrite.h"
+#include "application/utility/memtest/memtest.h"
+#include "application/utility/keytest/keytest.h"
 #include "regs_sh7144.h"
 
 
@@ -89,6 +90,7 @@ void Sample_Task(VP_INT exinf)
        /*************************/
        Command_AddCommand("hsh",      Shell_Main);
        Command_AddCommand("hello",    Hello_Main);
+       Command_AddCommand("ls",       FileList_Main);
        Command_AddCommand("memdump",  MemDump_Main);
        Command_AddCommand("memwrite", MemWrite_Main);
        Command_AddCommand("memtest",  MemTest_Main);
index da7b910..5a35add 100755 (executable)
@@ -34,7 +34,7 @@ extern "C" {
 #endif
 
 void ChrDrv_Create(C_CHRDRV *self, const T_DRVOBJ_METHODS *pMethods);          /**< コンストラクタ */
-void ChrDrv_Delete(C_DRVOBJ *self);                                                                                    /**< デストラクタ */
+void ChrDrv_Delete(C_CHRDRV *self);                                                                                    /**< デストラクタ */
 
 void ChrDrv_WriteSignal(C_CHRDRV *self);               /**< 書込み可能になったことを通知 */
 void ChrDrv_ReadSignal(C_CHRDRV *self);                        /**< 読込み可能になったことを通知 */
diff --git a/aplfw/system/file/chrdrv_delete.c b/aplfw/system/file/chrdrv_delete.c
new file mode 100755 (executable)
index 0000000..172d9b4
--- /dev/null
@@ -0,0 +1,25 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  chrfile.h
+ * @brief %jp{キャラクタ型デバイスドライバ用ファイルディスクリプタ}
+ *
+ * %jp{ファイルディスクリプタとして機能するクラス}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "chrdrv.h"
+
+
+void ChrDrv_Delete(C_CHRDRV *self)
+{
+       /* 親クラスデストラクタ呼び出し */
+       DrvObj_Delete(&self->DrvObj);
+}
+
+
+/* end of file */
index 8e56879..c4b2d59 100755 (executable)
@@ -40,7 +40,8 @@ typedef struct c_chrfile
 extern "C" {
 #endif
 
-void ChrFile_Create(C_CHRFILE *self, struct c_drvobj *pDrvObj, const T_FILEOBJ_METHODS *pMethods);
+void    ChrFile_Create(C_CHRFILE *self, struct c_drvobj *pDrvObj, const T_FILEOBJ_METHODS *pMethods);
+#define ChrFile_Delete(self)   FileObj_Delete(&(self)->FileObj)
 
 #ifdef __cplusplus
 }
index e8b6800..2dff6b7 100755 (executable)
@@ -24,7 +24,7 @@ typedef struct t_drvobj_methods
 {
        void      (*pfncDelete)(struct c_drvobj *self);
        HANDLE    (*pfncOpen)(struct c_drvobj *self, const char *pszPath, int iMode);
-       FILE_ERR  (*pfncClose)(struct c_drvobj *self, struct c_fileobj *pFileObj);
+       void      (*pfncClose)(struct c_drvobj *self, struct c_fileobj *pFileObj);
        FILE_ERR  (*pfncIoControl)(struct c_drvobj *self, struct c_fileobj *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize);
        FILE_POS  (*pfncSeek)(struct c_drvobj *self, struct c_fileobj *pFileObj, FILE_POS Offset, int iOrign);
        FILE_SIZE (*pfncRead)(struct c_drvobj *self, struct c_fileobj *pFileObj, void *pBuf, FILE_SIZE Size);
@@ -47,23 +47,33 @@ typedef struct c_drvobj
 extern "C" {
 #endif
 
-void     DrvObj_Create(C_DRVOBJ *self, const T_DRVOBJ_METHODS *pMethods);              /**< コンストラクタ */
-void     DrvObj_Delete(C_DRVOBJ *self);                                                                                        /**< デストラクタ */
+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)))
+HANDLE    DrvObj_Open(C_DRVOBJ *self, const char *pszPath, int iMode);
+void      DrvObj_Close(C_DRVOBJ *self, struct c_fileobj *pFileObj);
+FILE_ERR  DrvObj_IoControl(C_DRVOBJ *self, struct c_fileobj *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize);
+FILE_POS  DrvObj_Seek(C_DRVOBJ *self, struct c_fileobj *pFileObj, FILE_POS Offset, int iOrign);
+FILE_SIZE DrvObj_Read(C_DRVOBJ *self, struct c_fileobj *pFileObj, void *pBuf, FILE_SIZE Size);
+FILE_SIZE DrvObj_Write(C_DRVOBJ *self, struct c_fileobj *pFileObj, const void *pData, FILE_SIZE Size);
+FILE_ERR  DrvObj_Flush(C_DRVOBJ *self, struct c_fileobj *pFileObj);
 
 #ifdef __cplusplus
 }
 #endif
 
 
+/* 仮想関数呼び出し用マクロ */
+#define  DrvObj_vOpen(self, pszPath, iMode)                            ((self)->pMethods->pfncOpen((self), (pszPath), (iMode)))
+#define  DrvObj_vClose(self, pFileObj)                                 ((self)->pMethods->pfncClose((self), (pFileObj)))
+#define  DrvObj_vIoControl(self, pFileObj, iFunc, pInBuf, InSize, pOutBuf, OutSize)    \
+                                                                                                               ((self)->pMethods->pfncIoControl((self), (pFileObj), (iFunc), (pInBuf), (InSize), (pOutBuf), (OutSize)))
+#define  DrvObj_vSeek(self, pFileObj, Offset, iOrign)  ((self)->pMethods->pfncSeek((self), (pFileObj), (Offset), (iOrign)))
+#define  DrvObj_vRead(self, pFileObj, pBuf, Size)              ((self)->pMethods->pfncRead((self), (pFileObj), (pBuf), (Size)))
+#define  DrvObj_vWrite(self, pFileObj, pData, Size)            ((self)->pMethods->pfncWrite((self), (pFileObj), (pData), (Size)))
+#define  DrvObj_vFlush(self, pFileObj)                                 ((self)->pMethods->pfncFlush((self), (pFileObj)))
+
+
 #endif /* __HOS__drvobj_h__ */
 
 
diff --git a/aplfw/system/file/drvobj_close.c b/aplfw/system/file/drvobj_close.c
new file mode 100755 (executable)
index 0000000..8b6d68b
--- /dev/null
@@ -0,0 +1,21 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  drvobj.h
+ * @brief %jp{デバイスドライバオブジェクトの基本クラス}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "drvobj_local.h"
+
+
+void DrvObj_Close(C_DRVOBJ *self, struct c_fileobj *pFileObj)
+{
+       return;
+}
+
+
+/* end of file */
index f1ba952..9e50245 100755 (executable)
@@ -1,3 +1,14 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  drvobj.h
+ * @brief %jp{デバイスドライバオブジェクトの基本クラス}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
 
 #include "drvobj_local.h"
 
@@ -9,3 +20,4 @@ void DrvObj_Create(C_DRVOBJ *self, const T_DRVOBJ_METHODS *pMethods)
 }
 
 
+/* end of file */
diff --git a/aplfw/system/file/drvobj_flush.c b/aplfw/system/file/drvobj_flush.c
new file mode 100755 (executable)
index 0000000..a1104f8
--- /dev/null
@@ -0,0 +1,21 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  drvobj.h
+ * @brief %jp{デバイスドライバオブジェクトの基本クラス}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "drvobj_local.h"
+
+
+FILE_ERR  DrvObj_Flush(C_DRVOBJ *self, struct c_fileobj *pFileObj)
+{
+       return FILE_ERR_NG;
+}
+
+
+/* end of file */
diff --git a/aplfw/system/file/drvobj_iocontrol.c b/aplfw/system/file/drvobj_iocontrol.c
new file mode 100755 (executable)
index 0000000..1d0ae0c
--- /dev/null
@@ -0,0 +1,21 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  drvobj.h
+ * @brief %jp{デバイスドライバオブジェクトの基本クラス}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "drvobj_local.h"
+
+
+FILE_ERR  DrvObj_IoControl(C_DRVOBJ *self, struct c_fileobj *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize)
+{
+       return FILE_ERR_NG;
+}
+
+
+/* end of file */
diff --git a/aplfw/system/file/drvobj_open.c b/aplfw/system/file/drvobj_open.c
new file mode 100755 (executable)
index 0000000..d670ebb
--- /dev/null
@@ -0,0 +1,21 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  drvobj.h
+ * @brief %jp{デバイスドライバオブジェクトの基本クラス}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "drvobj_local.h"
+
+
+HANDLE DrvObj_Open(C_DRVOBJ *self, const char *pszPath, int iMode)
+{
+       return HANDLE_NULL;
+}
+
+
+/* end of file */
diff --git a/aplfw/system/file/drvobj_read.c b/aplfw/system/file/drvobj_read.c
new file mode 100755 (executable)
index 0000000..12156e5
--- /dev/null
@@ -0,0 +1,21 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  drvobj.h
+ * @brief %jp{デバイスドライバオブジェクトの基本クラス}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "drvobj_local.h"
+
+
+FILE_SIZE DrvObj_Read(C_DRVOBJ *self, struct c_fileobj *pFileObj, void *pBuf, FILE_SIZE Size)
+{
+       return FILE_ERR_NG;
+}
+
+
+/* end of file */
diff --git a/aplfw/system/file/drvobj_seek.c b/aplfw/system/file/drvobj_seek.c
new file mode 100755 (executable)
index 0000000..c82609a
--- /dev/null
@@ -0,0 +1,21 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  drvobj.h
+ * @brief %jp{デバイスドライバオブジェクトの基本クラス}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "drvobj_local.h"
+
+
+FILE_POS DrvObj_Seek(C_DRVOBJ *self, struct c_fileobj *pFileObj, FILE_POS Offset, int iOrign)
+{
+       return FILE_ERR_NG;
+}
+
+
+/* end of file */
diff --git a/aplfw/system/file/drvobj_write.c b/aplfw/system/file/drvobj_write.c
new file mode 100755 (executable)
index 0000000..0425555
--- /dev/null
@@ -0,0 +1,21 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  drvobj.h
+ * @brief %jp{デバイスドライバオブジェクトの基本クラス}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "drvobj_local.h"
+
+
+FILE_SIZE DrvObj_Write(C_DRVOBJ *self, struct c_fileobj *pFileObj, const void *pData, FILE_SIZE Size)
+{
+       return FILE_ERR_NG;
+}
+
+
+/* end of file */
index 16978aa..94f6717 100755 (executable)
 #define FILE_IOCTL_SENDWRITEBUF                0x0031          /* ライトバッファ送信(省コピー版Write) */
 #define FILE_IOCTL_CANWRITEBUF         0x0032          /* ライトバッファ破棄(省コピー版Write) */
 
+
+/* IoControl機能コード(ディレクトリ) */
+#define FILE_IOCTL_DIR_READ                    0x0101          /* デバイス情報を得る */
+
 /* IoControl機能コード(コンソール) */
-#define FILE_IOCTL_CON_GETCH           0x0101          /* 文字読込み */
+#define FILE_IOCTL_CON_GETCH           0x0201          /* 文字読込み */
 
 /* IoControl機能コード(シリアル通信) */
 #define FILE_IOCTL_COM_GETSPEED                0x2101          /* BPS取得 */
 #define FILE_IOCTL_USER                                0x6000          /* 0x6000〜0x7fff */
 
 
+/* ファイル属性 */
+#define FILE_ATTR_READONLY                     0x01
+#define FILE_ATTR_DIR                          0x08
+#define FILE_ATTR_DEVICE                       0x80
+
+
+
 /* 型定義 */
 typedef char                   FILE_ATTR;                              /* ファイル属性 */
 typedef int                            FILE_ERR;                               /* ファイルのエラー型 */
 typedef long                   FILE_POS;                               /* ファイル位置の型定義 */
-typedef int                            FILE_SIZE;                              /* 読み書き時のサイズ用の型定義 */
+typedef long                   FILE_SIZE;                              /* 読み書き時のサイズ用の型定義 */
 typedef unsigned long  FILE_TIME;                              /* 読み書き時のサイズ用の時刻型定義 */
 
+struct c_drvobj;
+struct c_volobj;
 
-/* ボリューム情報 */
-typedef struct t_file_volinf
-{
-       char            szName[FILE_MAX_NAME];
-       HANDLE          hVolume;
-} T_FILE_VOLINF;
 
 
 /* ファイル情報 */
@@ -123,18 +130,18 @@ extern "C" {
 #endif
 
 /* システム */
-void      File_Initialize(void);                                                               /* ファイルシステムの初期化 */
-
-FILE_ERR  File_AddVolume(const T_FILE_VOLINF *pVolInf);                        /* ボリュームのマウント */
-FILE_ERR  File_RemoveVolume(const T_FILE_VOLINF *pVolInf);             /* ボリュームのアンマウント */
+void      File_Initialize(void);                                                                                       /* ファイルシステムの初期化 */
 
 FILE_ERR  File_AddDevice(const char *pszName, struct c_drvobj *pDrvObj);       /* デバイスドライバの登録 */
 FILE_ERR  File_RemoveDevice(const char *pszName);                                                      /* デバイスドライバの削除 */
 
+FILE_ERR  File_AddVolume(const char *pszName, struct c_volobj *pVolObj);       /* ボリュームのマウント */
+FILE_ERR  File_RemoveVolume(const char *pszName);                                                      /* ボリュームのアンマウント */
+
 
 /* 基本API */
 HANDLE    File_Open(const char *pszPatah, int iMode);
-#define   File_Close(hFile)            Handle_Close(hFile)
+void      File_Close(HANDLE hFile);
 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);
@@ -163,7 +170,11 @@ int       File_PrintFormat(HANDLE hFile, const char *pszFormat, ...);
 int       File_PrintHexNibble(HANDLE hFile, unsigned char c);          /* 4bitの16進数を出力 */
 
 int       File_PrintFormatDecimal(HANDLE hFile, long lNum, int iWidth, int iPadChar);          /* 書式付き10進数出力 */
-int       File_PrintFormatVL(HANDLE hFile, const char *pszFormat, va_list argptr);             /* 書式付き出力軽量版 */
+int       File_PrintFormatVL(HANDLE hFile, const char *pszFormat, va_list argptr);                     /* 書式付き出力軽量版 */
+
+
+/* ディレクトリ読み出し */
+FILE_ERR  File_ReadDir(HANDLE hFile, T_FILE_FILEINF *pFileInf);
 
 
 /* 拡張操作 */
@@ -178,7 +189,7 @@ FILE_ERR  File_CanWriteBuf(HANDLE hFile, void *pBuf);
 
 /* ディレクトリ操作 */
 HANDLE    File_OpenDir(const char *pszName);                                           /* ディレクトリを開く */
-FILE_ERR  File_FindNext(HANDLE hDir, T_FILE_FILEINF *pFileInf);                /* ディレクトリからファイルを検索 */
+FILE_ERR  File_ReadDir(HANDLE hDir, T_FILE_FILEINF *pFileInf);         /* ディレクトリからファイルを検索 */
 HANDLE    File_MakeDir(const char *pszName);                                           /* サブディレクトリを作成 */
 HANDLE    File_Remove(const char *pszName);                                                    /* ファイルを削除 */
 
index f57d138..72cb833 100755 (executable)
@@ -10,7 +10,7 @@
 
 
 #include "file_local.h"
-#include "volume/dev/devvol.h"
+#include "sysvol.h"
 
 
 /* デバイスファイルの追加 */
@@ -20,7 +20,7 @@ FILE_ERR File_AddDevice(const char *pszName, C_DRVOBJ *pDrvObj)
        
        self = &g_File; 
        
-       return DevVol_AddDevice(self->hDevVol, pszName, pDrvObj);
+       return SysVol_AddDevice(&self->DevVol, pszName, pDrvObj, FILE_ATTR_DEVICE);
 }
 
 
index 4e7bb9a..53369fc 100755 (executable)
 #include "file_local.h"
 
 
-/* ã\83\87ã\83\90ã\82¤ã\82¹ã\83\95ã\82¡ã\82¤ã\83«の追加 */
-FILE_ERR File_AddVolume(const T_FILE_VOLINF *pVolInf)
+/* ã\83\9cã\83ªã\83¥ã\83¼ã\83 ã\83\87ã\83\90ã\82¤ã\82¹の追加 */
+FILE_ERR File_AddVolume(const char *pszName, struct c_volobj *pVolObj)
 {
-       C_FILE *self;
-       int i;
-
-       self = &g_File; 
-
-       /* テーブルの空きを検索 */
-       for ( i = 0; i < FILE_MAX_VOLUME; i++ )
-       {
-               if ( self->VolumeTable[i].hVolume == HANDLE_NULL )
-               {
-                       self->VolumeTable[i] = *pVolInf;
-                       return FILE_ERR_OK;
-               }
-       }
+       
        
        return FILE_ERR_NG;
 }
diff --git a/aplfw/system/file/file_close.c b/aplfw/system/file/file_close.c
new file mode 100755 (executable)
index 0000000..41a575b
--- /dev/null
@@ -0,0 +1,28 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  file.c
+ * @brief %jp{ファイルシステム}
+ *
+ * Copyright (C) 2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include <stdio.h>
+#include "file_local.h"
+#include "fileobj.h"
+
+
+void File_Close(HANDLE hFile)
+{
+       C_FILEOBJ *self;
+       
+       self = FILE_HANDLE2OBJ(hFile);
+
+       DrvObj_vClose(self->pDrvObj, self);
+}
+
+
+
+/* end of file */
index 279ae5b..1f251b6 100755 (executable)
@@ -19,15 +19,19 @@ C_DEVVOL g_DevVol;
 
 void File_Initialize(void)
 {
-       const static T_FILE_VOLINF VolInf = {"dev", (HANDLE)&g_DevVol};
-
        C_FILE *self;
 
        self = &g_File;
-
-       DevVol_Create(&g_DevVol);       
-       File_AddVolume(&VolInf);
-
-       self->hDevVol = (HANDLE)&g_DevVol;      
+       
+       /* ルートボリューム生成 */
+       SysVol_Create(&self->RootVol);
+       
+       /* デバイスボリューム生成 */
+       SysVol_Create(&self->DevVol);
+       
+       /* ルートディレクトリの下に /dev ディレクトリを登録 */
+       SysVol_AddDevice(&self->RootVol, "dev", (C_DRVOBJ *)&self->DevVol, FILE_ATTR_DIR);
 }
 
+
+/* end of file */
index 72ad5a8..a335c08 100755 (executable)
@@ -19,7 +19,7 @@ FILE_ERR File_IoControl(HANDLE hFile, int iFunc, void *pInBuf, FILE_SIZE InSize,
 
        self = FILE_HANDLE2OBJ(hFile);
 
-       return DrvObj_IoControl(self->pDrvObj, self, iFunc, pInBuf, InSize, pOutBuf, OutSize);
+       return DrvObj_vIoControl(self->pDrvObj, self, iFunc, pInBuf, InSize, pOutBuf, OutSize);
 }
 
 
index ea5b6eb..8ef8c2c 100755 (executable)
 
 
 #include "file.h"
-
-#define FILE_MAX_VOLUME                16
-
+#include "sysvol.h"
 
 
 typedef struct c_file
 {
-       T_FILE_VOLINF VolumeTable[FILE_MAX_VOLUME];
-       HANDLE        hDevVol;
+       C_SYSVOL        RootVol;                /* ルートボリューム(ルートディレクトリ) */
+       C_SYSVOL        DevVol;                 /* デバイスボリューム(/dev ディレクトリ) */
 } C_FILE;
 
 extern C_FILE  g_File;
index aada22c..aa512c9 100755 (executable)
@@ -4,7 +4,7 @@
  * @file  file.c
  * @brief %jp{ファイルシステム}
  *
- * Copyright (C) 2006 by Project HOS
+ * Copyright (C) 2006-2007 by Project HOS
  * http://sourceforge.jp/projects/hos/
  */
 
 HANDLE File_Open(const char *pszPatah, int iMode)
 {
        C_FILE *self;
-       int    iNameLen;
-       int    i;
        
        self = &g_File;
        
        if ( *pszPatah == '/' )         /* 絶対パス */
        {
-
                pszPatah++;
        }
        else    /* 相対パスの処理(そのうち追加) */
        {
+               
        }
        
-       
-       /* ボリュームを検索 */
-       for ( i = 0; i < FILE_MAX_VOLUME; i++ )
-       {
-               iNameLen = strlen(self->VolumeTable[i].szName);
-               if ( strncmp(pszPatah, self->VolumeTable[i].szName, iNameLen) == 0 )
-               {
-                       pszPatah += iNameLen;
-                       return Volume_OpenFile(self->VolumeTable[i].hVolume, pszPatah, iMode);
-               }
-       }
-       
-       return HANDLE_NULL;
+       /* ルートディレクトリからオープンを掛ける */
+       return DrvObj_vOpen((C_DRVOBJ *)&self->RootVol, pszPatah, iMode);
 }
index c2e6a2a..b561179 100755 (executable)
@@ -21,7 +21,7 @@ FILE_SIZE File_Read(HANDLE hFile, void *pBuf, FILE_SIZE Size)
 
        self = FILE_HANDLE2OBJ(hFile);
        
-       return DrvObj_Read(self->pDrvObj, self, pBuf, Size);
+       return DrvObj_vRead(self->pDrvObj, self, pBuf, Size);
 }
 
 
diff --git a/aplfw/system/file/file_readdir.c b/aplfw/system/file/file_readdir.c
new file mode 100755 (executable)
index 0000000..eb4381e
--- /dev/null
@@ -0,0 +1,21 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  file.c
+ * @brief %jp{ファイルシステム}
+ *
+ * Copyright (C) 2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "file_local.h"
+
+
+FILE_ERR File_ReadDir(HANDLE hFile, T_FILE_FILEINF *pFileInf)
+{
+       return File_IoControl(hFile, FILE_IOCTL_DIR_READ, pFileInf, sizeof(T_FILE_FILEINF), NULL, 0);
+}
+
+
+/* end of file */
index e22f0af..192172c 100755 (executable)
@@ -20,7 +20,7 @@ FILE_POS File_Seek(HANDLE hFile, FILE_POS Offset, int iOrign)
        
        self = FILE_HANDLE2OBJ(hFile);
 
-       return DrvObj_Seek(self->pDrvObj, self, Offset, iOrign);
+       return DrvObj_vSeek(self->pDrvObj, self, Offset, iOrign);
 }
 
 
index e940672..f73f7d4 100755 (executable)
@@ -20,7 +20,7 @@ FILE_SIZE File_Write(HANDLE hFile, const void *pData, FILE_SIZE Size)
 
        self = FILE_HANDLE2OBJ(hFile);
        
-       return DrvObj_Write(self->pDrvObj, self, pData, Size);
+       return DrvObj_vWrite(self->pDrvObj, self, pData, Size);
 }
 
 
index a5316e9..46deb38 100755 (executable)
@@ -6,7 +6,7 @@
  *
  * %jp{ファイルディスクリプタとして機能するクラス}
  *
- * Copyright (C) 2006 by Project HOS
+ * Copyright (C) 2006-2007 by Project HOS
  * http://sourceforge.jp/projects/hos/
  */
 
@@ -31,7 +31,7 @@ typedef struct t_fileobj_methods
 typedef struct c_fileobj
 {
        C_HANDLEOBJ             HandleObj;                              /* ハンドルオブジェクトを継承 */
-       struct c_drvobj *pDrvObj;                               /* ã\83\87ã\83\90ã\82¤ã\82¹ã\83\89ã\83©ã\82¤ã\83\90ã\81¸ã\81®å\8f\82ç\85§ */
+       struct c_drvobj *pDrvObj;                               /* ドライバへの参照 */
 } C_FILEOBJ;
 
 
index b6130db..6be28e0 100755 (executable)
@@ -14,7 +14,7 @@
 
 static const T_FILEOBJ_METHODS FileObj_FileObjMethods =
        {
-               {FileObj_Delete},       /* デストラクタ */
+               {File_Close},   /* デストラクタ */
        };
 
 
index 4b910f8..36e238a 100755 (executable)
@@ -17,8 +17,7 @@ void FileObj_Delete(HANDLE hFile)
        
        self = (C_FILEOBJ *)hFile;
 
-       /* クローズ処理 */
-       DrvObj_Close(self->pDrvObj, self);
+       HandleObj_Delete(&self->HandleObj);
 }
 
 
diff --git a/aplfw/system/file/sysvol.h b/aplfw/system/file/sysvol.h
new file mode 100755 (executable)
index 0000000..fb9cc7d
--- /dev/null
@@ -0,0 +1,61 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  sysvol.h
+ * @brief %jp{システムボリューム}
+ *
+ *  %jp{ルートディレクトリや /dev ディレクトリなど、システム上の仮想ボリュームを管理}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#ifndef __HOS__sysvol_h__
+#define __HOS__sysvol_h__
+
+
+#include "system/file/file.h"
+#include "system/file/volumeobj.h"
+
+
+#define DEVVOL_MAX_DEVICE              16
+
+
+/* デバイス情報 */
+struct c_drvobj;
+typedef struct t_sysvol_devinf
+{
+       char                    szName[FILE_MAX_NAME];                  /* デバイス名 */
+       struct c_drvobj *pDrvObj;                                               /* デバイスドライバへの参照 */
+       int                             iAttr;                                                  /* デバイスの属性 */
+} T_SYSVOL_DEVINF;
+
+
+/* システムボリュームクラス */
+typedef struct c_sysvol
+{
+       C_VOLUMEOBJ             VolumeObj;              /* ボリュームオブジェクトを継承 */
+       
+       T_SYSVOL_DEVINF DevTable[DEVVOL_MAX_DEVICE];
+} C_SYSVOL;
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void     SysVol_Create(C_SYSVOL *self);
+void     SysVol_Delete(C_DRVOBJ *self);
+
+FILE_ERR SysVol_AddDevice(C_SYSVOL *self, const char *pszName, struct c_drvobj *pDrvObj, int iAttr);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __HOS__sysvol_h__ */
+
+
+
+/* end of file */
diff --git a/aplfw/system/file/sysvol_adddevice.c b/aplfw/system/file/sysvol_adddevice.c
new file mode 100755 (executable)
index 0000000..e3b8c75
--- /dev/null
@@ -0,0 +1,36 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  sysvol.h
+ * @brief %jp{システムボリューム}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+#include <string.h>
+#include "sysvol_local.h"
+
+
+/* システムボリュームにデバイスをぶら下げる */
+FILE_ERR SysVol_AddDevice(C_SYSVOL *self, const char *pszName, struct c_drvobj *pDrvObj, int iAttr)
+{
+       int i;
+       
+       /* テーブルの空きを検索 */
+       for ( i = 0; i < DEVVOL_MAX_DEVICE; i++ )
+       {
+               if ( self->DevTable[i].pDrvObj == NULL )
+               {
+                       strcpy(self->DevTable[i].szName, pszName);
+                       self->DevTable[i].pDrvObj = pDrvObj;
+                       self->DevTable[i].iAttr   = iAttr;
+                       return FILE_ERR_OK;
+               }
+       }
+       
+       return FILE_ERR_NG;     
+}
+
+
+/* end of file */
diff --git a/aplfw/system/file/sysvol_close.c b/aplfw/system/file/sysvol_close.c
new file mode 100755 (executable)
index 0000000..635ff98
--- /dev/null
@@ -0,0 +1,33 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  sysvol.h
+ * @brief %jp{システムボリューム}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "sysvol_local.h"
+#include "system/sysapi/sysapi.h"
+
+
+void SysVol_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
+{
+       C_SYSVOL    *self;
+       C_SYSVOLDIR *pDir;
+       
+       /* upper cast */
+       self = (C_SYSVOL *)pDrvObj;
+       pDir = (C_SYSVOLDIR *)pFileObj;
+       
+       /* 削除 */
+       FileObj_Delete(&pDir->FileObj);
+       SysMem_Free(pDir);
+}
+
+
+/* end of file */
+
diff --git a/aplfw/system/file/sysvol_create.c b/aplfw/system/file/sysvol_create.c
new file mode 100755 (executable)
index 0000000..60854be
--- /dev/null
@@ -0,0 +1,48 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  sysvol.h
+ * @brief %jp{システムボリューム}
+ *
+ *  %jp{ルートディレクトリや /dev ディレクトリなど、システム上の仮想ボリュームを管理}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+#include <stdio.h>
+#include "sysvol_local.h"
+
+
+const T_VOLUMEOBJ_METHODS SysVol_VolumeObjMethods =
+{
+       {
+               SysVol_Delete,
+               SysVol_Open,
+               SysVol_Close,
+               SysVol_IoControl,
+               DrvObj_Seek,
+               DrvObj_Read,
+               DrvObj_Write,
+               DrvObj_Flush,
+       },
+       VolumeObj_MakeDir,
+       VolumeObj_Remove,
+};
+
+
+void SysVol_Create(C_SYSVOL *self)
+{
+       int i;
+       
+       /* 親クラスコンストラクタ呼び出し */
+       VolumeObj_Create(&self->VolumeObj, &SysVol_VolumeObjMethods);   
+       
+       /* 初期化 */
+       for ( i = 0; i < DEVVOL_MAX_DEVICE; i++ )
+       {
+               self->DevTable[i].pDrvObj = NULL;
+       }
+}
+
+
diff --git a/aplfw/system/file/sysvol_delete.c b/aplfw/system/file/sysvol_delete.c
new file mode 100755 (executable)
index 0000000..7c0155e
--- /dev/null
@@ -0,0 +1,8 @@
+
+#include "sysvol_local.h"
+
+
+void SysVol_Delete(C_DRVOBJ *self)
+{
+}
+
diff --git a/aplfw/system/file/sysvol_iocontrol.c b/aplfw/system/file/sysvol_iocontrol.c
new file mode 100755 (executable)
index 0000000..84ad84b
--- /dev/null
@@ -0,0 +1,54 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  sysvol.h
+ * @brief %jp{システムボリューム}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "sysvol_local.h"
+#include "system/sysapi/sysapi.h"
+
+
+
+FILE_ERR SysVol_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize)
+{
+       C_SYSVOL    *self;
+       C_SYSVOLDIR *pDir;
+       
+       /* upper cast */
+       self = (C_SYSVOL *)pDrvObj;
+       pDir = (C_SYSVOLDIR *)pFileObj;
+       
+       switch ( iFunc )
+       {
+       case FILE_IOCTL_DIR_READ:
+               {
+                       T_FILE_FILEINF *pFileInf;
+                       
+                       pFileInf = (T_FILE_FILEINF *)pInBuf;
+                       
+                       if ( self->DevTable[pDir->iReadPtr].pDrvObj != NULL )
+                       {
+                               strcpy(pFileInf->szFileName, self->DevTable[pDir->iReadPtr].szName);
+                               pFileInf->FileSize  = 0;
+                               pFileInf->Attribute = self->DevTable[pDir->iReadPtr].iAttr;
+                               pDir->iReadPtr++;
+                               return FILE_ERR_OK;
+                       }
+               }
+               break;
+       }
+
+       return FILE_ERR_NG;
+}
+
+
+
+
+/* end of file */
+
diff --git a/aplfw/system/file/sysvol_local.h b/aplfw/system/file/sysvol_local.h
new file mode 100755 (executable)
index 0000000..daa105b
--- /dev/null
@@ -0,0 +1,33 @@
+
+#ifndef __HOS__sysvol_local_h__
+#define __HOS__sysvol_local_h__
+
+
+#include "sysvol.h"
+#include "system/file/fileobj.h"
+
+
+/* システムボリュームのディレクトリファイル */
+typedef struct c_sysvoldir
+{
+       C_FILEOBJ       FileObj;                        /* ディレクトリオブジェクトを継承 */
+       
+       int                     iReadPtr;               /* リードポインタ */
+} C_SYSVOLDIR;
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+HANDLE    SysVol_Open(struct c_drvobj *self, const char *pszPath, int iMode);          /* ファイルを開く */
+void      SysVol_Close(struct c_drvobj *self, struct c_fileobj *pFileObj);
+FILE_ERR  SysVol_IoControl(struct c_drvobj *self, struct c_fileobj *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
diff --git a/aplfw/system/file/sysvol_open.c b/aplfw/system/file/sysvol_open.c
new file mode 100755 (executable)
index 0000000..64e2eac
--- /dev/null
@@ -0,0 +1,78 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  sysvol.h
+ * @brief %jp{システムボリューム}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include <stdio.h>
+#include <string.h>
+#include "sysvol_local.h"
+#include "system/sysapi/sysapi.h"
+#include "system/file/drvobj.h"
+
+
+/* ファイルを開く */
+HANDLE SysVol_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
+{
+       C_SYSVOL        *self;
+       int                     iLen;
+       int                     i;
+       
+       /* upper cast */
+       self = (C_SYSVOL *)pDrvObj;
+       
+       /* 自分自身のディレクトリを開くなら */
+       if ( *pszPath == '\0' )
+       {
+               C_SYSVOLDIR *pDir;
+
+               /* モードチェック */
+               if ( !(iMode & (FILE_OPEN_DIR | FILE_OPEN_READ)) )
+               {
+                       return HANDLE_NULL;
+               }
+               
+               /* ディスクリプタ生成 */
+               if ( (pDir = (C_SYSVOLDIR *)SysMem_Alloc(sizeof(C_SYSVOLDIR))) == NULL )
+               {
+                       return HANDLE_NULL;
+               }
+               FileObj_Create(&pDir->FileObj, (C_DRVOBJ *)self, NULL);
+               pDir->iReadPtr = 0;
+               
+               return (HANDLE)pDir;
+       }
+       
+       /* 下位デバイスを検索 */
+       for ( i = 0; i < DEVVOL_MAX_DEVICE; i++ )
+       {
+               /* 名前部分探索 */
+               for ( iLen =0; pszPath[iLen] != '\0' && pszPath[iLen] != '/'; iLen++ )
+                       ;
+               
+               if ( strncmp(pszPath, self->DevTable[i].szName, iLen) == 0 )
+               {
+                       break;
+               }
+       }
+       if ( i >= DEVVOL_MAX_DEVICE )
+       {
+               return HANDLE_NULL;
+       }
+       
+       if ( pszPath[iLen] == '/' )
+       {
+               iLen++;
+       }
+       
+       return DrvObj_vOpen(self->DevTable[i].pDrvObj, &pszPath[iLen], iMode);
+}
+
+
+/* end of file */
+
index 2ee85a4..47063b9 100755 (executable)
@@ -1,8 +1,8 @@
 /** 
  *  Hyper Operating System  Application Framework
  *
- * @file  driveobj.h
- * @brief %jp{ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88}
+ * @file  volumeobj.h
+ * @brief %jp{ã\83\9cã\83ªã\83¥ã\83¼ã\83 ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88å\9fºæ\9c¬ã\82¯ã\83©ã\82¹}
  *
  * Copyright (C) 2006 by Project HOS
  * http://sourceforge.jp/projects/hos/
 
 
 #include "system/handle/handleobj.h"
-#include "file.h"
+#include "system/file/drvobj.h"
 
 
 /* ボリューム操作オブジェクトクラス基本メソッドテーブル */
+struct c_volumeobj;
 typedef struct t_volumeobj_methods
 {
-       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);                                    /* ファイルを削除 */
+       T_DRVOBJ_METHODS        DrvObjMethods;                  /* DrvObjを継承 */
+
+       FILE_ERR (*pfncMakeDir)(struct c_volumeobj *self, const char *pszPath);         /* サブディレクトリを作成 */
+       FILE_ERR (*pfncRemove)(struct c_volumeobj *self, const char *pszPath);          /* ファイルを削除 */
 } T_VOLUMEOBJ_METHODS;
 
 typedef struct c_volumeobj
 {
-       const T_VOLUMEOBJ_METHODS *pMethods;
+       C_DRVOBJ        DrvObj;                                                 /* DrvObjを継承 */
 } C_VOLUMEOBJ;
 
 
@@ -39,16 +41,18 @@ typedef struct c_volumeobj
 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);            /**< コンストラクタ */
+void     VolumeObj_Delete(C_VOLUMEOBJ *self);                                                                                                  /**< デストラクタ */
 
+FILE_ERR VolumeObj_MakeDir(C_VOLUMEOBJ *self, const char *pszPath);                            /* サブディレクトリを作成 */
+FILE_ERR VolumeObj_Remove(C_VOLUMEOBJ *self, const char *pszPath);                             /* ファイルを削除 */
 
 #ifdef __cplusplus
 }
 #endif
 
+#define VolumeObj_GetMethods(self)             ((T_VOLUMEOBJ_METHODS *)HandleObj_GetMethods(&(self)->DrvObjMethods))
+
 
 
 #endif /* __HOS__volumeobj_h__ */
index 3bb6f06..61c438a 100755 (executable)
@@ -1,10 +1,22 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  volumeobj.h
+ * @brief %jp{ボリュームオブジェクト基本クラス}
+ *
+ * Copyright (C) 2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
 
 #include "volumeobj.h"
 
 
 void VolumeObj_Create(C_VOLUMEOBJ *self, const T_VOLUMEOBJ_METHODS *pVolumeObjMethods)
 {
-       self->pMethods = pVolumeObjMethods;
+       /* 親クラスコンストラクタ */
+       DrvObj_Create(&self->DrvObj, &pVolumeObjMethods->DrvObjMethods);
 }
 
 
+/* end of file */
diff --git a/aplfw/system/file/volumeobj_makedir.c b/aplfw/system/file/volumeobj_makedir.c
new file mode 100755 (executable)
index 0000000..fab351c
--- /dev/null
@@ -0,0 +1,22 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  volumeobj.h
+ * @brief %jp{ボリュームオブジェクト基本クラス}
+ *
+ * Copyright (C) 2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "volumeobj.h"
+
+
+/* サブディレクトリを作成 */
+FILE_ERR VolumeObj_MakeDir(C_VOLUMEOBJ *self, const char *pszPath)
+{
+       return FILE_ERR_NG;
+}
+
+
+/* end of file */
diff --git a/aplfw/system/file/volumeobj_remove.c b/aplfw/system/file/volumeobj_remove.c
new file mode 100755 (executable)
index 0000000..c509a0a
--- /dev/null
@@ -0,0 +1,22 @@
+/** 
+ *  Hyper Operating System  Application Framework
+ *
+ * @file  volumeobj.h
+ * @brief %jp{ボリュームオブジェクト基本クラス}
+ *
+ * Copyright (C) 2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "volumeobj.h"
+
+
+/* ファイルを削除 */
+FILE_ERR VolumeObj_Remove(C_VOLUMEOBJ *self, const char *pszPath)
+{
+       return FILE_ERR_NG;
+}
+
+
+/* end of file */
index 8022540..6bbe76c 100755 (executable)
 /* ハンドルを閉じる */
 void Handle_Close(HANDLE handle)
 {
+       C_HANDLEOBJ *pHandleObj;
+       
+       /* 有効チェック */
        if ( handle == HANDLE_NULL )
        {
                return;
        }
-
-       /* デストラクタ呼び出し */
-       HandleObj_Delete((C_HANDLEOBJ *)handle);
        
-       /* メモリ開放 */
-       SysMem_Free((void *)handle);
+       /* ハンドル変換 */
+       pHandleObj = (C_HANDLEOBJ *)handle;
+
+       /* クローズ処理 */
+       if ( pHandleObj->pMethods->pfncClose != NULL )
+       {
+               pHandleObj->pMethods->pfncClose(handle);
+       }
 }
 
 
index 3c835d7..8078e3f 100755 (executable)
@@ -19,7 +19,7 @@
 /* ハンドルオブジェクトクラスのメソッドテーブル定義 */
 typedef struct t_handleobj_methods
 {
-       void (*pfncDelete)(HANDLE handle);              /* デストラクタ */
+       void (*pfncClose)(HANDLE handle);               /* 閉じる */
 } T_HANDLEOBJ_METHODS;
 
 
@@ -36,9 +36,6 @@ extern "C" {
 
 void    HandleObj_Create(C_HANDLEOBJ *self, const T_HANDLEOBJ_METHODS *pMethods);      /* コンストラクタ */
 void    HandleObj_Delete(C_HANDLEOBJ *self);                                                                           /* デストラクタ */
-#define HandleObj_GetMethods(self)             ((self)->pMethods)
-
-void Handle_Close(HANDLE handle);                      /* ハンドルを閉じる */
 
 #ifdef __cplusplus
 }
index 65ab9d8..0b6704b 100755 (executable)
 /* コンストラクタ */
 void HandleObj_Create(C_HANDLEOBJ *self, const T_HANDLEOBJ_METHODS *pMethods)
 {
+       /* 仮想関数テーブルの登録 */
        self->pMethods = pMethods;
+
+       /* プロセスに紐付け(予定) */
 }
 
 
index 3227979..68b51fe 100755 (executable)
 /* デストラクタ */
 void HandleObj_Delete(C_HANDLEOBJ *self)
 {
-       /* デストラクタが登録されていれば呼ぶ */
-       if ( self->pMethods->pfncDelete != NULL )
-       {
-               self->pMethods->pfncDelete((HANDLE)self);
-       }
+       /* プロセスの紐付け解除(予定) */
 }
 
 
index 87896be..5ce8cdc 100755 (executable)
 /* プロセスオブジェクト基本クラス定義 */
 typedef struct c_processobj
 {
-       C_HANDLEOBJ    HandleObj;                                       /* ハンドルオブジェクトを継承(そのうちC_FILEOBJからの継承に拡張してもいいかも?) */
-       SYSPRC_HANDLE  hSysPrc;
-
-       int            (*pfncEntry)(VPARAM pParam);     /* エントリーアドレス */
-       VPARAM         Param;                                           /* 起動パラメータ */
+       C_HANDLEOBJ             HandleObj;                                              /* ハンドルオブジェクトを継承 */
+       SYSPRC_HANDLE   hSysPrc;
+       
+       int                             (*pfncEntry)(VPARAM pParam);    /* エントリーアドレス */
+       VPARAM                  Param;                                                  /* 起動パラメータ */
        
-       T_PROCESS_INF  Info;
+       T_PROCESS_INF   Info;
 
-       int         iExitCode;                                          /* 終了コード */
+       int                             iExitCode;                                              /* 終了コード */
 
 #if 0  /* まあ、そのうちやりたいなっと */
-       HANDLE          *pHandleList;                                   /* 所有するハンドルのリスト(終了時に開放) */
-       char            szCurrentDir[FILE_MAX_PATH];    /* カレントディレクトリ */
+       HANDLE                  *pHandleList;                                   /* 所有するハンドルのリスト(終了時に開放) */
+       char                    szCurrentDir[FILE_MAX_PATH];    /* カレントディレクトリ */
 #endif
 } C_PROCESSOBJ;
 
index da81334..1347c20 100755 (executable)
@@ -5,7 +5,11 @@
 
 const T_VOLUMEOBJ_METHODS DevVol_VolumeObjMethods =
 {
-       DevVol_OpenFile,
+       {
+               DevVol_Delete,
+               DevVol_OpenFile,
+               
+       },
        NULL,
        NULL,
 };
index 0931f6a..ae59401 100755 (executable)
@@ -30,7 +30,7 @@ HANDLE DevVol_OpenFile(HANDLE hVolume, const char *pszPath, int iMode)
                return HANDLE_NULL;
        }
        
-       return DrvObj_Open(self->DevTable[i].pDrvObj, pszPath, iMode);
+       return DrvObj_vOpen(self->DevTable[i].pDrvObj, pszPath, iMode);
 }
 
 
index 8ef282e..aa153fa 100755 (executable)
@@ -61,7 +61,7 @@ CFLAGS_OPT_SPEED = -OP=1
 AFLAGS += -NOLOGO
 
 # %jp{インクルードパスオプションの定義}
-AFLAGS_INC = -I=$(subst $(space),$(comma),$(strip $(A_INC)))
+AFLAGS_INC =
 
 # %jp{マクロ定義オプションの定義}
 AFLAGS_DEF =