VirtualBox

source: vbox/trunk/src/VBox/Devices/Network/DevEEPROM.h@ 67579

Last change on this file since 67579 was 62511, checked in by vboxsync, 8 years ago

(C) 2016

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.9 KB
Line 
1/* $Id: DevEEPROM.h 62511 2016-07-22 19:12:58Z vboxsync $ */
2/** @file
3 * DevEEPROM - Microware-compatible 64x16-bit 93C46 EEPROM Emulation, Header.
4 */
5
6/*
7 * Copyright (C) 2007-2016 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18/* Interface */
19#include <iprt/types.h>
20
21/** The current Saved state version. */
22#define EEPROM93C46_SAVEDSTATE_VERSION 1
23
24/**
25 * 93C46-compatible EEPROM device emulation.
26 *
27 * @remarks This class is intended to be used in device
28 * emulation which imposes some restrictions if the
29 * device supports GC execution. This is why it is a
30 * plain-old-data structure.
31 */
32struct EEPROM93C46
33{
34 /** General definitions */
35 enum {
36 /** Size of EEPROM in words */
37 SIZE = 64,
38 /** Number of bits per word */
39 WORD_SIZE = 16,
40 /** Number of address bits */
41 ADDR_SIZE = 6,
42 /** Number of bits in opcode */
43 OPCODE_SIZE = 2,
44 /** The most significant bit mask in data word */
45 DATA_MSB = 1<<(WORD_SIZE-1),
46 /** Address mask */
47 ADDR_MASK = (1<<ADDR_SIZE)-1,
48 /** The most significant bit mask in op+addr bit sequence */
49 OPADDR_MSB = 1<<(OPCODE_SIZE+ADDR_SIZE-1)
50 };
51
52 enum OP {
53 OP_READ,
54 OP_WRITE,
55 OP_WRITE_ALL,
56 OP_DECODE,
57 OP_32BIT_HACK = 0x7fffffff
58 };
59
60 /**
61 * Names of signal wires
62 */
63 enum Wires {
64 WIRES_SK=0x1, ///< Clock
65 WIRES_CS=0x2, ///< Chip Select
66 WIRES_DI=0x4, ///< Data In
67 WIRES_DO=0x8 ///< Data Out
68 };
69
70
71 /** @todo save and load methods */
72 void save(PSSMHANDLE pSSM);
73 int load(PSSMHANDLE pSSM);
74
75 /** Actual content of EEPROM */
76 uint16_t m_au16Data[SIZE];
77
78 /** current state.
79 *
80 * EEPROM operates as a simple state machine. Events are primarily
81 * triggered at positive edge of clock signal (SK). Refer to the
82 * timing diagrams of 93C46 to get better understanding.
83 */
84 enum State {
85 /** Initial state. Waiting for start condition (CS, SK, DI high). */
86 STANDBY,
87 /** Reading data in, shifting in the bits into 'word'. */
88 READING_DI,
89 /** Writing data out, shifting out the bits from 'word'. */
90 WRITING_DO,
91 /** Waiting for CS=0 to indicate we are busy (DO=0). */
92 WAITING_CS_FALL,
93 /** Waiting for CS=1 to indicate we are ready (DO=1). */
94 WAITING_CS_RISE,
95 /** Make this enum 4-byte */
96 STATE_MAKE_32BIT_HACK = 0x7fffffff
97 } m_eState;
98 /** setting writeEnable to false prevents write and erase operations */
99 bool m_fWriteEnabled;
100 uint8_t Alignment1;
101 /** intermediate storage */
102 uint16_t m_u16Word;
103 /** currently processed bit in 'word' */
104 uint16_t m_u16Mask;
105 /** decoded address */
106 uint16_t m_u16Addr;
107 /** Data Out, Data In, Chip Select, Clock */
108 uint32_t m_u32InternalWires;
109
110 /** Current opcode decoder. When no operation has been decoded yet
111 * it is set to OP_DECODE.
112 */
113 OP m_eOp;
114#if HC_ARCH_BITS == 64
115 uint32_t Alignment2;
116#endif
117
118#ifdef IN_RING3
119 uint32_t read();
120 void write(uint32_t u32Wires);
121 bool readWord(uint32_t u32Addr, uint16_t *pu16Value);
122
123 void init(const uint16_t *pu16Initial = 0);
124
125 // Operation handlers
126 State opDecode();
127 State opRead();
128 State opWrite();
129 State opWriteAll();
130
131 /** Helper method to implement write protection */
132 void storeWord(uint32_t u32Addr, uint16_t u16Value);
133#endif /* IN_RING3 */
134};
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette