summaryrefslogtreecommitdiff
path: root/utils/imxtools/regtools/hwemulgen.cpp
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2013-06-12 19:49:26 +0200
committerAmaury Pouly <amaury.pouly@gmail.com>2013-06-12 19:49:26 +0200
commit7143ea681c377fe5901bd79801366a26ae0d394a (patch)
tree34fdaaa83590130b57b187878a89394505950b82 /utils/imxtools/regtools/hwemulgen.cpp
parent11da9d23fe323ce452fcd04a10a0ddf78eaa63ea (diff)
downloadrockbox-7143ea681c377fe5901bd79801366a26ae0d394a.tar.gz
rockbox-7143ea681c377fe5901bd79801366a26ae0d394a.zip
imxtools: move regtools to its own directory
The register tools are in no way stmp specific. The XML description of the registers is powerful enough to describe the STMP register which should be more than enough to describe virtually all other SoCs. The generators follow the STMP coding convention but others could be used as well. Change-Id: If1a9f56e4a3594161688de34adbea698e5aaecd8
Diffstat (limited to 'utils/imxtools/regtools/hwemulgen.cpp')
-rw-r--r--utils/imxtools/regtools/hwemulgen.cpp387
1 files changed, 0 insertions, 387 deletions
diff --git a/utils/imxtools/regtools/hwemulgen.cpp b/utils/imxtools/regtools/hwemulgen.cpp
deleted file mode 100644
index ae8b9dbec5..0000000000
--- a/utils/imxtools/regtools/hwemulgen.cpp
+++ /dev/null
@@ -1,387 +0,0 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2002 by Amaury Pouly
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21#include "desc_parser.hpp"
22#include <stdio.h>
23#include <stdlib.h>
24#include <algorithm>
25#include <map>
26
27#define error(...) do{ fprintf(stderr, __VA_ARGS__); exit(1); } while(0)
28
29int g_soc_count;
30int g_reg_count;
31int g_field_count;
32
33namespace {
34
35std::string tolower(const std::string s)
36{
37 std::string res = s;
38 std::transform(res.begin(), res.end(), res.begin(), ::tolower);
39 return res;
40}
41
42std::string toupper(const std::string& s)
43{
44 std::string res = s;
45 std::transform(res.begin(), res.end(), res.begin(), ::toupper);
46 return res;
47}
48
49bool lex_comp(const std::string& a, const std::string& b)
50{
51 return std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end());
52}
53
54}
55
56void fprint_copyright(FILE *f)
57{
58 fprintf(f,"\
59/***************************************************************************\n\
60 * __________ __ ___.\n\
61 * Open \\______ \\ ____ ____ | | _\\_ |__ _______ ___\n\
62 * Source | _// _ \\_/ ___\\| |/ /| __ \\ / _ \\ \\/ /\n\
63 * Jukebox | | ( <_> ) \\___| < | \\_\\ ( <_> > < <\n\
64 * Firmware |____|_ /\\____/ \\___ >__|_ \\|___ /\\____/__/\\_ \\\n\
65 * \\/ \\/ \\/ \\/ \\/\n\
66 * This file was automatically generated by hwemulgen, DO NOT EDIT it.\n\
67 *\n\
68 * Copyright (C) 2012 by Amaury Pouly\n\
69 *\n\
70 * This program is free software; you can redistribute it and/or\n\
71 * modify it under the terms of the GNU General Public License\n\
72 * as published by the Free Software Foundation; either version 2\n\
73 * of the License, or (at your option) any later version.\n\
74 *\n\
75 * This software is distributed on an \"AS IS\" basis, WITHOUT WARRANTY OF ANY\n\
76 * KIND, either express or implied.\n\
77 *\n\
78 ****************************************************************************/\n");
79}
80
81void gen_header(const std::string& filename)
82{
83 FILE *f = fopen(filename.c_str(), "w");
84 if(f == NULL)
85 error("Cannot open file %s\n", filename.c_str());
86 fprint_copyright(f);
87 fprintf(f, "#ifndef __HWEMUL_SOC_HEADER__\n");
88 fprintf(f, "#define __HWEMUL_SOC_HEADER__\n");
89 fprintf(f, "\n");
90 fprintf(f, "#include \"stddef.h\"\n");
91 fprintf(f, "#include \"stdint.h\"\n");
92
93 fprintf(f, "\n\
94#define HWEMUL_SOC_REG_HAS_SCT (1 << 0)\n\
95\n\
96struct hwemul_soc_reg_field_t\n\
97{\n\
98 const char *name;\n\
99 unsigned short first_bit, last_bit;\n\
100};\n\
101\n\
102struct hwemul_soc_reg_t\n\
103{\n\
104 const char *name;\n\
105 uint32_t addr;\n\
106 uint32_t flags;\n\
107 size_t nr_fields;\n\
108 struct hwemul_soc_reg_field_t *fields_by_name[]; /* ordered by lexicographic order */\n\
109};\n\
110\n\
111struct hwemul_soc_t\n\
112{\n\
113 const char *name;\n\
114 size_t nr_regs;\n\
115 struct hwemul_soc_reg_t *regs_by_name[]; /* ordered by lexicographic order */\n\
116};\n\
117\n\
118struct hwemul_soc_list_t\n\
119{\n\
120 size_t nr_socs;\n\
121 struct hwemul_soc_t *socs[];\n\
122};\n\
123\n\
124struct hwemul_soc_list_t *hwemul_get_soc_list(void);\n\
125\n");
126
127 fprintf(f, "#endif\n");
128 fclose(f);
129}
130
131std::string extract_last_part(std::string s)
132{
133 size_t pos = s.find_last_of("/\\");
134 if(pos != std::string::npos)
135 s = s.substr(pos + 1);
136 pos = s.find_last_of(".");
137 if(pos != std::string::npos)
138 s = s.substr(0, pos);
139 return s;
140}
141
142std::vector< std::string > gen_fields(FILE *f, std::string prefix,
143 const std::vector< soc_reg_field_t >& fields)
144{
145 std::vector< std::string > list;
146
147 for(size_t i = 0; i < fields.size(); i++)
148 {
149 g_field_count++;
150 std::string var_name = prefix + tolower(fields[i].name);
151 list.push_back(var_name);
152
153 fprintf(f, "\
154static struct hwemul_soc_reg_field_t %s =\n\
155{\n\
156 \"%s\",\n\
157 %d, %d\n\
158};\n\
159\n", var_name.c_str(), fields[i].name.c_str(), fields[i].first_bit, fields[i].last_bit);
160 }
161
162 return list;
163}
164
165std::vector< std::string > gen_common_regs(FILE *f, std::string prefix, std::string devname,
166 soc_addr_t devaddr, const std::vector< soc_reg_t >& regs,
167 const std::vector< soc_multireg_t >& multiregs)
168{
169 std::vector< std::string > list;
170
171 for(size_t i = 0; i < regs.size(); i++)
172 {
173 g_reg_count++;
174 std::string var_name = prefix + tolower(regs[i].name);
175
176 list.push_back(var_name);
177
178 std::vector< std::string > field_vars = gen_fields(f, var_name + "_",
179 regs[i].fields);
180
181 std::sort(field_vars.begin(), field_vars.end(), lex_comp);
182
183 fprintf(f, "\
184static struct hwemul_soc_reg_t %s =\n\
185{\n\
186 \"HW_%s_%s\",\n\
187 %#x,\n\
188 0", var_name.c_str(), devname.c_str(), regs[i].name.c_str(), devaddr + regs[i].addr);
189 if(regs[i].flags & REG_HAS_SCT)
190 fprintf(f, " | HWEMUL_SOC_REG_HAS_SCT");
191 fprintf(f, ",\n");
192 fprintf(f, "\
193 %u,\n\
194 {", (unsigned)field_vars.size());
195 if(field_vars.size() != 0)
196 fprintf(f, "\n");
197 for(size_t j = 0; j < field_vars.size(); j++)
198 fprintf(f, " &%s,\n", field_vars[j].c_str());
199 if(field_vars.size() != 0)
200 fprintf(f, " ");
201 fprintf(f,"\
202}\n};\n\
203\n");
204 }
205
206 for(size_t i = 0; i < multiregs.size(); i++)
207 {
208 g_reg_count++;
209 std::vector< std::string > field_vars = gen_fields(f,
210 prefix + tolower(multiregs[i].name) + "_", multiregs[i].fields);
211 std::sort(field_vars.begin(), field_vars.end(), lex_comp);
212
213 for(size_t j = 0; j < multiregs[i].regs.size(); j++)
214 {
215 g_reg_count++;
216 std::string var_name = prefix + tolower(multiregs[i].regs[j].name);
217
218 list.push_back(var_name);
219
220 fprintf(f, "\
221static struct hwemul_soc_reg_t %s =\n\
222{\n\
223 \"HW_%s_%s\",\n\
224 %#x,\n\
225 0", var_name.c_str(), devname.c_str(), multiregs[i].regs[j].name.c_str(), devaddr + multiregs[i].regs[j].addr);
226 if(multiregs[i].flags & REG_HAS_SCT)
227 fprintf(f, " | HWEMUL_SOC_REG_HAS_SCT");
228 fprintf(f, ",\n");
229 fprintf(f,"\
230 %u,\n\
231 {", (unsigned)field_vars.size());
232 if(field_vars.size() != 0)
233 fprintf(f, "\n");
234 for(size_t k = 0; k < field_vars.size(); k++)
235 fprintf(f, " &%s,\n", field_vars[k].c_str());
236 if(field_vars.size() != 0)
237 fprintf(f, " ");
238 fprintf(f,"\
239}\n};\n\
240\n");
241 }
242 }
243
244 return list;
245}
246
247std::vector< std::string > gen_dev_regs(FILE *f, std::string prefix, const soc_dev_t& dev)
248{
249 return gen_common_regs(f, prefix + tolower(dev.name) + "_", dev.name, dev.addr,
250 dev.regs, dev.multiregs);
251}
252
253std::vector< std::string > gen_multidev_regs(FILE *f, std::string prefix, const soc_multidev_t& mdev)
254{
255 std::vector< std::string > list;
256
257 for(size_t i = 0; i < mdev.devs.size(); i++)
258 {
259 std::vector< std::string > sub_list = gen_common_regs(f,
260 prefix + tolower(mdev.devs[i].name) + "_", mdev.devs[i].name,
261 mdev.devs[i].addr, mdev.regs, mdev.multiregs);
262 list.insert(list.end(), sub_list.begin(), sub_list.end());
263 }
264
265 return list;
266}
267
268std::vector< std::string > gen_regs(FILE *f, std::string prefix, const soc_t& soc)
269{
270 std::vector< std::string > list;
271
272 for(size_t i = 0; i < soc.devs.size(); i++)
273 {
274 std::vector< std::string > sub_list = gen_dev_regs(f,
275 prefix, soc.devs[i]);
276 list.insert(list.end(), sub_list.begin(), sub_list.end());
277 }
278
279 for(size_t i = 0; i < soc.multidevs.size(); i++)
280 {
281 std::vector< std::string > sub_list = gen_multidev_regs(f,
282 prefix, soc.multidevs[i]);
283 list.insert(list.end(), sub_list.begin(), sub_list.end());
284 }
285
286 return list;
287}
288
289std::vector< std::string > gen_socs(FILE *f, std::string prefix, const std::vector< soc_t >& socs)
290{
291 std::vector< std::string > list;
292 for(size_t i = 0; i < socs.size(); i++)
293 {
294 g_soc_count++;
295 std::string var_name = prefix + socs[i].name;
296 list.push_back(var_name);
297
298 std::vector< std::string > reg_vars = gen_regs(f, var_name + "_", socs[i]);
299
300 std::sort(reg_vars.begin(), reg_vars.end(), lex_comp);
301
302 fprintf(f, "\
303static struct hwemul_soc_t %s =\n\
304{\n\
305 \"%s\",\n\
306 %u,\n\
307 {\n", var_name.c_str(), socs[i].name.c_str(), (unsigned)reg_vars.size());
308
309 for(size_t j = 0; j < reg_vars.size(); j++)
310 fprintf(f, " &%s,\n", reg_vars[j].c_str());
311 fprintf(f, "\
312 }\n\
313};\n\
314\n");
315 }
316
317 return list;
318}
319
320void gen_impl(const std::string& filename, const std::vector< soc_t >& socs)
321{
322 FILE *f = fopen(filename.c_str(), "w");
323 if(f == NULL)
324 error("Cannot open file %s\n", filename.c_str());
325 fprint_copyright(f);
326 std::string last_part = extract_last_part(filename);
327 fprintf(f, "#include \"%s.h\"\n\n", last_part.c_str());
328
329 std::vector< std::string > socs_var = gen_socs(f, "soc_", socs);
330
331 fprintf(f, "\
332static struct hwemul_soc_list_t hwemul_soc_list =\n\
333{\n\
334 %u,\n\
335 {", (unsigned) socs_var.size());
336
337 for(size_t i = 0; i < socs_var.size(); i++)
338 {
339 fprintf(f, "&%s", socs_var[i].c_str());
340 if(i + 1 != socs_var.size())
341 fprintf(f, ", ");
342 }
343 fprintf(f, "\
344}\n\
345};\n\
346\n");
347
348 fprintf(f,"\
349struct hwemul_soc_list_t *hwemul_get_soc_list(void)\n\
350{\n\
351 return &hwemul_soc_list;\n\
352}\n\
353\n");
354
355 fclose(f);
356}
357
358void gen_files(const std::string& output, const std::vector< soc_t >& socs)
359{
360 gen_header(output + ".h");
361 gen_impl(output + ".c", socs);
362}
363
364void usage()
365{
366 printf("usage: headergen <desc file list> <output file prefix>\n");
367 exit(1);
368}
369
370int main(int argc, char **argv)
371{
372 if(argc < 3)
373 usage();
374 std::vector< soc_t > socs;
375 for(int i = 1; i < argc - 1; i++)
376 {
377 bool ret = parse_soc_desc(argv[i], socs);
378 if(!ret)
379 {
380 printf("Cannot parse '%s'\n", argv[i]);
381 return 1;
382 }
383 }
384 gen_files(argv[argc - 1], socs);
385 printf("%d socs, %d registers and %d fields dumped!\n", g_soc_count, g_reg_count, g_field_count);
386 return 0;
387} \ No newline at end of file