Page MenuHomeFreeBSD

Add RTC clock conversions for BCD values, with non-panic validation.

Authored by ian on Jan 1 2018, 11:45 PM.



RTC clock hardware frequently uses BCD numbers. Currently the low-level bcd2bin() and bin2bcd() functions will KASSERT if given out-of-range BCD values. Every RTC driver must implement its own code for validating the unreliable data coming from the hardware to avoid a potential kernel panic.

This change introduces two new functions, clock_bcd_to_ts() and clock_ts_to_bcd(). The former validates its inputs and returns EINVAL if any values are out of range. The latter guarantees the returned data will be valid BCD in a known format (4-digit years, etc).

A new bcd_clocktime structure is used with the new functions. It is identical to the original clocktime structure, but has a new unique type to help avoid errors such as passing binary clocktime data to the bcd flavor of conversions.

Changes to existing drivers to use the new code will be committed separately, once this new stuff makes it through review.

Diff Detail

rS FreeBSD src repository
Lint Skipped
Unit Tests Skipped
Build Status
Buildable 14248

Event Timeline

ian created this revision.Jan 1 2018, 11:45 PM
ian updated this revision to Diff 37728.Jan 10 2018, 4:18 PM

Add support for handling AM/PM mode (12 vs 24 hour clock) to the conversion routines. Many RTC chips/drivers support an AM/PM mode, and it turns out to be difficult to do the math on BCD values in each individual driver. It's much easier to commonize the support and do the math while the numbers are in binary form during conversion.

Also, change the types of the fields holding BCD data in the bcd_clocktime struct to be uint8_t rather than plain int.

ian abandoned this revision.Jan 16 2018, 4:56 AM

Committed as r327971