summaryrefslogtreecommitdiff
path: root/quantum/backlight/backlight_avr.c
diff options
context:
space:
mode:
authorKarl Shea <karlshea@gmail.com>2021-11-29 09:07:36 -0600
committerGitHub <noreply@github.com>2021-11-29 15:07:36 +0000
commit84b8cdc1a43245d24b232bc8e28cca7f1183d676 (patch)
treeff497f2cc3a2390e70d87e1ad3252050682a26d0 /quantum/backlight/backlight_avr.c
parent23d3ebd78a5ce823f36abb19b73df900a84d1912 (diff)
downloadqmk_firmware-84b8cdc1a43245d24b232bc8e28cca7f1183d676.tar.gz
qmk_firmware-84b8cdc1a43245d24b232bc8e28cca7f1183d676.zip
Fix bit loss in cie_lightness() when doing division to resolve #15331 (#15344)
* Fix bit loss in cie_lightness() when doing division. * Use the right types * Format Co-authored-by: zvecr <git@zvecr.com>
Diffstat (limited to 'quantum/backlight/backlight_avr.c')
-rw-r--r--quantum/backlight/backlight_avr.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/quantum/backlight/backlight_avr.c b/quantum/backlight/backlight_avr.c
index 67b551dc3c..9c972ae02e 100644
--- a/quantum/backlight/backlight_avr.c
+++ b/quantum/backlight/backlight_avr.c
@@ -232,19 +232,19 @@ ISR(TIMERx_OVF_vect) {
// See http://jared.geek.nz/2013/feb/linear-led-pwm
static uint16_t cie_lightness(uint16_t v) {
- if (v <= ICRx / 12) // If the value is less than or equal to ~8% of max
+ if (v <= (uint32_t)ICRx / 12) // If the value is less than or equal to ~8% of max
{
return v / 9; // Same as dividing by 900%
} else {
// In the next two lines values are bit-shifted. This is to avoid loosing decimals in integer math.
- uint32_t y = (((uint32_t)v + ICRx / 6) << 5) / (ICRx / 6 + ICRx); // If above 8%, add ~16% of max, and normalize with (max + ~16% max)
- uint32_t out = (y * y * y * ICRx) >> 15; // Cube it and undo the bit-shifting. (which is now three times as much due to the cubing)
+ uint32_t y = (((uint32_t)v + (uint32_t)ICRx / 6) << 5) / ((uint32_t)ICRx / 6 + ICRx); // If above 8%, add ~16% of max, and normalize with (max + ~16% max)
+ uint32_t out = (y * y * y * ICRx) >> 15; // Cube it and undo the bit-shifting. (which is now three times as much due to the cubing)
if (out > ICRx) // Avoid overflows
{
out = ICRx;
}
- return out;
+ return (uint16_t)out;
}
}