diff options
author | Eric Bénard <eric@eukrea.com> | 2014-09-24 16:42:59 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2014-09-25 08:13:24 +0200 |
commit | 690e3920274769cb4f00154c8f7cbac555994905 (patch) | |
tree | 8e0d990d643f3b0b16419584f79ce8d5d9556ab3 /scripts | |
parent | 6deac63f984da891888461b2d74de956e0121b90 (diff) | |
download | barebox-690e3920274769cb4f00154c8f7cbac555994905.tar.gz barebox-690e3920274769cb4f00154c8f7cbac555994905.tar.xz |
imx-image: handle i.MX35 special case
From the i.MX35 user manual :
Since MLC NAND Flash devices do not guarantee error-free boot blocks,
the i.MX35 boot code requires that the first 4 Kbytes of boot code be
duplicated in a subsequent block to serve as a second copy option.
Actually imx-image puts the image at 4k but it seems that the i.MX35
bootrom copies only from 8k as it expects that there is a copy of the
first 0-4k in 4k-8k (and is supposed to use this copy if there is an
ECC error in the first 4k) as we can see in the following lines :
barebox@Eukrea CPUIMX35:/ md -s /dev/nand0 0x0
00000000: ea0003fe eafffffe eafffffe eafffffe ................
00000010: eafffffe eafffffe eafffffe eafffffe ................
00000020: 65726162 00786f62 00000000 00000000
barebox.........
=-> header is @ 0 in flash
barebox@Eukrea CPUIMX35:/ md -s /dev/nand0 0x1000
00001000: 56341200 00000000 0001eda1 00000000 ..4V............
00001010: 00000000 00000000 00000000
00000000 ................
=-> so we have data @ 0x1000 in flash
barebox@Eukrea CPUIMX35:/ md 0x87f00000
87f00000: 00000000 00000000 00000000 00000000 ................
87f00010: 00000000 00000000 00000000
00000000 ................
=-> but we don't find this data in RAM
barebox@Eukrea CPUIMX35:/ md -s /dev/nand0 0x2000
00002000: ea000012 eafffffe eafffffe eafffffe ................
00002010: eafffffe eafffffe eafffffe eafffffe ................
00002020: 65726162 00786f62 00000000 00034272
barebox.....rB..
=-> so we have the image @ 0x2000 in flash
barebox@Eukrea CPUIMX35:/ md 0x87f01000
87f01000: ea000871 eafffffe eafffffe eafffffe q...............
87f01010: eafffffe eafffffe eafffffe eafffffe ................
87f01020: 65726162 00786f62 87f02000 0003b520 barebox.. .. ...
=-> and we find it in RAM
Signed-off-by: Eric Bénard <eric@eukrea.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/imx/imx-image.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/scripts/imx/imx-image.c b/scripts/imx/imx-image.c index d1db51780f..1f37fe20bc 100644 --- a/scripts/imx/imx-image.c +++ b/scripts/imx/imx-image.c @@ -37,6 +37,7 @@ static uint32_t image_dcd_offset; static uint32_t dcdtable[MAX_DCD]; static int curdcd; static int header_version; +static int cpu_type; static int add_barebox_header; /* @@ -448,14 +449,15 @@ static int do_dcd_offset(int argc, char *argv[]) struct soc_type { char *name; int header_version; + int cpu_type; }; static struct soc_type socs[] = { - { .name = "imx25", .header_version = 1, }, - { .name = "imx35", .header_version = 1, }, - { .name = "imx51", .header_version = 1, }, - { .name = "imx53", .header_version = 2, }, - { .name = "imx6", .header_version = 2, }, + { .name = "imx25", .header_version = 1, .cpu_type = 25}, + { .name = "imx35", .header_version = 1, .cpu_type = 35 }, + { .name = "imx51", .header_version = 1, .cpu_type = 51 }, + { .name = "imx53", .header_version = 2, .cpu_type = 53 }, + { .name = "imx6", .header_version = 2, .cpu_type = 6 }, }; static int do_soc(int argc, char *argv[]) @@ -471,6 +473,7 @@ static int do_soc(int argc, char *argv[]) for (i = 0; i < ARRAY_SIZE(socs); i++) { if (!strcmp(socs[i].name, soc)) { header_version = socs[i].header_version; + cpu_type = socs[i].cpu_type; return 0; } } @@ -761,6 +764,14 @@ int main(int argc, char *argv[]) exit(1); } + if (cpu_type == 35) { + ret = xwrite(outfd, buf, 4096); + if (ret < 0) { + perror("write"); + exit(1); + } + } + infd = open(imagename, O_RDONLY); if (infd < 0) { perror("open"); |