]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - tools/mksunxiboot.c
arm: bcmcygnus: Enable Ethernet support
[karo-tx-uboot.git] / tools / mksunxiboot.c
index da7c9f0ddc004adf9f7402a876a400ecc16cdf93..3361251c8e7fffcb4ccbc3e29eb5e2e956608b0c 100644 (file)
@@ -43,19 +43,19 @@ int gen_check_sum(struct boot_file_head *head_p)
        uint32_t i;
        uint32_t sum;
 
-       length = head_p->length;
+       length = le32_to_cpu(head_p->length);
        if ((length & 0x3) != 0)        /* must 4-byte-aligned */
                return -1;
        buf = (uint32_t *)head_p;
-       head_p->check_sum = STAMP_VALUE;        /* fill stamp */
+       head_p->check_sum = cpu_to_le32(STAMP_VALUE);   /* fill stamp */
        loop = length >> 2;
 
        /* calculate the sum */
        for (i = 0, sum = 0; i < loop; i++)
-               sum += buf[i];
+               sum += le32_to_cpu(buf[i]);
 
        /* write back check sum */
-       head_p->check_sum = sum;
+       head_p->check_sum = cpu_to_le32(sum);
 
        return 0;
 }
@@ -65,7 +65,13 @@ int gen_check_sum(struct boot_file_head *head_p)
 
 #define SUN4I_SRAM_SIZE 0x7600 /* 0x7748+ is used by BROM */
 #define SRAM_LOAD_MAX_SIZE (SUN4I_SRAM_SIZE - sizeof(struct boot_file_head))
-#define BLOCK_SIZE 512
+
+/*
+ * BROM (at least on A10 and A20) requires NAND-images to be explicitly aligned
+ * to a multiple of 8K, and rejects the image otherwise. MMC-images are fine
+ * with 512B blocks. To cater for both, align to the largest of the two.
+ */
+#define BLOCK_SIZE 0x2000
 
 struct boot_img {
        struct boot_file_head header;
@@ -77,7 +83,7 @@ int main(int argc, char *argv[])
 {
        int fd_in, fd_out;
        struct boot_img img;
-       unsigned file_size, load_size;
+       unsigned file_size;
        int count;
 
        if (argc < 2) {
@@ -101,8 +107,6 @@ int main(int argc, char *argv[])
        if (file_size > SRAM_LOAD_MAX_SIZE) {
                fprintf(stderr, "ERROR: File too large!\n");
                return EXIT_FAILURE;
-       } else {
-               load_size = ALIGN(file_size, sizeof(int));
        }
 
        fd_out = open(argv[2], O_WRONLY | O_CREAT, 0666);
@@ -113,8 +117,8 @@ int main(int argc, char *argv[])
 
        /* read file to buffer to calculate checksum */
        lseek(fd_in, 0, SEEK_SET);
-       count = read(fd_in, img.code, load_size);
-       if (count != load_size) {
+       count = read(fd_in, img.code, file_size);
+       if (count != file_size) {
                perror("Reading input image");
                return EXIT_FAILURE;
        }
@@ -126,11 +130,13 @@ int main(int argc, char *argv[])
                 & 0x00FFFFFF);
        memcpy(img.header.magic, BOOT0_MAGIC, 8);       /* no '0' termination */
        img.header.length =
-               ALIGN(load_size + sizeof(struct boot_file_head), BLOCK_SIZE);
+               ALIGN(file_size + sizeof(struct boot_file_head), BLOCK_SIZE);
+       img.header.b_instruction = cpu_to_le32(img.header.b_instruction);
+       img.header.length = cpu_to_le32(img.header.length);
        gen_check_sum(&img.header);
 
-       count = write(fd_out, &img, img.header.length);
-       if (count != img.header.length) {
+       count = write(fd_out, &img, le32_to_cpu(img.header.length));
+       if (count != le32_to_cpu(img.header.length)) {
                perror("Writing output");
                return EXIT_FAILURE;
        }