Single Binary Support: Initial Commit
[keystone-rtos/ibl.git] / src / util / single-bin / iblcfg / iblConfig.c
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <stdint.h>
5 #include <arpa/inet.h>
6 #include "device.h"
8 #define TRUE 1
9 #define FALSE 0
10 #define MAX_LINE_LENGTH 40
11 char *input_file = "input.txt";
13 /* Parameters defined in the input_file */
14 #define FILE_NAME      "file_name"
15 #define DEVICE_ID      "device"
16 #define OFFSET_ADDR    "offset"
18 char        file_name[MAX_LINE_LENGTH];
19 uint32_t    device_id;
20 uint32_t    offset;
22 #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
23 typedef ibl_t (*ibl_config_fn)(void);
25 int main (void)
26 {
27     ibl_t ibl_params;
28     FILE    *fp;
29     int    ret;
30     ibl_config_fn cfg[] = {
31             [1] = &c6455_ibl_config,
32             [2] = &c6474_ibl_config,
33             [3] = &c6474l_ibl_config,
34             [4] = &c6457_ibl_config,
35             [5] = &c6472_ibl_config,
36             [6] = &c6678_ibl_config,
37             [7] = &c6670_ibl_config,
38     };
39     int ncfgs = ARRAY_SIZE(cfg);
41     fp = fopen(input_file, "r");
42     if (fp == NULL)
43     {
44         printf("Error in opening %s input file\n", input_file);
45         return;
46     }
48     ret = parse_input_file(fp);
49     fclose (fp);
51     if (ret == FALSE)
52     {
53         printf("Error in parsing %s input file\n", input_file);
54         return;
55     }
58     fp = fopen (file_name, "r+");
59     if (fp == NULL)
60     {
61         printf ("Failed to open file %s\n", file_name);
62         return;
63     }
65     printf ("Opened file %s\n", file_name);
67     if (fseek(fp, offset, SEEK_SET)) {
68         fclose(fp);
69         return -1;
70     }
72     if (device_id > 0 && device_id < ncfgs)
73             ibl_params = (*cfg[device_id])();
74     
75     if (fwrite((void*)&ibl_params, sizeof(ibl_t), 1, fp) != 1) {
76         fclose(fp);
77         return -1;
78     }
80     fclose(fp);
81 }
83 int32_t 
84 xtoi
85 (
86     char            *xs, 
87     uint32_t        *result
88 )
89 {
90     uint32_t    szlen = strlen(xs);
91     int32_t     i, xv, fact;
92     
93     if (szlen > 0)
94     {
95         /* Converting more than 32bit hexadecimal value? */
96         if (szlen>8) return 2; /* exit */
97         
98         /* Begin conversion here */
99         *result = 0;
100         fact = 1;
101         
102         /* Run until no more character to convert */
103         for(i=szlen-1; i>=0 ;i--)
104         {
105             if (isxdigit(*(xs+i)))
106             {
107                 if (*(xs+i)>=97)
108                 {
109                     xv = ( *(xs+i) - 97) + 10;
110                 }
111                 else if ( *(xs+i) >= 65)
112                 {
113                     xv = (*(xs+i) - 65) + 10;
114                 }
115                 else
116                 {
117                     xv = *(xs+i) - 48;
118                 }
119                 *result += (xv * fact);
120                 fact *= 16;
121             }
122             else
123             {
124                 // Conversion was abnormally terminated
125                 // by non hexadecimal digit, hence
126                 // returning only the converted with
127                 // an error value 4 (illegal hex character)
128                 return 4;
129             }
130         }
131         return 0;
132     }
133     
134     // Nothing to convert
135     return 1;
138 int parse_input_file(FILE *fp)
140     char line[MAX_LINE_LENGTH];
141     char tokens[] = " :=;\n\r";
142     char *key, *data;
144     memset(line, 0, MAX_LINE_LENGTH);
146     fgets(line, MAX_LINE_LENGTH, fp);
147     key  = (char *)strtok(line, tokens);
148     data = (char *)strtok(NULL, tokens);
150     if(strlen(data) == 0)
151     {
152        return FALSE;
153     }
155     if(strcmp(key, FILE_NAME) != 0)
156     {
157         return FALSE;
158     }
160     strcpy (file_name, data);
162     fgets(line, MAX_LINE_LENGTH, fp);
163     key  = (char *)strtok(line, tokens);
164     data = (char *)strtok(NULL, tokens);
166     if(strlen(data) == 0)
167     {
168        return FALSE;
169     }
171     if(strcmp(key, DEVICE_ID) != 0)
172     {
173         return FALSE;
174     }
176     device_id = (uint32_t)atoi(data);
177     
178     fgets(line, MAX_LINE_LENGTH, fp);
179     key  = (char *)strtok(line, tokens);
180     data = (char *)strtok(NULL, tokens);
182     if(strlen(data) == 0)
183     {
184        return FALSE;
185     }
187     if(strcmp(key, OFFSET_ADDR) != 0)
188     {
189         return FALSE;
190     }
192     if ((data[0] == '0') && (data[1] == 'x' || data[1] == 'X'))
193     {
194         if (xtoi (&data[2], &offset) != 0)
195         {
196             return FALSE;
197         }
198     }
199     else
200     {
201         offset = (uint32_t)atoi(data);
202     }
204     return TRUE;