+/* 磁七磁磁邪磁 */
#include <string.h>
#include "hosaplfw.h"
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file filelist.h
+ * @brief %jp{ファイルリストコマンド}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include "hosaplfw.h"
+#include "filelist.h"
+
+
+int FileList_Main(int argc, char *argv[])
+{
+ T_FILE_FILEINF FileInf;
+ HANDLE hDir;
+
+ if ( argc < 2 )
+ {
+ return 1;
+ }
+
+ /* ディレクトリを開く */
+ if ( (hDir = File_Open(argv[1], FILE_OPEN_READ | FILE_OPEN_DIR)) == HANDLE_NULL )
+ {
+ return 0;
+ }
+
+ /* ディレクトリを読み出す */
+ while ( File_ReadDir(hDir, &FileInf) == FILE_ERR_OK )
+ {
+ StdIo_PrintFormat("%s\n", FileInf.szFileName);
+ }
+
+ /* ディレクトリを閉じる */
+ File_Close(hDir);
+
+ return 0;
+}
+
+
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file filelist.h
+ * @brief %jp{ファイルリストコマンド}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include "hosaplfw.h"
+#include "ethersnoop.h"
+
+
+int EtherSnoop_Main(int argc, char *argv[])
+{
+ HANDLE hEther;
+ unsigned char *pubBuf;
+ FILE_SIZE Size;
+ FILE_SIZE i;
+
+ if ( argc < 2 )
+ {
+ return 1;
+ }
+
+ /* Etherポートを開く */
+ if ( (hEther = File_Open(argv[1], FILE_OPEN_READ)) == HANDLE_NULL )
+ {
+ return 1;
+ }
+
+ /* バッファメモリ確保 */
+ if ( (pubBuf = Memory_Alloc(4096)) == NULL )
+ {
+ return 1;
+ }
+
+ /* ディレクトリを読み出す */
+ while ( (Size = File_Read(hEther, pubBuf, 4096)) > 0 )
+ {
+ for ( i = 0; i < Size; i++ )
+ {
+ StdIo_PrintFormat("%02x ", pubBuf[i]);
+ }
+ StdIo_PutChar('\n');
+ }
+
+ Memory_Free(pubBuf);
+ File_Close(hEther);
+
+ return 0;
+}
+
+
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
# --------------------------------------------------
-# 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
# --------------------------------------------------
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)
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
+
--- /dev/null
+/**
+ * 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 */
+
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
+
--- /dev/null
+/**
+ * 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 */
+
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
*/
-#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 初期化 */
/** デストラクタ */
-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);
/** %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;
}
* @file ne2000drv.c
* @brief %jp{NE2000互換Ether用デバイスドライバ}
*
- * Copyright (C) 2006 by Project HOS
+ * Copyright (C) 2006-2007 by Project HOS
* http://sourceforge.jp/projects/hos/
*/
#define __HOS__ne2000drv_h__
-#include "ne2000hal.h"
#include "system/sysapi/sysapi.h"
+#include "system/file/chrdrv.h"
+#include "ne2000hal.h"
/* NE2000互換NIC制御ドライバクラス */
typedef struct c_ne2000drv
{
- int iOpenCount;
- SYSEVT_HANDLE hEvtSend;
- SYSEVT_HANDLE hEvtRecv;
- SYSMTX_HANDLE hMtx;
- C_NE2000HAL Ne2000Hal;
+ C_CHRDRV ChrDrv; /* キャラクタ型デバイスドライバを継承 */
+
+ C_NE2000HAL Ne2000Hal;
+ int iOpenCount;
+ SYSEVT_HANDLE hEvtSend;
+ SYSEVT_HANDLE hEvtRecv;
+ SYSMTX_HANDLE hMtx;
} C_NE2000DRV;
#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
}
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file memdrv.h
+ * @brief %jp{メモリマップドファイル用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include <string.h>
+#include "memdrv_local.h"
+
+
+
+FILE_SIZE MemDrv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size)
+{
+ C_MEMDRV *self;
+ C_MEMDRVFILE *pFile;
+
+ /* upper cast */
+ self = (C_MEMDRV *)pDrvObj;
+ pFile = (C_MEMDRVFILE *)pFileObj;
+
+ SysMtx_Lock(self->hMtx);
+
+ /* サイズクリップ */
+ if ( Size > self->FileSize - pFile->FilePos )
+ {
+ Size = self->FileSize - pFile->FilePos;
+ }
+
+ /* 読み出し */
+ memcpy(pBuf, self->pubMemAddr + pFile->FilePos, Size);
+ pFile->FilePos += Size;
+
+ SysMtx_Unlock(self->hMtx);
+
+ return Size;
+}
+
+
+/* end of file */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file memdrv.h
+ * @brief %jp{メモリマップドファイル用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include <string.h>
+#include "memdrv_local.h"
+
+
+
+FILE_SIZE MemDrv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size)
+{
+ C_MEMDRV *self;
+ C_MEMDRVFILE *pFile;
+
+ SysMtx_Lock(self->hMtx);
+
+ /* サイズクリップ */
+ if ( Size > self->MemSize - pFile->FilePos )
+ {
+ Size = self->MemSize - pFile->FilePos;
+ }
+
+ /* 書込み */
+ memcpy(self->pubMemAddr + pFile->FilePos, pData, Size);
+ pFile->FilePos += Size;
+
+ /* ファイルサイズ拡張 */
+ if ( self->FileSize < pFile->FilePos )
+ {
+ self->FileSize = pFile->FilePos;
+ }
+
+ SysMtx_Unlock(self->hMtx);
+
+ return Size;
+}
+
+
+/* end of file */
#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
}
/** クローズ */
-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 )
}
/* ディスクリプタ削除 */
+ ChrFile_Delete(pChrFile);
SysMem_Free(pFileObj);
-
- return FILE_ERR_OK;
}
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);
--- /dev/null
+
+
+#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__ */
+
+
--- /dev/null
+#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 */
--- /dev/null
+
+#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 */
--- /dev/null
+
+#include <string.h>
+#include "fatvol_local.h"
+
+
+/* 仮想関数テーブル */
+const T_VOLUMEOBJ_METHODS FatVol_VolumeObjMethods =
+{
+ {
+ FatVol_Delete,
+ FatVol_Open,
+ FatVol_Close,
+ FatVol_IoControl,
+ FatVol_Seek,
+ FatVol_Read,
+ FatVol_Write,
+ FatVol_Flush,
+ },
+ FatVol_MakeDir,
+ FatVol_Remove,
+};
+
+
+/* コンストラクタ */
+int FatVol_Create(C_FATVOL *self, HANDLE hBlockFile)
+{
+ unsigned char ubBuf[512];
+ int i;
+
+ /* 親クラスコンストラクタ呼び出し */
+ VolumeObj_Create(&self->VolumeObj, &FatVol_VolumeObjMethods);
+
+
+ /* ドライブの設定 */
+ self->hBlockFile = hBlockFile;
+ self->Offset = 0x33*512; /* 一時的に ちょいインチキ */
+
+
+ /* サイズ取得 */
+ self->DriveSize = File_Seek(self->hBlockFile, FILE_SEEK_END, 0);
+ self->iFatType = FATVOL_TYPE_UNKNOWN;
+
+
+ /* BIOS Parameter Block */
+ File_Seek(self->hBlockFile, self->Offset, FILE_SEEK_SET);
+ File_Read(self->hBlockFile, ubBuf, 512);
+
+ /* FAT12/16/32判定 */
+ if ( ubBuf[0x36] == 'F' && ubBuf[0x37] == 'A' && ubBuf[0x38] == 'T' && ubBuf[0x39] == '1' )
+ {
+ if ( ubBuf[0x3a] == '2' )
+ {
+ self->iFatType = FATVOL_TYPE_FAT12;
+ }
+ else if ( ubBuf[0x3a] == '6' )
+ {
+ self->iFatType = FATVOL_TYPE_FAT16;
+ }
+ }
+ else if ( ubBuf[0x52] == 'F' && ubBuf[0x53] == 'A' && ubBuf[0x54] == 'T' && ubBuf[0x55] == '3' && ubBuf[0x56] == '2')
+ {
+ self->iFatType = FATVOL_TYPE_FAT32;
+ }
+
+
+ /* フォーマット別情報解析 */
+ switch ( self->iFatType )
+ {
+ case FATVOL_TYPE_FAT12:
+ case FATVOL_TYPE_FAT16:
+ self->BytesPerSector = ubBuf[0x0b] + ubBuf[0x0c] * 256; /**< セクタサイズ */
+ self->SectorsPerCluster = ubBuf[0x0d]; /**< 1クラスタのセクタ数 */
+ self->RootDirEntryNum = ubBuf[0x11] + ubBuf[0x12] * 256; /**< ルートディレクトリ最大エントリ数 */
+ self->FatStartSector = ubBuf[0x0e] + ubBuf[0x0f] * 256; /**< FATの開始セクタ番号 */
+ self->SectorPerFat = ubBuf[0x16] + ubBuf[0x17] * 256; /**< FATあたりのセクタ数 */
+ self->FatNum = ubBuf[0x10]; /**< FAT個数 */
+ self->RootDirSector = self->FatStartSector + (self->SectorPerFat * self->FatNum);
+ /**< ルートディレクトリ開始位置 */
+ self->Cluster0Sector = self->RootDirSector
+ + (((self->RootDirEntryNum * 32) + self->BytesPerSector - 1) / self->BytesPerSector)
+ - (2 * self->SectorsPerCluster); /**< クラスタ0の開始セクタ */
+
+ /* FATバッファ準備 */
+ self->pubFatBuf = (unsigned char *)SysMem_Alloc(self->SectorPerFat * self->BytesPerSector);
+ self->pubFatDirty = (unsigned char *)SysMem_Alloc(self->SectorPerFat);
+
+ /* FATバッファ準備 */
+ File_Seek(self->hBlockFile, self->FatStartSector * self->BytesPerSector, FILE_SEEK_SET);
+ File_Read(self->hBlockFile, self->pubFatBuf, self->SectorPerFat * self->BytesPerSector);
+ memset(self->pubFatDirty, 0, self->SectorPerFat);
+
+ break;
+
+ case FATVOL_TYPE_FAT32:
+ break;
+
+ default:
+ return FATVOL_ERR_NG;
+ }
+
+ /* 最大クラスタ番号算出 */
+ switch ( self->iFatType )
+ {
+ case FATVOL_TYPE_FAT12:
+ self->MaxClusterNum = (self->SectorPerFat * self->BytesPerSector) / 3 * 2;
+ if ( self->MaxClusterNum >= 0x0ff7 )
+ {
+ self->MaxClusterNum = 0x0ff6;
+ }
+ break;
+
+ case FATVOL_TYPE_FAT16:
+ self->MaxClusterNum = (self->SectorPerFat * self->BytesPerSector) / 2;
+ if ( self->MaxClusterNum >= 0xfff7 )
+ {
+ self->MaxClusterNum = 0xfff6;
+ }
+ break;
+
+ case FATVOL_TYPE_FAT32:
+ self->MaxClusterNum = (self->SectorPerFat * self->BytesPerSector) / 4;
+ break;
+ }
+
+ /* クラスタバッファ取得 */
+ self->iClusterBufIndex = 0;
+ self->iClusterBufNum = 32;
+ self->pClusterBuf = (T_FATVOL_CLUSTERBUF *)SysMem_Alloc(sizeof(T_FATVOL_CLUSTERBUF) * self->iClusterBufNum);
+ for ( i = 0; i < self->iClusterBufNum; i++ )
+ {
+ self->pClusterBuf[i].uiClusterNum = FATVOL_CLUSTER_ENDMARKER;
+ self->pClusterBuf[i].iDirty = 0;
+ self->pClusterBuf[i].pubBuf = SysMem_Alloc(self->SectorsPerCluster * self->BytesPerSector);
+ }
+
+ return FATVOL_ERR_OK;
+}
+
+
+
--- /dev/null
+#include <stdio.h>
+#include "system/sysapi/sysapi.h"
+#include "fatfile.h"
+#include "fatvol_local.h"
+
+
+HANDLE FatVol_CreateFile(
+ C_FATVOL *self,
+ FATVOL_UINT uiCluster,
+ HANDLE hDir,
+ int iDirEntry,
+ int iMode)
+{
+ C_FATFILE *pFatFile;
+
+ /* オブジェクトを生成 */
+ pFatFile = (C_FATFILE *)SysMem_Alloc(sizeof(C_FATFILE));
+ if ( pFatFile == NULL )
+ {
+ return HANDLE_NULL;
+ }
+ FatFile_Create(pFatFile, self, uiCluster, hDir, iDirEntry, iMode);
+
+ return (HANDLE)pFatFile;
+}
+
+
+/* end of file */
--- /dev/null
+
+#include <string.h>
+#include "fatvol_local.h"
+
+
+/** FATのフラッシュ */
+void FatVol_FlushFat(C_FATVOL *self)
+{
+ unsigned long i;
+
+ /* FAT先頭へ移動 */
+ File_Seek(self->hBlockFile, self->FatStartSector * self->BytesPerSector, FILE_SEEK_SET);
+
+ for ( i = 0; i < self->FatNum; i++ )
+ {
+ int j;
+
+ for ( j = 0; j < self->SectorPerFat; j++ )
+ {
+ if ( self->pubFatDirty[j] )
+ {
+ File_Write(self->hBlockFile, &self->pubFatBuf[j * self->BytesPerSector], self->BytesPerSector);
+ }
+ else
+ {
+ File_Seek(self->hBlockFile, self->BytesPerSector, FILE_SEEK_CUR);
+ }
+ }
+ }
+
+ /* 更新フラグクリア */
+ memset(self->pubFatDirty, 0, self->SectorPerFat);
+}
+
+
+/* end of file */
--- /dev/null
+
+#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 */
--- /dev/null
+
+#include <string.h>
+#include "fatvol_local.h"
+
+
+FATVOL_UINT FatVol_GetNextCluster(C_FATVOL *self, FATVOL_UINT uiCluster)
+{
+ FATVOL_UINT uiNextCluster = FATVOL_CLUSTER_ENDMARKER;
+
+ switch ( self->iFatType )
+ {
+ case FATVOL_TYPE_FAT12:
+ /* 0xffff0000 からルートディレクトリをマップ */
+ if ( uiCluster >= 0xffff0000 )
+ {
+ return uiCluster + 1;
+ }
+
+ /* FAT検索 */
+ if ( uiCluster % 2 == 0 )
+ {
+ uiNextCluster = self->pubFatBuf[(uiCluster / 2) * 3 + 0]
+ + ((self->pubFatBuf[(uiCluster / 2) * 3 + 1] & 0x0f) << 8);
+ }
+ else
+ {
+ uiNextCluster = ((self->pubFatBuf[(uiCluster / 2) * 3 + 1] >> 4) & 0xf)
+ + (self->pubFatBuf[(uiCluster / 2) * 3 + 2] << 4);
+ }
+
+ if ( uiNextCluster >= 0x0ff7 )
+ {
+ uiNextCluster = FATVOL_CLUSTER_ENDMARKER;
+ }
+ break;
+
+ case FATVOL_TYPE_FAT16:
+ /* 0xffff0000 からルートディレクトリをマップ */
+ if ( uiCluster >= 0xffff0000 )
+ {
+ return uiCluster + 1;
+ }
+
+ /* FAT検索 */
+ uiNextCluster = self->pubFatBuf[uiCluster * 2] + self->pubFatBuf[uiCluster * 2 + 1] * 256;
+ if ( uiNextCluster >= 0xfff7 )
+ {
+ uiNextCluster = FATVOL_CLUSTER_ENDMARKER;
+ }
+ break;
+
+ case FATVOL_TYPE_FAT32:
+ uiNextCluster = self->pubFatBuf[uiCluster * 4]
+ + self->pubFatBuf[uiCluster * 4 + 1] * 256
+ + self->pubFatBuf[uiCluster * 4 + 2] * 256 * 256
+ + self->pubFatBuf[uiCluster * 4 + 3] * 256 * 256 * 256;
+ break;
+ }
+
+ return uiNextCluster;
+}
+
+
+/* end of file */
--- /dev/null
+
+
+#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 */
--- /dev/null
+
+#include <string.h>
+#include "fatvol_local.h"
+
+
+HANDLE FatVol_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
+{
+ C_FATVOL *self;
+ unsigned char ubBuf[32];
+ FATVOL_UINT uiCluster;
+ HANDLE hDir;
+ HANDLE hFile;
+ char szEntryName[8+3+1];
+ int iEntryNameLen;
+ char szName[8+3+1];
+ int iNameLen;
+ int iDirEntry;
+ int i, j;
+
+ /* upper cast */
+ self = (C_FATVOL *)pDrvObj;
+
+ /* ルートディレクトリを開く */
+ hDir = FatVol_CreateFile(self, self->RootDirCluster, 0, 0, FILE_OPEN_READ | FILE_OPEN_WRITE | FILE_OPEN_DIR);
+
+ for ( ; ; )
+ {
+ /* 名前の部分を検索 */
+ for ( iNameLen = 0; pszPath[iNameLen] != '\0'; iNameLen++ )
+ {
+ if ( pszPath[iNameLen] == '/' )
+ {
+ szName[iNameLen] = '\0';
+ break;
+ }
+
+ /* 大文字に変換 */
+ if ( pszPath[iNameLen] >= 'a' && pszPath[iNameLen] <= 'z' )
+ {
+ szName[iNameLen] = pszPath[iNameLen] - ('a' - 'A');
+ }
+ else
+ {
+ szName[iNameLen] = pszPath[iNameLen];
+ }
+ }
+
+ /* ディレクトリエントリを検索 */
+ iDirEntry = -1;
+ for ( i = 0; File_Read(hDir, ubBuf, 32) == 32; i++ )
+ {
+ /* 0なら打ち切り */
+ if ( ubBuf[0] == 0x00 )
+ {
+ break;
+ }
+
+ /* 名前部分取り出し */
+ iEntryNameLen = 0;
+ for ( j = 0; j < 8; j++ )
+ {
+ if ( ubBuf[0+j] == ' ' || ubBuf[0+j] == '\0' )
+ {
+ break;
+ }
+ szEntryName[iEntryNameLen++] = (char)ubBuf[0+j];
+ }
+ szEntryName[iEntryNameLen++] = '.';
+ for ( j = 0; j < 3; j++ )
+ {
+ if ( ubBuf[8+j] == ' ' || ubBuf[8+j] == '\0' )
+ {
+ break;
+ }
+ szEntryName[iEntryNameLen++] = (char)ubBuf[8+j];
+ }
+ szEntryName[iEntryNameLen++] = '\0';
+ if ( iEntryNameLen > 2 && szEntryName[iEntryNameLen-1] == '.' )
+ {
+ szEntryName[--iEntryNameLen] = '\0';
+ }
+
+ if ( strcmp(szEntryName, szName) == 0 )
+ {
+ iDirEntry = i;
+ break;
+ }
+ }
+
+ /* 開始クラスタ取得 */
+ uiCluster = ubBuf[0x1a] + ubBuf[0x1b]*256;
+ if ( self->iFatType == FATVOL_TYPE_FAT32 )
+ {
+ uiCluster += ubBuf[0x14]*256*256 + ubBuf[0x15]*256*256*256;
+ }
+
+ /* パス部分の解析が終わっていればここで抜ける */
+ if ( pszPath[iNameLen] == '\0' )
+ {
+ break;
+ }
+
+ File_Close(hDir);
+
+ /* サブディレクトリがなければエラー */
+ if ( iDirEntry < 0 || !(ubBuf[0x0b] & 0x10) )
+ {
+ return HANDLE_NULL;
+ }
+
+ /* サブディレクトリを開く */
+ hDir = FatVol_CreateFile(self, uiCluster, 0, 0, FILE_OPEN_READ | FILE_OPEN_WRITE | FILE_OPEN_DIR);
+
+ pszPath += iNameLen;
+ }
+
+ /* 既存ファイルがあれば */
+ if ( iDirEntry >= 0 )
+ {
+ hFile = FatVol_CreateFile(self, uiCluster, hDir, iDirEntry, iMode);
+ if ( hFile == HANDLE_NULL )
+ {
+ File_Close(hDir);
+ }
+ return hFile;
+ }
+
+ File_Close(hDir);
+ return HANDLE_NULL;
+}
+
+
--- /dev/null
+
+#include <stddef.h>
+#include "fatvol_local.h"
+
+
+/**< クラスタ読み込み */
+int FatVol_RelClusterBuf(
+ C_FATVOL *self,
+ void *pBuf,
+ int iDirty)
+{
+ T_FATVOL_CLUSTERBUF *pClusterBuf;
+
+ /* バッファ情報取得 */
+ pClusterBuf = (T_FATVOL_CLUSTERBUF *)((char *)pBuf - offsetof(T_FATVOL_CLUSTERBUF, pubBuf));
+
+ pClusterBuf->iDirty = iDirty;
+
+ return FATVOL_ERR_OK;
+}
+
+
+/* end of file */
--- /dev/null
+
+
+#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 */
#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)];
#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"
/*************************/
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);
#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); /**< 読込み可能になったことを通知 */
--- /dev/null
+/**
+ * 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 */
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
}
{
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);
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__ */
--- /dev/null
+/**
+ * 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 */
+/**
+ * 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"
}
+/* end of file */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
#define FILE_IOCTL_SENDWRITEBUF 0x0031 /* ライトバッファ送信(省コピー版Write) */
#define FILE_IOCTL_CANWRITEBUF 0x0032 /* ライトバッファ破棄(省コピー版Write) */
+
+/* IoControl機能コード(ディレクトリ) */
+#define FILE_IOCTL_DIR_READ 0x0101 /* デバイス情報を得る */
+
/* IoControl機能コード(コンソール) */
-#define FILE_IOCTL_CON_GETCH 0x0101 /* 文字読込み */
+#define FILE_IOCTL_CON_GETCH 0x0201 /* 文字読込み */
/* IoControl機能コード(シリアル通信) */
#define FILE_IOCTL_COM_GETSPEED 0x2101 /* BPS取得 */
#define FILE_IOCTL_USER 0x6000 /* 0x6000〜0x7fff */
+/* ファイル属性 */
+#define FILE_ATTR_READONLY 0x01
+#define FILE_ATTR_DIR 0x08
+#define FILE_ATTR_DEVICE 0x80
+
+
+
/* 型定義 */
typedef char FILE_ATTR; /* ファイル属性 */
typedef int FILE_ERR; /* ファイルのエラー型 */
typedef long FILE_POS; /* ファイル位置の型定義 */
-typedef int FILE_SIZE; /* 読み書き時のサイズ用の型定義 */
+typedef long FILE_SIZE; /* 読み書き時のサイズ用の型定義 */
typedef unsigned long FILE_TIME; /* 読み書き時のサイズ用の時刻型定義 */
+struct c_drvobj;
+struct c_volobj;
-/* ボリューム情報 */
-typedef struct t_file_volinf
-{
- char szName[FILE_MAX_NAME];
- HANDLE hVolume;
-} T_FILE_VOLINF;
/* ファイル情報 */
#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);
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);
/* 拡張操作 */
/* ディレクトリ操作 */
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); /* ファイルを削除 */
#include "file_local.h"
-#include "volume/dev/devvol.h"
+#include "sysvol.h"
/* デバイスファイルの追加 */
self = &g_File;
- return DevVol_AddDevice(self->hDevVol, pszName, pDrvObj);
+ return SysVol_AddDevice(&self->DevVol, pszName, pDrvObj, FILE_ATTR_DEVICE);
}
#include "file_local.h"
-/* ã\83\87ã\83\90ã\82¤ã\82¹ã\83\95ã\82¡ã\82¤ã\83«の追加 */
-FILE_ERR File_AddVolume(const T_FILE_VOLINF *pVolInf)
+/* ã\83\9cã\83ªã\83¥ã\83¼ã\83 ã\83\87ã\83\90ã\82¤ã\82¹の追加 */
+FILE_ERR File_AddVolume(const char *pszName, struct c_volobj *pVolObj)
{
- C_FILE *self;
- int i;
-
- self = &g_File;
-
- /* テーブルの空きを検索 */
- for ( i = 0; i < FILE_MAX_VOLUME; i++ )
- {
- if ( self->VolumeTable[i].hVolume == HANDLE_NULL )
- {
- self->VolumeTable[i] = *pVolInf;
- return FILE_ERR_OK;
- }
- }
+
return FILE_ERR_NG;
}
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file file.c
+ * @brief %jp{ファイルシステム}
+ *
+ * Copyright (C) 2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include <stdio.h>
+#include "file_local.h"
+#include "fileobj.h"
+
+
+void File_Close(HANDLE hFile)
+{
+ C_FILEOBJ *self;
+
+ self = FILE_HANDLE2OBJ(hFile);
+
+ DrvObj_vClose(self->pDrvObj, self);
+}
+
+
+
+/* end of file */
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 */
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);
}
#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;
* @file file.c
* @brief %jp{ファイルシステム}
*
- * Copyright (C) 2006 by Project HOS
+ * Copyright (C) 2006-2007 by Project HOS
* http://sourceforge.jp/projects/hos/
*/
HANDLE File_Open(const char *pszPatah, int iMode)
{
C_FILE *self;
- int iNameLen;
- int i;
self = &g_File;
if ( *pszPatah == '/' ) /* 絶対パス */
{
-
pszPatah++;
}
else /* 相対パスの処理(そのうち追加) */
{
+
}
-
- /* ボリュームを検索 */
- for ( i = 0; i < FILE_MAX_VOLUME; i++ )
- {
- iNameLen = strlen(self->VolumeTable[i].szName);
- if ( strncmp(pszPatah, self->VolumeTable[i].szName, iNameLen) == 0 )
- {
- pszPatah += iNameLen;
- return Volume_OpenFile(self->VolumeTable[i].hVolume, pszPatah, iMode);
- }
- }
-
- return HANDLE_NULL;
+ /* ルートディレクトリからオープンを掛ける */
+ return DrvObj_vOpen((C_DRVOBJ *)&self->RootVol, pszPatah, iMode);
}
self = FILE_HANDLE2OBJ(hFile);
- return DrvObj_Read(self->pDrvObj, self, pBuf, Size);
+ return DrvObj_vRead(self->pDrvObj, self, pBuf, Size);
}
--- /dev/null
+/**
+ * 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 */
self = FILE_HANDLE2OBJ(hFile);
- return DrvObj_Seek(self->pDrvObj, self, Offset, iOrign);
+ return DrvObj_vSeek(self->pDrvObj, self, Offset, iOrign);
}
self = FILE_HANDLE2OBJ(hFile);
- return DrvObj_Write(self->pDrvObj, self, pData, Size);
+ return DrvObj_vWrite(self->pDrvObj, self, pData, Size);
}
*
* %jp{ファイルディスクリプタとして機能するクラス}
*
- * Copyright (C) 2006 by Project HOS
+ * Copyright (C) 2006-2007 by Project HOS
* http://sourceforge.jp/projects/hos/
*/
typedef struct c_fileobj
{
C_HANDLEOBJ HandleObj; /* ハンドルオブジェクトを継承 */
- struct c_drvobj *pDrvObj; /* ã\83\87ã\83\90ã\82¤ã\82¹ã\83\89ã\83©ã\82¤ã\83\90ã\81¸ã\81®å\8f\82ç\85§ */
+ struct c_drvobj *pDrvObj; /* ドライバへの参照 */
} C_FILEOBJ;
static const T_FILEOBJ_METHODS FileObj_FileObjMethods =
{
- {FileObj_Delete}, /* デストラクタ */
+ {File_Close}, /* デストラクタ */
};
self = (C_FILEOBJ *)hFile;
- /* クローズ処理 */
- DrvObj_Close(self->pDrvObj, self);
+ HandleObj_Delete(&self->HandleObj);
}
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file sysvol.h
+ * @brief %jp{システムボリューム}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+#include <string.h>
+#include "sysvol_local.h"
+
+
+/* システムボリュームにデバイスをぶら下げる */
+FILE_ERR SysVol_AddDevice(C_SYSVOL *self, const char *pszName, struct c_drvobj *pDrvObj, int iAttr)
+{
+ int i;
+
+ /* テーブルの空きを検索 */
+ for ( i = 0; i < DEVVOL_MAX_DEVICE; i++ )
+ {
+ if ( self->DevTable[i].pDrvObj == NULL )
+ {
+ strcpy(self->DevTable[i].szName, pszName);
+ self->DevTable[i].pDrvObj = pDrvObj;
+ self->DevTable[i].iAttr = iAttr;
+ return FILE_ERR_OK;
+ }
+ }
+
+ return FILE_ERR_NG;
+}
+
+
+/* end of file */
--- /dev/null
+/**
+ * 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 */
+
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file sysvol.h
+ * @brief %jp{システムボリューム}
+ *
+ * %jp{ルートディレクトリや /dev ディレクトリなど、システム上の仮想ボリュームを管理}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+#include <stdio.h>
+#include "sysvol_local.h"
+
+
+const T_VOLUMEOBJ_METHODS SysVol_VolumeObjMethods =
+{
+ {
+ SysVol_Delete,
+ SysVol_Open,
+ SysVol_Close,
+ SysVol_IoControl,
+ DrvObj_Seek,
+ DrvObj_Read,
+ DrvObj_Write,
+ DrvObj_Flush,
+ },
+ VolumeObj_MakeDir,
+ VolumeObj_Remove,
+};
+
+
+void SysVol_Create(C_SYSVOL *self)
+{
+ int i;
+
+ /* 親クラスコンストラクタ呼び出し */
+ VolumeObj_Create(&self->VolumeObj, &SysVol_VolumeObjMethods);
+
+ /* 初期化 */
+ for ( i = 0; i < DEVVOL_MAX_DEVICE; i++ )
+ {
+ self->DevTable[i].pDrvObj = NULL;
+ }
+}
+
+
--- /dev/null
+
+#include "sysvol_local.h"
+
+
+void SysVol_Delete(C_DRVOBJ *self)
+{
+}
+
--- /dev/null
+/**
+ * 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 */
+
--- /dev/null
+
+#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
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file sysvol.h
+ * @brief %jp{システムボリューム}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include <stdio.h>
+#include <string.h>
+#include "sysvol_local.h"
+#include "system/sysapi/sysapi.h"
+#include "system/file/drvobj.h"
+
+
+/* ファイルを開く */
+HANDLE SysVol_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
+{
+ C_SYSVOL *self;
+ int iLen;
+ int i;
+
+ /* upper cast */
+ self = (C_SYSVOL *)pDrvObj;
+
+ /* 自分自身のディレクトリを開くなら */
+ if ( *pszPath == '\0' )
+ {
+ C_SYSVOLDIR *pDir;
+
+ /* モードチェック */
+ if ( !(iMode & (FILE_OPEN_DIR | FILE_OPEN_READ)) )
+ {
+ return HANDLE_NULL;
+ }
+
+ /* ディスクリプタ生成 */
+ if ( (pDir = (C_SYSVOLDIR *)SysMem_Alloc(sizeof(C_SYSVOLDIR))) == NULL )
+ {
+ return HANDLE_NULL;
+ }
+ FileObj_Create(&pDir->FileObj, (C_DRVOBJ *)self, NULL);
+ pDir->iReadPtr = 0;
+
+ return (HANDLE)pDir;
+ }
+
+ /* 下位デバイスを検索 */
+ for ( i = 0; i < DEVVOL_MAX_DEVICE; i++ )
+ {
+ /* 名前部分探索 */
+ for ( iLen =0; pszPath[iLen] != '\0' && pszPath[iLen] != '/'; iLen++ )
+ ;
+
+ if ( strncmp(pszPath, self->DevTable[i].szName, iLen) == 0 )
+ {
+ break;
+ }
+ }
+ if ( i >= DEVVOL_MAX_DEVICE )
+ {
+ return HANDLE_NULL;
+ }
+
+ if ( pszPath[iLen] == '/' )
+ {
+ iLen++;
+ }
+
+ return DrvObj_vOpen(self->DevTable[i].pDrvObj, &pszPath[iLen], iMode);
+}
+
+
+/* end of file */
+
/**
* Hyper Operating System Application Framework
*
- * @file driveobj.h
- * @brief %jp{ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88}
+ * @file volumeobj.h
+ * @brief %jp{ã\83\9cã\83ªã\83¥ã\83¼ã\83 ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88å\9fºæ\9c¬ã\82¯ã\83©ã\82¹}
*
* Copyright (C) 2006 by Project HOS
* http://sourceforge.jp/projects/hos/
#include "system/handle/handleobj.h"
-#include "file.h"
+#include "system/file/drvobj.h"
/* ボリューム操作オブジェクトクラス基本メソッドテーブル */
+struct c_volumeobj;
typedef struct t_volumeobj_methods
{
- HANDLE (*pfncOpenFile)(HANDLE hVolume, const char *pszPath, int iMode); /* ファイルを開く */
- FILE_ERR (*pfncMakeDir)(HANDLE hVolume, const char *pszPath); /* サブディレクトリを作成 */
- FILE_ERR (*pfncRemove)(HANDLE hVolume, const char *pszPath); /* ファイルを削除 */
+ T_DRVOBJ_METHODS DrvObjMethods; /* DrvObjを継承 */
+
+ FILE_ERR (*pfncMakeDir)(struct c_volumeobj *self, const char *pszPath); /* サブディレクトリを作成 */
+ FILE_ERR (*pfncRemove)(struct c_volumeobj *self, const char *pszPath); /* ファイルを削除 */
} T_VOLUMEOBJ_METHODS;
typedef struct c_volumeobj
{
- const T_VOLUMEOBJ_METHODS *pMethods;
+ C_DRVOBJ DrvObj; /* DrvObjを継承 */
} C_VOLUMEOBJ;
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__ */
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
/* ハンドルを閉じる */
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);
+ }
}
/* ハンドルオブジェクトクラスのメソッドテーブル定義 */
typedef struct t_handleobj_methods
{
- void (*pfncDelete)(HANDLE handle); /* デストラクタ */
+ void (*pfncClose)(HANDLE handle); /* 閉じる */
} T_HANDLEOBJ_METHODS;
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
}
/* コンストラクタ */
void HandleObj_Create(C_HANDLEOBJ *self, const T_HANDLEOBJ_METHODS *pMethods)
{
+ /* 仮想関数テーブルの登録 */
self->pMethods = pMethods;
+
+ /* プロセスに紐付け(予定) */
}
/* デストラクタ */
void HandleObj_Delete(C_HANDLEOBJ *self)
{
- /* デストラクタが登録されていれば呼ぶ */
- if ( self->pMethods->pfncDelete != NULL )
- {
- self->pMethods->pfncDelete((HANDLE)self);
- }
+ /* プロセスの紐付け解除(予定) */
}
/* プロセスオブジェクト基本クラス定義 */
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;
const T_VOLUMEOBJ_METHODS DevVol_VolumeObjMethods =
{
- DevVol_OpenFile,
+ {
+ DevVol_Delete,
+ DevVol_OpenFile,
+
+ },
NULL,
NULL,
};
return HANDLE_NULL;
}
- return DrvObj_Open(self->DevTable[i].pDrvObj, pszPath, iMode);
+ return DrvObj_vOpen(self->DevTable[i].pDrvObj, pszPath, iMode);
}
AFLAGS += -NOLOGO
# %jp{インクルードパスオプションの定義}
-AFLAGS_INC = -I=$(subst $(space),$(comma),$(strip $(A_INC)))
+AFLAGS_INC =
# %jp{マクロ定義オプションの定義}
AFLAGS_DEF =