This is the mail archive of the
ecos-patches@sourceware.org
mailing list for the eCos project.
Patch for Dallas DS12887 regarding Intel PC architectures
- From: David Fernandez <dfernandez at cct dot co dot uk>
- To: ecos-patches at ecos dot sourceware dot org
- Date: Thu, 23 Nov 2006 11:33:27 +0000
- Subject: Patch for Dallas DS12887 regarding Intel PC architectures
- Organization: Concurrent Technologies, Plc
- Reply-to: dfernandez at cct dot co dot uk
Hi there,
This fixes a small bug that causes NMIs being disabled or enabled in PCs
when using this device.
Have fun.
David Fernandez.
Index: devs/wallclock/dallas/ds12887/current//ChangeLog
===================================================================
RCS file: /home/cvs/cvsroot/dfernandez/Projects/ecos/packages/devs/wallclock/dallas/ds12887/current/ChangeLog,v
retrieving revision 1.1.1.1
diff -u -5 -p -r1.1.1.1 ChangeLog
--- devs/wallclock/dallas/ds12887/current//ChangeLog 2006/06/26 10:52:46 1.1.1.1
+++ devs/wallclock/dallas/ds12887/current//ChangeLog 2006/11/23 11:25:23
@@ -1,5 +1,11 @@
+2006-11-23 David Fernandez <dfernandez@cct.co.uk>
+
+ * src/ds17887.cxx (defines)> Take into account that in Intel PC
+ platforms the 8Th bit in DS_ADDR is used to enable or disable
+ NMI gate, and therefore, should be preserved.
+
2001-07-27 Jesper Skov <jskov@redhat.com>
* src/ds12887.cxx (init_ds_hwclock): Use BCD mode since Century is
NA in binary mode. Force sane settings in registers if they are
undefined.
Index: devs/wallclock/dallas/ds12887/current//src/ds12887.cxx
===================================================================
RCS file: /home/cvs/cvsroot/dfernandez/Projects/ecos/packages/devs/wallclock/dallas/ds12887/current/src/ds12887.cxx,v
retrieving revision 1.1.1.1
diff -u -5 -p -r1.1.1.1 ds12887.cxx
--- devs/wallclock/dallas/ds12887/current//src/ds12887.cxx 2006/06/26 10:52:46 1.1.1.1
+++ devs/wallclock/dallas/ds12887/current//src/ds12887.cxx 2006/11/23 11:25:23
@@ -64,37 +64,56 @@
// Platform details
#include CYGDAT_DEVS_WALLCLOCK_DALLAS_12887_INL
#ifndef DS_READ_UINT8
-# define DS_READ_UINT8(x,y) HAL_READ_UINT8(x,y)
-# define DS_WRITE_UINT8(x,y) HAL_WRITE_UINT8(x,y)
+# define DS_READ_UINT8(x,y) HAL_READ_UINT8(x,y)
+# define DS_WRITE_UINT8(x,y) HAL_WRITE_UINT8(x,y)
#endif
#ifdef DS_LINEAR
-# ifndef DS_STEP
-# define DS_STEP 0
-# endif
-# ifndef DS_BASE
-# error "Need to know base of DS12887 part"
-# endif
-# define DS_READ(offset, data) DS_READ_UINT8(DS_BASE + ((offset) << DS_STEP), (data))
-# define DS_WRITE(offset, data) DS_WRITE_UINT8(DS_BASE + ((offset) << DS_STEP), (data))
-#else
-# if !defined(DS_ADDR) || !defined(DS_DATA)
-# error "Need to know addr/data locations of DS12887 part"
-# endif
-# define DS_READ(offset, data) \
- CYG_MACRO_START \
- DS_WRITE_UINT8(DS_ADDR, (offset)); \
- DS_READ_UINT8(DS_DATA, (data)); \
- CYG_MACRO_END
-# define DS_WRITE(offset, data) \
- CYG_MACRO_START \
- DS_WRITE_UINT8(DS_ADDR, (offset)); \
- DS_WRITE_UINT8(DS_DATA, (data)); \
- CYG_MACRO_END
+# ifndef DS_STEP
+# define DS_STEP 0
+# endif
+# ifndef DS_BASE
+# error "Need to know base of DS12887 part"
+# endif
+#define DS_READ( offset, data) \
+ DS_READ_UINT8( DS_BASE + ((offset) << DS_STEP), (data))
+#define DS_WRITE(offset, data) \
+ DS_WRITE_UINT8(DS_BASE + ((offset) << DS_STEP), (data))
+#else // !DS_LINEAR
+# if !defined(DS_ADDR) || !defined(DS_DATA)
+# error "Need to know addr/data locations of DS12887 part"
+# endif
+# ifdef CYGPKG_HAL_I386_PC
+#define DS_READ(offset, data) \
+CYG_MACRO_START \
+ register CYG_BYTE btval; \
+ DS_READ_UINT8( DS_ADDR, (btval)); \
+ DS_WRITE_UINT8(DS_ADDR, ((offset)&0x7F)|(btval&0x80)); \
+ DS_READ_UINT8( DS_DATA, (data)); \
+CYG_MACRO_END
+#define DS_WRITE(offset, data) \
+CYG_MACRO_START \
+ register CYG_BYTE btval; \
+ DS_READ_UINT8( DS_ADDR, (btval)); \
+ DS_WRITE_UINT8(DS_ADDR, ((offset)&0x7F)|(btval&0x80)); \
+ DS_WRITE_UINT8(DS_DATA, (data)); \
+CYG_MACRO_END
+# else // !CYGPKG_HAL_I386_PC
+#define DS_READ(offset, data) \
+CYG_MACRO_START \
+ DS_WRITE_UINT8(DS_ADDR, (offset)); \
+ DS_READ_UINT8(DS_DATA, (data)); \
+CYG_MACRO_END
+#define DS_WRITE(offset, data) \
+CYG_MACRO_START \
+ DS_WRITE_UINT8(DS_ADDR, (offset)); \
+ DS_WRITE_UINT8(DS_DATA, (data)); \
+CYG_MACRO_END
+# endif // !CYGPKG_HAL_I386_PC
#endif
// Registers
#define DS_SECONDS 0x00
#define DS_SECONDS_ALARM 0x01