|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2018 [email protected] ! 4: // ! 5: ! 6: #pragma once ! 7: ! 8: #include "device.h" ! 9: #include "scsi.h" ! 10: ! 11: // 前方参照 (scsitarget.cpp 内だけで使われている) ! 12: // friend class に書くクラス名は前方参照なくても大丈夫らしい。 ! 13: class SCSICmd; ! 14: ! 15: class SCSITarget : public Device ! 16: { ! 17: typedef Device inherited; ! 18: friend class SCSICmdModeSelect6; ! 19: friend class SCSICmdRead6; ! 20: friend class SCSICmdWrite6; ! 21: friend class SCSICmdRead10; ! 22: public: ! 23: SCSITarget(SCSIHostDevice *host, int id, SCSI::DevType type); ! 24: virtual ~SCSITarget(); ! 25: ! 26: // SCSI デバイス種別を取得 ! 27: SCSI::DevType GetDevType() const { return devtype; } ! 28: ! 29: void Selected(); ! 30: void Ack(); ! 31: ! 32: // コマンドフェーズの処理。 ! 33: void ExecCommand(const std::vector<uint8>& cmds); ! 34: ! 35: // デバイス固有のコマンドの処理。(派生クラスで用意) ! 36: virtual SCSICmd *ExecDeviceCommand(); ! 37: ! 38: // データインフェーズを開始。 ! 39: uint ExecDataIn(const uint8 **ptr); ! 40: ! 41: // データアウトフェーズを開始。 ! 42: uint ExecDataOut(uint8 **ptr); ! 43: ! 44: // ステータスバイトを取得 (およびデータアウトフェーズ完了処理)。 ! 45: uint8 GetStatusByte(); ! 46: ! 47: // メッセージバイトを取得。 ! 48: uint8 GetMessageByte(); ! 49: ! 50: protected: ! 51: SCSIHostDevice *host = NULL; // ホストアダプタ ! 52: SCSI::DevType devtype {}; // デバイス種別 ! 53: int ID = 0; // 自分の SCSI ID ! 54: ! 55: // SCSI バス信号は SCSIHost が管理 ! 56: uint8 GetDATA() { return host->GetDATA(); } ! 57: void SetDATA(uint8 val) { host->SetDATA(val); } ! 58: ! 59: bool GetACK() const { return host->GetACK(); } ! 60: void SetACK(bool val) { host->SetACK(val); } ! 61: ! 62: bool GetREQ() const { return host->GetREQ(); } ! 63: void SetREQ(bool val) { host->SetREQ(val); } ! 64: ! 65: bool GetSEL() const { return host->GetSEL(); } ! 66: void AssertSEL(int id) { host->AssertSEL(id); } ! 67: void NegateSEL(int id) { host->NegateSEL(id); } ! 68: ! 69: bool GetBSY() const { return host->GetBSY(); } ! 70: void AssertBSY(int id) { host->AssertBSY(id); } ! 71: void NegateBSY(int id) { host->NegateBSY(id); } ! 72: ! 73: bool GetMSG() const { return host->GetMSG(); } ! 74: void SetMSG(bool val) { host->SetMSG(val); } ! 75: ! 76: bool GetCD() const { return host->GetCD(); } ! 77: void SetCD(bool val) { host->SetCD(val); } ! 78: ! 79: bool GetIO() const { return host->GetIO(); } ! 80: void SetIO(bool val) { host->SetIO(val); } ! 81: ! 82: bool GetATN() const { return host->GetATN(); } ! 83: ! 84: void BusFreePhase(); ! 85: void DataOutPhase(); ! 86: void DataInPhase(); ! 87: void CommandPhase(); ! 88: void StatusPhase(); ! 89: void MsgOutPhase(); ! 90: void MsgInPhase(); ! 91: ! 92: uint phase = 0; // ターゲットの状態 ! 93: uint nextphase = 0; // ATN による MsgOut の次の本来のフェーズ ! 94: // ターゲットの現在のフェーズを取得 ! 95: uint GetPhase() const { return phase; } ! 96: // ターゲットのフェーズを newphase に移行 ! 97: void SetPhase(uint newphase); ! 98: ! 99: // コマンド ! 100: std::vector<uint8> cmds {}; ! 101: SCSICmd *cmd = NULL; ! 102: ! 103: uint8 lastdata = 0; ! 104: uint8 lastmsg = 0; // 前回の MsgOut のメッセージ ! 105: ! 106: // 論理ブロック長 (ModeSelect コマンドでホストから指定される) ! 107: uint32 blocksize = 0; ! 108: }; ! 109: ! 110: // SCSI HD ! 111: class SCSIHD : public SCSITarget ! 112: { ! 113: typedef SCSITarget inherited; ! 114: friend class SCSICmdRead6; ! 115: friend class SCSICmdWrite6; ! 116: friend class SCSICmdReadCapacity; ! 117: friend class SCSICmdRead10; ! 118: public: ! 119: SCSIHD(SCSIHostDevice *host, int id); ! 120: virtual ~SCSIHD(); ! 121: ! 122: virtual bool Init(); ! 123: ! 124: // デバイス固有のコマンドの処理。 ! 125: virtual SCSICmd *ExecDeviceCommand(); ! 126: ! 127: private: ! 128: int fd = 0; ! 129: uint8 *mem = NULL; ! 130: size_t memlen = 0; ! 131: bool writeprotect = false; ! 132: ! 133: static const uint8 inquiry_data[36]; ! 134: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.