This is the mail archive of the ecos-discuss@sources.redhat.com mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: forwarded message from Peter Graf


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
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]