]> Git Repo - imx_flashconf.git/blame - imx-flashconf.c
error checking
[imx_flashconf.git] / imx-flashconf.c
CommitLineData
a94e8ba6
JT
1// SPDX-License-Identifier: (GPL-2.0 or MIT)
2/*
3 * Copyright (C) 2020 Jesse Taube <[email protected]>
4 */
5
fabb3b08
JT
6#include <stdio.h>
7#include <stdlib.h>
8#include <stdint.h>
9#include <string.h>
10#include <errno.h>
11#include <unistd.h>
12#include <stdbool.h>
a94e8ba6 13#include "flash-defs.h"
fabb3b08
JT
14#include "flash_confs.h"
15
a94e8ba6
JT
16size_t get_name_match(const flash_configs * , const char *);
17void help(int);
18void prepend(FILE *, size_t);
19void list(const flash_configs *);
fabb3b08
JT
20int main(int argc, char *argv[]){
21
c8b08b33
JT
22 char name[32] = {};
23 const char * fname;
fabb3b08
JT
24 int opt;
25 size_t index = 0;
26 size_t padding = 0x1000; // default offset for nor
27 size_t bin = 0;
28 FILE * fnum;
29 const flash_configs * configs = get_flash_confs();
30 const flexspi_nor_config_t * config;
a94e8ba6 31 while ((opt = getopt(argc, argv, "p:n:o:b:lh")) != -1)
fabb3b08
JT
32 {
33 errno = 0;
34 switch (opt)
35 {
36 case 'p':
37 padding = strtol(optarg, NULL, 0);
38 if (errno) {
39 printf("Invalid value for -%c.\n", opt);
40 help(-3);
41 }
42 break;
43 case 'n':
44 strncpy(name,optarg,32);
45 break;
46 case 'o':
c8b08b33 47 fname = optarg;
fabb3b08
JT
48 break;
49 case 'b':
50 bin = strtol(optarg, NULL, 0);
51 if (errno) {
52 printf("Invalid value for -%c.\n", opt);
53 help(-3);
54 }
55 break;
56 case 'h':
57 help(0);
58 break;
a94e8ba6
JT
59 case 'l':
60 list(configs);
61 break;
fabb3b08
JT
62 default:
63 help(-3);
64 break;
65 }
66 }
67
68 if(!strnlen(fname,32))
69 puts("Need an output file name.");
70 if(!strnlen(name,32))
71 puts("Need a flash config name.");
c8b08b33
JT
72 if(strnlen(name,32) == 32)
73 puts("Flash config name too long.");
74 if(!strnlen(name,32) || !strnlen(fname,32) || strnlen(name,32) == 32)
fabb3b08
JT
75 help(-3);
76
77 index = get_name_match(configs,name);
78 if(index == -1){
79 printf("No match found for %s!\nExiting...\n",name);
80 exit(-2);
81 }
82 printf("Match found using %s flash config.\n",configs[index].name);
83
84 config = &configs[index].config;
85
86 fnum = fopen(fname,"wb+");
87 if(!fnum){
88 printf("Can't open %s for writing!\nExiting...\n",fname);
89 exit(-1);
90 }
91
92 fwrite(config,sizeof(flexspi_nor_config_t),1,fnum);
93 for(size_t i = sizeof(flexspi_nor_config_t); i < padding;i++)
94 fputc(0xff,fnum);
95 if(bin)
96 prepend(fnum,bin);
97 fclose(fnum);
98 puts("Done!");
99 return 0;
100}
a94e8ba6
JT
101void list(const flash_configs * configs){
102 for(size_t i = 0; *configs[i].name;i++)
103 printf("%lu: %s\n",i,configs[i].name);
104 exit(0);
105}
fabb3b08 106
a94e8ba6 107size_t get_name_match(const flash_configs * configs, const char * name){
fabb3b08
JT
108 size_t i = 0;
109 while(*configs[i].name){
110 if(strncmp(configs[i].name,name,32) == 0)
111 return i;
112 i++;
113 }
114 return -1;
115}
116void prepend(FILE * fno, size_t offset){
117 FILE * SPL, * uboot;
118 char * buf;
119 size_t sz;
120 uboot = fopen("u-boot.img","r");
121 if(!uboot){
122 puts("Can't open u-boot.img for reading!\nExiting...");
123 fclose(fno);
124 exit(-1);
125 }
126 SPL = fopen("SPL","r");
127 if(!SPL){
128 puts("Can't open SPL for reading!\nExiting...");
129 fclose(uboot);
130 fclose(fno);
131 exit(-1);
132 }
133 fseek(SPL, 0, SEEK_END);
134 sz = ftell(SPL);
135 buf = malloc(sz);
136 rewind(SPL);
137 fread(buf,sz,1,SPL);
138 fwrite(buf,sz,1,fno);
139
140 for(size_t i = ftell(fno); i < offset;i++)
141 fputc(0xff,fno);
142
143 fseek(uboot, 0, SEEK_END);
144 sz = ftell(uboot);
145 buf = realloc(buf, sz);
146 rewind(uboot);
147 fread(buf,sz,1,uboot);
148 fwrite(buf,sz,1,fno);
149 free(buf);
150
151 fclose(SPL);
152 fclose(uboot);
153}
154
155void help(int code){
a94e8ba6
JT
156 puts("+--------------------------------------------------------------+");
157 puts("| -h - This message. |");
158 puts("| -o - Output file name. |");
159 puts("| -n - Name of flash config to use, defined in flash_confs.c . |");
160 puts("| -p - Padding offset, other than default (0x1000). |");
161 puts("| -b - Create binary image, and offset to put u-boot.img at. |");
162 puts("| -l - List names of flash defined in flash_confs.c . |");
163 puts("+--------------------------------------------------------------+");
fabb3b08
JT
164 exit(code);
165}
This page took 0.043198 seconds and 4 git commands to generate.