1 /*
2    Copyright (C) 2006 T. Scott Dattalo
3    Copyright (C) 2010 Roy R Rankin
4 
5 This file is part of gpsim.
6 
7 gpsim 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, or (at your option)
10 any later version.
11 
12 gpsim 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
18 along with gpsim; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21 
22 
23 #ifndef EXTRAS_DS1307_DS1307_H_
24 #define EXTRAS_DS1307_DS1307_H_
25 
26 /* IN_MODULE should be defined for modules */
27 #define IN_MODULE
28 #define LOCAL_TIME
29 
30 #include "src/modules.h"
31 #include "src/ioports.h"
32 #include "src/stimuli.h"
33 #include "src/trigger.h"
34 #include "src/i2c-ee.h"
35 
36 
37 class PromAddress;
38 class I2C_RTC;
39 class SQW_PIN;
40 
41 namespace DS1307_Modules {
42 
43 class ds1307 : public Module, public TriggerObject {
44 public:
45   explicit ds1307(const char *_name);
46   ~ds1307();
47 
48   static Module *construct_ds1307(const char *new_name);
49   virtual void create_iopin_map();
setEnable(bool,unsigned int)50   virtual void setEnable(bool /* bNewState */ , unsigned int /* m_bit */ ) {}
51   virtual void callback();
52   void secWritten(unsigned int sec);
53   void controlWritten(unsigned int cntl);
54 
55   enum control {
56     RS0 = 1 << 0,
57     RS1 = 1 << 1,
58     SQWE = 1 << 4,
59     OUT = 1 << 7
60   };
61 
62   enum second {
63     CH = 1 << 7
64   };
65 
66 protected:
67   void incrementRTC();
68 
69   I2C_RTC *m_eeprom;
70   SQW_PIN *m_sqw;
71   unsigned int chip_select;	// Write Protect and A0 - A2 state
72   PromAddress *att_eeprom;
73   guint64 next_clock_tick;	// increment RTC here
74   guint64 next_sqw_edge;	// change sqw edge here
75   guint64 sqw_interval;	// cycles between edges
76   bool    out;		// Output state
77 };
78 
79 
80 } // end of namespace DS1307_Modules
81 
82 class I2C_RTC : public I2C_EE {
83 public:
84   I2C_RTC(Processor *pCpu,
85           unsigned int _rom_size, unsigned int _write_page_size = 1,
86           unsigned int _addr_bytes = 1, unsigned int _CSmask = 0,
87           unsigned int _BSmask = 0, unsigned int _BSshift = 0
88          );
~I2C_RTC()89   virtual ~I2C_RTC() {}
90 
91 protected:
92   virtual bool match_address();
93   DS1307_Modules::ds1307 *pEE;
94 };
95 
96 
97 #endif // EXTRAS_DS1307_DS1307_H_
98