From 7ecfe48b19c3e97341a3f2b0d85e7367ab92f2b6 Mon Sep 17 00:00:00 2001 From: Marc Schink Date: Thu, 17 Mar 2016 16:07:23 +0100 Subject: helpers: Add reverse_byte() and reverse_bytes() Change-Id: I9d2e1e2856c835d22eed3b3a34bc0379773dd831 Signed-off-by: Marc Schink Reviewed-on: https://review.coreboot.org/28086 Tested-by: build bot (Jenkins) Reviewed-by: Nico Huber --- ch341a_spi.c | 13 ++----------- flash.h | 2 ++ helpers.c | 17 +++++++++++++++++ 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/ch341a_spi.c b/ch341a_spi.c index 9ebda0d3a..83d5ccf35 100644 --- a/ch341a_spi.c +++ b/ch341a_spi.c @@ -274,15 +274,6 @@ static int32_t config_stream(uint32_t speed) return ret; } -/* ch341 requires LSB first, swap the bit order before send and after receive */ -static uint8_t swap_byte(uint8_t x) -{ - x = ((x >> 1) & 0x55) | ((x << 1) & 0xaa); - x = ((x >> 2) & 0x33) | ((x << 2) & 0xcc); - x = ((x >> 4) & 0x0f) | ((x << 4) & 0xf0); - return x; -} - /* The assumed map between UIO command bits, pins on CH341A chip and pins on SPI chip: * UIO CH341A SPI CH341A SPI name * 0 D0/15 CS/1 (CS0) @@ -372,7 +363,7 @@ static int ch341a_spi_spi_send_command(struct flashctx *flash, unsigned int writ *ptr++ = CH341A_CMD_SPI_STREAM; unsigned int i; for (i = 0; i < write_now; ++i) - *ptr++ = swap_byte(*writearr++); + *ptr++ = reverse_byte(*writearr++); if (read_now) { memset(ptr, 0xFF, read_now); read_left -= read_now; @@ -387,7 +378,7 @@ static int ch341a_spi_spi_send_command(struct flashctx *flash, unsigned int writ unsigned int i; for (i = 0; i < readcnt; i++) { - *readarr++ = swap_byte(rbuf[writecnt + i]); + *readarr++ = reverse_byte(rbuf[writecnt + i]); } return 0; diff --git a/flash.h b/flash.h index fca377506..01ff5cd6c 100644 --- a/flash.h +++ b/flash.h @@ -295,6 +295,8 @@ int max(int a, int b); int min(int a, int b); char *strcat_realloc(char *dest, const char *src); void tolower_string(char *str); +uint8_t reverse_byte(uint8_t x); +void reverse_bytes(uint8_t *dst, const uint8_t *src, size_t length); #ifdef __MINGW32__ char* strtok_r(char *str, const char *delim, char **nextp); #endif diff --git a/helpers.c b/helpers.c index 2fcda65c6..a714908b7 100644 --- a/helpers.c +++ b/helpers.c @@ -66,6 +66,23 @@ void tolower_string(char *str) *str = (char)tolower((unsigned char)*str); } +uint8_t reverse_byte(uint8_t x) +{ + x = ((x >> 1) & 0x55) | ((x << 1) & 0xaa); + x = ((x >> 2) & 0x33) | ((x << 2) & 0xcc); + x = ((x >> 4) & 0x0f) | ((x << 4) & 0xf0); + + return x; +} + +void reverse_bytes(uint8_t *dst, const uint8_t *src, size_t length) +{ + size_t i; + + for (i = 0; i < length; i++) + dst[i] = reverse_byte(src[i]); +} + /* FIXME: Find a better solution for MinGW. Maybe wrap strtok_s (C11) if it becomes available */ #ifdef __MINGW32__ char* strtok_r(char *str, const char *delim, char **nextp) -- cgit v1.2.3