From 8e710f21c4fb50e5918c8e2b5087d7f34b858964 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?King=20K=C3=A9vin?= Date: Wed, 11 Jul 2018 08:20:51 +0200 Subject: [PATCH] USART: put parity LUT in header so others can use it --- lib/usart_enhanced.c | 43 +++++++++++++++++++------------------------ lib/usart_enhanced.h | 6 ++++++ 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/lib/usart_enhanced.c b/lib/usart_enhanced.c index efbcf36..9ca9b47 100644 --- a/lib/usart_enhanced.c +++ b/lib/usart_enhanced.c @@ -38,11 +38,7 @@ static enum usart_enhanced_parity_t usart_enhanced_parity[USART_PERIPHERALS_NB]; /** last enhanced USART parity error status */ static bool usart_enhanced_parity_errors[USART_PERIPHERALS_NB]; -/** know if there is an even number of 1's in a integer - * @remark a look-up is a lot faster than making the calculation and doesn't does a lot of (flash) space - */ -static const bool even_parity_lut[256] = { true, false, false, true, false, true, true, false, false, true, true, false, true, false, false, true, false, true, true, false, true, false, false, true, true, false, false, true, false, true, true, false, false, true, true, false, true, false, false, true, true, false, false, true, false, true, true, false, true, false, false, true, false, true, true, false, false, true, true, false, true, false, false, true, false, true, true, false, true, false, false, true, true, false, false, true, false, true, true, false, true, false, false, true, false, true, true, false, false, true, true, false, true, false, false, true, true, false, false, true, false, true, true, false, false, true, true, false, true, false, false, true, false, true, true, false, true, false, false, true, true, false, false, true, false, true, true, false, false, true, true, false, true, false, false, true, true, false, false, true, false, true, true, false, true, false, false, true, false, true, true, false, false, true, true, false, true, false, false, true, true, false, false, true, false, true, true, false, false, true, true, false, true, false, false, true, false, true, true, false, true, false, false, true, true, false, false, true, false, true, true, false, true, false, false, true, false, true, true, false, false, true, true, false, true, false, false, true, false, true, true, false, true, false, false, true, true, false, false, true, false, true, true, false, false, true, true, false, true, false, false, true, true, false, false, true, false, true, true, false, true, false, false, true, false, true, true, false, false, true, true, false, true, false, false, true, }; - +const bool usart_enhanced_even_parity_lut[256] = { true, false, false, true, false, true, true, false, false, true, true, false, true, false, false, true, false, true, true, false, true, false, false, true, true, false, false, true, false, true, true, false, false, true, true, false, true, false, false, true, true, false, false, true, false, true, true, false, true, false, false, true, false, true, true, false, false, true, true, false, true, false, false, true, false, true, true, false, true, false, false, true, true, false, false, true, false, true, true, false, true, false, false, true, false, true, true, false, false, true, true, false, true, false, false, true, true, false, false, true, false, true, true, false, false, true, true, false, true, false, false, true, false, true, true, false, true, false, false, true, true, false, false, true, false, true, true, false, false, true, true, false, true, false, false, true, true, false, false, true, false, true, true, false, true, false, false, true, false, true, true, false, false, true, true, false, true, false, false, true, true, false, false, true, false, true, true, false, false, true, true, false, true, false, false, true, false, true, true, false, true, false, false, true, true, false, false, true, false, true, true, false, true, false, false, true, false, true, true, false, false, true, true, false, true, false, false, true, false, true, true, false, true, false, false, true, true, false, false, true, false, true, true, false, false, true, true, false, true, false, false, true, true, false, false, true, false, true, true, false, true, false, false, true, false, true, true, false, false, true, true, false, true, false, false, true, }; /** get index of corresponding enhanced USART configurations * @param[in] usart USART peripheral base address @@ -87,7 +83,7 @@ bool usart_enhanced_config(uint32_t usart, uint8_t databits, enum usart_enhanced usart_enhanced_databits[id] = databits; usart_enhanced_parity[id] = parity; // configure USART peripheral - if (8==databits && USART_ENHANCED_PARITY_NONE!=parity) { // the parity bit is additional to the data bits + if (8 == databits && USART_ENHANCED_PARITY_NONE != parity) { // the parity bit is additional to the data bits usart_set_databits(usart, 9); } else { usart_set_databits(usart, 8); @@ -101,26 +97,26 @@ void usart_enhanced_send(uint32_t usart, uint8_t data) { /* sanity check */ uint8_t id = usart_enhanced_id(usart); - if (id>=USART_PERIPHERALS_NB) { + if (id >= USART_PERIPHERALS_NB) { return; } - data &= ~(0xff<=USART_PERIPHERALS_NB) { + if (id >= USART_PERIPHERALS_NB) { return 0xff; } uint16_t input = usart_recv(usart); // read received character (also clears the error flags) - input &= ~(0xffff<<(usart_enhanced_databits[id]+1)); // only keep the data bits + parity bit + uint8_t data = input & ~(0xffff << usart_enhanced_databits[id]); // only keep the data bits // check the parity - uint16_t parity = input&(1<=USART_PERIPHERALS_NB) { + if (id >= USART_PERIPHERALS_NB) { return false; } return usart_enhanced_parity_errors[id]; diff --git a/lib/usart_enhanced.h b/lib/usart_enhanced.h index 33f32c7..85bd363 100644 --- a/lib/usart_enhanced.h +++ b/lib/usart_enhanced.h @@ -44,6 +44,12 @@ enum usart_enhanced_parity_t { USART_ENHANCED_PARITY_SPACE, }; +/** know if there is an even number of 1's in a integer + * @note this look up table is only useful for up to 8-bit words, else use __builtin_parity + * @remark a look-up is a lot faster than making the calculation and doesn't use a lot of (flash) memory + */ +extern const bool usart_enhanced_even_parity_lut[256]; + /** configure enhanced USART * @param[in] usart USART peripheral base address * @param[in] databits word size in bits (5 to 8)