DCD v1 elements are encoded little endian.

Signed-off-by: Alexander Kurz <ak...@blala.de>
---
 scripts/imx/imx-usb-loader.c | 19 +++++++++++--------
 scripts/imx/imx.h            |  6 ++++++
 2 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/scripts/imx/imx-usb-loader.c b/scripts/imx/imx-usb-loader.c
index 9f25ca6..db74910 100644
--- a/scripts/imx/imx-usb-loader.c
+++ b/scripts/imx/imx-usb-loader.c
@@ -32,6 +32,7 @@
 #include <stdlib.h>
 #include <libusb.h>
 #include <getopt.h>
+#include <endian.h>
 #include <arpa/inet.h>
 #include <linux/kernel.h>
 
@@ -872,7 +873,6 @@ static int get_dcd_range_old(const struct imx_flash_header 
*hdr,
 static int write_dcd_table_old(const struct imx_flash_header *hdr,
                               const unsigned char *file_start, unsigned cnt)
 {
-       unsigned val;
        unsigned char *dcd_end;
        unsigned char* dcd;
        int err = get_dcd_range_old(hdr, file_start, cnt, &dcd, &dcd_end);
@@ -882,23 +882,26 @@ static int write_dcd_table_old(const struct 
imx_flash_header *hdr,
        printf("writing DCD table...\n");
 
        while (dcd < dcd_end) {
-               unsigned type = (dcd[0] << 0) | (dcd[1] << 8) | (dcd[2] << 16) 
| (dcd[3] << 24);
-               unsigned addr = (dcd[4] << 0) | (dcd[5] << 8) | (dcd[6] << 16) 
| (dcd[7] << 24);
-               val = (dcd[8] << 0) | (dcd[9] << 8) | (dcd[10] << 16) | 
(dcd[11] << 24);
-               dcd += 12;
+               struct imx_dcd_rec_v1 *rec = (struct imx_dcd_rec_v1 *) dcd;
+               unsigned type = le32toh(rec->type);
+               dcd += sizeof *rec;
 
                switch (type) {
                case 1:
                case 2:
                case 4:
                        if (verbose > 1)
-                               printf("type=%08x *0x%08x = 0x%08x\n", type, 
addr, val);
-                       err = write_memory(addr, val, type);
+                               printf("type=%08x *0x%08x = 0x%08x\n", type,
+                                       le32toh(rec->addr),
+                                       le32toh(rec->val));
+                       err = write_memory(le32toh(rec->addr),
+                                          le32toh(rec->val), type);
                        if (err < 0)
                                return err;
                        break;
                default:
-                       printf("!!!unknown type=%08x *0x%08x = 0x%08x\n", type, 
addr, val);
+                       printf("WARNING: unknown DCD type=%08x ignored\n",
+                              type);
                }
        }
 
diff --git a/scripts/imx/imx.h b/scripts/imx/imx.h
index 8db7e7b..64ebdce 100644
--- a/scripts/imx/imx.h
+++ b/scripts/imx/imx.h
@@ -26,6 +26,12 @@ struct imx_boot_data {
        uint32_t plugin;
 } __attribute__((packed));
 
+struct imx_dcd_rec_v1 {
+       uint32_t type;
+       uint32_t addr;
+       uint32_t val;
+} __attribute__((packed));
+
 #define TAG_IVT_HEADER 0xd1
 #define IVT_VERSION    0x40
 #define TAG_DCD_HEADER 0xd2
-- 
2.1.4


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to