initial version
[glsdk/dra7xx-umlo.git] / mkimage.c
1 /*
2  * (C) Copyright 2017
3  * Texas Instruments Incorporated, <www.ti.com>
4  *
5  * Venkateswara Rao Mandela <venkat.mandela@ti.com>
6  *
7  * SPDX-License-Identifier:     BSD-3-Clause
8  */
9 #include <stdio.h>
10 #include <stdint.h>
11 #include <string.h>
12 #include <stdlib.h>
13 #include <assert.h>
14 #define _BSD_SOURCE
15 #include <endian.h>
17 void usage(char *str) {
18     printf("Usage is %s -a <load address> <input> <output>\n",
19            str);
20 }
21 void * read_file(char *filename, size_t *f_size) {
23   FILE *fp;
24   void *mptr = NULL;
25   size_t file_size=1024;
26   size_t nread;
29   fp=fopen(filename,"rb");
30   if(fp==NULL) {
31     printf("Could not open file %s\n\n",filename);
32     goto err_ret;
33     /*
34       } else {
35       printf("Loaded file %s\n\n",filename);
36     */
37   }
38   fseek(fp,0,SEEK_END);
39   file_size = ftell(fp);
40   fseek(fp,0,SEEK_SET);
42   /*
43   printf("%s found; size is %d bytes\n",filename,file_size);
44   */
45   mptr = (void *)malloc(file_size);
46   assert(mptr!=NULL);
47   memset(mptr,0x00,file_size);
49   nread = fread(mptr,sizeof(uint8_t),file_size,fp);
51   if(nread != file_size){
52     printf("file %s : partially read %lu/%lu\n",
53            filename,
54            nread, file_size);
55   }
57   fclose(fp);
59   *f_size = file_size;
60  err_ret:
61   return mptr;
62 }
64 void print_bytes(void *ptr, uint32_t n) {
65   uint32_t i = 0;
66   uint8_t *p = (uint8_t *) ptr;
67   for (i = 0; i < n; i++)
68     printf("%02x ", p[i]);
69   printf("\n");
70 }
71 /*
72  * Add an 8 byte header to the binary.
73  *
74  * first four bytes size of the image including the GP HEADER
75  * load address
76  */
77 int main(int argc, char *argv[]) {
79   uint32_t arg_cnt = 0;
80   uint32_t load_addr = 0;
81   uint32_t cnt = 0;
82   size_t inp_size;
83   void *iptr;
84   FILE *fout;
85   uint32_t out_val = 0;
87   if (argc !=  5)
88     usage(argv[0]);
90   arg_cnt++;
91   if (strcmp(argv[arg_cnt],"-a") != 0) {
92     printf("load_addr should be first argument\n");
93     usage(argv[0]);
94     exit(1);
95   }
96   arg_cnt++;
98   cnt =  sscanf(argv[arg_cnt],"%x", &load_addr);
99   if (cnt != 1) {
100     printf("unable to read load address in hex from %s\n",
101            argv[arg_cnt]);
102     usage(argv[0]);
103     exit(1);
104   }
105   arg_cnt++;
106   iptr = read_file(argv[arg_cnt], &inp_size);
107   if(iptr == NULL){
108     printf("Could not read %s\n",argv[arg_cnt]);
109     usage(argv[0]);
110     exit(1);
111   }
113   arg_cnt++;
114   fout = fopen(argv[arg_cnt], "wb");
115   if (fout == NULL) {
116     printf("Could not open %s for output\n", argv[arg_cnt]);
117     usage(argv[0]);
118     exit(1);
119   }
121   out_val = inp_size + 8;
122   print_bytes(&out_val,sizeof(out_val));
123   cnt = fwrite(&out_val, sizeof(uint8_t),
124                sizeof(out_val), fout);
125   assert(cnt == 4);
127   out_val = load_addr;
128   print_bytes(&out_val,sizeof(out_val));
129   cnt = fwrite(&out_val, sizeof(uint8_t),
130                sizeof(out_val), fout);
131   assert(cnt == 4);
133   cnt = fwrite(iptr, sizeof(uint8_t),
134                inp_size, fout);
135   assert(cnt == inp_size);
136   fclose(fout);
138   free(iptr);
139   return 0;