From 14c2d107e5b1202baf43be60612d67f2e6525ee4 Mon Sep 17 00:00:00 2001 From: ryuz Date: Sun, 20 May 2007 17:03:27 +0000 Subject: [PATCH] (none) --- aplfw/application/example/hello/hello.c | 1 + aplfw/application/filecmd/filelist/filelist.h | 31 +++++ aplfw/application/filecmd/filelist/filelist_main.c | 45 +++++++ aplfw/application/netcmd/ethersnoop/ethersnoop.h | 31 +++++ .../netcmd/ethersnoop/ethersnoop_main.c | 57 +++++++++ aplfw/build/common/gmake/aplfwsrc.inc | 67 +++++----- aplfw/driver/ether/lan9000/lan9000drv.h | 52 ++++++++ aplfw/driver/ether/lan9000/lan9000drv_close.c | 38 ++++++ aplfw/driver/ether/lan9000/lan9000drv_create.c | 54 ++++++++ aplfw/driver/ether/lan9000/lan9000drv_delete.c | 33 +++++ aplfw/driver/ether/lan9000/lan9000drv_flush.c | 28 +++++ aplfw/driver/ether/lan9000/lan9000drv_iocontrol.c | 28 +++++ aplfw/driver/ether/lan9000/lan9000drv_isr.c | 48 +++++++ aplfw/driver/ether/lan9000/lan9000drv_local.h | 42 +++++++ aplfw/driver/ether/lan9000/lan9000drv_open.c | 44 +++++++ aplfw/driver/ether/lan9000/lan9000drv_read.c | 55 ++++++++ aplfw/driver/ether/lan9000/lan9000drv_seek.c | 28 +++++ aplfw/driver/ether/lan9000/lan9000drv_write.c | 55 ++++++++ aplfw/driver/ether/lan9000/lan9000hal.h | 66 ++++++++++ aplfw/driver/ether/lan9000/lan9000hal_create.c | 31 +++++ aplfw/driver/ether/lan9000/lan9000hal_delete.c | 22 ++++ .../ether/lan9000/lan9000hal_enableinterrupt.c | 24 ++++ .../ether/lan9000/lan9000hal_getinterruptstatus.c | 35 ++++++ .../ether/lan9000/lan9000hal_getphysicaladdr.c | 37 ++++++ aplfw/driver/ether/lan9000/lan9000hal_local.h | 82 ++++++++++++ aplfw/driver/ether/lan9000/lan9000hal_mii.c | 67 ++++++++++ aplfw/driver/ether/lan9000/lan9000hal_phyregread.c | 100 +++++++++++++++ .../driver/ether/lan9000/lan9000hal_phyregwrite.c | 96 ++++++++++++++ aplfw/driver/ether/lan9000/lan9000hal_recv.c | 71 +++++++++++ aplfw/driver/ether/lan9000/lan9000hal_send.c | 74 +++++++++++ .../ether/lan9000/lan9000hal_setinterruptmask.c | 32 +++++ aplfw/driver/ether/lan9000/lan9000hal_setup.c | 78 ++++++++++++ aplfw/driver/ether/lan9000/lan9000hal_stop.c | 23 ++++ aplfw/driver/ether/ne2000/ne2000drv.c | 110 +++++++++++++--- aplfw/driver/ether/ne2000/ne2000drv.h | 23 ++-- aplfw/driver/ether/ne2000/ne2000drv_local.h | 40 ++++++ aplfw/driver/misc/memdrv/memdrv.h | 51 ++++++++ aplfw/driver/misc/memdrv/memdrv_close.c | 37 ++++++ aplfw/driver/misc/memdrv/memdrv_create.c | 49 ++++++++ aplfw/driver/misc/memdrv/memdrv_delete.c | 29 +++++ aplfw/driver/misc/memdrv/memdrv_flush.c | 21 ++++ aplfw/driver/misc/memdrv/memdrv_iocontrol.c | 29 +++++ aplfw/driver/misc/memdrv/memdrv_local.h | 48 +++++++ aplfw/driver/misc/memdrv/memdrv_open.c | 43 +++++++ aplfw/driver/misc/memdrv/memdrv_read.c | 44 +++++++ aplfw/driver/misc/memdrv/memdrv_seek.c | 57 +++++++++ aplfw/driver/misc/memdrv/memdrv_write.c | 46 +++++++ aplfw/driver/serial/pc16550/pc16550drv.h | 1 + aplfw/driver/serial/pc16550/pc16550drv_close.c | 9 +- aplfw/driver/serial/pc16550/pc16550drv_local.h | 3 +- aplfw/driver/volume/fat/fatvol.h | 74 +++++++++++ aplfw/driver/volume/fat/fatvol_clusterread.c | 53 ++++++++ aplfw/driver/volume/fat/fatvol_clusterwrite.c | 54 ++++++++ aplfw/driver/volume/fat/fatvol_create.c | 140 +++++++++++++++++++++ aplfw/driver/volume/fat/fatvol_createfile.c | 28 +++++ aplfw/driver/volume/fat/fatvol_flushfat.c | 36 ++++++ aplfw/driver/volume/fat/fatvol_getclusterbuf.c | 67 ++++++++++ aplfw/driver/volume/fat/fatvol_getnextcluster.c | 64 ++++++++++ aplfw/driver/volume/fat/fatvol_local.h | 55 ++++++++ aplfw/driver/volume/fat/fatvol_open.c | 132 +++++++++++++++++++ aplfw/driver/volume/fat/fatvol_relclusterbuf.c | 23 ++++ aplfw/driver/volume/fat/fatvol_setnextcluster.c | 50 ++++++++ aplfw/sample/arm/ez_arm7/sample.c | 10 +- aplfw/sample/sh/cq7144a/sample.c | 12 +- aplfw/system/file/chrdrv.h | 2 +- aplfw/system/file/chrdrv_delete.c | 25 ++++ aplfw/system/file/chrfile.h | 3 +- aplfw/system/file/drvobj.h | 32 +++-- aplfw/system/file/drvobj_close.c | 21 ++++ aplfw/system/file/drvobj_create.c | 12 ++ aplfw/system/file/drvobj_flush.c | 21 ++++ aplfw/system/file/drvobj_iocontrol.c | 21 ++++ aplfw/system/file/drvobj_open.c | 21 ++++ aplfw/system/file/drvobj_read.c | 21 ++++ aplfw/system/file/drvobj_seek.c | 21 ++++ aplfw/system/file/drvobj_write.c | 21 ++++ aplfw/system/file/file.h | 41 +++--- aplfw/system/file/file_adddevice.c | 4 +- aplfw/system/file/file_addvolume.c | 19 +-- aplfw/system/file/file_close.c | 28 +++++ aplfw/system/file/file_initialize.c | 18 +-- aplfw/system/file/file_iocontrol.c | 2 +- aplfw/system/file/file_local.h | 8 +- aplfw/system/file/file_open.c | 21 +--- aplfw/system/file/file_read.c | 2 +- aplfw/system/file/file_readdir.c | 21 ++++ aplfw/system/file/file_seek.c | 2 +- aplfw/system/file/file_write.c | 2 +- aplfw/system/file/fileobj.h | 4 +- aplfw/system/file/fileobj_create.c | 2 +- aplfw/system/file/fileobj_delete.c | 3 +- aplfw/system/file/sysvol.h | 61 +++++++++ aplfw/system/file/sysvol_adddevice.c | 36 ++++++ aplfw/system/file/sysvol_close.c | 33 +++++ aplfw/system/file/sysvol_create.c | 48 +++++++ aplfw/system/file/sysvol_delete.c | 8 ++ aplfw/system/file/sysvol_iocontrol.c | 54 ++++++++ aplfw/system/file/sysvol_local.h | 33 +++++ aplfw/system/file/sysvol_open.c | 78 ++++++++++++ aplfw/system/file/volumeobj.h | 26 ++-- aplfw/system/file/volumeobj_create.c | 14 ++- aplfw/system/file/volumeobj_makedir.c | 22 ++++ aplfw/system/file/volumeobj_remove.c | 22 ++++ aplfw/system/handle/handle_close.c | 16 ++- aplfw/system/handle/handleobj.h | 5 +- aplfw/system/handle/handleobj_create.c | 3 + aplfw/system/handle/handleobj_delete.c | 6 +- aplfw/system/process/procobj.h | 18 +-- aplfw/volume/dev/devvol_create.c | 6 +- aplfw/volume/dev/devvol_openfile.c | 2 +- kernel/build/common/gmake/shc_d.inc | 2 +- 111 files changed, 3699 insertions(+), 205 deletions(-) create mode 100755 aplfw/application/filecmd/filelist/filelist.h create mode 100755 aplfw/application/filecmd/filelist/filelist_main.c create mode 100755 aplfw/application/netcmd/ethersnoop/ethersnoop.h create mode 100755 aplfw/application/netcmd/ethersnoop/ethersnoop_main.c create mode 100755 aplfw/driver/ether/lan9000/lan9000drv.h create mode 100755 aplfw/driver/ether/lan9000/lan9000drv_close.c create mode 100755 aplfw/driver/ether/lan9000/lan9000drv_create.c create mode 100755 aplfw/driver/ether/lan9000/lan9000drv_delete.c create mode 100755 aplfw/driver/ether/lan9000/lan9000drv_flush.c create mode 100755 aplfw/driver/ether/lan9000/lan9000drv_iocontrol.c create mode 100755 aplfw/driver/ether/lan9000/lan9000drv_isr.c create mode 100755 aplfw/driver/ether/lan9000/lan9000drv_local.h create mode 100755 aplfw/driver/ether/lan9000/lan9000drv_open.c create mode 100755 aplfw/driver/ether/lan9000/lan9000drv_read.c create mode 100755 aplfw/driver/ether/lan9000/lan9000drv_seek.c create mode 100755 aplfw/driver/ether/lan9000/lan9000drv_write.c create mode 100755 aplfw/driver/ether/lan9000/lan9000hal.h create mode 100755 aplfw/driver/ether/lan9000/lan9000hal_create.c create mode 100755 aplfw/driver/ether/lan9000/lan9000hal_delete.c create mode 100755 aplfw/driver/ether/lan9000/lan9000hal_enableinterrupt.c create mode 100755 aplfw/driver/ether/lan9000/lan9000hal_getinterruptstatus.c create mode 100755 aplfw/driver/ether/lan9000/lan9000hal_getphysicaladdr.c create mode 100755 aplfw/driver/ether/lan9000/lan9000hal_local.h create mode 100755 aplfw/driver/ether/lan9000/lan9000hal_mii.c create mode 100755 aplfw/driver/ether/lan9000/lan9000hal_phyregread.c create mode 100755 aplfw/driver/ether/lan9000/lan9000hal_phyregwrite.c create mode 100755 aplfw/driver/ether/lan9000/lan9000hal_recv.c create mode 100755 aplfw/driver/ether/lan9000/lan9000hal_send.c create mode 100755 aplfw/driver/ether/lan9000/lan9000hal_setinterruptmask.c create mode 100755 aplfw/driver/ether/lan9000/lan9000hal_setup.c create mode 100755 aplfw/driver/ether/lan9000/lan9000hal_stop.c create mode 100755 aplfw/driver/ether/ne2000/ne2000drv_local.h create mode 100755 aplfw/driver/misc/memdrv/memdrv.h create mode 100755 aplfw/driver/misc/memdrv/memdrv_close.c create mode 100755 aplfw/driver/misc/memdrv/memdrv_create.c create mode 100755 aplfw/driver/misc/memdrv/memdrv_delete.c create mode 100755 aplfw/driver/misc/memdrv/memdrv_flush.c create mode 100755 aplfw/driver/misc/memdrv/memdrv_iocontrol.c create mode 100755 aplfw/driver/misc/memdrv/memdrv_local.h create mode 100755 aplfw/driver/misc/memdrv/memdrv_open.c create mode 100755 aplfw/driver/misc/memdrv/memdrv_read.c create mode 100755 aplfw/driver/misc/memdrv/memdrv_seek.c create mode 100755 aplfw/driver/misc/memdrv/memdrv_write.c create mode 100755 aplfw/driver/volume/fat/fatvol.h create mode 100755 aplfw/driver/volume/fat/fatvol_clusterread.c create mode 100755 aplfw/driver/volume/fat/fatvol_clusterwrite.c create mode 100755 aplfw/driver/volume/fat/fatvol_create.c create mode 100755 aplfw/driver/volume/fat/fatvol_createfile.c create mode 100755 aplfw/driver/volume/fat/fatvol_flushfat.c create mode 100755 aplfw/driver/volume/fat/fatvol_getclusterbuf.c create mode 100755 aplfw/driver/volume/fat/fatvol_getnextcluster.c create mode 100755 aplfw/driver/volume/fat/fatvol_local.h create mode 100755 aplfw/driver/volume/fat/fatvol_open.c create mode 100755 aplfw/driver/volume/fat/fatvol_relclusterbuf.c create mode 100755 aplfw/driver/volume/fat/fatvol_setnextcluster.c create mode 100755 aplfw/system/file/chrdrv_delete.c create mode 100755 aplfw/system/file/drvobj_close.c create mode 100755 aplfw/system/file/drvobj_flush.c create mode 100755 aplfw/system/file/drvobj_iocontrol.c create mode 100755 aplfw/system/file/drvobj_open.c create mode 100755 aplfw/system/file/drvobj_read.c create mode 100755 aplfw/system/file/drvobj_seek.c create mode 100755 aplfw/system/file/drvobj_write.c create mode 100755 aplfw/system/file/file_close.c create mode 100755 aplfw/system/file/file_readdir.c create mode 100755 aplfw/system/file/sysvol.h create mode 100755 aplfw/system/file/sysvol_adddevice.c create mode 100755 aplfw/system/file/sysvol_close.c create mode 100755 aplfw/system/file/sysvol_create.c create mode 100755 aplfw/system/file/sysvol_delete.c create mode 100755 aplfw/system/file/sysvol_iocontrol.c create mode 100755 aplfw/system/file/sysvol_local.h create mode 100755 aplfw/system/file/sysvol_open.c create mode 100755 aplfw/system/file/volumeobj_makedir.c create mode 100755 aplfw/system/file/volumeobj_remove.c diff --git a/aplfw/application/example/hello/hello.c b/aplfw/application/example/hello/hello.c index a0ab5af..f81e8db 100755 --- a/aplfw/application/example/hello/hello.c +++ b/aplfw/application/example/hello/hello.c @@ -1,3 +1,4 @@ +/* 磁七磁磁邪磁 */ #include #include "hosaplfw.h" diff --git a/aplfw/application/filecmd/filelist/filelist.h b/aplfw/application/filecmd/filelist/filelist.h new file mode 100755 index 0000000..4e91294 --- /dev/null +++ b/aplfw/application/filecmd/filelist/filelist.h @@ -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 index 0000000..4d957b9 --- /dev/null +++ b/aplfw/application/filecmd/filelist/filelist_main.c @@ -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 +#include +#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 index 0000000..8d69cd8 --- /dev/null +++ b/aplfw/application/netcmd/ethersnoop/ethersnoop.h @@ -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 index 0000000..f18cc29 --- /dev/null +++ b/aplfw/application/netcmd/ethersnoop/ethersnoop_main.c @@ -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 +#include +#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; +} + + diff --git a/aplfw/build/common/gmake/aplfwsrc.inc b/aplfw/build/common/gmake/aplfwsrc.inc index 0a71ea6..bf245d0 100755 --- a/aplfw/build/common/gmake/aplfwsrc.inc +++ b/aplfw/build/common/gmake/aplfwsrc.inc @@ -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 index 0000000..b47fac2 --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000drv.h @@ -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 index 0000000..f16255e --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000drv_close.c @@ -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 index 0000000..a63ab39 --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000drv_create.c @@ -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 index 0000000..f3f69db --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000drv_delete.c @@ -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 index 0000000..a0e42e8 --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000drv_flush.c @@ -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 index 0000000..a7603e0 --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000drv_iocontrol.c @@ -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 index 0000000..7a2ca78 --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000drv_isr.c @@ -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 index 0000000..14a8404 --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000drv_local.h @@ -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 index 0000000..61060c6 --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000drv_open.c @@ -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 index 0000000..013158a --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000drv_read.c @@ -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 index 0000000..239935d --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000drv_seek.c @@ -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 index 0000000..95e57a7 --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000drv_write.c @@ -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 index 0000000..79b2dc1 --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000hal.h @@ -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 index 0000000..54c5d92 --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000hal_create.c @@ -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 index 0000000..455c483 --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000hal_delete.c @@ -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 index 0000000..8727673 --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000hal_enableinterrupt.c @@ -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 index 0000000..b4da95c --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000hal_getinterruptstatus.c @@ -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 index 0000000..042a6b9 --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000hal_getphysicaladdr.c @@ -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 index 0000000..0dcaafc --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000hal_local.h @@ -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 index 0000000..bc93cda --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000hal_mii.c @@ -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 index 0000000..78b14cc --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000hal_phyregread.c @@ -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 index 0000000..34b3104 --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000hal_phyregwrite.c @@ -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 index 0000000..9b4d115 --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000hal_recv.c @@ -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 index 0000000..01c7335 --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000hal_send.c @@ -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 index 0000000..b12ef9d --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000hal_setinterruptmask.c @@ -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 index 0000000..143f73a --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000hal_setup.c @@ -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 index 0000000..509eb42 --- /dev/null +++ b/aplfw/driver/ether/lan9000/lan9000hal_stop.c @@ -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 */ diff --git a/aplfw/driver/ether/ne2000/ne2000drv.c b/aplfw/driver/ether/ne2000/ne2000drv.c index 2f0cadc..faae013 100755 --- a/aplfw/driver/ether/ne2000/ne2000drv.c +++ b/aplfw/driver/ether/ne2000/ne2000drv.c @@ -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; } diff --git a/aplfw/driver/ether/ne2000/ne2000drv.h b/aplfw/driver/ether/ne2000/ne2000drv.h index ee1cbb2..b6747c2 100755 --- a/aplfw/driver/ether/ne2000/ne2000drv.h +++ b/aplfw/driver/ether/ne2000/ne2000drv.h @@ -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/ */ @@ -13,18 +13,21 @@ #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 index 0000000..97b9ac4 --- /dev/null +++ b/aplfw/driver/ether/ne2000/ne2000drv_local.h @@ -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 index 0000000..52264b7 --- /dev/null +++ b/aplfw/driver/misc/memdrv/memdrv.h @@ -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 index 0000000..b4988ca --- /dev/null +++ b/aplfw/driver/misc/memdrv/memdrv_close.c @@ -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 index 0000000..80c8ef7 --- /dev/null +++ b/aplfw/driver/misc/memdrv/memdrv_create.c @@ -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 index 0000000..b7b179b --- /dev/null +++ b/aplfw/driver/misc/memdrv/memdrv_delete.c @@ -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 index 0000000..e959d56 --- /dev/null +++ b/aplfw/driver/misc/memdrv/memdrv_flush.c @@ -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 index 0000000..47940e5 --- /dev/null +++ b/aplfw/driver/misc/memdrv/memdrv_iocontrol.c @@ -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 index 0000000..302233b --- /dev/null +++ b/aplfw/driver/misc/memdrv/memdrv_local.h @@ -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 index 0000000..81f421e --- /dev/null +++ b/aplfw/driver/misc/memdrv/memdrv_open.c @@ -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 index 0000000..b5e5fdc --- /dev/null +++ b/aplfw/driver/misc/memdrv/memdrv_read.c @@ -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 +#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 index 0000000..5e43e65 --- /dev/null +++ b/aplfw/driver/misc/memdrv/memdrv_seek.c @@ -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 index 0000000..573cca2 --- /dev/null +++ b/aplfw/driver/misc/memdrv/memdrv_write.c @@ -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 +#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 */ diff --git a/aplfw/driver/serial/pc16550/pc16550drv.h b/aplfw/driver/serial/pc16550/pc16550drv.h index b1d8429..96ee187 100755 --- a/aplfw/driver/serial/pc16550/pc16550drv.h +++ b/aplfw/driver/serial/pc16550/pc16550drv.h @@ -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 } diff --git a/aplfw/driver/serial/pc16550/pc16550drv_close.c b/aplfw/driver/serial/pc16550/pc16550drv_close.c index f938d16..e24cac2 100755 --- a/aplfw/driver/serial/pc16550/pc16550drv_close.c +++ b/aplfw/driver/serial/pc16550/pc16550drv_close.c @@ -13,12 +13,14 @@ /** クローズ */ -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; } diff --git a/aplfw/driver/serial/pc16550/pc16550drv_local.h b/aplfw/driver/serial/pc16550/pc16550drv_local.h index 70e3a97..8aa1c52 100755 --- a/aplfw/driver/serial/pc16550/pc16550drv_local.h +++ b/aplfw/driver/serial/pc16550/pc16550drv_local.h @@ -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 index 0000000..53667aa --- /dev/null +++ b/aplfw/driver/volume/fat/fatvol.h @@ -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 index 0000000..7eeb054 --- /dev/null +++ b/aplfw/driver/volume/fat/fatvol_clusterread.c @@ -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 index 0000000..4bf0e01 --- /dev/null +++ b/aplfw/driver/volume/fat/fatvol_clusterwrite.c @@ -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 index 0000000..c76dd6f --- /dev/null +++ b/aplfw/driver/volume/fat/fatvol_create.c @@ -0,0 +1,140 @@ + +#include +#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 index 0000000..c657e9e --- /dev/null +++ b/aplfw/driver/volume/fat/fatvol_createfile.c @@ -0,0 +1,28 @@ +#include +#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 index 0000000..15c6863 --- /dev/null +++ b/aplfw/driver/volume/fat/fatvol_flushfat.c @@ -0,0 +1,36 @@ + +#include +#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 index 0000000..1374559 --- /dev/null +++ b/aplfw/driver/volume/fat/fatvol_getclusterbuf.c @@ -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 index 0000000..ddacdd9 --- /dev/null +++ b/aplfw/driver/volume/fat/fatvol_getnextcluster.c @@ -0,0 +1,64 @@ + +#include +#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 index 0000000..6ae8dbe --- /dev/null +++ b/aplfw/driver/volume/fat/fatvol_local.h @@ -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 index 0000000..d8365a0 --- /dev/null +++ b/aplfw/driver/volume/fat/fatvol_open.c @@ -0,0 +1,132 @@ + +#include +#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 index 0000000..a62e276 --- /dev/null +++ b/aplfw/driver/volume/fat/fatvol_relclusterbuf.c @@ -0,0 +1,23 @@ + +#include +#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 index 0000000..8b2d41f --- /dev/null +++ b/aplfw/driver/volume/fat/fatvol_setnextcluster.c @@ -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 */ diff --git a/aplfw/sample/arm/ez_arm7/sample.c b/aplfw/sample/arm/ez_arm7/sample.c index e4eba27..64c250a 100755 --- a/aplfw/sample/arm/ez_arm7/sample.c +++ b/aplfw/sample/arm/ez_arm7/sample.c @@ -22,11 +22,11 @@ #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)]; diff --git a/aplfw/sample/sh/cq7144a/sample.c b/aplfw/sample/sh/cq7144a/sample.c index cae8809..5dcb562 100755 --- a/aplfw/sample/sh/cq7144a/sample.c +++ b/aplfw/sample/sh/cq7144a/sample.c @@ -22,11 +22,12 @@ #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); diff --git a/aplfw/system/file/chrdrv.h b/aplfw/system/file/chrdrv.h index da7b910..5a35add 100755 --- a/aplfw/system/file/chrdrv.h +++ b/aplfw/system/file/chrdrv.h @@ -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 index 0000000..172d9b4 --- /dev/null +++ b/aplfw/system/file/chrdrv_delete.c @@ -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 */ diff --git a/aplfw/system/file/chrfile.h b/aplfw/system/file/chrfile.h index 8e56879..c4b2d59 100755 --- a/aplfw/system/file/chrfile.h +++ b/aplfw/system/file/chrfile.h @@ -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 } diff --git a/aplfw/system/file/drvobj.h b/aplfw/system/file/drvobj.h index e8b6800..2dff6b7 100755 --- a/aplfw/system/file/drvobj.h +++ b/aplfw/system/file/drvobj.h @@ -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 index 0000000..8b6d68b --- /dev/null +++ b/aplfw/system/file/drvobj_close.c @@ -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 */ diff --git a/aplfw/system/file/drvobj_create.c b/aplfw/system/file/drvobj_create.c index f1ba952..9e50245 100755 --- a/aplfw/system/file/drvobj_create.c +++ b/aplfw/system/file/drvobj_create.c @@ -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 index 0000000..a1104f8 --- /dev/null +++ b/aplfw/system/file/drvobj_flush.c @@ -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 index 0000000..1d0ae0c --- /dev/null +++ b/aplfw/system/file/drvobj_iocontrol.c @@ -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 index 0000000..d670ebb --- /dev/null +++ b/aplfw/system/file/drvobj_open.c @@ -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 index 0000000..12156e5 --- /dev/null +++ b/aplfw/system/file/drvobj_read.c @@ -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 index 0000000..c82609a --- /dev/null +++ b/aplfw/system/file/drvobj_seek.c @@ -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 index 0000000..0425555 --- /dev/null +++ b/aplfw/system/file/drvobj_write.c @@ -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 */ diff --git a/aplfw/system/file/file.h b/aplfw/system/file/file.h index 16978aa..94f6717 100755 --- a/aplfw/system/file/file.h +++ b/aplfw/system/file/file.h @@ -62,8 +62,12 @@ #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取得 */ @@ -83,20 +87,23 @@ #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); /* ファイルを削除 */ diff --git a/aplfw/system/file/file_adddevice.c b/aplfw/system/file/file_adddevice.c index f57d138..72cb833 100755 --- a/aplfw/system/file/file_adddevice.c +++ b/aplfw/system/file/file_adddevice.c @@ -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); } diff --git a/aplfw/system/file/file_addvolume.c b/aplfw/system/file/file_addvolume.c index 4e7bb9a..53369fc 100755 --- a/aplfw/system/file/file_addvolume.c +++ b/aplfw/system/file/file_addvolume.c @@ -12,23 +12,10 @@ #include "file_local.h" -/* デバイスファイルの追加 */ -FILE_ERR File_AddVolume(const T_FILE_VOLINF *pVolInf) +/* ボリュームデバイスの追加 */ +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 index 0000000..41a575b --- /dev/null +++ b/aplfw/system/file/file_close.c @@ -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 +#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 */ diff --git a/aplfw/system/file/file_initialize.c b/aplfw/system/file/file_initialize.c index 279ae5b..1f251b6 100755 --- a/aplfw/system/file/file_initialize.c +++ b/aplfw/system/file/file_initialize.c @@ -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 */ diff --git a/aplfw/system/file/file_iocontrol.c b/aplfw/system/file/file_iocontrol.c index 72ad5a8..a335c08 100755 --- a/aplfw/system/file/file_iocontrol.c +++ b/aplfw/system/file/file_iocontrol.c @@ -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); } diff --git a/aplfw/system/file/file_local.h b/aplfw/system/file/file_local.h index ea5b6eb..8ef8c2c 100755 --- a/aplfw/system/file/file_local.h +++ b/aplfw/system/file/file_local.h @@ -14,15 +14,13 @@ #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; diff --git a/aplfw/system/file/file_open.c b/aplfw/system/file/file_open.c index aada22c..aa512c9 100755 --- a/aplfw/system/file/file_open.c +++ b/aplfw/system/file/file_open.c @@ -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/ */ @@ -18,31 +18,18 @@ 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); } diff --git a/aplfw/system/file/file_read.c b/aplfw/system/file/file_read.c index c2e6a2a..b561179 100755 --- a/aplfw/system/file/file_read.c +++ b/aplfw/system/file/file_read.c @@ -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 index 0000000..eb4381e --- /dev/null +++ b/aplfw/system/file/file_readdir.c @@ -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 */ diff --git a/aplfw/system/file/file_seek.c b/aplfw/system/file/file_seek.c index e22f0af..192172c 100755 --- a/aplfw/system/file/file_seek.c +++ b/aplfw/system/file/file_seek.c @@ -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); } diff --git a/aplfw/system/file/file_write.c b/aplfw/system/file/file_write.c index e940672..f73f7d4 100755 --- a/aplfw/system/file/file_write.c +++ b/aplfw/system/file/file_write.c @@ -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); } diff --git a/aplfw/system/file/fileobj.h b/aplfw/system/file/fileobj.h index a5316e9..46deb38 100755 --- a/aplfw/system/file/fileobj.h +++ b/aplfw/system/file/fileobj.h @@ -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; /* デバイスドライバへの参照 */ + struct c_drvobj *pDrvObj; /* ドライバへの参照 */ } C_FILEOBJ; diff --git a/aplfw/system/file/fileobj_create.c b/aplfw/system/file/fileobj_create.c index b6130db..6be28e0 100755 --- a/aplfw/system/file/fileobj_create.c +++ b/aplfw/system/file/fileobj_create.c @@ -14,7 +14,7 @@ static const T_FILEOBJ_METHODS FileObj_FileObjMethods = { - {FileObj_Delete}, /* デストラクタ */ + {File_Close}, /* デストラクタ */ }; diff --git a/aplfw/system/file/fileobj_delete.c b/aplfw/system/file/fileobj_delete.c index 4b910f8..36e238a 100755 --- a/aplfw/system/file/fileobj_delete.c +++ b/aplfw/system/file/fileobj_delete.c @@ -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 index 0000000..fb9cc7d --- /dev/null +++ b/aplfw/system/file/sysvol.h @@ -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 index 0000000..e3b8c75 --- /dev/null +++ b/aplfw/system/file/sysvol_adddevice.c @@ -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 +#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 index 0000000..635ff98 --- /dev/null +++ b/aplfw/system/file/sysvol_close.c @@ -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 index 0000000..60854be --- /dev/null +++ b/aplfw/system/file/sysvol_create.c @@ -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 +#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 index 0000000..7c0155e --- /dev/null +++ b/aplfw/system/file/sysvol_delete.c @@ -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 index 0000000..84ad84b --- /dev/null +++ b/aplfw/system/file/sysvol_iocontrol.c @@ -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 index 0000000..daa105b --- /dev/null +++ b/aplfw/system/file/sysvol_local.h @@ -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 index 0000000..64e2eac --- /dev/null +++ b/aplfw/system/file/sysvol_open.c @@ -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 +#include +#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 */ + diff --git a/aplfw/system/file/volumeobj.h b/aplfw/system/file/volumeobj.h index 2ee85a4..47063b9 100755 --- a/aplfw/system/file/volumeobj.h +++ b/aplfw/system/file/volumeobj.h @@ -1,8 +1,8 @@ /** * Hyper Operating System Application Framework * - * @file driveobj.h - * @brief %jp{ディレクトリオブジェクト} + * @file volumeobj.h + * @brief %jp{ボリュームオブジェクト基本クラス} * * Copyright (C) 2006 by Project HOS * http://sourceforge.jp/projects/hos/ @@ -14,20 +14,22 @@ #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__ */ diff --git a/aplfw/system/file/volumeobj_create.c b/aplfw/system/file/volumeobj_create.c index 3bb6f06..61c438a 100755 --- a/aplfw/system/file/volumeobj_create.c +++ b/aplfw/system/file/volumeobj_create.c @@ -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 index 0000000..fab351c --- /dev/null +++ b/aplfw/system/file/volumeobj_makedir.c @@ -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 index 0000000..c509a0a --- /dev/null +++ b/aplfw/system/file/volumeobj_remove.c @@ -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 */ diff --git a/aplfw/system/handle/handle_close.c b/aplfw/system/handle/handle_close.c index 8022540..6bbe76c 100755 --- a/aplfw/system/handle/handle_close.c +++ b/aplfw/system/handle/handle_close.c @@ -18,16 +18,22 @@ /* ハンドルを閉じる */ 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); + } } diff --git a/aplfw/system/handle/handleobj.h b/aplfw/system/handle/handleobj.h index 3c835d7..8078e3f 100755 --- a/aplfw/system/handle/handleobj.h +++ b/aplfw/system/handle/handleobj.h @@ -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 } diff --git a/aplfw/system/handle/handleobj_create.c b/aplfw/system/handle/handleobj_create.c index 65ab9d8..0b6704b 100755 --- a/aplfw/system/handle/handleobj_create.c +++ b/aplfw/system/handle/handleobj_create.c @@ -15,7 +15,10 @@ /* コンストラクタ */ void HandleObj_Create(C_HANDLEOBJ *self, const T_HANDLEOBJ_METHODS *pMethods) { + /* 仮想関数テーブルの登録 */ self->pMethods = pMethods; + + /* プロセスに紐付け(予定) */ } diff --git a/aplfw/system/handle/handleobj_delete.c b/aplfw/system/handle/handleobj_delete.c index 3227979..68b51fe 100755 --- a/aplfw/system/handle/handleobj_delete.c +++ b/aplfw/system/handle/handleobj_delete.c @@ -16,11 +16,7 @@ /* デストラクタ */ void HandleObj_Delete(C_HANDLEOBJ *self) { - /* デストラクタが登録されていれば呼ぶ */ - if ( self->pMethods->pfncDelete != NULL ) - { - self->pMethods->pfncDelete((HANDLE)self); - } + /* プロセスの紐付け解除(予定) */ } diff --git a/aplfw/system/process/procobj.h b/aplfw/system/process/procobj.h index 87896be..5ce8cdc 100755 --- a/aplfw/system/process/procobj.h +++ b/aplfw/system/process/procobj.h @@ -11,19 +11,19 @@ /* プロセスオブジェクト基本クラス定義 */ 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; diff --git a/aplfw/volume/dev/devvol_create.c b/aplfw/volume/dev/devvol_create.c index da81334..1347c20 100755 --- a/aplfw/volume/dev/devvol_create.c +++ b/aplfw/volume/dev/devvol_create.c @@ -5,7 +5,11 @@ const T_VOLUMEOBJ_METHODS DevVol_VolumeObjMethods = { - DevVol_OpenFile, + { + DevVol_Delete, + DevVol_OpenFile, + + }, NULL, NULL, }; diff --git a/aplfw/volume/dev/devvol_openfile.c b/aplfw/volume/dev/devvol_openfile.c index 0931f6a..ae59401 100755 --- a/aplfw/volume/dev/devvol_openfile.c +++ b/aplfw/volume/dev/devvol_openfile.c @@ -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); } diff --git a/kernel/build/common/gmake/shc_d.inc b/kernel/build/common/gmake/shc_d.inc index 8ef282e..aa153fa 100755 --- a/kernel/build/common/gmake/shc_d.inc +++ b/kernel/build/common/gmake/shc_d.inc @@ -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 = -- 2.11.0