From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jesper Skov To: ecos-discuss@sourceware.cygnus.com Subject: Re: [ECOS] forwarded message from Peter Graf Date: Sun, 19 Nov 2000 23:43:00 -0000 Message-id: References: <14869.1095.188352.237035@thinktwice.zoftcorp.dk> X-SW-Source: 2000-11/msg00236.html 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 + + * include/mod_regs_ser.h (CYGARC_SCBRR_N): Reduce rounding error. + 2000-11-10 Jesper Skov * src/var_misc.c: Add spaces around ... used in ranges. 2000-11-01 Jesper Skov 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 + + * include/mod_regs_ser.h (CYGARC_SCBRR_N): Reduce rounding error. + 2000-11-09 Jesper Skov * 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