diff options
author | Frank Gevaerts <frank@gevaerts.be> | 2008-09-13 16:23:01 +0000 |
---|---|---|
committer | Frank Gevaerts <frank@gevaerts.be> | 2008-09-13 16:23:01 +0000 |
commit | c487c01d4626eb5f7aa07654829722f42695ffa6 (patch) | |
tree | ba88a6cbd3e01880efc044ad389cfcfd7c98a456 | |
parent | 5b4df4a72e60494cee6622f7344c9f2df99a73db (diff) | |
download | rockbox-c487c01d4626eb5f7aa07654829722f42695ffa6.tar.gz rockbox-c487c01d4626eb5f7aa07654829722f42695ffa6.zip |
fix meizu_dfu endianness issues
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@18508 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | utils/meizu_dfu/meizu_dfu.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/utils/meizu_dfu/meizu_dfu.c b/utils/meizu_dfu/meizu_dfu.c index b7b1c43ef7..62c221eabc 100644 --- a/utils/meizu_dfu/meizu_dfu.c +++ b/utils/meizu_dfu/meizu_dfu.c | |||
@@ -16,6 +16,16 @@ | |||
16 | 16 | ||
17 | #include <usb.h> | 17 | #include <usb.h> |
18 | 18 | ||
19 | #define bswap_16(value) \ | ||
20 | ((((value) & 0xff) << 8) | ((value) >> 8)) | ||
21 | |||
22 | #define bswap_32(value) \ | ||
23 | (((uint32_t)bswap_16((uint16_t)((value) & 0xffff)) << 16) | \ | ||
24 | (uint32_t)bswap_16((uint16_t)((value) >> 16))) | ||
25 | |||
26 | #define host_to_le32(_x) bswap_32(htonl(_x)) | ||
27 | #define host_to_le16(_x) bswap_16(htons(_x)) | ||
28 | |||
19 | void usage() | 29 | void usage() |
20 | { | 30 | { |
21 | fprintf(stderr, "usage: meizu_dfu m3 <SST39VF800.dfu> <M3.EBN>\n"); | 31 | fprintf(stderr, "usage: meizu_dfu m3 <SST39VF800.dfu> <M3.EBN>\n"); |
@@ -82,6 +92,7 @@ void init_img(image_data_t *img, const char *filename, image_attr_t *attr) | |||
82 | struct stat statbuf; | 92 | struct stat statbuf; |
83 | char buf[BLOCK_SIZE]; | 93 | char buf[BLOCK_SIZE]; |
84 | uint32_t dfu_crc; | 94 | uint32_t dfu_crc; |
95 | uint32_t le_len; | ||
85 | 96 | ||
86 | printf("Reading %s...", filename); | 97 | printf("Reading %s...", filename); |
87 | 98 | ||
@@ -100,8 +111,15 @@ void init_img(image_data_t *img, const char *filename, image_attr_t *attr) | |||
100 | } | 111 | } |
101 | close(fd); | 112 | close(fd); |
102 | 113 | ||
114 | le_len = host_to_le32(img->len); | ||
103 | // patch the data size in after the signature | 115 | // patch the data size in after the signature |
104 | memcpy(img->data + attr->pre_off + 4, &img->len, 4); | 116 | memcpy(img->data + attr->pre_off + 4, &le_len, 4); |
117 | |||
118 | /* convert to little endian */ | ||
119 | attr->suf_dev = host_to_le16(attr->suf_dev); | ||
120 | attr->suf_prod = host_to_le16(attr->suf_prod); | ||
121 | attr->suf_ven = host_to_le16(attr->suf_ven); | ||
122 | attr->suf_dfu = host_to_le16(attr->suf_dfu); | ||
105 | 123 | ||
106 | // append the suffix (excluding the checksum) | 124 | // append the suffix (excluding the checksum) |
107 | memcpy(img->data + len, &attr->suf_dev, 2); | 125 | memcpy(img->data + len, &attr->suf_dev, 2); |
@@ -111,7 +129,7 @@ void init_img(image_data_t *img, const char *filename, image_attr_t *attr) | |||
111 | memcpy(img->data + len + 8, &attr->suf_sig, 3); | 129 | memcpy(img->data + len + 8, &attr->suf_sig, 3); |
112 | memcpy(img->data + len + 11, &attr->suf_len, 1); | 130 | memcpy(img->data + len + 11, &attr->suf_len, 1); |
113 | 131 | ||
114 | dfu_crc = crc32(img->data, len + 12, DFU_CRC_POLY, DFU_INIT_CRC); | 132 | dfu_crc = host_to_le32(crc32(img->data, len + 12, DFU_CRC_POLY, DFU_INIT_CRC)); |
115 | memcpy(img->data + len + 12, &dfu_crc, 4); | 133 | memcpy(img->data + len + 12, &dfu_crc, 4); |
116 | 134 | ||
117 | #if 0 | 135 | #if 0 |