summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrank Gevaerts <frank@gevaerts.be>2008-09-13 16:23:01 +0000
committerFrank Gevaerts <frank@gevaerts.be>2008-09-13 16:23:01 +0000
commitc487c01d4626eb5f7aa07654829722f42695ffa6 (patch)
treeba88a6cbd3e01880efc044ad389cfcfd7c98a456
parent5b4df4a72e60494cee6622f7344c9f2df99a73db (diff)
downloadrockbox-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.c22
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
19void usage() 29void 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