|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2023 nono project ! 4: // Licensed under nono-license.txt ! 5: // ! 6: ! 7: // ! 8: // Nereid イーサネット (RTL8019AS) ! 9: // ! 10: ! 11: #pragma once ! 12: ! 13: #include "ethernet.h" ! 14: #include "event.h" ! 15: #include "hostnet.h" ! 16: #include "message.h" ! 17: #include "monitor.h" ! 18: ! 19: class InterruptDevice; ! 20: ! 21: struct RTL8019 ! 22: { ! 23: // レジスタアドレスは $0-$f までの16個 x Page 0-3 の4ページなので、 ! 24: // ここでのレジスタ番号は全部リニアに並べて表現する。 ! 25: // Page0 はほとんどが Read/Write でレジスタが異なるが、 ! 26: // それについてはここでは区別せず、Read/Write のコード中で使い分ける。 ! 27: ! 28: // Page0 R(/W) ! 29: static const uint32 CR = 0x00; // RW: Command Register ! 30: static const uint32 CLDA0 = 0x01; // R-: Current Local DMA Address Regs ! 31: static const uint32 CLDA1 = 0x02; // R-: Current Local DMA Address Regs ! 32: static const uint32 BNRY = 0x03; // RW: Boundary Register ! 33: static const uint32 TSR = 0x04; // R-: Transmit Status Register ! 34: static const uint32 NCR = 0x05; // R-: Number of Collisions Register ! 35: static const uint32 FIFO = 0x06; // R-: First In First Out Register ! 36: static const uint32 ISR = 0x07; // RW: Interrupt Status Register ! 37: static const uint32 CRDA0 = 0x08; // R-: Current Remote DMA Address Regs ! 38: static const uint32 CRDA1 = 0x09; // R-: Current Remote DMA Address Regs ! 39: static const uint32 ID0 = 0x0a; // R-: 8019ID0 ! 40: static const uint32 ID1 = 0x0b; // R-: 8019ID1 ! 41: static const uint32 RSR = 0x0c; // R-: Receive Configuration Register ! 42: static const uint32 CNTR0 = 0x0d; // R-: Frame Align.Error Tally Counter ! 43: static const uint32 CNTR1 = 0x0e; // R-: CRC Error Tally Counter Reg. ! 44: static const uint32 CNTR2 = 0x0f; // R-: Missed Pakcet Tally Counter Reg. ! 45: ! 46: // Page0 W ! 47: static const uint32 PSTART = 0x01; // -W: Page Start Register ! 48: static const uint32 PSTOP = 0x02; // -W: Page Stop Register ! 49: static const uint32 TPSR = 0x04; // -W: Transmit Page Start Register ! 50: static const uint32 TBCR0 = 0x05; // -W: Transmit Byte Counter Registers ! 51: static const uint32 TBCR1 = 0x06; // -W: Transmit Byte Counter Registers ! 52: static const uint32 RSAR0 = 0x08; // -W: Remote Start Address Regs ! 53: static const uint32 RSAR1 = 0x09; // -W: Remote Start Address Regs ! 54: static const uint32 RBCR0 = 0x0a; // -W: Remote Byte Count Registers ! 55: static const uint32 RBCR1 = 0x0b; // -W: Remote Byte Count Registers ! 56: static const uint32 RCR = 0x0c; // -W: Receive Configuration Register ! 57: static const uint32 TCR = 0x0d; // -W: Transmit Configuration Register ! 58: static const uint32 DCR = 0x0e; // -W: Data Configuration Register ! 59: static const uint32 IMR = 0x0f; // -W: Interrupt Mask Register ! 60: ! 61: // Page 1 R/W ! 62: static const uint32 CR_1 = 0x10; ! 63: static const uint32 PAR0 = 0x11; // RW: Physical Address Registers ! 64: static const uint32 PAR1 = 0x12; // RW: Physical Address Registers ! 65: static const uint32 PAR2 = 0x13; // RW: Physical Address Registers ! 66: static const uint32 PAR3 = 0x14; // RW: Physical Address Registers ! 67: static const uint32 PAR4 = 0x15; // RW: Physical Address Registers ! 68: static const uint32 PAR5 = 0x16; // RW: Physical Address Registers ! 69: static const uint32 CURR = 0x17; // RW: Current Page Register ! 70: static const uint32 MAR0 = 0x18; // RW: Multicast Address Registers ! 71: static const uint32 MAR1 = 0x19; // RW: Multicast Address Registers ! 72: static const uint32 MAR2 = 0x1a; // RW: Multicast Address Registers ! 73: static const uint32 MAR3 = 0x1b; // RW: Multicast Address Registers ! 74: static const uint32 MAR4 = 0x1c; // RW: Multicast Address Registers ! 75: static const uint32 MAR5 = 0x1d; // RW: Multicast Address Registers ! 76: static const uint32 MAR6 = 0x1e; // RW: Multicast Address Registers ! 77: static const uint32 MAR7 = 0x1f; // RW: Multicast Address Registers ! 78: ! 79: // Page2 R ! 80: static const uint32 CR_2 = 0x20; ! 81: static const uint32 PSTART_2= 0x21; ! 82: static const uint32 PSTOP_2 = 0x22; ! 83: static const uint32 TPSR_2 = 0x24; ! 84: static const uint32 RCR_2 = 0x2c; ! 85: static const uint32 TCR_2 = 0x2d; ! 86: static const uint32 DCR_2 = 0x2e; ! 87: static const uint32 IMR_2 = 0x2f; ! 88: ! 89: // Page3 R/W ! 90: static const uint32 CR_3 = 0x30; ! 91: static const uint32 CR9346 = 0x31; // RW: 9346 Command Register ! 92: static const uint32 BPAGE = 0x32; // RW: BROM Page Register ! 93: static const uint32 CONFIG0 = 0x33; // R-: RTL8019AS Config. Register 0 ! 94: static const uint32 CONFIG1 = 0x34; // RW: RTL8019AS Config. Register 1 ! 95: static const uint32 CONFIG2 = 0x35; // RW: RTL8019AS Config. Register 2 ! 96: static const uint32 CONFIG3 = 0x36; // RW: RTL8019AS Config. Register 3 ! 97: static const uint32 TEST = 0x37; // -W: ! 98: static const uint32 CSNSAV = 0x38; // R-: CSN Save Register (For PnP) ! 99: static const uint32 HLTCLK = 0x39; // -W: Halt Clock Register ! 100: static const uint32 INTR = 0x3b; // R-: Interrupt Register ! 101: static const uint32 FMWP = 0x3c; // -W: Flush Memory Write Protect Reg. ! 102: static const uint32 CONFIG4 = 0x3d; // R-: RTL8019AS Config. Register 4 ! 103: ! 104: // 7 6 5 4 3 2 1 0 ! 105: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 106: // CR | PS | RD | TXP | STA | STP | ! 107: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 108: static const uint32 CR_RD_READ = 0x08; ! 109: static const uint32 CR_RD_WRITE = 0x10; ! 110: static const uint32 CR_RD_SEND = 0x18; ! 111: static const uint32 CR_TXP = 0x04; ! 112: static const uint32 CR_STA = 0x02; ! 113: static const uint32 CR_STP = 0x01; ! 114: ! 115: // 7 6 5 4 3 2 1 0 ! 116: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 117: // TSR | OWC | CDH | 0 | CRS | ABT | COL | 1 | PTX | ! 118: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 119: static const uint32 TSR_OWC = 0x80; // Out of Window Collision ! 120: static const uint32 TSR_CDH = 0x40; // CD Heartbeat ! 121: static const uint32 TSR_CRS = 0x10; // Carrier Sense lost bit ! 122: static const uint32 TSR_ABT = 0x08; // Abort TX due to excessive coll. ! 123: static const uint32 TSR_COL = 0x04; // TX collied with other station ! 124: static const uint32 TSR_PTX = 0x01; // TX completes with no errors ! 125: ! 126: // 7 6 5 4 3 2 1 0 ! 127: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 128: // ISR | RST | RDC | CNT | OVW | TXE | RXE | PTX | PRX | ! 129: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 130: static const uint32 ISR_RST = 0x80; // Enter reset state ! 131: static const uint32 ISR_RDC = 0x40; // Remote DMA operation completed ! 132: static const uint32 ISR_CNT = 0x20; // ! 133: static const uint32 ISR_OVW = 0x10; // RX buffer overflow ! 134: static const uint32 ISR_TXE = 0x08; // TX Error ! 135: static const uint32 ISR_RXE = 0x04; // RX Error ! 136: static const uint32 ISR_PTX = 0x02; // Packet transmitted with no errors ! 137: static const uint32 ISR_PRX = 0x01; // Packet received with no errors ! 138: ! 139: // 7 6 5 4 3 2 1 0 ! 140: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 141: // RSR | DFR | DIS | PHY | MPA | 0 | FAE | CRC | PRX | ! 142: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 143: static const uint32 RSR_DFR = 0x80; // Deffering ! 144: static const uint32 RSR_DIS = 0x40; // Receiver Disabled ! 145: static const uint32 RSR_PHY = 0x20; // Recv'd packet is multi/broadcast ! 146: static const uint32 RSR_MPA = 0x10; // Missed Packet ! 147: static const uint32 RSR_FAE = 0x04; // Frame Alignment Error ! 148: static const uint32 RSR_CRC = 0x02; // CRC Error ! 149: static const uint32 RSR_PRX = 0x01; // Packet received with no errors ! 150: ! 151: // 7 6 5 4 3 2 1 0 ! 152: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 153: // RCR | 1 | 1 | MON | PRO | AM | AB | AR | SEP | ! 154: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 155: static const uint32 RCR_MON = 0x20; // Monitor mode ! 156: static const uint32 RCR_PRO = 0x10; // Promisc. ! 157: static const uint32 RCR_AM = 0x08; // Accept multicast dest address ! 158: static const uint32 RCR_AB = 0x04; // Accept broadcast dest address ! 159: static const uint32 RCR_AR = 0x02; // Accept <64bytes ! 160: static const uint32 RCR_SEP = 0x01; // Accept packet with recv errors ! 161: ! 162: // 7 6 5 4 3 2 1 0 ! 163: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 164: // TCR | 1 | 1 | 1 |OFST | ATD | LB | CRC | ! 165: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 166: static const uint32 TCR_OFST = 0x10; // Collision Offset Enable ! 167: static const uint32 TCR_ATD = 0x08; // Auto Transmit Disable ! 168: static const uint32 TCR_LB_MASK = 0x06; // Loopback mode ! 169: static const uint32 TCR_CRC = 0x01; // Don't append CRC ! 170: ! 171: // 7 6 5 4 3 2 1 0 ! 172: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 173: // DCR | 1 | FT | ARM | LS | LAS | BOS | WTS | ! 174: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 175: static const uint32 DCR_FT_MASK = 0x60; // FIFO threshold ! 176: static const uint32 DCR_ARM = 0x10; // Auto initialize Remote ! 177: static const uint32 DCR_LS = 0x08; // Loopback Select ! 178: static const uint32 DCR_LAS = 0x04; // (32bit DMA not supported by NIC) ! 179: static const uint32 DCR_BOS = 0x02; // Byte Order Select (Not Impl?) ! 180: static const uint32 DCR_WTS = 0x01; // Word Transfer Select ! 181: ! 182: // 7 6 5 4 3 2 1 0 ! 183: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 184: // 9346CR | EEM | not used |EECS |EESK |EEDI |EEDO | ! 185: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 186: static const uint32 CR9346_EEM_MASK = 0xc0; // RTL8019AS operating mode ! 187: ! 188: // 7 6 5 4 3 2 1 0 ! 189: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 190: // CONFIG0 | VERID | AUI |PNPJP| JP | BNC | 0 | 0 | ! 191: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 192: static const uint32 CONFIG0_VERID_MASK = 0xc0; ! 193: static const uint32 CONFIG0_AUI = 0x20; ! 194: static const uint32 CONFIG0_PNPJP = 0x10; ! 195: static const uint32 CONFIG0_JP = 0x08; ! 196: static const uint32 CONFIG0_BNC = 0x04; ! 197: ! 198: // 7 6 5 4 3 2 1 0 ! 199: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 200: // CONFIG1 |IRQEN| IRQS | IOS | ! 201: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 202: static const uint32 CONFIG1_IRQEN = 0x80; ! 203: static const uint32 CONFIG1_IRQS_MASK = 0x70; ! 204: static const uint32 CONFIG1_IOS_MASK = 0x0f; ! 205: ! 206: // 7 6 5 4 3 2 1 0 ! 207: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 208: // CONFIG2 | PL |BSELB| BS | ! 209: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 210: static const uint32 CONFIG2_PL_MASK = 0xc0; ! 211: static const uint32 CONFIG2_BSELB = 0x20; ! 212: static const uint32 CONFIG2_BS = 0x1f; ! 213: ! 214: // 7 6 5 4 3 2 1 0 ! 215: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 216: // CONFIG3 | PNP |FUDUP|LEDS1|LEDS0| 0 |SLEEP|PWRDN|ACTB | ! 217: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 218: static const uint32 CONFIG3_PNP = 0x80; ! 219: static const uint32 CONFIG3_FUDUP = 0x40; ! 220: static const uint32 CONFIG3_LEDS1 = 0x20; ! 221: static const uint32 CONFIG3_LEDS0 = 0x10; ! 222: static const uint32 CONFIG3_SLEEP = 0x04; ! 223: static const uint32 CONFIG3_PWRDN = 0x02; ! 224: static const uint32 CONFIG3_ACTB = 0x01; ! 225: ! 226: // 7 6 5 4 3 2 1 0 ! 227: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 228: // CONFIG4 | - | - | - | - | - | - | - |IOMS | ! 229: // +-----+-----+-----+-----+-----+-----+-----+-----+ ! 230: static const uint32 CONFIG4_IOMS = 0x01; ! 231: ! 232: // メディアタイプ (CONFIG2) ! 233: enum { ! 234: MediaType_10BaseT_Auto = 0, ! 235: MediaType_10BaseT = 1, ! 236: MediaType_10Base5 = 2, ! 237: MediaType_10Base2 = 3, ! 238: }; ! 239: }; ! 240: ! 241: class RTL8019ASDevice : public EthernetDevice ! 242: { ! 243: using inherited = EthernetDevice; ! 244: ! 245: // 動作状態 (数値比較も行うことに注意) ! 246: enum class State { ! 247: Normal = 0, // 送受信可能 ! 248: Stop = 1, // STP ! 249: StopInProgress = 2, // STP へ移行中 (処理中の送受信のみ継続) ! 250: }; ! 251: ! 252: // DMA 状態? ! 253: enum class DMAMode { ! 254: NotAllowed = 0, ! 255: RemoteRead = 1, ! 256: RemoteWrite = 2, ! 257: SendPacket = 3, ! 258: Complete = 4, ! 259: }; ! 260: ! 261: public: ! 262: RTL8019ASDevice(int n_, int vector_); ! 263: virtual ~RTL8019ASDevice() override; ! 264: ! 265: bool Init() override; ! 266: void ResetHard(bool poweron) override; ! 267: ! 268: uint64 Read8(uint32 addr) override; ! 269: uint64 Read16(uint32 addr) override; ! 270: uint64 Write8(uint32 addr, uint32 data) override; ! 271: uint64 Write16(uint32 addr, uint32 data) override; ! 272: uint64 Peek8(uint32 addr) override; ! 273: ! 274: int InterruptAcknowledge(); ! 275: ! 276: private: ! 277: static inline uint32 Decoder(uint32 addr); ! 278: ! 279: uint32 ReadReg(uint32 rn); ! 280: uint32 ReadDMA8(uint32 a0); ! 281: uint32 ReadDMA16(); ! 282: uint32 WriteReg(uint32 rn, uint32 data); ! 283: void WriteCR(uint32 data); ! 284: void WritePSTART(uint32 data); ! 285: void WritePSTOP(uint32 data); ! 286: void WriteBNRY(uint32 data); ! 287: void WriteTPSR(uint32 data); ! 288: void WriteTBCR0(uint32 data); ! 289: void WriteTBCR1(uint32 data); ! 290: void WriteISR(uint32 data); ! 291: void WriteRSAR0(uint32 data); ! 292: void WriteRSAR1(uint32 data); ! 293: void WriteRBCR0(uint32 data); ! 294: void WriteRBCR1(uint32 data); ! 295: void WriteRCR(uint32 data); ! 296: void WriteTCR(uint32 data); ! 297: void WriteDCR(uint32 data); ! 298: void WriteIMR(uint32 data); ! 299: void WritePAR(int n, uint32 data); ! 300: void WriteCURR(uint32 data); ! 301: void WriteMAR(int n, uint32 data); ! 302: void Write9346CR(uint32 data); ! 303: void WriteCONFIG0(uint32 data); ! 304: void WriteCONFIG1(uint32 data); ! 305: void WriteCONFIG2(uint32 data); ! 306: void WriteCONFIG3(uint32 data); ! 307: void WriteDMA8(uint32 data); ! 308: void WriteDMA16(uint32 data); ! 309: uint32 PeekReg(uint32 rn) const; ! 310: uint32 PeekCR() const; ! 311: uint32 PeekCLDA() const; ! 312: uint32 PeekBNRY() const; ! 313: uint32 PeekTSR() const; ! 314: uint32 PeekNCR() const; ! 315: uint32 PeekFIFO() const; ! 316: uint32 PeekISR() const; ! 317: uint32 PeekCRDA() const; ! 318: uint32 Peek8019ID0() const; ! 319: uint32 Peek8019ID1() const; ! 320: uint32 PeekRSR() const; ! 321: uint32 PeekCNTR(int n) const; ! 322: uint32 PeekPAR(int n) const; ! 323: uint32 PeekCURR() const; ! 324: uint32 PeekMAR(int n) const; ! 325: uint32 PeekPSTART() const; ! 326: uint32 PeekPSTOP() const; ! 327: uint32 PeekTPSR() const; ! 328: uint32 PeekRCR() const; ! 329: uint32 PeekTCR() const; ! 330: uint32 PeekDCR() const; ! 331: uint32 PeekIMR() const; ! 332: uint32 Peek9346CR() const; ! 333: uint32 PeekBPAGE() const; ! 334: uint32 PeekCONFIG0() const; ! 335: uint32 PeekCONFIG1() const; ! 336: uint32 PeekCONFIG2() const; ! 337: uint32 PeekCONFIG3() const; ! 338: uint32 PeekCONFIG4() const; ! 339: uint32 PeekCSNSAV() const; ! 340: uint32 PeekReg39() const; ! 341: uint32 PeekINTR() const; ! 342: uint32 PeekDMA(uint32 a0) const; ! 343: ! 344: DECLARE_MONITOR_CALLBACK(MonitorUpdate); ! 345: void MonitorReg(TextScreen&, int, int, uint32, const char * const *names); ! 346: ! 347: void Reset(); ! 348: void ChangeInterrupt(); ! 349: ! 350: // DMA 処理の下請け ! 351: void ReadDMAlog(uint32 addr, uint32 data, int width); ! 352: void PostDMA(); ! 353: ! 354: // 内蔵空間アクセス ! 355: inline uint32 ReadPROM(uint32 addr) const; ! 356: inline uint32 ReadRAM(uint32 addr) const; ! 357: inline void WriteRAM(uint32 addr, uint32 data); ! 358: ! 359: // 状態 ! 360: bool IsStopOrInProgress() const; ! 361: void ChangeState(State newstate); ! 362: ! 363: // 送信 ! 364: void Transmit(); ! 365: void TXEvent(Event&); ! 366: // 受信 ! 367: void HostRxCallback(MessageID msgid, uint32 arg); ! 368: void RXEvent(Event&); ! 369: void RXHead(int remain); ! 370: void RXCopy(Event&, int remain); ! 371: void RXDone(Event&); ! 372: ! 373: void TXLedEvent(Event&); ! 374: void RXLedEvent(Event&); ! 375: ! 376: void IncCounter(int n); ! 377: ! 378: // レジスタ名を返す ! 379: static std::string RegNameR(int rn); ! 380: static std::string RegNameW(int rn); ! 381: static const char *GetDMAName(uint32); ! 382: ! 383: // 動作状態 ! 384: // ハードウェアリセット(解除?)後、STA が発行されるまではリセット状態。 ! 385: // STP が発行されたら、仕掛りの送受信を終えたところでリセット状態に入る。 ! 386: // リセット状態に入ると ISR:RST が立つ。 ! 387: // このリセット状態をここでは Stop 状態と呼ぶ。 ! 388: State state {}; ! 389: // 送信処理中なら true ! 390: // (受信処理中の方は rx_packet.length != 0 で判定する) ! 391: bool tx_in_progress {}; ! 392: ! 393: // CR: ページ番号 (をあらかじめオフセットしたもの) ! 394: uint32 pagesel {}; ! 395: ! 396: // CR_RD: DMA 状態? ! 397: DMAMode dmamode {}; ! 398: ! 399: bool cr_sta {}; ! 400: ! 401: // 割り込みフラグ (bit7 は 0 にすること) ! 402: uint32 intr_stat {}; ! 403: // 割り込みマスク (bit7 は 0 にすること) ! 404: uint32 intr_mask {}; ! 405: // 割り込みベクタ (NereidBoardDevice から渡される) ! 406: int intr_vector {}; ! 407: ! 408: uint32 tsr {}; ! 409: uint32 rsr {}; // DIS 以外のビットを保持 ! 410: ! 411: // RCR: モニタモード ! 412: bool monitor_mode {}; ! 413: bool promisc_mode {}; ! 414: bool accept_mcast {}; ! 415: bool accept_bcast {}; ! 416: bool accept_short {}; ! 417: bool accept_error {}; ! 418: ! 419: // TCR ! 420: uint32 tcr {}; ! 421: ! 422: // DCR ! 423: bool word_transfer {}; ! 424: uint32 dcr {}; // それ以外のビット ! 425: ! 426: // 折り返しを計算しなくて済むように uint16 にしておく。 ! 427: // またレジスタイメージがバイト単位かページ単位かに関わらず、 ! 428: // すべてバイト単位で統一。 ! 429: ! 430: uint16 remote_addr {}; // RSAR/CRDA: 現在のアクセス位置 ! 431: uint16 remote_count {}; // RBCR: 残り転送バイト数 ! 432: uint16 remote_start_addr {}; // DMA 開始時の位置 (ログ用) ! 433: uint16 remote_start_count {}; // DMA 開始時の残り転送バイト数 (ログ用) ! 434: ! 435: uint16 transmit_page_start_addr {}; // TPSR ! 436: uint16 transmit_byte_count {}; // TBCR ! 437: ! 438: uint16 pstart_addr {}; // PSTART ! 439: uint16 pstop_addr {}; // PSTOP ! 440: uint16 boundary_addr {}; // BNRY ! 441: uint16 current_page_addr {}; // CURR: 受信開始位置 ! 442: uint16 local_addr {}; // CLDA: 書き込み位置 ! 443: uint16 next_page_addr {}; // 次パケットの受信開始位置 ! 444: ! 445: macaddr_t par {}; ! 446: std::array<uint8, 8> mar {}; ! 447: std::array<uint8, 3> error_counter {}; ! 448: ! 449: // 9346CR ! 450: bool config_write_enable {}; ! 451: ! 452: // CONFIG ! 453: uint32 verid {}; ! 454: bool irq_enable {}; ! 455: uint32 mediatype {}; ! 456: bool brom_force_disable {}; ! 457: uint32 config3 {}; ! 458: ! 459: // バッファ (16KB 固定) ! 460: std::array<uint8, 16384> buffer {}; ! 461: ! 462: // PROM (実質 16 バイト) ! 463: std::array<uint8, 16> prom {}; ! 464: ! 465: NetPacket tx_packet {}; ! 466: NetPacket rx_packet {}; ! 467: ! 468: // LED (true で点灯) ! 469: bool tx_led {}; ! 470: bool rx_led {}; ! 471: ! 472: Monitor monitor { this }; ! 473: ! 474: Event tx_event { this }; ! 475: Event rx_event { this }; ! 476: Event txled_event { this }; ! 477: Event rxled_event { this }; ! 478: ! 479: InterruptDevice *interrupt {}; ! 480: ! 481: static const char * const regnames[]; ! 482: }; ! 483: ! 484: static inline RTL8019ASDevice *GetRTL8019ASDevice(int n) { ! 485: return Object::GetObject<RTL8019ASDevice>(OBJ_ETHERNET(n)); ! 486: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.