diff --git a/src/raspberrypi/disk.cpp b/src/raspberrypi/disk.cpp index fe38ebea..dbe3d34a 100644 --- a/src/raspberrypi/disk.cpp +++ b/src/raspberrypi/disk.cpp @@ -2366,7 +2366,7 @@ void FASTCALL SASIHD::Reset() disk.lock = FALSE; disk.attn = FALSE; - // リセットなし、コードをクリア + // Resetなし、コードをクリア disk.reset = FALSE; disk.code = 0x00; } @@ -2436,7 +2436,7 @@ BOOL FASTCALL SASIHD::Open(const Filepath& path, BOOL /*attn*/) case 0x2793000: break; - // その他(サポートしない) + // Other(サポートしない) default: return FALSE; } @@ -6281,7 +6281,7 @@ BUS::phase_t FASTCALL SASIDEV::Process() // Get bus information ctrl.bus->Aquire(); - // リセット + // Reset if (ctrl.bus->GetRST()) { #if defined(DISK_LOG) Log(Log::Normal, "RESET信号受信"); @@ -6332,7 +6332,7 @@ BUS::phase_t FASTCALL SASIDEV::Process() MsgIn(); break; - // その他 + // Other default: ASSERT(FALSE); break; diff --git a/src/raspberrypi/disk.h b/src/raspberrypi/disk.h index a539c905..40cb35e0 100644 --- a/src/raspberrypi/disk.h +++ b/src/raspberrypi/disk.h @@ -9,8 +9,9 @@ // Copyright (C) 2010-2015 isaki@NetBSD.org // // Imported sava's Anex86/T98Next image and MO format support patch. +// Comments translated to english by akuker. // -// [ ディスク ] +// [ Disk ] // //--------------------------------------------------------------------------- @@ -22,12 +23,12 @@ //--------------------------------------------------------------------------- // -// エラー定義(REQUEST SENSEで返されるセンスコード) +// Error definition (sense code returned by REQUEST SENSE) // -// MSB 予約(0x00) -// センスキー -// 拡張センスコード(ASC) -// LSB 拡張センスコードクォリファイア(ASCQ) +// MSB Reserved (0x00) +// Sense Key +// Additional Sense Code (ASC) +// LSB Additional Sense Code Qualifier(ASCQ) // //--------------------------------------------------------------------------- #define DISK_NOERROR 0x00000000 // NO ADDITIONAL SENSE INFO. @@ -60,549 +61,549 @@ //=========================================================================== // -// ディスクトラック +// Disk Track // //=========================================================================== class DiskTrack { public: - // 内部データ定義 + // Internal data definition typedef struct { - int track; // トラックナンバー - int size; // セクタサイズ(8 or 9) - int sectors; // セクタ数(<=0x100) - DWORD length; // データバッファ長 - BYTE *buffer; // データバッファ - BOOL init; // ロード済みか - BOOL changed; // 変更済みフラグ - DWORD maplen; // 変更済みマップ長 - BOOL *changemap; // 変更済みマップ - BOOL raw; // RAWモード - off64_t imgoffset; // 実データまでのオフセット + int track; // Track Number + int size; // Sector Size(8 or 9) + int sectors; // Number of sectors(<=0x100) + DWORD length; // Data buffer length + BYTE *buffer; // Data buffer + BOOL init; // Is it initilized? + BOOL changed; // Changed flag + DWORD maplen; // Changed map length + BOOL *changemap; // Changed map + BOOL raw; // RAW mode flag + off64_t imgoffset; // Offset to actual data } disktrk_t; public: - // 基本ファンクション + // Basic Functions DiskTrack(); - // コンストラクタ + // Constructor virtual ~DiskTrack(); - // デストラクタ + // Destructor void FASTCALL Init(int track, int size, int sectors, BOOL raw = FALSE, off64_t imgoff = 0); - // 初期化 + // Initialization BOOL FASTCALL Load(const Filepath& path); - // ロード + // Load BOOL FASTCALL Save(const Filepath& path); - // セーブ + // Save - // リード・ライト + // Read / Write BOOL FASTCALL Read(BYTE *buf, int sec) const; - // セクタリード + // Sector Read BOOL FASTCALL Write(const BYTE *buf, int sec); - // セクタライト + // Sector Write - // その他 + // Other int FASTCALL GetTrack() const { return dt.track; } - // トラック取得 + // Get track BOOL FASTCALL IsChanged() const { return dt.changed; } - // 変更フラグチェック + // Changed flag check private: - // 内部データ + // Internal data disktrk_t dt; - // 内部データ + // Internal data }; //=========================================================================== // -// ディスクキャッシュ +// Disk Cache // //=========================================================================== class DiskCache { public: - // 内部データ定義 + // Internal data definition typedef struct { - DiskTrack *disktrk; // 割り当てトラック - DWORD serial; // 最終シリアル + DiskTrack *disktrk; // Disk Track + DWORD serial; // Serial } cache_t; - // キャッシュ数 + // Number of caches enum { - CacheMax = 16 // キャッシュするトラック数 + CacheMax = 16 // Number of tracks to cache }; public: - // 基本ファンクション + // Basic Functions DiskCache(const Filepath& path, int size, int blocks, off64_t imgoff = 0); - // コンストラクタ + // Constructor virtual ~DiskCache(); - // デストラクタ + // Destructor void FASTCALL SetRawMode(BOOL raw); - // CD-ROM rawモード設定 + // CD-ROM raw mode setting - // アクセス + // Access BOOL FASTCALL Save(); - // 全セーブ&解放 + // Save and release all BOOL FASTCALL Read(BYTE *buf, int block); - // セクタリード + // Sector Read BOOL FASTCALL Write(const BYTE *buf, int block); - // セクタライト + // Sector Write BOOL FASTCALL GetCache(int index, int& track, DWORD& serial) const; - // キャッシュ情報取得 + // Get cache information private: - // 内部管理 + // Internal Management void FASTCALL Clear(); - // トラックをすべてクリア + // Clear all tracks DiskTrack* FASTCALL Assign(int track); - // トラックのロード + // Load track BOOL FASTCALL Load(int index, int track, DiskTrack *disktrk = NULL); - // トラックのロード + // Load track void FASTCALL Update(); - // シリアル番号更新 + // Update serial number - // 内部データ + // Internal data cache_t cache[CacheMax]; - // キャッシュ管理 + // Cache management DWORD serial; - // 最終アクセスシリアルナンバ + // Last serial number Filepath sec_path; - // パス + // Path int sec_size; - // セクタサイズ(8 or 9 or 11) + // Sector size (8 or 9 or 11) int sec_blocks; - // セクタブロック数 + // Blocks per sector BOOL cd_raw; - // CD-ROM RAWモード + // CD-ROM RAW mode off64_t imgoffset; - // 実データまでのオフセット + // Offset to actual data }; //=========================================================================== // -// ディスク +// Disk // //=========================================================================== class Disk { public: - // 内部ワーク + // Internal data structure typedef struct { - DWORD id; // メディアID - BOOL ready; // 有効なディスク - BOOL writep; // 書き込み禁止 - BOOL readonly; // 読み込み専用 - BOOL removable; // 取り外し - BOOL lock; // ロック - BOOL attn; // アテンション - BOOL reset; // リセット - int size; // セクタサイズ - DWORD blocks; // 総セクタ数 + DWORD id; // Media ID + BOOL ready; // Valid Disk + BOOL writep; // Write protected + BOOL readonly; // Read only + BOOL removable; // Removable + BOOL lock; // Locked + BOOL attn; // Attention + BOOL reset; // Reset + int size; // Sector Size + DWORD blocks; // Total number of sectors DWORD lun; // LUN - DWORD code; // ステータスコード - DiskCache *dcache; // ディスクキャッシュ - off64_t imgoffset; // 実データまでのオフセット + DWORD code; // Status code + DiskCache *dcache; // Disk cache + off64_t imgoffset; // Offset to actual data } disk_t; public: - // 基本ファンクション + // Basic Functions Disk(); - // コンストラクタ + // Constructor virtual ~Disk(); - // デストラクタ + // Destructor virtual void FASTCALL Reset(); - // デバイスリセット + // Device Reset #ifndef RASCSI virtual BOOL FASTCALL Save(Fileio *fio, int ver); - // セーブ + // Save virtual BOOL FASTCALL Load(Fileio *fio, int ver); - // ロード + // Load #endif // RASCSI // ID DWORD FASTCALL GetID() const { return disk.id; } - // メディアID取得 + // Get media ID BOOL FASTCALL IsNULL() const; - // NULLチェック + // NULL check BOOL FASTCALL IsSASI() const; - // SASIチェック + // SASI Check - // メディア操作 + // Media Operations virtual BOOL FASTCALL Open(const Filepath& path, BOOL attn = TRUE); - // オープン + // Open void FASTCALL GetPath(Filepath& path) const; - // パス取得 + // Get the path void FASTCALL Eject(BOOL force); - // イジェクト + // Eject BOOL FASTCALL IsReady() const { return disk.ready; } - // Readyチェック + // Ready check void FASTCALL WriteP(BOOL flag); - // 書き込み禁止 + // Set Write Protect flag BOOL FASTCALL IsWriteP() const { return disk.writep; } - // 書き込み禁止チェック + // Get write protect flag BOOL FASTCALL IsReadOnly() const { return disk.readonly; } - // Read Onlyチェック + // Get read only flag BOOL FASTCALL IsRemovable() const { return disk.removable; } - // リムーバブルチェック + // Get is removable flag BOOL FASTCALL IsLocked() const { return disk.lock; } - // ロックチェック + // Get locked status BOOL FASTCALL IsAttn() const { return disk.attn; } - // 交換チェック + // Get attention flag BOOL FASTCALL Flush(); - // キャッシュフラッシュ + // Flush the cache void FASTCALL GetDisk(disk_t *buffer) const; - // 内部ワーク取得 + // Get the internal data struct - // プロパティ + // Properties void FASTCALL SetLUN(DWORD lun) { disk.lun = lun; } - // LUNセット + // LUN set DWORD FASTCALL GetLUN() { return disk.lun; } - // LUN取得 - // コマンド + // LUN get + // commands virtual int FASTCALL Inquiry(const DWORD *cdb, BYTE *buf, DWORD major, DWORD minor); - // INQUIRYコマンド + // INQUIRY command virtual int FASTCALL RequestSense(const DWORD *cdb, BYTE *buf); - // REQUEST SENSEコマンド + // REQUEST SENSE command int FASTCALL SelectCheck(const DWORD *cdb); - // SELECTチェック + // SELECT check int FASTCALL SelectCheck10(const DWORD *cdb); - // SELECT(10)チェック + // SELECT(10) check virtual BOOL FASTCALL ModeSelect(const DWORD *cdb, const BYTE *buf, int length); - // MODE SELECTコマンド + // MODE SELECT command virtual int FASTCALL ModeSense(const DWORD *cdb, BYTE *buf); - // MODE SENSEコマンド + // MODE SENSE command virtual int FASTCALL ModeSense10(const DWORD *cdb, BYTE *buf); - // MODE SENSE(10)コマンド + // MODE SENSE(10) command int FASTCALL ReadDefectData10(const DWORD *cdb, BYTE *buf); - // READ DEFECT DATA(10)コマンド + // READ DEFECT DATA(10) command virtual BOOL FASTCALL TestUnitReady(const DWORD *cdb); - // TEST UNIT READYコマンド + // TEST UNIT READY command BOOL FASTCALL Rezero(const DWORD *cdb); - // REZEROコマンド + // REZERO command BOOL FASTCALL Format(const DWORD *cdb); - // FORMAT UNITコマンド + // FORMAT UNIT command BOOL FASTCALL Reassign(const DWORD *cdb); - // REASSIGN UNITコマンド + // REASSIGN UNIT command virtual int FASTCALL Read(BYTE *buf, DWORD block); - // READコマンド + // READ command int FASTCALL WriteCheck(DWORD block); - // WRITEチェック + // WRITE check BOOL FASTCALL Write(const BYTE *buf, DWORD block); - // WRITEコマンド + // WRITE command BOOL FASTCALL Seek(const DWORD *cdb); - // SEEKコマンド + // SEEK command BOOL FASTCALL Assign(const DWORD *cdb); - // ASSIGNコマンド + // ASSIGN command BOOL FASTCALL Specify(const DWORD *cdb); - // SPECIFYコマンド + // SPECIFY command BOOL FASTCALL StartStop(const DWORD *cdb); - // START STOP UNITコマンド + // START STOP UNIT command BOOL FASTCALL SendDiag(const DWORD *cdb); - // SEND DIAGNOSTICコマンド + // SEND DIAGNOSTIC command BOOL FASTCALL Removal(const DWORD *cdb); - // PREVENT/ALLOW MEDIUM REMOVALコマンド + // PREVENT/ALLOW MEDIUM REMOVAL command int FASTCALL ReadCapacity(const DWORD *cdb, BYTE *buf); - // READ CAPACITYコマンド + // READ CAPACITY command BOOL FASTCALL Verify(const DWORD *cdb); - // VERIFYコマンド + // VERIFY command virtual int FASTCALL ReadToc(const DWORD *cdb, BYTE *buf); - // READ TOCコマンド + // READ TOC command virtual BOOL FASTCALL PlayAudio(const DWORD *cdb); - // PLAY AUDIOコマンド + // PLAY AUDIO command virtual BOOL FASTCALL PlayAudioMSF(const DWORD *cdb); - // PLAY AUDIO MSFコマンド + // PLAY AUDIO MSF command virtual BOOL FASTCALL PlayAudioTrack(const DWORD *cdb); - // PLAY AUDIO TRACKコマンド + // PLAY AUDIO TRACK command void FASTCALL InvalidCmd() { disk.code = DISK_INVALIDCMD; } - // サポートしていないコマンド + // Unsupported command - // その他 + // Other BOOL IsCacheWB() { return cache_wb; } - // キャッシュモード取得 + // Get cache writeback mode void SetCacheWB(BOOL enable) { cache_wb = enable; } - // キャッシュモード設定 + // Set cache writeback mode protected: - // サブ処理 + // Internal processing virtual int FASTCALL AddError(BOOL change, BYTE *buf); - // エラーページ追加 + // Add error virtual int FASTCALL AddFormat(BOOL change, BYTE *buf); - // フォーマットページ追加 + // Add format virtual int FASTCALL AddDrive(BOOL change, BYTE *buf); - // ドライブページ追加 + // Add drive int FASTCALL AddOpt(BOOL change, BYTE *buf); - // オプティカルページ追加 + // Add optical int FASTCALL AddCache(BOOL change, BYTE *buf); - // キャッシュページ追加 + // Add cache int FASTCALL AddCDROM(BOOL change, BYTE *buf); - // CD-ROMページ追加 + // Add CD-ROM int FASTCALL AddCDDA(BOOL change, BYTE *buf); - // CD-DAページ追加 + // Add CD_DA virtual int FASTCALL AddVendor(int page, BOOL change, BYTE *buf); - // ベンダ特殊ページ追加 + // Add vendor special info BOOL FASTCALL CheckReady(); - // レディチェック + // Check if ready - // 内部データ + // Internal data disk_t disk; - // ディスク内部データ + // Internal disk data Filepath diskpath; - // パス(GetPath用) + // File path (for GetPath) BOOL cache_wb; - // キャッシュモード + // Cache mode }; //=========================================================================== // -// SASI ハードディスク +// SASI Hard Disk // //=========================================================================== class SASIHD : public Disk { public: - // 基本ファンクション + // Basic Functions SASIHD(); - // コンストラクタ + // Constructor void FASTCALL Reset(); - // リセット + // Reset BOOL FASTCALL Open(const Filepath& path, BOOL attn = TRUE); - // オープン - // コマンド + // Open + // commands int FASTCALL RequestSense(const DWORD *cdb, BYTE *buf); - // REQUEST SENSEコマンド + // REQUEST SENSE command }; //=========================================================================== // -// SCSI ハードディスク +// SCSI Hard Disk // //=========================================================================== class SCSIHD : public Disk { public: - // 基本ファンクション + // Basic Functions SCSIHD(); - // コンストラクタ + // Constructor void FASTCALL Reset(); - // リセット + // Reset BOOL FASTCALL Open(const Filepath& path, BOOL attn = TRUE); - // オープン + // Open - // コマンド + // commands int FASTCALL Inquiry( const DWORD *cdb, BYTE *buf, DWORD major, DWORD minor); - // INQUIRYコマンド + // INQUIRY command BOOL FASTCALL ModeSelect(const DWORD *cdb, const BYTE *buf, int length); - // MODE SELECT(6)コマンド + // MODE SELECT(6) command }; //=========================================================================== // -// SCSI ハードディスク(PC-9801-55 NEC純正/Anex86/T98Next) +// SCSI hard disk (PC-9801-55 NEC genuine /Anex86/T98Next) // //=========================================================================== class SCSIHD_NEC : public SCSIHD { public: - // 基本ファンクション + // Basic Functions SCSIHD_NEC(); - // コンストラクタ + // Constructor BOOL FASTCALL Open(const Filepath& path, BOOL attn = TRUE); - // オープン + // Open - // コマンド + // commands int FASTCALL Inquiry( const DWORD *cdb, BYTE *buf, DWORD major, DWORD minor); - // INQUIRYコマンド + // INQUIRY command - // サブ処理 + // Internal processing int FASTCALL AddError(BOOL change, BYTE *buf); - // エラーページ追加 + // Add error int FASTCALL AddFormat(BOOL change, BYTE *buf); - // フォーマットページ追加 + // Add format int FASTCALL AddDrive(BOOL change, BYTE *buf); - // ドライブページ追加 + // Add drive private: int cylinders; - // シリンダ数 + // Number of cylinders int heads; - // ヘッド数 + // Number of heads int sectors; - // セクタ数 + // Number of sectors int sectorsize; - // セクタサイズ + // Sector size off64_t imgoffset; - // イメージオフセット + // Image offset off64_t imgsize; - // イメージサイズ + // Image size }; //=========================================================================== // -// SCSI ハードディスク(Macintosh Apple純正) +// SCSI Hard Disk(Genuine Apple Macintosh) // //=========================================================================== class SCSIHD_APPLE : public SCSIHD { public: - // 基本ファンクション + // Basic Functions SCSIHD_APPLE(); - // コンストラクタ - // コマンド + // Constructor + // commands int FASTCALL Inquiry( const DWORD *cdb, BYTE *buf, DWORD major, DWORD minor); - // INQUIRYコマンド + // INQUIRY command - // サブ処理 + // Internal processing int FASTCALL AddVendor(int page, BOOL change, BYTE *buf); - // ベンダ特殊ページ追加 + // Add vendor special page }; //=========================================================================== // -// SCSI 光磁気ディスク +// SCSI magneto-optical disk // //=========================================================================== class SCSIMO : public Disk { public: - // 基本ファンクション + // Basic Functions SCSIMO(); - // コンストラクタ + // Constructor BOOL FASTCALL Open(const Filepath& path, BOOL attn = TRUE); - // オープン + // Open #ifndef RASCSI BOOL FASTCALL Load(Fileio *fio, int ver); - // ロード + // Load #endif // RASCSI - // コマンド + // commands int FASTCALL Inquiry(const DWORD *cdb, BYTE *buf, DWORD major, DWORD minor); - // INQUIRYコマンド + // INQUIRY command BOOL FASTCALL ModeSelect(const DWORD *cdb, const BYTE *buf, int length); - // MODE SELECT(6)コマンド + // MODE SELECT(6) command - // サブ処理 + // Internal processing int FASTCALL AddVendor(int page, BOOL change, BYTE *buf); - // ベンダ特殊ページ追加 + // Add vendor special page }; //--------------------------------------------------------------------------- // -// クラス先行定義 +// Class precedence definition // //--------------------------------------------------------------------------- class SCSICD; //=========================================================================== // -// CD-ROM トラック +// CD-ROM Track // //=========================================================================== class CDTrack { public: - // 基本ファンクション + // Basic Functions CDTrack(SCSICD *scsicd); - // コンストラクタ + // Constructor virtual ~CDTrack(); - // デストラクタ + // Destructor BOOL FASTCALL Init(int track, DWORD first, DWORD last); - // 初期化 + // Initialization - // プロパティ + // Properties void FASTCALL SetPath(BOOL cdda, const Filepath& path); - // パス設定 + // Set the path void FASTCALL GetPath(Filepath& path) const; - // パス取得 + // Get the path void FASTCALL AddIndex(int index, DWORD lba); - // インデックス追加 + // Add index DWORD FASTCALL GetFirst() const; - // 開始LBA取得 + // Get the start LBA DWORD FASTCALL GetLast() const; - // 終端LBA取得 + // Get the last LBA DWORD FASTCALL GetBlocks() const; - // ブロック数取得 + // Get the number of blocks int FASTCALL GetTrackNo() const; - // トラック番号取得 + // Get the track number BOOL FASTCALL IsValid(DWORD lba) const; - // 有効なLBAか + // Is this a valid LBA? BOOL FASTCALL IsAudio() const; - // オーディオトラックか + // Is this an audio track? private: SCSICD *cdrom; - // 親デバイス + // Parent device BOOL valid; - // 有効なトラック + // Valid track int track_no; - // トラック番号 + // Track number DWORD first_lba; - // 開始LBA + // First LBA DWORD last_lba; - // 終了LBA + // Last LBA BOOL audio; - // オーディオトラックフラグ + // Audio track flag BOOL raw; - // RAWデータフラグ + // RAW data flag Filepath imgpath; - // イメージファイルパス + // Image file path }; //=========================================================================== // -// CD-DA バッファ +// CD-DA Buffer // //=========================================================================== class CDDABuf { public: - // 基本ファンクション + // Basic Functions CDDABuf(); - // コンストラクタ + // Constructor virtual ~CDDABuf(); - // デストラクタ + // Destructor #if 0 BOOL Init(); - // 初期化 + // Initialization BOOL FASTCALL Load(const Filepath& path); - // ロード + // Load BOOL FASTCALL Save(const Filepath& path); - // セーブ + // Save // API void FASTCALL Clear(); - // バッファクリア + // Clear the buffer BOOL FASTCALL Open(Filepath& path); - // ファイル指定 + // File specification BOOL FASTCALL GetBuf(DWORD *buffer, int frames); - // バッファ取得 + // Get the buffer BOOL FASTCALL IsValid(); - // 有効チェック + // Check if Valid BOOL FASTCALL ReadReq(); - // 読み込み要求 + // Read Request BOOL FASTCALL IsEnd() const; - // 終了チェック + // Finish check private: Filepath wavepath; - // Waveパス + // Wave path BOOL valid; - // オープン結果 + // Open result (is it valid?) DWORD *buf; - // データバッファ + // Data buffer DWORD read; - // Readポインタ + // Read pointer DWORD write; - // Writeポインタ + // Write pointer DWORD num; - // データ有効数 + // Valid number of data DWORD rest; - // ファイル残りサイズ + // Remaining file size #endif }; @@ -614,95 +615,95 @@ private: class SCSICD : public Disk { public: - // トラック数 + // Number of tracks enum { - TrackMax = 96 // トラック最大数 + TrackMax = 96 // Maximum number of tracks }; public: - // 基本ファンクション + // Basic Functions SCSICD(); - // コンストラクタ + // Constructor virtual ~SCSICD(); - // デストラクタ + // Destructor BOOL FASTCALL Open(const Filepath& path, BOOL attn = TRUE); - // オープン + // Open #ifndef RASCSI BOOL FASTCALL Load(Fileio *fio, int ver); - // ロード + // Load #endif // RASCSI - // コマンド + // commands int FASTCALL Inquiry(const DWORD *cdb, BYTE *buf, DWORD major, DWORD minor); - // INQUIRYコマンド + // INQUIRY command int FASTCALL Read(BYTE *buf, DWORD block); - // READコマンド + // READ command int FASTCALL ReadToc(const DWORD *cdb, BYTE *buf); - // READ TOCコマンド + // READ TOC command BOOL FASTCALL PlayAudio(const DWORD *cdb); - // PLAY AUDIOコマンド + // PLAY AUDIO command BOOL FASTCALL PlayAudioMSF(const DWORD *cdb); - // PLAY AUDIO MSFコマンド + // PLAY AUDIO MSF command BOOL FASTCALL PlayAudioTrack(const DWORD *cdb); - // PLAY AUDIO TRACKコマンド + // PLAY AUDIO TRACK command // CD-DA BOOL FASTCALL NextFrame(); - // フレーム通知 + // Frame notification void FASTCALL GetBuf(DWORD *buffer, int samples, DWORD rate); - // CD-DAバッファ取得 + // Get CD-DA buffer // LBA-MSF変換 void FASTCALL LBAtoMSF(DWORD lba, BYTE *msf) const; - // LBA→MSF変換 + // LBA→MSF conversion DWORD FASTCALL MSFtoLBA(const BYTE *msf) const; - // MSF→LBA変換 + // MSF→LBA conversion private: - // オープン + // Open BOOL FASTCALL OpenCue(const Filepath& path); - // オープン(CUE) + // Open(CUE) BOOL FASTCALL OpenIso(const Filepath& path); - // オープン(ISO) + // Open(ISO) BOOL FASTCALL OpenPhysical(const Filepath& path); - // オープン(Physical) + // Open(Physical) BOOL rawfile; - // RAWフラグ + // RAW flag - // トラック管理 + // Track management void FASTCALL ClearTrack(); - // トラッククリア + // Clear the track int FASTCALL SearchTrack(DWORD lba) const; - // トラック検索 + // Track search CDTrack* track[TrackMax]; - // トラックオブジェクト + // Track opbject references int tracks; - // トラックオブジェクト有効数 + // Effective number of track objects int dataindex; - // 現在のデータトラック + // Current data track int audioindex; - // 現在のオーディオトラック + // Current audio track int frame; - // フレーム番号 + // Frame number #if 0 CDDABuf da_buf; - // CD-DAバッファ + // CD-DA buffer int da_num; - // CD-DAトラック数 + // Number of CD-DA tracks int da_cur; - // CD-DAカレントトラック + // CD-DA current track int da_next; - // CD-DAネクストトラック + // CD-DA next track BOOL da_req; - // CD-DAデータ要求 + // CD-DA data request #endif }; //=========================================================================== // -// SCSI ホストブリッジ +// SCSI Host Bridge // //=========================================================================== #if defined(RASCSI) && !defined(BAREMETAL) @@ -712,430 +713,429 @@ class CFileSys; class SCSIBR : public Disk { public: - // 基本ファンクション + // Basic Functions SCSIBR(); - // コンストラクタ + // Constructor virtual ~SCSIBR(); - // デストラクタ + // Destructor - // コマンド + // commands int FASTCALL Inquiry(const DWORD *cdb, BYTE *buf, DWORD major, DWORD minor); - // INQUIRYコマンド + // INQUIRY command BOOL FASTCALL TestUnitReady(const DWORD *cdb); - // TEST UNIT READYコマンド + // TEST UNIT READY command int FASTCALL GetMessage10(const DWORD *cdb, BYTE *buf); - // GET MESSAGE10コマンド + // GET MESSAGE10 command BOOL FASTCALL SendMessage10(const DWORD *cdb, BYTE *buf); - // SEND MESSAGE10コマンド + // SEND MESSAGE10 command private: #if defined(RASCSI) && !defined(BAREMETAL) int FASTCALL GetMacAddr(BYTE *buf); - // MACアドレス取得 + // Get MAC address void FASTCALL SetMacAddr(BYTE *buf); - // MACアドレス設定 + // Set MAC address void FASTCALL ReceivePacket(); - // パケット受信 + // Receive a packet void FASTCALL GetPacketBuf(BYTE *buf); - // パケット取得 + // Get a packet void FASTCALL SendPacket(BYTE *buf, int len); - // パケット送信 + // Send a packet CTapDriver *tap; - // TAPドライバ + // TAP driver BOOL m_bTapEnable; - // TAP有効フラグ + // TAP valid flag BYTE mac_addr[6]; - // MACアドレス + // MAC Addres int packet_len; - // 受信パケットサイズ + // Receive packet size BYTE packet_buf[0x1000]; - // 受信パケットバッファ + // Receive packet buffer BOOL packet_enable; - // 受信パケット有効 + // Received packet valid #endif // RASCSI && !BAREMETAL int FASTCALL ReadFsResult(BYTE *buf); - // ファイルシステム読み込み(結果コード) + // Read filesystem (result code) int FASTCALL ReadFsOut(BYTE *buf); - // ファイルシステム読み込み(返却データ) + // Read filesystem (return data) int FASTCALL ReadFsOpt(BYTE *buf); - // ファイルシステム読み込み(オプションデータ) + // Read file system (optional data) void FASTCALL WriteFs(int func, BYTE *buf); - // ファイルシステム書き込み(実行) + // File system write (execute) void FASTCALL WriteFsOpt(BYTE *buf, int len); - // ファイルシステム書き込み(オプションデータ) - - // コマンドハンドラ + // File system write (optional data) + // Command handlers void FASTCALL FS_InitDevice(BYTE *buf); - // $40 - デバイス起動 + // $40 - boot void FASTCALL FS_CheckDir(BYTE *buf); - // $41 - ディレクトリチェック + // $41 - directory check void FASTCALL FS_MakeDir(BYTE *buf); - // $42 - ディレクトリ作成 + // $42 - create directory void FASTCALL FS_RemoveDir(BYTE *buf); - // $43 - ディレクトリ削除 + // $43 - delete directory void FASTCALL FS_Rename(BYTE *buf); - // $44 - ファイル名変更 + // $44 - change filename void FASTCALL FS_Delete(BYTE *buf); - // $45 - ファイル削除 + // $45 - delete file void FASTCALL FS_Attribute(BYTE *buf); - // $46 - ファイル属性取得/設定 + // $46 - get/set file attributes void FASTCALL FS_Files(BYTE *buf); - // $47 - ファイル検索 + // $47 - file search void FASTCALL FS_NFiles(BYTE *buf); - // $48 - ファイル次検索 + // $48 - find next file void FASTCALL FS_Create(BYTE *buf); - // $49 - ファイル作成 + // $49 - create file void FASTCALL FS_Open(BYTE *buf); - // $4A - ファイルオープン + // $4A - open file void FASTCALL FS_Close(BYTE *buf); - // $4B - ファイルクローズ + // $4B - close file void FASTCALL FS_Read(BYTE *buf); - // $4C - ファイル読み込み + // $4C - read file void FASTCALL FS_Write(BYTE *buf); - // $4D - ファイル書き込み + // $4D - write file void FASTCALL FS_Seek(BYTE *buf); - // $4E - ファイルシーク + // $4E - seek file void FASTCALL FS_TimeStamp(BYTE *buf); - // $4F - ファイル時刻取得/設定 + // $4F - get/set file time void FASTCALL FS_GetCapacity(BYTE *buf); - // $50 - 容量取得 + // $50 - get capacity void FASTCALL FS_CtrlDrive(BYTE *buf); - // $51 - ドライブ状態検査/制御 + // $51 - drive status check/control void FASTCALL FS_GetDPB(BYTE *buf); - // $52 - DPB取得 + // $52 - get DPB void FASTCALL FS_DiskRead(BYTE *buf); - // $53 - セクタ読み込み + // $53 - read sector void FASTCALL FS_DiskWrite(BYTE *buf); - // $54 - セクタ書き込み + // $54 - write sector void FASTCALL FS_Ioctrl(BYTE *buf); // $55 - IOCTRL void FASTCALL FS_Flush(BYTE *buf); - // $56 - フラッシュ + // $56 - flush cache void FASTCALL FS_CheckMedia(BYTE *buf); - // $57 - メディア交換チェック + // $57 - check media void FASTCALL FS_Lock(BYTE *buf); - // $58 - 排他制御 + // $58 - get exclusive control CFileSys *fs; - // ファイルシステムアクセッサー + // File system accessor DWORD fsresult; - // ファイルシステムアクセス結果コード + // File system access result code BYTE fsout[0x800]; - // ファイルシステムアクセス結果バッファ + // File system access result buffer DWORD fsoutlen; - // ファイルシステムアクセス結果バッファサイズ + // File system access result buffer size BYTE fsopt[0x1000000]; - // ファイルシステムアクセスバッファ + // File system access buffer DWORD fsoptlen; - // ファイルシステムアクセスバッファサイズ + // File system access buffer size }; //=========================================================================== // -// SASI コントローラ +// SASI Controller // //=========================================================================== class SASIDEV { public: - // 論理ユニット最大数 + // Maximum number of logical units enum { UnitMax = 8 }; #ifdef RASCSI - // タイミング調整用 + // For timing adjustments enum { min_exec_time_sasi = 100, // SASI BOOT/FORMAT 30:NG 35:OK min_exec_time_scsi = 50 }; #endif // RASCSI - // 内部データ定義 + // Internal data definition typedef struct { // 全般 - BUS::phase_t phase; // 遷移フェーズ - int id; // コントローラID(0-7) - BUS *bus; // バス + BUS::phase_t phase; // Transition phase + int id; // Controller ID (0-7) + BUS *bus; // Bus - // コマンド - DWORD cmd[10]; // コマンドデータ - DWORD status; // ステータスデータ - DWORD message; // メッセージデータ + // commands + DWORD cmd[10]; // Command data + DWORD status; // Status data + DWORD message; // Message data #ifdef RASCSI - // 実行 - DWORD execstart; // 実行開始時間 + // Run + DWORD execstart; // Execution start time #endif // RASCSI - // 転送 - BYTE *buffer; // 転送バッファ - int bufsize; // 転送バッファサイズ - DWORD blocks; // 転送ブロック数 - DWORD next; // 次のレコード - DWORD offset; // 転送オフセット - DWORD length; // 転送残り長さ + // Transfer + BYTE *buffer; // Transfer data buffer + int bufsize; // Transfer data buffer size + DWORD blocks; // Number of transfer block + DWORD next; // Next record + DWORD offset; // Transfer offset + DWORD length; // Transfer remaining length - // 論理ユニット + // Logical unit Disk *unit[UnitMax]; - // 論理ユニット + // Logical Unit } ctrl_t; public: - // 基本ファンクション + // Basic Functions #ifdef RASCSI SASIDEV(); #else SASIDEV(Device *dev); #endif //RASCSI - // コンストラクタ + // Constructor virtual ~SASIDEV(); - // デストラクタ + // Destructor virtual void FASTCALL Reset(); - // デバイスリセット + // Device Reset #ifndef RASCSI virtual BOOL FASTCALL Save(Fileio *fio, int ver); - // セーブ + // Save virtual BOOL FASTCALL Load(Fileio *fio, int ver); - // ロード + // Load #endif //RASCSI - // 外部API + // External API virtual BUS::phase_t FASTCALL Process(); - // 実行 + // Run - // 接続 + // Connect void FASTCALL Connect(int id, BUS *sbus); - // コントローラ接続 + // Controller connection Disk* FASTCALL GetUnit(int no); - // 論理ユニット取得 + // Get logical unit void FASTCALL SetUnit(int no, Disk *dev); - // 論理ユニット設定 + // Logical unit setting BOOL FASTCALL HasUnit(); - // 有効な論理ユニットを持っているか返す + // Has a valid logical unit - // その他 + // Other BUS::phase_t FASTCALL GetPhase() {return ctrl.phase;} - // フェーズ取得 + // Get the phase int FASTCALL GetID() {return ctrl.id;} - // ID取得 + // Get the ID void FASTCALL GetCTRL(ctrl_t *buffer); - // 内部情報取得 + // Get the internal information ctrl_t* FASTCALL GetWorkAddr() { return &ctrl; } - // 内部情報アドレス取得 + // Get the internal information address virtual BOOL FASTCALL IsSASI() const {return TRUE;} - // SASIチェック + // SASI Check virtual BOOL FASTCALL IsSCSI() const {return FALSE;} - // SCSIチェック + // SCSI check Disk* FASTCALL GetBusyUnit(); - // ビジー状態のユニットを取得 + // Get the busy unit protected: - // フェーズ処理 + // Phase processing virtual void FASTCALL BusFree(); - // バスフリーフェーズ + // Bus free phase virtual void FASTCALL Selection(); - // セレクションフェーズ + // Selection phase virtual void FASTCALL Command(); - // コマンドフェーズ + // Command phase virtual void FASTCALL Execute(); - // 実行フェーズ + // Execution phase void FASTCALL Status(); - // ステータスフェーズ + // Status phase void FASTCALL MsgIn(); - // メッセージインフェーズ + // Message in phase void FASTCALL DataIn(); - // データインフェーズ + // Data in phase void FASTCALL DataOut(); - // データアウトフェーズ + // Data out phase virtual void FASTCALL Error(); - // 共通エラー処理 + // Common error handling - // コマンド + // commands void FASTCALL CmdTestUnitReady(); - // TEST UNIT READYコマンド + // TEST UNIT READY command void FASTCALL CmdRezero(); - // REZERO UNITコマンド + // REZERO UNIT command void FASTCALL CmdRequestSense(); - // REQUEST SENSEコマンド + // REQUEST SENSE command void FASTCALL CmdFormat(); - // FORMATコマンド + // FORMAT command void FASTCALL CmdReassign(); - // REASSIGN BLOCKSコマンド + // REASSIGN BLOCKS command void FASTCALL CmdRead6(); - // READ(6)コマンド + // READ(6) command void FASTCALL CmdWrite6(); - // WRITE(6)コマンド + // WRITE(6) command void FASTCALL CmdSeek6(); - // SEEK(6)コマンド + // SEEK(6) command void FASTCALL CmdAssign(); - // ASSIGNコマンド + // ASSIGN command void FASTCALL CmdSpecify(); - // SPECIFYコマンド + // SPECIFY command void FASTCALL CmdInvalid(); - // サポートしていないコマンド + // Unsupported command // データ転送 virtual void FASTCALL Send(); - // データ送信 + // Send data #ifndef RASCSI virtual void FASTCALL SendNext(); - // データ送信継続 + // Continue sending data #endif // RASCSI virtual void FASTCALL Receive(); - // データ受信 + // Receive data #ifndef RASCSI virtual void FASTCALL ReceiveNext(); - // データ受信継続 + // Continue receiving data #endif // RASCSI BOOL FASTCALL XferIn(BYTE* buf); - // データ転送IN + // Data transfer IN BOOL FASTCALL XferOut(BOOL cont); - // データ転送OUT + // Data transfer OUT - // 特殊 + // Special operations void FASTCALL FlushUnit(); - // 論理ユニットフラッシュ + // Flush the logical unit - // ログ + // Log void FASTCALL Log(Log::loglevel level, const char *format, ...); - // ログ出力 + // Log output protected: #ifndef RASCSI Device *host; - // ホストデバイス + // Host device #endif // RASCSI ctrl_t ctrl; - // 内部データ + // Internal data }; //=========================================================================== // -// SCSI デバイス(SASI デバイスを継承) +// SCSI Device (Interits SASI device) // //=========================================================================== class SCSIDEV : public SASIDEV { public: - // 内部データ定義 + // Internal data definition typedef struct { - // 同期転送 - BOOL syncenable; // 同期転送可能 - int syncperiod; // 同期転送ピリオド - int syncoffset; // 同期転送オフセット - int syncack; // 同期転送ACK数 + // Synchronous transfer + BOOL syncenable; // Synchronous transfer possible + int syncperiod; // Synchronous transfer period + int syncoffset; // Synchronous transfer offset + int syncack; // Number of synchronous transfer ACKs - // ATNメッセージ + // ATN message BOOL atnmsg; int msc; BYTE msb[256]; } scsi_t; public: - // 基本ファンクション + // Basic Functions #ifdef RASCSI SCSIDEV(); #else SCSIDEV(Device *dev); #endif // RASCSI - // コンストラクタ + // Constructor void FASTCALL Reset(); - // デバイスリセット + // Device Reset // 外部API BUS::phase_t FASTCALL Process(); - // 実行 + // Run void FASTCALL SyncTransfer(BOOL enable) { scsi.syncenable = enable; } - // 同期転送可能設定 + // Synchronouse transfer enable setting - // その他 + // Other BOOL FASTCALL IsSASI() const {return FALSE;} - // SASIチェック + // SASI Check BOOL FASTCALL IsSCSI() const {return TRUE;} - // SCSIチェック + // SCSI check private: - // フェーズ + // Phase void FASTCALL BusFree(); - // バスフリーフェーズ + // Bus free phase void FASTCALL Selection(); - // セレクションフェーズ + // Selection phase void FASTCALL Execute(); - // 実行フェーズ + // Execution phase void FASTCALL MsgOut(); - // メッセージアウトフェーズ + // Message out phase void FASTCALL Error(); - // 共通エラー処理 + // Common erorr handling - // コマンド + // commands void FASTCALL CmdInquiry(); - // INQUIRYコマンド + // INQUIRY command void FASTCALL CmdModeSelect(); - // MODE SELECTコマンド + // MODE SELECT command void FASTCALL CmdModeSense(); - // MODE SENSEコマンド + // MODE SENSE command void FASTCALL CmdStartStop(); - // START STOP UNITコマンド + // START STOP UNIT command void FASTCALL CmdSendDiag(); - // SEND DIAGNOSTICコマンド + // SEND DIAGNOSTIC command void FASTCALL CmdRemoval(); - // PREVENT/ALLOW MEDIUM REMOVALコマンド + // PREVENT/ALLOW MEDIUM REMOVAL command void FASTCALL CmdReadCapacity(); - // READ CAPACITYコマンド + // READ CAPACITY command void FASTCALL CmdRead10(); - // READ(10)コマンド + // READ(10) command void FASTCALL CmdWrite10(); - // WRITE(10)コマンド + // WRITE(10) command void FASTCALL CmdSeek10(); - // SEEK(10)コマンド + // SEEK(10) command void FASTCALL CmdVerify(); - // VERIFYコマンド + // VERIFY command void FASTCALL CmdSynchronizeCache(); - // SYNCHRONIZE CACHE コマンド + // SYNCHRONIZE CACHE command void FASTCALL CmdReadDefectData10(); - // READ DEFECT DATA(10) コマンド + // READ DEFECT DATA(10) command void FASTCALL CmdReadToc(); - // READ TOCコマンド + // READ TOC command void FASTCALL CmdPlayAudio10(); - // PLAY AUDIO(10)コマンド + // PLAY AUDIO(10) command void FASTCALL CmdPlayAudioMSF(); - // PLAY AUDIO MSFコマンド + // PLAY AUDIO MSF command void FASTCALL CmdPlayAudioTrack(); - // PLAY AUDIO TRACK INDEXコマンド + // PLAY AUDIO TRACK INDEX command void FASTCALL CmdModeSelect10(); - // MODE SELECT(10)コマンド + // MODE SELECT(10) command void FASTCALL CmdModeSense10(); - // MODE SENSE(10)コマンド + // MODE SENSE(10) command void FASTCALL CmdGetMessage10(); - // GET MESSAGE(10)コマンド + // GET MESSAGE(10) command void FASTCALL CmdSendMessage10(); - // SEND MESSAGE(10)コマンド + // SEND MESSAGE(10) command // データ転送 void FASTCALL Send(); - // データ送信 + // Send data #ifndef RASCSI void FASTCALL SendNext(); - // データ送信継続 + // Continue sending data #endif // RASCSI void FASTCALL Receive(); - // データ受信 + // Receive data #ifndef RASCSI void FASTCALL ReceiveNext(); - // データ受信継続 + // Continue receiving data #endif // RASCSI BOOL FASTCALL XferMsg(DWORD msg); - // データ転送MSG + // Data transfer message scsi_t scsi; - // 内部データ + // Internal data }; #endif // disk_h diff --git a/src/raspberrypi/gpiobus.cpp b/src/raspberrypi/gpiobus.cpp index 69ab840c..e0b8386a 100644 --- a/src/raspberrypi/gpiobus.cpp +++ b/src/raspberrypi/gpiobus.cpp @@ -8,7 +8,7 @@ // // Imported NetBSD support and some optimisation patch by Rin Okuyama. // -// [ GPIO-SCSIバス ] +// [ GPIO-SCSI bus ] // //--------------------------------------------------------------------------- @@ -59,7 +59,7 @@ DWORD bcm_host_get_peripheral_address(void) #endif // __linux__ #ifdef __NetBSD__ -// Raspberry Piシリーズを仮定してCPUからアドレスを推定 +// Assume the Raspberry Pi series and estimate the address from CPU DWORD bcm_host_get_peripheral_address(void) { char buf[1024]; @@ -68,11 +68,11 @@ DWORD bcm_host_get_peripheral_address(void) if (sysctlbyname("hw.model", buf, &len, NULL, 0) || strstr(buf, "ARM1176JZ-S") != buf) { - // CPUモデルの取得に失敗 || BCM2835ではない - // BCM283[67]のアドレスを使用 + // Failed to get CPU model || Not BCM2835 + // use the address of BCM283[67] address = 0x3f000000; } else { - // BCM2835のアドレスを使用 + // Use BCM2835 address address = 0x20000000; } printf("Peripheral address : 0x%lx\n", address); @@ -82,16 +82,16 @@ DWORD bcm_host_get_peripheral_address(void) #endif // BAREMETAL #ifdef BAREMETAL -// IOベースアドレス +// IO base address extern uint32_t RPi_IO_Base_Addr; -// コア周波数 +// Core frequency extern uint32_t RPi_Core_Freq; #ifdef USE_SEL_EVENT_ENABLE //--------------------------------------------------------------------------- // -// 割り込み制御関数 +// Interrupt control function // //--------------------------------------------------------------------------- extern "C" { @@ -103,14 +103,14 @@ extern void WaitForInterrupts (void); //--------------------------------------------------------------------------- // -// 割り込みハンドラ +// Interrupt handler // //--------------------------------------------------------------------------- static GPIOBUS *self; extern "C" void IrqHandler() { - // 割り込みクリア + // Clear interrupt self->ClearSelectEvent(); } #endif // USE_SEL_EVENT_ENABLE @@ -118,7 +118,7 @@ void IrqHandler() //--------------------------------------------------------------------------- // -// コンストラクタ +// Constructor // //--------------------------------------------------------------------------- GPIOBUS::GPIOBUS() @@ -130,7 +130,7 @@ GPIOBUS::GPIOBUS() //--------------------------------------------------------------------------- // -// デストラクタ +// Destructor // //--------------------------------------------------------------------------- GPIOBUS::~GPIOBUS() @@ -155,24 +155,24 @@ BOOL FASTCALL GPIOBUS::Init(mode_e mode) #endif // USE_SEL_EVENT_ENABLE #endif // BAREMETAL - // 動作モードの保存 + // Save operation mode actmode = mode; #ifdef BAREMETAL - // ベースアドレスの取得 + // Get the base address baseaddr = RPi_IO_Base_Addr; map = (void*)baseaddr; #else - // ベースアドレスの取得 + // Get the base address baseaddr = (DWORD)bcm_host_get_peripheral_address(); - // /dev/memオープン + // Open /dev/mem fd = open("/dev/mem", O_RDWR | O_SYNC); if (fd == -1) { return FALSE; } - // ペリフェラルリージョンのメモリをマップ + // Map peripheral region memory map = mmap(NULL, 0x1000100, PROT_READ | PROT_WRITE, MAP_SHARED, fd, baseaddr); if (map == MAP_FAILED) { @@ -180,7 +180,7 @@ BOOL FASTCALL GPIOBUS::Init(mode_e mode) return FALSE; } #endif - // ベースアドレスからラズパイのタイプを決定 + // Determine the type of raspberry pi from the base address if (baseaddr == 0xfe000000) { rpitype = 4; } else if (baseaddr == 0x3f000000) { @@ -198,12 +198,12 @@ BOOL FASTCALL GPIOBUS::Init(mode_e mode) pads = (DWORD *)map; pads += PADS_OFFSET / sizeof(DWORD); - // システムタイマ + // System timer SysTimer::Init( (DWORD *)map + SYST_OFFSET / sizeof(DWORD), (DWORD *)map + ARMT_OFFSET / sizeof(DWORD)); - // 割り込みコントローラ + // Interrupt controller irpctl = (DWORD *)map; irpctl += IRPT_OFFSET / sizeof(DWORD); @@ -214,7 +214,7 @@ BOOL FASTCALL GPIOBUS::Init(mode_e mode) #endif // BAREMETAL #ifdef BAREMETAL - // GICのメモリをマップ + // Map GIC memory if (rpitype == 4) { map = (void*)ARM_GICD_BASE; gicd = (DWORD *)map; @@ -225,7 +225,7 @@ BOOL FASTCALL GPIOBUS::Init(mode_e mode) gicc = NULL; } #else - // GICのメモリをマップ + // Map GIC memory if (rpitype == 4) { map = mmap(NULL, 8192, PROT_READ | PROT_WRITE, MAP_SHARED, fd, ARM_GICD_BASE); @@ -243,10 +243,10 @@ BOOL FASTCALL GPIOBUS::Init(mode_e mode) close(fd); #endif // BAREMETAL - // Drive Strengthを16mAに設定 + // Set Drive Strength to 16mA DrvConfig(7); - // プルアップ/プルダウンを設定 + // Set pull up/pull down #if SIGNAL_CONTROL_MODE == 0 pullmode = GPIO_PULLNONE; #elif SIGNAL_CONTROL_MODE == 1 @@ -255,7 +255,7 @@ BOOL FASTCALL GPIOBUS::Init(mode_e mode) pullmode = GPIO_PULLDOWN; #endif - // 全信号初期化 + // Initialize all signals for (i = 0; SignalTable[i] >= 0; i++) { j = SignalTable[i]; PinSetSignal(j, FALSE); @@ -263,7 +263,7 @@ BOOL FASTCALL GPIOBUS::Init(mode_e mode) PullConfig(j, pullmode); } - // 制御信号を設定 + // Set control signals PinSetSignal(PIN_ACT, FALSE); PinSetSignal(PIN_TAD, FALSE); PinSetSignal(PIN_IND, FALSE); @@ -273,26 +273,26 @@ BOOL FASTCALL GPIOBUS::Init(mode_e mode) PinConfig(PIN_IND, GPIO_OUTPUT); PinConfig(PIN_DTD, GPIO_OUTPUT); - // ENABLE信号を設定 + // Set the ENABLE signal PinSetSignal(PIN_ENB, ENB_OFF); PinConfig(PIN_ENB, GPIO_OUTPUT); - // GPFSELバックアップ + // GPFSEL backup gpfsel[0] = gpio[GPIO_FSEL_0]; gpfsel[1] = gpio[GPIO_FSEL_1]; gpfsel[2] = gpio[GPIO_FSEL_2]; gpfsel[3] = gpio[GPIO_FSEL_3]; - // SEL信号割り込み初期化 + // Initialize SEL signal interrupt #ifdef USE_SEL_EVENT_ENABLE #ifndef BAREMETAL - // GPIOチップオープン + // GPIO chip open fd = open("/dev/gpiochip0", 0); if (fd == -1) { return FALSE; } - // イベント要求設定 + // Event request setting strcpy(selevreq.consumer_label, "RaSCSI"); selevreq.lineoffset = PIN_SEL; selevreq.handleflags = GPIOHANDLE_REQUEST_INPUT; @@ -302,41 +302,41 @@ BOOL FASTCALL GPIOBUS::Init(mode_e mode) selevreq.eventflags = GPIOEVENT_REQUEST_RISING_EDGE; #endif // SIGNAL_CONTROL_MODE - // イベント要求取得 + //Get event request if (ioctl(fd, GPIO_GET_LINEEVENT_IOCTL, &selevreq) == -1) { close(fd); return FALSE; } - // GPIOチップクローズ + // Close GPIO chip file handle close(fd); - // epoll初期化 + // epoll initialization epfd = epoll_create(1); memset(&ev, 0, sizeof(ev)); ev.events = EPOLLIN | EPOLLPRI; ev.data.fd = selevreq.fd; epoll_ctl(epfd, EPOLL_CTL_ADD, selevreq.fd, &ev); #else - // エッジ検出設定 + // Edge detection setting #if SIGNAL_CONTROL_MODE == 2 gpio[GPIO_AREN_0] = 1 << PIN_SEL; #else gpio[GPIO_AFEN_0] = 1 << PIN_SEL; #endif // SIGNAL_CONTROL_MODE - // イベントクリア + // Clear event gpio[GPIO_EDS_0] = 1 << PIN_SEL; - // 割り込みハンドラ登録 + // Register interrupt handler setIrqFuncAddress(IrqHandler); - // GPIO割り込み設定 + // GPIO interrupt setting if (rpitype == 4) { - // GIC無効 + // GIC Invalid gicd[GICD_CTLR] = 0; - // 全ての割り込みをコア0にルーティング + // Route all interupts to core 0 for (i = 0; i < 8; i++) { gicd[GICD_ICENABLER0 + i] = 0xffffffff; gicd[GICD_ICPENDR0 + i] = 0xffffffff; @@ -347,32 +347,32 @@ BOOL FASTCALL GPIOBUS::Init(mode_e mode) gicd[GICD_ITARGETSR0 + i] = 0x01010101; } - // 全ての割り込みをレベルトリガに設定 + // Set all interrupts as level triggers for (i = 0; i < 16; i++) { gicd[GICD_ICFGR0 + i] = 0; } - // GIC無効 + // GIC Invalid gicd[GICD_CTLR] = 1; - // コア0のCPUインターフェスを有効にする + // Enable CPU interface for core 0 gicc[GICC_PMR] = 0xf0; gicc[GICC_CTLR] = 1; - // 割り込み有効 + // Enable interrupts gicd[GICD_ISENABLER0 + (GIC_GPIO_IRQ / 32)] = 1 << (GIC_GPIO_IRQ % 32); } else { - // 割り込み有効 + // Enable interrupts irpctl[IRPT_ENB_IRQ_2] = (1 << (GPIO_IRQ % 32)); } #endif // BAREMETAL #endif // USE_SEL_EVENT_ENABLE - // ワークテーブル作成 + // Create work table MakeTable(); - // 最後にENABLEをオン + // Finally, enable ENABLE SetControl(PIN_ENB, ENB_ON); return TRUE; @@ -380,7 +380,7 @@ BOOL FASTCALL GPIOBUS::Init(mode_e mode) //--------------------------------------------------------------------------- // -// クリーンアップ +// Cleanup // //--------------------------------------------------------------------------- void FASTCALL GPIOBUS::Cleanup() @@ -388,14 +388,14 @@ void FASTCALL GPIOBUS::Cleanup() int i; int pin; - // SEL信号割り込み解放 + // Release SEL signal interrupt #ifdef USE_SEL_EVENT_ENABLE #ifndef BAREMETAL close(selevreq.fd); #endif // BAREMETAL #endif // USE_SEL_EVENT_ENABLE - // 制御信号を設定 + // Set control signals PinSetSignal(PIN_ENB, FALSE); PinSetSignal(PIN_ACT, FALSE); PinSetSignal(PIN_TAD, FALSE); @@ -406,7 +406,7 @@ void FASTCALL GPIOBUS::Cleanup() PinConfig(PIN_IND, GPIO_INPUT); PinConfig(PIN_DTD, GPIO_INPUT); - // 全信号初期化 + // Initialize all signals for (i = 0; SignalTable[i] >= 0; i++) { pin = SignalTable[i]; PinSetSignal(pin, FALSE); @@ -414,13 +414,13 @@ void FASTCALL GPIOBUS::Cleanup() PullConfig(pin, GPIO_PULLNONE); } - // Drive Strengthを8mAに設定 + // Set drive strength back to 8mA DrvConfig(3); } //--------------------------------------------------------------------------- // -// リセット +// Reset // //--------------------------------------------------------------------------- void FASTCALL GPIOBUS::Reset() @@ -428,10 +428,10 @@ void FASTCALL GPIOBUS::Reset() int i; int j; - // アクティブ信号をオフ + // Turn off active signal SetControl(PIN_ACT, ACT_OFF); - // 全信号をネゲートに設定 + // Set all signals to off for (i = 0;; i++) { j = SignalTable[i]; if (j < 0) { @@ -442,9 +442,9 @@ void FASTCALL GPIOBUS::Reset() } if (actmode == TARGET) { - // ターゲットモード + // Target mode - // ターゲット信号を入力に設定 + // Set target signal to input SetControl(PIN_TAD, TAD_IN); SetMode(PIN_BSY, IN); SetMode(PIN_MSG, IN); @@ -452,14 +452,14 @@ void FASTCALL GPIOBUS::Reset() SetMode(PIN_REQ, IN); SetMode(PIN_IO, IN); - // イニシエータ信号を入力に設定 + // Set the initiator signal to input SetControl(PIN_IND, IND_IN); SetMode(PIN_SEL, IN); SetMode(PIN_ATN, IN); SetMode(PIN_ACK, IN); SetMode(PIN_RST, IN); - // データバス信号を入力に設定 + // Set data bus signals to input SetControl(PIN_DTD, DTD_IN); SetMode(PIN_DT0, IN); SetMode(PIN_DT1, IN); @@ -471,9 +471,9 @@ void FASTCALL GPIOBUS::Reset() SetMode(PIN_DT7, IN); SetMode(PIN_DP, IN); } else { - // イニシエータモード + // Initiator mode - // ターゲット信号を入力に設定 + // Set target signal to input SetControl(PIN_TAD, TAD_IN); SetMode(PIN_BSY, IN); SetMode(PIN_MSG, IN); @@ -481,14 +481,14 @@ void FASTCALL GPIOBUS::Reset() SetMode(PIN_REQ, IN); SetMode(PIN_IO, IN); - // イニシエータ信号を出力に設定 + // Set the initiator signal to output SetControl(PIN_IND, IND_OUT); SetMode(PIN_SEL, OUT); SetMode(PIN_ATN, OUT); SetMode(PIN_ACK, OUT); SetMode(PIN_RST, OUT); - // データバス信号を出力に設定 + // Set the data bus signals to outpu SetControl(PIN_DTD, DTD_OUT); SetMode(PIN_DT0, OUT); SetMode(PIN_DT1, OUT); @@ -501,13 +501,13 @@ void FASTCALL GPIOBUS::Reset() SetMode(PIN_DP, OUT); } - // 全信号初期化 + // Initialize all signals signals = 0; } //--------------------------------------------------------------------------- // -// バス信号取り込み +// Bus signal acquisition // //--------------------------------------------------------------------------- DWORD FASTCALL GPIOBUS::Aquire() @@ -515,7 +515,7 @@ DWORD FASTCALL GPIOBUS::Aquire() signals = *level; #if SIGNAL_CONTROL_MODE < 2 - // 負論理なら反転する(内部処理は正論理に統一) + // Invert if negative logic (internal processing is unified to positive logic) signals = ~signals; #endif // SIGNAL_CONTROL_MODE @@ -524,7 +524,7 @@ DWORD FASTCALL GPIOBUS::Aquire() //--------------------------------------------------------------------------- // -// ENBシグナル設定 +// ENB signal setting // //--------------------------------------------------------------------------- void FASTCALL GPIOBUS::SetENB(BOOL ast) @@ -534,7 +534,7 @@ void FASTCALL GPIOBUS::SetENB(BOOL ast) //--------------------------------------------------------------------------- // -// BSYシグナル取得 +// Get BSY signal // //--------------------------------------------------------------------------- BOOL FASTCALL GPIOBUS::GetBSY() @@ -544,20 +544,20 @@ BOOL FASTCALL GPIOBUS::GetBSY() //--------------------------------------------------------------------------- // -// BSYシグナル設定 +// Set BSY signal // //--------------------------------------------------------------------------- void FASTCALL GPIOBUS::SetBSY(BOOL ast) { - // BSY信号を設定 + // Set BSY signal SetSignal(PIN_BSY, ast); if (actmode == TARGET) { if (ast) { - // アクティブ信号をオン + // Turn on ACTIVE signal SetControl(PIN_ACT, ACT_ON); - // ターゲット信号を出力に設定 + // Set Target signal to output SetControl(PIN_TAD, TAD_OUT); SetMode(PIN_BSY, OUT); @@ -566,10 +566,10 @@ void FASTCALL GPIOBUS::SetBSY(BOOL ast) SetMode(PIN_REQ, OUT); SetMode(PIN_IO, OUT); } else { - // アクティブ信号をオフ + // Turn off the ACTIVE signal SetControl(PIN_ACT, ACT_OFF); - // ターゲット信号を入力に設定 + // Set the target signal to input SetControl(PIN_TAD, TAD_IN); SetMode(PIN_BSY, IN); @@ -583,7 +583,7 @@ void FASTCALL GPIOBUS::SetBSY(BOOL ast) //--------------------------------------------------------------------------- // -// SELシグナル取得 +// Get SEL signal // //--------------------------------------------------------------------------- BOOL FASTCALL GPIOBUS::GetSEL() @@ -593,23 +593,23 @@ BOOL FASTCALL GPIOBUS::GetSEL() //--------------------------------------------------------------------------- // -// SELシグナル設定 +// Set SEL signal // //--------------------------------------------------------------------------- void FASTCALL GPIOBUS::SetSEL(BOOL ast) { if (actmode == INITIATOR && ast) { - // アクティブ信号をオン + // Turn on ACTIVE signal SetControl(PIN_ACT, ACT_ON); } - // SEL信号を設定 + // Set SEL signal SetSignal(PIN_SEL, ast); } //--------------------------------------------------------------------------- // -// ATNシグナル取得 +// Get ATN signal // //--------------------------------------------------------------------------- BOOL FASTCALL GPIOBUS::GetATN() @@ -619,7 +619,7 @@ BOOL FASTCALL GPIOBUS::GetATN() //--------------------------------------------------------------------------- // -// ATNシグナル設定 +// Get ATN signal // //--------------------------------------------------------------------------- void FASTCALL GPIOBUS::SetATN(BOOL ast) @@ -629,7 +629,7 @@ void FASTCALL GPIOBUS::SetATN(BOOL ast) //--------------------------------------------------------------------------- // -// ACKシグナル取得 +// Get ACK signal // //--------------------------------------------------------------------------- BOOL FASTCALL GPIOBUS::GetACK() @@ -639,7 +639,7 @@ BOOL FASTCALL GPIOBUS::GetACK() //--------------------------------------------------------------------------- // -// ACKシグナル設定 +// Set ACK signal // //--------------------------------------------------------------------------- void FASTCALL GPIOBUS::SetACK(BOOL ast) @@ -649,7 +649,7 @@ void FASTCALL GPIOBUS::SetACK(BOOL ast) //--------------------------------------------------------------------------- // -// RSTシグナル取得 +// Get RST signal // //--------------------------------------------------------------------------- BOOL FASTCALL GPIOBUS::GetRST() @@ -659,7 +659,7 @@ BOOL FASTCALL GPIOBUS::GetRST() //--------------------------------------------------------------------------- // -// RSTシグナル設定 +// Set RST signal // //--------------------------------------------------------------------------- void FASTCALL GPIOBUS::SetRST(BOOL ast) @@ -669,7 +669,7 @@ void FASTCALL GPIOBUS::SetRST(BOOL ast) //--------------------------------------------------------------------------- // -// MSGシグナル取得 +// Get MSG signal // //--------------------------------------------------------------------------- BOOL FASTCALL GPIOBUS::GetMSG() @@ -679,7 +679,7 @@ BOOL FASTCALL GPIOBUS::GetMSG() //--------------------------------------------------------------------------- // -// MSGシグナル設定 +// Set MSG signal // //--------------------------------------------------------------------------- void FASTCALL GPIOBUS::SetMSG(BOOL ast) @@ -689,7 +689,7 @@ void FASTCALL GPIOBUS::SetMSG(BOOL ast) //--------------------------------------------------------------------------- // -// CDシグナル取得 +// Get CD signal // //--------------------------------------------------------------------------- BOOL FASTCALL GPIOBUS::GetCD() @@ -699,7 +699,7 @@ BOOL FASTCALL GPIOBUS::GetCD() //--------------------------------------------------------------------------- // -// CDシグナル設定 +// Set CD Signal // //--------------------------------------------------------------------------- void FASTCALL GPIOBUS::SetCD(BOOL ast) @@ -709,7 +709,7 @@ void FASTCALL GPIOBUS::SetCD(BOOL ast) //--------------------------------------------------------------------------- // -// IOシグナル取得 +// Get IO Signal // //--------------------------------------------------------------------------- BOOL FASTCALL GPIOBUS::GetIO() @@ -718,7 +718,7 @@ BOOL FASTCALL GPIOBUS::GetIO() ast = GetSignal(PIN_IO); if (actmode == INITIATOR) { - // IO信号によってデータの入出力方向を変更 + // Change the data input/output direction by IO signal if (ast) { SetControl(PIN_DTD, DTD_IN); SetMode(PIN_DT0, IN); @@ -749,7 +749,7 @@ BOOL FASTCALL GPIOBUS::GetIO() //--------------------------------------------------------------------------- // -// IOシグナル設定 +// Set IO signal // //--------------------------------------------------------------------------- void FASTCALL GPIOBUS::SetIO(BOOL ast) @@ -757,7 +757,7 @@ void FASTCALL GPIOBUS::SetIO(BOOL ast) SetSignal(PIN_IO, ast); if (actmode == TARGET) { - // IO信号によってデータの入出力方向を変更 + // Change the data input/output direction by IO signal if (ast) { SetControl(PIN_DTD, DTD_OUT); SetDAT(0); @@ -787,7 +787,7 @@ void FASTCALL GPIOBUS::SetIO(BOOL ast) //--------------------------------------------------------------------------- // -// REQシグナル取得 +// Get REQ signal // //--------------------------------------------------------------------------- BOOL FASTCALL GPIOBUS::GetREQ() @@ -797,7 +797,7 @@ BOOL FASTCALL GPIOBUS::GetREQ() //--------------------------------------------------------------------------- // -// REQシグナル設定 +// Set REQ signal // //--------------------------------------------------------------------------- void FASTCALL GPIOBUS::SetREQ(BOOL ast) @@ -807,7 +807,7 @@ void FASTCALL GPIOBUS::SetREQ(BOOL ast) //--------------------------------------------------------------------------- // -// データシグナル取得 +// Get data signals // //--------------------------------------------------------------------------- BYTE FASTCALL GPIOBUS::GetDAT() @@ -830,12 +830,12 @@ BYTE FASTCALL GPIOBUS::GetDAT() //--------------------------------------------------------------------------- // -// データシグナル設定 +// Set data signals // //--------------------------------------------------------------------------- void FASTCALL GPIOBUS::SetDAT(BYTE dat) { - // ポートへ書き込み + // Write to port #if SIGNAL_CONTROL_MODE == 0 DWORD fsel; @@ -870,7 +870,7 @@ void FASTCALL GPIOBUS::SetDAT(BYTE dat) //--------------------------------------------------------------------------- // -// データパリティシグナル取得 +// Get data parity signal // //--------------------------------------------------------------------------- BOOL FASTCALL GPIOBUS::GetDP() @@ -880,7 +880,7 @@ BOOL FASTCALL GPIOBUS::GetDP() //--------------------------------------------------------------------------- // -// コマンド受信ハンドシェイク +// Receive command handshake // //--------------------------------------------------------------------------- int FASTCALL GPIOBUS::CommandHandShake(BYTE *buf) @@ -889,99 +889,99 @@ int FASTCALL GPIOBUS::CommandHandShake(BYTE *buf) BOOL ret; int count; - // ターゲットモードのみ + // Only works in TARGET mode if (actmode != TARGET) { return 0; } - // IRQ無効 + // IRQs disabled DisableIRQ(); - // 最初のコマンドバイトを取得 + // Get the first command byte i = 0; - // REQアサート + // Assert REQ signal SetSignal(PIN_REQ, ON); - // ACKアサート待ち + // Wait for ACK signal ret = WaitSignal(PIN_ACK, TRUE); - // 信号線が安定するまでウェイト + // Wait until the signal line stabilizes SysTimer::SleepNsec(GPIO_DATA_SETTLING); - // データ取得 + // Get data *buf = GetDAT(); - // REQネゲート + // Disable REQ signal SetSignal(PIN_REQ, OFF); - // ACKアサート待ちでタイムアウト + // Timeout waiting for ACK assertion if (!ret) { goto irq_enable_exit; } - // ACKネゲート待ち + // Wait for ACK to clear ret = WaitSignal(PIN_ACK, FALSE); - // ACKネゲート待ちでタイムアウト + // Timeout waiting for ACK to clear if (!ret) { goto irq_enable_exit; } - // コマンドが6バイトか10バイトか見分ける + // Distinguise whether the command is 6 bytes or 10 bytes if (*buf >= 0x20 && *buf <= 0x7D) { count = 10; } else { count = 6; } - // 次データへ + // Increment buffer pointer buf++; for (i = 1; i < count; i++) { - // REQアサート + // Assert REQ signal SetSignal(PIN_REQ, ON); - // ACKアサート待ち + // Wait for ACK signal ret = WaitSignal(PIN_ACK, TRUE); - // 信号線が安定するまでウェイト + // Wait until the signal line stabilizes SysTimer::SleepNsec(GPIO_DATA_SETTLING); - // データ取得 + // Get data *buf = GetDAT(); - // REQネゲート + // Clear the REQ signal SetSignal(PIN_REQ, OFF); - // ACKアサート待ちでタイムアウト + // Check for timeout waiting for ACK assertion if (!ret) { break; } - // ACKネゲート待ち + // Wait for ACK to clear ret = WaitSignal(PIN_ACK, FALSE); - // ACKネゲート待ちでタイムアウト + // Check for timeout waiting for ACK to clear if (!ret) { break; } - // 次データへ + // Advance the buffer pointer to receive the next byte buf++; } irq_enable_exit: - // IRQ有効 + // IRQs enabled EnableIRQ(); - // 受信数を返却 + // returned the number of bytes received return i; } //--------------------------------------------------------------------------- // -// データ受信ハンドシェイク +// Data reception handshake // //--------------------------------------------------------------------------- int FASTCALL GPIOBUS::ReceiveHandShake(BYTE *buf, int count) @@ -990,100 +990,100 @@ int FASTCALL GPIOBUS::ReceiveHandShake(BYTE *buf, int count) BOOL ret; DWORD phase; - // IRQ無効 + // Disable IRQs DisableIRQ(); if (actmode == TARGET) { for (i = 0; i < count; i++) { - // REQアサート + // Assert the REQ signal SetSignal(PIN_REQ, ON); - // ACKアサート待ち + // Wait for ACK ret = WaitSignal(PIN_ACK, TRUE); - // 信号線が安定するまでウェイト + // Wait until the signal line stabilizes SysTimer::SleepNsec(GPIO_DATA_SETTLING); - // データ取得 + // Get data *buf = GetDAT(); - // REQネゲート + // Clear the REQ signal SetSignal(PIN_REQ, OFF); - // ACKアサート待ちでタイムアウト + // Check for timeout waiting for ACK signal if (!ret) { break; } - // ACKネゲート待ち + // Wait for ACK to clear ret = WaitSignal(PIN_ACK, FALSE); - // ACKネゲート待ちでタイムアウト + // Check for timeout waiting for ACK to clear if (!ret) { break; } - // 次データへ + // Advance the buffer pointer to receive the next byte buf++; } } else { - // フェーズ取得 + // Get phase phase = Aquire() & GPIO_MCI; for (i = 0; i < count; i++) { - // REQアサート待ち + // Wait for the REQ signal to be asserted ret = WaitSignal(PIN_REQ, TRUE); - // REQアサート待ちでタイムアウト + // Check for timeout waiting for REQ signal if (!ret) { break; } - // フェーズエラー + // Phase error if ((signals & GPIO_MCI) != phase) { break; } - // 信号線が安定するまでウェイト + // Wait until the signal line stabilizes SysTimer::SleepNsec(GPIO_DATA_SETTLING); - // データ取得 + // Get data *buf = GetDAT(); - // ACKアサート + // Assert the ACK signal SetSignal(PIN_ACK, ON); - // REQネゲート待ち + // Wait for REQ to clear ret = WaitSignal(PIN_REQ, FALSE); - // ACKネゲート + // Clear the ACK signal SetSignal(PIN_ACK, OFF); - // REQネゲート待ちでタイムアウト + // Check for timeout waiting for REQ to clear if (!ret) { break; } - // フェーズエラー + // Phase error if ((signals & GPIO_MCI) != phase) { break; } - // 次データへ + // Advance the buffer pointer to receive the next byte buf++; } } - // IRQ有効 + // Re-enable IRQ EnableIRQ(); - // 受信数を返却 + // Return the number of bytes received return i; } //--------------------------------------------------------------------------- // -// データ送信ハンドシェイク +// Data transmission handshake // //--------------------------------------------------------------------------- int FASTCALL GPIOBUS::SendHandShake(BYTE *buf, int count) @@ -1092,117 +1092,117 @@ int FASTCALL GPIOBUS::SendHandShake(BYTE *buf, int count) BOOL ret; DWORD phase; - // IRQ無効 + // Disable IRQs DisableIRQ(); if (actmode == TARGET) { for (i = 0; i < count; i++) { - // データ設定 + // Set the DATA signals SetDAT(*buf); - // ACKネゲート待ち + // Wait for ACK to clear ret = WaitSignal(PIN_ACK, FALSE); - // ACKネゲート待ちでタイムアウト + // Check for timeout waiting for ACK to clear if (!ret) { break; } - // ACKネゲート待ちで既にウェイトが入っている + // Already waiting for ACK to clear - // REQアサート + // Assert the REQ signal SetSignal(PIN_REQ, ON); - // ACKアサート待ち + // Wait for ACK ret = WaitSignal(PIN_ACK, TRUE); - // REQネゲート + // Clear REQ signal SetSignal(PIN_REQ, OFF); - // ACKアサート待ちでタイムアウト + // Check for timeout waiting for ACK to clear if (!ret) { break; } - // 次データへ + // Advance the data buffer pointer to receive the next byte buf++; } - // ACKネゲート待ち + // Wait for ACK to clear WaitSignal(PIN_ACK, FALSE); } else { - // フェーズ取得 + // Get Phase phase = Aquire() & GPIO_MCI; for (i = 0; i < count; i++) { - // データ設定 + // Set the DATA signals SetDAT(*buf); - // REQアサート待ち + // Wait for REQ to be asserted ret = WaitSignal(PIN_REQ, TRUE); - // REQアサート待ちでタイムアウト + // Check for timeout waiting for REQ to be asserted if (!ret) { break; } - // フェーズエラー + // Phase error if ((signals & GPIO_MCI) != phase) { break; } - // REQアサート待ちで既にウェイトが入っている - - // ACKアサート + // Already waiting for REQ assertion + + // Assert the ACK signal SetSignal(PIN_ACK, ON); - // REQネゲート待ち + // Wait for REQ to clear ret = WaitSignal(PIN_REQ, FALSE); - // ACKネゲート + // Clear the ACK signal SetSignal(PIN_ACK, OFF); - // REQネゲート待ちでタイムアウト + // Check for timeout waiting for REQ to clear if (!ret) { break; } - // フェーズエラー + // Phase error if ((signals & GPIO_MCI) != phase) { break; } - // 次データへ + // Advance the data buffer pointer to receive the next byte buf++; } } - // IRQ有効 + // Re-enable IRQ EnableIRQ(); - // 送信数を返却 + // Return number of transmissions return i; } #ifdef USE_SEL_EVENT_ENABLE //--------------------------------------------------------------------------- // -// SEL信号イベントポーリング +// SEL signal event polling // //--------------------------------------------------------------------------- int FASTCALL GPIOBUS::PollSelectEvent() { - // errnoクリア + // clear errno errno = 0; #ifdef BAREMETAL - // 割り込み有効 + // Enable interrupts EnableInterrupts(); - // 割り込み待ち + // Wait for interrupts WaitForInterrupts(); - // 割り込み無効 + // Disable interrupts DisableInterrupts(); #else struct epoll_event epev; @@ -1220,7 +1220,7 @@ int FASTCALL GPIOBUS::PollSelectEvent() //--------------------------------------------------------------------------- // -// SEL信号イベント解除 +// Cancel SEL signal event // //--------------------------------------------------------------------------- void FASTCALL GPIOBUS::ClearSelectEvent() @@ -1228,15 +1228,15 @@ void FASTCALL GPIOBUS::ClearSelectEvent() #ifdef BAREMETAL DWORD irq; - // イベントクリア + // Clear event gpio[GPIO_EDS_0] = 1 << PIN_SEL; - // GICへの応答 + // Response to GIC if (rpitype == 4) { - // IRQ番号 + // IRQ number irq = gicc[GICC_IAR] & 0x3FF; - // 割り込み応答 + // Interrupt response gicc[GICC_EOIR] = irq; } #endif // BAREMETAL @@ -1245,7 +1245,7 @@ void FASTCALL GPIOBUS::ClearSelectEvent() //--------------------------------------------------------------------------- // -// 信号テーブル +// Signal table // //--------------------------------------------------------------------------- const int GPIOBUS::SignalTable[19] = { @@ -1258,7 +1258,7 @@ const int GPIOBUS::SignalTable[19] = { //--------------------------------------------------------------------------- // -// ワークテーブル作成 +// Create work table // //--------------------------------------------------------------------------- void FASTCALL GPIOBUS::MakeTable(void) @@ -1281,7 +1281,7 @@ void FASTCALL GPIOBUS::MakeTable(void) DWORD gpset; #endif - // パリティテーブル作成 + // Create parity table for (i = 0; i < 0x100; i++) { bits = (DWORD)i; parity = 0; @@ -1294,28 +1294,28 @@ void FASTCALL GPIOBUS::MakeTable(void) } #if SIGNAL_CONTROL_MODE == 0 - // マスクと設定データ生成 + // Mask and setting data generation memset(tblDatMsk, 0xff, sizeof(tblDatMsk)); memset(tblDatSet, 0x00, sizeof(tblDatSet)); for (i = 0; i < 0x100; i++) { - // 検査用ビット列 + // Bit string for inspection bits = (DWORD)i; - // パリティ取得 + // Get parity if (tblParity[i]) { bits |= (1 << 8); } - // ビット検査 + // Bit check for (j = 0; j < 9; j++) { - // インデックスとシフト量計算 + // Index and shift amount calculation index = pintbl[j] / 10; shift = (pintbl[j] % 10) * 3; - // マスクデータ + // Mask data tblDatMsk[index][i] &= ~(0x7 << shift); - // 設定データ + // Setting data if (bits & 1) { tblDatSet[index][i] |= (1 << shift); } @@ -1324,24 +1324,24 @@ void FASTCALL GPIOBUS::MakeTable(void) } } #else - // マスクと設定データ生成 + // Mask and setting data generation memset(tblDatMsk, 0x00, sizeof(tblDatMsk)); memset(tblDatSet, 0x00, sizeof(tblDatSet)); for (i = 0; i < 0x100; i++) { - // 検査用ビット列 + // bit string for inspection bits = (DWORD)i; - // パリティ取得 + // get parity if (tblParity[i]) { bits |= (1 << 8); } #if SIGNAL_CONTROL_MODE == 1 - // 負論理は反転 + // Negative logic is inverted bits = ~bits; #endif - // GPIOレジスタ情報の作成 + // Create GPIO register information gpclr = 0; gpset = 0; for (j = 0; j < 9; j++) { @@ -1361,7 +1361,7 @@ void FASTCALL GPIOBUS::MakeTable(void) //--------------------------------------------------------------------------- // -// 制御信号設定 +// Control signal setting // //--------------------------------------------------------------------------- void FASTCALL GPIOBUS::SetControl(int pin, BOOL ast) @@ -1371,7 +1371,7 @@ void FASTCALL GPIOBUS::SetControl(int pin, BOOL ast) //--------------------------------------------------------------------------- // -// 入出力モード設定 +// Input/output mode setting // //--------------------------------------------------------------------------- void FASTCALL GPIOBUS::SetMode(int pin, int mode) @@ -1399,7 +1399,7 @@ void FASTCALL GPIOBUS::SetMode(int pin, int mode) //--------------------------------------------------------------------------- // -// 入力信号値取得 +// Get input signal value // //--------------------------------------------------------------------------- BOOL FASTCALL GPIOBUS::GetSignal(int pin) @@ -1409,7 +1409,7 @@ BOOL FASTCALL GPIOBUS::GetSignal(int pin) //--------------------------------------------------------------------------- // -// 出力信号値設定 +// Set output signal value // //--------------------------------------------------------------------------- void FASTCALL GPIOBUS::SetSignal(int pin, BOOL ast) @@ -1446,7 +1446,7 @@ void FASTCALL GPIOBUS::SetSignal(int pin, BOOL ast) //--------------------------------------------------------------------------- // -// 信号変化待ち +// Wait for signal change // //--------------------------------------------------------------------------- BOOL FASTCALL GPIOBUS::WaitSignal(int pin, BOOL ast) @@ -1454,49 +1454,49 @@ BOOL FASTCALL GPIOBUS::WaitSignal(int pin, BOOL ast) DWORD now; DWORD timeout; - // 現在 + // Get current time now = SysTimer::GetTimerLow(); - // タイムアウト時間(3000ms) + // Calculate timeout (3000ms) timeout = 3000 * 1000; - // 変化したら即終了 + // end immediately if the signal has changed do { - // リセットを受信したら即終了 + // Immediately upon receiving a reset Aquire(); if (GetRST()) { return FALSE; } - // エッジを検出したら - if (((signals >> pin) ^ ~ast) & 1) { + // Check for the signal edge + if (((signals >> pin) ^ ~ast) & 1) { return TRUE; } } while ((SysTimer::GetTimerLow() - now) < timeout); - // タイムアウト + // We timed out waiting for the signal return FALSE; } //--------------------------------------------------------------------------- // -// IRQ禁止 +// Disable IRQ // //--------------------------------------------------------------------------- void FASTCALL GPIOBUS::DisableIRQ() { #ifndef BAREMETAL if (rpitype == 4) { - // RPI4はGICCで割り込み禁止に設定 + // RPI4 is disabled by GICC giccpmr = gicc[GICC_PMR]; gicc[GICC_PMR] = 0; } else if (rpitype == 2) { - // RPI2,3はコアタイマーIRQを無効にする + // RPI2,3 disable core timer IRQ tintcore = sched_getcpu() + QA7_CORE0_TINTC; tintctl = qa7regs[tintcore]; qa7regs[tintcore] = 0; } else { - // 割り込みコントローラでシステムタイマー割り込みを止める + // Stop system timer interrupt with interrupt controller irptenb = irpctl[IRPT_ENB_IRQ_1]; irpctl[IRPT_DIS_IRQ_1] = irptenb & 0xf; } @@ -1505,20 +1505,20 @@ void FASTCALL GPIOBUS::DisableIRQ() //--------------------------------------------------------------------------- // -// IRQ有効 +// Enable IRQ // //--------------------------------------------------------------------------- void FASTCALL GPIOBUS::EnableIRQ() { #ifndef BAREMETAL if (rpitype == 4) { - // RPI4はGICCを割り込み許可に設定 + // RPI4 enables interrupts via the GICC gicc[GICC_PMR] = giccpmr; } else if (rpitype == 2) { - // RPI2,3はコアタイマーIRQを有効に戻す + // RPI2,3 re-enable core timer IRQ qa7regs[tintcore] = tintctl; } else { - // 割り込みコントローラでシステムタイマー割り込みを再開 + // Restart the system timer interrupt with the interrupt controller irpctl[IRPT_ENB_IRQ_1] = irptenb & 0xf; } #endif // BAREMETAL @@ -1526,7 +1526,7 @@ void FASTCALL GPIOBUS::EnableIRQ() //--------------------------------------------------------------------------- // -// ピン機能設定(入出力設定) +// Pin direction setting (input/output) // //--------------------------------------------------------------------------- void FASTCALL GPIOBUS::PinConfig(int pin, int mode) @@ -1534,7 +1534,7 @@ void FASTCALL GPIOBUS::PinConfig(int pin, int mode) int index; DWORD mask; - // 未使用なら無効 + // Check for invalid pin if (pin < 0) { return; } @@ -1546,7 +1546,7 @@ void FASTCALL GPIOBUS::PinConfig(int pin, int mode) //--------------------------------------------------------------------------- // -// ピン機能設定(プルアップ/ダウン) +// Pin pull-up/pull-down setting // //--------------------------------------------------------------------------- void FASTCALL GPIOBUS::PullConfig(int pin, int mode) @@ -1555,7 +1555,7 @@ void FASTCALL GPIOBUS::PullConfig(int pin, int mode) DWORD bits; DWORD pull; - // 未使用なら無効 + // Check for invalid pin if (pin < 0) { return; } @@ -1594,12 +1594,12 @@ void FASTCALL GPIOBUS::PullConfig(int pin, int mode) //--------------------------------------------------------------------------- // -// ピン出力設定 +// Set output pin // //--------------------------------------------------------------------------- void FASTCALL GPIOBUS::PinSetSignal(int pin, BOOL ast) { - // 未使用なら無効 + // Check for invalid pin if (pin < 0) { return; } @@ -1613,7 +1613,7 @@ void FASTCALL GPIOBUS::PinSetSignal(int pin, BOOL ast) //--------------------------------------------------------------------------- // -// Drive Strength設定 +// Set the signal drive strength // //--------------------------------------------------------------------------- void FASTCALL GPIOBUS::DrvConfig(DWORD drive) @@ -1626,28 +1626,28 @@ void FASTCALL GPIOBUS::DrvConfig(DWORD drive) //--------------------------------------------------------------------------- // -// システムタイマアドレス +// System timer address // //--------------------------------------------------------------------------- volatile DWORD* SysTimer::systaddr; //--------------------------------------------------------------------------- // -// ARMタイマアドレス +// ARM timer address // //--------------------------------------------------------------------------- volatile DWORD* SysTimer::armtaddr; //--------------------------------------------------------------------------- // -// コア周波数 +// Core frequency // //--------------------------------------------------------------------------- volatile DWORD SysTimer::corefreq; //--------------------------------------------------------------------------- // -// システムタイマ初期化 +// Initialize the system timer // //--------------------------------------------------------------------------- void FASTCALL SysTimer::Init(DWORD *syst, DWORD *armt) @@ -1668,14 +1668,14 @@ void FASTCALL SysTimer::Init(DWORD *syst, DWORD *armt) int fd; #endif // BAREMETAL - // ベースアドレス保存 + // Save the base address systaddr = syst; armtaddr = armt; - // ARMタイマをフリーランモードに変更 + // Change the ARM timer to free run mode armtaddr[ARMT_CTRL] = 0x00000282; - // コア周波数取得 + // Get the core frequency #ifdef BAREMETAL corefreq = RPi_Core_Freq / 1000000; #else @@ -1691,7 +1691,7 @@ void FASTCALL SysTimer::Init(DWORD *syst, DWORD *armt) //--------------------------------------------------------------------------- // -// システムタイマ(LO)取得 +// Get system timer low byte // //--------------------------------------------------------------------------- DWORD FASTCALL SysTimer::GetTimerLow() { @@ -1700,7 +1700,7 @@ DWORD FASTCALL SysTimer::GetTimerLow() { //--------------------------------------------------------------------------- // -// システムタイマ(HI)取得 +// Get system timer high byte // //--------------------------------------------------------------------------- DWORD FASTCALL SysTimer::GetTimerHigh() { @@ -1709,7 +1709,7 @@ DWORD FASTCALL SysTimer::GetTimerHigh() { //--------------------------------------------------------------------------- // -// ナノ秒単位のスリープ +// Sleep in nanoseconds // //--------------------------------------------------------------------------- void FASTCALL SysTimer::SleepNsec(DWORD nsec) @@ -1717,36 +1717,36 @@ void FASTCALL SysTimer::SleepNsec(DWORD nsec) DWORD diff; DWORD start; - // ウェイトしない + // If time is 0, don't do anything if (nsec == 0) { return; } - // タイマー差を算出 + // Calculate the timer difference diff = corefreq * nsec / 1000; - // 微小なら復帰 + // Return if the difference in time is too small if (diff == 0) { return; } - // 開始 + // Start start = armtaddr[ARMT_FREERUN]; - // カウントオーバーまでループ + // Loop until timer has elapsed while ((armtaddr[ARMT_FREERUN] - start) < diff); } //--------------------------------------------------------------------------- // -// μ秒単位のスリープ +// Sleep in microseconds // //--------------------------------------------------------------------------- void FASTCALL SysTimer::SleepUsec(DWORD usec) { DWORD now; - // ウェイトしない + // If time is 0, don't do anything if (usec == 0) { return; } diff --git a/src/raspberrypi/gpiobus.h b/src/raspberrypi/gpiobus.h index f9b9db58..340c9585 100644 --- a/src/raspberrypi/gpiobus.h +++ b/src/raspberrypi/gpiobus.h @@ -5,7 +5,7 @@ // // Powered by XM6 TypeG Technology. // Copyright (C) 2016-2020 GIMONS -// [ GPIO-SCSIバス ] +// [ GPIO-SCSI bus ] // //--------------------------------------------------------------------------- @@ -16,121 +16,121 @@ //--------------------------------------------------------------------------- // -// 接続方法定義の選択 +// Connection method definitions // //--------------------------------------------------------------------------- -//#define CONNECT_TYPE_STANDARD // 標準(SCSI論理,標準ピンアサイン) -//#define CONNECT_TYPE_FULLSPEC // フルスペック(SCSI論理,標準ピンアサイン) -//#define CONNECT_TYPE_AIBOM // AIBOM版(正論理,固有ピンアサイン) -//#define CONNECT_TYPE_GAMERNIUM // GAMERnium.com版(標準論理,固有ピンアサイン) +//#define CONNECT_TYPE_STANDARD // Standard (SCSI logic, standard pin assignment) +//#define CONNECT_TYPE_FULLSPEC // Full spec (SCSI logic, standard pin assignment) +//#define CONNECT_TYPE_AIBOM // AIBOM version (positive logic, unique pin assignment) +//#define CONNECT_TYPE_GAMERNIUM // GAMERnium.com version (standard logic, unique pin assignment) //--------------------------------------------------------------------------- // -// 信号制御論理及びピンアサインカスタマイズ +// Signal control logic and pin assignment customization // //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- // -// SIGNAL_CONTROL_MODE:信号制御モード選択 -// Version1.22から信号制御の論理をカスタマイズできます。 +// SIGNAL_CONTROL_MODE: Signal control mode selection +// You can customize the signal control logic from Version 1.22 // -// 0:SCSI論理仕様 -// 直結またはHPに公開した74LS641-1等を使用する変換基板 -// アーサート:0V -// ネゲート :オープンコレクタ出力(バスから切り離す) +// 0:SCSI logical specification +// Conversion board using 74LS641-1 etc. directly connected or published on HP +// True : 0V +// False : Open collector output (disconnect from bus) // -// 1:負論理仕様(負論理->SCSI論理への変換基板を使用する場合) -// 現時点でこの仕様による変換基板は存在しません -// アーサート:0V -> (CONVERT) -> 0V -// ネゲート :3.3V -> (CONVERT) -> オープンコレクタ出力 +// 1:Negative logic specification (when using conversion board for negative logic -> SCSI logic) +// There is no conversion board with this specification at this time +// True : 0V -> (CONVERT) -> 0V +// False : 3.3V -> (CONVERT) -> Open collector output // -// 2:正論理仕様(正論理->SCSI論理への変換基板を使用する場合) -// RaSCSI Adapter Rev.C @132sync等 +// 2:Positive logic specification (when using the conversion board for positive logic -> SCSI logic) +// RaSCSI Adapter Rev.C @132sync etc. // -// アーサート:3.3V -> (CONVERT) -> 0V -// ネゲート :0V -> (CONVERT) -> オープンコレクタ出力 +// True : 3.3V -> (CONVERT) -> 0V +// False : 0V -> (CONVERT) -> Open collector output // //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- // -// 制御信号ピンアサイン設定 -// 制御信号に対するGPIOピンのマッピングテーブルです。 +// Control signal pin assignment setting +// GPIO pin mapping table for control signals. // -// 制御信号 +// Control signal: // PIN_ACT -// SCSIコマンドを処理中の状態を示す信号のピン番号。 +// Signal that indicates the status of processing SCSI command. // PIN_ENB -// 起動から終了の間の有効信号を示す信号のピン番号。 +// Signal that indicates the valid signal from start to finish. // PIN_TAD -// ターゲット信号(BSY,IO,CD,MSG,REG)の入出力方向を示す信号のピン番号。 +// Signal that indicates the input/output direction of the target signal (BSY,IO,CD,MSG,REG). // PIN_IND -// イニシーエータ信号(SEL,ATN,RST,ACK)の入出力方向を示す信号のピン番号。 +// Signal that indicates the input/output direction of the initiator signal (SEL, ATN, RST, ACK). // PIN_DTD -// データ信号(DT0...DT7,DP)の入出力方向を示す信号のピン番号。 +// Signal that indicates the input/output direction of the data lines (DT0...DT7,DP). // //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- // -// 制御信号出力論理 -// 0V:FALSE 3.3V:TRUEで指定します。 +// Control signal output logic +// 0V:FALSE 3.3V:TRUE // // ACT_ON -// PIN_ACT信号の論理です。 +// PIN_ACT signal // ENB_ON -// PIN_ENB信号の論理です。 +// PIN_ENB signal // TAD_IN -// PIN_TAD入力方向時の論理です。 +// PIN_TAD This is the logic when inputting. // IND_IN -// PIN_ENB入力方向時の論理です。 +// PIN_ENB This is the logic when inputting. // DTD_IN -// PIN_ENB入力方向時の論理です。 +// PIN_ENB This is the logic when inputting. // //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- // -// SCSI信号ピンアサイン設定 -// SCSIの信号に対するGPIOピンのマッピングテーブルです。 +// SCSI signal pin assignment setting +// GPIO pin mapping table for SCSI signals. // PIN_DT0~PIN_SEL // //--------------------------------------------------------------------------- #ifdef CONNECT_TYPE_STANDARD // -// RaSCSI 標準(SCSI論理,標準ピンアサイン) +// RaSCSI standard (SCSI logic, standard pin assignment) // -#define CONNECT_DESC "STANDARD" // 起動時メッセージ +#define CONNECT_DESC "STANDARD" // Startup message -// 信号制御モード選択 -#define SIGNAL_CONTROL_MODE 0 // SCSI論理仕様 +// Select signal control mode +#define SIGNAL_CONTROL_MODE 0 // SCSI logical specification -// 制御信号ピンアサイン(-1の場合は制御無し) +// Control signal pin assignment (-1 means no control) #define PIN_ACT 4 // ACTIVE #define PIN_ENB 5 // ENABLE #define PIN_IND -1 // INITIATOR CTRL DIRECTION #define PIN_TAD -1 // TARGET CTRL DIRECTION #define PIN_DTD -1 // DATA DIRECTION -// 制御信号出力論理 +// Control signal output logic #define ACT_ON TRUE // ACTIVE SIGNAL ON #define ENB_ON TRUE // ENABLE SIGNAL ON #define IND_IN FALSE // INITIATOR SIGNAL INPUT #define TAD_IN FALSE // TARGET SIGNAL INPUT #define DTD_IN TRUE // DATA SIGNAL INPUT -// SCSI信号ピンアサイン -#define PIN_DT0 10 // データ0 -#define PIN_DT1 11 // データ1 -#define PIN_DT2 12 // データ2 -#define PIN_DT3 13 // データ3 -#define PIN_DT4 14 // データ4 -#define PIN_DT5 15 // データ5 -#define PIN_DT6 16 // データ6 -#define PIN_DT7 17 // データ7 -#define PIN_DP 18 // パリティ +// SCSI signal pin assignment +#define PIN_DT0 10 // Data 0 +#define PIN_DT1 11 // Data 1 +#define PIN_DT2 12 // Data 2 +#define PIN_DT3 13 // Data 3 +#define PIN_DT4 14 // Data 4 +#define PIN_DT5 15 // Data 5 +#define PIN_DT6 16 // Data 6 +#define PIN_DT7 17 // Data 7 +#define PIN_DP 18 // Data parity #define PIN_ATN 19 // ATN #define PIN_RST 20 // RST #define PIN_ACK 21 // ACK @@ -144,37 +144,37 @@ #ifdef CONNECT_TYPE_FULLSPEC // -// RaSCSI 標準(SCSI論理,標準ピンアサイン) +// RaSCSI standard (SCSI logic, standard pin assignment) // -#define CONNECT_DESC "FULLSPEC" // 起動時メッセージ +#define CONNECT_DESC "FULLSPEC" // Startup message -// 信号制御モード選択 -#define SIGNAL_CONTROL_MODE 0 // SCSI論理仕様 +// Select signal control mode +#define SIGNAL_CONTROL_MODE 0 // SCSI logical specification -// 制御信号ピンアサイン(-1の場合は制御無し) +// Control signal pin assignment (-1 means no control) #define PIN_ACT 4 // ACTIVE #define PIN_ENB 5 // ENABLE #define PIN_IND 6 // INITIATOR CTRL DIRECTION #define PIN_TAD 7 // TARGET CTRL DIRECTION #define PIN_DTD 8 // DATA DIRECTION -// 制御信号出力論理 +// Control signal output logic #define ACT_ON TRUE // ACTIVE SIGNAL ON #define ENB_ON TRUE // ENABLE SIGNAL ON #define IND_IN FALSE // INITIATOR SIGNAL INPUT #define TAD_IN FALSE // TARGET SIGNAL INPUT #define DTD_IN TRUE // DATA SIGNAL INPUT -// SCSI信号ピンアサイン -#define PIN_DT0 10 // データ0 -#define PIN_DT1 11 // データ1 -#define PIN_DT2 12 // データ2 -#define PIN_DT3 13 // データ3 -#define PIN_DT4 14 // データ4 -#define PIN_DT5 15 // データ5 -#define PIN_DT6 16 // データ6 -#define PIN_DT7 17 // データ7 -#define PIN_DP 18 // パリティ +// SCSI signal pin assignment +#define PIN_DT0 10 // Data 0 +#define PIN_DT1 11 // Data 1 +#define PIN_DT2 12 // Data 2 +#define PIN_DT3 13 // Data 3 +#define PIN_DT4 14 // Data 4 +#define PIN_DT5 15 // Data 5 +#define PIN_DT6 16 // Data 6 +#define PIN_DT7 17 // Data 7 +#define PIN_DP 18 // Data parity #define PIN_ATN 19 // ATN #define PIN_RST 20 // RST #define PIN_ACK 21 // ACK @@ -188,38 +188,38 @@ #ifdef CONNECT_TYPE_AIBOM // -// RaSCSI Adapter あいぼむ版 +// RaSCSI Adapter Aibomu version // -#define CONNECT_DESC "AIBOM PRODUCTS version" // 起動時メッセージ +#define CONNECT_DESC "AIBOM PRODUCTS version" // Startup message -// 信号制御モード選択 -#define SIGNAL_CONTROL_MODE 2 // SCSI正論理仕様 +// Select signal control mode +#define SIGNAL_CONTROL_MODE 2 // SCSI positive logic specification -// 制御信号出力論理 +// Control signal output logic #define ACT_ON TRUE // ACTIVE SIGNAL ON #define ENB_ON TRUE // ENABLE SIGNAL ON #define IND_IN FALSE // INITIATOR SIGNAL INPUT #define TAD_IN FALSE // TARGET SIGNAL INPUT #define DTD_IN FALSE // DATA SIGNAL INPUT -// 制御信号ピンアサイン(-1の場合は制御無し) +// Control signal pin assignment (-1 means no control) #define PIN_ACT 4 // ACTIVE #define PIN_ENB 17 // ENABLE #define PIN_IND 27 // INITIATOR CTRL DIRECTION #define PIN_TAD -1 // TARGET CTRL DIRECTION #define PIN_DTD 18 // DATA DIRECTION -// SCSI信号ピンアサイン -#define PIN_DT0 6 // データ0 -#define PIN_DT1 12 // データ1 -#define PIN_DT2 13 // データ2 -#define PIN_DT3 16 // データ3 -#define PIN_DT4 19 // データ4 -#define PIN_DT5 20 // データ5 -#define PIN_DT6 26 // データ6 -#define PIN_DT7 21 // データ7 -#define PIN_DP 5 // パリティ +// SCSI signal pin assignment +#define PIN_DT0 6 // Data 0 +#define PIN_DT1 12 // Data 1 +#define PIN_DT2 13 // Data 2 +#define PIN_DT3 16 // Data 3 +#define PIN_DT4 19 // Data 4 +#define PIN_DT5 20 // Data 5 +#define PIN_DT6 26 // Data 6 +#define PIN_DT7 21 // Data 7 +#define PIN_DP 5 // Data parity #define PIN_ATN 22 // ATN #define PIN_RST 25 // RST #define PIN_ACK 10 // ACK @@ -236,35 +236,35 @@ // RaSCSI Adapter GAMERnium.com版 // -#define CONNECT_DESC "GAMERnium.com version"// 起動時メッセージ +#define CONNECT_DESC "GAMERnium.com version"// Startup message -// 信号制御モード選択 -#define SIGNAL_CONTROL_MODE 0 // SCSI論理仕様 +// Select signal control mode +#define SIGNAL_CONTROL_MODE 0 // SCSI logical specification -// 制御信号出力論理 +// Control signal output logic #define ACT_ON TRUE // ACTIVE SIGNAL ON #define ENB_ON TRUE // ENABLE SIGNAL ON #define IND_IN FALSE // INITIATOR SIGNAL INPUT #define TAD_IN FALSE // TARGET SIGNAL INPUT #define DTD_IN TRUE // DATA SIGNAL INPUT -// 制御信号ピンアサイン(-1の場合は制御無し) +// Control signal pin assignment (-1 means no control) #define PIN_ACT 14 // ACTIVE #define PIN_ENB 6 // ENABLE #define PIN_IND 7 // INITIATOR CTRL DIRECTION #define PIN_TAD 8 // TARGET CTRL DIRECTION #define PIN_DTD 5 // DATA DIRECTION -// SCSI信号ピンアサイン -#define PIN_DT0 21 // データ0 -#define PIN_DT1 26 // データ1 -#define PIN_DT2 20 // データ2 -#define PIN_DT3 19 // データ3 -#define PIN_DT4 16 // データ4 -#define PIN_DT5 13 // データ5 -#define PIN_DT6 12 // データ6 -#define PIN_DT7 11 // データ7 -#define PIN_DP 25 // パリティ +// SCSI signal pin assignment +#define PIN_DT0 21 // Data 0 +#define PIN_DT1 26 // Data 1 +#define PIN_DT2 20 // Data 2 +#define PIN_DT3 19 // Data 3 +#define PIN_DT4 16 // Data 4 +#define PIN_DT5 13 // Data 5 +#define PIN_DT6 12 // Data 6 +#define PIN_DT7 11 // Data 7 +#define PIN_DP 25 // Data parity #define PIN_ATN 10 // ATN #define PIN_RST 22 // RST #define PIN_ACK 24 // ACK @@ -278,7 +278,7 @@ //--------------------------------------------------------------------------- // -// 定数宣言(GPIO) +// Constant declarations(GPIO) // //--------------------------------------------------------------------------- #define SYST_OFFSET 0x00003000 @@ -355,7 +355,7 @@ //--------------------------------------------------------------------------- // -// 定数宣言(GIC) +// Constant declarations(GIC) // //--------------------------------------------------------------------------- #define ARM_GICD_BASE 0xFF841000 @@ -380,7 +380,7 @@ //--------------------------------------------------------------------------- // -// 定数宣言(GIC IRQ) +// Constant declarations(GIC IRQ) // //--------------------------------------------------------------------------- #define GIC_IRQLOCAL0 (16 + 14) @@ -388,7 +388,7 @@ //--------------------------------------------------------------------------- // -// 定数宣言(制御信号) +// Constant declarations (Control signals) // //--------------------------------------------------------------------------- #define ACT_OFF !ACT_ON @@ -399,7 +399,7 @@ //--------------------------------------------------------------------------- // -// 定数宣言(SCSI) +// Constant declarations(SCSI) // //--------------------------------------------------------------------------- #define IN GPIO_INPUT @@ -409,214 +409,214 @@ //--------------------------------------------------------------------------- // -// 定数宣言(バス制御タイミング) +// Constant declarations (bus control timing) // //--------------------------------------------------------------------------- -#define GPIO_DATA_SETTLING 100 // データバスが安定する時間(ns) +#define GPIO_DATA_SETTLING 100 // Data bus stabilization time (ns) //--------------------------------------------------------------------------- // -// クラス定義 +// Class definition // //--------------------------------------------------------------------------- class GPIOBUS : public BUS { public: - // 基本ファンクション + // Basic Functions GPIOBUS(); - // コンストラクタ + // Constructor virtual ~GPIOBUS(); - // デストラクタ + // Destructor BOOL FASTCALL Init(mode_e mode = TARGET); - // 初期化 + // Initialization void FASTCALL Reset(); - // リセット + // Reset void FASTCALL Cleanup(); - // クリーンアップ + // Cleanup DWORD FASTCALL Aquire(); - // 信号取り込み + // Signal acquisition void FASTCALL SetENB(BOOL ast); - // ENBシグナル設定 + // Set ENB signal BOOL FASTCALL GetBSY(); - // BSYシグナル取得 + // Get BSY signal void FASTCALL SetBSY(BOOL ast); - // BSYシグナル設定 + // Set BSY signal BOOL FASTCALL GetSEL(); - // SELシグナル取得 + // Get SEL signal void FASTCALL SetSEL(BOOL ast); - // SELシグナル設定 + // Set SEL signal BOOL FASTCALL GetATN(); - // ATNシグナル取得 + // Get ATN signal void FASTCALL SetATN(BOOL ast); - // ATNシグナル設定 + // Set ATN signal BOOL FASTCALL GetACK(); - // ACKシグナル取得 + // Get ACK signal void FASTCALL SetACK(BOOL ast); - // ACKシグナル設定 + // Set ACK signal BOOL FASTCALL GetRST(); - // RSTシグナル取得 + // Get RST signal void FASTCALL SetRST(BOOL ast); - // RSTシグナル設定 + // Set RST signal BOOL FASTCALL GetMSG(); - // MSGシグナル取得 + // Get MSG signal void FASTCALL SetMSG(BOOL ast); - // MSGシグナル設定 + // Set MSG signal BOOL FASTCALL GetCD(); - // CDシグナル取得 + // Get CD signal void FASTCALL SetCD(BOOL ast); - // CDシグナル設定 + // Set CD signal BOOL FASTCALL GetIO(); - // IOシグナル取得 + // Get IO signal void FASTCALL SetIO(BOOL ast); - // IOシグナル設定 + // Set IO signal BOOL FASTCALL GetREQ(); - // REQシグナル取得 + // Get REQ signal void FASTCALL SetREQ(BOOL ast); - // REQシグナル設定 + // Set REQ signal BYTE FASTCALL GetDAT(); - // データシグナル取得 + // Get DAT signal void FASTCALL SetDAT(BYTE dat); - // データシグナル設定 + // Set DAT signal BOOL FASTCALL GetDP(); - // パリティシグナル取得 + // Get Data parity signal int FASTCALL CommandHandShake(BYTE *buf); - // コマンド受信ハンドシェイク + // Command receive handshake int FASTCALL ReceiveHandShake(BYTE *buf, int count); - // データ受信ハンドシェイク + // Data receive handshake int FASTCALL SendHandShake(BYTE *buf, int count); - // データ送信ハンドシェイク + // Data transmission handshake #ifdef USE_SEL_EVENT_ENABLE - // SEL信号割り込み関係 + // SEL signal interrupt int FASTCALL PollSelectEvent(); - // SEL信号イベントポーリング + // SEL signal event polling void FASTCALL ClearSelectEvent(); - // SEL信号イベントクリア + // Clear SEL signal event #endif // USE_SEL_EVENT_ENABLE private: - // SCSI入出力信号制御 + // SCSI I/O signal control void FASTCALL MakeTable(); - // ワークテーブル作成 + // Create work data void FASTCALL SetControl(int pin, BOOL ast); - // 制御信号設定 + // Set Control Signal void FASTCALL SetMode(int pin, int mode); - // SCSI入出力モード設定 + // Set SCSI I/O mode BOOL FASTCALL GetSignal(int pin); - // SCSI入力信号値取得 + // Get SCSI input signal value void FASTCALL SetSignal(int pin, BOOL ast); - // SCSI出力信号値設定 + // Set SCSI output signal value BOOL FASTCALL WaitSignal(int pin, BOOL ast); - // 信号変化待ち - // 割り込み制御 + // Wait for a signal to change + // Interrupt control void FASTCALL DisableIRQ(); - // IRQ禁止 + // IRQ Disabled void FASTCALL EnableIRQ(); - // IRQ有効 + // IRQ Enabled - // GPIOピン機能設定 + // GPIO pin functionality settings void FASTCALL PinConfig(int pin, int mode); - // GPIOピン機能設定(入出力設定) + // GPIO pin direction setting void FASTCALL PullConfig(int pin, int mode); - // GPIOピン機能設定(プルアップ/ダウン) + // GPIO pin pull up/down resistor setting void FASTCALL PinSetSignal(int pin, BOOL ast); - // GPIOピン出力信号設定 + // Set GPIO output signal void FASTCALL DrvConfig(DWORD drive); - // GPIOドライブ能力設定 + // Set GPIO drive strength - mode_e actmode; // 動作モード + mode_e actmode; // Operation mode - DWORD baseaddr; // ベースアドレス + DWORD baseaddr; // Base address int rpitype; - // ラズパイ種別 + // Type of Raspberry Pi - volatile DWORD *gpio; // GPIOレジスタ + volatile DWORD *gpio; // GPIO register - volatile DWORD *pads; // PADSレジスタ + volatile DWORD *pads; // PADS register - volatile DWORD *level; // GPIO入力レベル + volatile DWORD *level; // GPIO input level - volatile DWORD *irpctl; // 割り込み制御レジスタ + volatile DWORD *irpctl; // Interrupt control register #ifndef BAREMETAL - volatile DWORD irptenb; // 割り込み有効状態 + volatile DWORD irptenb; // Interrupt enabled state - volatile DWORD *qa7regs; // QA7レジスタ + volatile DWORD *qa7regs; // QA7 register - volatile int tintcore; // 割り込み制御対象CPU + volatile int tintcore; // Interupt control target CPU. - volatile DWORD tintctl; // 割り込みコントロール + volatile DWORD tintctl; // Interupt control - volatile DWORD giccpmr; // GICC 優先度設定 + volatile DWORD giccpmr; // GICC priority setting #endif // BAREMETAL - volatile DWORD *gicd; // GIC 割り込み分配器レジスタ + volatile DWORD *gicd; // GIC Interrupt distributor register - volatile DWORD *gicc; // GIC CPUインターフェースレジスタ + volatile DWORD *gicc; // GIC CPU interface register - DWORD gpfsel[4]; // GPFSEL0-4バックアップ + DWORD gpfsel[4]; // GPFSEL0-4 backup values - DWORD signals; // バス全信号 + DWORD signals; // All bus signals #if defined(USE_SEL_EVENT_ENABLE) && !defined(BAREMETAL) - struct gpioevent_request selevreq; // SEL信号イベント要求 + struct gpioevent_request selevreq; // SEL signal event request - int epfd; // epollファイルディスクプリタ + int epfd; // epoll file descriptor #endif // USE_SEL_EVENT_ENABLE && !BAREMETAL #if SIGNAL_CONTROL_MODE == 0 - DWORD tblDatMsk[3][256]; // データマスク用テーブル + DWORD tblDatMsk[3][256]; // Data mask table - DWORD tblDatSet[3][256]; // データ設定用テーブル + DWORD tblDatSet[3][256]; // Data setting table #else - DWORD tblDatMsk[256]; // データマスク用テーブル + DWORD tblDatMsk[256]; // Data mask table - DWORD tblDatSet[256]; // データ設定用テーブル + DWORD tblDatSet[256]; // Table setting table #endif - static const int SignalTable[19]; // シグナルテーブル + static const int SignalTable[19]; // signal table }; //=========================================================================== // -// システムタイマ +// System timer // //=========================================================================== class SysTimer { public: static void FASTCALL Init(DWORD *syst, DWORD *armt); - // 初期化 + // Initialization static DWORD FASTCALL GetTimerLow(); - // システムタイマ(LO)取得 + // Get system timer low byte static DWORD FASTCALL GetTimerHigh(); - // システムタイマ(HI)取得 + // Get system timer high byte static void FASTCALL SleepNsec(DWORD nsec); - // ナノ秒単位のスリープ + // Sleep for N nanoseconds static void FASTCALL SleepUsec(DWORD usec); - // μ秒単位のスリープ + // Sleep for N microseconds private: static volatile DWORD *systaddr; - // システムタイマアドレス + // System timer address static volatile DWORD *armtaddr; - // ARMタイマアドレス + // ARM timer address static volatile DWORD corefreq; - // コア周波数 + // Core frequency }; #endif // gpiobus_h diff --git a/src/raspberrypi/rascsi.cpp b/src/raspberrypi/rascsi.cpp index 8717daa3..4e55f007 100644 --- a/src/raspberrypi/rascsi.cpp +++ b/src/raspberrypi/rascsi.cpp @@ -5,7 +5,7 @@ // // Powered by XM6 TypeG Technology. // Copyright (C) 2016-2020 GIMONS -// [ メイン ] +// [ RaSCSI main ] // //--------------------------------------------------------------------------- @@ -18,11 +18,11 @@ //--------------------------------------------------------------------------- // -// 定数宣言 +// Constant declarations // //--------------------------------------------------------------------------- -#define CtrlMax 8 // 最大SCSIコントローラ数 -#define UnitNum 2 // コントローラ辺りのユニット数 +#define CtrlMax 8 // Maximum number of SCSI controllers +#define UnitNum 2 // Number of units around controller #ifdef BAREMETAL #define FPRT(fp, ...) printf( __VA_ARGS__ ) #else @@ -31,38 +31,38 @@ //--------------------------------------------------------------------------- // -// 変数宣言 +// Variable declarations // //--------------------------------------------------------------------------- -static volatile BOOL running; // 実行中フラグ -static volatile BOOL active; // 処理中フラグ -SASIDEV *ctrl[CtrlMax]; // コントローラ -Disk *disk[CtrlMax * UnitNum]; // ディスク -GPIOBUS *bus; // GPIOバス +static volatile BOOL running; // Running flag +static volatile BOOL active; // Processing flag +SASIDEV *ctrl[CtrlMax]; // Controller +Disk *disk[CtrlMax * UnitNum]; // Disk +GPIOBUS *bus; // GPIO Bus #ifdef BAREMETAL FATFS fatfs; // FatFS #else -int monsocket; // モニター用ソケット -pthread_t monthread; // モニタースレッド +int monsocket; // Monitor Socket +pthread_t monthread; // Monitor Thread static void *MonThread(void *param); #endif // BAREMETAL #ifndef BAREMETAL //--------------------------------------------------------------------------- // -// シグナル処理 +// Signal Processing // //--------------------------------------------------------------------------- void KillHandler(int sig) { - // 停止指示 + // Stop instruction running = FALSE; } #endif // BAREMETAL //--------------------------------------------------------------------------- // -// バナー出力 +// Banner Output // //--------------------------------------------------------------------------- void Banner(int argc, char* argv[]) @@ -104,7 +104,7 @@ void Banner(int argc, char* argv[]) //--------------------------------------------------------------------------- // -// 初期化 +// Initialization // //--------------------------------------------------------------------------- BOOL Init() @@ -115,31 +115,31 @@ BOOL Init() struct sockaddr_in server; int yes; - // モニター用ソケット生成 + // Create socket for monitor monsocket = socket(PF_INET, SOCK_STREAM, 0); memset(&server, 0, sizeof(server)); server.sin_family = PF_INET; server.sin_port = htons(6868); server.sin_addr.s_addr = htonl(INADDR_ANY); - // アドレスの再利用を許可する + // allow address reuse yes = 1; if (setsockopt( monsocket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) < 0){ return FALSE; } - // バインド + // Bind if (bind(monsocket, (struct sockaddr *)&server, sizeof(struct sockaddr_in)) < 0) { FPRT(stderr, "Error : Already running?\n"); return FALSE; } - // モニタースレッド生成 + // Create Monitor Thread pthread_create(&monthread, NULL, MonThread, NULL); - // 割り込みハンドラ設定 + // Interrupt handler settings if (signal(SIGINT, KillHandler) == SIG_ERR) { return FALSE; } @@ -151,28 +151,28 @@ BOOL Init() } #endif // BAREMETAL - // GPIOBUS生成 + // GPIOBUS creation bus = new GPIOBUS(); - // GPIO初期化 + // GPIO Initialization if (!bus->Init()) { return FALSE; } - // バスリセット + // Bus Reset bus->Reset(); - // コントローラ初期化 + // Controller initialization for (i = 0; i < CtrlMax; i++) { ctrl[i] = NULL; } - // ディスク初期化 + // Disk Initialization for (i = 0; i < CtrlMax; i++) { disk[i] = NULL; } - // その他 + // Other running = FALSE; active = FALSE; @@ -181,14 +181,14 @@ BOOL Init() //--------------------------------------------------------------------------- // -// クリーンアップ +// Cleanup // //--------------------------------------------------------------------------- void Cleanup() { int i; - // ディスク削除 + // Delete the disks for (i = 0; i < CtrlMax * UnitNum; i++) { if (disk[i]) { delete disk[i]; @@ -196,7 +196,7 @@ void Cleanup() } } - // コントローラ削除 + // Delete the Controllers for (i = 0; i < CtrlMax; i++) { if (ctrl[i]) { delete ctrl[i]; @@ -204,14 +204,14 @@ void Cleanup() } } - // バスをクリーンアップ + // Cleanup the Bus bus->Cleanup(); - // GPIOBUS破棄 + // Discard the GPIOBUS object delete bus; #ifndef BAREMETAL - // モニター用ソケットクローズ + // Close the monitor socket if (monsocket >= 0) { close(monsocket); } @@ -220,27 +220,27 @@ void Cleanup() //--------------------------------------------------------------------------- // -// リセット +// Reset // //--------------------------------------------------------------------------- void Reset() { int i; - // コントローラリセット + // Reset all of the controllers for (i = 0; i < CtrlMax; i++) { if (ctrl[i]) { ctrl[i]->Reset(); } } - // バス信号線をリセット + // Reset the bus bus->Reset(); } //--------------------------------------------------------------------------- // -// デバイス一覧表示 +// List Devices // //--------------------------------------------------------------------------- void ListDevice(FILE *fp) @@ -256,18 +256,18 @@ void ListDevice(FILE *fp) find = FALSE; type[4] = 0; for (i = 0; i < CtrlMax * UnitNum; i++) { - // IDとユニット + // Initialize ID and unit number id = i / UnitNum; un = i % UnitNum; pUnit = disk[i]; - // ユニットが存在しないまたはヌルディスクならスキップ + // skip if unit does not exist or null disk if (pUnit == NULL || pUnit->IsNULL()) { continue; } - // ヘッダー出力 - if (!find) { + // Output the header + if (!find) { FPRT(fp, "\n"); FPRT(fp, "+----+----+------+-------------------------------------\n"); FPRT(fp, "| ID | UN | TYPE | DEVICE STATUS\n"); @@ -275,14 +275,14 @@ void ListDevice(FILE *fp) find = TRUE; } - // ID,UNIT,タイプ出力 + // ID,UNIT,Type,Device Status type[0] = (char)(pUnit->GetID() >> 24); type[1] = (char)(pUnit->GetID() >> 16); type[2] = (char)(pUnit->GetID() >> 8); type[3] = (char)(pUnit->GetID()); FPRT(fp, "| %d | %d | %s | ", id, un, type); - // マウント状態出力 + // mount status output if (pUnit->GetID() == MAKEID('S', 'C', 'B', 'R')) { FPRT(fp, "%s", "HOST BRIDGE"); } else { @@ -292,16 +292,16 @@ void ListDevice(FILE *fp) "NO MEDIA" : filepath.GetPath()); } - // ライトプロテクト状態出力 + // Write protection status if (pUnit->IsRemovable() && pUnit->IsReady() && pUnit->IsWriteP()) { FPRT(fp, "(WRITEPROTECT)"); } - // 次の行へ + // Goto the next line FPRT(fp, "\n"); } - // コントローラが無い場合 + // If there is no controller, find will be null if (!find) { FPRT(fp, "No device is installed.\n"); return; @@ -312,7 +312,7 @@ void ListDevice(FILE *fp) //--------------------------------------------------------------------------- // -// コントローラマッピング +// Controller Mapping // //--------------------------------------------------------------------------- void MapControler(FILE *fp, Disk **map) @@ -323,53 +323,53 @@ void MapControler(FILE *fp, Disk **map) int sasi_num; int scsi_num; - // 変更されたユニットの置き換え + // Replace the changed unit for (i = 0; i < CtrlMax; i++) { for (j = 0; j < UnitNum; j++) { unitno = i * UnitNum + j; if (disk[unitno] != map[unitno]) { - // 元のユニットが存在する + // Check if the original unit exists if (disk[unitno]) { - // コントローラから切り離す + // Disconnect it from the controller if (ctrl[i]) { ctrl[i]->SetUnit(j, NULL); } - // ユニットを解放 + // Free the Unit delete disk[unitno]; } - // 新しいユニットの設定 + // Setup a new unit disk[unitno] = map[unitno]; } } } - // 全コントローラを再構成 + // Reconfigure all of the controllers for (i = 0; i < CtrlMax; i++) { - // ユニット構成を調べる + // Examine the unit configuration sasi_num = 0; scsi_num = 0; for (j = 0; j < UnitNum; j++) { unitno = i * UnitNum + j; - // ユニットの種類で分岐 + // branch by unit type if (disk[unitno]) { if (disk[unitno]->IsSASI()) { - // SASIドライブ数加算 + // Drive is SASI, so increment SASI count sasi_num++; } else { - // SCSIドライブ数加算 + // Drive is SCSI, so increment SCSI count scsi_num++; } } - // ユニットを取り外す + // Remove the unit if (ctrl[i]) { ctrl[i]->SetUnit(j, NULL); } } - // 接続ユニットなし + // If there are no units connected if (sasi_num == 0 && scsi_num == 0) { if (ctrl[i]) { delete ctrl[i]; @@ -378,47 +378,47 @@ void MapControler(FILE *fp, Disk **map) } } - // SASI,SCSI混在 + // Mixture of SCSI and SASI if (sasi_num > 0 && scsi_num > 0) { FPRT(fp, "Error : SASI and SCSI can't be mixed\n"); continue; } if (sasi_num > 0) { - // SASIのユニットのみ + // Only SASI Unit(s) - // コントローラのタイプが違うなら解放 + // Release the controller if it is not SASI if (ctrl[i] && !ctrl[i]->IsSASI()) { delete ctrl[i]; ctrl[i] = NULL; } - // SASIコントローラ生成 + // Create a new SASI controller if (!ctrl[i]) { ctrl[i] = new SASIDEV(); ctrl[i]->Connect(i, bus); } } else { - // SCSIのユニットのみ + // Only SCSI Unit(s) - // コントローラのタイプが違うなら解放 + // Release the controller if it is not SCSI if (ctrl[i] && !ctrl[i]->IsSCSI()) { delete ctrl[i]; ctrl[i] = NULL; } - // SCSIコントローラ生成 + // Create a new SCSI controller if (!ctrl[i]) { ctrl[i] = new SCSIDEV(); ctrl[i]->Connect(i, bus); } } - // 全ユニット接続 + // connect all units for (j = 0; j < UnitNum; j++) { unitno = i * UnitNum + j; if (disk[unitno]) { - // ユニット接続 + // Add the unit connection ctrl[i]->SetUnit(j, disk[unitno]); } } @@ -427,7 +427,7 @@ void MapControler(FILE *fp, Disk **map) //--------------------------------------------------------------------------- // -// コマンド処理 +// Command Processing // //--------------------------------------------------------------------------- BOOL ProcessCmd(FILE *fp, int id, int un, int cmd, int type, char *file) @@ -438,51 +438,51 @@ BOOL ProcessCmd(FILE *fp, int id, int un, int cmd, int type, char *file) Filepath filepath; Disk *pUnit; - // ユニット一覧を複写 + // Copy the Unit List memcpy(map, disk, sizeof(disk)); - // IDチェック + // Check the Controller Number if (id < 0 || id >= CtrlMax) { FPRT(fp, "Error : Invalid ID\n"); return FALSE; } - // ユニットチェック + // Check the Unit Number if (un < 0 || un >= UnitNum) { FPRT(fp, "Error : Invalid unit number\n"); return FALSE; } - // 接続コマンド + // Connect Command if (cmd == 0) { // ATTACH - // SASIとSCSIを見分ける + // Distinguish between SASI and SCSI ext = NULL; pUnit = NULL; if (type == 0) { - // パスチェック + // Passed the check if (!file) { return FALSE; } - // 最低5文字 + // Check that command is at least 5 characters long len = strlen(file); if (len < 5) { return FALSE; } - // 拡張子チェック + // Check the extension if (file[len - 4] != '.') { return FALSE; } - // 拡張子がSASIタイプで無ければSCSIに差し替え + // If the extension is not SASI type, replace with SCSI ext = &file[len - 3]; if (xstrcasecmp(ext, "hdf") != 0) { type = 1; } } - // タイプ別のインスタンスを生成 + // Create a new drive, based upon type switch (type) { case 0: // HDF pUnit = new SASIHD(); @@ -514,12 +514,12 @@ BOOL ProcessCmd(FILE *fp, int id, int un, int cmd, int type, char *file) return FALSE; } - // ドライブはファイルの確認を行う + // drive checks files if (type <= 1 || (type <= 3 && xstrcasecmp(file, "-") != 0)) { - // パスを設定 + // Set the Path filepath.SetPath(file); - // オープン + // Open the file path if (!pUnit->Open(filepath)) { FPRT(fp, "Error : File open error [%s]\n", file); delete pUnit; @@ -527,47 +527,47 @@ BOOL ProcessCmd(FILE *fp, int id, int un, int cmd, int type, char *file) } } - // ライトスルーに設定 + // Set the cache to write-through pUnit->SetCacheWB(FALSE); - // 新しいユニットで置き換え + // Replace with the newly created unit map[id * UnitNum + un] = pUnit; - // コントローラマッピング + // Re-map the controller MapControler(fp, map); return TRUE; } - // 有効なコマンドか + // Is this a valid command? if (cmd > 4) { FPRT(fp, "Error : Invalid command\n"); return FALSE; } - // コントローラが存在するか + // Does the controller exist? if (ctrl[id] == NULL) { FPRT(fp, "Error : No such device\n"); return FALSE; } - // ユニットが存在するか + // Does the unit exist? pUnit = disk[id * UnitNum + un]; if (pUnit == NULL) { FPRT(fp, "Error : No such device\n"); return FALSE; } - // 切断コマンド + // Disconnect Command if (cmd == 1) { // DETACH - // 既存のユニットを解放 + // Free the existing unit map[id * UnitNum + un] = NULL; - // コントローラマッピング + // Re-map the controller MapControler(fp, map); return TRUE; } - // MOかCDの場合だけ有効 + // Valid only for MO or CD if (pUnit->GetID() != MAKEID('S', 'C', 'M', 'O') && pUnit->GetID() != MAKEID('S', 'C', 'C', 'D')) { FPRT(fp, "Error : Operation denied(Deveice isn't removable)\n"); @@ -576,10 +576,10 @@ BOOL ProcessCmd(FILE *fp, int id, int un, int cmd, int type, char *file) switch (cmd) { case 2: // INSERT - // パスを設定 + // Set the file path filepath.SetPath(file); - // オープン + // Open the file if (pUnit->Open(filepath)) { FPRT(fp, "Error : File open error [%s]\n", file); return FALSE; @@ -607,7 +607,7 @@ BOOL ProcessCmd(FILE *fp, int id, int un, int cmd, int type, char *file) //--------------------------------------------------------------------------- // -// 引数処理 +// Argument Parsing // //--------------------------------------------------------------------------- BOOL ParseArgument(int argc, char* argv[]) @@ -628,20 +628,20 @@ BOOL ParseArgument(int argc, char* argv[]) char *ext; #ifdef BAREMETAL - // SDカードマウント + // Mount the SD card fr = f_mount(&fatfs, "", 1); if (fr != FR_OK) { FPRT(stderr, "Error : SD card mount failed.\n"); return FALSE; } - // 設定ファイルがなければ処理を中断 + // If there is no setting file, the processing is interrupted fr = f_open(&fp, "rascsi.ini", FA_READ); if (fr != FR_OK) { return FALSE; } #else - // IDとパス指定がなければ処理を中断 + // If the ID and path are not specified, the processing is interrupted if (argc < 3) { return TRUE; } @@ -649,17 +649,17 @@ BOOL ParseArgument(int argc, char* argv[]) argc--; #endif // BAREMETAL - // 解読開始 + // Start Decoding while (TRUE) { #ifdef BAREMETAL - // 1行取得 + // Get one Line memset(line, 0x00, sizeof(line)); if (f_gets(line, sizeof(line) -1, &fp) == NULL) { break; } - // CR/LF削除 + // Delete the CR/LF len = strlen(line); while (len > 0) { if (line[len - 1] != '\r' && line[len - 1] != '\n') { @@ -676,13 +676,13 @@ BOOL ParseArgument(int argc, char* argv[]) argc -= 2; #endif // BAREMETAL - // IDとパスを取得 + // Get the ID and Path #ifdef BAREMETAL argID = &line[0]; argPath = &line[4]; line[3] = '\0'; - // 事前チェック + // Check if the line is an empty string if (argID[0] == '\0' || argPath[0] == '\0') { continue; } @@ -690,7 +690,7 @@ BOOL ParseArgument(int argc, char* argv[]) argID = argv[i++]; argPath = argv[i++]; - // 事前チェック + // Check if the argument is invalid if (argID[0] != '-') { FPRT(stderr, "Error : Invalid argument(-IDn or -HDn) [%s]\n", argID); @@ -700,41 +700,41 @@ BOOL ParseArgument(int argc, char* argv[]) #endif // BAREMETAL if (strlen(argID) == 3 && xstrncasecmp(argID, "id", 2) == 0) { - // ID or idの形式 + // ID or ID Format - // ID番号をチェック(0-7) + // Check that the ID number is valid (0-7) if (argID[2] < '0' || argID[2] > '7') { FPRT(stderr, "Error : Invalid argument(IDn n=0-7) [%c]\n", argID[2]); goto parse_error; } - // ID,ユニット確定 - id = argID[2] - '0'; + // The ID unit is good + id = argID[2] - '0'; un = 0; } else if (xstrncasecmp(argID, "hd", 2) == 0) { - // HD or hdの形式 + // HD or HD format if (strlen(argID) == 3) { - // HD番号をチェック(0-9) + // Check that the HD number is valid (0-9) if (argID[2] < '0' || argID[2] > '9') { FPRT(stderr, "Error : Invalid argument(HDn n=0-15) [%c]\n", argID[2]); goto parse_error; } - // ID,ユニット確定 + // ID was confirmed id = (argID[2] - '0') / UnitNum; un = (argID[2] - '0') % UnitNum; } else if (strlen(argID) == 4) { - // HD番号をチェック(10-15) + // Check that the HD number is valid (10-15) if (argID[2] != '1' || argID[3] < '0' || argID[3] > '5') { FPRT(stderr, "Error : Invalid argument(HDn n=0-15) [%c]\n", argID[2]); goto parse_error; } - // ID,ユニット確定 + // The ID unit is good - create the id and unit number id = ((argID[3] - '0') + 10) / UnitNum; un = ((argID[3] - '0') + 10) % UnitNum; #ifdef BAREMETAL @@ -751,20 +751,20 @@ BOOL ParseArgument(int argc, char* argv[]) goto parse_error; } - // すでにアクティブなデバイスがあるならスキップ + // Skip if there is already an active device if (disk[id * UnitNum + un] && !disk[id * UnitNum + un]->IsNULL()) { continue; } - // デバイスタイプを初期化 + // Initialize device type type = -1; - // イーサネットとホストブリッジのチェック + // Check ethernet and host bridge if (xstrcasecmp(argPath, "bridge") == 0) { type = 4; } else { - // パスの長さをチェック + // Check the path length len = strlen(argPath); if (len < 5) { FPRT(stderr, @@ -773,14 +773,14 @@ BOOL ParseArgument(int argc, char* argv[]) goto parse_error; } - // 拡張子を持っているか? + // Does the file have an extension? if (argPath[len - 4] != '.') { FPRT(stderr, "Error : Invalid argument(No extension) [%s]\n", argPath); goto parse_error; } - // タイプを決める + // Figure out what the type is ext = &argPath[len - 3]; if (xstrcasecmp(ext, "hdf") == 0 || xstrcasecmp(ext, "hds") == 0 || @@ -796,25 +796,25 @@ BOOL ParseArgument(int argc, char* argv[]) // CD type = 3; } else { - // タイプが判別できない + // Cannot determine the file type FPRT(stderr, "Error : Invalid argument(file type) [%s]\n", ext); goto parse_error; } } - // コマンド実行 + // Execute the command if (!ProcessCmd(stderr, id, un, 0, type, argPath)) { goto parse_error; } } #ifdef BAREMETAL - // 設定ファイルクローズ + // Close the configuration file f_close(&fp); #endif // BAREMETAL - // デバイスリスト表示 + // Display the device list ListDevice(stdout); return TRUE; @@ -822,7 +822,7 @@ BOOL ParseArgument(int argc, char* argv[]) parse_error: #ifdef BAREMETAL - // 設定ファイルクローズ + // Close the configuration file f_close(&fp); #endif // BAREMETAL @@ -832,7 +832,7 @@ parse_error: #ifndef BAREMETAL //--------------------------------------------------------------------------- // -// スレッドを特定のCPUに固定する +// Pin the thread to a specific CPU // //--------------------------------------------------------------------------- void FixCpu(int cpu) @@ -840,12 +840,12 @@ void FixCpu(int cpu) cpu_set_t cpuset; int cpus; - // CPU数取得 + // Get the number of CPUs CPU_ZERO(&cpuset); sched_getaffinity(0, sizeof(cpu_set_t), &cpuset); cpus = CPU_COUNT(&cpuset); - // アフィニティ設定 + // Set the thread affinity if (cpu < cpus) { CPU_ZERO(&cpuset); CPU_SET(cpu, &cpuset); @@ -855,7 +855,7 @@ void FixCpu(int cpu) //--------------------------------------------------------------------------- // -// モニタースレッド +// Monitor Thread // //--------------------------------------------------------------------------- static void *MonThread(void *param) @@ -875,23 +875,23 @@ static void *MonThread(void *param) int type; char *file; - // スケジューラ設定 + // Scheduler Settings schedparam.sched_priority = 0; sched_setscheduler(0, SCHED_IDLE, &schedparam); - // CPUを固定 + // Set the affinity to a specific processor core FixCpu(2); - // 実行開始待ち + // Wait for the execution to start while (!running) { usleep(1); } - // 監視準備 + // Setup the monitor socket to receive commands listen(monsocket, 1); while (1) { - // 接続待ち + // Wait for connection memset(&client, 0, sizeof(client)); len = sizeof(client); fd = accept(monsocket, (struct sockaddr*)&client, &len); @@ -899,68 +899,68 @@ static void *MonThread(void *param) break; } - // コマンド取得 + // Fetch the command fp = fdopen(fd, "r+"); p = fgets(buf, BUFSIZ, fp); - // コマンド取得に失敗 + // Failed to get the command if (!p) { goto next; } - // 改行文字を削除 + // Remove the newline character p[strlen(p) - 1] = 0; - // デバイスリスト表示 + // List all of the devices if (xstrncasecmp(p, "list", 4) == 0) { ListDevice(fp); goto next; } - // パラメータの分離 + // Parameter separation argv[0] = p; for (i = 1; i < 5; i++) { - // パラメータ値をスキップ + // Skip parameter values while (*p && (*p != ' ')) { p++; } - // スペースをNULLに置換 + // Replace spaces with null characters while (*p && (*p == ' ')) { *p++ = 0; } - // パラメータを見失った + // The parameters were lost if (!*p) { break; } - // パラメータとして認識 + // Recognized as a parameter argv[i] = p; } - // 全パラメータの取得失敗 + // Failed to get all parameters if (i < 5) { goto next; } - // ID,ユニット,コマンド,タイプ,ファイル + // ID, unit, command, type, file id = atoi(argv[0]); un = atoi(argv[1]); cmd = atoi(argv[2]); type = atoi(argv[3]); file = argv[4]; - // アイドルになるまで待つ + // Wait until we becom idle while (active) { usleep(500 * 1000); } - // コマンド実行 + // Execute the command ProcessCmd(fp, id, un, cmd, type, file); next: - // 接続解放 + // Release the connection fclose(fp); close(fd); } @@ -971,7 +971,7 @@ next: //--------------------------------------------------------------------------- // -// 主処理 +// Main processing // //--------------------------------------------------------------------------- #ifdef BAREMETAL @@ -994,66 +994,66 @@ int main(int argc, char* argv[]) struct sched_param schparam; #endif // BAREMETAL - // バナー出力 + // Output the Banner Banner(argc, argv); - // 初期化 + // Initialize ret = 0; if (!Init()) { ret = EPERM; goto init_exit; } - // リセット + // Reset Reset(); #ifdef BAREMETAL - // BUSYアサート(ホスト側を待たせるため) + // BUSY assert (to hold the host side) bus->SetBSY(TRUE); #endif - // 引数処理 + // Argument parsing if (!ParseArgument(argc, argv)) { ret = EINVAL; goto err_exit; } #ifdef BAREMETAL - // BUSYネゲート(ホスト側を待たせるため) + // Release the busy signal bus->SetBSY(FALSE); #endif #ifndef BAREMETAL - // CPUを固定 + // Set the affinity to a specific processor core FixCpu(3); #ifdef USE_SEL_EVENT_ENABLE - // スケジューリングポリシー設定(最優先) + // Scheduling policy setting (highest priority) schparam.sched_priority = sched_get_priority_max(SCHED_FIFO); sched_setscheduler(0, SCHED_FIFO, &schparam); #endif // USE_SEL_EVENT_ENABLE #endif // BAREMETAL - // 実行開始 + // Start execution running = TRUE; - // メインループ + // Main Loop while (running) { - // ワーク初期化 + // Work initialization actid = -1; phase = BUS::busfree; #ifdef USE_SEL_EVENT_ENABLE - // SEL信号ポーリング + // SEL signal polling if (bus->PollSelectEvent() < 0) { - // 割り込みで停止 + // Stop on interrupt if (errno == EINTR) { break; } continue; } - // バスの状態取得 + // Get the bus bus->Aquire(); #else bus->Aquire(); @@ -1065,8 +1065,8 @@ int main(int argc, char* argv[]) } #endif // USE_SEL_EVENT_ENABLE - // イニシエータがID設定中にアサートしている - // 可能性があるのでBSYが解除されるまで待つ(最大3秒) + // Wait until BSY is released as there is a possibility for the + // initiator to assert it while setting the ID (for up to 3 seconds) if (bus->GetBSY()) { now = SysTimer::GetTimerLow(); while ((SysTimer::GetTimerLow() - now) < 3 * 1000 * 1000) { @@ -1077,66 +1077,66 @@ int main(int argc, char* argv[]) } } - // ビジー、または他のデバイスが応答したので止める + // Stop because it the bus is busy or another device responded if (bus->GetBSY() || !bus->GetSEL()) { continue; } - // 全コントローラに通知 + // Notify all controllers data = bus->GetDAT(); for (i = 0; i < CtrlMax; i++) { if (!ctrl[i] || (data & (1 << i)) == 0) { continue; } - // セレクションフェーズに移行したターゲットを探す + // Find the target that has moved to the selection phase if (ctrl[i]->Process() == BUS::selection) { - // ターゲットのIDを取得 + // Get the target ID actid = i; - // セレクションフェーズ + // Bus Selection phase phase = BUS::selection; break; } } - // セレクションフェーズが開始されていなければバスの監視へ戻る + // Return to bus monitoring if the selection phase has not started if (phase != BUS::selection) { continue; } - // ターゲット走行開始 + // Start target device active = TRUE; #if !defined(USE_SEL_EVENT_ENABLE) && !defined(BAREMETAL) - // スケジューリングポリシー設定(最優先) + // Scheduling policy setting (highest priority) schparam.sched_priority = sched_get_priority_max(SCHED_FIFO); sched_setscheduler(0, SCHED_FIFO, &schparam); #endif // !USE_SEL_EVENT_ENABLE && !BAREMETAL - // バスフリーになるまでループ + // Loop until the bus is free while (running) { - // ターゲット駆動 + // Target drive phase = ctrl[actid]->Process(); - // バスフリーになったら終了 + // End when the bus is free if (phase == BUS::busfree) { break; } } #if !defined(USE_SEL_EVENT_ENABLE) && !defined(BAREMETAL) - // スケジューリングポリシー設定(ノーマル) + // Set the scheduling priority back to normal schparam.sched_priority = 0; sched_setscheduler(0, SCHED_OTHER, &schparam); #endif // !USE_SEL_EVENT_ENABLE && !BAREMETAL - // ターゲット走行終了 + // End the target travel active = FALSE; } err_exit: - // クリーンアップ + // Cleanup Cleanup(); init_exit: