summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ch341a_spi.c13
-rw-r--r--flash.h2
-rw-r--r--helpers.c17
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)