VirtualBox

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

Last change on this file since 16684 was 15955, checked in by vboxsync, 16 years ago

fix OSE headers

  • 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 15955 2009-01-14 20:14:36Z vboxsync $ */
2/** @file
3 * DevEEPROM - Microware-compatible 64x16-bit 93C46 EEPROM Emulation, Header.
4 */
5
6/*
7 * Copyright (C) 2007 Sun Microsystems, Inc.
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 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
18 * Clara, CA 95054 USA or visit http://www.sun.com if you need
19 * additional information or have any questions.
20 */
21
22/* Interface */
23#include <iprt/types.h>
24
25/**
26 * 93C46-compatible EEPROM device emulation.
27 *
28 * @remarks This class is intended to be used in device
29 * emulation which imposes some restrictions if the
30 * device supports GC execution. This is why it is a
31 * plain-old-data structure.
32 */
33struct EEPROM93C46 {
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
73 /** Actual content of EEPROM */
74 uint16_t m_au16Data[SIZE];
75
76 /** current state.
77 *
78 * EEPROM operates as a simple state machine. Events are primarily
79 * triggered at positive edge of clock signal (SK). Refer to the
80 * timing diagrams of 93C46 to get better understanding.
81 */
82 enum State {
83 /** Initial state. Waiting for start condition (CS, SK, DI high). */
84 STANDBY,
85 /** Reading data in, shifting in the bits into 'word'. */
86 READING_DI,
87 /** Writing data out, shifting out the bits from 'word'. */
88 WRITING_DO,
89 /** Waiting for CS=0 to indicate we are busy (DO=0). */
90 WAITING_CS_FALL,
91 /** Waiting for CS=1 to indicate we are ready (DO=1). */
92 WAITING_CS_RISE,
93 /** Make this enum 4-byte */
94 STATE_MAKE_32BIT_HACK = 0x7fffffff
95 } m_eState;
96 /** setting writeEnable to false prevents write and erase operations */
97 bool m_fWriteEnabled;
98 uint8_t Alignment1;
99 /** intermediate storage */
100 uint16_t m_u16Word;
101 /** currently processed bit in 'word' */
102 uint16_t m_u16Mask;
103 /** decoded address */
104 uint16_t m_u16Addr;
105 /** Data Out, Data In, Chip Select, Clock */
106 uint32_t m_u32InternalWires;
107
108 /** Current opcode decoder. When no operation has been decoded yet
109 * it is set to OP_DECODE.
110 */
111 OP m_eOp;
112#if HC_ARCH_BITS == 64
113 uint32_t Alignment2;
114#endif
115
116#ifdef IN_RING3
117 uint32_t read();
118 void write(uint32_t u32Wires);
119
120 void init(const uint16_t *pu16Initial = 0);
121
122 // Operation handlers
123 State opDecode();
124 State opRead();
125 State opWrite();
126 State opWriteAll();
127
128 /** Helper method to implement write protection */
129 void storeWord(uint32_t u32Addr, uint16_t u16Value);
130#endif /* IN_RING3 */
131};
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