This is the mail archive of the
ecos-discuss@sources.redhat.com
mailing list for the eCos project.
Re: forwarded message from Peter Graf
- To: ecos-discuss at sourceware dot cygnus dot com
- Subject: Re: [ECOS] forwarded message from Peter Graf
- From: Jesper Skov <jskov at redhat dot com>
- Date: 20 Nov 2000 08:42:51 +0100
- References: <14869.1095.188352.237035@thinktwice.zoftcorp.dk>
Peter> I have only worked around by using a fixed table. A parametric
Peter> macro without the rounding problems seems tricky, if you want
Peter> to avoid computation at runtime.
This is a better solution, IMO.
Jesper
Index: sh3/current/ChangeLog
===================================================================
RCS file: /local/cvsfiles/ecc/ecc/hal/sh/sh3/current/ChangeLog,v
retrieving revision 1.2
diff -u -5 -r1.2 ChangeLog
--- sh3/current/ChangeLog 2000/11/10 07:33:37 1.2
+++ sh3/current/ChangeLog 2000/11/20 07:40:41
@@ -1,5 +1,9 @@
+2000-11-20 Jesper Skov <jskov@redhat.com>
+
+ * include/mod_regs_ser.h (CYGARC_SCBRR_N): Reduce rounding error.
+
2000-11-10 Jesper Skov <jskov@redhat.com>
* src/var_misc.c: Add spaces around ... used in ranges.
2000-11-01 Jesper Skov <jskov@redhat.com>
Index: sh3/current/include/mod_regs_ser.h
===================================================================
RCS file: /local/cvsfiles/ecc/ecc/hal/sh/sh3/current/include/mod_regs_ser.h,v
retrieving revision 1.1
diff -u -5 -r1.1 mod_regs_ser.h
--- sh3/current/include/mod_regs_ser.h 2000/11/01 10:00:35 1.1
+++ sh3/current/include/mod_regs_ser.h 2000/11/20 07:38:49
@@ -108,20 +108,24 @@
#define CYGARC_SCBRR_PRESCALE(_b_) \
((((CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED/32/1/(_b_))-1)<256) ? 1 : \
(((CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED/32/4/(_b_))-1)<256) ? 4 : \
(((CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED/32/16/(_b_))-1)<256) ? 16 : 64)
+// Add half the divisor to reduce rounding errors to .5
+#define CYGARC_SCBRR_ROUNDING(_b_) \
+ 16*CYGARC_SCBRR_PRESCALE(_b_)*(_b_)
+
// These two macros provide the static values we need to stuff into the
// registers.
#define CYGARC_SCBRR_CKSx(_b_) \
((1 == CYGARC_SCBRR_PRESCALE(_b_)) ? 0 : \
(4 == CYGARC_SCBRR_PRESCALE(_b_)) ? 1 : \
(16 == CYGARC_SCBRR_PRESCALE(_b_)) ? 2 : 3)
#define CYGARC_SCBRR_N(_b_) \
(((_b_) < 4800) ? 0 : \
((_b_) > 115200) ? 0 : \
- ((CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED/32/CYGARC_SCBRR_PRESCALE(_b_)/(_b_))-1))
+ (((CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED+CYGARC_SCBRR_ROUNDING(_b_))/32/CYGARC_SCBRR_PRESCALE(_b_)/(_b_))-1))
//++++++ Module IRDA +++++++++++++++++++++++++++++++++++++++++++++++++++++++
#ifdef CYGARC_SH_MOD_IRDA
Index: sh4/current/ChangeLog
===================================================================
RCS file: /local/cvsfiles/ecc/ecc/hal/sh/sh4/current/ChangeLog,v
retrieving revision 1.3
diff -u -5 -r1.3 ChangeLog
--- sh4/current/ChangeLog 2000/11/09 11:23:04 1.3
+++ sh4/current/ChangeLog 2000/11/20 07:41:38
@@ -1,5 +1,9 @@
+2000-11-20 Jesper Skov <jskov@redhat.com>
+
+ * include/mod_regs_ser.h (CYGARC_SCBRR_N): Reduce rounding error.
+
2000-11-09 Jesper Skov <jskov@redhat.com>
* include/mod_regs_ubc.h: Correct definitions.
* include/mod_7750.h (CYGARC_SH_MOD_UBC): Defined.
Index: sh4/current/include/mod_regs_ser.h
===================================================================
RCS file: /local/cvsfiles/ecc/ecc/hal/sh/sh4/current/include/mod_regs_ser.h,v
retrieving revision 1.1
diff -u -5 -r1.1 mod_regs_ser.h
--- sh4/current/include/mod_regs_ser.h 2000/11/01 10:00:37 1.1
+++ sh4/current/include/mod_regs_ser.h 2000/11/20 07:41:09
@@ -105,20 +105,24 @@
#define CYGARC_SCBRR_PRESCALE(_b_) \
((((CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED/32/1/(_b_))-1)<256) ? 1 : \
(((CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED/32/4/(_b_))-1)<256) ? 4 : \
(((CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED/32/16/(_b_))-1)<256) ? 16 : 64)
+// Add half the divisor to reduce rounding errors to .5
+#define CYGARC_SCBRR_ROUNDING(_b_) \
+ 16*CYGARC_SCBRR_PRESCALE(_b_)*(_b_)
+
// These two macros provide the static values we need to stuff into the
// registers.
#define CYGARC_SCBRR_CKSx(_b_) \
((1 == CYGARC_SCBRR_PRESCALE(_b_)) ? 0 : \
(4 == CYGARC_SCBRR_PRESCALE(_b_)) ? 1 : \
(16 == CYGARC_SCBRR_PRESCALE(_b_)) ? 2 : 3)
#define CYGARC_SCBRR_N(_b_) \
(((_b_) < 4800) ? 0 : \
((_b_) > 115200) ? 0 : \
- ((CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED/32/CYGARC_SCBRR_PRESCALE(_b_)/(_b_))-1))
+ (((CYGHWR_HAL_SH_ONCHIP_PERIPHERAL_SPEED+CYGARC_SCBRR_ROUNDING(_b_))/32/CYGARC_SCBRR_PRESCALE(_b_)/(_b_))-1))
//++++++ Module IRDA +++++++++++++++++++++++++++++++++++++++++++++++++++++++
#ifdef CYGARC_SH_MOD_IRDA