forked from espruino/Espruino
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuild_js_hardware.js
More file actions
141 lines (123 loc) · 4.02 KB
/
build_js_hardware.js
File metadata and controls
141 lines (123 loc) · 4.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#!/bin/node
/* This builds a js file containing the addresses of a chip's peripherals and
the values of the bits in each register. Can be used for quickly building
ways to access the underlying hardware from JS */
var INPUTFILE = "targetlibs/stm32f1/lib/stm32f10x.h";
var definitions = {"STM32F10X_XL":true};
//var INPUTFILE = "targetlibs/stm32f4/lib/stm32f4xx.h";
//var definitions = {"STM32F401xx":true};
var fs = require('fs');
var structContents = undefined;
var structSize = 0;
var typeSizes = {
"uint32_t" : 4,
"uint16_t" : 2,
"uint8_t" : 1,
"CAN_FIFOMailBox_TypeDef" : NaN,
"CAN_TxMailBox_TypeDef" : NaN,
"CAN_FilterRegister_TypeDef" : NaN,
};
var ifDefs = [];
var structs = {};
fs.readFileSync(INPUTFILE).toString().replace(/(\/\*[^\n*]*)\r\n(.*\*\/)/g,"$1$2").split("\n").forEach(function(oline) {
//console.log(JSON.stringify(oline));
var line = oline.trim();
if (line=="") return;
if (line.indexOf("#ifndef ")==0) {
ifDefs.push(!(line.substr(8).trim() in definitions));
return;
} else if (line.indexOf("#ifdef ")==0) {
ifDefs.push((line.substr(7).trim() in definitions));
return;
} else if (line.indexOf("#if ")==0) {
console.warn("Uh-oh, we have a #if - assuming it is true:"+line);
ifDefs.push(true);
return;
} else if (line.indexOf("#else")==0) {
ifDefs[ifDefs.length-1] = !ifDefs[ifDefs.length-1];
return;
} else if (line.indexOf("#endif")==0) {
ifDefs.pop();
return;
}
for (var i in ifDefs)
if (!ifDefs[i]) return;
if (line.indexOf("#error ")==0) {
console.warn(line);
}
if (line.indexOf("#define")==0) {
line = line.substr(7).trim();
var i = line.indexOf(" ");
var dkey = line.substr(0,i);
var dval = line.substr(i).trim();
if (dval.indexOf("/*")>=0) dval = dval.substr(0,dval.indexOf("/*")).trim();
definitions[dkey] = dval.replace(/\(uint32_t[ ]*\)/,"");
} else if (line=="typedef struct") {
structContents = {};
structSize = 0;
} else if (line[0]=="{") {
} else if (line[0]=="}") {
if (line.indexOf("_TypeDef;")>=0) {
var name = line.substring(line.lastIndexOf(" ")+1,line.indexOf("_TypeDef;"));
structs[name] = structContents;
}
structContents = undefined;
} else if (structContents) {
if (line.substr(0,2)!="/*") {
if (line.substr(0,2)=="__") line=line.substr(line.indexOf(" ")+1);
var type = line.substr(0,line.indexOf(" "));
line = line.substr(line.indexOf(" ")+1).trim();
var name = line.substr(0,line.indexOf(";"));
line = line.substr(line.indexOf(";")+1).trim();
if (!(type in typeSizes)) throw new Error("Unknown type "+type+" in "+JSON.stringify(oline));
var size = typeSizes[type];
if (name.indexOf("[")>=0) {
var c = name.substring(name.indexOf("[")+1, name.indexOf("]"));
size *= c;
}
structContents[name] = { offset : structSize, size : size };
structSize += size;
}
}
});
//console.log(structs)
// find base addresses
var bases = {};
for (var def in definitions) {
if (def.substr(-5)=="_BASE") {
var v = definitions[def].
replace(/(\()([A-Z])/,"$1 $2").
replace(/([A-Z])(\))/,"$1 $2").
split(" ");
v = v.map(function(tk) {
if (tk in bases) return bases[tk];
return tk;
});
bases[def] = eval(v.join(""));
}
}
var peripherals = ["RCC","DMA"];
function out(s) {
console.log(s);
}
peripherals.forEach(function(periph) {
var base = bases[periph+"_BASE"];
var data = { a : {}, f : {} };
for (var key in structs[periph]) {
if (key.substr(0,8)=="RESERVED") continue;
// address
data.a[key] = base+structs[periph][key].offset;
// flags
var pref = periph+"_"+key+"_";
for (var d in definitions) {
if (d.substr(0,pref.length)==pref) {
if (!data.f[key]) data.f[key] = {};
try {
data.f[key][d.substr(pref.length)] = eval(definitions[d]);
} catch (e) {}
}
}
}
// output
out("var "+periph+" = "+JSON.stringify(data,null,2)+";");
});