summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/include/lib.h13
-rw-r--r--src/lib/Makefile.inc1
-rw-r--r--src/lib/hexstrtobin.c44
3 files changed, 58 insertions, 0 deletions
diff --git a/src/include/lib.h b/src/include/lib.h
index 737ab36b83..5bcd07df80 100644
--- a/src/include/lib.h
+++ b/src/include/lib.h
@@ -44,6 +44,19 @@ int checkstack(void *top_of_stack, int core);
void hexdump(const void *memory, size_t length);
void hexdump32(char LEVEL, const void *d, size_t len);
+/*
+ * hexstrtobin - Turn a string of ASCII hex characters into binary
+ *
+ * @str: String of hex characters to parse
+ * @buf: Buffer to store the resulting bytes into
+ * @len: Maximum length of buffer to fill
+ *
+ * Defined in src/lib/hexstrtobin.c
+ * Ignores non-hex characters in the string.
+ * Returns the number of bytes that have been put in the buffer.
+ */
+size_t hexstrtobin(const char *str, uint8_t *buf, size_t len);
+
#if !defined(__ROMCC__)
/* Count Leading Zeroes: clz(0) == 32, clz(0xf) == 28, clz(1 << 31) == 0 */
static inline int clz(u32 x) { return x ? __builtin_clz(x) : sizeof(x) * 8; }
diff --git a/src/lib/Makefile.inc b/src/lib/Makefile.inc
index 734b517b01..b446e10a35 100644
--- a/src/lib/Makefile.inc
+++ b/src/lib/Makefile.inc
@@ -114,6 +114,7 @@ ramstage-y += cbfs.c
ramstage-$(CONFIG_COMMON_CBFS_SPI_WRAPPER) += cbfs_spi.c
ramstage-y += lzma.c lzmadecode.c
ramstage-y += stack.c
+ramstage-y += hexstrtobin.c
ramstage-y += wrdd.c
ramstage-$(CONFIG_CONSOLE_CBMEM) += cbmem_console.c
ramstage-$(CONFIG_BOOTSPLASH) += jpeg.c
diff --git a/src/lib/hexstrtobin.c b/src/lib/hexstrtobin.c
new file mode 100644
index 0000000000..ed2abc4e8b
--- /dev/null
+++ b/src/lib/hexstrtobin.c
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2016 Google Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but without any warranty; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <lib.h>
+#include <string.h>
+
+size_t hexstrtobin(const char *str, uint8_t *buf, size_t len)
+{
+ size_t count, ptr = 0;
+ uint8_t byte;
+
+ for (byte = count = 0; str && *str; str++) {
+ uint8_t c = *str;
+
+ if (!isxdigit(c))
+ continue;
+ if (isdigit(c))
+ c -= '0';
+ else
+ c = tolower(c) - 'a' + 10;
+
+ byte <<= 4;
+ byte |= c;
+
+ if (++count > 1) {
+ if (ptr >= len)
+ return ptr;
+ buf[ptr++] = byte;
+ byte = count = 0;
+ }
+ }
+
+ return ptr;
+}