simulavr  1.1.0
hwusi.h
Go to the documentation of this file.
1  /*
2  ****************************************************************************
3  *
4  * simulavr - A simulator for the Atmel AVR family of microcontrollers.
5  * Copyright (C) 2001 - 2016 Klaus Rudolph & other
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  ****************************************************************************
22  *
23  * $Id$
24  */
25 
26 #ifndef HW_USI
27 #define HW_USI
28 
29 #include "hardware.h"
30 #include "simulationmember.h"
31 #include "irqsystem.h"
32 #include "pinatport.h"
33 #include "pinnotify.h"
34 #include "rwmem.h"
35 #include "traceval.h"
36 #include "hwtimer/hwtimer.h"
37 
38 class AvrDevice;
39 
42 
43  private:
45  enum WMtype {
46  WM_OFF = 0,
51  };
52 
55 
57  unsigned char shift_data;
59  unsigned char control_data;
60 
68  bool sck_state;
70  bool sck_port;
72  bool sck_ddr;
74  bool di_state;
76  bool di_port;
78  bool di_ddr;
80  bool scl_hold;
81 
83  unsigned int irq_start;
89  unsigned int irq_ovr;
91  bool irqen_ovr;
95  bool flag_stop;
97  bool flag_dcol;
98 
102  unsigned char clock_mode;
103 
105  void doCount(void);
107  unsigned char counter_data;
109  void setDout(void);
111  void doShift(void);
112 
114  void PinStateHasChanged(Pin*);
115 
118 
119  protected:
121  virtual void setDataBuffer(unsigned char data) { }
122 
123  /* interfaces for alternate pins on attiny261 */
125  virtual void registerDIandSCK(HWUSI *cb);
127  virtual void toggleSCK(void);
129  virtual void setDO(bool state);
131  virtual void setDI(bool state, bool ddr, bool port);
133  virtual void setSCK_TWI(bool hold, bool ddr, bool port);
135  virtual void controlDO(bool state);
137  virtual void controlTWI(bool state);
138 
139  public:
140  /* Constructor */
141  HWUSI(AvrDevice *core,
142  HWIrqSystem *,
143  PinAtPort din,
144  PinAtPort dout,
145  PinAtPort sck,
146  unsigned int irq_start,
147  unsigned int irq_ovr);
148  virtual ~HWUSI() {}
149 
150  /* Interface from Hardware */
151  virtual void Reset();
152 
153  /* Interface from TimerEventListener */
154  virtual void fireEvent(int event);
155 
156  /* Interface from SimulationMember: for reacting to port pin changes */
157  int Step(bool &untilCoreStepFinished, SystemClockOffset *nextStepIn_ns = 0);
158 
159  /* Set and get functions for IO registers */
160  void SetUSIDR(unsigned char val);
161  void SetUSISR(unsigned char val);
162  void SetUSICR(unsigned char val);
163  unsigned char GetUSIDR(void) { return shift_data; }
164  unsigned char GetUSISR(void);
165  unsigned char GetUSICR(void) { return control_data; }
166 
167  /* IO registers connected with USI */
169  usisr_reg,
170  usicr_reg;
171 };
172 
173 class HWUSI_BR: public HWUSI {
174 
175  private:
177  unsigned char buffer_data;
178 
179  protected:
181  virtual void setDataBuffer(unsigned char data);
182 
183  public:
184  /* Constructor */
185  HWUSI_BR(AvrDevice *core,
186  HWIrqSystem *,
187  PinAtPort din,
188  PinAtPort dout,
189  PinAtPort sck,
190  unsigned int irq_start,
191  unsigned int irq_ovr);
192 
193  /* Interface from Hardware */
194  virtual void Reset();
195 
196  /* Set and get functions for IO registers */
197  void SetUSIBR(unsigned char val); // produce warning: read only
198  unsigned char GetUSIBR(void) { return buffer_data; }
199 
200  /* IO registers connected with USI */
202 };
203 
204 #endif
void PinStateHasChanged(Pin *)
Definition: hwusi.cpp:267
Basic AVR device, contains the core functionality.
Definition: avrdevice.h:66
bool irqen_start
Definition: hwusi.h:85
bool sck_state
Definition: hwusi.h:68
unsigned int irq_ovr
Definition: hwusi.h:89
Pin class, handles input and output to external parts.
Definition: pin.h:98
IOReg< HWUSI > usicr_reg
Definition: hwusi.h:168
virtual ~HWUSI()
Definition: hwusi.h:148
bool scl_hold
Definition: hwusi.h:80
bool irqactive_ovr
Definition: hwusi.h:93
virtual void setDataBuffer(unsigned char data)
Definition: hwusi.h:121
Definition: hwusi.h:41
virtual void toggleSCK(void)
Definition: hwusi.cpp:161
bool irqen_ovr
Definition: hwusi.h:91
bool flag_dcol
Definition: hwusi.h:97
virtual void controlTWI(bool state)
Definition: hwusi.cpp:191
virtual void setDO(bool state)
Definition: hwusi.cpp:173
bool irqactive_start
Definition: hwusi.h:87
unsigned char GetUSISR(void)
Definition: hwusi.cpp:37
unsigned char buffer_data
Definition: hwusi.h:177
void doCount(void)
Definition: hwusi.cpp:123
HWUSI(AvrDevice *core, HWIrqSystem *, PinAtPort din, PinAtPort dout, PinAtPort sck, unsigned int irq_start, unsigned int irq_ovr)
Definition: hwusi.cpp:204
Build a register for TraceValue&#39;s.
Definition: traceval.h:442
unsigned int irq_start
Definition: hwusi.h:83
virtual void setDI(bool state, bool ddr, bool port)
Definition: hwusi.cpp:177
PinAtPort SCK
Definition: hwusi.h:66
bool sck_port
Definition: hwusi.h:70
WMtype wire_mode
Definition: hwusi.h:100
unsigned char shift_data
Definition: hwusi.h:57
unsigned char GetUSICR(void)
Definition: hwusi.h:165
void doShift(void)
Definition: hwusi.cpp:142
PinAtPort DO
Definition: hwusi.h:64
long long SystemClockOffset
virtual void fireEvent(int event)
Definition: hwusi.cpp:352
virtual void setSCK_TWI(bool hold, bool ddr, bool port)
Definition: hwusi.cpp:182
unsigned char counter_data
Definition: hwusi.h:107
bool di_port
Definition: hwusi.h:76
void SetUSICR(unsigned char val)
Definition: hwusi.cpp:67
unsigned char GetUSIBR(void)
Definition: hwusi.h:198
virtual void registerDIandSCK(HWUSI *cb)
Definition: hwusi.cpp:168
IOReg< HWUSI > usisr_reg
Definition: hwusi.h:168
IOReg< HWUSI > usidr_reg
Definition: hwusi.h:168
unsigned char GetUSIDR(void)
Definition: hwusi.h:163
WMtype
Definition: hwusi.h:45
virtual void controlDO(bool state)
Definition: hwusi.cpp:187
HWIrqSystem * irq
Definition: hwusi.h:54
bool sck_ddr
Definition: hwusi.h:72
bool flag_stop
Definition: hwusi.h:95
void SetUSISR(unsigned char val)
Definition: hwusi.cpp:46
virtual void Reset()
Definition: hwusi.cpp:229
bool di_state
Definition: hwusi.h:74
void setDout(void)
Definition: hwusi.cpp:147
IOReg< HWUSI_BR > usibr_reg
Definition: hwusi.h:201
bool di_ddr
Definition: hwusi.h:78
unsigned char control_data
Definition: hwusi.h:59
void SetUSIDR(unsigned char val)
Definition: hwusi.cpp:32
int Step(bool &untilCoreStepFinished, SystemClockOffset *nextStepIn_ns=0)
Return nonzero if a breakpoint was hit.
Definition: hwusi.cpp:255
PinAtPort DI
Definition: hwusi.h:62
bool is_DI_change
Definition: hwusi.h:117
unsigned char clock_mode
Definition: hwusi.h:102