summaryrefslogtreecommitdiffstats
path: root/sdma-gen-image.c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2010-07-30 14:42:54 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2010-07-30 14:42:54 +0200
commitfe273e179f246cca1a5cac6f2edebb559c2bcfce (patch)
tree87278f6d2f33542688a7e4e386541e8c0c272253 /sdma-gen-image.c
downloadsdma-firmware-fe273e179f246cca1a5cac6f2edebb559c2bcfce.tar.gz
sdma-firmware-fe273e179f246cca1a5cac6f2edebb559c2bcfce.tar.xz
initial
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'sdma-gen-image.c')
-rw-r--r--sdma-gen-image.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/sdma-gen-image.c b/sdma-gen-image.c
new file mode 100644
index 0000000..a63e669
--- /dev/null
+++ b/sdma-gen-image.c
@@ -0,0 +1,77 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include "sdma-firmware.h"
+
+
+static struct sdma_firmware *firmwares[] = {
+ &sdma_imx31_v1,
+ &sdma_imx31_v2,
+ &sdma_imx35_v1,
+ &sdma_imx35_v2,
+};
+
+static int gen_one(struct sdma_firmware *fw)
+{
+ struct sdma_firmware_header header;
+ int ret;
+ char *name;
+ FILE *f;
+
+ printf("name: %s %d\n", fw->name);
+
+ header.magic = 0x414d4453;
+ header.version_major = 1;
+ header.version_minor = fw->version;
+ header.script_addrs_start = sizeof(header);
+ header.num_script_addrs = sizeof(struct sdma_script_start_addrs) / sizeof(uint32_t);
+ header.ram_code_start = header.script_addrs_start + sizeof(struct sdma_script_start_addrs);
+ header.ram_code_size = fw->blob_size * sizeof(uint16_t);
+
+ ret = asprintf(&name, "%s.bin", fw->name);
+ if (ret < 0)
+ return ret;
+
+ f = fopen(name, "w");
+ if (!f) {
+ perror("fopen");
+ ret = -1;
+ goto out_free;
+ }
+
+ ret = fwrite(&header, sizeof(header), 1, f);
+ if (ret != 1)
+ goto out_free;
+ ret = fwrite(fw->addr, sizeof(struct sdma_script_start_addrs), 1, f);
+ if (ret != 1)
+ goto out_free;
+ ret = fwrite(fw->blob, header.ram_code_size, 1, f);
+ if (ret != 1)
+ goto out_free;
+
+ fclose(f);
+
+ return 0;
+
+out_free:
+ free(name);
+
+ return ret;
+}
+
+int main(void)
+{
+ int i, ret;
+
+ for (i = 0; i < ARRAY_SIZE(firmwares); i++) {
+ ret = gen_one(firmwares[i]);
+ if (ret)
+ exit(1);
+ }
+
+ return 0;
+}