서해원

Add src/

Showing 77 changed files with 27499 additions and 0 deletions
1 +/src/Numaker-PFM-M2351/PulseMonitoring/Secure/Objects
2 +/src/Numaker-PFM-M2351/PulseMonitoring/Secure/Listings
3 +
4 +/src/Numaker-PFM-M2351/PulseMonitoring/NonSecure/Objects
5 +/src/Numaker-PFM-M2351/PulseMonitoring/NonSecure/Listings
1 +# ARM-TrustZone-based-Pulse-Monitoring
2 +2021-1 Capston Project
3 +
4 +# Instruction
5 +
6 +## src/Numaker-PFM-M2351
7 ++ Need a Keil uVision5
8 ++ Place a `src/Numaker-PFM-M2351` directory in a `M2351Series_BSP_CMSIS_V3.00.004` directory so that you can use the library.
9 +
10 +## src/Server
11 ++ Need a docker engine
12 +
13 ++ In src/Server/
14 + + docker build
15 + ```
16 + docker build -t server
17 + ```
18 +
19 + + docker run
20 + ```
21 + docker run --name=server -it -p80:80 -p443:443 -p2351:2351 server
22 + ```
23 +
24 +
25 +# Contact
26 ++ `shw2662@khu.ac.kr`
......
1 +<?xml version="1.0" encoding="utf-8"?>
2 +
3 +<component_viewer schemaVersion="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="Component_Viewer.xsd">
4 +
5 +<component name="EventRecorderStub" version="1.0.0"/> <!--name and version of the component-->
6 + <events>
7 + </events>
8 +
9 +</component_viewer>
This diff could not be displayed because it is too large.
This diff could not be displayed because it is too large.
1 +<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
2 +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_optx.xsd">
3 +
4 + <SchemaVersion>1.0</SchemaVersion>
5 +
6 + <Header>### uVision Project, (C) Keil Software</Header>
7 +
8 + <Extensions>
9 + <cExt>*.c</cExt>
10 + <aExt>*.s*; *.src; *.a*</aExt>
11 + <oExt>*.obj; *.o</oExt>
12 + <lExt>*.lib</lExt>
13 + <tExt>*.txt; *.h; *.inc; *.md</tExt>
14 + <pExt>*.plm</pExt>
15 + <CppX>*.cpp</CppX>
16 + <nMigrate>0</nMigrate>
17 + </Extensions>
18 +
19 + <DaveTm>
20 + <dwLowDateTime>0</dwLowDateTime>
21 + <dwHighDateTime>0</dwHighDateTime>
22 + </DaveTm>
23 +
24 + <Target>
25 + <TargetName>NonSecure</TargetName>
26 + <ToolsetNumber>0x4</ToolsetNumber>
27 + <ToolsetName>ARM-ADS</ToolsetName>
28 + <TargetOption>
29 + <CLKADS>12000000</CLKADS>
30 + <OPTTT>
31 + <gFlags>1</gFlags>
32 + <BeepAtEnd>1</BeepAtEnd>
33 + <RunSim>0</RunSim>
34 + <RunTarget>1</RunTarget>
35 + <RunAbUc>0</RunAbUc>
36 + </OPTTT>
37 + <OPTHX>
38 + <HexSelection>1</HexSelection>
39 + <FlashByte>65535</FlashByte>
40 + <HexRangeLowAddress>0</HexRangeLowAddress>
41 + <HexRangeHighAddress>0</HexRangeHighAddress>
42 + <HexOffset>0</HexOffset>
43 + </OPTHX>
44 + <OPTLEX>
45 + <PageWidth>79</PageWidth>
46 + <PageLength>66</PageLength>
47 + <TabStop>8</TabStop>
48 + <ListingPath>.\Listings\</ListingPath>
49 + </OPTLEX>
50 + <ListingPage>
51 + <CreateCListing>1</CreateCListing>
52 + <CreateAListing>1</CreateAListing>
53 + <CreateLListing>1</CreateLListing>
54 + <CreateIListing>0</CreateIListing>
55 + <AsmCond>1</AsmCond>
56 + <AsmSymb>1</AsmSymb>
57 + <AsmXref>0</AsmXref>
58 + <CCond>1</CCond>
59 + <CCode>0</CCode>
60 + <CListInc>0</CListInc>
61 + <CSymb>0</CSymb>
62 + <LinkerCodeListing>0</LinkerCodeListing>
63 + </ListingPage>
64 + <OPTXL>
65 + <LMap>1</LMap>
66 + <LComments>1</LComments>
67 + <LGenerateSymbols>1</LGenerateSymbols>
68 + <LLibSym>1</LLibSym>
69 + <LLines>1</LLines>
70 + <LLocSym>1</LLocSym>
71 + <LPubSym>1</LPubSym>
72 + <LXref>0</LXref>
73 + <LExpSel>0</LExpSel>
74 + </OPTXL>
75 + <OPTFL>
76 + <tvExp>1</tvExp>
77 + <tvExpOptDlg>0</tvExpOptDlg>
78 + <IsCurrentTarget>1</IsCurrentTarget>
79 + </OPTFL>
80 + <CpuCode>6</CpuCode>
81 + <DebugOpt>
82 + <uSim>0</uSim>
83 + <uTrg>1</uTrg>
84 + <sLdApp>1</sLdApp>
85 + <sGomain>1</sGomain>
86 + <sRbreak>1</sRbreak>
87 + <sRwatch>1</sRwatch>
88 + <sRmem>1</sRmem>
89 + <sRfunc>1</sRfunc>
90 + <sRbox>1</sRbox>
91 + <tLdApp>1</tLdApp>
92 + <tGomain>1</tGomain>
93 + <tRbreak>1</tRbreak>
94 + <tRwatch>1</tRwatch>
95 + <tRmem>1</tRmem>
96 + <tRfunc>0</tRfunc>
97 + <tRbox>1</tRbox>
98 + <tRtrace>1</tRtrace>
99 + <sRSysVw>1</sRSysVw>
100 + <tRSysVw>1</tRSysVw>
101 + <sRunDeb>0</sRunDeb>
102 + <sLrtime>0</sLrtime>
103 + <bEvRecOn>1</bEvRecOn>
104 + <bSchkAxf>0</bSchkAxf>
105 + <bTchkAxf>0</bTchkAxf>
106 + <nTsel>7</nTsel>
107 + <sDll></sDll>
108 + <sDllPa></sDllPa>
109 + <sDlgDll></sDlgDll>
110 + <sDlgPa></sDlgPa>
111 + <sIfile></sIfile>
112 + <tDll></tDll>
113 + <tDllPa></tDllPa>
114 + <tDlgDll></tDlgDll>
115 + <tDlgPa></tDlgPa>
116 + <tIfile></tIfile>
117 + <pMon>NULink\Nu_Link.dll</pMon>
118 + </DebugOpt>
119 + <TargetDriverDllRegistry>
120 + <SetRegEntry>
121 + <Number>0</Number>
122 + <Key>DLGTARM</Key>
123 + <Name>(6010=-1,-1,-1,-1,0)(6018=-1,-1,-1,-1,0)(6019=-1,-1,-1,-1,0)(6008=-1,-1,-1,-1,0)(6009=-1,-1,-1,-1,0)(6014=-1,-1,-1,-1,0)(6015=-1,-1,-1,-1,0)(6003=-1,-1,-1,-1,0)(6000=-1,-1,-1,-1,0)</Name>
124 + </SetRegEntry>
125 + <SetRegEntry>
126 + <Number>0</Number>
127 + <Key>ARMDBGFLAGS</Key>
128 + <Name></Name>
129 + </SetRegEntry>
130 + <SetRegEntry>
131 + <Number>0</Number>
132 + <Key>Nu_Link</Key>
133 + <Name></Name>
134 + </SetRegEntry>
135 + <SetRegEntry>
136 + <Number>0</Number>
137 + <Key>UL2V8M</Key>
138 + <Name>UL2V8M(-S0 -C0 -P0 -FD20000000 -FC1200 -FN1 -FF0M2351_AP_512 -FS00 -FL080000 -FP0($$Device:M2351KIAAE$Flash\M2351_AP_512.FLM))</Name>
139 + </SetRegEntry>
140 + </TargetDriverDllRegistry>
141 + <Breakpoint/>
142 + <WatchWindow1>
143 + <Ww>
144 + <count>0</count>
145 + <WinNumber>1</WinNumber>
146 + <ItemText>get</ItemText>
147 + </Ww>
148 + <Ww>
149 + <count>1</count>
150 + <WinNumber>1</WinNumber>
151 + <ItemText>strPulse</ItemText>
152 + </Ww>
153 + <Ww>
154 + <count>2</count>
155 + <WinNumber>1</WinNumber>
156 + <ItemText>pulse</ItemText>
157 + </Ww>
158 + <Ww>
159 + <count>3</count>
160 + <WinNumber>1</WinNumber>
161 + <ItemText>lengthChar</ItemText>
162 + </Ww>
163 + <Ww>
164 + <count>4</count>
165 + <WinNumber>1</WinNumber>
166 + <ItemText>command</ItemText>
167 + </Ww>
168 + <Ww>
169 + <count>5</count>
170 + <WinNumber>1</WinNumber>
171 + <ItemText>netData</ItemText>
172 + </Ww>
173 + <Ww>
174 + <count>6</count>
175 + <WinNumber>1</WinNumber>
176 + <ItemText>lengthStr</ItemText>
177 + </Ww>
178 + </WatchWindow1>
179 + <MemoryWindow1>
180 + <Mm>
181 + <WinNumber>1</WinNumber>
182 + <SubType>0</SubType>
183 + <ItemText>netData</ItemText>
184 + <AccSizeX>0</AccSizeX>
185 + </Mm>
186 + </MemoryWindow1>
187 + <Tracepoint>
188 + <THDelay>0</THDelay>
189 + </Tracepoint>
190 + <DebugFlag>
191 + <trace>0</trace>
192 + <periodic>1</periodic>
193 + <aLwin>1</aLwin>
194 + <aCover>0</aCover>
195 + <aSer1>0</aSer1>
196 + <aSer2>0</aSer2>
197 + <aPa>0</aPa>
198 + <viewmode>1</viewmode>
199 + <vrSel>0</vrSel>
200 + <aSym>0</aSym>
201 + <aTbox>0</aTbox>
202 + <AscS1>0</AscS1>
203 + <AscS2>0</AscS2>
204 + <AscS3>0</AscS3>
205 + <aSer3>0</aSer3>
206 + <eProf>0</eProf>
207 + <aLa>0</aLa>
208 + <aPa1>0</aPa1>
209 + <AscS4>0</AscS4>
210 + <aSer4>0</aSer4>
211 + <StkLoc>0</StkLoc>
212 + <TrcWin>0</TrcWin>
213 + <newCpu>0</newCpu>
214 + <uProt>0</uProt>
215 + </DebugFlag>
216 + <LintExecutable></LintExecutable>
217 + <LintConfigFile></LintConfigFile>
218 + <bLintAuto>0</bLintAuto>
219 + <bAutoGenD>0</bAutoGenD>
220 + <LntExFlags>0</LntExFlags>
221 + <pMisraName></pMisraName>
222 + <pszMrule></pszMrule>
223 + <pSingCmds></pSingCmds>
224 + <pMultCmds></pMultCmds>
225 + <pMisraNamep></pMisraNamep>
226 + <pszMrulep></pszMrulep>
227 + <pSingCmdsp></pSingCmdsp>
228 + <pMultCmdsp></pMultCmdsp>
229 + </TargetOption>
230 + </Target>
231 +
232 + <Group>
233 + <GroupName>CMSIS</GroupName>
234 + <tvExp>1</tvExp>
235 + <tvExpOptDlg>0</tvExpOptDlg>
236 + <cbSel>0</cbSel>
237 + <RteFlg>0</RteFlg>
238 + <File>
239 + <GroupNumber>1</GroupNumber>
240 + <FileNumber>1</FileNumber>
241 + <FileType>1</FileType>
242 + <tvExp>0</tvExp>
243 + <tvExpOptDlg>0</tvExpOptDlg>
244 + <bDave2>0</bDave2>
245 + <PathWithFileName>..\..\..\Library\Device\Nuvoton\M2351\Source\system_M2351.c</PathWithFileName>
246 + <FilenameWithoutPath>system_M2351.c</FilenameWithoutPath>
247 + <RteFlg>0</RteFlg>
248 + <bShared>0</bShared>
249 + </File>
250 + <File>
251 + <GroupNumber>1</GroupNumber>
252 + <FileNumber>2</FileNumber>
253 + <FileType>2</FileType>
254 + <tvExp>0</tvExp>
255 + <tvExpOptDlg>0</tvExpOptDlg>
256 + <bDave2>0</bDave2>
257 + <PathWithFileName>..\..\..\Library\Device\Nuvoton\M2351\Source\ARM\startup_M2351.s</PathWithFileName>
258 + <FilenameWithoutPath>startup_M2351.s</FilenameWithoutPath>
259 + <RteFlg>0</RteFlg>
260 + <bShared>0</bShared>
261 + </File>
262 + </Group>
263 +
264 + <Group>
265 + <GroupName>Library</GroupName>
266 + <tvExp>1</tvExp>
267 + <tvExpOptDlg>0</tvExpOptDlg>
268 + <cbSel>0</cbSel>
269 + <RteFlg>0</RteFlg>
270 + <File>
271 + <GroupNumber>2</GroupNumber>
272 + <FileNumber>3</FileNumber>
273 + <FileType>1</FileType>
274 + <tvExp>0</tvExp>
275 + <tvExpOptDlg>0</tvExpOptDlg>
276 + <bDave2>0</bDave2>
277 + <PathWithFileName>..\..\..\Library\StdDriver\src\gpio.c</PathWithFileName>
278 + <FilenameWithoutPath>gpio.c</FilenameWithoutPath>
279 + <RteFlg>0</RteFlg>
280 + <bShared>0</bShared>
281 + </File>
282 + <File>
283 + <GroupNumber>2</GroupNumber>
284 + <FileNumber>4</FileNumber>
285 + <FileType>1</FileType>
286 + <tvExp>0</tvExp>
287 + <tvExpOptDlg>0</tvExpOptDlg>
288 + <bDave2>0</bDave2>
289 + <PathWithFileName>..\..\..\Library\StdDriver\src\retarget.c</PathWithFileName>
290 + <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
291 + <RteFlg>0</RteFlg>
292 + <bShared>0</bShared>
293 + </File>
294 + </Group>
295 +
296 + <Group>
297 + <GroupName>Include</GroupName>
298 + <tvExp>1</tvExp>
299 + <tvExpOptDlg>0</tvExpOptDlg>
300 + <cbSel>0</cbSel>
301 + <RteFlg>0</RteFlg>
302 + <File>
303 + <GroupNumber>3</GroupNumber>
304 + <FileNumber>5</FileNumber>
305 + <FileType>5</FileType>
306 + <tvExp>0</tvExp>
307 + <tvExpOptDlg>0</tvExpOptDlg>
308 + <bDave2>0</bDave2>
309 + <PathWithFileName>.\SSD1327_Fonts\fonts.h</PathWithFileName>
310 + <FilenameWithoutPath>fonts.h</FilenameWithoutPath>
311 + <RteFlg>0</RteFlg>
312 + <bShared>0</bShared>
313 + </File>
314 + <File>
315 + <GroupNumber>3</GroupNumber>
316 + <FileNumber>6</FileNumber>
317 + <FileType>5</FileType>
318 + <tvExp>0</tvExp>
319 + <tvExpOptDlg>0</tvExpOptDlg>
320 + <bDave2>0</bDave2>
321 + <PathWithFileName>.\SSD1327\DEV_Config.h</PathWithFileName>
322 + <FilenameWithoutPath>DEV_Config.h</FilenameWithoutPath>
323 + <RteFlg>0</RteFlg>
324 + <bShared>0</bShared>
325 + </File>
326 + <File>
327 + <GroupNumber>3</GroupNumber>
328 + <FileNumber>7</FileNumber>
329 + <FileType>5</FileType>
330 + <tvExp>0</tvExp>
331 + <tvExpOptDlg>0</tvExpOptDlg>
332 + <bDave2>0</bDave2>
333 + <PathWithFileName>.\SSD1327\OLED_Driver.h</PathWithFileName>
334 + <FilenameWithoutPath>OLED_Driver.h</FilenameWithoutPath>
335 + <RteFlg>0</RteFlg>
336 + <bShared>0</bShared>
337 + </File>
338 + <File>
339 + <GroupNumber>3</GroupNumber>
340 + <FileNumber>8</FileNumber>
341 + <FileType>5</FileType>
342 + <tvExp>0</tvExp>
343 + <tvExpOptDlg>0</tvExpOptDlg>
344 + <bDave2>0</bDave2>
345 + <PathWithFileName>.\SSD1327\OLED_GUI.h</PathWithFileName>
346 + <FilenameWithoutPath>OLED_GUI.h</FilenameWithoutPath>
347 + <RteFlg>0</RteFlg>
348 + <bShared>0</bShared>
349 + </File>
350 + <File>
351 + <GroupNumber>3</GroupNumber>
352 + <FileNumber>9</FileNumber>
353 + <FileType>5</FileType>
354 + <tvExp>0</tvExp>
355 + <tvExpOptDlg>0</tvExpOptDlg>
356 + <bDave2>0</bDave2>
357 + <PathWithFileName>.\WiFi\wifi.h</PathWithFileName>
358 + <FilenameWithoutPath>wifi.h</FilenameWithoutPath>
359 + <RteFlg>0</RteFlg>
360 + <bShared>0</bShared>
361 + </File>
362 + <File>
363 + <GroupNumber>3</GroupNumber>
364 + <FileNumber>10</FileNumber>
365 + <FileType>3</FileType>
366 + <tvExp>0</tvExp>
367 + <tvExpOptDlg>0</tvExpOptDlg>
368 + <bDave2>0</bDave2>
369 + <PathWithFileName>..\Secure\lib\nsclib.o</PathWithFileName>
370 + <FilenameWithoutPath>nsclib.o</FilenameWithoutPath>
371 + <RteFlg>0</RteFlg>
372 + <bShared>0</bShared>
373 + </File>
374 + <File>
375 + <GroupNumber>3</GroupNumber>
376 + <FileNumber>11</FileNumber>
377 + <FileType>5</FileType>
378 + <tvExp>0</tvExp>
379 + <tvExpOptDlg>0</tvExpOptDlg>
380 + <bDave2>0</bDave2>
381 + <PathWithFileName>.\cssd_lib.h</PathWithFileName>
382 + <FilenameWithoutPath>cssd_lib.h</FilenameWithoutPath>
383 + <RteFlg>0</RteFlg>
384 + <bShared>0</bShared>
385 + </File>
386 + <File>
387 + <GroupNumber>3</GroupNumber>
388 + <FileNumber>12</FileNumber>
389 + <FileType>5</FileType>
390 + <tvExp>0</tvExp>
391 + <tvExpOptDlg>0</tvExpOptDlg>
392 + <bDave2>0</bDave2>
393 + <PathWithFileName>..\..\..\Library\Device\Nuvoton\M2351\Include\NuMicro.h</PathWithFileName>
394 + <FilenameWithoutPath>NuMicro.h</FilenameWithoutPath>
395 + <RteFlg>0</RteFlg>
396 + <bShared>0</bShared>
397 + </File>
398 + </Group>
399 +
400 + <Group>
401 + <GroupName>SSD1327</GroupName>
402 + <tvExp>1</tvExp>
403 + <tvExpOptDlg>0</tvExpOptDlg>
404 + <cbSel>0</cbSel>
405 + <RteFlg>0</RteFlg>
406 + <File>
407 + <GroupNumber>4</GroupNumber>
408 + <FileNumber>13</FileNumber>
409 + <FileType>1</FileType>
410 + <tvExp>0</tvExp>
411 + <tvExpOptDlg>0</tvExpOptDlg>
412 + <bDave2>0</bDave2>
413 + <PathWithFileName>.\SSD1327\DEV_Config.c</PathWithFileName>
414 + <FilenameWithoutPath>DEV_Config.c</FilenameWithoutPath>
415 + <RteFlg>0</RteFlg>
416 + <bShared>0</bShared>
417 + </File>
418 + <File>
419 + <GroupNumber>4</GroupNumber>
420 + <FileNumber>14</FileNumber>
421 + <FileType>1</FileType>
422 + <tvExp>0</tvExp>
423 + <tvExpOptDlg>0</tvExpOptDlg>
424 + <bDave2>0</bDave2>
425 + <PathWithFileName>.\SSD1327\OLED_Driver.c</PathWithFileName>
426 + <FilenameWithoutPath>OLED_Driver.c</FilenameWithoutPath>
427 + <RteFlg>0</RteFlg>
428 + <bShared>0</bShared>
429 + </File>
430 + <File>
431 + <GroupNumber>4</GroupNumber>
432 + <FileNumber>15</FileNumber>
433 + <FileType>1</FileType>
434 + <tvExp>0</tvExp>
435 + <tvExpOptDlg>0</tvExpOptDlg>
436 + <bDave2>0</bDave2>
437 + <PathWithFileName>.\SSD1327\OLED_GUI.c</PathWithFileName>
438 + <FilenameWithoutPath>OLED_GUI.c</FilenameWithoutPath>
439 + <RteFlg>0</RteFlg>
440 + <bShared>0</bShared>
441 + </File>
442 + </Group>
443 +
444 + <Group>
445 + <GroupName>SSD1327_Fonts</GroupName>
446 + <tvExp>1</tvExp>
447 + <tvExpOptDlg>0</tvExpOptDlg>
448 + <cbSel>0</cbSel>
449 + <RteFlg>0</RteFlg>
450 + <File>
451 + <GroupNumber>5</GroupNumber>
452 + <FileNumber>16</FileNumber>
453 + <FileType>1</FileType>
454 + <tvExp>0</tvExp>
455 + <tvExpOptDlg>0</tvExpOptDlg>
456 + <bDave2>0</bDave2>
457 + <PathWithFileName>.\SSD1327_Fonts\font8.c</PathWithFileName>
458 + <FilenameWithoutPath>font8.c</FilenameWithoutPath>
459 + <RteFlg>0</RteFlg>
460 + <bShared>0</bShared>
461 + </File>
462 + <File>
463 + <GroupNumber>5</GroupNumber>
464 + <FileNumber>17</FileNumber>
465 + <FileType>1</FileType>
466 + <tvExp>0</tvExp>
467 + <tvExpOptDlg>0</tvExpOptDlg>
468 + <bDave2>0</bDave2>
469 + <PathWithFileName>.\SSD1327_Fonts\font12.c</PathWithFileName>
470 + <FilenameWithoutPath>font12.c</FilenameWithoutPath>
471 + <RteFlg>0</RteFlg>
472 + <bShared>0</bShared>
473 + </File>
474 + <File>
475 + <GroupNumber>5</GroupNumber>
476 + <FileNumber>18</FileNumber>
477 + <FileType>1</FileType>
478 + <tvExp>0</tvExp>
479 + <tvExpOptDlg>0</tvExpOptDlg>
480 + <bDave2>0</bDave2>
481 + <PathWithFileName>.\SSD1327_Fonts\font16.c</PathWithFileName>
482 + <FilenameWithoutPath>font16.c</FilenameWithoutPath>
483 + <RteFlg>0</RteFlg>
484 + <bShared>0</bShared>
485 + </File>
486 + <File>
487 + <GroupNumber>5</GroupNumber>
488 + <FileNumber>19</FileNumber>
489 + <FileType>1</FileType>
490 + <tvExp>0</tvExp>
491 + <tvExpOptDlg>0</tvExpOptDlg>
492 + <bDave2>0</bDave2>
493 + <PathWithFileName>.\SSD1327_Fonts\font20.c</PathWithFileName>
494 + <FilenameWithoutPath>font20.c</FilenameWithoutPath>
495 + <RteFlg>0</RteFlg>
496 + <bShared>0</bShared>
497 + </File>
498 + <File>
499 + <GroupNumber>5</GroupNumber>
500 + <FileNumber>20</FileNumber>
501 + <FileType>1</FileType>
502 + <tvExp>0</tvExp>
503 + <tvExpOptDlg>0</tvExpOptDlg>
504 + <bDave2>0</bDave2>
505 + <PathWithFileName>.\SSD1327_Fonts\font24.c</PathWithFileName>
506 + <FilenameWithoutPath>font24.c</FilenameWithoutPath>
507 + <RteFlg>0</RteFlg>
508 + <bShared>0</bShared>
509 + </File>
510 + </Group>
511 +
512 + <Group>
513 + <GroupName>WiFi</GroupName>
514 + <tvExp>1</tvExp>
515 + <tvExpOptDlg>0</tvExpOptDlg>
516 + <cbSel>0</cbSel>
517 + <RteFlg>0</RteFlg>
518 + <File>
519 + <GroupNumber>6</GroupNumber>
520 + <FileNumber>21</FileNumber>
521 + <FileType>1</FileType>
522 + <tvExp>0</tvExp>
523 + <tvExpOptDlg>0</tvExpOptDlg>
524 + <bDave2>0</bDave2>
525 + <PathWithFileName>.\WiFi\wifi.c</PathWithFileName>
526 + <FilenameWithoutPath>wifi.c</FilenameWithoutPath>
527 + <RteFlg>0</RteFlg>
528 + <bShared>0</bShared>
529 + </File>
530 + </Group>
531 +
532 + <Group>
533 + <GroupName>User</GroupName>
534 + <tvExp>1</tvExp>
535 + <tvExpOptDlg>0</tvExpOptDlg>
536 + <cbSel>0</cbSel>
537 + <RteFlg>0</RteFlg>
538 + <File>
539 + <GroupNumber>7</GroupNumber>
540 + <FileNumber>22</FileNumber>
541 + <FileType>1</FileType>
542 + <tvExp>0</tvExp>
543 + <tvExpOptDlg>0</tvExpOptDlg>
544 + <bDave2>0</bDave2>
545 + <PathWithFileName>.\main_ns.c</PathWithFileName>
546 + <FilenameWithoutPath>main_ns.c</FilenameWithoutPath>
547 + <RteFlg>0</RteFlg>
548 + <bShared>0</bShared>
549 + </File>
550 + </Group>
551 +
552 + <Group>
553 + <GroupName>::PSA</GroupName>
554 + <tvExp>0</tvExp>
555 + <tvExpOptDlg>0</tvExpOptDlg>
556 + <cbSel>0</cbSel>
557 + <RteFlg>1</RteFlg>
558 + </Group>
559 +
560 +</ProjectOpt>
1 +<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
2 +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_projx.xsd">
3 +
4 + <SchemaVersion>2.1</SchemaVersion>
5 +
6 + <Header>### uVision Project, (C) Keil Software</Header>
7 +
8 + <Targets>
9 + <Target>
10 + <TargetName>NonSecure</TargetName>
11 + <ToolsetNumber>0x4</ToolsetNumber>
12 + <ToolsetName>ARM-ADS</ToolsetName>
13 + <pCCUsed>6150000::V6.15::ARMCLANG</pCCUsed>
14 + <uAC6>1</uAC6>
15 + <TargetOption>
16 + <TargetCommonOption>
17 + <Device>M2351KIAAE</Device>
18 + <Vendor>Nuvoton</Vendor>
19 + <PackID>Nuvoton.NuMicro_DFP.1.3.10</PackID>
20 + <PackURL>http://www.nuvoton.com/hq/enu/Documents/KEILSoftwarePack</PackURL>
21 + <Cpu>IRAM(0x20000000,0x8000) IRAM2(0x30008000,0x10000) IROM(0x00000000,0x40000) IROM2(0x10040000,0x40000) CPUTYPE("Cortex-M23") TZ CLOCK(12000000) ESEL ELITTLE</Cpu>
22 + <FlashUtilSpec></FlashUtilSpec>
23 + <StartupFile></StartupFile>
24 + <FlashDriverDll>UL2V8M(-S0 -C0 -P0 -FD20000000 -FC1200 -FN1 -FF0M2351_AP_512 -FS00 -FL080000 -FP0($$Device:M2351KIAAE$Flash\M2351_AP_512.FLM))</FlashDriverDll>
25 + <DeviceId>0</DeviceId>
26 + <RegisterFile>$$Device:M2351KIAAE$Device\M2351\Include\M2351.h</RegisterFile>
27 + <MemoryEnv></MemoryEnv>
28 + <Cmp></Cmp>
29 + <Asm></Asm>
30 + <Linker></Linker>
31 + <OHString></OHString>
32 + <InfinionOptionDll></InfinionOptionDll>
33 + <SLE66CMisc></SLE66CMisc>
34 + <SLE66AMisc></SLE66AMisc>
35 + <SLE66LinkerMisc></SLE66LinkerMisc>
36 + <SFDFile>$$Device:M2351KIAAE$SVD\Nuvoton\M2351_v1.svd</SFDFile>
37 + <bCustSvd>0</bCustSvd>
38 + <UseEnv>0</UseEnv>
39 + <BinPath></BinPath>
40 + <IncludePath></IncludePath>
41 + <LibPath></LibPath>
42 + <RegisterFilePath></RegisterFilePath>
43 + <DBRegisterFilePath></DBRegisterFilePath>
44 + <TargetStatus>
45 + <Error>0</Error>
46 + <ExitCodeStop>0</ExitCodeStop>
47 + <ButtonStop>0</ButtonStop>
48 + <NotGenerated>0</NotGenerated>
49 + <InvalidFlash>1</InvalidFlash>
50 + </TargetStatus>
51 + <OutputDirectory>.\Objects\</OutputDirectory>
52 + <OutputName>NonSecure</OutputName>
53 + <CreateExecutable>1</CreateExecutable>
54 + <CreateLib>0</CreateLib>
55 + <CreateHexFile>1</CreateHexFile>
56 + <DebugInformation>1</DebugInformation>
57 + <BrowseInformation>1</BrowseInformation>
58 + <ListingPath>.\Listings\</ListingPath>
59 + <HexFormatSelection>1</HexFormatSelection>
60 + <Merge32K>0</Merge32K>
61 + <CreateBatchFile>0</CreateBatchFile>
62 + <BeforeCompile>
63 + <RunUserProg1>0</RunUserProg1>
64 + <RunUserProg2>0</RunUserProg2>
65 + <UserProg1Name></UserProg1Name>
66 + <UserProg2Name></UserProg2Name>
67 + <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
68 + <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
69 + <nStopU1X>0</nStopU1X>
70 + <nStopU2X>0</nStopU2X>
71 + </BeforeCompile>
72 + <BeforeMake>
73 + <RunUserProg1>0</RunUserProg1>
74 + <RunUserProg2>0</RunUserProg2>
75 + <UserProg1Name></UserProg1Name>
76 + <UserProg2Name></UserProg2Name>
77 + <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
78 + <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
79 + <nStopB1X>0</nStopB1X>
80 + <nStopB2X>0</nStopB2X>
81 + </BeforeMake>
82 + <AfterMake>
83 + <RunUserProg1>0</RunUserProg1>
84 + <RunUserProg2>0</RunUserProg2>
85 + <UserProg1Name></UserProg1Name>
86 + <UserProg2Name></UserProg2Name>
87 + <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
88 + <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
89 + <nStopA1X>0</nStopA1X>
90 + <nStopA2X>0</nStopA2X>
91 + </AfterMake>
92 + <SelectedForBatchBuild>0</SelectedForBatchBuild>
93 + <SVCSIdString></SVCSIdString>
94 + </TargetCommonOption>
95 + <CommonProperty>
96 + <UseCPPCompiler>0</UseCPPCompiler>
97 + <RVCTCodeConst>0</RVCTCodeConst>
98 + <RVCTZI>0</RVCTZI>
99 + <RVCTOtherData>0</RVCTOtherData>
100 + <ModuleSelection>0</ModuleSelection>
101 + <IncludeInBuild>1</IncludeInBuild>
102 + <AlwaysBuild>0</AlwaysBuild>
103 + <GenerateAssemblyFile>0</GenerateAssemblyFile>
104 + <AssembleAssemblyFile>0</AssembleAssemblyFile>
105 + <PublicsOnly>0</PublicsOnly>
106 + <StopOnExitCode>3</StopOnExitCode>
107 + <CustomArgument></CustomArgument>
108 + <IncludeLibraryModules></IncludeLibraryModules>
109 + <ComprImg>1</ComprImg>
110 + </CommonProperty>
111 + <DllOption>
112 + <SimDllName></SimDllName>
113 + <SimDllArguments></SimDllArguments>
114 + <SimDlgDll></SimDlgDll>
115 + <SimDlgDllArguments></SimDlgDllArguments>
116 + <TargetDllName>SARMV8M.DLL</TargetDllName>
117 + <TargetDllArguments> -MPU</TargetDllArguments>
118 + <TargetDlgDll>TCM.DLL</TargetDlgDll>
119 + <TargetDlgDllArguments>-pCM23</TargetDlgDllArguments>
120 + </DllOption>
121 + <DebugOption>
122 + <OPTHX>
123 + <HexSelection>1</HexSelection>
124 + <HexRangeLowAddress>0</HexRangeLowAddress>
125 + <HexRangeHighAddress>0</HexRangeHighAddress>
126 + <HexOffset>0</HexOffset>
127 + <Oh166RecLen>16</Oh166RecLen>
128 + </OPTHX>
129 + </DebugOption>
130 + <Utilities>
131 + <Flash1>
132 + <UseTargetDll>1</UseTargetDll>
133 + <UseExternalTool>0</UseExternalTool>
134 + <RunIndependent>0</RunIndependent>
135 + <UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
136 + <Capability>1</Capability>
137 + <DriverSelection>4102</DriverSelection>
138 + </Flash1>
139 + <bUseTDR>1</bUseTDR>
140 + <Flash2>BIN\UL2V8M.DLL</Flash2>
141 + <Flash3>"" ()</Flash3>
142 + <Flash4></Flash4>
143 + <pFcarmOut></pFcarmOut>
144 + <pFcarmGrp>User</pFcarmGrp>
145 + <pFcArmRoot></pFcArmRoot>
146 + <FcArmLst>0</FcArmLst>
147 + </Utilities>
148 + <TargetArmAds>
149 + <ArmAdsMisc>
150 + <GenerateListings>0</GenerateListings>
151 + <asHll>1</asHll>
152 + <asAsm>1</asAsm>
153 + <asMacX>1</asMacX>
154 + <asSyms>1</asSyms>
155 + <asFals>1</asFals>
156 + <asDbgD>1</asDbgD>
157 + <asForm>1</asForm>
158 + <ldLst>0</ldLst>
159 + <ldmm>1</ldmm>
160 + <ldXref>1</ldXref>
161 + <BigEnd>0</BigEnd>
162 + <AdsALst>1</AdsALst>
163 + <AdsACrf>1</AdsACrf>
164 + <AdsANop>0</AdsANop>
165 + <AdsANot>0</AdsANot>
166 + <AdsLLst>1</AdsLLst>
167 + <AdsLmap>1</AdsLmap>
168 + <AdsLcgr>1</AdsLcgr>
169 + <AdsLsym>1</AdsLsym>
170 + <AdsLszi>1</AdsLszi>
171 + <AdsLtoi>1</AdsLtoi>
172 + <AdsLsun>1</AdsLsun>
173 + <AdsLven>1</AdsLven>
174 + <AdsLsxf>1</AdsLsxf>
175 + <RvctClst>1</RvctClst>
176 + <GenPPlst>0</GenPPlst>
177 + <AdsCpuType>"Cortex-M23"</AdsCpuType>
178 + <RvctDeviceName></RvctDeviceName>
179 + <mOS>0</mOS>
180 + <uocRom>0</uocRom>
181 + <uocRam>0</uocRam>
182 + <hadIROM>1</hadIROM>
183 + <hadIRAM>1</hadIRAM>
184 + <hadXRAM>0</hadXRAM>
185 + <uocXRam>0</uocXRam>
186 + <RvdsVP>0</RvdsVP>
187 + <RvdsMve>0</RvdsMve>
188 + <RvdsCdeCp>0</RvdsCdeCp>
189 + <hadIRAM2>1</hadIRAM2>
190 + <hadIROM2>1</hadIROM2>
191 + <StupSel>8</StupSel>
192 + <useUlib>1</useUlib>
193 + <EndSel>1</EndSel>
194 + <uLtcg>0</uLtcg>
195 + <nSecure>0</nSecure>
196 + <RoSelD>3</RoSelD>
197 + <RwSelD>4</RwSelD>
198 + <CodeSel>0</CodeSel>
199 + <OptFeed>0</OptFeed>
200 + <NoZi1>0</NoZi1>
201 + <NoZi2>0</NoZi2>
202 + <NoZi3>0</NoZi3>
203 + <NoZi4>0</NoZi4>
204 + <NoZi5>0</NoZi5>
205 + <Ro1Chk>0</Ro1Chk>
206 + <Ro2Chk>0</Ro2Chk>
207 + <Ro3Chk>0</Ro3Chk>
208 + <Ir1Chk>1</Ir1Chk>
209 + <Ir2Chk>0</Ir2Chk>
210 + <Ra1Chk>0</Ra1Chk>
211 + <Ra2Chk>0</Ra2Chk>
212 + <Ra3Chk>0</Ra3Chk>
213 + <Im1Chk>1</Im1Chk>
214 + <Im2Chk>0</Im2Chk>
215 + <OnChipMemories>
216 + <Ocm1>
217 + <Type>0</Type>
218 + <StartAddress>0x0</StartAddress>
219 + <Size>0x0</Size>
220 + </Ocm1>
221 + <Ocm2>
222 + <Type>0</Type>
223 + <StartAddress>0x0</StartAddress>
224 + <Size>0x0</Size>
225 + </Ocm2>
226 + <Ocm3>
227 + <Type>0</Type>
228 + <StartAddress>0x0</StartAddress>
229 + <Size>0x0</Size>
230 + </Ocm3>
231 + <Ocm4>
232 + <Type>0</Type>
233 + <StartAddress>0x0</StartAddress>
234 + <Size>0x0</Size>
235 + </Ocm4>
236 + <Ocm5>
237 + <Type>0</Type>
238 + <StartAddress>0x0</StartAddress>
239 + <Size>0x0</Size>
240 + </Ocm5>
241 + <Ocm6>
242 + <Type>0</Type>
243 + <StartAddress>0x0</StartAddress>
244 + <Size>0x0</Size>
245 + </Ocm6>
246 + <IRAM>
247 + <Type>0</Type>
248 + <StartAddress>0x20000000</StartAddress>
249 + <Size>0x8000</Size>
250 + </IRAM>
251 + <IROM>
252 + <Type>1</Type>
253 + <StartAddress>0x0</StartAddress>
254 + <Size>0x40000</Size>
255 + </IROM>
256 + <XRAM>
257 + <Type>0</Type>
258 + <StartAddress>0x0</StartAddress>
259 + <Size>0x0</Size>
260 + </XRAM>
261 + <OCR_RVCT1>
262 + <Type>1</Type>
263 + <StartAddress>0x0</StartAddress>
264 + <Size>0x0</Size>
265 + </OCR_RVCT1>
266 + <OCR_RVCT2>
267 + <Type>1</Type>
268 + <StartAddress>0x0</StartAddress>
269 + <Size>0x0</Size>
270 + </OCR_RVCT2>
271 + <OCR_RVCT3>
272 + <Type>1</Type>
273 + <StartAddress>0x0</StartAddress>
274 + <Size>0x0</Size>
275 + </OCR_RVCT3>
276 + <OCR_RVCT4>
277 + <Type>1</Type>
278 + <StartAddress>0x0</StartAddress>
279 + <Size>0x40000</Size>
280 + </OCR_RVCT4>
281 + <OCR_RVCT5>
282 + <Type>1</Type>
283 + <StartAddress>0x10040000</StartAddress>
284 + <Size>0x40000</Size>
285 + </OCR_RVCT5>
286 + <OCR_RVCT6>
287 + <Type>0</Type>
288 + <StartAddress>0x0</StartAddress>
289 + <Size>0x0</Size>
290 + </OCR_RVCT6>
291 + <OCR_RVCT7>
292 + <Type>0</Type>
293 + <StartAddress>0x0</StartAddress>
294 + <Size>0x0</Size>
295 + </OCR_RVCT7>
296 + <OCR_RVCT8>
297 + <Type>0</Type>
298 + <StartAddress>0x0</StartAddress>
299 + <Size>0x0</Size>
300 + </OCR_RVCT8>
301 + <OCR_RVCT9>
302 + <Type>0</Type>
303 + <StartAddress>0x20000000</StartAddress>
304 + <Size>0x8000</Size>
305 + </OCR_RVCT9>
306 + <OCR_RVCT10>
307 + <Type>0</Type>
308 + <StartAddress>0x30008000</StartAddress>
309 + <Size>0x10000</Size>
310 + </OCR_RVCT10>
311 + </OnChipMemories>
312 + <RvctStartVector></RvctStartVector>
313 + </ArmAdsMisc>
314 + <Cads>
315 + <interw>1</interw>
316 + <Optim>0</Optim>
317 + <oTime>0</oTime>
318 + <SplitLS>0</SplitLS>
319 + <OneElfS>1</OneElfS>
320 + <Strict>0</Strict>
321 + <EnumInt>0</EnumInt>
322 + <PlainCh>0</PlainCh>
323 + <Ropi>0</Ropi>
324 + <Rwpi>0</Rwpi>
325 + <wLevel>0</wLevel>
326 + <uThumb>0</uThumb>
327 + <uSurpInc>0</uSurpInc>
328 + <uC99>0</uC99>
329 + <uGnu>0</uGnu>
330 + <useXO>0</useXO>
331 + <v6Lang>5</v6Lang>
332 + <v6LangP>0</v6LangP>
333 + <vShortEn>0</vShortEn>
334 + <vShortWch>0</vShortWch>
335 + <v6Lto>0</v6Lto>
336 + <v6WtE>0</v6WtE>
337 + <v6Rtti>0</v6Rtti>
338 + <VariousControls>
339 + <MiscControls></MiscControls>
340 + <Define>DEBUG_PORT=UART0_NS</Define>
341 + <Undefine></Undefine>
342 + <IncludePath>..\..\..\Library\CMSIS\Include;..\..\..\Library\Device\Nuvoton\M2351\Include;..\..\..\Library\StdDriver\inc;..\NonSecure;.\SSD1327;.\SSD1327_Fonts;.\WiFi</IncludePath>
343 + </VariousControls>
344 + </Cads>
345 + <Aads>
346 + <interw>1</interw>
347 + <Ropi>0</Ropi>
348 + <Rwpi>0</Rwpi>
349 + <thumb>1</thumb>
350 + <SplitLS>0</SplitLS>
351 + <SwStkChk>0</SwStkChk>
352 + <NoWarn>1</NoWarn>
353 + <uSurpInc>0</uSurpInc>
354 + <useXO>0</useXO>
355 + <ClangAsOpt>1</ClangAsOpt>
356 + <VariousControls>
357 + <MiscControls></MiscControls>
358 + <Define></Define>
359 + <Undefine></Undefine>
360 + <IncludePath></IncludePath>
361 + </VariousControls>
362 + </Aads>
363 + <LDads>
364 + <umfTarg>0</umfTarg>
365 + <Ropi>0</Ropi>
366 + <Rwpi>0</Rwpi>
367 + <noStLib>0</noStLib>
368 + <RepFail>1</RepFail>
369 + <useFile>0</useFile>
370 + <TextAddressRange></TextAddressRange>
371 + <DataAddressRange></DataAddressRange>
372 + <pXoBase></pXoBase>
373 + <ScatterFile>.\Objects\NonSecure.sct</ScatterFile>
374 + <IncludeLibs></IncludeLibs>
375 + <IncludeLibsPath></IncludeLibsPath>
376 + <Misc></Misc>
377 + <LinkerInputFile></LinkerInputFile>
378 + <DisabledWarnings></DisabledWarnings>
379 + </LDads>
380 + </TargetArmAds>
381 + </TargetOption>
382 + <Groups>
383 + <Group>
384 + <GroupName>CMSIS</GroupName>
385 + <Files>
386 + <File>
387 + <FileName>system_M2351.c</FileName>
388 + <FileType>1</FileType>
389 + <FilePath>..\..\..\Library\Device\Nuvoton\M2351\Source\system_M2351.c</FilePath>
390 + </File>
391 + <File>
392 + <FileName>startup_M2351.s</FileName>
393 + <FileType>2</FileType>
394 + <FilePath>..\..\..\Library\Device\Nuvoton\M2351\Source\ARM\startup_M2351.s</FilePath>
395 + </File>
396 + </Files>
397 + </Group>
398 + <Group>
399 + <GroupName>Library</GroupName>
400 + <Files>
401 + <File>
402 + <FileName>gpio.c</FileName>
403 + <FileType>1</FileType>
404 + <FilePath>..\..\..\Library\StdDriver\src\gpio.c</FilePath>
405 + </File>
406 + <File>
407 + <FileName>retarget.c</FileName>
408 + <FileType>1</FileType>
409 + <FilePath>..\..\..\Library\StdDriver\src\retarget.c</FilePath>
410 + </File>
411 + </Files>
412 + </Group>
413 + <Group>
414 + <GroupName>Include</GroupName>
415 + <Files>
416 + <File>
417 + <FileName>fonts.h</FileName>
418 + <FileType>5</FileType>
419 + <FilePath>.\SSD1327_Fonts\fonts.h</FilePath>
420 + </File>
421 + <File>
422 + <FileName>DEV_Config.h</FileName>
423 + <FileType>5</FileType>
424 + <FilePath>.\SSD1327\DEV_Config.h</FilePath>
425 + </File>
426 + <File>
427 + <FileName>OLED_Driver.h</FileName>
428 + <FileType>5</FileType>
429 + <FilePath>.\SSD1327\OLED_Driver.h</FilePath>
430 + </File>
431 + <File>
432 + <FileName>OLED_GUI.h</FileName>
433 + <FileType>5</FileType>
434 + <FilePath>.\SSD1327\OLED_GUI.h</FilePath>
435 + </File>
436 + <File>
437 + <FileName>wifi.h</FileName>
438 + <FileType>5</FileType>
439 + <FilePath>.\WiFi\wifi.h</FilePath>
440 + </File>
441 + <File>
442 + <FileName>nsclib.o</FileName>
443 + <FileType>3</FileType>
444 + <FilePath>..\Secure\lib\nsclib.o</FilePath>
445 + </File>
446 + <File>
447 + <FileName>cssd_lib.h</FileName>
448 + <FileType>5</FileType>
449 + <FilePath>.\cssd_lib.h</FilePath>
450 + </File>
451 + <File>
452 + <FileName>NuMicro.h</FileName>
453 + <FileType>5</FileType>
454 + <FilePath>..\..\..\Library\Device\Nuvoton\M2351\Include\NuMicro.h</FilePath>
455 + </File>
456 + </Files>
457 + </Group>
458 + <Group>
459 + <GroupName>SSD1327</GroupName>
460 + <Files>
461 + <File>
462 + <FileName>DEV_Config.c</FileName>
463 + <FileType>1</FileType>
464 + <FilePath>.\SSD1327\DEV_Config.c</FilePath>
465 + </File>
466 + <File>
467 + <FileName>OLED_Driver.c</FileName>
468 + <FileType>1</FileType>
469 + <FilePath>.\SSD1327\OLED_Driver.c</FilePath>
470 + </File>
471 + <File>
472 + <FileName>OLED_GUI.c</FileName>
473 + <FileType>1</FileType>
474 + <FilePath>.\SSD1327\OLED_GUI.c</FilePath>
475 + </File>
476 + </Files>
477 + </Group>
478 + <Group>
479 + <GroupName>SSD1327_Fonts</GroupName>
480 + <Files>
481 + <File>
482 + <FileName>font8.c</FileName>
483 + <FileType>1</FileType>
484 + <FilePath>.\SSD1327_Fonts\font8.c</FilePath>
485 + </File>
486 + <File>
487 + <FileName>font12.c</FileName>
488 + <FileType>1</FileType>
489 + <FilePath>.\SSD1327_Fonts\font12.c</FilePath>
490 + </File>
491 + <File>
492 + <FileName>font16.c</FileName>
493 + <FileType>1</FileType>
494 + <FilePath>.\SSD1327_Fonts\font16.c</FilePath>
495 + </File>
496 + <File>
497 + <FileName>font20.c</FileName>
498 + <FileType>1</FileType>
499 + <FilePath>.\SSD1327_Fonts\font20.c</FilePath>
500 + </File>
501 + <File>
502 + <FileName>font24.c</FileName>
503 + <FileType>1</FileType>
504 + <FilePath>.\SSD1327_Fonts\font24.c</FilePath>
505 + </File>
506 + </Files>
507 + </Group>
508 + <Group>
509 + <GroupName>WiFi</GroupName>
510 + <Files>
511 + <File>
512 + <FileName>wifi.c</FileName>
513 + <FileType>1</FileType>
514 + <FilePath>.\WiFi\wifi.c</FilePath>
515 + </File>
516 + </Files>
517 + </Group>
518 + <Group>
519 + <GroupName>User</GroupName>
520 + <Files>
521 + <File>
522 + <FileName>main_ns.c</FileName>
523 + <FileType>1</FileType>
524 + <FilePath>.\main_ns.c</FilePath>
525 + </File>
526 + </Files>
527 + </Group>
528 + <Group>
529 + <GroupName>::PSA</GroupName>
530 + </Group>
531 + </Groups>
532 + </Target>
533 + </Targets>
534 +
535 + <RTE>
536 + <apis>
537 + <api Capiversion="1.0.0" Cclass="PSA" Cgroup="Crypto" exclusive="1">
538 + <package name="PSA" schemaVersion="1.6.3" url="http://www.keil.com/pack/" vendor="ARM" version="1.0.0"/>
539 + <targetInfos>
540 + <targetInfo name="NonSecure"/>
541 + </targetInfos>
542 + </api>
543 + </apis>
544 + <components>
545 + <component Capiversion="1.0.0" Cclass="PSA" Cgroup="Crypto" Csub="mbed TLS" Cvendor="ARM" Cversion="2.24.0" condition="mbed TLS">
546 + <package name="mbedTLS" schemaVersion="1.6.3" url="http://www.keil.com/pack/" vendor="ARM" version="1.7.0"/>
547 + <targetInfos>
548 + <targetInfo name="NonSecure"/>
549 + </targetInfos>
550 + </component>
551 + </components>
552 + <files/>
553 + </RTE>
554 +
555 + <LayerInfo>
556 + <Layers>
557 + <Layer>
558 + <LayName>NonSecure</LayName>
559 + <LayPrjMark>1</LayPrjMark>
560 + </Layer>
561 + </Layers>
562 + </LayerInfo>
563 +
564 +</Project>
1 +[Version]
2 +Nu_LinkVersion=V5.15
3 +[Process]
4 +ProcessID=0x000079c8
5 +ProcessCreationTime_L=0xab44af4b
6 +ProcessCreationTime_H=0x01d75ed7
7 +NuLinkID=0x180016bb
8 +NuLinkIDs_Count=0x00000001
9 +NuLinkID0=0x180016bb
10 +[ChipSelect]
11 +;ChipName=<NUC1xx|NUC2xx|M05x|N571|N572|Nano100|N512|Mini51|NUC505|General>
12 +ChipName=M2351
13 +[NUC505]
14 +Connect=0
15 +Reset=Autodetect
16 +MaxClock=1MHz
17 +MemoryVerify=0
18 +IOVoltage=3300
19 +Erase=1
20 +Program=1
21 +Verify=1
22 +ResetAndRun=0
23 +EnableFlashBreakpoint=0
24 +EnableLog=0
25 +MemAccessWhileRun=0
26 +RAMForAlgorithmStart=0x20000000
27 +RAMForAlgorithmSize=0x4000
28 +ProgramAlgorithm=NUC505_SPIFLASH.FLM
29 +[NUC4xx]
30 +Connect=0
31 +Reset=Autodetect
32 +MaxClock=1MHz
33 +MemoryVerify=0
34 +IOVoltage=3300
35 +FlashSelect=APROM
36 +Erase=1
37 +Program=1
38 +Verify=1
39 +ResetAndRun=0
40 +EnableFlashBreakpoint=1
41 +EnableLog=0
42 +MemAccessWhileRun=0
43 +RAMForAlgorithmStart=0x20000000
44 +RAMForAlgorithmSize=0x4000
45 +ProgramAlgorithm=NUC400_AP_512.FLM
46 +TraceConf0=0x00000002
47 +TraceConf1=0x014fb180
48 +TraceConf2=0x00000800
49 +TraceConf3=0x00000000
50 +TraceConf4=0x00000001
51 +TraceConf5=0x00000000
52 +[NUC2xx]
53 +Connect=0
54 +Reset=Autodetect
55 +MaxClock=1MHz
56 +MemoryVerify=0
57 +IOVoltage=3300
58 +FlashSelect=APROM
59 +Erase=1
60 +Program=1
61 +Verify=1
62 +ResetAndRun=0
63 +EnableFlashBreakpoint=1
64 +EnableLog=0
65 +MemAccessWhileRun=0
66 +RAMForAlgorithmStart=0x20000000
67 +RAMForAlgorithmSize=0x1000
68 +ProgramAlgorithm=NUC200_AP_128.FLM
69 +[NUC1311]
70 +Connect=0
71 +Reset=Autodetect
72 +MaxClock=1MHz
73 +MemoryVerify=0
74 +IOVoltage=3300
75 +FlashSelect=APROM
76 +Erase=1
77 +Program=1
78 +Verify=1
79 +ResetAndRun=0
80 +EnableFlashBreakpoint=1
81 +EnableLog=0
82 +MemAccessWhileRun=0
83 +RAMForAlgorithmStart=0x20000000
84 +RAMForAlgorithmSize=0x1000
85 +ProgramAlgorithm=NUC1311_AP_64.FLM
86 +[NUC126]
87 +Connect=0
88 +Reset=Autodetect
89 +MaxClock=1MHz
90 +MemoryVerify=0
91 +IOVoltage=3300
92 +FlashSelect=APROM
93 +Erase=1
94 +Program=1
95 +Verify=1
96 +ResetAndRun=0
97 +EnableFlashBreakpoint=1
98 +EnableLog=0
99 +MemAccessWhileRun=0
100 +RAMForAlgorithmStart=0x20000000
101 +RAMForAlgorithmSize=0x2000
102 +ProgramAlgorithm=NUC126_AP_256.FLM
103 +[NUC121]
104 +Connect=0
105 +Reset=Autodetect
106 +MaxClock=1MHz
107 +MemoryVerify=0
108 +IOVoltage=3300
109 +FlashSelect=APROM
110 +Erase=1
111 +Program=1
112 +Verify=1
113 +ResetAndRun=0
114 +EnableFlashBreakpoint=1
115 +EnableLog=0
116 +MemAccessWhileRun=0
117 +RAMForAlgorithmStart=0x20000000
118 +RAMForAlgorithmSize=0x1000
119 +ProgramAlgorithm=NUC121_AP_32.FLM
120 +[NUC1xx]
121 +Connect=0
122 +Reset=Autodetect
123 +MaxClock=1MHz
124 +MemoryVerify=0
125 +IOVoltage=3300
126 +FlashSelect=APROM
127 +Erase=1
128 +Program=1
129 +Verify=1
130 +ResetAndRun=0
131 +EnableFlashBreakpoint=1
132 +EnableLog=0
133 +MemAccessWhileRun=0
134 +RAMForAlgorithmStart=0x20000000
135 +RAMForAlgorithmSize=0x1000
136 +ProgramAlgorithm=NUC100_AP_128.FLM
137 +[NUC029]
138 +Connect=0
139 +Reset=Autodetect
140 +MaxClock=1MHz
141 +MemoryVerify=0
142 +IOVoltage=3300
143 +FlashSelect=APROM
144 +Erase=1
145 +Program=1
146 +Verify=1
147 +ResetAndRun=0
148 +EnableFlashBreakpoint=1
149 +EnableLog=0
150 +MemAccessWhileRun=0
151 +RAMForAlgorithmStart=0x20000000
152 +RAMForAlgorithmSize=0x800
153 +ProgramAlgorithm=NUC029_AP_16.FLM
154 +[NM1820]
155 +Connect=0
156 +Reset=Autodetect
157 +MaxClock=1MHz
158 +MemoryVerify=0
159 +IOVoltage=3300
160 +FlashSelect=APROM
161 +Erase=1
162 +Program=1
163 +Verify=1
164 +ResetAndRun=0
165 +EnableFlashBreakpoint=1
166 +EnableLog=0
167 +MemAccessWhileRun=0
168 +RAMForAlgorithmStart=0x20000000
169 +RAMForAlgorithmSize=0x800
170 +ProgramAlgorithm=NM1820_AP_17_5.FLM
171 +[NM1810]
172 +Connect=0
173 +Reset=Autodetect
174 +MaxClock=1MHz
175 +MemoryVerify=0
176 +IOVoltage=3300
177 +FlashSelect=APROM
178 +Erase=1
179 +Program=1
180 +Verify=1
181 +ResetAndRun=0
182 +EnableFlashBreakpoint=1
183 +EnableLog=0
184 +MemAccessWhileRun=0
185 +RAMForAlgorithmStart=0x20000000
186 +RAMForAlgorithmSize=0x800
187 +ProgramAlgorithm=NM1810_AP_29_5.FLM
188 +[NM1500]
189 +Connect=0
190 +Reset=Autodetect
191 +MaxClock=1MHz
192 +MemoryVerify=0
193 +IOVoltage=3300
194 +FlashSelect=APROM
195 +Erase=1
196 +Program=1
197 +Verify=1
198 +ResetAndRun=0
199 +EnableFlashBreakpoint=1
200 +EnableLog=0
201 +MemAccessWhileRun=0
202 +RAMForAlgorithmStart=0x20000000
203 +RAMForAlgorithmSize=0x1000
204 +ProgramAlgorithm=NM1500_AP_128.FLM
205 +[NM1330]
206 +Connect=0
207 +Reset=Autodetect
208 +MaxClock=1MHz
209 +MemoryVerify=0
210 +IOVoltage=3300
211 +FlashSelect=APROM
212 +Erase=1
213 +Program=1
214 +Verify=1
215 +ResetAndRun=0
216 +EnableFlashBreakpoint=1
217 +EnableLog=0
218 +MemAccessWhileRun=0
219 +RAMForAlgorithmStart=0x20000000
220 +RAMForAlgorithmSize=0x1000
221 +ProgramAlgorithm=NM1330_AP_64.FLM
222 +[NM1320]
223 +Connect=0
224 +Reset=Autodetect
225 +MaxClock=1MHz
226 +MemoryVerify=0
227 +IOVoltage=3300
228 +FlashSelect=APROM
229 +Erase=1
230 +Program=1
231 +Verify=1
232 +ResetAndRun=0
233 +EnableFlashBreakpoint=1
234 +EnableLog=0
235 +MemAccessWhileRun=0
236 +RAMForAlgorithmStart=0x20000000
237 +RAMForAlgorithmSize=0x1000
238 +ProgramAlgorithm=NM1320_AP_32.FLM
239 +[NM1240]
240 +Connect=0
241 +Reset=Autodetect
242 +MaxClock=1MHz
243 +MemoryVerify=0
244 +IOVoltage=3300
245 +FlashSelect=APROM
246 +Erase=1
247 +Program=1
248 +Verify=1
249 +ResetAndRun=0
250 +EnableFlashBreakpoint=1
251 +EnableLog=0
252 +MemAccessWhileRun=0
253 +RAMForAlgorithmStart=0x20000000
254 +RAMForAlgorithmSize=0x1000
255 +ProgramAlgorithm=NM1240_AP_64.FLM
256 +[NM1230]
257 +Connect=0
258 +Reset=Autodetect
259 +MaxClock=1MHz
260 +MemoryVerify=0
261 +IOVoltage=3300
262 +FlashSelect=APROM
263 +Erase=1
264 +Program=1
265 +Verify=1
266 +ResetAndRun=0
267 +EnableFlashBreakpoint=1
268 +EnableLog=0
269 +MemAccessWhileRun=0
270 +RAMForAlgorithmStart=0x20000000
271 +RAMForAlgorithmSize=0x1000
272 +ProgramAlgorithm=NM1230_AP_64.FLM
273 +[NM1200]
274 +Connect=0
275 +Reset=Autodetect
276 +MaxClock=1MHz
277 +MemoryVerify=0
278 +IOVoltage=3300
279 +FlashSelect=APROM
280 +Erase=1
281 +Program=1
282 +Verify=1
283 +ResetAndRun=0
284 +EnableFlashBreakpoint=1
285 +EnableLog=0
286 +MemAccessWhileRun=0
287 +RAMForAlgorithmStart=0x20000000
288 +RAMForAlgorithmSize=0x800
289 +ProgramAlgorithm=NM1200_AP_8.FLM
290 +[NM1120]
291 +Connect=0
292 +Reset=Autodetect
293 +MaxClock=1MHz
294 +MemoryVerify=0
295 +IOVoltage=3300
296 +FlashSelect=APROM
297 +Erase=1
298 +Program=1
299 +Verify=1
300 +ResetAndRun=0
301 +EnableFlashBreakpoint=1
302 +EnableLog=0
303 +MemAccessWhileRun=0
304 +RAMForAlgorithmStart=0x20000000
305 +RAMForAlgorithmSize=0x800
306 +ProgramAlgorithm=NM1120_AP_29_5.FLM
307 +[TF5100]
308 +Connect=0
309 +Reset=Autodetect
310 +MaxClock=1MHz
311 +MemoryVerify=0
312 +IOVoltage=3300
313 +FlashSelect=APROM
314 +Erase=1
315 +Program=1
316 +Verify=1
317 +ResetAndRun=0
318 +EnableFlashBreakpoint=1
319 +EnableLog=0
320 +MemAccessWhileRun=0
321 +RAMForAlgorithmStart=0x20000000
322 +RAMForAlgorithmSize=0x1000
323 +ProgramAlgorithm=TF5100_AP_64.FLM
324 +[NDA102]
325 +Connect=0
326 +Reset=Autodetect
327 +MaxClock=1MHz
328 +MemoryVerify=0
329 +IOVoltage=3300
330 +FlashSelect=APROM
331 +Erase=1
332 +Program=1
333 +Verify=1
334 +ResetAndRun=0
335 +EnableFlashBreakpoint=1
336 +EnableLog=0
337 +MemAccessWhileRun=0
338 +RAMForAlgorithmStart=0x20000000
339 +RAMForAlgorithmSize=0x800
340 +ProgramAlgorithm=NDA102_AP_29_5.FLM
341 +[Nano103]
342 +Connect=0
343 +Reset=Autodetect
344 +MaxClock=1MHz
345 +MemoryVerify=0
346 +IOVoltage=3300
347 +FlashSelect=APROM
348 +Erase=1
349 +Program=1
350 +Verify=1
351 +ResetAndRun=0
352 +EnableFlashBreakpoint=1
353 +EnableLog=0
354 +MemAccessWhileRun=0
355 +RAMForAlgorithmStart=0x20000000
356 +RAMForAlgorithmSize=0x1000
357 +ProgramAlgorithm=Nano103_AP_64.FLM
358 +[Nano100]
359 +Connect=0
360 +Reset=Autodetect
361 +MaxClock=1MHz
362 +MemoryVerify=0
363 +IOVoltage=3300
364 +FlashSelect=APROM
365 +Erase=1
366 +Program=1
367 +Verify=1
368 +ResetAndRun=0
369 +EnableFlashBreakpoint=1
370 +EnableLog=0
371 +MemAccessWhileRun=0
372 +RAMForAlgorithmStart=0x20000000
373 +RAMForAlgorithmSize=0x1000
374 +ProgramAlgorithm=Nano100_AP_64.FLM
375 +[N576]
376 +Connect=0
377 +Reset=Autodetect
378 +MaxClock=1MHz
379 +MemoryVerify=0
380 +IOVoltage=3300
381 +FlashSelect=APROM
382 +Erase=1
383 +Program=1
384 +Verify=1
385 +ResetAndRun=0
386 +EnableFlashBreakpoint=0
387 +EnableLog=0
388 +MemAccessWhileRun=0
389 +RAMForAlgorithmStart=0x20000000
390 +RAMForAlgorithmSize=0x1000
391 +ProgramAlgorithm=N576_AP_145.FLM
392 +[N575]
393 +Connect=0
394 +Reset=Autodetect
395 +MaxClock=1MHz
396 +MemoryVerify=0
397 +IOVoltage=3300
398 +FlashSelect=APROM
399 +Erase=1
400 +Program=1
401 +Verify=1
402 +ResetAndRun=0
403 +EnableFlashBreakpoint=0
404 +EnableLog=0
405 +MemAccessWhileRun=0
406 +RAMForAlgorithmStart=0x20000000
407 +RAMForAlgorithmSize=0x1000
408 +ProgramAlgorithm=N575_AP_145.FLM
409 +[N572]
410 +Connect=0
411 +Reset=Autodetect
412 +MaxClock=1MHz
413 +MemoryVerify=0
414 +IOVoltage=3300
415 +Erase=1
416 +Program=1
417 +Verify=1
418 +ResetAndRun=0
419 +EnableFlashBreakpoint=1
420 +EnableLog=0
421 +MemAccessWhileRun=0
422 +RAMForAlgorithmStart=0x20000000
423 +RAMForAlgorithmSize=0x2000
424 +ProgramAlgorithm=N572Fxxx.FLM
425 +[N571]
426 +Connect=0
427 +Reset=Autodetect
428 +MaxClock=1MHz
429 +MemoryVerify=0
430 +IOVoltage=3300
431 +Erase=1
432 +Program=1
433 +Verify=1
434 +ResetAndRun=0
435 +EnableFlashBreakpoint=1
436 +EnableLog=0
437 +MemAccessWhileRun=0
438 +RAMForAlgorithmStart=0x20000000
439 +RAMForAlgorithmSize=0x2000
440 +ProgramAlgorithm=N571E000.FLM
441 +[N570]
442 +Connect=0
443 +Reset=Autodetect
444 +MaxClock=1MHz
445 +MemoryVerify=0
446 +IOVoltage=3300
447 +FlashSelect=APROM
448 +Erase=1
449 +Program=1
450 +Verify=1
451 +ResetAndRun=0
452 +EnableFlashBreakpoint=0
453 +EnableLog=0
454 +MemAccessWhileRun=0
455 +RAMForAlgorithmStart=0x20000000
456 +RAMForAlgorithmSize=0x1000
457 +ProgramAlgorithm=N570_AP_64.FLM
458 +[N569]
459 +Connect=0
460 +Reset=Autodetect
461 +MaxClock=1MHz
462 +MemoryVerify=0
463 +IOVoltage=3300
464 +FlashSelect=APROM
465 +Erase=1
466 +Program=1
467 +Verify=1
468 +ResetAndRun=0
469 +EnableFlashBreakpoint=0
470 +EnableLog=0
471 +MemAccessWhileRun=0
472 +RAMForAlgorithmStart=0x20000000
473 +RAMForAlgorithmSize=0x1000
474 +ProgramAlgorithm=N569_AP_64.FLM
475 +[N512]
476 +Connect=0
477 +Reset=Autodetect
478 +MaxClock=1MHz
479 +MemoryVerify=0
480 +IOVoltage=3300
481 +FlashSelect=APROM
482 +Erase=1
483 +Program=1
484 +Verify=1
485 +ResetAndRun=0
486 +EnableFlashBreakpoint=1
487 +EnableLog=0
488 +MemAccessWhileRun=0
489 +RAMForAlgorithmStart=0x20000000
490 +RAMForAlgorithmSize=0x1000
491 +ProgramAlgorithm=N512_AP_64.FLM
492 +[Mini57]
493 +Connect=0
494 +Reset=Autodetect
495 +MaxClock=1MHz
496 +MemoryVerify=0
497 +IOVoltage=3300
498 +FlashSelect=APROM
499 +Erase=1
500 +Program=1
501 +Verify=1
502 +ResetAndRun=0
503 +EnableFlashBreakpoint=1
504 +EnableLog=0
505 +MemAccessWhileRun=0
506 +RAMForAlgorithmStart=0x20000000
507 +RAMForAlgorithmSize=0x800
508 +ProgramAlgorithm=Mini57_AP_29_5.FLM
509 +[Mini51]
510 +Connect=0
511 +Reset=Autodetect
512 +MaxClock=1MHz
513 +MemoryVerify=0
514 +IOVoltage=3300
515 +FlashSelect=APROM
516 +Erase=1
517 +Program=1
518 +Verify=1
519 +ResetAndRun=0
520 +EnableFlashBreakpoint=1
521 +EnableLog=0
522 +MemAccessWhileRun=0
523 +RAMForAlgorithmStart=0x20000000
524 +RAMForAlgorithmSize=0x800
525 +ProgramAlgorithm=Mini51_AP_16.FLM
526 +[M481]
527 +Connect=0
528 +Reset=Autodetect
529 +MaxClock=1MHz
530 +MemoryVerify=0
531 +IOVoltage=3300
532 +FlashSelect=APROM
533 +Erase=1
534 +Program=1
535 +Verify=1
536 +ResetAndRun=0
537 +EnableFlashBreakpoint=1
538 +EnableLog=0
539 +MemAccessWhileRun=0
540 +RAMForAlgorithmStart=0x20000000
541 +RAMForAlgorithmSize=0x4000
542 +ProgramAlgorithm=M481_AP_512.FLM
543 +TraceConf0=0x00000002
544 +TraceConf1=0x00b71b00
545 +TraceConf2=0x00000800
546 +TraceConf3=0x00000000
547 +TraceConf4=0x00000001
548 +TraceConf5=0x00000000
549 +[M480LD]
550 +Connect=0
551 +Reset=Autodetect
552 +MaxClock=1MHz
553 +MemoryVerify=0
554 +IOVoltage=3300
555 +FlashSelect=APROM
556 +Erase=1
557 +Program=1
558 +Verify=1
559 +ResetAndRun=0
560 +EnableFlashBreakpoint=1
561 +EnableLog=0
562 +MemAccessWhileRun=0
563 +RAMForAlgorithmStart=0x20000000
564 +RAMForAlgorithmSize=0x4000
565 +ProgramAlgorithm=M480LD_AP_256.FLM
566 +[M479]
567 +Connect=0
568 +Reset=Autodetect
569 +MaxClock=1MHz
570 +MemoryVerify=0
571 +IOVoltage=3300
572 +FlashSelect=APROM
573 +Erase=1
574 +Program=1
575 +Verify=1
576 +ResetAndRun=0
577 +EnableFlashBreakpoint=1
578 +EnableLog=0
579 +MemAccessWhileRun=0
580 +RAMForAlgorithmStart=0x20000000
581 +RAMForAlgorithmSize=0x4000
582 +ProgramAlgorithm=M479_AP_256.FLM
583 +[M451]
584 +Connect=0
585 +Reset=Autodetect
586 +MaxClock=1MHz
587 +MemoryVerify=0
588 +IOVoltage=3300
589 +FlashSelect=APROM
590 +Erase=1
591 +Program=1
592 +Verify=1
593 +ResetAndRun=0
594 +EnableFlashBreakpoint=1
595 +EnableLog=0
596 +MemAccessWhileRun=0
597 +RAMForAlgorithmStart=0x20000000
598 +RAMForAlgorithmSize=0x4000
599 +ProgramAlgorithm=M451_AP_256.FLM
600 +[M471]
601 +Connect=0
602 +Reset=Autodetect
603 +MaxClock=1MHz
604 +MemoryVerify=0
605 +IOVoltage=3300
606 +FlashSelect=APROM
607 +Bank=0
608 +Erase=1
609 +Program=1
610 +Verify=1
611 +ResetAndRun=1
612 +EnableFlashBreakpoint=0
613 +EnableLog=0
614 +MemAccessWhileRun=0
615 +RAMForAlgorithmStart=0x20000000
616 +RAMForAlgorithmSize=0x4000
617 +ProgramAlgorithm=M471_AP_512.FLM
618 +TraceConf0=0x00000002
619 +TraceConf1=0x00b71b00
620 +TraceConf2=0x00000800
621 +TraceConf3=0x00000000
622 +TraceConf4=0x00000001
623 +TraceConf5=0x00000000
624 +[M251]
625 +Connect=0
626 +Reset=Autodetect
627 +MaxClock=1MHz
628 +MemoryVerify=0
629 +IOVoltage=3300
630 +FlashSelect=APROM
631 +Erase=1
632 +Program=1
633 +Verify=1
634 +ResetAndRun=0
635 +EnableFlashBreakpoint=1
636 +EnableLog=0
637 +MemAccessWhileRun=0
638 +RAMForAlgorithmStart=0x20000000
639 +RAMForAlgorithmSize=0x2000
640 +ProgramAlgorithm=M251_AP_192.FLM
641 +[M2351]
642 +Connect=0
643 +Reset=Autodetect
644 +MaxClock=1MHz
645 +MemoryVerify=0
646 +IOVoltage=3300
647 +FlashSelect=APROM
648 +Erase=1
649 +Program=1
650 +Verify=1
651 +ResetAndRun=1
652 +EnableFlashBreakpoint=0
653 +EnableLog=0
654 +MemAccessWhileRun=0
655 +RAMForAlgorithmStart=0x20000000
656 +RAMForAlgorithmSize=0x4000
657 +ProgramAlgorithm=M2351_AP_512.FLM
658 +TraceConf0=0x00000002
659 +TraceConf1=0x00b71b00
660 +TraceConf2=0x00000800
661 +TraceConf3=0x00000000
662 +TraceConf4=0x00000001
663 +TraceConf5=0x00000000
664 +CheckDPM=0
665 +DisableTimeoutDetect=0
666 +[M261]
667 +Connect=0
668 +Reset=Autodetect
669 +MaxClock=1MHz
670 +MemoryVerify=0
671 +IOVoltage=3300
672 +FlashSelect=APROM
673 +Erase=1
674 +Program=1
675 +Verify=1
676 +ResetAndRun=1
677 +EnableFlashBreakpoint=0
678 +EnableLog=0
679 +MemAccessWhileRun=0
680 +RAMForAlgorithmStart=0x20000000
681 +RAMForAlgorithmSize=0x4000
682 +ProgramAlgorithm=M261_AP_512.FLM
683 +TraceConf0=0x00000002
684 +TraceConf1=0x00b71b00
685 +TraceConf2=0x00000800
686 +TraceConf3=0x00000000
687 +TraceConf4=0x00000001
688 +TraceConf5=0x00000000
689 +[MR63]
690 +Connect=0
691 +Reset=Autodetect
692 +MaxClock=1MHz
693 +MemoryVerify=0
694 +IOVoltage=3300
695 +FlashSelect=APROM
696 +Erase=1
697 +Program=1
698 +Verify=1
699 +ResetAndRun=1
700 +EnableFlashBreakpoint=0
701 +EnableLog=0
702 +MemAccessWhileRun=0
703 +RAMForAlgorithmStart=0x20000000
704 +RAMForAlgorithmSize=0x4000
705 +ProgramAlgorithm=MR63_AP_512.FLM
706 +TraceConf0=0x00000002
707 +TraceConf1=0x00b71b00
708 +TraceConf2=0x00000800
709 +TraceConf3=0x00000000
710 +TraceConf4=0x00000001
711 +TraceConf5=0x00000000
712 +[M2354]
713 +Connect=0
714 +Reset=Autodetect
715 +MaxClock=1MHz
716 +MemoryVerify=0
717 +IOVoltage=3300
718 +FlashSelect=APROM
719 +Bank=0
720 +Erase=1
721 +Program=1
722 +Verify=1
723 +ResetAndRun=1
724 +EnableFlashBreakpoint=0
725 +EnableLog=0
726 +MemAccessWhileRun=0
727 +CheckDPM=0
728 +RAMForAlgorithmStart=0x20000000
729 +RAMForAlgorithmSize=0x4000
730 +ProgramAlgorithm=M2354_AP_1M.FLM
731 +TraceConf0=0x00000002
732 +TraceConf1=0x00b71b00
733 +TraceConf2=0x00000800
734 +TraceConf3=0x00000000
735 +TraceConf4=0x00000001
736 +TraceConf5=0x00000000
737 +[M071]
738 +Connect=0
739 +Reset=Autodetect
740 +MaxClock=1MHz
741 +MemoryVerify=0
742 +IOVoltage=3300
743 +FlashSelect=APROM
744 +Erase=1
745 +Program=1
746 +Verify=1
747 +ResetAndRun=0
748 +EnableFlashBreakpoint=1
749 +EnableLog=0
750 +MemAccessWhileRun=0
751 +RAMForAlgorithmStart=0x20000000
752 +RAMForAlgorithmSize=0x2000
753 +ProgramAlgorithm=M071_AP_128.FLM
754 +[M0564]
755 +Connect=0
756 +Reset=Autodetect
757 +MaxClock=1MHz
758 +MemoryVerify=0
759 +IOVoltage=3300
760 +FlashSelect=APROM
761 +Erase=1
762 +Program=1
763 +Verify=1
764 +ResetAndRun=0
765 +EnableFlashBreakpoint=1
766 +EnableLog=0
767 +MemAccessWhileRun=0
768 +RAMForAlgorithmStart=0x20000000
769 +RAMForAlgorithmSize=0x2000
770 +ProgramAlgorithm=M0564_AP_256.FLM
771 +[M0519]
772 +Connect=0
773 +Reset=Autodetect
774 +MaxClock=1MHz
775 +MemoryVerify=0
776 +IOVoltage=3300
777 +FlashSelect=APROM
778 +Erase=1
779 +Program=1
780 +Verify=1
781 +ResetAndRun=0
782 +EnableFlashBreakpoint=1
783 +EnableLog=0
784 +MemAccessWhileRun=0
785 +RAMForAlgorithmStart=0x20000000
786 +RAMForAlgorithmSize=0x1000
787 +ProgramAlgorithm=M0519_AP_128.FLM
788 +[M0518]
789 +Connect=0
790 +Reset=Autodetect
791 +MaxClock=1MHz
792 +MemoryVerify=0
793 +IOVoltage=3300
794 +FlashSelect=APROM
795 +Erase=1
796 +Program=1
797 +Verify=1
798 +ResetAndRun=0
799 +EnableFlashBreakpoint=1
800 +EnableLog=0
801 +MemAccessWhileRun=0
802 +RAMForAlgorithmStart=0x20000000
803 +RAMForAlgorithmSize=0x1000
804 +ProgramAlgorithm=M0518_AP_64.FLM
805 +[M05x]
806 +Connect=0
807 +Reset=Autodetect
808 +MaxClock=1MHz
809 +MemoryVerify=0
810 +IOVoltage=3300
811 +FlashSelect=APROM
812 +Erase=1
813 +Program=1
814 +Verify=1
815 +ResetAndRun=0
816 +EnableFlashBreakpoint=1
817 +EnableLog=0
818 +MemAccessWhileRun=0
819 +RAMForAlgorithmStart=0x20000000
820 +RAMForAlgorithmSize=0x800
821 +ProgramAlgorithm=M0516_AP_64.FLM
822 +[M0A21]
823 +Connect=0
824 +Reset=Autodetect
825 +MaxClock=1MHz
826 +MemoryVerify=0
827 +IOVoltage=3300
828 +FlashSelect=APROM
829 +Erase=1
830 +Program=1
831 +Verify=1
832 +ResetAndRun=1
833 +EnableFlashBreakpoint=0
834 +EnableLog=0
835 +MemAccessWhileRun=0
836 +RAMForAlgorithmStart=0x20000000
837 +RAMForAlgorithmSize=0x800
838 +ProgramAlgorithm=M0A21_AP_32.FLM
839 +[M030G]
840 +Connect=0
841 +Reset=Autodetect
842 +MaxClock=1MHz
843 +MemoryVerify=0
844 +IOVoltage=3300
845 +FlashSelect=APROM
846 +Erase=1
847 +Program=1
848 +Verify=1
849 +ResetAndRun=1
850 +EnableFlashBreakpoint=0
851 +EnableLog=0
852 +MemAccessWhileRun=0
853 +DisableTimeoutDetect=0
854 +RAMForAlgorithmStart=0x20000000
855 +RAMForAlgorithmSize=0x800
856 +ProgramAlgorithm=M030G_AP_64.FLM
857 +[M031]
858 +Connect=0
859 +Reset=Autodetect
860 +MaxClock=1MHz
861 +MemoryVerify=0
862 +IOVoltage=3300
863 +FlashSelect=APROM
864 +Bank=0
865 +Erase=1
866 +Program=1
867 +Verify=1
868 +ResetAndRun=1
869 +EnableFlashBreakpoint=0
870 +EnableLog=0
871 +MemAccessWhileRun=0
872 +RAMForAlgorithmStart=0x20000000
873 +RAMForAlgorithmSize=0x800
874 +ProgramAlgorithm=M031_AP_128.FLM
875 +[NPCX]
876 +Connect=0
877 +Reset=Autodetect
878 +MaxClock=1MHz
879 +MemoryVerify=0
880 +IOVoltage=3300
881 +FlashSelect=APROM
882 +Erase=1
883 +Program=1
884 +Verify=1
885 +ResetAndRun=0
886 +EnableFlashBreakpoint=0
887 +EnableLog=0
888 +MemAccessWhileRun=0
889 +RAMForAlgorithmStart=0x20000000
890 +RAMForAlgorithmSize=0x4000
891 +ProgramAlgorithm=NPCX_AP_512.FLM
892 +[I96000]
893 +Connect=0
894 +Reset=Autodetect
895 +MaxClock=1MHz
896 +MemoryVerify=0
897 +IOVoltage=3300
898 +Erase=2
899 +Program=0
900 +Verify=0
901 +ResetAndRun=0
902 +EnableLog=0
903 +MemAccessWhileRun=0
904 +RAMForAlgorithmStart=0x20000000
905 +RAMForAlgorithmSize=0x8000
906 +ProgramAlgorithm=
907 +[I94000]
908 +Connect=0
909 +Reset=Autodetect
910 +MaxClock=1MHz
911 +MemoryVerify=0
912 +IOVoltage=3300
913 +FlashSelect=APROM
914 +Erase=1
915 +Program=1
916 +Verify=1
917 +ResetAndRun=0
918 +EnableFlashBreakpoint=0
919 +EnableLog=0
920 +MemAccessWhileRun=0
921 +RAMForAlgorithmStart=0x20000000
922 +RAMForAlgorithmSize=0x4000
923 +ProgramAlgorithm=I94000_AP_512.FLM
924 +[ISD9300]
925 +Connect=0
926 +Reset=Autodetect
927 +MaxClock=1MHz
928 +MemoryVerify=0
929 +IOVoltage=3300
930 +FlashSelect=APROM
931 +Erase=1
932 +Program=1
933 +Verify=1
934 +ResetAndRun=0
935 +EnableFlashBreakpoint=0
936 +EnableLog=0
937 +MemAccessWhileRun=0
938 +RAMForAlgorithmStart=0x20000000
939 +RAMForAlgorithmSize=0x1000
940 +ProgramAlgorithm=ISD9300_AP_145.FLM
941 +[I9200]
942 +Connect=0
943 +Reset=Autodetect
944 +MaxClock=1MHz
945 +MemoryVerify=0
946 +IOVoltage=3300
947 +FlashSelect=APROM
948 +Erase=1
949 +Program=1
950 +Verify=1
951 +ResetAndRun=0
952 +EnableFlashBreakpoint=0
953 +EnableLog=0
954 +MemAccessWhileRun=0
955 +RAMForAlgorithmStart=0x20000000
956 +RAMForAlgorithmSize=0x1000
957 +ProgramAlgorithm=I9200_AP_128.FLM
958 +[ISD9xxx]
959 +Connect=0
960 +Reset=Autodetect
961 +MaxClock=1MHz
962 +MemoryVerify=0
963 +IOVoltage=3300
964 +FlashSelect=APROM
965 +Erase=1
966 +Program=1
967 +Verify=1
968 +ResetAndRun=0
969 +EnableFlashBreakpoint=0
970 +EnableLog=0
971 +MemAccessWhileRun=0
972 +RAMForAlgorithmStart=0x20000000
973 +RAMForAlgorithmSize=0x1000
974 +ProgramAlgorithm=ISD9100_AP_145.FLM
975 +[ISD9000]
976 +Connect=0
977 +Reset=Autodetect
978 +MaxClock=1MHz
979 +MemoryVerify=0
980 +IOVoltage=3300
981 +FlashSelect=APROM
982 +Erase=1
983 +Program=1
984 +Verify=1
985 +ResetAndRun=0
986 +EnableFlashBreakpoint=0
987 +EnableLog=0
988 +MemAccessWhileRun=0
989 +RAMForAlgorithmStart=0x20000000
990 +RAMForAlgorithmSize=0x1000
991 +ProgramAlgorithm=ISD9000_AP_64.FLM
992 +[AU9xxx]
993 +Connect=0
994 +Reset=Autodetect
995 +MaxClock=1MHz
996 +MemoryVerify=0
997 +IOVoltage=3300
998 +FlashSelect=APROM
999 +Erase=1
1000 +Program=1
1001 +Verify=1
1002 +ResetAndRun=0
1003 +EnableFlashBreakpoint=0
1004 +EnableLog=0
1005 +MemAccessWhileRun=0
1006 +RAMForAlgorithmStart=0x20000000
1007 +RAMForAlgorithmSize=0x1000
1008 +ProgramAlgorithm=AU9100_AP_145.FLM
1009 +[Autodetect]
1010 +Connect=0
1011 +Reset=Autodetect
1012 +MaxClock=1MHz
1013 +MemoryVerify=0
1014 +IOVoltage=3300
1015 +Erase=1
1016 +Program=1
1017 +Verify=1
1018 +ResetAndRun=0
1019 +EnableLog=0
1020 +MemAccessWhileRun=0
1021 +RAMForAlgorithmStart=0x20000000
1022 +RAMForAlgorithmSize=0x4000
1023 +ProgramAlgorithm=
1024 +[General]
1025 +Connect=0
1026 +Reset=Autodetect
1027 +MaxClock=1MHz
1028 +MemoryVerify=0
1029 +IOVoltage=3300
1030 +Erase=1
1031 +Program=1
1032 +Verify=1
1033 +ResetAndRun=0
1034 +EnableLog=0
1035 +MemAccessWhileRun=0
1036 +RAMForAlgorithmStart=0x20000000
1037 +RAMForAlgorithmSize=0x4000
1038 +ProgramAlgorithm=
1 +/*
2 + * Copyright (c) 2013-2018 Arm Limited. All rights reserved.
3 + *
4 + * SPDX-License-Identifier: Apache-2.0
5 + *
6 + * Licensed under the Apache License, Version 2.0 (the License); you may
7 + * not use this file except in compliance with the License.
8 + * You may obtain a copy of the License at
9 + *
10 + * www.apache.org/licenses/LICENSE-2.0
11 + *
12 + * Unless required by applicable law or agreed to in writing, software
13 + * distributed under the License is distributed on an AS IS BASIS, WITHOUT
14 + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 + * See the License for the specific language governing permissions and
16 + * limitations under the License.
17 + *
18 + * -----------------------------------------------------------------------------
19 + *
20 + * $Revision: V5.1.0
21 + *
22 + * Project: CMSIS-RTOS RTX
23 + * Title: RTX Configuration
24 + *
25 + * -----------------------------------------------------------------------------
26 + */
27 +
28 +#include "cmsis_compiler.h"
29 +#include "rtx_os.h"
30 +
31 +// OS Idle Thread
32 +__WEAK __NO_RETURN void osRtxIdleThread (void *argument) {
33 + (void)argument;
34 +
35 + for (;;) {}
36 +}
37 +
38 +// OS Error Callback function
39 +__WEAK uint32_t osRtxErrorNotify (uint32_t code, void *object_id) {
40 + (void)object_id;
41 +
42 + switch (code) {
43 + case osRtxErrorStackUnderflow:
44 + // Stack overflow detected for thread (thread_id=object_id)
45 + break;
46 + case osRtxErrorISRQueueOverflow:
47 + // ISR Queue overflow detected when inserting object (object_id)
48 + break;
49 + case osRtxErrorTimerQueueOverflow:
50 + // User Timer Callback Queue overflow detected for timer (timer_id=object_id)
51 + break;
52 + case osRtxErrorClibSpace:
53 + // Standard C/C++ library libspace not available: increase OS_THREAD_LIBSPACE_NUM
54 + break;
55 + case osRtxErrorClibMutex:
56 + // Standard C/C++ library mutex initialization failed
57 + break;
58 + default:
59 + // Reserved
60 + break;
61 + }
62 + for (;;) {}
63 +//return 0U;
64 +}
1 +/*
2 + * Copyright (c) 2013-2020 Arm Limited. All rights reserved.
3 + *
4 + * SPDX-License-Identifier: Apache-2.0
5 + *
6 + * Licensed under the Apache License, Version 2.0 (the License); you may
7 + * not use this file except in compliance with the License.
8 + * You may obtain a copy of the License at
9 + *
10 + * www.apache.org/licenses/LICENSE-2.0
11 + *
12 + * Unless required by applicable law or agreed to in writing, software
13 + * distributed under the License is distributed on an AS IS BASIS, WITHOUT
14 + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 + * See the License for the specific language governing permissions and
16 + * limitations under the License.
17 + *
18 + * -----------------------------------------------------------------------------
19 + *
20 + * $Revision: V5.5.1
21 + *
22 + * Project: CMSIS-RTOS RTX
23 + * Title: RTX Configuration definitions
24 + *
25 + * -----------------------------------------------------------------------------
26 + */
27 +
28 +#ifndef RTX_CONFIG_H_
29 +#define RTX_CONFIG_H_
30 +
31 +#ifdef _RTE_
32 +#include "RTE_Components.h"
33 +#ifdef RTE_RTX_CONFIG_H
34 +#include RTE_RTX_CONFIG_H
35 +#endif
36 +#endif
37 +
38 +//-------- <<< Use Configuration Wizard in Context Menu >>> --------------------
39 +
40 +// <h>System Configuration
41 +// =======================
42 +
43 +// <o>Global Dynamic Memory size [bytes] <0-1073741824:8>
44 +// <i> Defines the combined global dynamic memory size.
45 +// <i> Default: 32768
46 +#ifndef OS_DYNAMIC_MEM_SIZE
47 +#define OS_DYNAMIC_MEM_SIZE 32768
48 +#endif
49 +
50 +// <o>Kernel Tick Frequency [Hz] <1-1000000>
51 +// <i> Defines base time unit for delays and timeouts.
52 +// <i> Default: 1000 (1ms tick)
53 +#ifndef OS_TICK_FREQ
54 +#define OS_TICK_FREQ 1000
55 +#endif
56 +
57 +// <e>Round-Robin Thread switching
58 +// <i> Enables Round-Robin Thread switching.
59 +#ifndef OS_ROBIN_ENABLE
60 +#define OS_ROBIN_ENABLE 1
61 +#endif
62 +
63 +// <o>Round-Robin Timeout <1-1000>
64 +// <i> Defines how many ticks a thread will execute before a thread switch.
65 +// <i> Default: 5
66 +#ifndef OS_ROBIN_TIMEOUT
67 +#define OS_ROBIN_TIMEOUT 5
68 +#endif
69 +
70 +// </e>
71 +
72 +// <o>ISR FIFO Queue
73 +// <4=> 4 entries <8=> 8 entries <12=> 12 entries <16=> 16 entries
74 +// <24=> 24 entries <32=> 32 entries <48=> 48 entries <64=> 64 entries
75 +// <96=> 96 entries <128=> 128 entries <196=> 196 entries <256=> 256 entries
76 +// <i> RTOS Functions called from ISR store requests to this buffer.
77 +// <i> Default: 16 entries
78 +#ifndef OS_ISR_FIFO_QUEUE
79 +#define OS_ISR_FIFO_QUEUE 16
80 +#endif
81 +
82 +// <q>Object Memory usage counters
83 +// <i> Enables object memory usage counters (requires RTX source variant).
84 +#ifndef OS_OBJ_MEM_USAGE
85 +#define OS_OBJ_MEM_USAGE 0
86 +#endif
87 +
88 +// </h>
89 +
90 +// <h>Thread Configuration
91 +// =======================
92 +
93 +// <e>Object specific Memory allocation
94 +// <i> Enables object specific memory allocation.
95 +#ifndef OS_THREAD_OBJ_MEM
96 +#define OS_THREAD_OBJ_MEM 0
97 +#endif
98 +
99 +// <o>Number of user Threads <1-1000>
100 +// <i> Defines maximum number of user threads that can be active at the same time.
101 +// <i> Applies to user threads with system provided memory for control blocks.
102 +#ifndef OS_THREAD_NUM
103 +#define OS_THREAD_NUM 1
104 +#endif
105 +
106 +// <o>Number of user Threads with default Stack size <0-1000>
107 +// <i> Defines maximum number of user threads with default stack size.
108 +// <i> Applies to user threads with zero stack size specified.
109 +#ifndef OS_THREAD_DEF_STACK_NUM
110 +#define OS_THREAD_DEF_STACK_NUM 0
111 +#endif
112 +
113 +// <o>Total Stack size [bytes] for user Threads with user-provided Stack size <0-1073741824:8>
114 +// <i> Defines the combined stack size for user threads with user-provided stack size.
115 +// <i> Applies to user threads with user-provided stack size and system provided memory for stack.
116 +// <i> Default: 0
117 +#ifndef OS_THREAD_USER_STACK_SIZE
118 +#define OS_THREAD_USER_STACK_SIZE 0
119 +#endif
120 +
121 +// </e>
122 +
123 +// <o>Default Thread Stack size [bytes] <96-1073741824:8>
124 +// <i> Defines stack size for threads with zero stack size specified.
125 +// <i> Default: 3072
126 +#ifndef OS_STACK_SIZE
127 +#define OS_STACK_SIZE 3072
128 +#endif
129 +
130 +// <o>Idle Thread Stack size [bytes] <72-1073741824:8>
131 +// <i> Defines stack size for Idle thread.
132 +// <i> Default: 512
133 +#ifndef OS_IDLE_THREAD_STACK_SIZE
134 +#define OS_IDLE_THREAD_STACK_SIZE 512
135 +#endif
136 +
137 +// <o>Idle Thread TrustZone Module Identifier
138 +// <i> Defines TrustZone Thread Context Management Identifier.
139 +// <i> Applies only to cores with TrustZone technology.
140 +// <i> Default: 0 (not used)
141 +#ifndef OS_IDLE_THREAD_TZ_MOD_ID
142 +#define OS_IDLE_THREAD_TZ_MOD_ID 0
143 +#endif
144 +
145 +// <q>Stack overrun checking
146 +// <i> Enables stack overrun check at thread switch.
147 +// <i> Enabling this option increases slightly the execution time of a thread switch.
148 +#ifndef OS_STACK_CHECK
149 +#define OS_STACK_CHECK 1
150 +#endif
151 +
152 +// <q>Stack usage watermark
153 +// <i> Initializes thread stack with watermark pattern for analyzing stack usage.
154 +// <i> Enabling this option increases significantly the execution time of thread creation.
155 +#ifndef OS_STACK_WATERMARK
156 +#define OS_STACK_WATERMARK 0
157 +#endif
158 +
159 +// <o>Processor mode for Thread execution
160 +// <0=> Unprivileged mode
161 +// <1=> Privileged mode
162 +// <i> Default: Privileged mode
163 +#ifndef OS_PRIVILEGE_MODE
164 +#define OS_PRIVILEGE_MODE 1
165 +#endif
166 +
167 +// </h>
168 +
169 +// <h>Timer Configuration
170 +// ======================
171 +
172 +// <e>Object specific Memory allocation
173 +// <i> Enables object specific memory allocation.
174 +#ifndef OS_TIMER_OBJ_MEM
175 +#define OS_TIMER_OBJ_MEM 0
176 +#endif
177 +
178 +// <o>Number of Timer objects <1-1000>
179 +// <i> Defines maximum number of objects that can be active at the same time.
180 +// <i> Applies to objects with system provided memory for control blocks.
181 +#ifndef OS_TIMER_NUM
182 +#define OS_TIMER_NUM 1
183 +#endif
184 +
185 +// </e>
186 +
187 +// <o>Timer Thread Priority
188 +// <8=> Low
189 +// <16=> Below Normal <24=> Normal <32=> Above Normal
190 +// <40=> High
191 +// <48=> Realtime
192 +// <i> Defines priority for timer thread
193 +// <i> Default: High
194 +#ifndef OS_TIMER_THREAD_PRIO
195 +#define OS_TIMER_THREAD_PRIO 40
196 +#endif
197 +
198 +// <o>Timer Thread Stack size [bytes] <0-1073741824:8>
199 +// <i> Defines stack size for Timer thread.
200 +// <i> May be set to 0 when timers are not used.
201 +// <i> Default: 512
202 +#ifndef OS_TIMER_THREAD_STACK_SIZE
203 +#define OS_TIMER_THREAD_STACK_SIZE 512
204 +#endif
205 +
206 +// <o>Timer Thread TrustZone Module Identifier
207 +// <i> Defines TrustZone Thread Context Management Identifier.
208 +// <i> Applies only to cores with TrustZone technology.
209 +// <i> Default: 0 (not used)
210 +#ifndef OS_TIMER_THREAD_TZ_MOD_ID
211 +#define OS_TIMER_THREAD_TZ_MOD_ID 0
212 +#endif
213 +
214 +// <o>Timer Callback Queue entries <0-256>
215 +// <i> Number of concurrent active timer callback functions.
216 +// <i> May be set to 0 when timers are not used.
217 +// <i> Default: 4
218 +#ifndef OS_TIMER_CB_QUEUE
219 +#define OS_TIMER_CB_QUEUE 4
220 +#endif
221 +
222 +// </h>
223 +
224 +// <h>Event Flags Configuration
225 +// ============================
226 +
227 +// <e>Object specific Memory allocation
228 +// <i> Enables object specific memory allocation.
229 +#ifndef OS_EVFLAGS_OBJ_MEM
230 +#define OS_EVFLAGS_OBJ_MEM 0
231 +#endif
232 +
233 +// <o>Number of Event Flags objects <1-1000>
234 +// <i> Defines maximum number of objects that can be active at the same time.
235 +// <i> Applies to objects with system provided memory for control blocks.
236 +#ifndef OS_EVFLAGS_NUM
237 +#define OS_EVFLAGS_NUM 1
238 +#endif
239 +
240 +// </e>
241 +
242 +// </h>
243 +
244 +// <h>Mutex Configuration
245 +// ======================
246 +
247 +// <e>Object specific Memory allocation
248 +// <i> Enables object specific memory allocation.
249 +#ifndef OS_MUTEX_OBJ_MEM
250 +#define OS_MUTEX_OBJ_MEM 0
251 +#endif
252 +
253 +// <o>Number of Mutex objects <1-1000>
254 +// <i> Defines maximum number of objects that can be active at the same time.
255 +// <i> Applies to objects with system provided memory for control blocks.
256 +#ifndef OS_MUTEX_NUM
257 +#define OS_MUTEX_NUM 1
258 +#endif
259 +
260 +// </e>
261 +
262 +// </h>
263 +
264 +// <h>Semaphore Configuration
265 +// ==========================
266 +
267 +// <e>Object specific Memory allocation
268 +// <i> Enables object specific memory allocation.
269 +#ifndef OS_SEMAPHORE_OBJ_MEM
270 +#define OS_SEMAPHORE_OBJ_MEM 0
271 +#endif
272 +
273 +// <o>Number of Semaphore objects <1-1000>
274 +// <i> Defines maximum number of objects that can be active at the same time.
275 +// <i> Applies to objects with system provided memory for control blocks.
276 +#ifndef OS_SEMAPHORE_NUM
277 +#define OS_SEMAPHORE_NUM 1
278 +#endif
279 +
280 +// </e>
281 +
282 +// </h>
283 +
284 +// <h>Memory Pool Configuration
285 +// ============================
286 +
287 +// <e>Object specific Memory allocation
288 +// <i> Enables object specific memory allocation.
289 +#ifndef OS_MEMPOOL_OBJ_MEM
290 +#define OS_MEMPOOL_OBJ_MEM 0
291 +#endif
292 +
293 +// <o>Number of Memory Pool objects <1-1000>
294 +// <i> Defines maximum number of objects that can be active at the same time.
295 +// <i> Applies to objects with system provided memory for control blocks.
296 +#ifndef OS_MEMPOOL_NUM
297 +#define OS_MEMPOOL_NUM 1
298 +#endif
299 +
300 +// <o>Data Storage Memory size [bytes] <0-1073741824:8>
301 +// <i> Defines the combined data storage memory size.
302 +// <i> Applies to objects with system provided memory for data storage.
303 +// <i> Default: 0
304 +#ifndef OS_MEMPOOL_DATA_SIZE
305 +#define OS_MEMPOOL_DATA_SIZE 0
306 +#endif
307 +
308 +// </e>
309 +
310 +// </h>
311 +
312 +// <h>Message Queue Configuration
313 +// ==============================
314 +
315 +// <e>Object specific Memory allocation
316 +// <i> Enables object specific memory allocation.
317 +#ifndef OS_MSGQUEUE_OBJ_MEM
318 +#define OS_MSGQUEUE_OBJ_MEM 0
319 +#endif
320 +
321 +// <o>Number of Message Queue objects <1-1000>
322 +// <i> Defines maximum number of objects that can be active at the same time.
323 +// <i> Applies to objects with system provided memory for control blocks.
324 +#ifndef OS_MSGQUEUE_NUM
325 +#define OS_MSGQUEUE_NUM 1
326 +#endif
327 +
328 +// <o>Data Storage Memory size [bytes] <0-1073741824:8>
329 +// <i> Defines the combined data storage memory size.
330 +// <i> Applies to objects with system provided memory for data storage.
331 +// <i> Default: 0
332 +#ifndef OS_MSGQUEUE_DATA_SIZE
333 +#define OS_MSGQUEUE_DATA_SIZE 0
334 +#endif
335 +
336 +// </e>
337 +
338 +// </h>
339 +
340 +// <h>Event Recorder Configuration
341 +// ===============================
342 +
343 +// <e>Global Initialization
344 +// <i> Initialize Event Recorder during 'osKernelInitialize'.
345 +#ifndef OS_EVR_INIT
346 +#define OS_EVR_INIT 0
347 +#endif
348 +
349 +// <q>Start recording
350 +// <i> Start event recording after initialization.
351 +#ifndef OS_EVR_START
352 +#define OS_EVR_START 1
353 +#endif
354 +
355 +// <h>Global Event Filter Setup
356 +// <i> Initial recording level applied to all components.
357 +// <o.0>Error events
358 +// <o.1>API function call events
359 +// <o.2>Operation events
360 +// <o.3>Detailed operation events
361 +// </h>
362 +#ifndef OS_EVR_LEVEL
363 +#define OS_EVR_LEVEL 0x00U
364 +#endif
365 +
366 +// <h>RTOS Event Filter Setup
367 +// <i> Recording levels for RTX components.
368 +// <i> Only applicable if events for the respective component are generated.
369 +
370 +// <h>Memory Management
371 +// <i> Recording level for Memory Management events.
372 +// <o.0>Error events
373 +// <o.1>API function call events
374 +// <o.2>Operation events
375 +// <o.3>Detailed operation events
376 +// </h>
377 +#ifndef OS_EVR_MEMORY_LEVEL
378 +#define OS_EVR_MEMORY_LEVEL 0x01U
379 +#endif
380 +
381 +// <h>Kernel
382 +// <i> Recording level for Kernel events.
383 +// <o.0>Error events
384 +// <o.1>API function call events
385 +// <o.2>Operation events
386 +// <o.3>Detailed operation events
387 +// </h>
388 +#ifndef OS_EVR_KERNEL_LEVEL
389 +#define OS_EVR_KERNEL_LEVEL 0x01U
390 +#endif
391 +
392 +// <h>Thread
393 +// <i> Recording level for Thread events.
394 +// <o.0>Error events
395 +// <o.1>API function call events
396 +// <o.2>Operation events
397 +// <o.3>Detailed operation events
398 +// </h>
399 +#ifndef OS_EVR_THREAD_LEVEL
400 +#define OS_EVR_THREAD_LEVEL 0x05U
401 +#endif
402 +
403 +// <h>Generic Wait
404 +// <i> Recording level for Generic Wait events.
405 +// <o.0>Error events
406 +// <o.1>API function call events
407 +// <o.2>Operation events
408 +// <o.3>Detailed operation events
409 +// </h>
410 +#ifndef OS_EVR_WAIT_LEVEL
411 +#define OS_EVR_WAIT_LEVEL 0x01U
412 +#endif
413 +
414 +// <h>Thread Flags
415 +// <i> Recording level for Thread Flags events.
416 +// <o.0>Error events
417 +// <o.1>API function call events
418 +// <o.2>Operation events
419 +// <o.3>Detailed operation events
420 +// </h>
421 +#ifndef OS_EVR_THFLAGS_LEVEL
422 +#define OS_EVR_THFLAGS_LEVEL 0x01U
423 +#endif
424 +
425 +// <h>Event Flags
426 +// <i> Recording level for Event Flags events.
427 +// <o.0>Error events
428 +// <o.1>API function call events
429 +// <o.2>Operation events
430 +// <o.3>Detailed operation events
431 +// </h>
432 +#ifndef OS_EVR_EVFLAGS_LEVEL
433 +#define OS_EVR_EVFLAGS_LEVEL 0x01U
434 +#endif
435 +
436 +// <h>Timer
437 +// <i> Recording level for Timer events.
438 +// <o.0>Error events
439 +// <o.1>API function call events
440 +// <o.2>Operation events
441 +// <o.3>Detailed operation events
442 +// </h>
443 +#ifndef OS_EVR_TIMER_LEVEL
444 +#define OS_EVR_TIMER_LEVEL 0x01U
445 +#endif
446 +
447 +// <h>Mutex
448 +// <i> Recording level for Mutex events.
449 +// <o.0>Error events
450 +// <o.1>API function call events
451 +// <o.2>Operation events
452 +// <o.3>Detailed operation events
453 +// </h>
454 +#ifndef OS_EVR_MUTEX_LEVEL
455 +#define OS_EVR_MUTEX_LEVEL 0x01U
456 +#endif
457 +
458 +// <h>Semaphore
459 +// <i> Recording level for Semaphore events.
460 +// <o.0>Error events
461 +// <o.1>API function call events
462 +// <o.2>Operation events
463 +// <o.3>Detailed operation events
464 +// </h>
465 +#ifndef OS_EVR_SEMAPHORE_LEVEL
466 +#define OS_EVR_SEMAPHORE_LEVEL 0x01U
467 +#endif
468 +
469 +// <h>Memory Pool
470 +// <i> Recording level for Memory Pool events.
471 +// <o.0>Error events
472 +// <o.1>API function call events
473 +// <o.2>Operation events
474 +// <o.3>Detailed operation events
475 +// </h>
476 +#ifndef OS_EVR_MEMPOOL_LEVEL
477 +#define OS_EVR_MEMPOOL_LEVEL 0x01U
478 +#endif
479 +
480 +// <h>Message Queue
481 +// <i> Recording level for Message Queue events.
482 +// <o.0>Error events
483 +// <o.1>API function call events
484 +// <o.2>Operation events
485 +// <o.3>Detailed operation events
486 +// </h>
487 +#ifndef OS_EVR_MSGQUEUE_LEVEL
488 +#define OS_EVR_MSGQUEUE_LEVEL 0x01U
489 +#endif
490 +
491 +// </h>
492 +
493 +// </e>
494 +
495 +// <h>RTOS Event Generation
496 +// <i> Enables event generation for RTX components (requires RTX source variant).
497 +
498 +// <q>Memory Management
499 +// <i> Enables Memory Management event generation.
500 +#ifndef OS_EVR_MEMORY
501 +#define OS_EVR_MEMORY 1
502 +#endif
503 +
504 +// <q>Kernel
505 +// <i> Enables Kernel event generation.
506 +#ifndef OS_EVR_KERNEL
507 +#define OS_EVR_KERNEL 1
508 +#endif
509 +
510 +// <q>Thread
511 +// <i> Enables Thread event generation.
512 +#ifndef OS_EVR_THREAD
513 +#define OS_EVR_THREAD 1
514 +#endif
515 +
516 +// <q>Generic Wait
517 +// <i> Enables Generic Wait event generation.
518 +#ifndef OS_EVR_WAIT
519 +#define OS_EVR_WAIT 1
520 +#endif
521 +
522 +// <q>Thread Flags
523 +// <i> Enables Thread Flags event generation.
524 +#ifndef OS_EVR_THFLAGS
525 +#define OS_EVR_THFLAGS 1
526 +#endif
527 +
528 +// <q>Event Flags
529 +// <i> Enables Event Flags event generation.
530 +#ifndef OS_EVR_EVFLAGS
531 +#define OS_EVR_EVFLAGS 1
532 +#endif
533 +
534 +// <q>Timer
535 +// <i> Enables Timer event generation.
536 +#ifndef OS_EVR_TIMER
537 +#define OS_EVR_TIMER 1
538 +#endif
539 +
540 +// <q>Mutex
541 +// <i> Enables Mutex event generation.
542 +#ifndef OS_EVR_MUTEX
543 +#define OS_EVR_MUTEX 1
544 +#endif
545 +
546 +// <q>Semaphore
547 +// <i> Enables Semaphore event generation.
548 +#ifndef OS_EVR_SEMAPHORE
549 +#define OS_EVR_SEMAPHORE 1
550 +#endif
551 +
552 +// <q>Memory Pool
553 +// <i> Enables Memory Pool event generation.
554 +#ifndef OS_EVR_MEMPOOL
555 +#define OS_EVR_MEMPOOL 1
556 +#endif
557 +
558 +// <q>Message Queue
559 +// <i> Enables Message Queue event generation.
560 +#ifndef OS_EVR_MSGQUEUE
561 +#define OS_EVR_MSGQUEUE 1
562 +#endif
563 +
564 +// </h>
565 +
566 +// </h>
567 +
568 +// Number of Threads which use standard C/C++ library libspace
569 +// (when thread specific memory allocation is not used).
570 +#if (OS_THREAD_OBJ_MEM == 0)
571 +#ifndef OS_THREAD_LIBSPACE_NUM
572 +#define OS_THREAD_LIBSPACE_NUM 4
573 +#endif
574 +#else
575 +#define OS_THREAD_LIBSPACE_NUM OS_THREAD_NUM
576 +#endif
577 +
578 +//------------- <<< end of configuration section >>> ---------------------------
579 +
580 +#endif // RTX_CONFIG_H_
1 +/**************************************************************************//**
2 + * @file retarget.c
3 + * @version V3.00
4 + * @brief Debug Port and Semihost Setting Source File
5 + *
6 + * @note
7 + * SPDX-License-Identifier: Apache-2.0
8 + * Copyright (C) 2016-2020 Nuvoton Technology Corp. All rights reserved.
9 + *
10 + ******************************************************************************/
11 +
12 +
13 +#include <stdio.h>
14 +#include "NuMicro.h"
15 +
16 +#if defined (__ICCARM__)
17 +# pragma diag_suppress=Pm150
18 +#endif
19 +
20 +
21 +#if defined ( __CC_ARM )
22 +#if (__ARMCC_VERSION < 400000)
23 +#else
24 +/* Insist on keeping widthprec, to avoid X propagation by benign code in C-lib */
25 +#pragma import _printf_widthprec
26 +#endif
27 +#endif
28 +
29 +/*---------------------------------------------------------------------------------------------------------*/
30 +/* Global variables */
31 +/*---------------------------------------------------------------------------------------------------------*/
32 +#if !(defined(__ICCARM__) && (__VER__ >= 6010000))
33 +# if (__ARMCC_VERSION < 6040000)
34 +struct __FILE
35 +{
36 + int handle; /* Add whatever you need here */
37 +};
38 +# endif
39 +#elif(__VER__ >= 8000000)
40 +struct __FILE
41 +{
42 + int handle; /* Add whatever you need here */
43 +};
44 +#endif
45 +FILE __stdout;
46 +FILE __stdin;
47 +
48 +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION > 6040000)
49 +# if !defined(__MICROLIB)
50 +__asm(".global __ARM_use_no_argv\n\t" "__ARM_use_no_argv:\n\t");
51 +# endif
52 +#endif
53 +
54 +
55 +#if (defined(__ARMCC_VERSION) || defined(__ICCARM__))
56 +extern int32_t SH_DoCommand(int32_t n32In_R0, int32_t n32In_R1, int32_t *pn32Out_R0);
57 +
58 +#if defined( __ICCARM__ )
59 +__WEAK
60 +#else
61 +__attribute__((weak))
62 +#endif
63 +uint32_t ProcessHardFault(uint32_t lr, uint32_t msp, uint32_t psp);
64 +
65 +#endif
66 +
67 +#pragma pack(push)
68 +#pragma pack(1)
69 +typedef struct {
70 + char *name;
71 + uint32_t u32Addr;
72 + uint8_t u8NSIdx;
73 +} IP_T;
74 +#pragma pack(pop)
75 +
76 +#ifndef DEBUG_ENABLE_SEMIHOST
77 +static IP_T s_IpTbl[] = {
78 +{"SYS",SYS_BASE,0},
79 +{"CLK",CLK_BASE,0},
80 +{"INT",INT_BASE,0},
81 +{"GPIOA",GPIOA_BASE,224+0},
82 +{"GPIOB",GPIOB_BASE,224+1},
83 +{"GPIOC",GPIOC_BASE,224+2},
84 +{"GPIOD",GPIOD_BASE,224+3},
85 +{"GPIOE",GPIOE_BASE,224+4},
86 +{"GPIOF",GPIOF_BASE,224+5},
87 +{"GPIOG",GPIOG_BASE,224+6},
88 +{"GPIOH",GPIOH_BASE,224+7},
89 +{"GPIO_DBCTL",GPIO_DBCTL_BASE,0},
90 +{"PA",GPIO_PIN_DATA_BASE ,224+0},
91 +{"PB",GPIO_PIN_DATA_BASE+16*4 ,224+0},
92 +{"PC",GPIO_PIN_DATA_BASE+2*16*4,224+0},
93 +{"PD",GPIO_PIN_DATA_BASE+3*16*4,224+0},
94 +{"PE",GPIO_PIN_DATA_BASE+4*16*4,224+0},
95 +{"PF",GPIO_PIN_DATA_BASE+5*16*4,224+0},
96 +{"PG",GPIO_PIN_DATA_BASE+6*16*4,224+0},
97 +{"PH",GPIO_PIN_DATA_BASE+7*16*4,224+0},
98 +{"PDMA0",PDMA0_BASE,0},
99 +{"PDMA1",PDMA1_BASE,PDMA1_Attr},
100 +{"USBH",USBH_BASE,USBH_Attr},
101 +{"FMC",FMC_BASE,0},
102 +{"SDH0",SDH0_BASE,SDH0_Attr},
103 +{"EBI",EBI_BASE,EBI_Attr},
104 +{"SCU",SCU_BASE,0},
105 +{"CRC",CRC_BASE,CRC_Attr},
106 +{"CRPT",CRPT_BASE,CRPT_Attr},
107 +{"WDT",WDT_BASE,0},
108 +{"WWDT",WWDT_BASE,0},
109 +{"RTC",RTC_BASE,RTC_Attr},
110 +{"EADC",EADC_BASE,EADC_Attr},
111 +{"ACMP01",ACMP01_BASE,ACMP01_Attr},
112 +{"DAC0",DAC0_BASE,DAC_Attr},
113 +{"DAC1",DAC1_BASE,DAC_Attr},
114 +{"I2S0",I2S0_BASE,I2S0_Attr},
115 +{"OTG",OTG_BASE,OTG_Attr},
116 +{"TMR01",TMR01_BASE,0},
117 +{"TMR23",TMR23_BASE,TMR23_Attr},
118 +{"EPWM0",EPWM0_BASE,EPWM0_Attr},
119 +{"EPWM1",EPWM1_BASE,EPWM1_Attr},
120 +{"BPWM0",BPWM0_BASE,BPWM0_Attr},
121 +{"BPWM1",BPWM1_BASE,BPWM1_Attr},
122 +{"QSPI0",QSPI0_BASE,QSPI0_Attr},
123 +{"SPI0",SPI0_BASE,SPI0_Attr},
124 +{"SPI1",SPI1_BASE,SPI1_Attr},
125 +{"SPI2",SPI2_BASE,SPI2_Attr},
126 +{"SPI3",SPI3_BASE,SPI3_Attr},
127 +{"UART0",UART0_BASE,UART0_Attr},
128 +{"UART1",UART1_BASE,UART1_Attr},
129 +{"UART2",UART2_BASE,UART2_Attr},
130 +{"UART3",UART3_BASE,UART3_Attr},
131 +{"UART4",UART4_BASE,UART4_Attr},
132 +{"UART5",UART5_BASE,UART5_Attr},
133 +{"I2C0",I2C0_BASE,I2C0_Attr},
134 +{"I2C1",I2C1_BASE,I2C1_Attr},
135 +{"I2C2",I2C2_BASE,I2C2_Attr},
136 +{"SC0",SC0_BASE,SC0_Attr},
137 +{"SC1",SC1_BASE,SC1_Attr},
138 +{"SC2",SC2_BASE,SC2_Attr},
139 +{"CAN0",CAN0_BASE,CAN0_Attr},
140 +{"QEI0",QEI0_BASE,QEI0_Attr},
141 +{"QEI1",QEI1_BASE,QEI1_Attr},
142 +{"ECAP0",ECAP0_BASE,ECAP0_Attr},
143 +{"ECAP1",ECAP1_BASE,ECAP1_Attr},
144 +{"TRNG",TRNG_BASE,TRNG_Attr},
145 +{"USBD",USBD_BASE,USBD_Attr},
146 +{"USCI0",USCI0_BASE, USCI0_Attr},
147 +{"USCI1",USCI1_BASE, USCI1_Attr},
148 +{0,USCI1_BASE+4096, 0},
149 +};
150 +#endif
151 +
152 +int kbhit(void);
153 +int IsDebugFifoEmpty(void);
154 +void _ttywrch(int ch);
155 +int fputc(int ch, FILE *stream);
156 +
157 +#if (defined(__ARMCC_VERSION) || defined(__ICCARM__))
158 +int fgetc(FILE *stream);
159 +int ferror(FILE *stream);
160 +#endif
161 +
162 +char GetChar(void);
163 +void SendChar_ToUART(int ch);
164 +void SendChar(int ch);
165 +int32_t SH_Return(int32_t n32In_R0, int32_t n32In_R1, int32_t *pn32Out_R0);
166 +void _sys_exit(int return_code)__attribute__((noreturn));
167 +
168 +#if (defined(DEBUG_ENABLE_SEMIHOST) || defined(OS_USE_SEMIHOSTING))
169 +#if (defined(__ARMCC_VERSION) || defined(__ICCARM__) || defined(__GNUC__))
170 +/* The static buffer is used to speed up the semihost */
171 +static char g_buf[16];
172 +static char g_buf_len = 0;
173 +static volatile int32_t g_ICE_Conneced = 1;
174 +
175 +/**
176 + * @brief This function is called by Hardfault handler.
177 + * @param None
178 + * @returns None
179 + * @details This function is called by Hardfault handler and check if it is caused by __BKPT or not.
180 + *
181 + */
182 +
183 +uint32_t ProcessHardFault(uint32_t lr, uint32_t msp, uint32_t psp)
184 +{
185 + uint32_t *sp = 0;
186 + uint32_t inst;
187 +
188 + /* Check the used stack */
189 + if(lr & 0x40)
190 + {
191 + /* Secure stack used */
192 + if(lr & 4)
193 + sp = (uint32_t *)psp;
194 + else
195 + sp = (uint32_t *)msp;
196 +
197 + }
198 +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
199 + else
200 + {
201 + /* Non-secure stack used */
202 + if(lr & 4)
203 + sp = (uint32_t *)__TZ_get_PSP_NS();
204 + else
205 + sp = (uint32_t *)__TZ_get_MSP_NS();
206 +
207 + }
208 +#endif
209 +
210 + if (sp != 0)
211 + {
212 + /* Get the instruction caused the hardfault */
213 + inst = M16(sp[6]);
214 +
215 +
216 + if(inst == 0xBEAB)
217 + {
218 + /*
219 + If the instruction is 0xBEAB, it means it is caused by BKPT without ICE connected.
220 + We still return for output/input message to UART.
221 + */
222 + g_ICE_Conneced = 0; // Set a flag for ICE offline
223 + sp[6] += 2; // return to next instruction
224 + return lr; // Keep lr in R0
225 + }
226 + }
227 +
228 + /* It is casued by hardfault (Not semihost). Just process the hard fault here. */
229 + /* TODO: Implement your hardfault handle code here */
230 +
231 + /*
232 + printf(" HardFault!\n\n");
233 + printf("r0 = 0x%x\n", sp[0]);
234 + printf("r1 = 0x%x\n", sp[1]);
235 + printf("r2 = 0x%x\n", sp[2]);
236 + printf("r3 = 0x%x\n", sp[3]);
237 + printf("r12 = 0x%x\n", sp[4]);
238 + printf("lr = 0x%x\n", sp[5]);
239 + printf("pc = 0x%x\n", sp[6]);
240 + printf("psr = 0x%x\n", sp[7]);
241 + */
242 +
243 + while(1){}
244 +
245 +}
246 +
247 +
248 +
249 +/**
250 + *
251 + * @brief The function to process semihosted command
252 + * @param[in] n32In_R0 : semihost register 0
253 + * @param[in] n32In_R1 : semihost register 1
254 + * @param[out] pn32Out_R0: semihost register 0
255 + * @retval 0: No ICE debug
256 + * @retval 1: ICE debug
257 + *
258 + */
259 +
260 +int32_t SH_Return(int32_t n32In_R0, int32_t n32In_R1, int32_t *pn32Out_R0)
261 +{
262 + (void)n32In_R1;
263 + if(g_ICE_Conneced)
264 + {
265 + if(pn32Out_R0)
266 + *pn32Out_R0 = n32In_R0;
267 +
268 + return 1;
269 + }
270 + return 0;
271 +}
272 +
273 +
274 +
275 +#endif
276 +#else // defined(DEBUG_ENABLE_SEMIHOST)
277 +
278 +int32_t SH_Return(int32_t n32In_R0, int32_t n32In_R1, int32_t *pn32Out_R0);
279 +
280 +#if defined( __ICCARM__ )
281 +__WEAK
282 +#else
283 +__attribute__((weak))
284 +#endif
285 +uint32_t ProcessHardFault(uint32_t lr, uint32_t msp, uint32_t psp)
286 +{
287 + extern void SCU_IRQHandler(void);
288 + uint32_t *sp = 0ul;
289 + uint32_t i;
290 + uint32_t inst, addr,taddr = 0ul,tdata;
291 + int32_t secure;
292 + uint32_t rm,rn,rt, imm5, imm8;
293 + int32_t eFlag;
294 + uint8_t idx, bit;
295 + int32_t s;
296 +
297 + /* Check the used stack */
298 + secure = (lr & 0x40ul)?1ul:0ul;
299 + if(secure)
300 + {
301 + /* Secure stack used */
302 + if(lr & 4UL)
303 + {
304 + sp = (uint32_t *)psp;
305 + }
306 + else
307 + {
308 + sp = (uint32_t *)msp;
309 + }
310 +
311 + }
312 +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)
313 + else
314 + {
315 + /* Non-secure stack used */
316 + if(lr & 4)
317 + sp = (uint32_t *)(uint32_t)__TZ_get_PSP_NS();
318 + else
319 + sp = (uint32_t *)(uint32_t)__TZ_get_MSP_NS();
320 +
321 + }
322 +#endif
323 +
324 + /*
325 + r0 = sp[0]
326 + r1 = sp[1]
327 + r2 = sp[2]
328 + r3 = sp[3]
329 + r12 = sp[4]
330 + lr = sp[5]
331 + pc = sp[6]
332 + psr = sp[7]
333 + */
334 +
335 + printf("!!---------------------------------------------------------------!!\n");
336 + printf(" <<< HardFault >>>\n");
337 + /* Get the instruction caused the hardfault */
338 + addr = sp[6];
339 + inst = M16(addr);
340 + eFlag = 0;
341 + if((!secure) && ((addr & NS_OFFSET) == 0) )
342 + {
343 + printf(" Non-secure CPU try to fetch secure code in 0x%x\n", addr);
344 + printf(" Try to check NSC region or SAU settings.\n");
345 +
346 + eFlag = 1;
347 + }else if(inst == 0xBEAB)
348 + {
349 + printf(" Execute BKPT without ICE connected\n");
350 + eFlag = 2;
351 + }
352 + else if((inst >> 12) == 5)
353 + {
354 + eFlag = 3;
355 + /* 0101xx Load/store (register offset) on page C2-327 of armv8m ref */
356 + rm = (inst >> 6) & 0x7;
357 + rn = (inst >> 3) & 0x7;
358 + rt = inst & 0x7;
359 +
360 + taddr = sp[rn] + sp[rm];
361 + tdata = sp[rt];
362 + if(rn == rt)
363 + {
364 + printf(" [0x%08x] 0x%04x %s R%d [0x%x]\n",addr, inst,
365 + (inst&BIT11)?"LDR":"STR",rt, taddr);
366 + }
367 + else
368 + {
369 + printf(" [0x%08x] 0x%04x %s 0x%x [0x%x]\n",addr, inst,
370 + (inst&BIT11)?"LDR":"STR",tdata, taddr);
371 + }
372 +
373 + }
374 + else if((inst >> 13) == 3)
375 + {
376 + eFlag = 3;
377 + /* 011xxx Load/store word/byte (immediate offset) on page C2-327 of armv8m ref */
378 + imm5 = (inst >> 6) & 0x1f;
379 + rn = (inst >> 3) & 0x7;
380 + rt = inst & 0x7;
381 +
382 + taddr = sp[rn] + imm5;
383 + tdata = sp[rt];
384 + if(rt == rn)
385 + {
386 + printf(" [0x%08x] 0x%04x %s R%d [0x%x]\n",addr, inst,
387 + (inst&BIT11)?"LDR":"STR",rt, taddr);
388 + }
389 + else
390 + {
391 + printf(" [0x%08x] 0x%04x %s 0x%x [0x%x]\n",addr, inst,
392 + (inst&BIT11)?"LDR":"STR",tdata, taddr);
393 + }
394 + }
395 + else if((inst >> 12) == 8)
396 + {
397 + eFlag = 3;
398 + /* 1000xx Load/store halfword (immediate offset) on page C2-328 */
399 + imm5 = (inst >> 6) & 0x1f;
400 + rn = (inst >> 3) & 0x7;
401 + rt = inst & 0x7;
402 +
403 + taddr = sp[rn] + imm5;
404 + tdata = sp[rt];
405 + if(rt == rn)
406 + {
407 + printf(" [0x%08x] 0x%04x %s R%d [0x%x]\n",addr, inst,
408 + (inst&BIT11)?"LDR":"STR",rt, taddr);
409 + }
410 + else
411 + {
412 + printf(" [0x%08x] 0x%04x %s 0x%x [0x%x]\n",addr, inst,
413 + (inst&BIT11)?"LDR":"STR",tdata, taddr);
414 + }
415 +
416 + }
417 + else if((inst >> 12) == 9)
418 + {
419 + eFlag = 3;
420 + /* 1001xx Load/store (SP-relative) on page C2-328 */
421 + imm8 = inst & 0xff;
422 + rt = (inst >> 8) & 0x7;
423 +
424 + taddr = sp[6] + imm8;
425 + tdata = sp[rt];
426 + printf(" [0x%08x] 0x%04x %s 0x%x [0x%x]\n",addr, inst,
427 + (inst&BIT11)?"LDR":"STR",tdata, taddr);
428 + }
429 + else
430 + {
431 + eFlag = 4;
432 + printf(" Unexpected instruction: 0x%04x \n", inst);
433 + }
434 +
435 + if(eFlag == 3)
436 + {
437 + /* It is LDR/STR hardfault */
438 + if(!secure)
439 + {
440 + /* It is happened in Nonsecure code */
441 +
442 + for(i=0;i< (uint32_t)(sizeof(s_IpTbl)/sizeof(IP_T)-1);i++)
443 + {
444 + /* Case 1: Nonsecure code try to access secure IP. It also causes SCU violation */
445 + if((taddr >= s_IpTbl[i].u32Addr) && (taddr < (s_IpTbl[i+1].u32Addr)))
446 + {
447 + idx = s_IpTbl[i].u8NSIdx;
448 + bit = idx & 0x1f;
449 + idx = idx >> 5;
450 + s = (SCU->PNSSET[idx] >> bit) & 1ul;
451 + printf(" Illegal access to %s %s in Nonsecure code.\n",(s)?"Nonsecure":"Secure", s_IpTbl[i].name);
452 + break;
453 + }
454 +
455 + /* Case 2: Nonsecure code try to access Nonsecure IP but the IP is secure IP */
456 + if((taddr >= (s_IpTbl[i].u32Addr+NS_OFFSET)) && (taddr < (s_IpTbl[i+1].u32Addr+NS_OFFSET)))
457 + {
458 + idx = s_IpTbl[i].u8NSIdx;
459 + bit = idx & 0x1f;
460 + idx = idx >> 5;
461 + s = (SCU->PNSSET[idx] >> bit) & 1ul;
462 + printf(" Illegal access to %s %s in Nonsecure code.\nIt may be set as secure IP here.\n",(s)?"Nonsecure":"Secure", s_IpTbl[i].name);
463 + break;
464 + }
465 + }
466 + }
467 + else
468 + {
469 + /* It is happened in secure code */
470 +
471 +
472 + if(taddr > NS_OFFSET)
473 + {
474 + /* Case 3: Secure try to access secure IP through Nonsecure address. It also causes SCU violation */
475 + for(i=0;i< (uint32_t)(sizeof(s_IpTbl)/sizeof(IP_T)-1);i++)
476 + {
477 + if((taddr >= (s_IpTbl[i].u32Addr+NS_OFFSET)) && (taddr < (s_IpTbl[i+1].u32Addr+NS_OFFSET)))
478 + {
479 + idx = s_IpTbl[i].u8NSIdx;
480 + bit = idx & 0x1f;
481 + idx = idx >> 5;
482 + s = (SCU->PNSSET[idx] >> bit) & 1ul;
483 + printf(" Illegal to use Nonsecure address to access %s %s in Secure code\n",(s)?"Nonsecure":"Secure", s_IpTbl[i].name);
484 + break;
485 + }
486 + }
487 + }
488 +
489 +
490 + }
491 + }
492 +
493 + SCU_IRQHandler();
494 +
495 + printf("!!---------------------------------------------------------------!!\n");
496 +
497 + /* Or *sp to remove compiler warning */
498 + while(1U|*sp){}
499 +
500 + return lr;
501 +}
502 +
503 +
504 +int32_t SH_Return(int32_t n32In_R0, int32_t n32In_R1, int32_t *pn32Out_R0)
505 +{
506 + (void)n32In_R0;
507 + (void)n32In_R1;
508 + (void)pn32Out_R0;
509 + return 0;
510 +}
511 +
512 +#endif /* defined(DEBUG_ENABLE_SEMIHOST) */
513 +
514 +
515 +/**
516 + * @brief Routine to send a char
517 + *
518 + * @param[in] ch A character data writes to debug port
519 + *
520 + * @returns Send value from UART debug port
521 + *
522 + * @details Send a target char to UART debug port .
523 + */
524 +#ifndef NONBLOCK_PRINTF
525 +void SendChar_ToUART(int ch)
526 +{
527 +
528 + while(DEBUG_PORT->FIFOSTS & UART_FIFOSTS_TXFULL_Msk){}
529 + if((char)ch == '\n')
530 + {
531 + DEBUG_PORT->DAT = '\r';
532 + while(DEBUG_PORT->FIFOSTS & UART_FIFOSTS_TXFULL_Msk){}
533 + }
534 + DEBUG_PORT->DAT = (uint32_t)ch;
535 +}
536 +
537 +#else
538 +/* Non-block implement of send char */
539 +# define BUF_SIZE 512
540 +void SendChar_ToUART(int ch)
541 +{
542 + static uint8_t u8Buf[BUF_SIZE] = {0};
543 + static int32_t i32Head = 0;
544 + static int32_t i32Tail = 0;
545 + int32_t i32Tmp;
546 +
547 + /* Only flush the data in buffer to UART when ch == 0 */
548 + if(ch)
549 + {
550 + // Push char
551 + if(ch == '\n')
552 + {
553 + i32Tmp = i32Head+1;
554 + if(i32Tmp > BUF_SIZE) i32Tmp = 0;
555 + if(i32Tmp != i32Tail)
556 + {
557 + u8Buf[i32Head] = '\r';
558 + i32Head = i32Tmp;
559 + }
560 + }
561 +
562 + i32Tmp = i32Head+1;
563 + if(i32Tmp > BUF_SIZE) i32Tmp = 0;
564 + if(i32Tmp != i32Tail)
565 + {
566 + u8Buf[i32Head] = ch;
567 + i32Head = i32Tmp;
568 + }
569 + }
570 + else
571 + {
572 + if(i32Tail == i32Head)
573 + return;
574 + }
575 +
576 + // pop char
577 + do
578 + {
579 + i32Tmp = i32Tail + 1;
580 + if(i32Tmp > BUF_SIZE) i32Tmp = 0;
581 +
582 + if((DEBUG_PORT->FSR & UART_FSR_TX_FULL_Msk) == 0)
583 + {
584 + DEBUG_PORT->DATA = u8Buf[i32Tail];
585 + i32Tail = i32Tmp;
586 + }
587 + else
588 + break; // FIFO full
589 + }while(i32Tail != i32Head);
590 +}
591 +#endif
592 +
593 +/**
594 + * @brief Routine to send a char
595 + *
596 + * @param[in] ch A character data writes to debug port
597 + *
598 + * @returns Send value from UART debug port or semihost
599 + *
600 + * @details Send a target char to UART debug port or semihost.
601 + */
602 +void SendChar(int ch)
603 +{
604 +#if defined(DEBUG_ENABLE_SEMIHOST)
605 +
606 + g_buf[(uint8_t)g_buf_len++] = (char)ch;
607 + g_buf[(uint8_t)g_buf_len] = '\0';
608 + if(g_buf_len + 1 >= sizeof(g_buf) || ch == '\n' || ch == '\0')
609 + {
610 + /* Send the char */
611 + if(g_ICE_Conneced)
612 + {
613 +
614 + if(SH_DoCommand(0x04, (int)g_buf, NULL) != 0)
615 + {
616 + g_buf_len = 0;
617 +
618 + return;
619 + }
620 + }
621 + else
622 + {
623 +# if (DEBUG_ENABLE_SEMIHOST == 2) // Re-direct to UART Debug Port only when DEBUG_ENABLE_SEMIHOST=2
624 + int i;
625 +
626 + for(i = 0; i < g_buf_len; i++)
627 + SendChar_ToUART(g_buf[i]);
628 + g_buf_len = 0;
629 +# endif
630 + }
631 + }
632 +#else
633 + SendChar_ToUART(ch);
634 +#endif
635 +}
636 +
637 +/**
638 + * @brief Routine to get a char
639 + *
640 + * @param None
641 + *
642 + * @returns Get value from UART debug port or semihost
643 + *
644 + * @details Wait UART debug port or semihost to input a char.
645 + */
646 +char GetChar(void)
647 +{
648 +#ifdef DEBUG_ENABLE_SEMIHOST
649 +# if defined (__ICCARM__)
650 + int nRet;
651 + while(SH_DoCommand(0x7, 0, &nRet) != 0)
652 + {
653 + if(nRet != 0)
654 + return (char)nRet;
655 + }
656 +# else
657 + int nRet;
658 + while(SH_DoCommand(0x101, 0, &nRet) != 0)
659 + {
660 + if(nRet != 0)
661 + {
662 + SH_DoCommand(0x07, 0, &nRet);
663 + return (char)nRet;
664 + }
665 + }
666 +
667 +
668 +# if (DEBUG_ENABLE_SEMIHOST == 2) // Re-direct to UART Debug Port only when DEBUG_ENABLE_SEMIHOST=2
669 +
670 + /* Use debug port when ICE is not connected at semihost mode */
671 + while(!g_ICE_Conneced)
672 + {
673 + if((DEBUG_PORT->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk) == 0)
674 + {
675 + return (DEBUG_PORT->DAT);
676 + }
677 + }
678 +# endif
679 +
680 +# endif
681 + return (0);
682 +#else
683 +
684 + while(1)
685 + {
686 + if((DEBUG_PORT->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk) == 0U)
687 + {
688 + return ((char)DEBUG_PORT->DAT);
689 + }
690 + }
691 +
692 +#endif
693 +}
694 +
695 +/**
696 + * @brief Check any char input from UART
697 + *
698 + * @param None
699 + *
700 + * @retval 1: No any char input
701 + * @retval 0: Have some char input
702 + *
703 + * @details Check UART RSR RX EMPTY or not to determine if any char input from UART
704 + */
705 +
706 +int kbhit(void)
707 +{
708 + return !((DEBUG_PORT->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk) == 0U);
709 +}
710 +/**
711 + * @brief Check if debug message finished
712 + *
713 + * @param None
714 + *
715 + * @retval 1: Message is finished
716 + * @retval 0: Message is transmitting.
717 + *
718 + * @details Check if message finished (FIFO empty of debug port)
719 + */
720 +
721 +int IsDebugFifoEmpty(void)
722 +{
723 + return ((DEBUG_PORT->FIFOSTS & UART_FIFOSTS_TXEMPTYF_Msk) != 0U);
724 +}
725 +
726 +/**
727 + * @brief C library retargetting
728 + *
729 + * @param[in] ch Write a character data
730 + *
731 + * @returns None
732 + *
733 + * @details Check if message finished (FIFO empty of debug port)
734 + */
735 +
736 +void _ttywrch(int ch)
737 +{
738 + SendChar(ch);
739 + return;
740 +}
741 +
742 +
743 +/**
744 + * @brief Write character to stream
745 + *
746 + * @param[in] ch Character to be written. The character is passed as its int promotion.
747 + * @param[in] stream Pointer to a FILE object that identifies the stream where the character is to be written.
748 + *
749 + * @returns If there are no errors, the same character that has been written is returned.
750 + * If an error occurs, EOF is returned and the error indicator is set (see ferror).
751 + *
752 + * @details Writes a character to the stream and advances the position indicator.\n
753 + * The character is written at the current position of the stream as indicated \n
754 + * by the internal position indicator, which is then advanced one character.
755 + *
756 + * @note The above descriptions are copied from http://www.cplusplus.com/reference/clibrary/cstdio/fputc/.
757 + *
758 + *
759 + */
760 +
761 +int fputc(int ch, FILE *stream)
762 +{
763 + (void)stream;
764 + SendChar(ch);
765 + return ch;
766 +}
767 +
768 +
769 +#if (defined(__GNUC__) && !defined(__ARMCC_VERSION))
770 +
771 +#if !defined(OS_USE_SEMIHOSTING)
772 +int _write (int fd, char *ptr, int len)
773 +{
774 + int i = len;
775 +
776 + while(i--) {
777 + while(DEBUG_PORT->FIFOSTS & UART_FIFOSTS_TXFULL_Msk);
778 +
779 + if(*ptr == '\n') {
780 + DEBUG_PORT->DAT = '\r';
781 + while(DEBUG_PORT->FIFOSTS & UART_FIFOSTS_TXFULL_Msk);
782 + }
783 +
784 + DEBUG_PORT->DAT = *ptr++;
785 + }
786 + return len;
787 +}
788 +
789 +int _read (int fd, char *ptr, int len)
790 +{
791 +
792 + while((DEBUG_PORT->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk) != 0);
793 + *ptr = DEBUG_PORT->DAT;
794 + return 1;
795 +
796 +
797 +}
798 +#endif
799 +
800 +#else
801 +/**
802 + * @brief Get character from UART debug port or semihosting input
803 + *
804 + * @param[in] stream Pointer to a FILE object that identifies the stream on which the operation is to be performed.
805 + *
806 + * @returns The character read from UART debug port or semihosting
807 + *
808 + * @details For get message from debug port or semihosting.
809 + *
810 + */
811 +
812 +int fgetc(FILE *stream)
813 +{
814 + (void)stream;
815 + return ((int)GetChar());
816 +}
817 +
818 +/**
819 + * @brief Check error indicator
820 + *
821 + * @param[in] stream Pointer to a FILE object that identifies the stream.
822 + *
823 + * @returns If the error indicator associated with the stream was set, the function returns a nonzero value.
824 + * Otherwise, it returns a zero value.
825 + *
826 + * @details Checks if the error indicator associated with stream is set, returning a value different
827 + * from zero if it is. This indicator is generally set by a previous operation on the stream that failed.
828 + *
829 + * @note The above descriptions are copied from http://www.cplusplus.com/reference/clibrary/cstdio/ferror/.
830 + *
831 + */
832 +
833 +int ferror(FILE *stream)
834 +{
835 + (void)stream;
836 + return EOF;
837 +}
838 +#endif
839 +
840 +#ifdef DEBUG_ENABLE_SEMIHOST
841 +# ifdef __ICCARM__
842 +void __exit(int return_code)
843 +{
844 +
845 + /* Check if link with ICE */
846 + if(SH_DoCommand(0x18, 0x20026, NULL) == 0)
847 + {
848 + /* Make sure all message is print out */
849 + while(IsDebugFifoEmpty() == 0);
850 + }
851 +label:
852 + goto label; /* endless loop */
853 +}
854 +# else
855 +void _sys_exit(int return_code)
856 +{
857 + (void)return_code;
858 + /* Check if link with ICE */
859 + if(SH_DoCommand(0x18, 0x20026, NULL) == 0)
860 + {
861 + /* Make sure all message is print out */
862 + while(IsDebugFifoEmpty() == 0);
863 + }
864 +label:
865 + goto label; /* endless loop */
866 +}
867 +# endif
868 +#endif
869 +
870 +
871 +
872 +/*** (C) COPYRIGHT 2016-2020 Nuvoton Technology Corp. ***/
873 +
874 +
1 +;/**************************************************************************//**
2 +; * @file startup_M2351.s
3 +; * @version V2.00
4 +; * $Revision: 9 $
5 +; * $Date: 16/08/27 12:33p $
6 +; * @brief Startup Source File
7 +; *
8 +; * @note
9 +; * SPDX-License-Identifier: Apache-2.0
10 +; * Copyright (C) 2016-2020 Nuvoton Technology Corp. All rights reserved.
11 +; *
12 +; ******************************************************************************/
13 +
14 +
15 +;/*
16 +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------
17 +;*/
18 +; <h> Stack Configuration
19 +; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
20 +; </h>
21 +
22 + IF :LNOT: :DEF: Stack_Size
23 +Stack_Size EQU 0x00001000
24 + ENDIF
25 +
26 + AREA STACK, NOINIT, READWRITE, ALIGN=3
27 +Stack_Mem SPACE Stack_Size
28 +__initial_sp
29 +
30 +
31 +; <h> Heap Configuration
32 +; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
33 +; </h>
34 +
35 + IF :LNOT: :DEF: Heap_Size
36 +Heap_Size EQU 0x00002800
37 + ENDIF
38 +
39 + AREA HEAP, NOINIT, READWRITE, ALIGN=3
40 +__heap_base
41 +Heap_Mem SPACE Heap_Size
42 +__heap_limit
43 +
44 +
45 + PRESERVE8
46 + THUMB
47 +
48 +
49 +; Vector Table Mapped to Address 0 at Reset
50 +
51 + AREA RESET, DATA, READONLY
52 + EXPORT __Vectors
53 + EXPORT __Vectors_End
54 + EXPORT __Vectors_Size
55 + IMPORT SCU_IRQHandler
56 +
57 +
58 +__Vectors DCD __initial_sp ; Top of Stack
59 + DCD Reset_Handler ; Reset Handler
60 + DCD NMI_Handler ; NMI Handler
61 + DCD HardFault_Handler ; Hard Fault Handler
62 + DCD 0 ; Reserved
63 + DCD 0 ; Reserved
64 + DCD 0 ; Reserved
65 + DCD 0 ; Reserved
66 + DCD 0 ; Reserved
67 + DCD 0 ; Reserved
68 + DCD 0 ; Reserved
69 + DCD SVC_Handler ; SVCall Handler
70 + DCD 0 ; Reserved
71 + DCD 0 ; Reserved
72 + DCD PendSV_Handler ; PendSV Handler
73 + DCD SysTick_Handler ; SysTick Handler
74 +
75 + ; External Interrupts
76 + ; maximum of 32 External Interrupts are possible
77 + DCD BOD_IRQHandler ; 0
78 + DCD IRC_IRQHandler ; 1
79 + DCD PWRWU_IRQHandler ; 2
80 + DCD SRAM_IRQHandler ; 3
81 + DCD CLKFAIL_IRQHandler ; 4
82 + DCD DEFAULT_IRQHandler ; 5
83 + DCD RTC_IRQHandler ; 6
84 + DCD TAMPER_IRQHandler ; 7
85 + DCD WDT_IRQHandler ; 8
86 + DCD WWDT_IRQHandler ; 9
87 + DCD EINT0_IRQHandler ; 10
88 + DCD EINT1_IRQHandler ; 11
89 + DCD EINT2_IRQHandler ; 12
90 + DCD EINT3_IRQHandler ; 13
91 + DCD EINT4_IRQHandler ; 14
92 + DCD EINT5_IRQHandler ; 15
93 + DCD GPA_IRQHandler ; 16
94 + DCD GPB_IRQHandler ; 17
95 + DCD GPC_IRQHandler ; 18
96 + DCD GPD_IRQHandler ; 19
97 + DCD GPE_IRQHandler ; 20
98 + DCD GPF_IRQHandler ; 21
99 + DCD QSPI0_IRQHandler ; 22
100 + DCD SPI0_IRQHandler ; 23
101 + DCD BRAKE0_IRQHandler ; 24
102 + DCD EPWM0_P0_IRQHandler ; 25
103 + DCD EPWM0_P1_IRQHandler ; 26
104 + DCD EPWM0_P2_IRQHandler ; 27
105 + DCD BRAKE1_IRQHandler ; 28
106 + DCD EPWM1_P0_IRQHandler ; 29
107 + DCD EPWM1_P1_IRQHandler ; 30
108 + DCD EPWM1_P2_IRQHandler ; 31
109 + DCD TMR0_IRQHandler ; 32
110 + DCD TMR1_IRQHandler ; 33
111 + DCD TMR2_IRQHandler ; 34
112 + DCD TMR3_IRQHandler ; 35
113 + DCD UART0_IRQHandler ; 36
114 + DCD UART1_IRQHandler ; 37
115 + DCD I2C0_IRQHandler ; 38
116 + DCD I2C1_IRQHandler ; 39
117 + DCD PDMA0_IRQHandler ; 40
118 + DCD DAC_IRQHandler ; 41
119 + DCD EADC0_IRQHandler ; 42
120 + DCD EADC1_IRQHandler ; 43
121 + DCD ACMP01_IRQHandler ; 44
122 + DCD DEFAULT_IRQHandler ; 45
123 + DCD EADC2_IRQHandler ; 46
124 + DCD EADC3_IRQHandler ; 47
125 + DCD UART2_IRQHandler ; 48
126 + DCD UART3_IRQHandler ; 49
127 + DCD DEFAULT_IRQHandler ; 50
128 + DCD SPI1_IRQHandler ; 51
129 + DCD SPI2_IRQHandler ; 52
130 + DCD USBD_IRQHandler ; 53
131 + DCD USBH_IRQHandler ; 54
132 + DCD USBOTG_IRQHandler ; 55
133 + DCD CAN0_IRQHandler ; 56
134 + DCD DEFAULT_IRQHandler ; 57
135 + DCD SC0_IRQHandler ; 58
136 + DCD SC1_IRQHandler ; 59
137 + DCD SC2_IRQHandler ; 60
138 + DCD DEFAULT_IRQHandler ; 61
139 + DCD SPI3_IRQHandler ; 62
140 + DCD DEFAULT_IRQHandler ; 63
141 + DCD SDH0_IRQHandler ; 64
142 + DCD DEFAULT_IRQHandler ; 65
143 + DCD DEFAULT_IRQHandler ; 66
144 + DCD DEFAULT_IRQHandler ; 67
145 + DCD I2S0_IRQHandler ; 68
146 + DCD DEFAULT_IRQHandler ; 69
147 + DCD OPA0_IRQHandler ; 70
148 + DCD CRPT_IRQHandler ; 71
149 + DCD GPG_IRQHandler ; 72
150 + DCD EINT6_IRQHandler ; 73
151 + DCD UART4_IRQHandler ; 74
152 + DCD UART5_IRQHandler ; 75
153 + DCD USCI0_IRQHandler ; 76
154 + DCD USCI1_IRQHandler ; 77
155 + DCD BPWM0_IRQHandler ; 78
156 + DCD BPWM1_IRQHandler ; 79
157 + DCD DEFAULT_IRQHandler ; 80
158 + DCD DEFAULT_IRQHandler ; 81
159 + DCD I2C2_IRQHandler ; 82
160 + DCD DEFAULT_IRQHandler ; 83
161 + DCD QEI0_IRQHandler ; 84
162 + DCD QEI1_IRQHandler ; 85
163 + DCD ECAP0_IRQHandler ; 86
164 + DCD ECAP1_IRQHandler ; 87
165 + DCD GPH_IRQHandler ; 88
166 + DCD EINT7_IRQHandler ; 89
167 + DCD DEFAULT_IRQHandler ; 90
168 + DCD DEFAULT_IRQHandler ; 91
169 + DCD DEFAULT_IRQHandler ; 92
170 + DCD DEFAULT_IRQHandler ; 93
171 + DCD DEFAULT_IRQHandler ; 94
172 + DCD DEFAULT_IRQHandler ; 95
173 + DCD DEFAULT_IRQHandler ; 96
174 + DCD DEFAULT_IRQHandler ; 97
175 + DCD PDMA1_IRQHandler ; 98
176 + DCD SCU_IRQHandler ; 99
177 + DCD DEFAULT_IRQHandler ; 100
178 + DCD TRNG_IRQHandler ; 101
179 +
180 +
181 +
182 +__Vectors_End
183 +
184 +__Vectors_Size EQU __Vectors_End - __Vectors
185 +
186 + AREA |.text|, CODE, READONLY
187 +
188 +
189 +; Reset Handler
190 +
191 +Reset_Handler PROC
192 + EXPORT Reset_Handler [WEAK]
193 + IMPORT SystemInit
194 + IMPORT __main
195 +
196 +
197 + LDR R0, =SystemInit
198 + BLX R0
199 + LDR R0, =__main
200 + BX R0
201 + ENDP
202 +
203 +
204 +; Dummy Exception Handlers (infinite loops which can be modified)
205 +
206 +NMI_Handler PROC
207 + EXPORT NMI_Handler [WEAK]
208 + B .
209 + ENDP
210 +HardFault_Handler\
211 + PROC
212 + IMPORT ProcessHardFault
213 + EXPORT HardFault_Handler [WEAK]
214 + MOV R0, LR
215 + MRS R1, MSP
216 + MRS R2, PSP
217 + LDR R3, =ProcessHardFault
218 + BLX R3
219 + BX R0
220 + ENDP
221 +SVC_Handler PROC
222 + EXPORT SVC_Handler [WEAK]
223 + B .
224 + ENDP
225 +PendSV_Handler PROC
226 + EXPORT PendSV_Handler [WEAK]
227 + B .
228 + ENDP
229 +SysTick_Handler PROC
230 + EXPORT SysTick_Handler [WEAK]
231 + B .
232 + ENDP
233 +
234 +Default_Handler PROC
235 +
236 + EXPORT BOD_IRQHandler [WEAK] ; 0
237 + EXPORT IRC_IRQHandler [WEAK] ; 1
238 + EXPORT PWRWU_IRQHandler [WEAK] ; 2
239 + EXPORT SRAM_IRQHandler [WEAK] ; 3
240 + EXPORT CLKFAIL_IRQHandler [WEAK] ; 4
241 + ;EXPORT 0 [WEAK] ; 5
242 + EXPORT RTC_IRQHandler [WEAK] ; 6
243 + EXPORT TAMPER_IRQHandler [WEAK] ; 7
244 + EXPORT WDT_IRQHandler [WEAK] ; 8
245 + EXPORT WWDT_IRQHandler [WEAK] ; 9
246 + EXPORT EINT0_IRQHandler [WEAK] ; 10
247 + EXPORT EINT1_IRQHandler [WEAK] ; 11
248 + EXPORT EINT2_IRQHandler [WEAK] ; 12
249 + EXPORT EINT3_IRQHandler [WEAK] ; 13
250 + EXPORT EINT4_IRQHandler [WEAK] ; 14
251 + EXPORT EINT5_IRQHandler [WEAK] ; 15
252 + EXPORT GPA_IRQHandler [WEAK] ; 16
253 + EXPORT GPB_IRQHandler [WEAK] ; 17
254 + EXPORT GPC_IRQHandler [WEAK] ; 18
255 + EXPORT GPD_IRQHandler [WEAK] ; 19
256 + EXPORT GPE_IRQHandler [WEAK] ; 20
257 + EXPORT GPF_IRQHandler [WEAK] ; 21
258 + EXPORT QSPI0_IRQHandler [WEAK] ; 22
259 + EXPORT SPI0_IRQHandler [WEAK] ; 23
260 + EXPORT BRAKE0_IRQHandler [WEAK] ; 24
261 + EXPORT EPWM0_P0_IRQHandler [WEAK] ; 25
262 + EXPORT EPWM0_P1_IRQHandler [WEAK] ; 26
263 + EXPORT EPWM0_P2_IRQHandler [WEAK] ; 27
264 + EXPORT BRAKE1_IRQHandler [WEAK] ; 28
265 + EXPORT EPWM1_P0_IRQHandler [WEAK] ; 29
266 + EXPORT EPWM1_P1_IRQHandler [WEAK] ; 30
267 + EXPORT EPWM1_P2_IRQHandler [WEAK] ; 31
268 + EXPORT TMR0_IRQHandler [WEAK] ; 32
269 + EXPORT TMR1_IRQHandler [WEAK] ; 33
270 + EXPORT TMR2_IRQHandler [WEAK] ; 34
271 + EXPORT TMR3_IRQHandler [WEAK] ; 35
272 + EXPORT UART0_IRQHandler [WEAK] ; 36
273 + EXPORT UART1_IRQHandler [WEAK] ; 37
274 + EXPORT I2C0_IRQHandler [WEAK] ; 38
275 + EXPORT I2C1_IRQHandler [WEAK] ; 39
276 + EXPORT PDMA0_IRQHandler [WEAK] ; 40
277 + EXPORT DAC_IRQHandler [WEAK] ; 41
278 + EXPORT EADC0_IRQHandler [WEAK] ; 42
279 + EXPORT EADC1_IRQHandler [WEAK] ; 43
280 + EXPORT ACMP01_IRQHandler [WEAK] ; 44
281 + ;EXPORT 0 [WEAK] ; 45
282 + EXPORT EADC2_IRQHandler [WEAK] ; 46
283 + EXPORT EADC3_IRQHandler [WEAK] ; 47
284 + EXPORT UART2_IRQHandler [WEAK] ; 48
285 + EXPORT UART3_IRQHandler [WEAK] ; 49
286 + ;EXPORT 0 [WEAK] ; 50
287 + EXPORT SPI1_IRQHandler [WEAK] ; 51
288 + EXPORT SPI2_IRQHandler [WEAK] ; 52
289 + EXPORT USBD_IRQHandler [WEAK] ; 53
290 + EXPORT USBH_IRQHandler [WEAK] ; 54
291 + EXPORT USBOTG_IRQHandler [WEAK] ; 55
292 + EXPORT CAN0_IRQHandler [WEAK] ; 56
293 + EXPORT CAN1_IRQHandler [WEAK] ; 57
294 + EXPORT SC0_IRQHandler [WEAK] ; 58
295 + EXPORT SC1_IRQHandler [WEAK] ; 59
296 + EXPORT SC2_IRQHandler [WEAK] ; 60
297 + EXPORT SC3_IRQHandler [WEAK] ; 61
298 + EXPORT SPI3_IRQHandler [WEAK] ; 62
299 + ;EXPORT 0 [WEAK] ; 63
300 + EXPORT SDH0_IRQHandler [WEAK] ; 64
301 + ;EXPORT 0 [WEAK] ; 65
302 + ;EXPORT 0 [WEAK] ; 66
303 + ;EXPORT 0 [WEAK] ; 67
304 + EXPORT I2S0_IRQHandler [WEAK] ; 68
305 + ;EXPORT 0 [WEAK] ; 69
306 + EXPORT OPA0_IRQHandler [WEAK] ; 70
307 + EXPORT CRPT_IRQHandler [WEAK] ; 71
308 + EXPORT GPG_IRQHandler [WEAK] ; 72
309 + EXPORT EINT6_IRQHandler [WEAK] ; 73
310 + EXPORT UART4_IRQHandler [WEAK] ; 74
311 + EXPORT UART5_IRQHandler [WEAK] ; 75
312 + EXPORT USCI0_IRQHandler [WEAK] ; 76
313 + EXPORT USCI1_IRQHandler [WEAK] ; 77
314 + EXPORT BPWM0_IRQHandler [WEAK] ; 78
315 + EXPORT BPWM1_IRQHandler [WEAK] ; 79
316 + ;EXPORT 0 [WEAK] ; 80
317 + ;EXPORT 0 [WEAK] ; 81
318 + EXPORT I2C2_IRQHandler [WEAK] ; 82
319 + ;EXPORT 0 [WEAK] ; 83
320 + EXPORT QEI0_IRQHandler [WEAK] ; 84
321 + EXPORT QEI1_IRQHandler [WEAK] ; 85
322 + EXPORT ECAP0_IRQHandler [WEAK] ; 86
323 + EXPORT ECAP1_IRQHandler [WEAK] ; 87
324 + EXPORT GPH_IRQHandler [WEAK] ; 88
325 + EXPORT EINT7_IRQHandler [WEAK] ; 89
326 + EXPORT SDH1_IRQHandler [WEAK] ; 90
327 + ;EXPORT 0 [WEAK] ; 91
328 + ;EXPORT USBH_IRQHandler [WEAK] ; 92
329 + ;EXPORT 0 [WEAK] ; 93
330 + ;EXPORT 0 [WEAK] ; 94
331 + ;EXPORT 0 [WEAK] ; 95
332 + ;EXPORT 0 [WEAK] ; 96
333 + ;EXPORT 0 [WEAK] ; 97
334 + EXPORT PDMA1_IRQHandler [WEAK] ; 98
335 + ;EXPORT SCU_IRQHandler [WEAK] ; 99
336 + ;EXPORT 0 [WEAK] ; 100
337 + EXPORT TRNG_IRQHandler [WEAK] ; 101
338 +
339 +
340 +
341 + EXPORT DEFAULT_IRQHandler [WEAK]
342 +
343 +BOD_IRQHandler ; 0
344 +IRC_IRQHandler ; 1
345 +PWRWU_IRQHandler ; 2
346 +SRAM_IRQHandler ; 3
347 +CLKFAIL_IRQHandler ; 4
348 +;0 ; 5
349 +RTC_IRQHandler ; 6
350 +TAMPER_IRQHandler ; 7
351 +WDT_IRQHandler ; 8
352 +WWDT_IRQHandler ; 9
353 +EINT0_IRQHandler ; 10
354 +EINT1_IRQHandler ; 11
355 +EINT2_IRQHandler ; 12
356 +EINT3_IRQHandler ; 13
357 +EINT4_IRQHandler ; 14
358 +EINT5_IRQHandler ; 15
359 +GPA_IRQHandler ; 16
360 +GPB_IRQHandler ; 17
361 +GPC_IRQHandler ; 18
362 +GPD_IRQHandler ; 19
363 +GPE_IRQHandler ; 20
364 +GPF_IRQHandler ; 21
365 +QSPI0_IRQHandler ; 22
366 +SPI0_IRQHandler ; 23
367 +BRAKE0_IRQHandler ; 24
368 +EPWM0_P0_IRQHandler ; 25
369 +EPWM0_P1_IRQHandler ; 26
370 +EPWM0_P2_IRQHandler ; 27
371 +BRAKE1_IRQHandler ; 28
372 +EPWM1_P0_IRQHandler ; 29
373 +EPWM1_P1_IRQHandler ; 30
374 +EPWM1_P2_IRQHandler ; 31
375 +TMR0_IRQHandler ; 32
376 +TMR1_IRQHandler ; 33
377 +TMR2_IRQHandler ; 34
378 +TMR3_IRQHandler ; 35
379 +UART0_IRQHandler ; 36
380 +UART1_IRQHandler ; 37
381 +I2C0_IRQHandler ; 38
382 +I2C1_IRQHandler ; 39
383 +PDMA0_IRQHandler ; 40
384 +DAC_IRQHandler ; 41
385 +EADC0_IRQHandler ; 42
386 +EADC1_IRQHandler ; 43
387 +ACMP01_IRQHandler ; 44
388 +;0 ; 45
389 +EADC2_IRQHandler ; 46
390 +EADC3_IRQHandler ; 47
391 +UART2_IRQHandler ; 48
392 +UART3_IRQHandler ; 49
393 +;0 ; 50
394 +SPI1_IRQHandler ; 51
395 +SPI2_IRQHandler ; 52
396 +USBD_IRQHandler ; 53
397 +USBH_IRQHandler ; 54
398 +USBOTG_IRQHandler ; 55
399 +CAN0_IRQHandler ; 56
400 +CAN1_IRQHandler ; 57
401 +SC0_IRQHandler ; 58
402 +SC1_IRQHandler ; 59
403 +SC2_IRQHandler ; 60
404 +SC3_IRQHandler ; 61
405 +SPI3_IRQHandler ; 62
406 +;0 ; 63
407 +SDH0_IRQHandler ; 64
408 +;0 ; 65
409 +;0 ; 66
410 +;0 ; 67
411 +I2S0_IRQHandler ; 68
412 +;0 ; 69
413 +OPA0_IRQHandler ; 70
414 +CRPT_IRQHandler ; 71
415 +GPG_IRQHandler ; 72
416 +EINT6_IRQHandler ; 73
417 +UART4_IRQHandler ; 74
418 +UART5_IRQHandler ; 75
419 +USCI0_IRQHandler ; 76
420 +USCI1_IRQHandler ; 77
421 +BPWM0_IRQHandler ; 78
422 +BPWM1_IRQHandler ; 79
423 +;0 ; 80
424 +;0 ; 81
425 +I2C2_IRQHandler ; 82
426 +;0 ; 83
427 +QEI0_IRQHandler ; 84
428 +QEI1_IRQHandler ; 85
429 +ECAP0_IRQHandler ; 86
430 +ECAP1_IRQHandler ; 87
431 +GPH_IRQHandler ; 88
432 +EINT7_IRQHandler ; 89
433 +SDH1_IRQHandler ; 90
434 +;0 ; 91
435 +;USBH_IRQHandler ; 92
436 +;0 ; 93
437 +;0 ; 94
438 +;0 ; 95
439 +;0 ; 96
440 +;0 ; 97
441 +PDMA1_IRQHandler ; 98
442 +;SCU_IRQHandler ; 99
443 +;0 ; 100
444 +TRNG_IRQHandler ; 101
445 +DEFAULT_IRQHandler
446 + B .
447 + ENDP
448 +
449 + ALIGN
450 +
451 +
452 +; User Initial Stack & Heap
453 +
454 + IF :DEF:__MICROLIB
455 +
456 + EXPORT __initial_sp
457 + EXPORT __heap_base
458 + EXPORT __heap_limit
459 +
460 + ELSE
461 +
462 + IMPORT __use_two_region_memory
463 + EXPORT __user_initial_stackheap
464 +
465 +__user_initial_stackheap PROC
466 + LDR R0, = Heap_Mem
467 + LDR R1, = (Stack_Mem + Stack_Size)
468 + LDR R2, = (Heap_Mem + Heap_Size)
469 + LDR R3, = Stack_Mem
470 + BX LR
471 + ENDP
472 +
473 +
474 + ALIGN
475 +
476 + ENDIF
477 +
478 +;int32_t SH_DoCommand(int32_t n32In_R0, int32_t n32In_R1, int32_t *pn32Out_R0)
479 +SH_DoCommand PROC
480 +
481 + EXPORT SH_DoCommand
482 + IMPORT SH_Return
483 +
484 + BKPT 0xAB ; Wait ICE or HardFault
485 + LDR R3, =SH_Return
486 + MOV R4, lr
487 + BLX R3 ; Call SH_Return. The return value is in R0
488 + BX R4 ; Return value = R0
489 +
490 + ENDP
491 +
492 +__PC PROC
493 + EXPORT __PC
494 +
495 + MOV r0, lr
496 + BLX lr
497 + ALIGN
498 +
499 + ENDP
500 +
501 + END
1 +/**************************************************************************//**
2 + * @file system_M2351.c
3 + * @version V2.00
4 + * @brief System Setting Source File
5 + *
6 + * @note
7 + * SPDX-License-Identifier: Apache-2.0
8 + * Copyright (C) 2016-2020 Nuvoton Technology Corp. All rights reserved.
9 + *
10 + ******************************************************************************/
11 +#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) /* ARM Compiler 6 */
12 +#include <arm_cmse.h>
13 +#endif
14 +
15 +#include <stdio.h>
16 +#include <stdint.h>
17 +#include "NuMicro.h"
18 +
19 +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
20 +#include "partition_M2351.h"
21 +extern void SCU_IRQHandler(void);
22 +void TZ_SAU_Setup(void);
23 +#else
24 +extern void SCU_IRQHandler(void)__attribute__((noreturn));
25 +#endif
26 +
27 +extern void *__Vectors; /* see startup file */
28 +
29 +
30 +/*----------------------------------------------------------------------------
31 + Clock Variable definitions
32 + *----------------------------------------------------------------------------*/
33 +uint32_t SystemCoreClock = __HSI; /*!< System Clock Frequency (Core Clock) */
34 +uint32_t CyclesPerUs = (__HSI / 1000000UL);/*!< Cycles per micro second */
35 +uint32_t PllClock = __HSI; /*!< PLL Output Clock Frequency */
36 +//const uint32_t gau32ClkSrcTbl[] = {__HXT, __LXT, 0UL, __LIRC, 0UL, __HIRC48, 0UL, __HIRC};
37 +
38 +
39 +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
40 +
41 +void FMC_NSBA_Setup(void);
42 +void SCU_Setup(void);
43 +void NSC_Init(void);
44 +
45 +/**
46 + * @brief Setup Non-secure boundary
47 + *
48 + * @param None
49 + *
50 + * @return None
51 + *
52 + * @details This function is used to set Non-secure boundary according to
53 + * the configuration of partition header file
54 + */
55 +void FMC_NSBA_Setup(void)
56 +{
57 + /* Skip NSBA Setupt according config */
58 + if(FMC_INIT_NSBA == 0)
59 + return;
60 +
61 + /* Check if NSBA value with current active NSBA */
62 + if(SCU->FNSADDR != FMC_SECURE_ROM_SIZE)
63 + {
64 + /* Unlock Protected Register */
65 + SYS_UnlockReg();
66 +
67 + /* Enable ISP and config update */
68 + FMC->ISPCTL = FMC_ISPCTL_ISPEN_Msk | FMC_ISPCTL_CFGUEN_Msk;
69 +
70 + /* Config Base of NSBA */
71 + FMC->ISPADDR = FMC_NSCBA_BASE ;
72 +
73 + /* Read Non-secure base address config */
74 + FMC->ISPCMD = FMC_ISPCMD_READ;
75 + FMC->ISPTRG = FMC_ISPTRG_ISPGO_Msk;
76 + while(FMC->ISPTRG);
77 +
78 + /* Setting NSBA when it is empty */
79 + if(FMC->ISPDAT == 0xfffffffful)
80 + {
81 + /* Set new base */
82 + FMC->ISPDAT = FMC_SECURE_ROM_SIZE;
83 + FMC->ISPCMD = FMC_ISPCMD_PROGRAM;
84 + FMC->ISPTRG = FMC_ISPTRG_ISPGO_Msk;
85 + while(FMC->ISPTRG);
86 +
87 + /* Verify new base */
88 + FMC->ISPDAT = 0;
89 + FMC->ISPCMD = FMC_ISPCMD_READ;
90 + FMC->ISPTRG = FMC_ISPTRG_ISPGO_Msk;
91 + while(FMC->ISPTRG);
92 + if(FMC->ISPDAT == FMC_SECURE_ROM_SIZE)
93 + {
94 + /* Force Chip Reset to valid new setting */
95 + SYS->IPRST0 = SYS_IPRST0_CHIPRST_Msk;
96 + }
97 + }
98 + }
99 +
100 +}
101 +
102 +
103 +/**
104 + \brief Setup SCU Configuration Unit
105 + \details
106 +
107 + */
108 +void SCU_Setup(void)
109 +{
110 + int32_t i;
111 +
112 + SCU->PNSSET[0] = SCU_INIT_PNSSET0_VAL;
113 + SCU->PNSSET[1] = SCU_INIT_PNSSET1_VAL;
114 + SCU->PNSSET[2] = SCU_INIT_PNSSET2_VAL;
115 + SCU->PNSSET[3] = SCU_INIT_PNSSET3_VAL;
116 + SCU->PNSSET[4] = SCU_INIT_PNSSET4_VAL;
117 + SCU->PNSSET[5] = SCU_INIT_PNSSET5_VAL;
118 + SCU->PNSSET[6] = SCU_INIT_PNSSET6_VAL;
119 +
120 +
121 + SCU->IONSSET = SCU_INIT_IONSSET_VAL;
122 +
123 + /* Set Non-secure SRAM */
124 + for(i = 11; i >= SCU_SECURE_SRAM_SIZE / 8192; i--)
125 + {
126 + SCU->SRAMNSSET |= (1U << i);
127 + }
128 +
129 + /* Set interrupt to non-secure according to PNNSET settings */
130 + if(SCU_INIT_PNSSET0_VAL & BIT9 ) NVIC->ITNS[1] |= BIT22; /* Int of USBH_INT */
131 + if(SCU_INIT_PNSSET0_VAL & BIT13) NVIC->ITNS[2] |= BIT0 ; /* Int of SDHOST0_INT */
132 + if(SCU_INIT_PNSSET0_VAL & BIT24) NVIC->ITNS[3] |= BIT2 ; /* Int of PDMA1_INT */
133 + if(SCU_INIT_PNSSET1_VAL & BIT18) NVIC->ITNS[2] |= BIT7 ; /* Int of CRYPTO */
134 + if(SCU_INIT_PNSSET2_VAL & BIT2 ) NVIC->ITNS[3] |= BIT15; /* Int of EWDT_INT */
135 + if(SCU_INIT_PNSSET2_VAL & BIT2 ) NVIC->ITNS[3] |= BIT16; /* Int of EWWDT_INT */
136 + if(SCU_INIT_PNSSET2_VAL & BIT3 ) NVIC->ITNS[1] |= BIT10; /* Int of EADC0_INT */
137 + if(SCU_INIT_PNSSET2_VAL & BIT3 ) NVIC->ITNS[1] |= BIT11; /* Int of EADC1_INT */
138 + if(SCU_INIT_PNSSET2_VAL & BIT3 ) NVIC->ITNS[1] |= BIT14; /* Int of EADC2_INT */
139 + if(SCU_INIT_PNSSET2_VAL & BIT3 ) NVIC->ITNS[1] |= BIT15; /* Int of EADC3_INT */
140 + if(SCU_INIT_PNSSET2_VAL & BIT5 ) NVIC->ITNS[1] |= BIT12; /* Int of ACMP01_INT */
141 + if(SCU_INIT_PNSSET2_VAL & BIT7 ) NVIC->ITNS[1] |= BIT9 ; /* Int of DAC_INT */
142 + if(SCU_INIT_PNSSET2_VAL & BIT8 ) NVIC->ITNS[2] |= BIT4 ; /* Int of I2S0_INT */
143 + if(SCU_INIT_PNSSET2_VAL & BIT13) NVIC->ITNS[1] |= BIT23; /* Int of USBOTG_INT */
144 + if(SCU_INIT_PNSSET2_VAL & BIT17) NVIC->ITNS[1] |= BIT2 ; /* Int of TMR2_INT */
145 + if(SCU_INIT_PNSSET2_VAL & BIT17) NVIC->ITNS[1] |= BIT3 ; /* Int of TMR3_INT */
146 + if(SCU_INIT_PNSSET2_VAL & BIT24) NVIC->ITNS[0] |= BIT25; /* Int of EPWM0_P0_INT */
147 + if(SCU_INIT_PNSSET2_VAL & BIT24) NVIC->ITNS[0] |= BIT26; /* Int of EPWM0_P1_INT */
148 + if(SCU_INIT_PNSSET2_VAL & BIT24) NVIC->ITNS[0] |= BIT27; /* Int of EPWM0_P2_INT */
149 + if(SCU_INIT_PNSSET2_VAL & BIT25) NVIC->ITNS[0] |= BIT29; /* Int of EPWM1_P0_INT */
150 + if(SCU_INIT_PNSSET2_VAL & BIT25) NVIC->ITNS[0] |= BIT30; /* Int of EPWM1_P1_INT */
151 + if(SCU_INIT_PNSSET2_VAL & BIT25) NVIC->ITNS[0] |= BIT31; /* Int of EPWM1_P2_INT */
152 + if(SCU_INIT_PNSSET2_VAL & BIT26) NVIC->ITNS[2] |= BIT14; /* Int of BPWM0_INT */
153 + if(SCU_INIT_PNSSET2_VAL & BIT27) NVIC->ITNS[2] |= BIT15; /* Int of BPWM1_INT */
154 + if(SCU_INIT_PNSSET3_VAL & BIT0 ) NVIC->ITNS[0] |= BIT22; /* Int of QSPI0_INT */
155 + if(SCU_INIT_PNSSET3_VAL & BIT1 ) NVIC->ITNS[0] |= BIT23; /* Int of SPI0_INT */
156 + if(SCU_INIT_PNSSET3_VAL & BIT2 ) NVIC->ITNS[1] |= BIT19; /* Int of SPI1_INT */
157 + if(SCU_INIT_PNSSET3_VAL & BIT3 ) NVIC->ITNS[1] |= BIT20; /* Int of SPI2_INT */
158 + if(SCU_INIT_PNSSET3_VAL & BIT4 ) NVIC->ITNS[1] |= BIT30; /* Int of SPI3_INT */
159 + if(SCU_INIT_PNSSET3_VAL & BIT16) NVIC->ITNS[1] |= BIT4 ; /* Int of UART0_INT */
160 + if(SCU_INIT_PNSSET3_VAL & BIT17) NVIC->ITNS[1] |= BIT5 ; /* Int of UART1_INT */
161 + if(SCU_INIT_PNSSET3_VAL & BIT18) NVIC->ITNS[1] |= BIT16; /* Int of UART2_INT */
162 + if(SCU_INIT_PNSSET3_VAL & BIT19) NVIC->ITNS[1] |= BIT17; /* Int of UART3_INT */
163 + if(SCU_INIT_PNSSET3_VAL & BIT20) NVIC->ITNS[2] |= BIT10; /* Int of UART4_INT */
164 + if(SCU_INIT_PNSSET3_VAL & BIT21) NVIC->ITNS[2] |= BIT11; /* Int of UART5_INT */
165 + if(SCU_INIT_PNSSET4_VAL & BIT0 ) NVIC->ITNS[1] |= BIT6 ; /* Int of I2C0_INT */
166 + if(SCU_INIT_PNSSET4_VAL & BIT1 ) NVIC->ITNS[1] |= BIT7 ; /* Int of I2C1_INT */
167 + if(SCU_INIT_PNSSET4_VAL & BIT2 ) NVIC->ITNS[2] |= BIT18; /* Int of I2C2_INT */
168 + if(SCU_INIT_PNSSET4_VAL & BIT16) NVIC->ITNS[1] |= BIT26; /* Int of SC0_INT */
169 + if(SCU_INIT_PNSSET4_VAL & BIT17) NVIC->ITNS[1] |= BIT27; /* Int of SC1_INT */
170 + if(SCU_INIT_PNSSET4_VAL & BIT18) NVIC->ITNS[1] |= BIT28; /* Int of SC2_INT */
171 + if(SCU_INIT_PNSSET5_VAL & BIT0 ) NVIC->ITNS[1] |= BIT24; /* Int of CAN0_INT */
172 + if(SCU_INIT_PNSSET5_VAL & BIT16) NVIC->ITNS[2] |= BIT20; /* Int of QEI0_INT */
173 + if(SCU_INIT_PNSSET5_VAL & BIT17) NVIC->ITNS[2] |= BIT21; /* Int of QEI1_INT */
174 + if(SCU_INIT_PNSSET5_VAL & BIT20) NVIC->ITNS[2] |= BIT22; /* Int of ECAP0_INT */
175 + if(SCU_INIT_PNSSET5_VAL & BIT21) NVIC->ITNS[2] |= BIT23; /* Int of ECAP1_INT */
176 + if(SCU_INIT_PNSSET5_VAL & BIT25) NVIC->ITNS[3] |= BIT5 ; /* Int of TRNG_INT */
177 + if(SCU_INIT_PNSSET5_VAL & BIT27) NVIC->ITNS[3] |= BIT4 ; /* Int of LCD_INT */
178 + if(SCU_INIT_PNSSET5_VAL & BIT29) NVIC->ITNS[3] |= BIT14; /* Int of TAMPER_INT */
179 + if(SCU_INIT_PNSSET6_VAL & BIT0 ) NVIC->ITNS[1] |= BIT21; /* Int of USBD_INT */
180 + if(SCU_INIT_PNSSET6_VAL & BIT16) NVIC->ITNS[2] |= BIT12; /* Int of USCI0_INT */
181 + if(SCU_INIT_PNSSET6_VAL & BIT17) NVIC->ITNS[2] |= BIT13; /* Int of USCI1_INT */
182 + if(SCU_INIT_IONSSET_VAL & BIT0 ) NVIC->ITNS[0] |= BIT16; /* Int of PA */
183 + if(SCU_INIT_IONSSET_VAL & BIT1 ) NVIC->ITNS[0] |= BIT17; /* Int of PB */
184 + if(SCU_INIT_IONSSET_VAL & BIT2 ) NVIC->ITNS[0] |= BIT18; /* Int of PC */
185 + if(SCU_INIT_IONSSET_VAL & BIT3 ) NVIC->ITNS[0] |= BIT19; /* Int of PD */
186 + if(SCU_INIT_IONSSET_VAL & BIT4 ) NVIC->ITNS[0] |= BIT20; /* Int of PE */
187 + if(SCU_INIT_IONSSET_VAL & BIT5 ) NVIC->ITNS[0] |= BIT21; /* Int of PF */
188 + if(SCU_INIT_IONSSET_VAL & BIT6 ) NVIC->ITNS[2] |= BIT8 ; /* Int of PG */
189 + if(SCU_INIT_IONSSET_VAL & BIT7 ) NVIC->ITNS[2] |= BIT24; /* Int of PH */
190 +
191 +
192 + /* Enable SCU Int status */
193 + SCU->SVIOIEN = (uint32_t)-1;
194 + NVIC_EnableIRQ(SCU_IRQn);
195 +
196 +}
197 +
198 +#if defined( __ICCARM__ )
199 +__WEAK
200 +#else
201 +__attribute__((weak))
202 +#endif
203 +
204 +void SCU_IRQHandler(void)
205 +{
206 + char const *master[] = {"CPU", 0, 0, "PDMA0", "SDH0", "CRPT", "USBH", 0,0,0,0,"PDMA1"};
207 + char const *ipname[] = {"APB0","APB1",0,0,"GPIO","EBI","USBH","CRC","SDH0",0,"PDMA0","PDMA1"
208 + ,"SRAM0","SRAM1","FMC","FLASH","SCU","SYS","CRPT"};
209 + const uint8_t info[] = {0x34,0x3C,0,0, 0x44,0x4C,0x54,0x5C,0x64,0,0x74,0x7C,0x84,0x8C,0x94,0x9C,0xA4,0xAC,0xB4};
210 +
211 + uint32_t u32Reg, u32Addr;
212 + uint32_t i;
213 +
214 + /* TrustZone access policy */
215 + u32Reg = SCU->SVINTSTS;
216 + if(u32Reg)
217 + {
218 +
219 + /* Get violation address and source */
220 + for(i=0;i< sizeof(ipname);i++)
221 + {
222 + if(u32Reg & (1 << i))
223 + {
224 + u32Addr = M32(SCU_BASE+info[i]+4);
225 + printf(" %s(0x%08x) Alarm! illegal access by %s\n",ipname[i], u32Addr,master[M32(SCU_BASE+info[i])]);
226 + SCU->SVINTSTS = (1 << i);
227 + break;
228 +
229 + }
230 +
231 + }
232 + }
233 +}
234 +
235 +
236 +/**
237 + \brief Setup a Nonsecure callable Region
238 + \details The base and limit of Nonsecure callable region is dependent on the
239 + application code size.
240 + */
241 +void NSC_Init(void)
242 +{
243 + uint32_t u32Region;
244 + uint32_t u32Base, u32Limit;
245 +
246 +#if defined (__ICCARM__)
247 +# pragma section = "NSC"
248 + u32Base = (uint32_t)__section_begin("NSC");
249 + u32Limit = (uint32_t)__section_end("NSC");
250 +#elif defined(__ARMCC_VERSION)
251 +#pragma clang diagnostic push
252 +#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension"
253 + extern uint32_t Image$$NSC_ROM$$XO$$Base[];
254 + extern uint32_t Image$$NSC_ROM$$XO$$Limit[];
255 + u32Base = (uint32_t)Image$$NSC_ROM$$XO$$Base;
256 + u32Limit = (uint32_t)Image$$NSC_ROM$$XO$$Limit;
257 +#pragma clang diagnostic pop
258 +#else
259 + extern uint32_t __start_NSC[];
260 + extern uint32_t __end_NSC[];
261 + u32Base = (uint32_t)__start_NSC;
262 + u32Limit = (uint32_t)__end_NSC;
263 +#endif
264 +
265 + /* SAU region 3 is dedicated for NSC */
266 + u32Region = 3;
267 + SAU->RNR = (u32Region & SAU_RNR_REGION_Msk);
268 + SAU->RBAR = (u32Base & SAU_RBAR_BADDR_Msk);
269 + SAU->RLAR = ((u32Limit-1) & SAU_RLAR_LADDR_Msk) |
270 + ((1ul << SAU_RLAR_NSC_Pos) & SAU_RLAR_NSC_Msk) | 1ul;
271 +
272 +}
273 +
274 +
275 +/**
276 + \brief Setup a SAU Region
277 + \details Writes the region information contained in SAU_Region to the
278 + registers SAU_RNR, SAU_RBAR, and SAU_RLAR
279 + */
280 +void TZ_SAU_Setup(void)
281 +{
282 +
283 +#if defined (__SAU_PRESENT) && (__SAU_PRESENT == 1U)
284 +
285 +#if defined (SAU_INIT_REGION0) && (SAU_INIT_REGION0 == 1U)
286 + SAU_INIT_REGION(0);
287 +#endif
288 +
289 +#if defined (SAU_INIT_REGION1) && (SAU_INIT_REGION1 == 1U)
290 + SAU_INIT_REGION(1);
291 +#endif
292 +
293 +#if defined (SAU_INIT_REGION2) && (SAU_INIT_REGION2 == 1U)
294 + SAU_INIT_REGION(2);
295 +#endif
296 +
297 +#if defined (SAU_INIT_REGION3) && (SAU_INIT_REGION3 == 1U)
298 + SAU_INIT_REGION(3);
299 +#endif
300 +
301 +#if defined (SAU_INIT_REGION4) && (SAU_INIT_REGION4 == 1U)
302 + SAU_INIT_REGION(4);
303 +#endif
304 +
305 +#if defined (SAU_INIT_REGION5) && (SAU_INIT_REGION5 == 1U)
306 + SAU_INIT_REGION(5);
307 +#endif
308 +
309 +#if defined (SAU_INIT_REGION6) && (SAU_INIT_REGION6 == 1U)
310 + SAU_INIT_REGION(6);
311 +#endif
312 +
313 +#if defined (SAU_INIT_REGION7) && (SAU_INIT_REGION7 == 1U)
314 + SAU_INIT_REGION(7);
315 +#endif
316 +
317 + /* repeat this for all possible SAU regions */
318 +
319 +
320 +#if defined (SAU_INIT_CTRL) && (SAU_INIT_CTRL == 1U)
321 + SAU->CTRL = ((SAU_INIT_CTRL_ENABLE << SAU_CTRL_ENABLE_Pos) & SAU_CTRL_ENABLE_Msk) |
322 + ((SAU_INIT_CTRL_ALLNS << SAU_CTRL_ALLNS_Pos) & SAU_CTRL_ALLNS_Msk) ;
323 +#endif
324 +
325 +#endif /* defined (__SAU_PRESENT) && (__SAU_PRESENT == 1U) */
326 +
327 +#if defined (SCB_CSR_AIRCR_INIT) && (SCB_CSR_AIRCR_INIT == 1U)
328 + SCB->SCR = (SCB->SCR & ~(SCB_SCR_SLEEPDEEPS_Msk)) |
329 + ((SCB_CSR_DEEPSLEEPS_VAL << SCB_SCR_SLEEPDEEPS_Pos) & SCB_SCR_SLEEPDEEPS_Msk);
330 +
331 + SCB->AIRCR = (0x05FA << 16) |
332 + ((SCB_AIRCR_SYSRESETREQS_VAL << SCB_AIRCR_SYSRESETREQS_Pos) & SCB_AIRCR_SYSRESETREQS_Msk) |
333 + ((SCB_AIRCR_BFHFNMINS_VAL << SCB_AIRCR_BFHFNMINS_Pos) & SCB_AIRCR_BFHFNMINS_Msk) |
334 + ((SCB_AIRCR_PRIS_VAL << SCB_AIRCR_PRIS_Pos) & SCB_AIRCR_PRIS_Msk);
335 +
336 +
337 +
338 +#endif /* defined (SCB_CSR_AIRCR_INIT) && (SCB_CSR_AIRCR_INIT == 1U) */
339 +
340 +#if defined (SCB_ICSR_INIT) && (SCB_ICSR_INIT == 1U)
341 + SCB->ICSR = (SCB->ICSR & ~(SCB_ICSR_STTNS_Msk)) |
342 + ((SCB_ICSR_STTNS_VAL << SCB_ICSR_STTNS_Pos) & SCB_ICSR_STTNS_Msk);
343 +#endif /* defined (SCB_ICSR_INIT) && (SCB_ICSR_INIT == 1U) */
344 +
345 + /* repeat this for all possible ITNS elements */
346 +
347 + /* Initial Nonsecure callable region */
348 + NSC_Init();
349 +
350 +
351 +}
352 +#else
353 +void SCU_IRQHandler(void)
354 +{
355 + while(1);
356 +}
357 +#endif
358 +
359 +
360 +/**
361 + * @brief Update the Variable SystemCoreClock
362 + *
363 + * @param None
364 + *
365 + * @return None
366 + *
367 + * @details This function is used to update the variable SystemCoreClock
368 + * and must be called whenever the core clock is changed.
369 + */
370 +void SystemCoreClockUpdate(void)
371 +{
372 + /* Update PLL Clock */
373 + PllClock = CLK_GetPLLClockFreq();
374 +
375 + /* Update System Core Clock */
376 + SystemCoreClock = CLK_GetCPUFreq();
377 +
378 + /* Update Cycles per micro second */
379 + CyclesPerUs = (SystemCoreClock + 500000UL) / 1000000UL;
380 +}
381 +
382 +
383 +
384 +/**
385 + * @brief System Initialization
386 + *
387 + * @param None
388 + *
389 + * @return None
390 + *
391 + * @details The necessary initialization of system. Global variables are forbidden here.
392 + */
393 +void SystemInit(void)
394 +{
395 +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
396 + SCB->VTOR = (uint32_t) &__Vectors;
397 +#endif
398 +
399 +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)
400 + TZ_SAU_Setup();
401 + SCU_Setup();
402 + FMC_NSBA_Setup();
403 +#endif
404 +
405 +#ifdef INIT_SYSCLK_AT_BOOTING
406 +
407 +#endif
408 +
409 +}
410 +
411 +
412 +#if USE_ASSERT
413 +
414 +/**
415 + * @brief Assert Error Message
416 + *
417 + * @param[in] file the source file name
418 + * @param[in] line line number
419 + *
420 + * @return None
421 + *
422 + * @details The function prints the source file name and line number where
423 + * the ASSERT_PARAM() error occurs, and then stops in an infinite loop.
424 + */
425 +void AssertError(uint8_t * file, uint32_t line)
426 +{
427 +
428 + printf("[%s] line %d : wrong parameters.\r\n", file, line);
429 +
430 + /* Infinite loop */
431 + while(1) ;
432 +}
433 +#endif
434 +
435 +
436 +#if (defined(__ICCARM__) && (__VER__ >= 7080000) && (__VER__ < 8020000))
437 +
438 +#if (__ARM_FEATURE_CMSE == 3U)
439 +/**
440 + \brief Get Process Stack Pointer (non-secure)
441 + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state.
442 + \return PSP Register value
443 + */
444 +uint32_t __TZ_get_PSP_NS(void)
445 +{
446 + register uint32_t result;
447 +
448 + __ASM volatile("MRS %0, psp_ns" : "=r"(result));
449 + return(result);
450 +}
451 +
452 +
453 +/**
454 + \brief Set Process Stack Pointer (non-secure)
455 + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state.
456 + \param [in] topOfProcStack Process Stack Pointer value to set
457 + */
458 +void __TZ_set_PSP_NS(uint32_t topOfProcStack)
459 +{
460 + __ASM volatile("MSR psp_ns, %0" : : "r"(topOfProcStack));
461 +}
462 +
463 +
464 +
465 +/**
466 + \brief Get Main Stack Pointer (non-secure)
467 + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state.
468 + \return MSP Register value
469 + */
470 +int32_t __TZ_get_MSP_NS(void)
471 +{
472 + register uint32_t result;
473 +
474 + __ASM volatile("MRS %0, msp_ns" : "=r"(result));
475 + return(result);
476 +}
477 +
478 +
479 +
480 +/**
481 + \brief Set Main Stack Pointer (non-secure)
482 + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state.
483 + \param [in] topOfMainStack Main Stack Pointer value to set
484 + */
485 +void __TZ_set_MSP_NS(uint32_t topOfMainStack)
486 +{
487 + __ASM volatile("MSR msp_ns, %0" : : "r"(topOfMainStack));
488 +}
489 +
490 +
491 +
492 +/**
493 + \brief Get Priority Mask (non-secure)
494 + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state.
495 + \return Priority Mask value
496 + */
497 +uint32_t __TZ_get_PRIMASK_NS(void)
498 +{
499 + uint32_t result;
500 +
501 + __ASM volatile("MRS %0, primask_ns" : "=r"(result));
502 + return(result);
503 +}
504 +
505 +
506 +
507 +/**
508 + \brief Set Priority Mask (non-secure)
509 + \details Assigns the given value to the non-secure Priority Mask Register when in secure state.
510 + \param [in] priMask Priority Mask
511 + */
512 +void __TZ_set_PRIMASK_NS(uint32_t priMask)
513 +{
514 + __ASM volatile("MSR primask_ns, %0" : : "r"(priMask) : "memory");
515 +}
516 +
517 +
518 +#endif
519 +
520 +
521 +#endif
522 +
523 +
524 +
1 +/*------------------------------------------------------------------------------
2 + * MDK Middleware - Component ::Network
3 + * Copyright (c) 2004-2019 Arm Limited (or its affiliates). All rights reserved.
4 + *------------------------------------------------------------------------------
5 + * Name: Net_Config.c
6 + * Purpose: Network Configuration
7 + * Rev.: V7.1.0
8 + *----------------------------------------------------------------------------*/
9 +
10 +//-------- <<< Use Configuration Wizard in Context Menu >>> --------------------
11 +
12 +// <h>Network System Settings
13 +// <i>Global Network System definitions
14 +// <s.15>Local Host Name
15 +// <i>This is the name under which embedded host can be
16 +// <i>accessed on a local area network.
17 +// <i>Default: "my_host"
18 +#define NET_HOST_NAME "my_host"
19 +
20 +// <o>Memory Pool Size <1536-262144:4>
21 +// <i>This is the size of a memory pool in bytes. Buffers for
22 +// <i>network packets are allocated from this memory pool.
23 +// <i>Default: 12000 bytes
24 +#define NET_MEM_POOL_SIZE 12000
25 +
26 +// <q>Start System Services
27 +// <i>If enabled, the system will automatically start server services
28 +// <i>(HTTP, FTP, TFTP server, ...) when initializing the network system.
29 +// <i>Default: Enabled
30 +#define NET_START_SERVICE 1
31 +
32 +// <h>OS Resource Settings
33 +// <i>These settings are used to optimize usage of OS resources.
34 +// <o>Core Thread Stack Size <512-65535:4>
35 +// <i>Default: 1024 bytes
36 +#define NET_THREAD_STACK_SIZE 1024
37 +
38 +// Core Thread Priority
39 +#define NET_THREAD_PRIORITY osPriorityNormal
40 +
41 +// </h>
42 +// </h>
43 +
44 +//------------- <<< end of configuration section >>> ---------------------------
45 +
46 +#include "RTE_Components.h"
47 +
48 +#ifdef RTE_Network_Interface_ETH_0
49 +#include "Net_Config_ETH_0.h"
50 +#endif
51 +#ifdef RTE_Network_Interface_ETH_1
52 +#include "Net_Config_ETH_1.h"
53 +#endif
54 +
55 +#ifdef RTE_Network_Interface_WiFi_0
56 +#include "Net_Config_WiFi_0.h"
57 +#endif
58 +
59 +#ifdef RTE_Network_Interface_WiFi_1
60 +#include "Net_Config_WiFi_1.h"
61 +#endif
62 +
63 +#ifdef RTE_Network_Interface_PPP
64 +#include "Net_Config_PPP.h"
65 +#endif
66 +
67 +#ifdef RTE_Network_Interface_SLIP
68 +#include "Net_Config_SLIP.h"
69 +#endif
70 +
71 +#ifdef RTE_Network_Socket_UDP
72 +#include "Net_Config_UDP.h"
73 +#endif
74 +#ifdef RTE_Network_Socket_TCP
75 +#include "Net_Config_TCP.h"
76 +#endif
77 +#ifdef RTE_Network_Socket_BSD
78 +#include "Net_Config_BSD.h"
79 +#endif
80 +
81 +#ifdef RTE_Network_Web_Server_RO
82 +#include "Net_Config_HTTP_Server.h"
83 +#endif
84 +#ifdef RTE_Network_Web_Server_FS
85 +#include "Net_Config_HTTP_Server.h"
86 +#endif
87 +
88 +#ifdef RTE_Network_Telnet_Server
89 +#include "Net_Config_Telnet_Server.h"
90 +#endif
91 +
92 +#ifdef RTE_Network_TFTP_Server
93 +#include "Net_Config_TFTP_Server.h"
94 +#endif
95 +#ifdef RTE_Network_TFTP_Client
96 +#include "Net_Config_TFTP_Client.h"
97 +#endif
98 +
99 +#ifdef RTE_Network_FTP_Server
100 +#include "Net_Config_FTP_Server.h"
101 +#endif
102 +#ifdef RTE_Network_FTP_Client
103 +#include "Net_Config_FTP_Client.h"
104 +#endif
105 +
106 +#ifdef RTE_Network_DNS_Client
107 +#include "Net_Config_DNS_Client.h"
108 +#endif
109 +
110 +#ifdef RTE_Network_SMTP_Client
111 +#include "Net_Config_SMTP_Client.h"
112 +#endif
113 +
114 +#ifdef RTE_Network_SNMP_Agent
115 +#include "Net_Config_SNMP_Agent.h"
116 +#endif
117 +
118 +#ifdef RTE_Network_SNTP_Client
119 +#include "Net_Config_SNTP_Client.h"
120 +#endif
121 +
122 +#include "net_config.h"
123 +
124 +/**
125 +\addtogroup net_genFunc
126 +@{
127 +*/
128 +/**
129 + \fn void net_sys_error (NET_ERROR error)
130 + \ingroup net_cores
131 + \brief Network system error handler.
132 +*/
133 +void net_sys_error (NET_ERROR error) {
134 + /* This function is called when a fatal error is encountered. */
135 + /* The normal program execution is not possible anymore. */
136 +
137 + switch (error) {
138 + case NET_ERROR_MEM_ALLOC:
139 + /* Out of memory */
140 + break;
141 +
142 + case NET_ERROR_MEM_FREE:
143 + /* Trying to release non existing memory block */
144 + break;
145 +
146 + case NET_ERROR_MEM_CORRUPT:
147 + /* Memory Link pointer corrupted */
148 + /* More data written than the size of allocated memory block */
149 + break;
150 +
151 + case NET_ERROR_CONFIG:
152 + /* Network configuration error detected */
153 + break;
154 +
155 + case NET_ERROR_UDP_ALLOC:
156 + /* Out of UDP Sockets */
157 + break;
158 +
159 + case NET_ERROR_TCP_ALLOC:
160 + /* Out of TCP Sockets */
161 + break;
162 +
163 + case NET_ERROR_TCP_STATE:
164 + /* TCP State machine in undefined state */
165 + break;
166 + }
167 +
168 + /* End-less loop */
169 + while (1);
170 +}
171 +/**
172 +@}
173 +*/
1 +/*------------------------------------------------------------------------------
2 + * MDK Middleware - Component ::Network:Socket
3 + * Copyright (c) 2004-2019 Arm Limited (or its affiliates). All rights reserved.
4 + *------------------------------------------------------------------------------
5 + * Name: Net_Config_TCP.h
6 + * Purpose: Network Configuration for TCP Sockets
7 + * Rev.: V7.1.1
8 + *----------------------------------------------------------------------------*/
9 +
10 +//-------- <<< Use Configuration Wizard in Context Menu >>> --------------------
11 +
12 +// <h>TCP Sockets
13 +#define TCP_ENABLE 1
14 +
15 +// <o>Number of TCP Sockets <1-20>
16 +// <i>Number of available TCP sockets
17 +// <i>Default: 6
18 +#define TCP_NUM_SOCKS 6
19 +
20 +// <o>Number of Retries <0-20>
21 +// <i>How many times TCP module will try to retransmit data
22 +// <i>before giving up. Increase this value for high-latency
23 +// <i>and low throughput networks.
24 +// <i>Default: 5
25 +#define TCP_MAX_RETRY 5
26 +
27 +// <o>Retry Timeout in seconds <1-10>
28 +// <i>If data frame not acknowledged within this time frame,
29 +// <i>TCP module will try to resend the data again.
30 +// <i>Default: 4
31 +#define TCP_RETRY_TOUT 4
32 +
33 +// <o>Default Connect Timeout in seconds <1-65535>
34 +// <i>If no TCP data frame has been exchanged during this time,
35 +// <i>the TCP connection is either closed or a keep-alive frame
36 +// <i>is sent to verify that the connection still exists.
37 +// <i>Default: 120
38 +#define TCP_DEFAULT_TOUT 120
39 +
40 +// <o>Maximum Segment Size <536-1440>
41 +// <i>The Maximum Segment Size specifies the maximum
42 +// <i>number of bytes in the TCP segment's Data field.
43 +// <i>Default: 1440
44 +#define TCP_MAX_SEG_SIZE 1440
45 +
46 +// <o>Receive Window Size <536-65535>
47 +// <i>Receive Window Size specifies the size of data,
48 +// <i>that the socket is able to buffer in flow-control mode.
49 +// <i>Default: 4320
50 +#define TCP_RECEIVE_WIN_SIZE 4320
51 +
52 +// </h>
53 +
54 +// TCP Initial Retransmit period in seconds
55 +#define TCP_INITIAL_RETRY_TOUT 1
56 +
57 +// TCP SYN frame retransmit period in seconds
58 +#define TCP_SYN_RETRY_TOUT 2
59 +
60 +// Number of retries to establish a connection
61 +#define TCP_CONNECT_RETRY 7
62 +
63 +// Dynamic port start (default 49152)
64 +#define TCP_DYN_PORT_START 49152
65 +
66 +// Dynamic port end (default 65535)
67 +#define TCP_DYN_PORT_END 65535
68 +
69 +//------------- <<< end of configuration section >>> ---------------------------
1 +/*
2 + * Configuration template
3 + *
4 + * Copyright (C) 2006-2021, Arm Limited, All Rights Reserved
5 + * SPDX-License-Identifier: Apache-2.0
6 + *
7 + * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 + * not use this file except in compliance with the License.
9 + * You may obtain a copy of the License at
10 + *
11 + * http://www.apache.org/licenses/LICENSE-2.0
12 + *
13 + * Unless required by applicable law or agreed to in writing, software
14 + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 + * See the License for the specific language governing permissions and
17 + * limitations under the License.
18 + */
19 +/*
20 + * This set of compile-time options may be used to enable
21 + * or disable features selectively, and reduce the global
22 + * memory footprint.
23 + */
24 +
25 +#ifndef MBEDTLS_CONFIG_H
26 +#define MBEDTLS_CONFIG_H
27 +
28 +/* System support */
29 +//#define MBEDTLS_HAVE_ASM
30 +//#define MBEDTLS_HAVE_TIME
31 +//#define MBEDTLS_HAVE_TIME_DATE
32 +//#define MBEDTLS_PLATFORM_MEMORY
33 +//#define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS
34 +//#define MBEDTLS_CHECK_PARAMS
35 +
36 +/* mbed TLS feature support */
37 +//#define MBEDTLS_AES_ROM_TABLES
38 +//#define MBEDTLS_AES_FEWER_TABLES
39 +//#define MBEDTLS_CAMELLIA_SMALL_MEMORY
40 +//#define MBEDTLS_CIPHER_MODE_CBC
41 +//#define MBEDTLS_CIPHER_MODE_CFB
42 +//#define MBEDTLS_CIPHER_MODE_CTR
43 +//#define MBEDTLS_CIPHER_MODE_OFB
44 +//#define MBEDTLS_CIPHER_MODE_XTS
45 +//#define MBEDTLS_CIPHER_PADDING_PKCS7
46 +//#define MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS
47 +//#define MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN
48 +//#define MBEDTLS_CIPHER_PADDING_ZEROS
49 +//#define MBEDTLS_REMOVE_ARC4_CIPHERSUITES
50 +//#define MBEDTLS_REMOVE_3DES_CIPHERSUITES
51 +//#define MBEDTLS_ECP_DP_SECP192R1_ENABLED
52 +//#define MBEDTLS_ECP_DP_SECP224R1_ENABLED
53 +//#define MBEDTLS_ECP_DP_SECP256R1_ENABLED
54 +//#define MBEDTLS_ECP_DP_SECP384R1_ENABLED
55 +//#define MBEDTLS_ECP_DP_SECP521R1_ENABLED
56 +//#define MBEDTLS_ECP_DP_SECP192K1_ENABLED
57 +//#define MBEDTLS_ECP_DP_SECP224K1_ENABLED
58 +//#define MBEDTLS_ECP_DP_SECP256K1_ENABLED
59 +//#define MBEDTLS_ECP_DP_BP256R1_ENABLED
60 +//#define MBEDTLS_ECP_DP_BP384R1_ENABLED
61 +//#define MBEDTLS_ECP_DP_BP512R1_ENABLED
62 +//#define MBEDTLS_ECP_DP_CURVE25519_ENABLED
63 +//#define MBEDTLS_ECP_DP_CURVE448_ENABLED
64 +//#define MBEDTLS_ECP_NIST_OPTIM
65 +//#define MBEDTLS_ECP_RESTARTABLE
66 +//#define MBEDTLS_ECDSA_DETERMINISTIC
67 +//#define MBEDTLS_KEY_EXCHANGE_PSK_ENABLED
68 +//#define MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED
69 +//#define MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED
70 +//#define MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED
71 +//#define MBEDTLS_KEY_EXCHANGE_RSA_ENABLED
72 +//#define MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED
73 +//#define MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED
74 +//#define MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
75 +//#define MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED
76 +//#define MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED
77 +//#define MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED
78 +//#define MBEDTLS_PK_PARSE_EC_EXTENDED
79 +//#define MBEDTLS_ERROR_STRERROR_DUMMY
80 +//#define MBEDTLS_GENPRIME
81 +//#define MBEDTLS_FS_IO
82 +//#define MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES
83 +//#define MBEDTLS_NO_PLATFORM_ENTROPY
84 +//#define MBEDTLS_ENTROPY_FORCE_SHA256
85 +//#define MBEDTLS_ENTROPY_NV_SEED
86 +//#define MBEDTLS_MEMORY_DEBUG
87 +//#define MBEDTLS_MEMORY_BACKTRACE
88 +//#define MBEDTLS_PK_RSA_ALT_SUPPORT
89 +//#define MBEDTLS_PKCS1_V15
90 +//#define MBEDTLS_PKCS1_V21
91 +//#define MBEDTLS_PSA_CRYPTO_SPM
92 +//#define MBEDTLS_RSA_NO_CRT
93 +//#define MBEDTLS_SELF_TEST
94 +//#define MBEDTLS_SHA256_SMALLER
95 +//#define MBEDTLS_SHA512_SMALLER
96 +//#define MBEDTLS_SHA512_NO_SHA384
97 +//#define MBEDTLS_SSL_ALL_ALERT_MESSAGES
98 +//#define MBEDTLS_SSL_RECORD_CHECKING
99 +//#define MBEDTLS_SSL_DTLS_CONNECTION_ID
100 +//#define MBEDTLS_SSL_ASYNC_PRIVATE
101 +//#define MBEDTLS_SSL_CONTEXT_SERIALIZATION
102 +//#define MBEDTLS_SSL_DEBUG_ALL
103 +//#define MBEDTLS_SSL_ENCRYPT_THEN_MAC
104 +//#define MBEDTLS_SSL_EXTENDED_MASTER_SECRET
105 +//#define MBEDTLS_SSL_FALLBACK_SCSV
106 +//#define MBEDTLS_SSL_KEEP_PEER_CERTIFICATE
107 +//#define MBEDTLS_SSL_HW_RECORD_ACCEL
108 +//#define MBEDTLS_SSL_CBC_RECORD_SPLITTING
109 +//#define MBEDTLS_SSL_RENEGOTIATION
110 +//#define MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO
111 +//#define MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE
112 +//#define MBEDTLS_SSL_MAX_FRAGMENT_LENGTH
113 +//#define MBEDTLS_SSL_PROTO_SSL3
114 +//#define MBEDTLS_SSL_PROTO_TLS1
115 +//#define MBEDTLS_SSL_PROTO_TLS1_1
116 +//#define MBEDTLS_SSL_PROTO_TLS1_2
117 +//#define MBEDTLS_SSL_PROTO_DTLS
118 +//#define MBEDTLS_SSL_ALPN
119 +//#define MBEDTLS_SSL_DTLS_ANTI_REPLAY
120 +//#define MBEDTLS_SSL_DTLS_HELLO_VERIFY
121 +//#define MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE
122 +//#define MBEDTLS_SSL_DTLS_BADMAC_LIMIT
123 +//#define MBEDTLS_SSL_SESSION_TICKETS
124 +//#define MBEDTLS_SSL_EXPORT_KEYS
125 +//#define MBEDTLS_SSL_SERVER_NAME_INDICATION
126 +//#define MBEDTLS_SSL_TRUNCATED_HMAC
127 +//#define MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH
128 +//#define MBEDTLS_USE_PSA_CRYPTO
129 +//#define MBEDTLS_VERSION_FEATURES
130 +//#define MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3
131 +//#define MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION
132 +//#define MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK
133 +//#define MBEDTLS_X509_CHECK_KEY_USAGE
134 +//#define MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE
135 +//#define MBEDTLS_X509_RSASSA_PSS_SUPPORT
136 +//#define MBEDTLS_ZLIB_SUPPORT
137 +
138 +/* mbed TLS modules */
139 +//#define MBEDTLS_AES_C
140 +//#define MBEDTLS_ARC4_C
141 +//#define MBEDTLS_ASN1_PARSE_C
142 +//#define MBEDTLS_ASN1_WRITE_C
143 +//#define MBEDTLS_BASE64_C
144 +//#define MBEDTLS_BIGNUM_C
145 +//#define MBEDTLS_BLOWFISH_C
146 +//#define MBEDTLS_CAMELLIA_C
147 +//#define MBEDTLS_ARIA_C
148 +//#define MBEDTLS_CCM_C
149 +//#define MBEDTLS_CERTS_C
150 +//#define MBEDTLS_CHACHA20_C
151 +//#define MBEDTLS_CHACHAPOLY_C
152 +//#define MBEDTLS_CIPHER_C
153 +//#define MBEDTLS_CMAC_C
154 +//#define MBEDTLS_CTR_DRBG_C
155 +//#define MBEDTLS_DEBUG_C
156 +//#define MBEDTLS_DES_C
157 +//#define MBEDTLS_DHM_C
158 +//#define MBEDTLS_ECDH_C
159 +//#define MBEDTLS_ECDSA_C
160 +//#define MBEDTLS_ECJPAKE_C
161 +//#define MBEDTLS_ECP_C
162 +//#define MBEDTLS_ENTROPY_C
163 +//#define MBEDTLS_ERROR_C
164 +//#define MBEDTLS_GCM_C
165 +//#define MBEDTLS_HAVEGE_C
166 +//#define MBEDTLS_HKDF_C
167 +//#define MBEDTLS_HMAC_DRBG_C
168 +//#define MBEDTLS_NIST_KW_C
169 +//#define MBEDTLS_MD_C
170 +//#define MBEDTLS_MD2_C
171 +//#define MBEDTLS_MD4_C
172 +//#define MBEDTLS_MD5_C
173 +//#define MBEDTLS_MEMORY_BUFFER_ALLOC_C
174 +//#define MBEDTLS_NET_C
175 +//#define MBEDTLS_OID_C
176 +//#define MBEDTLS_PEM_PARSE_C
177 +//#define MBEDTLS_PEM_WRITE_C
178 +//#define MBEDTLS_PK_C
179 +//#define MBEDTLS_PK_PARSE_C
180 +//#define MBEDTLS_PK_WRITE_C
181 +//#define MBEDTLS_PKCS5_C
182 +//#define MBEDTLS_PKCS11_C
183 +//#define MBEDTLS_PKCS12_C
184 +//#define MBEDTLS_PLATFORM_C
185 +//#define MBEDTLS_POLY1305_C
186 +//#define MBEDTLS_PSA_CRYPTO_C
187 +//#define MBEDTLS_PSA_CRYPTO_SE_C
188 +//#define MBEDTLS_PSA_CRYPTO_STORAGE_C
189 +//#define MBEDTLS_PSA_ITS_FILE_C
190 +//#define MBEDTLS_RIPEMD160_C
191 +//#define MBEDTLS_RSA_C
192 +//#define MBEDTLS_SHA1_C
193 +//#define MBEDTLS_SHA256_C
194 +//#define MBEDTLS_SHA512_C
195 +//#define MBEDTLS_SSL_CACHE_C
196 +//#define MBEDTLS_SSL_COOKIE_C
197 +//#define MBEDTLS_SSL_TICKET_C
198 +//#define MBEDTLS_SSL_CLI_C
199 +//#define MBEDTLS_SSL_SRV_C
200 +//#define MBEDTLS_SSL_TLS_C
201 +//#define MBEDTLS_THREADING_C
202 +//#define MBEDTLS_TIMING_C
203 +//#define MBEDTLS_VERSION_C
204 +//#define MBEDTLS_X509_USE_C
205 +//#define MBEDTLS_X509_CRT_PARSE_C
206 +//#define MBEDTLS_X509_CRL_PARSE_C
207 +//#define MBEDTLS_X509_CSR_PARSE_C
208 +//#define MBEDTLS_X509_CREATE_C
209 +//#define MBEDTLS_X509_CRT_WRITE_C
210 +//#define MBEDTLS_X509_CSR_WRITE_C
211 +//#define MBEDTLS_XTEA_C
212 +
213 +#include "mbedtls/check_config.h"
214 +
215 +#endif /* MBEDTLS_CONFIG_H */
1 +
2 +/*
3 + * Auto generated Run-Time-Environment Configuration File
4 + * *** Do not modify ! ***
5 + *
6 + * Project: 'NonSecure'
7 + * Target: 'NonSecure'
8 + */
9 +
10 +#ifndef RTE_COMPONENTS_H
11 +#define RTE_COMPONENTS_H
12 +
13 +
14 +/*
15 + * Define the Device Header File:
16 + */
17 +#define CMSIS_device_header "M2351.h"
18 +
19 +/* ARM::PSA:Crypto:mbed TLS:2.24.0 */
20 +#define RTE_PSA_API_CRYPTO
21 +
22 +
23 +#endif /* RTE_COMPONENTS_H */
1 +/******************************************************************************
2 +**************************Hardware interface layer*****************************
3 +* | file : DEV_Config.c
4 +* | version : V1.0
5 +* | date : 2017-08-14
6 +* | function :
7 + Provide the hardware underlying interface
8 +******************************************************************************/
9 +#include "DEV_Config.h"
10 +
11 +//#include "stm32f1xx_hal_i2c.h"
12 +//#include "i2c.h"
13 +
14 +//#include "stm32f1xx_hal_spi.h"
15 +//#include "spi.h"
16 +
17 +//#include "usart.h"
18 +#include <stdio.h> //printf()
19 +#include <string.h>
20 +#include <stdlib.h>
21 +
22 +/********************************************************************************
23 +function: System Init
24 +note:
25 + Initialize the communication method
26 +********************************************************************************/
27 +uint8_t System_Init(void)
28 +{
29 +#if USE_SPI_4W
30 + //printf("USE 4wire spi\r\n");
31 +#elif USE_IIC
32 + printf("USE i2c\r\n");
33 + //DC = 1 => addrdess = 0X3D
34 + //DC = 0 => addrdess = 0X3C
35 + OLED_DC_1;
36 +#endif
37 + return 0;
38 +}
39 +
40 +void System_Exit(void)
41 +{
42 +
43 +}
44 +/********************************************************************************
45 +function: Hardware interface
46 +note:
47 + SPI4W_Write_Byte(value) :
48 + HAL library hardware SPI
49 + Register hardware SPI
50 + Gpio analog SPI
51 + I2C_Write_Byte(value, cmd):
52 + HAL library hardware I2C
53 +********************************************************************************/
54 +void SPI4W_Write_Byte(uint8_t value)
55 +{
56 + SPI_WRITE_TX(SPI1_NS, value);
57 + while (SPI_IS_BUSY(SPI1_NS));
58 + //printf("[RX] : %d\t [TX] : %d(%#x) \n", SPI_READ_RX(SPI0), value, value);
59 +}
60 +/********************************************************************************
61 +function: Delay function
62 +note:
63 + Driver_Delay_ms(xms) : Delay x ms
64 + Driver_Delay_us(xus) : Delay x us
65 +********************************************************************************/
66 +void Driver_Delay_ms(uint32_t xms)
67 +{
68 + CLK_SysTickDelay(xms * 1000);
69 +}
70 +
71 +void Driver_Delay_us(uint32_t xus)
72 +{
73 + int j;
74 + for(j=xus; j > 0; j--);
75 +}
1 +/******************************************************************************
2 +**************************Hardware interface layer*****************************
3 +* | file : DEV_Config.h
4 +* | version : V1.0
5 +* | date : 2017-08-14
6 +* | function :
7 + Provide the hardware underlying interface
8 +******************************************************************************/
9 +#ifndef _DEV_CONFIG_H_
10 +#define _DEV_CONFIG_H_
11 +
12 +//#include "stm32f1xx_hal.h"
13 +//#include "stm32f1xx_hal_gpio.h"
14 +//#include "main.h"
15 +#include <stdint.h>
16 +#include "NuMicro.h"
17 +
18 +#define USE_SPI_4W 1
19 +#define USE_IIC 0
20 +
21 +#define IIC_CMD 0X00
22 +#define IIC_RAM 0X40
23 +
24 +//#define SPI0_SCK PD2_NS
25 +//#define SPI0_SCK_GPIO_Port GPIOD
26 +
27 +//#define SPI0_MISO PD1_NS
28 +//#define SPI0_MISO_GPIO_Port GPIOD
29 +
30 +//#define SPI0_MOSI PD0_NS
31 +//#define SPI0_MOSI_GPIO_Port GPIOD
32 +
33 +#define OLED_DC PC11_NS
34 +#define OLED_DC_GPIO_Port GPIOC
35 +
36 +#define OLED_RST PC12_NS
37 +#define OLED_RST_GPIO_Port GPIOC
38 +
39 +#define OLED_CS PH9_NS
40 +#define OLED_CS_GPIO_Port GPIOH
41 +/*
42 +#define I2C1_SCL_Pin GPIO_PIN_8
43 +#define I2C1_SCL_GPIO_Port GPIOB
44 +#define I2C1_SDA_Pin GPIO_PIN_9
45 +#define I2C1_SDA_GPIO_Port GPIOB
46 +
47 +
48 +//OLED GPIO
49 +#define OLED_CS_0 HAL_GPIO_WritePin(OLED_CS_GPIO_Port, OLED_CS_Pin, GPIO_PIN_RESET)
50 +#define OLED_CS_1 HAL_GPIO_WritePin(OLED_CS_GPIO_Port, OLED_CS_Pin, GPIO_PIN_SET)
51 +
52 +#define OLED_DC_0 HAL_GPIO_WritePin(OLED_DC_GPIO_Port, OLED_DC_Pin, GPIO_PIN_RESET)
53 +#define OLED_DC_1 HAL_GPIO_WritePin(OLED_DC_GPIO_Port, OLED_DC_Pin, GPIO_PIN_SET)
54 +
55 +#define OLED_RST_0 HAL_GPIO_WritePin(OLED_RST_GPIO_Port, OLED_RST_Pin, GPIO_PIN_RESET)
56 +#define OLED_RST_1 HAL_GPIO_WritePin(OLED_RST_GPIO_Port, OLED_RST_Pin, GPIO_PIN_SET)
57 +
58 +//SPI GPIO
59 +#define SPI1_SCK_0 HAL_GPIO_WritePin(SPI1_SCK_GPIO_Port, SPI1_SCK_Pin, GPIO_PIN_RESET)
60 +#define SPI1_SCK_1 HAL_GPIO_WritePin(SPI1_SCK_GPIO_Port, SPI1_SCK_Pin, GPIO_PIN_SET)
61 +
62 +#define SPI1_MOSI_0 HAL_GPIO_WritePin(SPI1_MOSI_GPIO_Port, SPI1_MOSI_Pin, GPIO_PIN_RESET)
63 +#define SPI1_MOSI_1 HAL_GPIO_WritePin(SPI1_MOSI_GPIO_Port, SPI1_MOSI_Pin, GPIO_PIN_SET)
64 +*/
65 +/*------------------------------------------------------------------------------------------------------*/
66 +
67 +uint8_t System_Init(void);
68 +void System_Exit(void);
69 +
70 +void SPI4W_Write_Byte(uint8_t value);
71 +//void I2C_Write_Byte(uint8_t value, uint8_t Cmd);
72 +
73 +void Driver_Delay_ms(uint32_t xms);
74 +void Driver_Delay_us(uint32_t xus);
75 +
76 +#endif
1 +/******************************************************************************
2 +***************************Intermediate driver layer***************************
3 +* | file : OLED_Driver.c
4 +* | version : V1.0
5 +* | date : 2017-11-09
6 +* | function : SSD1327 Drive function
7 +
8 +note:
9 +Image scanning:
10 +Please use progressive scanning to generate images or fonts
11 +******************************************************************************/
12 +
13 +#include "OLED_Driver.h"
14 +#include <stdio.h>
15 +
16 +
17 +COLOR Buffer[OLED_WIDTH / 2 * OLED_HEIGHT];
18 +OLED_DIS sOLED_DIS;
19 +/*******************************************************************************
20 +function:
21 + Hardware reset
22 +*******************************************************************************/
23 +static void OLED_Reset(void)
24 +{
25 + OLED_RST = 1;
26 + //PC12 = 1;
27 + Driver_Delay_ms(100);
28 + OLED_RST = 0;
29 + //PC12 = 0;
30 + Driver_Delay_ms(100);
31 + OLED_RST = 1;
32 + //PC12 = 1;
33 + Driver_Delay_ms(100);
34 +}
35 +
36 +/*******************************************************************************
37 +function:
38 + Write register address and data
39 +*******************************************************************************/
40 +void OLED_WriteReg(uint8_t Reg)
41 +{
42 +#if USE_SPI_4W
43 + OLED_DC = 0;
44 + OLED_CS = 0;
45 + SPI4W_Write_Byte(Reg);
46 + OLED_CS = 1;
47 +
48 +#elif USE_IIC
49 + I2C_Write_Byte(Reg,IIC_CMD);
50 +#endif
51 +}
52 +
53 +void OLED_WriteData(uint8_t Data)
54 +{
55 +#if USE_SPI_4W
56 + OLED_DC = 1;
57 + OLED_CS = 0;
58 + SPI4W_Write_Byte(Data);
59 + OLED_CS = 1;
60 +
61 +#elif USE_IIC
62 + I2C_Write_Byte(Data,IIC_RAM);
63 +#endif
64 +}
65 +
66 +/*******************************************************************************
67 +function:
68 + Common register initialization
69 +*******************************************************************************/
70 +static void OLED_InitReg(void)
71 +{
72 + OLED_WriteReg(0xae);//--turn off oled panel
73 +
74 + OLED_WriteReg(0x15); // set column address
75 + OLED_WriteReg(0x00); // start column 0
76 + OLED_WriteReg(0x7f); // end column 127
77 +
78 + OLED_WriteReg(0x75); // set row address
79 + OLED_WriteReg(0x00); // start row 0
80 + OLED_WriteReg(0x7f); // end row 127
81 +
82 + OLED_WriteReg(0x81); // set contrast control
83 + OLED_WriteReg(0x80);
84 +
85 + OLED_WriteReg(0xa0); // gment remap
86 + OLED_WriteReg(0x51); //51
87 +
88 + OLED_WriteReg(0xa1); // start line
89 + OLED_WriteReg(0x00);
90 +
91 + OLED_WriteReg(0xa2); // display offset
92 + OLED_WriteReg(0x00);
93 +
94 + OLED_WriteReg(0xa4); // rmal display
95 + OLED_WriteReg(0xa8); // set multiplex ratio
96 + OLED_WriteReg(0x7f);
97 +
98 + OLED_WriteReg(0xb1); // set phase leghth
99 + OLED_WriteReg(0xf1);
100 +
101 + OLED_WriteReg(0xb3); // set dclk
102 + OLED_WriteReg(0x00); //80Hz:0xc1 90Hz:0xe1 100Hz:0x00 110Hz:0x30 120Hz:0x50 130Hz:0x70 01
103 +
104 + OLED_WriteReg(0xab); //
105 + OLED_WriteReg(0x01); //
106 +
107 + OLED_WriteReg(0xb6); // set phase leghth
108 + OLED_WriteReg(0x0f);
109 +
110 + OLED_WriteReg(0xbe);
111 + OLED_WriteReg(0x0f);
112 +
113 + OLED_WriteReg(0xbc);
114 + OLED_WriteReg(0x08);
115 +
116 + OLED_WriteReg(0xd5);
117 + OLED_WriteReg(0x62);
118 +
119 + OLED_WriteReg(0xfd);
120 + OLED_WriteReg(0x12);
121 +
122 +}
123 +
124 +/********************************************************************************
125 +function: Set the display scan and color transfer modes
126 +parameter:
127 + Scan_dir : Scan direction
128 + Colorchose : RGB or GBR color format
129 +********************************************************************************/
130 +void OLED_SetGramScanWay(OLED_SCAN_DIR Scan_dir)
131 +{
132 + //Get the screen scan direction
133 + sOLED_DIS.OLED_Scan_Dir = Scan_dir;
134 +
135 + //Get GRAM and OLED width and height
136 + if(Scan_dir == L2R_U2D || Scan_dir == L2R_D2U || Scan_dir == R2L_U2D || Scan_dir == R2L_D2U) {
137 + sOLED_DIS.OLED_Dis_Column = OLED_WIDTH;
138 + sOLED_DIS.OLED_Dis_Page = OLED_HEIGHT;
139 + sOLED_DIS.OLED_X_Adjust = OLED_X;
140 + sOLED_DIS.OLED_Y_Adjust = OLED_Y;
141 + } else {
142 + sOLED_DIS.OLED_Dis_Column = OLED_HEIGHT;
143 + sOLED_DIS.OLED_Dis_Page = OLED_WIDTH;
144 + sOLED_DIS.OLED_X_Adjust = OLED_Y;
145 + sOLED_DIS.OLED_Y_Adjust = OLED_X;
146 + }
147 +}
148 +
149 +/********************************************************************************
150 +function:
151 + initialization
152 +********************************************************************************/
153 +void OLED_Init(OLED_SCAN_DIR OLED_ScanDir)
154 +{
155 + //Hardware reset
156 + OLED_Reset();
157 +
158 + //Set the initialization register
159 + OLED_InitReg();
160 +
161 + //Set the display scan and color transfer modes
162 + OLED_SetGramScanWay(OLED_ScanDir);
163 + Driver_Delay_ms(200);
164 +
165 + //Turn on the OLED display
166 + OLED_WriteReg(0xAF);
167 +}
168 +
169 +/********************************************************************************
170 +function: Set the display point(Xpoint, Ypoint)
171 +parameter:
172 + xStart : X direction Start coordinates
173 + xEnd : X direction end coordinates
174 +********************************************************************************/
175 +void OLED_SetCursor(POINT Xpoint, POINT Ypoint)
176 +{
177 + if((Xpoint > sOLED_DIS.OLED_Dis_Column) || (Ypoint > sOLED_DIS.OLED_Dis_Page))
178 + return;
179 +
180 + OLED_WriteReg(0x15);
181 + OLED_WriteReg(Xpoint);
182 + OLED_WriteReg(Xpoint);
183 +
184 + OLED_WriteReg(0x75);
185 + OLED_WriteReg(Ypoint);
186 + OLED_WriteReg(Ypoint);
187 +}
188 +
189 +/********************************************************************************
190 +function: Set the display Window(Xstart, Ystart, Xend, Yend)
191 +parameter:
192 + xStart : X direction Start coordinates
193 + Ystart : Y direction Start coordinates
194 + Xend : X direction end coordinates
195 + Yend : Y direction end coordinates
196 +********************************************************************************/
197 +void OLED_SetWindow(POINT Xstart, POINT Ystart, POINT Xend, POINT Yend)
198 +{
199 + if((Xstart > sOLED_DIS.OLED_Dis_Column) || (Ystart > sOLED_DIS.OLED_Dis_Page) ||
200 + (Xend > sOLED_DIS.OLED_Dis_Column) || (Yend > sOLED_DIS.OLED_Dis_Page))
201 + return;
202 +
203 + OLED_WriteReg(0x15);
204 + OLED_WriteReg(Xstart);
205 + OLED_WriteReg(Xend - 1);
206 +
207 + OLED_WriteReg(0x75);
208 + OLED_WriteReg(Ystart);
209 + OLED_WriteReg(Yend - 1);
210 +}
211 +
212 +/********************************************************************************
213 +function: Set show color
214 +parameter:
215 + Color : Set show color,16-bit depth
216 +********************************************************************************/
217 +//static void OLED_SetColor(LENGTH Dis_Width, LENGTH Dis_Height, COLOR Color ){
218 +void OLED_SetColor(POINT Xpoint, POINT Ypoint, COLOR Color)
219 +{
220 + if(Xpoint > sOLED_DIS.OLED_Dis_Column || Ypoint > sOLED_DIS.OLED_Dis_Page) {
221 + return;
222 + }
223 + //1 byte control two points
224 + if(Xpoint % 2 == 0) {
225 + Buffer[Xpoint / 2 + Ypoint * 64] = (Color << 4) | Buffer[Xpoint / 2 + Ypoint * 64];
226 + } else {
227 + Buffer[Xpoint / 2 + Ypoint * 64] = (Color & 0x0f) | Buffer[Xpoint / 2 + Ypoint * 64];
228 + }
229 +}
230 +
231 +/********************************************************************************
232 +function:
233 + Clear screen
234 +********************************************************************************/
235 +void OLED_Clear(COLOR Color)
236 +{
237 + unsigned int i,m;
238 + //OLED_SetWindow(0, 0, sOLED_DIS.OLED_Dis_Column, sOLED_DIS.OLED_Dis_Page);
239 + for(i = 0; i < sOLED_DIS.OLED_Dis_Page; i++) {
240 + for(m = 0; m < (sOLED_DIS.OLED_Dis_Column / 2); m++) {
241 + Buffer[i * (sOLED_DIS.OLED_Dis_Column / 2) + m] = Color | (Color << 4);
242 + }
243 + }
244 +}
245 +
246 +/********************************************************************************
247 +function: Update all memory to LCD
248 +********************************************************************************/
249 +void OLED_Display(void)
250 +{
251 + uint16_t page, Column;
252 + COLOR *pBuf = (COLOR *)Buffer;
253 +
254 + OLED_SetWindow(0, 0, sOLED_DIS.OLED_Dis_Column, sOLED_DIS.OLED_Dis_Page);
255 + //write data
256 + for (page = 0; page < sOLED_DIS.OLED_Dis_Page; page++) {
257 + for(Column = 0; Column < sOLED_DIS.OLED_Dis_Column / 2; Column++ ) {
258 + OLED_WriteData(*pBuf);
259 + pBuf++;
260 + }
261 + }
262 +}
263 +
264 +/********************************************************************************
265 +function:
266 + Clear Window
267 +********************************************************************************/
268 +void OLED_ClearWindow(POINT Xstart, POINT Ystart, POINT Xend, POINT Yend, COLOR Color)
269 +{
270 + uint16_t i,m, Xpoint, Ypoint;
271 + Xpoint = (Xend - Xstart) / 2;
272 + Ypoint = Yend - Ystart;
273 +
274 + uint16_t Num = Xstart + Ystart * (sOLED_DIS.OLED_Dis_Column / 2);
275 + for(i = 0; i < Ypoint; i++) {
276 + for(m = 0; m < Xpoint; m++) {
277 + Buffer[Num + m] = 0x00;
278 + }
279 + Num = Xstart + (Ystart + i + 1) * (sOLED_DIS.OLED_Dis_Column / 2);
280 + }
281 +}
282 +
283 +/********************************************************************************
284 +function: Update Window memory to LCD
285 +********************************************************************************/
286 +void OLED_DisWindow(POINT Xstart, POINT Ystart, POINT Xend, POINT Yend)
287 +{
288 + uint16_t page, Column, Xpoint, Ypoint;
289 + Xpoint = (Xend - Xstart) / 2;
290 + Ypoint = Yend - Ystart;
291 + OLED_SetWindow(Xstart, Ystart, Xend, Yend);
292 +
293 + //write data
294 + COLOR *pBuf = (COLOR *)Buffer + Xstart + Ystart * (sOLED_DIS.OLED_Dis_Column / 2);
295 + for (page = 0; page < Ypoint; page++) {
296 + for(Column = 0; Column < Xpoint; Column++ ) {
297 + OLED_WriteData(*pBuf);
298 + pBuf++;
299 + }
300 + pBuf = (COLOR *)Buffer + Xstart + (Ystart + page + 1) * (sOLED_DIS.OLED_Dis_Column / 2);
301 + }
302 +}
303 +
304 +
305 +
306 +
1 +/******************************************************************************
2 +***************************Intermediate driver layer***************************
3 +* | file : OLED_Driver.h
4 +* | version : V1.0
5 +* | date : 2017-11-09
6 +* | function : SSD1327 Drive function
7 +
8 +note:
9 +Image scanning:
10 +Please use progressive scanning to generate images or fonts
11 +******************************************************************************/
12 +#ifndef __OLED_DRIVER_H
13 +#define __OLED_DRIVER_H
14 +
15 +#include <stdint.h>
16 +#include "DEV_Config.h"
17 +
18 +
19 +#define COLOR uint16_t //The variable type of the color (unsigned short)
20 +#define POINT uint16_t //The type of coordinate (unsigned short)
21 +#define LENGTH uint16_t //The type of coordinate (unsigned short)
22 +
23 +/********************************************************************************
24 +function:
25 + Define the full screen height length of the display
26 +********************************************************************************/
27 +#define OLED_X_MAXPIXEL 128 //OLED width maximum memory
28 +#define OLED_Y_MAXPIXEL 128 //OLED height maximum memory
29 +#define OLED_X 0
30 +#define OLED_Y 0
31 +
32 +#define OLED_WIDTH (OLED_X_MAXPIXEL - 2 * OLED_X) //OLED width
33 +#define OLED_HEIGHT OLED_Y_MAXPIXEL //OLED height
34 +
35 +/********************************************************************************
36 +function:
37 + scanning method
38 +********************************************************************************/
39 +typedef enum{
40 + L2R_U2D = 0, //The display interface is displayed , left to right, up to down
41 + L2R_D2U ,
42 + R2L_U2D ,
43 + R2L_D2U ,
44 +
45 + U2D_L2R ,
46 + U2D_R2L ,
47 + D2U_L2R ,
48 + D2U_R2L ,
49 +}OLED_SCAN_DIR;
50 +#define SCAN_DIR_DFT L2R_U2D //Default scan direction = L2R_U2D
51 +
52 +/********************************************************************************
53 +function:
54 + Defines the total number of rows in the display area
55 +********************************************************************************/
56 +typedef struct{
57 + LENGTH OLED_Dis_Column; //COLUMN
58 + LENGTH OLED_Dis_Page; //PAGE
59 + OLED_SCAN_DIR OLED_Scan_Dir;
60 + POINT OLED_X_Adjust; //OLED x actual display position calibration
61 + POINT OLED_Y_Adjust; //OLED y actual display position calibration
62 +}OLED_DIS;
63 +
64 +/********************************************************************************
65 +function:
66 + Macro definition variable name
67 +********************************************************************************/
68 +void OLED_Init(OLED_SCAN_DIR OLED_ScanDir);
69 +void OLED_SetGramScanWay(OLED_SCAN_DIR Scan_dir);
70 +
71 +void OLED_WriteReg(uint8_t Reg);
72 +void OLED_WriteData(uint8_t Data);
73 +
74 +//OLED set cursor + windows + color
75 +void OLED_SetCursor(POINT Xpoint, POINT Ypoint);
76 +void OLED_SetColor(POINT Xpoint, POINT Ypoint, COLOR Color);
77 +void OLED_SetWindow(POINT Xstart, POINT Ystart, POINT Xend, POINT Yend);
78 +void OLED_Clear(COLOR Color);
79 +void OLED_Display(void);
80 +void OLED_ClearWindow(POINT Xstart, POINT Ystart, POINT Xend, POINT Yend, COLOR Color);
81 +void OLED_DisWindow(POINT Xstart, POINT Ystart, POINT Xend, POINT Yend);
82 +
83 +
84 +#endif
85 +
86 +
87 +
88 +
89 +
1 +/******************************************************************************
2 +****************************Upper application layer****************************
3 +* | file : OLED_GUI.c
4 +* | version : V1.0
5 +* | date : 2017-11-09
6 +* | function :
7 +Achieve drawing: draw points, lines, boxes, circles and their size,
8 + solid dotted line, solid rectangle hollow rectangle,
9 + solid circle hollow circle.
10 +Achieve display characters: Display a single character, string, number
11 +Achieve time display: adaptive size display time minutes and seconds
12 +******************************************************************************/
13 +#include <stdio.h>
14 +
15 +#include "OLED_GUI.h"
16 +
17 +extern OLED_DIS sOLED_DIS;
18 +extern COLOR Buffer[OLED_WIDTH / 2 * OLED_HEIGHT];
19 +/******************************************************************************
20 +function: Coordinate conversion
21 +******************************************************************************/
22 +void GUI_Swop(POINT Point1, POINT Point2)
23 +{
24 + POINT Temp;
25 + Temp = Point1;
26 + Point1 = Point2;
27 + Point2 = Temp;
28 +}
29 +
30 +/******************************************************************************
31 +function: Draw Point(Xpoint, Ypoint) Fill the color
32 +parameter:
33 + Xpoint : The x coordinate of the point
34 + Ypoint : The y coordinate of the point
35 + Color : Set color
36 + Dot_Pixel : point size
37 +******************************************************************************/
38 +void GUI_DrawPoint(POINT Xpoint, POINT Ypoint, COLOR Color,
39 + DOT_PIXEL Dot_Pixel, DOT_STYLE DOT_STYLE)
40 +{
41 + if(Xpoint > sOLED_DIS.OLED_Dis_Column || Ypoint > sOLED_DIS.OLED_Dis_Page) {
42 + printf("GUI_DrawPoint Input exceeds the normal display range\r\n");
43 + return;
44 + }
45 +
46 + uint16_t XDir_Num ,YDir_Num;
47 + if(DOT_STYLE == DOT_STYLE_DFT) {
48 + for(XDir_Num = 0; XDir_Num < 2 * Dot_Pixel - 1; XDir_Num++) {
49 + for(YDir_Num = 0; YDir_Num < 2 * Dot_Pixel - 1; YDir_Num++) {
50 +// printf("YDir_Num = %d\r\n",YDir_Num);
51 + OLED_SetColor(Xpoint + XDir_Num - Dot_Pixel, Ypoint + YDir_Num - Dot_Pixel, Color);
52 + }
53 + }
54 + } else {
55 + for(XDir_Num = 0; XDir_Num < Dot_Pixel; XDir_Num++) {
56 + for(YDir_Num = 0; YDir_Num < Dot_Pixel; YDir_Num++) {
57 + OLED_SetColor(Xpoint + XDir_Num, Ypoint + YDir_Num, Color);
58 + }
59 + }
60 + }
61 +}
62 +
63 +/******************************************************************************
64 +function: Draw a line of arbitrary slope
65 +parameter:
66 + Xstart :Starting x point coordinates
67 + Ystart :Starting x point coordinates
68 + Xend :End point x coordinate
69 + Yend :End point y coordinate
70 + Color :The color of the line segment
71 +******************************************************************************/
72 +void GUI_DrawLine(POINT Xstart, POINT Ystart, POINT Xend, POINT Yend,
73 + COLOR Color, LINE_STYLE Line_Style, DOT_PIXEL Dot_Pixel)
74 +{
75 + if(Xstart > sOLED_DIS.OLED_Dis_Column || Ystart > sOLED_DIS.OLED_Dis_Page ||
76 + Xend > sOLED_DIS.OLED_Dis_Column || Yend > sOLED_DIS.OLED_Dis_Page) {
77 + printf("GUI_DrawLine Input exceeds the normal display range\r\n");
78 + return;
79 + }
80 +
81 + if(Xstart > Xend)
82 + GUI_Swop(Xstart,Xend);
83 + if(Ystart > Yend)
84 + GUI_Swop(Ystart,Yend);
85 +
86 + POINT Xpoint = Xstart;
87 + POINT Ypoint = Ystart;
88 + int32_t dx =(int32_t)Xend -(int32_t)Xstart >= 0 ? Xend - Xstart : Xstart - Xend;
89 + int32_t dy =(int32_t)Yend -(int32_t)Ystart <= 0 ? Yend - Ystart : Ystart - Yend;
90 +
91 + // Increment direction, 1 is positive, -1 is counter;
92 + int32_t XAddway = Xstart < Xend ? 1 : -1;
93 + int32_t YAddway = Ystart < Yend ? 1 : -1;
94 +
95 + //Cumulative error
96 + int32_t Esp = dx + dy;
97 + int8_t Line_Style_Temp = 0;
98 +
99 + for(;;) {
100 + Line_Style_Temp++;
101 + //Painted dotted line, 2 point is really virtual
102 + if(Line_Style == LINE_DOTTED && Line_Style_Temp %3 == 0) {
103 + //printf("LINE_DOTTED\r\n");
104 + GUI_DrawPoint(Xpoint, Ypoint, OLED_BACKGROUND, Dot_Pixel, DOT_STYLE_DFT);
105 + Line_Style_Temp = 0;
106 + } else {
107 + GUI_DrawPoint(Xpoint, Ypoint, Color, Dot_Pixel, DOT_STYLE_DFT);
108 + }
109 + if(2 * Esp >= dy) {
110 + if(Xpoint == Xend) break;
111 + Esp += dy;
112 + Xpoint += XAddway;
113 + }
114 + if(2 * Esp <= dx) {
115 + if(Ypoint == Yend) break;
116 + Esp += dx;
117 + Ypoint += YAddway;
118 + }
119 + }
120 +}
121 +
122 +/******************************************************************************
123 +function: Draw a rectangle
124 +parameter:
125 + Xstart :Rectangular Starting x point coordinates
126 + Ystart :Rectangular Starting x point coordinates
127 + Xend :Rectangular End point x coordinate
128 + Yend :Rectangular End point y coordinate
129 + Color :The color of the Rectangular segment
130 + Filled : Whether it is filled--- 1 solid 0:empty
131 +******************************************************************************/
132 +void GUI_DrawRectangle(POINT Xstart, POINT Ystart, POINT Xend, POINT Yend,
133 + COLOR Color, DRAW_FILL Filled, DOT_PIXEL Dot_Pixel )
134 +{
135 + if(Xstart > sOLED_DIS.OLED_Dis_Column || Ystart > sOLED_DIS.OLED_Dis_Page ||
136 + Xend > sOLED_DIS.OLED_Dis_Column || Yend > sOLED_DIS.OLED_Dis_Page) {
137 + printf("Input exceeds the normal display range\r\n");
138 + return;
139 + }
140 +
141 + if(Xstart > Xend)
142 + GUI_Swop(Xstart,Xend);
143 + if(Ystart > Yend)
144 + GUI_Swop(Ystart,Yend);
145 +
146 + POINT Ypoint;
147 + if(Filled ) {
148 + for(Ypoint = Ystart; Ypoint < Yend; Ypoint++) {
149 + GUI_DrawLine(Xstart, Ypoint, Xend, Ypoint, Color , LINE_SOLID, Dot_Pixel);
150 + }
151 + } else {
152 + GUI_DrawLine(Xstart, Ystart, Xend, Ystart, Color , LINE_SOLID, Dot_Pixel);
153 + GUI_DrawLine(Xstart, Ystart, Xstart, Yend, Color , LINE_SOLID, Dot_Pixel);
154 + GUI_DrawLine(Xend, Yend, Xend, Ystart, Color , LINE_SOLID, Dot_Pixel);
155 + GUI_DrawLine(Xend, Yend, Xstart, Yend, Color , LINE_SOLID, Dot_Pixel);
156 + }
157 +}
158 +
159 +/******************************************************************************
160 +function: Use the 8-point method to draw a circle of the
161 + specified size at the specified position.
162 +parameter:
163 + X_Center :Center X coordinate
164 + Y_Center :Center Y coordinate
165 + Radius :circle Radius
166 + Color :The color of the :circle segment
167 + Filled : Whether it is filled: 1 filling 0:Do not
168 +******************************************************************************/
169 +void GUI_DrawCircle(POINT X_Center, POINT Y_Center, LENGTH Radius,
170 + COLOR Color, DRAW_FILL Draw_Fill , DOT_PIXEL Dot_Pixel)
171 +{
172 + if(X_Center > sOLED_DIS.OLED_Dis_Column || Y_Center >= sOLED_DIS.OLED_Dis_Page) {
173 + printf("GUI_DrawCircle Input exceeds the normal display range\r\n");
174 + return;
175 + }
176 +
177 + //Draw a circle from(0, R) as a starting point
178 + int16_t XCurrent, YCurrent;
179 + XCurrent = 0;
180 + YCurrent = Radius;
181 +
182 + //Cumulative error,judge the next point of the logo
183 + int16_t Esp = 3 -(Radius << 1 );
184 +
185 + int16_t sCountY;
186 + if(Draw_Fill == DRAW_FULL) {
187 + while(XCurrent <= YCurrent ) { //Realistic circles
188 + for(sCountY = XCurrent; sCountY <= YCurrent; sCountY ++ ) {
189 + GUI_DrawPoint(X_Center + XCurrent, Y_Center + sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT ); //1
190 + GUI_DrawPoint(X_Center - XCurrent, Y_Center + sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT ); //2
191 + GUI_DrawPoint(X_Center - sCountY, Y_Center + XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT ); //3
192 + GUI_DrawPoint(X_Center - sCountY, Y_Center - XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT ); //4
193 + GUI_DrawPoint(X_Center - XCurrent, Y_Center - sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT ); //5
194 + GUI_DrawPoint(X_Center + XCurrent, Y_Center - sCountY, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT ); //6
195 + GUI_DrawPoint(X_Center + sCountY, Y_Center - XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT ); //7
196 + GUI_DrawPoint(X_Center + sCountY, Y_Center + XCurrent, Color, DOT_PIXEL_DFT, DOT_STYLE_DFT );
197 + }
198 + if(Esp < 0 )
199 + Esp += 4 * XCurrent + 6;
200 + else {
201 + Esp += 10 + 4 *(XCurrent - YCurrent );
202 + YCurrent --;
203 + }
204 + XCurrent ++;
205 + }
206 + } else { //Draw a hollow circle
207 + while(XCurrent <= YCurrent ) {
208 + GUI_DrawPoint(X_Center + XCurrent, Y_Center + YCurrent, Color, Dot_Pixel, DOT_STYLE_DFT ); //1
209 + GUI_DrawPoint(X_Center - XCurrent, Y_Center + YCurrent, Color, Dot_Pixel, DOT_STYLE_DFT ); //2
210 + GUI_DrawPoint(X_Center - YCurrent, Y_Center + XCurrent, Color, Dot_Pixel, DOT_STYLE_DFT ); //3
211 + GUI_DrawPoint(X_Center - YCurrent, Y_Center - XCurrent, Color, Dot_Pixel, DOT_STYLE_DFT ); //4
212 + GUI_DrawPoint(X_Center - XCurrent, Y_Center - YCurrent, Color, Dot_Pixel, DOT_STYLE_DFT ); //5
213 + GUI_DrawPoint(X_Center + XCurrent, Y_Center - YCurrent, Color, Dot_Pixel, DOT_STYLE_DFT ); //6
214 + GUI_DrawPoint(X_Center + YCurrent, Y_Center - XCurrent, Color, Dot_Pixel, DOT_STYLE_DFT ); //7
215 + GUI_DrawPoint(X_Center + YCurrent, Y_Center + XCurrent, Color, Dot_Pixel, DOT_STYLE_DFT ); //0
216 +
217 + if(Esp < 0 )
218 + Esp += 4 * XCurrent + 6;
219 + else {
220 + Esp += 10 + 4 *(XCurrent - YCurrent );
221 + YCurrent --;
222 + }
223 + XCurrent ++;
224 + }
225 + }
226 +}
227 +
228 +/******************************************************************************
229 +function: Show English characters
230 +parameter:
231 + Xpoint :X coordinate
232 + Ypoint :Y coordinate
233 + Acsii_Char :To display the English characters
234 + Font :A structure pointer that displays a character size
235 + Color_Background : Select the background color of the English character
236 + Color_Foreground : Select the foreground color of the English character
237 +******************************************************************************/
238 +void GUI_DisChar(POINT Xpoint, POINT Ypoint, const char Acsii_Char,
239 + sFONT* Font, COLOR Color_Background, COLOR Color_Foreground)
240 +{
241 + POINT Page, Column;
242 +
243 + if(Xpoint > sOLED_DIS.OLED_Dis_Column || Ypoint > sOLED_DIS.OLED_Dis_Page) {
244 + printf("GUI_DisChar Input exceeds the normal display range\r\n");
245 + return;
246 + }
247 +
248 + uint32_t Char_Offset =(Acsii_Char - ' ') * Font->Height *(Font->Width / 8 +(Font->Width % 8 ? 1 : 0));
249 + const unsigned char *ptr = &Font->table[Char_Offset];
250 +
251 + for(Page = 0; Page < Font->Height; Page ++ ) {
252 + for(Column = 0; Column < Font->Width; Column ++ ) {
253 +
254 + //To determine whether the font background color and screen background color is consistent
255 + if(FONT_BACKGROUND == Color_Background) { //this process is to speed up the scan
256 + if(*ptr &(0x80 >>(Column % 8)))
257 + GUI_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT);
258 + } else {
259 + if(*ptr &(0x80 >>(Column % 8))) {
260 + GUI_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Foreground, DOT_PIXEL_DFT, DOT_STYLE_DFT);
261 + } else {
262 + GUI_DrawPoint(Xpoint + Column, Ypoint + Page, Color_Background, DOT_PIXEL_DFT, DOT_STYLE_DFT);
263 + }
264 + }
265 + //One pixel is 8 bits
266 + if(Column % 8 == 7)
267 + ptr++;
268 + }/* Write a line */
269 + if(Font->Width % 8 != 0)
270 + ptr++;
271 + }/* Write all */
272 +}
273 +
274 +/******************************************************************************
275 +function: Display the string
276 +parameter:
277 + Xstart :X coordinate
278 + Ystart :Y coordinate
279 + pString :The first address of the English string to be displayed
280 + Font :A structure pointer that displays a character size
281 + Color_Background : Select the background color of the English character
282 + Color_Foreground : Select the foreground color of the English character
283 +******************************************************************************/
284 +void GUI_DisString_EN(POINT Xstart, POINT Ystart, const char * pString,
285 + sFONT* Font,COLOR Color_Background, COLOR Color_Foreground )
286 +{
287 + POINT Xpoint = Xstart;
288 + POINT Ypoint = Ystart;
289 +
290 + if(Xstart > sOLED_DIS.OLED_Dis_Column || Ystart > sOLED_DIS.OLED_Dis_Page) {
291 + printf("GUI_DisString_EN Input exceeds the normal display range\r\n");
292 + return;
293 + }
294 +
295 + while(* pString != '\0') {
296 + //if X direction filled , reposition to(Xstart,Ypoint),Ypoint is Y direction plus the height of the character
297 + if((Xpoint + Font->Width ) > sOLED_DIS.OLED_Dis_Column ) {
298 + Xpoint = Xstart;
299 + Ypoint += Font->Height;
300 + }
301 +
302 + // If the Y direction is full, reposition to(Xstart, Ystart)
303 + if((Ypoint + Font->Height ) > sOLED_DIS.OLED_Dis_Page ) {
304 + Xpoint = Xstart;
305 + Ypoint = Ystart;
306 + }
307 + GUI_DisChar(Xpoint, Ypoint, * pString, Font, Color_Background, Color_Foreground);
308 +
309 + //The next character of the address
310 + pString ++;
311 +
312 + //The next word of the abscissa increases the font of the broadband
313 + Xpoint += Font->Width;
314 + }
315 +}
316 +
317 +/******************************************************************************
318 +function: Display the string
319 +parameter:
320 + Xstart :X coordinate
321 + Ystart : Y coordinate
322 + Nummber : The number displayed
323 + Font :A structure pointer that displays a character size
324 + Color_Background : Select the background color of the English character
325 + Color_Foreground : Select the foreground color of the English character
326 +******************************************************************************/
327 +#define ARRAY_LEN 255
328 +void GUI_DisNum(POINT Xpoint, POINT Ypoint, int32_t Nummber,
329 + sFONT* Font,COLOR Color_Background, COLOR Color_Foreground )
330 +{
331 +
332 + int16_t Num_Bit = 0, Str_Bit = 0;
333 + uint8_t Str_Array[ARRAY_LEN] = {0},Num_Array[ARRAY_LEN] = {0};
334 + uint8_t *pStr = Str_Array;
335 +
336 + if(Xpoint > sOLED_DIS.OLED_Dis_Column || Ypoint > sOLED_DIS.OLED_Dis_Page) {
337 + printf("GUI_DisNum Input exceeds the normal display range\r\n");
338 + return;
339 + }
340 +
341 + if (!Nummber)
342 + {
343 + Num_Array[Num_Bit] = Nummber % 10 + '0';
344 + Num_Bit++;
345 + }
346 + //Converts a number to a string
347 + while(Nummber) {
348 + Num_Array[Num_Bit] = Nummber % 10 + '0';
349 + Num_Bit++;
350 + Nummber /= 10;
351 + }
352 +
353 + //The string is inverted
354 + while(Num_Bit > 0) {
355 + Str_Array[Str_Bit] = Num_Array[Num_Bit -1];
356 + Str_Bit ++;
357 + Num_Bit --;
358 + }
359 +
360 + //show
361 + GUI_DisString_EN(Xpoint, Ypoint, (const char*)pStr, Font, Color_Background, Color_Foreground );
362 +}
363 +
364 +
365 +
366 +/******************************************************************************
367 +function: Display the bit map,1 byte = 8bit = 8 points
368 +parameter:
369 + Xpoint :X coordinate
370 + Ypoint : Y coordinate
371 + pMap : Pointing to the picture
372 + Width :Bitmap Width
373 + Height : Bitmap Height
374 +note:
375 + This function is suitable for bitmap, because a 16-bit data accounted for 16 points
376 +******************************************************************************/
377 +void GUI_Disbitmap(POINT Xpoint, POINT Ypoint, const unsigned char *pMap,
378 + POINT Width, POINT Height)
379 +{
380 + POINT i, j, byteWidth = (Width + 7)/8;
381 + for(j = 0; j < Height; j++) {
382 + for(i = 0; i <Width; i ++) {
383 + if(*(pMap + j*byteWidth + i/8) & (128 >> (i & 7))) {
384 + GUI_DrawPoint(Xpoint+i, Ypoint+j, WHITE, DOT_PIXEL_DFT, DOT_STYLE_DFT);
385 + }
386 + }
387 + }
388 +}
389 +
390 +/******************************************************************************
391 +function: Display the Gray map,1 byte = 8bit = 2 points
392 +parameter:
393 + Xpoint :X coordinate
394 + Ypoint : Y coordinate
395 + pMap : Pointing to the picture
396 + Width :Bitmap Width
397 + Height : Bitmap Height
398 +note:
399 + This function is suitable for bitmap, because a 4-bit data accounted for 1 points
400 + Please use the Image2lcd generated array
401 +******************************************************************************/
402 +void GUI_DisGrayMap(POINT Xpoint, POINT Ypoint, const unsigned char *pBmp)
403 +{
404 + //Get the Map header Gray, width, height
405 + char Gray;
406 + Gray = *(pBmp + 1);
407 + POINT Height,Width;
408 + Width = (*(pBmp + 3) << 8) | (*(pBmp + 2));
409 + Height = (*(pBmp + 5) << 8) | (*(pBmp + 4));
410 +
411 + POINT i, j;
412 + if(Gray == 0x04){//Sixteen gray levels
413 + pBmp = pBmp + 6;
414 + for(j = 0; j < Height; j++)
415 + for(i = 0; i < Width / 2; i++){
416 + GUI_DrawPoint(Xpoint + i * 2, Ypoint + j, ~(*pBmp >> 4), DOT_PIXEL_DFT, DOT_STYLE_DFT);
417 + GUI_DrawPoint(Xpoint + i * 2 + 1, Ypoint + j, ~*pBmp , DOT_PIXEL_DFT, DOT_STYLE_DFT);
418 + pBmp++;
419 + }
420 + }else{
421 + printf("Does not support type\r\n");
422 + return;
423 + }
424 +}
425 +
426 +/******************************************************************************
427 +function: According to the display area adaptive display time
428 +parameter:
429 + xStart : X direction Start coordinates
430 + Ystart : Y direction Start coordinates
431 + Xend : X direction end coordinates
432 + Yend : Y direction end coordinates
433 + pTime : Pointer to the definition of the structure
434 + Color : Set show color
435 +note:
436 +******************************************************************************/
437 +void GUI_Showtime(POINT Xstart, POINT Ystart, POINT Xend, POINT Yend,
438 + DEV_TIME *pTime,COLOR Color)
439 +{
440 + uint8_t value[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
441 + sFONT *Font;
442 + OLED_SetWindow(Xstart, Ystart, Xend, Yend);
443 + OLED_ClearWindow(Xstart, Ystart, Xend, Yend, BLACK);
444 +
445 + //According to the display area adaptive font size
446 + POINT Dx = (Xend - Xstart) / 7;//Determine the spacing between characters
447 + POINT Dy = Yend - Ystart; //determine the font size
448 + if(Dx > Font24.Width && Dy > Font24.Height){
449 + Font = &Font24;
450 + }else if((Dx > Font20.Width && Dx < Font24.Width) &&
451 + (Dy > Font20.Height && Dy < Font24.Height)){
452 + Font = &Font20;
453 + }else if((Dx > Font16.Width && Dx < Font20.Width) &&
454 + (Dy > Font16.Height && Dy < Font20.Height)){
455 + Font = &Font16;
456 + }else if((Dx > Font12.Width && Dx < Font16.Width) &&
457 + (Dy > Font12.Height && Dy < Font16.Height)){
458 + Font = &Font12;
459 + }else if((Dx > Font8.Width && Dx < Font12.Width) &&
460 + (Dy > Font8.Height && Dy < Font12.Height)){
461 + Font = &Font8;
462 + }else{
463 + printf("Please change the display area size, or add a larger font to modify\r\n");
464 + }
465 +
466 + //Write data into the cache
467 + GUI_DisChar(Xstart , Ystart, value[pTime->Hour / 10], Font, FONT_BACKGROUND, Color);
468 + GUI_DisChar(Xstart + Dx , Ystart, value[pTime->Hour % 10], Font, FONT_BACKGROUND, Color);
469 + GUI_DisChar(Xstart + Dx + Dx / 4 + Dx / 2 , Ystart, ':' , Font, FONT_BACKGROUND, Color);
470 + GUI_DisChar(Xstart + Dx * 2 + Dx / 2 , Ystart, value[pTime->Min / 10] , Font, FONT_BACKGROUND, Color);
471 + GUI_DisChar(Xstart + Dx * 3 + Dx / 2 , Ystart, value[pTime->Min % 10] , Font, FONT_BACKGROUND, Color);
472 + GUI_DisChar(Xstart + Dx * 4 + Dx / 2 - Dx / 4, Ystart, ':' , Font, FONT_BACKGROUND, Color);
473 + GUI_DisChar(Xstart + Dx * 5 , Ystart, value[pTime->Sec / 10] , Font, FONT_BACKGROUND, Color);
474 + GUI_DisChar(Xstart + Dx * 6 , Ystart, value[pTime->Sec % 10] , Font, FONT_BACKGROUND, Color);
475 +
476 + OLED_DisWindow(Xstart, Ystart, Xend, Yend);
477 +}
478 +/******************************************************************************
479 +function: OLED_Show
480 +note:
481 + OLED Clear,
482 + Draw Line,
483 + Draw Rectangle,
484 + Draw Rings,
485 + Draw Olympic Rings,
486 + Display String,
487 + Show Pic
488 +******************************************************************************/
489 +void GUI_Show(void)
490 +{
491 + //printf("Clear... \r\n");
492 + OLED_Clear(OLED_BACKGROUND);//OLED_BACKGROUND
493 + OLED_Display();
494 +
495 + //printf("Draw Line \r\n");
496 + GUI_DrawLine(0, 1 , sOLED_DIS.OLED_Dis_Column - 1, 1 , WHITE, LINE_SOLID , DOT_PIXEL_2X2);
497 + GUI_DrawLine(0, 4 , sOLED_DIS.OLED_Dis_Column - 1, 4 , WHITE, LINE_DOTTED, DOT_PIXEL_DFT);
498 + GUI_DrawLine(0, sOLED_DIS.OLED_Dis_Page - 5, sOLED_DIS.OLED_Dis_Column - 1, sOLED_DIS.OLED_Dis_Page - 5, WHITE, LINE_DOTTED, DOT_PIXEL_DFT);
499 + GUI_DrawLine(0, sOLED_DIS.OLED_Dis_Page - 1, sOLED_DIS.OLED_Dis_Column - 1, sOLED_DIS.OLED_Dis_Page - 1, WHITE, LINE_SOLID , DOT_PIXEL_2X2);
500 +
501 + //printf("Draw Rectangle \r\n");
502 + GUI_DrawRectangle(5 , 7 , sOLED_DIS.OLED_Dis_Column - 5 , sOLED_DIS.OLED_Dis_Page - 7, WHITE, DRAW_EMPTY, DOT_PIXEL_DFT);
503 + GUI_DrawRectangle(10, 10, sOLED_DIS.OLED_Dis_Column - 10, 20 , WHITE, DRAW_FULL , DOT_PIXEL_DFT);
504 +
505 + //printf("Draw Rings\r\n");
506 + GUI_DrawCircle(10, 30, 3, WHITE, DRAW_FULL , DOT_PIXEL_DFT);
507 + GUI_DrawCircle(10, 40, 3, WHITE, DRAW_EMPTY, DOT_PIXEL_DFT);
508 + GUI_DrawCircle(10, 50, 3, WHITE, DRAW_FULL , DOT_PIXEL_DFT);
509 + GUI_DrawCircle(sOLED_DIS.OLED_Dis_Column - 10, 30, 3, WHITE, DRAW_FULL , DOT_PIXEL_DFT);
510 + GUI_DrawCircle(sOLED_DIS.OLED_Dis_Column - 10, 40, 3, WHITE, DRAW_EMPTY, DOT_PIXEL_DFT);
511 + GUI_DrawCircle(sOLED_DIS.OLED_Dis_Column - 10, 50, 3, WHITE, DRAW_FULL , DOT_PIXEL_DFT);
512 +
513 + //printf("Draw Olympic Rings\r\n");
514 + uint16_t Cx1 = 35, Cy1 = 85, Cr = 12;
515 + uint16_t Cx2 = Cx1 + (2.5 * Cr), Cy2 = Cy1;
516 + uint16_t Cx3 = Cx1 + (5 * Cr), Cy3 = Cy1;
517 + uint16_t Cx4 = (Cx1 + Cx2) / 2, Cy4 = Cy1 + Cr;
518 + uint16_t Cx5 = (Cx2 + Cx3) / 2, Cy5 = Cy1 + Cr;
519 +
520 + GUI_DrawCircle(Cx1, Cy1, Cr, WHITE, DRAW_EMPTY, DOT_PIXEL_DFT);
521 + GUI_DrawCircle(Cx2, Cy2, Cr, WHITE, DRAW_EMPTY, DOT_PIXEL_DFT);
522 + GUI_DrawCircle(Cx3, Cy3, Cr, WHITE, DRAW_EMPTY, DOT_PIXEL_DFT);
523 + GUI_DrawCircle(Cx4, Cy4, Cr, WHITE, DRAW_EMPTY, DOT_PIXEL_DFT);
524 + GUI_DrawCircle(Cx5, Cy5, Cr, WHITE, DRAW_EMPTY, DOT_PIXEL_DFT);
525 +
526 + //printf("Display String \r\n");
527 + GUI_DisString_EN(30, 25, "WaveShare" , &Font12, FONT_BACKGROUND, WHITE);
528 + GUI_DisString_EN(28, 35, "Electronic" , &Font12, FONT_BACKGROUND, WHITE);
529 + GUI_DisString_EN(18, 45, "1.5inch OLED", &Font12, FONT_BACKGROUND, WHITE);
530 +
531 + //printf("Showing...\r\n");
532 + OLED_Display();
533 + Driver_Delay_ms(2000);
534 +}
535 +
536 +
537 +/*----------------------------------------------------------------------------
538 + User Function
539 + *----------------------------------------------------------------------------*/
540 +void OLED_Config(void)
541 +{
542 + /* Init GPIO Port C for non-secure OLED control */
543 + GPIO_SetMode(PC_NS, BIT12 | BIT11, GPIO_MODE_OUTPUT);
544 + PC11_NS = 1; //OLED_DC(DATA or COMMAND)
545 + PC12_NS = 1; //OLED_RST
546 +
547 +
548 + /* USER CODE BEGIN 2 */
549 + if(OLED_PRINT)
550 + printf("**********1.5inch OLED Init**********\r\n");
551 + System_Init();
552 +
553 + if(OLED_PRINT)
554 + printf("OLED_Init()...\r\n");
555 + OLED_Init(SCAN_DIR_DFT);//SCAN_DIR_DFT = D2U_L2R
556 +
557 + if(OLED_PRINT)
558 + printf("OLED_Show()...\r\n");
559 + GUI_Show();
560 +
561 + if(OLED_PRINT)
562 + printf("************************************\r\n");
563 + OLED_Clear(OLED_BACKGROUND);//OLED_BACKGROUND
564 + OLED_Display();
565 +}
566 +
567 +void OLED_Background_On()
568 +{
569 + OLED_SetWindow(0, 0, 127, 127);
570 + OLED_ClearWindow(0, 0, 127, 127, BLACK);
571 +
572 + if(OLED_PRINT)
573 + printf("Show toolbar icons\n");
574 + GUI_Disbitmap(0 , 2, Signal816 , 16, 8);
575 + GUI_Disbitmap(24 , 2, Bluetooth88, 8 , 8);
576 + GUI_Disbitmap(40 , 2, Msg816 , 16, 8);
577 + GUI_Disbitmap(64 , 2, GPRS88 , 8 , 8);
578 + GUI_Disbitmap(90 , 2, Alarm88 , 8 , 8);
579 + GUI_Disbitmap(112, 2, Bat816 , 16, 8);
580 +
581 + if(OLED_PRINT)
582 + printf("Show background(16 gray map)\n");
583 + GUI_DisGrayMap(0, 0, gImage_background);
584 +
585 +
586 + OLED_DisWindow(0, 0, 127, 127);
587 +}
588 +
589 +void OLED_BPM(uint32_t bpm)
590 +{
591 + if(bpm == 9999)
592 + {
593 + OLED_SetWindow(0, 10, 127, 50);
594 + OLED_ClearWindow(0, 10, 127, 50, BLACK);
595 + OLED_DisWindow(0, 10, 127, 50);
596 + return ;
597 + }
598 +
599 + if(OLED_PRINT)
600 + printf("Show Heart Rate\n");
601 + OLED_SetWindow(0, 10, 127, 50);
602 + GUI_DisNum(22 , 25, bpm, &Font24, FONT_BACKGROUND, WHITE);
603 + OLED_DisWindow(0, 10, 127, 50);
604 +}
605 +
606 +void OLED_Off(void)
607 +{
608 + OLED_Clear(OLED_BACKGROUND);//OLED_BACKGROUND
609 + OLED_Display();
610 +}
611 +
612 +
This diff could not be displayed because it is too large.
1 +/**
2 + ******************************************************************************
3 + * @file Font12.c
4 + * @author MCD Application Team
5 + * @version V1.0.0
6 + * @date 18-February-2014
7 + * @brief This file provides text Font12 for STM32xx-EVAL's LCD driver.
8 + ******************************************************************************
9 + * @attention
10 + *
11 + * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
12 + *
13 + * Redistribution and use in source and binary forms, with or without modification,
14 + * are permitted provided that the following conditions are met:
15 + * 1. Redistributions of source code must retain the above copyright notice,
16 + * this list of conditions and the following disclaimer.
17 + * 2. Redistributions in binary form must reproduce the above copyright notice,
18 + * this list of conditions and the following disclaimer in the documentation
19 + * and/or other materials provided with the distribution.
20 + * 3. Neither the name of STMicroelectronics nor the names of its contributors
21 + * may be used to endorse or promote products derived from this software
22 + * without specific prior written permission.
23 + *
24 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25 + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27 + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
28 + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30 + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31 + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
32 + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33 + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 + *
35 + ******************************************************************************
36 + */
37 +
38 +/* Includes ------------------------------------------------------------------*/
39 +#include "fonts.h"
40 +
41 +//
42 +// Font data for Courier New 12pt
43 +//
44 +
45 +const uint8_t Font12_Table[] =
46 +{
47 + // @0 ' ' (7 pixels wide)
48 + 0x00, //
49 + 0x00, //
50 + 0x00, //
51 + 0x00, //
52 + 0x00, //
53 + 0x00, //
54 + 0x00, //
55 + 0x00, //
56 + 0x00, //
57 + 0x00, //
58 + 0x00, //
59 + 0x00, //
60 +
61 + // @12 '!' (7 pixels wide)
62 + 0x00, //
63 + 0x10, // #
64 + 0x10, // #
65 + 0x10, // #
66 + 0x10, // #
67 + 0x10, // #
68 + 0x00, //
69 + 0x00, //
70 + 0x10, // #
71 + 0x00, //
72 + 0x00, //
73 + 0x00, //
74 +
75 + // @24 '"' (7 pixels wide)
76 + 0x00, //
77 + 0x6C, // ## ##
78 + 0x48, // # #
79 + 0x48, // # #
80 + 0x00, //
81 + 0x00, //
82 + 0x00, //
83 + 0x00, //
84 + 0x00, //
85 + 0x00, //
86 + 0x00, //
87 + 0x00, //
88 +
89 + // @36 '#' (7 pixels wide)
90 + 0x00, //
91 + 0x14, // # #
92 + 0x14, // # #
93 + 0x28, // # #
94 + 0x7C, // #####
95 + 0x28, // # #
96 + 0x7C, // #####
97 + 0x28, // # #
98 + 0x50, // # #
99 + 0x50, // # #
100 + 0x00, //
101 + 0x00, //
102 +
103 + // @48 '$' (7 pixels wide)
104 + 0x00, //
105 + 0x10, // #
106 + 0x38, // ###
107 + 0x40, // #
108 + 0x40, // #
109 + 0x38, // ###
110 + 0x48, // # #
111 + 0x70, // ###
112 + 0x10, // #
113 + 0x10, // #
114 + 0x00, //
115 + 0x00, //
116 +
117 + // @60 '%' (7 pixels wide)
118 + 0x00, //
119 + 0x20, // #
120 + 0x50, // # #
121 + 0x20, // #
122 + 0x0C, // ##
123 + 0x70, // ###
124 + 0x08, // #
125 + 0x14, // # #
126 + 0x08, // #
127 + 0x00, //
128 + 0x00, //
129 + 0x00, //
130 +
131 + // @72 '&' (7 pixels wide)
132 + 0x00, //
133 + 0x00, //
134 + 0x00, //
135 + 0x18, // ##
136 + 0x20, // #
137 + 0x20, // #
138 + 0x54, // # # #
139 + 0x48, // # #
140 + 0x34, // ## #
141 + 0x00, //
142 + 0x00, //
143 + 0x00, //
144 +
145 + // @84 ''' (7 pixels wide)
146 + 0x00, //
147 + 0x10, // #
148 + 0x10, // #
149 + 0x10, // #
150 + 0x10, // #
151 + 0x00, //
152 + 0x00, //
153 + 0x00, //
154 + 0x00, //
155 + 0x00, //
156 + 0x00, //
157 + 0x00, //
158 +
159 + // @96 '(' (7 pixels wide)
160 + 0x00, //
161 + 0x08, // #
162 + 0x08, // #
163 + 0x10, // #
164 + 0x10, // #
165 + 0x10, // #
166 + 0x10, // #
167 + 0x10, // #
168 + 0x10, // #
169 + 0x08, // #
170 + 0x08, // #
171 + 0x00, //
172 +
173 + // @108 ')' (7 pixels wide)
174 + 0x00, //
175 + 0x20, // #
176 + 0x20, // #
177 + 0x10, // #
178 + 0x10, // #
179 + 0x10, // #
180 + 0x10, // #
181 + 0x10, // #
182 + 0x10, // #
183 + 0x20, // #
184 + 0x20, // #
185 + 0x00, //
186 +
187 + // @120 '*' (7 pixels wide)
188 + 0x00, //
189 + 0x10, // #
190 + 0x7C, // #####
191 + 0x10, // #
192 + 0x28, // # #
193 + 0x28, // # #
194 + 0x00, //
195 + 0x00, //
196 + 0x00, //
197 + 0x00, //
198 + 0x00, //
199 + 0x00, //
200 +
201 + // @132 '+' (7 pixels wide)
202 + 0x00, //
203 + 0x00, //
204 + 0x10, // #
205 + 0x10, // #
206 + 0x10, // #
207 + 0xFE, // #######
208 + 0x10, // #
209 + 0x10, // #
210 + 0x10, // #
211 + 0x00, //
212 + 0x00, //
213 + 0x00, //
214 +
215 + // @144 ',' (7 pixels wide)
216 + 0x00, //
217 + 0x00, //
218 + 0x00, //
219 + 0x00, //
220 + 0x00, //
221 + 0x00, //
222 + 0x00, //
223 + 0x18, // ##
224 + 0x10, // #
225 + 0x30, // ##
226 + 0x20, // #
227 + 0x00, //
228 +
229 + // @156 '-' (7 pixels wide)
230 + 0x00, //
231 + 0x00, //
232 + 0x00, //
233 + 0x00, //
234 + 0x00, //
235 + 0x7C, // #####
236 + 0x00, //
237 + 0x00, //
238 + 0x00, //
239 + 0x00, //
240 + 0x00, //
241 + 0x00, //
242 +
243 + // @168 '.' (7 pixels wide)
244 + 0x00, //
245 + 0x00, //
246 + 0x00, //
247 + 0x00, //
248 + 0x00, //
249 + 0x00, //
250 + 0x00, //
251 + 0x30, // ##
252 + 0x30, // ##
253 + 0x00, //
254 + 0x00, //
255 + 0x00, //
256 +
257 + // @180 '/' (7 pixels wide)
258 + 0x00, //
259 + 0x04, // #
260 + 0x04, // #
261 + 0x08, // #
262 + 0x08, // #
263 + 0x10, // #
264 + 0x10, // #
265 + 0x20, // #
266 + 0x20, // #
267 + 0x40, // #
268 + 0x00, //
269 + 0x00, //
270 +
271 + // @192 '0' (7 pixels wide)
272 + 0x00, //
273 + 0x38, // ###
274 + 0x44, // # #
275 + 0x44, // # #
276 + 0x44, // # #
277 + 0x44, // # #
278 + 0x44, // # #
279 + 0x44, // # #
280 + 0x38, // ###
281 + 0x00, //
282 + 0x00, //
283 + 0x00, //
284 +
285 + // @204 '1' (7 pixels wide)
286 + 0x00, //
287 + 0x30, // ##
288 + 0x10, // #
289 + 0x10, // #
290 + 0x10, // #
291 + 0x10, // #
292 + 0x10, // #
293 + 0x10, // #
294 + 0x7C, // #####
295 + 0x00, //
296 + 0x00, //
297 + 0x00, //
298 +
299 + // @216 '2' (7 pixels wide)
300 + 0x00, //
301 + 0x38, // ###
302 + 0x44, // # #
303 + 0x04, // #
304 + 0x08, // #
305 + 0x10, // #
306 + 0x20, // #
307 + 0x44, // # #
308 + 0x7C, // #####
309 + 0x00, //
310 + 0x00, //
311 + 0x00, //
312 +
313 + // @228 '3' (7 pixels wide)
314 + 0x00, //
315 + 0x38, // ###
316 + 0x44, // # #
317 + 0x04, // #
318 + 0x18, // ##
319 + 0x04, // #
320 + 0x04, // #
321 + 0x44, // # #
322 + 0x38, // ###
323 + 0x00, //
324 + 0x00, //
325 + 0x00, //
326 +
327 + // @240 '4' (7 pixels wide)
328 + 0x00, //
329 + 0x0C, // ##
330 + 0x14, // # #
331 + 0x14, // # #
332 + 0x24, // # #
333 + 0x44, // # #
334 + 0x7E, // ######
335 + 0x04, // #
336 + 0x0E, // ###
337 + 0x00, //
338 + 0x00, //
339 + 0x00, //
340 +
341 + // @252 '5' (7 pixels wide)
342 + 0x00, //
343 + 0x3C, // ####
344 + 0x20, // #
345 + 0x20, // #
346 + 0x38, // ###
347 + 0x04, // #
348 + 0x04, // #
349 + 0x44, // # #
350 + 0x38, // ###
351 + 0x00, //
352 + 0x00, //
353 + 0x00, //
354 +
355 + // @264 '6' (7 pixels wide)
356 + 0x00, //
357 + 0x1C, // ###
358 + 0x20, // #
359 + 0x40, // #
360 + 0x78, // ####
361 + 0x44, // # #
362 + 0x44, // # #
363 + 0x44, // # #
364 + 0x38, // ###
365 + 0x00, //
366 + 0x00, //
367 + 0x00, //
368 +
369 + // @276 '7' (7 pixels wide)
370 + 0x00, //
371 + 0x7C, // #####
372 + 0x44, // # #
373 + 0x04, // #
374 + 0x08, // #
375 + 0x08, // #
376 + 0x08, // #
377 + 0x10, // #
378 + 0x10, // #
379 + 0x00, //
380 + 0x00, //
381 + 0x00, //
382 +
383 + // @288 '8' (7 pixels wide)
384 + 0x00, //
385 + 0x38, // ###
386 + 0x44, // # #
387 + 0x44, // # #
388 + 0x38, // ###
389 + 0x44, // # #
390 + 0x44, // # #
391 + 0x44, // # #
392 + 0x38, // ###
393 + 0x00, //
394 + 0x00, //
395 + 0x00, //
396 +
397 + // @300 '9' (7 pixels wide)
398 + 0x00, //
399 + 0x38, // ###
400 + 0x44, // # #
401 + 0x44, // # #
402 + 0x44, // # #
403 + 0x3C, // ####
404 + 0x04, // #
405 + 0x08, // #
406 + 0x70, // ###
407 + 0x00, //
408 + 0x00, //
409 + 0x00, //
410 +
411 + // @312 ':' (7 pixels wide)
412 + 0x00, //
413 + 0x00, //
414 + 0x00, //
415 + 0x30, // ##
416 + 0x30, // ##
417 + 0x00, //
418 + 0x00, //
419 + 0x30, // ##
420 + 0x30, // ##
421 + 0x00, //
422 + 0x00, //
423 + 0x00, //
424 +
425 + // @324 ';' (7 pixels wide)
426 + 0x00, //
427 + 0x00, //
428 + 0x00, //
429 + 0x18, // ##
430 + 0x18, // ##
431 + 0x00, //
432 + 0x00, //
433 + 0x18, // ##
434 + 0x30, // ##
435 + 0x20, // #
436 + 0x00, //
437 + 0x00, //
438 +
439 + // @336 '<' (7 pixels wide)
440 + 0x00, //
441 + 0x00, //
442 + 0x0C, // ##
443 + 0x10, // #
444 + 0x60, // ##
445 + 0x80, // #
446 + 0x60, // ##
447 + 0x10, // #
448 + 0x0C, // ##
449 + 0x00, //
450 + 0x00, //
451 + 0x00, //
452 +
453 + // @348 '=' (7 pixels wide)
454 + 0x00, //
455 + 0x00, //
456 + 0x00, //
457 + 0x00, //
458 + 0x7C, // #####
459 + 0x00, //
460 + 0x7C, // #####
461 + 0x00, //
462 + 0x00, //
463 + 0x00, //
464 + 0x00, //
465 + 0x00, //
466 +
467 + // @360 '>' (7 pixels wide)
468 + 0x00, //
469 + 0x00, //
470 + 0xC0, // ##
471 + 0x20, // #
472 + 0x18, // ##
473 + 0x04, // #
474 + 0x18, // ##
475 + 0x20, // #
476 + 0xC0, // ##
477 + 0x00, //
478 + 0x00, //
479 + 0x00, //
480 +
481 + // @372 '?' (7 pixels wide)
482 + 0x00, //
483 + 0x00, //
484 + 0x18, // ##
485 + 0x24, // # #
486 + 0x04, // #
487 + 0x08, // #
488 + 0x10, // #
489 + 0x00, //
490 + 0x30, // ##
491 + 0x00, //
492 + 0x00, //
493 + 0x00, //
494 +
495 + // @384 '@' (7 pixels wide)
496 + 0x38, // ###
497 + 0x44, // # #
498 + 0x44, // # #
499 + 0x4C, // # ##
500 + 0x54, // # # #
501 + 0x54, // # # #
502 + 0x4C, // # ##
503 + 0x40, // #
504 + 0x44, // # #
505 + 0x38, // ###
506 + 0x00, //
507 + 0x00, //
508 +
509 + // @396 'A' (7 pixels wide)
510 + 0x00, //
511 + 0x30, // ##
512 + 0x10, // #
513 + 0x28, // # #
514 + 0x28, // # #
515 + 0x28, // # #
516 + 0x7C, // #####
517 + 0x44, // # #
518 + 0xEE, // ### ###
519 + 0x00, //
520 + 0x00, //
521 + 0x00, //
522 +
523 + // @408 'B' (7 pixels wide)
524 + 0x00, //
525 + 0xF8, // #####
526 + 0x44, // # #
527 + 0x44, // # #
528 + 0x78, // ####
529 + 0x44, // # #
530 + 0x44, // # #
531 + 0x44, // # #
532 + 0xF8, // #####
533 + 0x00, //
534 + 0x00, //
535 + 0x00, //
536 +
537 + // @420 'C' (7 pixels wide)
538 + 0x00, //
539 + 0x3C, // ####
540 + 0x44, // # #
541 + 0x40, // #
542 + 0x40, // #
543 + 0x40, // #
544 + 0x40, // #
545 + 0x44, // # #
546 + 0x38, // ###
547 + 0x00, //
548 + 0x00, //
549 + 0x00, //
550 +
551 + // @432 'D' (7 pixels wide)
552 + 0x00, //
553 + 0xF0, // ####
554 + 0x48, // # #
555 + 0x44, // # #
556 + 0x44, // # #
557 + 0x44, // # #
558 + 0x44, // # #
559 + 0x48, // # #
560 + 0xF0, // ####
561 + 0x00, //
562 + 0x00, //
563 + 0x00, //
564 +
565 + // @444 'E' (7 pixels wide)
566 + 0x00, //
567 + 0xFC, // ######
568 + 0x44, // # #
569 + 0x50, // # #
570 + 0x70, // ###
571 + 0x50, // # #
572 + 0x40, // #
573 + 0x44, // # #
574 + 0xFC, // ######
575 + 0x00, //
576 + 0x00, //
577 + 0x00, //
578 +
579 + // @456 'F' (7 pixels wide)
580 + 0x00, //
581 + 0x7E, // ######
582 + 0x22, // # #
583 + 0x28, // # #
584 + 0x38, // ###
585 + 0x28, // # #
586 + 0x20, // #
587 + 0x20, // #
588 + 0x70, // ###
589 + 0x00, //
590 + 0x00, //
591 + 0x00, //
592 +
593 + // @468 'G' (7 pixels wide)
594 + 0x00, //
595 + 0x3C, // ####
596 + 0x44, // # #
597 + 0x40, // #
598 + 0x40, // #
599 + 0x4E, // # ###
600 + 0x44, // # #
601 + 0x44, // # #
602 + 0x38, // ###
603 + 0x00, //
604 + 0x00, //
605 + 0x00, //
606 +
607 + // @480 'H' (7 pixels wide)
608 + 0x00, //
609 + 0xEE, // ### ###
610 + 0x44, // # #
611 + 0x44, // # #
612 + 0x7C, // #####
613 + 0x44, // # #
614 + 0x44, // # #
615 + 0x44, // # #
616 + 0xEE, // ### ###
617 + 0x00, //
618 + 0x00, //
619 + 0x00, //
620 +
621 + // @492 'I' (7 pixels wide)
622 + 0x00, //
623 + 0x7C, // #####
624 + 0x10, // #
625 + 0x10, // #
626 + 0x10, // #
627 + 0x10, // #
628 + 0x10, // #
629 + 0x10, // #
630 + 0x7C, // #####
631 + 0x00, //
632 + 0x00, //
633 + 0x00, //
634 +
635 + // @504 'J' (7 pixels wide)
636 + 0x00, //
637 + 0x3C, // ####
638 + 0x08, // #
639 + 0x08, // #
640 + 0x08, // #
641 + 0x48, // # #
642 + 0x48, // # #
643 + 0x48, // # #
644 + 0x30, // ##
645 + 0x00, //
646 + 0x00, //
647 + 0x00, //
648 +
649 + // @516 'K' (7 pixels wide)
650 + 0x00, //
651 + 0xEE, // ### ###
652 + 0x44, // # #
653 + 0x48, // # #
654 + 0x50, // # #
655 + 0x70, // ###
656 + 0x48, // # #
657 + 0x44, // # #
658 + 0xE6, // ### ##
659 + 0x00, //
660 + 0x00, //
661 + 0x00, //
662 +
663 + // @528 'L' (7 pixels wide)
664 + 0x00, //
665 + 0x70, // ###
666 + 0x20, // #
667 + 0x20, // #
668 + 0x20, // #
669 + 0x20, // #
670 + 0x24, // # #
671 + 0x24, // # #
672 + 0x7C, // #####
673 + 0x00, //
674 + 0x00, //
675 + 0x00, //
676 +
677 + // @540 'M' (7 pixels wide)
678 + 0x00, //
679 + 0xEE, // ### ###
680 + 0x6C, // ## ##
681 + 0x6C, // ## ##
682 + 0x54, // # # #
683 + 0x54, // # # #
684 + 0x44, // # #
685 + 0x44, // # #
686 + 0xEE, // ### ###
687 + 0x00, //
688 + 0x00, //
689 + 0x00, //
690 +
691 + // @552 'N' (7 pixels wide)
692 + 0x00, //
693 + 0xEE, // ### ###
694 + 0x64, // ## #
695 + 0x64, // ## #
696 + 0x54, // # # #
697 + 0x54, // # # #
698 + 0x54, // # # #
699 + 0x4C, // # ##
700 + 0xEC, // ### ##
701 + 0x00, //
702 + 0x00, //
703 + 0x00, //
704 +
705 + // @564 'O' (7 pixels wide)
706 + 0x00, //
707 + 0x38, // ###
708 + 0x44, // # #
709 + 0x44, // # #
710 + 0x44, // # #
711 + 0x44, // # #
712 + 0x44, // # #
713 + 0x44, // # #
714 + 0x38, // ###
715 + 0x00, //
716 + 0x00, //
717 + 0x00, //
718 +
719 + // @576 'P' (7 pixels wide)
720 + 0x00, //
721 + 0x78, // ####
722 + 0x24, // # #
723 + 0x24, // # #
724 + 0x24, // # #
725 + 0x38, // ###
726 + 0x20, // #
727 + 0x20, // #
728 + 0x70, // ###
729 + 0x00, //
730 + 0x00, //
731 + 0x00, //
732 +
733 + // @588 'Q' (7 pixels wide)
734 + 0x00, //
735 + 0x38, // ###
736 + 0x44, // # #
737 + 0x44, // # #
738 + 0x44, // # #
739 + 0x44, // # #
740 + 0x44, // # #
741 + 0x44, // # #
742 + 0x38, // ###
743 + 0x1C, // ###
744 + 0x00, //
745 + 0x00, //
746 +
747 + // @600 'R' (7 pixels wide)
748 + 0x00, //
749 + 0xF8, // #####
750 + 0x44, // # #
751 + 0x44, // # #
752 + 0x44, // # #
753 + 0x78, // ####
754 + 0x48, // # #
755 + 0x44, // # #
756 + 0xE2, // ### #
757 + 0x00, //
758 + 0x00, //
759 + 0x00, //
760 +
761 + // @612 'S' (7 pixels wide)
762 + 0x00, //
763 + 0x34, // ## #
764 + 0x4C, // # ##
765 + 0x40, // #
766 + 0x38, // ###
767 + 0x04, // #
768 + 0x04, // #
769 + 0x64, // ## #
770 + 0x58, // # ##
771 + 0x00, //
772 + 0x00, //
773 + 0x00, //
774 +
775 + // @624 'T' (7 pixels wide)
776 + 0x00, //
777 + 0xFE, // #######
778 + 0x92, // # # #
779 + 0x10, // #
780 + 0x10, // #
781 + 0x10, // #
782 + 0x10, // #
783 + 0x10, // #
784 + 0x38, // ###
785 + 0x00, //
786 + 0x00, //
787 + 0x00, //
788 +
789 + // @636 'U' (7 pixels wide)
790 + 0x00, //
791 + 0xEE, // ### ###
792 + 0x44, // # #
793 + 0x44, // # #
794 + 0x44, // # #
795 + 0x44, // # #
796 + 0x44, // # #
797 + 0x44, // # #
798 + 0x38, // ###
799 + 0x00, //
800 + 0x00, //
801 + 0x00, //
802 +
803 + // @648 'V' (7 pixels wide)
804 + 0x00, //
805 + 0xEE, // ### ###
806 + 0x44, // # #
807 + 0x44, // # #
808 + 0x28, // # #
809 + 0x28, // # #
810 + 0x28, // # #
811 + 0x10, // #
812 + 0x10, // #
813 + 0x00, //
814 + 0x00, //
815 + 0x00, //
816 +
817 + // @660 'W' (7 pixels wide)
818 + 0x00, //
819 + 0xEE, // ### ###
820 + 0x44, // # #
821 + 0x44, // # #
822 + 0x54, // # # #
823 + 0x54, // # # #
824 + 0x54, // # # #
825 + 0x54, // # # #
826 + 0x28, // # #
827 + 0x00, //
828 + 0x00, //
829 + 0x00, //
830 +
831 + // @672 'X' (7 pixels wide)
832 + 0x00, //
833 + 0xC6, // ## ##
834 + 0x44, // # #
835 + 0x28, // # #
836 + 0x10, // #
837 + 0x10, // #
838 + 0x28, // # #
839 + 0x44, // # #
840 + 0xC6, // ## ##
841 + 0x00, //
842 + 0x00, //
843 + 0x00, //
844 +
845 + // @684 'Y' (7 pixels wide)
846 + 0x00, //
847 + 0xEE, // ### ###
848 + 0x44, // # #
849 + 0x28, // # #
850 + 0x28, // # #
851 + 0x10, // #
852 + 0x10, // #
853 + 0x10, // #
854 + 0x38, // ###
855 + 0x00, //
856 + 0x00, //
857 + 0x00, //
858 +
859 + // @696 'Z' (7 pixels wide)
860 + 0x00, //
861 + 0x7C, // #####
862 + 0x44, // # #
863 + 0x08, // #
864 + 0x10, // #
865 + 0x10, // #
866 + 0x20, // #
867 + 0x44, // # #
868 + 0x7C, // #####
869 + 0x00, //
870 + 0x00, //
871 + 0x00, //
872 +
873 + // @708 '[' (7 pixels wide)
874 + 0x00, //
875 + 0x38, // ###
876 + 0x20, // #
877 + 0x20, // #
878 + 0x20, // #
879 + 0x20, // #
880 + 0x20, // #
881 + 0x20, // #
882 + 0x20, // #
883 + 0x20, // #
884 + 0x38, // ###
885 + 0x00, //
886 +
887 + // @720 '\' (7 pixels wide)
888 + 0x00, //
889 + 0x40, // #
890 + 0x20, // #
891 + 0x20, // #
892 + 0x20, // #
893 + 0x10, // #
894 + 0x10, // #
895 + 0x08, // #
896 + 0x08, // #
897 + 0x08, // #
898 + 0x00, //
899 + 0x00, //
900 +
901 + // @732 ']' (7 pixels wide)
902 + 0x00, //
903 + 0x38, // ###
904 + 0x08, // #
905 + 0x08, // #
906 + 0x08, // #
907 + 0x08, // #
908 + 0x08, // #
909 + 0x08, // #
910 + 0x08, // #
911 + 0x08, // #
912 + 0x38, // ###
913 + 0x00, //
914 +
915 + // @744 '^' (7 pixels wide)
916 + 0x00, //
917 + 0x10, // #
918 + 0x10, // #
919 + 0x28, // # #
920 + 0x44, // # #
921 + 0x00, //
922 + 0x00, //
923 + 0x00, //
924 + 0x00, //
925 + 0x00, //
926 + 0x00, //
927 + 0x00, //
928 +
929 + // @756 '_' (7 pixels wide)
930 + 0x00, //
931 + 0x00, //
932 + 0x00, //
933 + 0x00, //
934 + 0x00, //
935 + 0x00, //
936 + 0x00, //
937 + 0x00, //
938 + 0x00, //
939 + 0x00, //
940 + 0x00, //
941 + 0xFE, // #######
942 +
943 + // @768 '`' (7 pixels wide)
944 + 0x00, //
945 + 0x10, // #
946 + 0x08, // #
947 + 0x00, //
948 + 0x00, //
949 + 0x00, //
950 + 0x00, //
951 + 0x00, //
952 + 0x00, //
953 + 0x00, //
954 + 0x00, //
955 + 0x00, //
956 +
957 + // @780 'a' (7 pixels wide)
958 + 0x00, //
959 + 0x00, //
960 + 0x00, //
961 + 0x38, // ###
962 + 0x44, // # #
963 + 0x3C, // ####
964 + 0x44, // # #
965 + 0x44, // # #
966 + 0x3E, // #####
967 + 0x00, //
968 + 0x00, //
969 + 0x00, //
970 +
971 + // @792 'b' (7 pixels wide)
972 + 0x00, //
973 + 0xC0, // ##
974 + 0x40, // #
975 + 0x58, // # ##
976 + 0x64, // ## #
977 + 0x44, // # #
978 + 0x44, // # #
979 + 0x44, // # #
980 + 0xF8, // #####
981 + 0x00, //
982 + 0x00, //
983 + 0x00, //
984 +
985 + // @804 'c' (7 pixels wide)
986 + 0x00, //
987 + 0x00, //
988 + 0x00, //
989 + 0x3C, // ####
990 + 0x44, // # #
991 + 0x40, // #
992 + 0x40, // #
993 + 0x44, // # #
994 + 0x38, // ###
995 + 0x00, //
996 + 0x00, //
997 + 0x00, //
998 +
999 + // @816 'd' (7 pixels wide)
1000 + 0x00, //
1001 + 0x0C, // ##
1002 + 0x04, // #
1003 + 0x34, // ## #
1004 + 0x4C, // # ##
1005 + 0x44, // # #
1006 + 0x44, // # #
1007 + 0x44, // # #
1008 + 0x3E, // #####
1009 + 0x00, //
1010 + 0x00, //
1011 + 0x00, //
1012 +
1013 + // @828 'e' (7 pixels wide)
1014 + 0x00, //
1015 + 0x00, //
1016 + 0x00, //
1017 + 0x38, // ###
1018 + 0x44, // # #
1019 + 0x7C, // #####
1020 + 0x40, // #
1021 + 0x40, // #
1022 + 0x3C, // ####
1023 + 0x00, //
1024 + 0x00, //
1025 + 0x00, //
1026 +
1027 + // @840 'f' (7 pixels wide)
1028 + 0x00, //
1029 + 0x1C, // ###
1030 + 0x20, // #
1031 + 0x7C, // #####
1032 + 0x20, // #
1033 + 0x20, // #
1034 + 0x20, // #
1035 + 0x20, // #
1036 + 0x7C, // #####
1037 + 0x00, //
1038 + 0x00, //
1039 + 0x00, //
1040 +
1041 + // @852 'g' (7 pixels wide)
1042 + 0x00, //
1043 + 0x00, //
1044 + 0x00, //
1045 + 0x36, // ## ##
1046 + 0x4C, // # ##
1047 + 0x44, // # #
1048 + 0x44, // # #
1049 + 0x44, // # #
1050 + 0x3C, // ####
1051 + 0x04, // #
1052 + 0x38, // ###
1053 + 0x00, //
1054 +
1055 + // @864 'h' (7 pixels wide)
1056 + 0x00, //
1057 + 0xC0, // ##
1058 + 0x40, // #
1059 + 0x58, // # ##
1060 + 0x64, // ## #
1061 + 0x44, // # #
1062 + 0x44, // # #
1063 + 0x44, // # #
1064 + 0xEE, // ### ###
1065 + 0x00, //
1066 + 0x00, //
1067 + 0x00, //
1068 +
1069 + // @876 'i' (7 pixels wide)
1070 + 0x00, //
1071 + 0x10, // #
1072 + 0x00, //
1073 + 0x70, // ###
1074 + 0x10, // #
1075 + 0x10, // #
1076 + 0x10, // #
1077 + 0x10, // #
1078 + 0x7C, // #####
1079 + 0x00, //
1080 + 0x00, //
1081 + 0x00, //
1082 +
1083 + // @888 'j' (7 pixels wide)
1084 + 0x00, //
1085 + 0x10, // #
1086 + 0x00, //
1087 + 0x78, // ####
1088 + 0x08, // #
1089 + 0x08, // #
1090 + 0x08, // #
1091 + 0x08, // #
1092 + 0x08, // #
1093 + 0x08, // #
1094 + 0x70, // ###
1095 + 0x00, //
1096 +
1097 + // @900 'k' (7 pixels wide)
1098 + 0x00, //
1099 + 0xC0, // ##
1100 + 0x40, // #
1101 + 0x5C, // # ###
1102 + 0x48, // # #
1103 + 0x70, // ###
1104 + 0x50, // # #
1105 + 0x48, // # #
1106 + 0xDC, // ## ###
1107 + 0x00, //
1108 + 0x00, //
1109 + 0x00, //
1110 +
1111 + // @912 'l' (7 pixels wide)
1112 + 0x00, //
1113 + 0x30, // ##
1114 + 0x10, // #
1115 + 0x10, // #
1116 + 0x10, // #
1117 + 0x10, // #
1118 + 0x10, // #
1119 + 0x10, // #
1120 + 0x7C, // #####
1121 + 0x00, //
1122 + 0x00, //
1123 + 0x00, //
1124 +
1125 + // @924 'm' (7 pixels wide)
1126 + 0x00, //
1127 + 0x00, //
1128 + 0x00, //
1129 + 0xE8, // ### #
1130 + 0x54, // # # #
1131 + 0x54, // # # #
1132 + 0x54, // # # #
1133 + 0x54, // # # #
1134 + 0xFE, // #######
1135 + 0x00, //
1136 + 0x00, //
1137 + 0x00, //
1138 +
1139 + // @936 'n' (7 pixels wide)
1140 + 0x00, //
1141 + 0x00, //
1142 + 0x00, //
1143 + 0xD8, // ## ##
1144 + 0x64, // ## #
1145 + 0x44, // # #
1146 + 0x44, // # #
1147 + 0x44, // # #
1148 + 0xEE, // ### ###
1149 + 0x00, //
1150 + 0x00, //
1151 + 0x00, //
1152 +
1153 + // @948 'o' (7 pixels wide)
1154 + 0x00, //
1155 + 0x00, //
1156 + 0x00, //
1157 + 0x38, // ###
1158 + 0x44, // # #
1159 + 0x44, // # #
1160 + 0x44, // # #
1161 + 0x44, // # #
1162 + 0x38, // ###
1163 + 0x00, //
1164 + 0x00, //
1165 + 0x00, //
1166 +
1167 + // @960 'p' (7 pixels wide)
1168 + 0x00, //
1169 + 0x00, //
1170 + 0x00, //
1171 + 0xD8, // ## ##
1172 + 0x64, // ## #
1173 + 0x44, // # #
1174 + 0x44, // # #
1175 + 0x44, // # #
1176 + 0x78, // ####
1177 + 0x40, // #
1178 + 0xE0, // ###
1179 + 0x00, //
1180 +
1181 + // @972 'q' (7 pixels wide)
1182 + 0x00, //
1183 + 0x00, //
1184 + 0x00, //
1185 + 0x36, // ## ##
1186 + 0x4C, // # ##
1187 + 0x44, // # #
1188 + 0x44, // # #
1189 + 0x44, // # #
1190 + 0x3C, // ####
1191 + 0x04, // #
1192 + 0x0E, // ###
1193 + 0x00, //
1194 +
1195 + // @984 'r' (7 pixels wide)
1196 + 0x00, //
1197 + 0x00, //
1198 + 0x00, //
1199 + 0x6C, // ## ##
1200 + 0x30, // ##
1201 + 0x20, // #
1202 + 0x20, // #
1203 + 0x20, // #
1204 + 0x7C, // #####
1205 + 0x00, //
1206 + 0x00, //
1207 + 0x00, //
1208 +
1209 + // @996 's' (7 pixels wide)
1210 + 0x00, //
1211 + 0x00, //
1212 + 0x00, //
1213 + 0x3C, // ####
1214 + 0x44, // # #
1215 + 0x38, // ###
1216 + 0x04, // #
1217 + 0x44, // # #
1218 + 0x78, // ####
1219 + 0x00, //
1220 + 0x00, //
1221 + 0x00, //
1222 +
1223 + // @1008 't' (7 pixels wide)
1224 + 0x00, //
1225 + 0x00, //
1226 + 0x20, // #
1227 + 0x7C, // #####
1228 + 0x20, // #
1229 + 0x20, // #
1230 + 0x20, // #
1231 + 0x22, // # #
1232 + 0x1C, // ###
1233 + 0x00, //
1234 + 0x00, //
1235 + 0x00, //
1236 +
1237 + // @1020 'u' (7 pixels wide)
1238 + 0x00, //
1239 + 0x00, //
1240 + 0x00, //
1241 + 0xCC, // ## ##
1242 + 0x44, // # #
1243 + 0x44, // # #
1244 + 0x44, // # #
1245 + 0x4C, // # ##
1246 + 0x36, // ## ##
1247 + 0x00, //
1248 + 0x00, //
1249 + 0x00, //
1250 +
1251 + // @1032 'v' (7 pixels wide)
1252 + 0x00, //
1253 + 0x00, //
1254 + 0x00, //
1255 + 0xEE, // ### ###
1256 + 0x44, // # #
1257 + 0x44, // # #
1258 + 0x28, // # #
1259 + 0x28, // # #
1260 + 0x10, // #
1261 + 0x00, //
1262 + 0x00, //
1263 + 0x00, //
1264 +
1265 + // @1044 'w' (7 pixels wide)
1266 + 0x00, //
1267 + 0x00, //
1268 + 0x00, //
1269 + 0xEE, // ### ###
1270 + 0x44, // # #
1271 + 0x54, // # # #
1272 + 0x54, // # # #
1273 + 0x54, // # # #
1274 + 0x28, // # #
1275 + 0x00, //
1276 + 0x00, //
1277 + 0x00, //
1278 +
1279 + // @1056 'x' (7 pixels wide)
1280 + 0x00, //
1281 + 0x00, //
1282 + 0x00, //
1283 + 0xCC, // ## ##
1284 + 0x48, // # #
1285 + 0x30, // ##
1286 + 0x30, // ##
1287 + 0x48, // # #
1288 + 0xCC, // ## ##
1289 + 0x00, //
1290 + 0x00, //
1291 + 0x00, //
1292 +
1293 + // @1068 'y' (7 pixels wide)
1294 + 0x00, //
1295 + 0x00, //
1296 + 0x00, //
1297 + 0xEE, // ### ###
1298 + 0x44, // # #
1299 + 0x24, // # #
1300 + 0x28, // # #
1301 + 0x18, // ##
1302 + 0x10, // #
1303 + 0x10, // #
1304 + 0x78, // ####
1305 + 0x00, //
1306 +
1307 + // @1080 'z' (7 pixels wide)
1308 + 0x00, //
1309 + 0x00, //
1310 + 0x00, //
1311 + 0x7C, // #####
1312 + 0x48, // # #
1313 + 0x10, // #
1314 + 0x20, // #
1315 + 0x44, // # #
1316 + 0x7C, // #####
1317 + 0x00, //
1318 + 0x00, //
1319 + 0x00, //
1320 +
1321 + // @1092 '{' (7 pixels wide)
1322 + 0x00, //
1323 + 0x08, // #
1324 + 0x10, // #
1325 + 0x10, // #
1326 + 0x10, // #
1327 + 0x10, // #
1328 + 0x20, // #
1329 + 0x10, // #
1330 + 0x10, // #
1331 + 0x10, // #
1332 + 0x08, // #
1333 + 0x00, //
1334 +
1335 + // @1104 '|' (7 pixels wide)
1336 + 0x00, //
1337 + 0x10, // #
1338 + 0x10, // #
1339 + 0x10, // #
1340 + 0x10, // #
1341 + 0x10, // #
1342 + 0x10, // #
1343 + 0x10, // #
1344 + 0x10, // #
1345 + 0x10, // #
1346 + 0x00, //
1347 + 0x00, //
1348 +
1349 + // @1116 '}' (7 pixels wide)
1350 + 0x00, //
1351 + 0x20, // #
1352 + 0x10, // #
1353 + 0x10, // #
1354 + 0x10, // #
1355 + 0x10, // #
1356 + 0x08, // #
1357 + 0x10, // #
1358 + 0x10, // #
1359 + 0x10, // #
1360 + 0x20, // #
1361 + 0x00, //
1362 +
1363 + // @1128 '~' (7 pixels wide)
1364 + 0x00, //
1365 + 0x00, //
1366 + 0x00, //
1367 + 0x00, //
1368 + 0x00, //
1369 + 0x24, // # #
1370 + 0x58, // # ##
1371 + 0x00, //
1372 + 0x00, //
1373 + 0x00, //
1374 + 0x00, //
1375 + 0x00, //
1376 +};
1377 +
1378 +sFONT Font12 = {
1379 + Font12_Table,
1380 + 7, /* Width */
1381 + 12, /* Height */
1382 +};
1383 +
1384 +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
1 +/**
2 + ******************************************************************************
3 + * @file font16.c
4 + * @author MCD Application Team
5 + * @version V1.0.0
6 + * @date 18-February-2014
7 + * @brief This file provides text font16 for STM32xx-EVAL's LCD driver.
8 + ******************************************************************************
9 + * @attention
10 + *
11 + * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
12 + *
13 + * Redistribution and use in source and binary forms, with or without modification,
14 + * are permitted provided that the following conditions are met:
15 + * 1. Redistributions of source code must retain the above copyright notice,
16 + * this list of conditions and the following disclaimer.
17 + * 2. Redistributions in binary form must reproduce the above copyright notice,
18 + * this list of conditions and the following disclaimer in the documentation
19 + * and/or other materials provided with the distribution.
20 + * 3. Neither the name of STMicroelectronics nor the names of its contributors
21 + * may be used to endorse or promote products derived from this software
22 + * without specific prior written permission.
23 + *
24 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25 + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27 + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
28 + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30 + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31 + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
32 + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33 + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 + *
35 + ******************************************************************************
36 + */
37 +
38 +/* Includes ------------------------------------------------------------------*/
39 +#include "fonts.h"
40 +
41 +//
42 +// Font data for Courier New 12pt
43 +//
44 +
45 +const uint8_t Font16_Table[] =
46 +{
47 + // @0 ' ' (11 pixels wide)
48 + 0x00, 0x00, //
49 + 0x00, 0x00, //
50 + 0x00, 0x00, //
51 + 0x00, 0x00, //
52 + 0x00, 0x00, //
53 + 0x00, 0x00, //
54 + 0x00, 0x00, //
55 + 0x00, 0x00, //
56 + 0x00, 0x00, //
57 + 0x00, 0x00, //
58 + 0x00, 0x00, //
59 + 0x00, 0x00, //
60 + 0x00, 0x00, //
61 + 0x00, 0x00, //
62 + 0x00, 0x00, //
63 + 0x00, 0x00, //
64 +
65 + // @32 '!' (11 pixels wide)
66 + 0x00, 0x00, //
67 + 0x0C, 0x00, // ##
68 + 0x0C, 0x00, // ##
69 + 0x0C, 0x00, // ##
70 + 0x0C, 0x00, // ##
71 + 0x0C, 0x00, // ##
72 + 0x0C, 0x00, // ##
73 + 0x0C, 0x00, // ##
74 + 0x0C, 0x00, // ##
75 + 0x00, 0x00, //
76 + 0x0C, 0x00, // ##
77 + 0x00, 0x00, //
78 + 0x00, 0x00, //
79 + 0x00, 0x00, //
80 + 0x00, 0x00, //
81 + 0x00, 0x00, //
82 +
83 + // @64 '"' (11 pixels wide)
84 + 0x00, 0x00, //
85 + 0x00, 0x00, //
86 + 0x1D, 0xC0, // ### ###
87 + 0x1D, 0xC0, // ### ###
88 + 0x08, 0x80, // # #
89 + 0x08, 0x80, // # #
90 + 0x08, 0x80, // # #
91 + 0x00, 0x00, //
92 + 0x00, 0x00, //
93 + 0x00, 0x00, //
94 + 0x00, 0x00, //
95 + 0x00, 0x00, //
96 + 0x00, 0x00, //
97 + 0x00, 0x00, //
98 + 0x00, 0x00, //
99 + 0x00, 0x00, //
100 +
101 + // @96 '#' (11 pixels wide)
102 + 0x00, 0x00, //
103 + 0x0D, 0x80, // ## ##
104 + 0x0D, 0x80, // ## ##
105 + 0x0D, 0x80, // ## ##
106 + 0x0D, 0x80, // ## ##
107 + 0x3F, 0xC0, // ########
108 + 0x1B, 0x00, // ## ##
109 + 0x3F, 0xC0, // ########
110 + 0x1B, 0x00, // ## ##
111 + 0x1B, 0x00, // ## ##
112 + 0x1B, 0x00, // ## ##
113 + 0x1B, 0x00, // ## ##
114 + 0x00, 0x00, //
115 + 0x00, 0x00, //
116 + 0x00, 0x00, //
117 + 0x00, 0x00, //
118 +
119 + // @128 '$' (11 pixels wide)
120 + 0x04, 0x00, // #
121 + 0x1F, 0x80, // ######
122 + 0x31, 0x80, // ## ##
123 + 0x31, 0x80, // ## ##
124 + 0x38, 0x00, // ###
125 + 0x1E, 0x00, // ####
126 + 0x0F, 0x00, // ####
127 + 0x03, 0x80, // ###
128 + 0x31, 0x80, // ## ##
129 + 0x31, 0x80, // ## ##
130 + 0x3F, 0x00, // ######
131 + 0x04, 0x00, // #
132 + 0x04, 0x00, // #
133 + 0x00, 0x00, //
134 + 0x00, 0x00, //
135 + 0x00, 0x00, //
136 +
137 + // @160 '%' (11 pixels wide)
138 + 0x00, 0x00, //
139 + 0x18, 0x00, // ##
140 + 0x24, 0x00, // # #
141 + 0x24, 0x00, // # #
142 + 0x18, 0xC0, // ## ##
143 + 0x07, 0x80, // ####
144 + 0x1E, 0x00, // ####
145 + 0x31, 0x80, // ## ##
146 + 0x02, 0x40, // # #
147 + 0x02, 0x40, // # #
148 + 0x01, 0x80, // ##
149 + 0x00, 0x00, //
150 + 0x00, 0x00, //
151 + 0x00, 0x00, //
152 + 0x00, 0x00, //
153 + 0x00, 0x00, //
154 +
155 + // @192 '&' (11 pixels wide)
156 + 0x00, 0x00, //
157 + 0x00, 0x00, //
158 + 0x0F, 0x00, // ####
159 + 0x18, 0x00, // ##
160 + 0x18, 0x00, // ##
161 + 0x18, 0x00, // ##
162 + 0x0C, 0x00, // ##
163 + 0x1D, 0x80, // ### ##
164 + 0x37, 0x00, // ## ###
165 + 0x33, 0x00, // ## ##
166 + 0x1D, 0x80, // ### ##
167 + 0x00, 0x00, //
168 + 0x00, 0x00, //
169 + 0x00, 0x00, //
170 + 0x00, 0x00, //
171 + 0x00, 0x00, //
172 +
173 + // @224 ''' (11 pixels wide)
174 + 0x00, 0x00, //
175 + 0x00, 0x00, //
176 + 0x07, 0x00, // ###
177 + 0x07, 0x00, // ###
178 + 0x02, 0x00, // #
179 + 0x02, 0x00, // #
180 + 0x02, 0x00, // #
181 + 0x00, 0x00, //
182 + 0x00, 0x00, //
183 + 0x00, 0x00, //
184 + 0x00, 0x00, //
185 + 0x00, 0x00, //
186 + 0x00, 0x00, //
187 + 0x00, 0x00, //
188 + 0x00, 0x00, //
189 + 0x00, 0x00, //
190 +
191 + // @256 '(' (11 pixels wide)
192 + 0x00, 0x00, //
193 + 0x03, 0x00, // ##
194 + 0x03, 0x00, // ##
195 + 0x06, 0x00, // ##
196 + 0x0E, 0x00, // ###
197 + 0x0C, 0x00, // ##
198 + 0x0C, 0x00, // ##
199 + 0x0C, 0x00, // ##
200 + 0x0C, 0x00, // ##
201 + 0x0E, 0x00, // ###
202 + 0x06, 0x00, // ##
203 + 0x03, 0x00, // ##
204 + 0x03, 0x00, // ##
205 + 0x00, 0x00, //
206 + 0x00, 0x00, //
207 + 0x00, 0x00, //
208 +
209 + // @288 ')' (11 pixels wide)
210 + 0x00, 0x00, //
211 + 0x18, 0x00, // ##
212 + 0x18, 0x00, // ##
213 + 0x0C, 0x00, // ##
214 + 0x06, 0x00, // ##
215 + 0x06, 0x00, // ##
216 + 0x06, 0x00, // ##
217 + 0x06, 0x00, // ##
218 + 0x06, 0x00, // ##
219 + 0x06, 0x00, // ##
220 + 0x0C, 0x00, // ##
221 + 0x1C, 0x00, // ###
222 + 0x18, 0x00, // ##
223 + 0x00, 0x00, //
224 + 0x00, 0x00, //
225 + 0x00, 0x00, //
226 +
227 + // @320 '*' (11 pixels wide)
228 + 0x00, 0x00, //
229 + 0x06, 0x00, // ##
230 + 0x06, 0x00, // ##
231 + 0x3F, 0xC0, // ########
232 + 0x3F, 0xC0, // ########
233 + 0x0F, 0x00, // ####
234 + 0x1F, 0x80, // ######
235 + 0x19, 0x80, // ## ##
236 + 0x00, 0x00, //
237 + 0x00, 0x00, //
238 + 0x00, 0x00, //
239 + 0x00, 0x00, //
240 + 0x00, 0x00, //
241 + 0x00, 0x00, //
242 + 0x00, 0x00, //
243 + 0x00, 0x00, //
244 +
245 + // @352 '+' (11 pixels wide)
246 + 0x00, 0x00, //
247 + 0x00, 0x00, //
248 + 0x00, 0x00, //
249 + 0x04, 0x00, // #
250 + 0x04, 0x00, // #
251 + 0x04, 0x00, // #
252 + 0x3F, 0x80, // #######
253 + 0x04, 0x00, // #
254 + 0x04, 0x00, // #
255 + 0x04, 0x00, // #
256 + 0x00, 0x00, //
257 + 0x00, 0x00, //
258 + 0x00, 0x00, //
259 + 0x00, 0x00, //
260 + 0x00, 0x00, //
261 + 0x00, 0x00, //
262 +
263 + // @384 ',' (11 pixels wide)
264 + 0x00, 0x00, //
265 + 0x00, 0x00, //
266 + 0x00, 0x00, //
267 + 0x00, 0x00, //
268 + 0x00, 0x00, //
269 + 0x00, 0x00, //
270 + 0x00, 0x00, //
271 + 0x00, 0x00, //
272 + 0x00, 0x00, //
273 + 0x06, 0x00, // ##
274 + 0x04, 0x00, // #
275 + 0x0C, 0x00, // ##
276 + 0x08, 0x00, // #
277 + 0x08, 0x00, // #
278 + 0x00, 0x00, //
279 + 0x00, 0x00, //
280 +
281 + // @416 '-' (11 pixels wide)
282 + 0x00, 0x00, //
283 + 0x00, 0x00, //
284 + 0x00, 0x00, //
285 + 0x00, 0x00, //
286 + 0x00, 0x00, //
287 + 0x00, 0x00, //
288 + 0x3F, 0x80, // #######
289 + 0x00, 0x00, //
290 + 0x00, 0x00, //
291 + 0x00, 0x00, //
292 + 0x00, 0x00, //
293 + 0x00, 0x00, //
294 + 0x00, 0x00, //
295 + 0x00, 0x00, //
296 + 0x00, 0x00, //
297 + 0x00, 0x00, //
298 +
299 + // @448 '.' (11 pixels wide)
300 + 0x00, 0x00, //
301 + 0x00, 0x00, //
302 + 0x00, 0x00, //
303 + 0x00, 0x00, //
304 + 0x00, 0x00, //
305 + 0x00, 0x00, //
306 + 0x00, 0x00, //
307 + 0x00, 0x00, //
308 + 0x00, 0x00, //
309 + 0x0C, 0x00, // ##
310 + 0x0C, 0x00, // ##
311 + 0x00, 0x00, //
312 + 0x00, 0x00, //
313 + 0x00, 0x00, //
314 + 0x00, 0x00, //
315 + 0x00, 0x00, //
316 +
317 + // @480 '/' (11 pixels wide)
318 + 0x00, 0xC0, // ##
319 + 0x00, 0xC0, // ##
320 + 0x01, 0x80, // ##
321 + 0x01, 0x80, // ##
322 + 0x03, 0x00, // ##
323 + 0x03, 0x00, // ##
324 + 0x06, 0x00, // ##
325 + 0x0C, 0x00, // ##
326 + 0x0C, 0x00, // ##
327 + 0x18, 0x00, // ##
328 + 0x18, 0x00, // ##
329 + 0x30, 0x00, // ##
330 + 0x30, 0x00, // ##
331 + 0x00, 0x00, //
332 + 0x00, 0x00, //
333 + 0x00, 0x00, //
334 +
335 + // @512 '0' (11 pixels wide)
336 + 0x00, 0x00, //
337 + 0x0E, 0x00, // ###
338 + 0x1B, 0x00, // ## ##
339 + 0x31, 0x80, // ## ##
340 + 0x31, 0x80, // ## ##
341 + 0x31, 0x80, // ## ##
342 + 0x31, 0x80, // ## ##
343 + 0x31, 0x80, // ## ##
344 + 0x31, 0x80, // ## ##
345 + 0x1B, 0x00, // ## ##
346 + 0x0E, 0x00, // ###
347 + 0x00, 0x00, //
348 + 0x00, 0x00, //
349 + 0x00, 0x00, //
350 + 0x00, 0x00, //
351 + 0x00, 0x00, //
352 +
353 + // @544 '1' (11 pixels wide)
354 + 0x00, 0x00, //
355 + 0x06, 0x00, // ##
356 + 0x3E, 0x00, // #####
357 + 0x06, 0x00, // ##
358 + 0x06, 0x00, // ##
359 + 0x06, 0x00, // ##
360 + 0x06, 0x00, // ##
361 + 0x06, 0x00, // ##
362 + 0x06, 0x00, // ##
363 + 0x06, 0x00, // ##
364 + 0x3F, 0xC0, // ########
365 + 0x00, 0x00, //
366 + 0x00, 0x00, //
367 + 0x00, 0x00, //
368 + 0x00, 0x00, //
369 + 0x00, 0x00, //
370 +
371 + // @576 '2' (11 pixels wide)
372 + 0x00, 0x00, //
373 + 0x0F, 0x00, // ####
374 + 0x19, 0x80, // ## ##
375 + 0x31, 0x80, // ## ##
376 + 0x31, 0x80, // ## ##
377 + 0x03, 0x00, // ##
378 + 0x06, 0x00, // ##
379 + 0x0C, 0x00, // ##
380 + 0x18, 0x00, // ##
381 + 0x30, 0x00, // ##
382 + 0x3F, 0x80, // #######
383 + 0x00, 0x00, //
384 + 0x00, 0x00, //
385 + 0x00, 0x00, //
386 + 0x00, 0x00, //
387 + 0x00, 0x00, //
388 +
389 + // @608 '3' (11 pixels wide)
390 + 0x00, 0x00, //
391 + 0x3F, 0x00, // ######
392 + 0x61, 0x80, // ## ##
393 + 0x01, 0x80, // ##
394 + 0x03, 0x00, // ##
395 + 0x1F, 0x00, // #####
396 + 0x03, 0x80, // ###
397 + 0x01, 0x80, // ##
398 + 0x01, 0x80, // ##
399 + 0x61, 0x80, // ## ##
400 + 0x3F, 0x00, // ######
401 + 0x00, 0x00, //
402 + 0x00, 0x00, //
403 + 0x00, 0x00, //
404 + 0x00, 0x00, //
405 + 0x00, 0x00, //
406 +
407 + // @640 '4' (11 pixels wide)
408 + 0x00, 0x00, //
409 + 0x07, 0x00, // ###
410 + 0x07, 0x00, // ###
411 + 0x0F, 0x00, // ####
412 + 0x0B, 0x00, // # ##
413 + 0x1B, 0x00, // ## ##
414 + 0x13, 0x00, // # ##
415 + 0x33, 0x00, // ## ##
416 + 0x3F, 0x80, // #######
417 + 0x03, 0x00, // ##
418 + 0x0F, 0x80, // #####
419 + 0x00, 0x00, //
420 + 0x00, 0x00, //
421 + 0x00, 0x00, //
422 + 0x00, 0x00, //
423 + 0x00, 0x00, //
424 +
425 + // @672 '5' (11 pixels wide)
426 + 0x00, 0x00, //
427 + 0x1F, 0x80, // ######
428 + 0x18, 0x00, // ##
429 + 0x18, 0x00, // ##
430 + 0x18, 0x00, // ##
431 + 0x1F, 0x00, // #####
432 + 0x11, 0x80, // # ##
433 + 0x01, 0x80, // ##
434 + 0x01, 0x80, // ##
435 + 0x21, 0x80, // # ##
436 + 0x1F, 0x00, // #####
437 + 0x00, 0x00, //
438 + 0x00, 0x00, //
439 + 0x00, 0x00, //
440 + 0x00, 0x00, //
441 + 0x00, 0x00, //
442 +
443 + // @704 '6' (11 pixels wide)
444 + 0x00, 0x00, //
445 + 0x07, 0x80, // ####
446 + 0x1C, 0x00, // ###
447 + 0x18, 0x00, // ##
448 + 0x30, 0x00, // ##
449 + 0x37, 0x00, // ## ###
450 + 0x39, 0x80, // ### ##
451 + 0x31, 0x80, // ## ##
452 + 0x31, 0x80, // ## ##
453 + 0x19, 0x80, // ## ##
454 + 0x0F, 0x00, // ####
455 + 0x00, 0x00, //
456 + 0x00, 0x00, //
457 + 0x00, 0x00, //
458 + 0x00, 0x00, //
459 + 0x00, 0x00, //
460 +
461 + // @736 '7' (11 pixels wide)
462 + 0x00, 0x00, //
463 + 0x7F, 0x00, // #######
464 + 0x43, 0x00, // # ##
465 + 0x03, 0x00, // ##
466 + 0x06, 0x00, // ##
467 + 0x06, 0x00, // ##
468 + 0x06, 0x00, // ##
469 + 0x06, 0x00, // ##
470 + 0x0C, 0x00, // ##
471 + 0x0C, 0x00, // ##
472 + 0x0C, 0x00, // ##
473 + 0x00, 0x00, //
474 + 0x00, 0x00, //
475 + 0x00, 0x00, //
476 + 0x00, 0x00, //
477 + 0x00, 0x00, //
478 +
479 + // @768 '8' (11 pixels wide)
480 + 0x00, 0x00, //
481 + 0x1F, 0x00, // #####
482 + 0x31, 0x80, // ## ##
483 + 0x31, 0x80, // ## ##
484 + 0x31, 0x80, // ## ##
485 + 0x1F, 0x00, // #####
486 + 0x31, 0x80, // ## ##
487 + 0x31, 0x80, // ## ##
488 + 0x31, 0x80, // ## ##
489 + 0x31, 0x80, // ## ##
490 + 0x1F, 0x00, // #####
491 + 0x00, 0x00, //
492 + 0x00, 0x00, //
493 + 0x00, 0x00, //
494 + 0x00, 0x00, //
495 + 0x00, 0x00, //
496 +
497 + // @800 '9' (11 pixels wide)
498 + 0x00, 0x00, //
499 + 0x1E, 0x00, // ####
500 + 0x33, 0x00, // ## ##
501 + 0x31, 0x80, // ## ##
502 + 0x31, 0x80, // ## ##
503 + 0x33, 0x80, // ## ###
504 + 0x1D, 0x80, // ### ##
505 + 0x01, 0x80, // ##
506 + 0x03, 0x00, // ##
507 + 0x07, 0x00, // ###
508 + 0x3C, 0x00, // ####
509 + 0x00, 0x00, //
510 + 0x00, 0x00, //
511 + 0x00, 0x00, //
512 + 0x00, 0x00, //
513 + 0x00, 0x00, //
514 +
515 + // @832 ':' (11 pixels wide)
516 + 0x00, 0x00, //
517 + 0x00, 0x00, //
518 + 0x00, 0x00, //
519 + 0x00, 0x00, //
520 + 0x0C, 0x00, // ##
521 + 0x0C, 0x00, // ##
522 + 0x00, 0x00, //
523 + 0x00, 0x00, //
524 + 0x00, 0x00, //
525 + 0x0C, 0x00, // ##
526 + 0x0C, 0x00, // ##
527 + 0x00, 0x00, //
528 + 0x00, 0x00, //
529 + 0x00, 0x00, //
530 + 0x00, 0x00, //
531 + 0x00, 0x00, //
532 +
533 + // @864 ';' (11 pixels wide)
534 + 0x00, 0x00, //
535 + 0x00, 0x00, //
536 + 0x00, 0x00, //
537 + 0x00, 0x00, //
538 + 0x03, 0x00, // ##
539 + 0x03, 0x00, // ##
540 + 0x00, 0x00, //
541 + 0x00, 0x00, //
542 + 0x00, 0x00, //
543 + 0x06, 0x00, // ##
544 + 0x04, 0x00, // #
545 + 0x08, 0x00, // #
546 + 0x08, 0x00, // #
547 + 0x00, 0x00, //
548 + 0x00, 0x00, //
549 + 0x00, 0x00, //
550 +
551 + // @896 '<' (11 pixels wide)
552 + 0x00, 0x00, //
553 + 0x00, 0x00, //
554 + 0x00, 0xC0, // ##
555 + 0x03, 0x00, // ##
556 + 0x04, 0x00, // #
557 + 0x18, 0x00, // ##
558 + 0x60, 0x00, // ##
559 + 0x18, 0x00, // ##
560 + 0x04, 0x00, // #
561 + 0x03, 0x00, // ##
562 + 0x00, 0xC0, // ##
563 + 0x00, 0x00, //
564 + 0x00, 0x00, //
565 + 0x00, 0x00, //
566 + 0x00, 0x00, //
567 + 0x00, 0x00, //
568 +
569 + // @928 '=' (11 pixels wide)
570 + 0x00, 0x00, //
571 + 0x00, 0x00, //
572 + 0x00, 0x00, //
573 + 0x00, 0x00, //
574 + 0x00, 0x00, //
575 + 0x7F, 0xC0, // #########
576 + 0x00, 0x00, //
577 + 0x7F, 0xC0, // #########
578 + 0x00, 0x00, //
579 + 0x00, 0x00, //
580 + 0x00, 0x00, //
581 + 0x00, 0x00, //
582 + 0x00, 0x00, //
583 + 0x00, 0x00, //
584 + 0x00, 0x00, //
585 + 0x00, 0x00, //
586 +
587 + // @960 '>' (11 pixels wide)
588 + 0x00, 0x00, //
589 + 0x00, 0x00, //
590 + 0x60, 0x00, // ##
591 + 0x18, 0x00, // ##
592 + 0x04, 0x00, // #
593 + 0x03, 0x00, // ##
594 + 0x00, 0xC0, // ##
595 + 0x03, 0x00, // ##
596 + 0x04, 0x00, // #
597 + 0x18, 0x00, // ##
598 + 0x60, 0x00, // ##
599 + 0x00, 0x00, //
600 + 0x00, 0x00, //
601 + 0x00, 0x00, //
602 + 0x00, 0x00, //
603 + 0x00, 0x00, //
604 +
605 + // @992 '?' (11 pixels wide)
606 + 0x00, 0x00, //
607 + 0x00, 0x00, //
608 + 0x1F, 0x00, // #####
609 + 0x31, 0x80, // ## ##
610 + 0x31, 0x80, // ## ##
611 + 0x01, 0x80, // ##
612 + 0x07, 0x00, // ###
613 + 0x0C, 0x00, // ##
614 + 0x0C, 0x00, // ##
615 + 0x00, 0x00, //
616 + 0x0C, 0x00, // ##
617 + 0x00, 0x00, //
618 + 0x00, 0x00, //
619 + 0x00, 0x00, //
620 + 0x00, 0x00, //
621 + 0x00, 0x00, //
622 +
623 + // @1024 '@' (11 pixels wide)
624 + 0x00, 0x00, //
625 + 0x0E, 0x00, // ###
626 + 0x11, 0x00, // # #
627 + 0x21, 0x00, // # #
628 + 0x21, 0x00, // # #
629 + 0x27, 0x00, // # ###
630 + 0x29, 0x00, // # # #
631 + 0x29, 0x00, // # # #
632 + 0x27, 0x00, // # ###
633 + 0x20, 0x00, // #
634 + 0x11, 0x00, // # #
635 + 0x0E, 0x00, // ###
636 + 0x00, 0x00, //
637 + 0x00, 0x00, //
638 + 0x00, 0x00, //
639 + 0x00, 0x00, //
640 +
641 + // @1056 'A' (11 pixels wide)
642 + 0x00, 0x00, //
643 + 0x00, 0x00, //
644 + 0x3F, 0x00, // ######
645 + 0x0F, 0x00, // ####
646 + 0x09, 0x00, // # #
647 + 0x19, 0x80, // ## ##
648 + 0x19, 0x80, // ## ##
649 + 0x1F, 0x80, // ######
650 + 0x30, 0xC0, // ## ##
651 + 0x30, 0xC0, // ## ##
652 + 0x79, 0xE0, // #### ####
653 + 0x00, 0x00, //
654 + 0x00, 0x00, //
655 + 0x00, 0x00, //
656 + 0x00, 0x00, //
657 + 0x00, 0x00, //
658 +
659 + // @1088 'B' (11 pixels wide)
660 + 0x00, 0x00, //
661 + 0x00, 0x00, //
662 + 0x7F, 0x00, // #######
663 + 0x31, 0x80, // ## ##
664 + 0x31, 0x80, // ## ##
665 + 0x31, 0x80, // ## ##
666 + 0x3F, 0x00, // ######
667 + 0x31, 0x80, // ## ##
668 + 0x31, 0x80, // ## ##
669 + 0x31, 0x80, // ## ##
670 + 0x7F, 0x00, // #######
671 + 0x00, 0x00, //
672 + 0x00, 0x00, //
673 + 0x00, 0x00, //
674 + 0x00, 0x00, //
675 + 0x00, 0x00, //
676 +
677 + // @1120 'C' (11 pixels wide)
678 + 0x00, 0x00, //
679 + 0x00, 0x00, //
680 + 0x1F, 0x40, // ##### #
681 + 0x30, 0xC0, // ## ##
682 + 0x60, 0x40, // ## #
683 + 0x60, 0x00, // ##
684 + 0x60, 0x00, // ##
685 + 0x60, 0x00, // ##
686 + 0x60, 0x40, // ## #
687 + 0x30, 0x80, // ## #
688 + 0x1F, 0x00, // #####
689 + 0x00, 0x00, //
690 + 0x00, 0x00, //
691 + 0x00, 0x00, //
692 + 0x00, 0x00, //
693 + 0x00, 0x00, //
694 +
695 + // @1152 'D' (11 pixels wide)
696 + 0x00, 0x00, //
697 + 0x00, 0x00, //
698 + 0x7F, 0x00, // #######
699 + 0x31, 0x80, // ## ##
700 + 0x30, 0xC0, // ## ##
701 + 0x30, 0xC0, // ## ##
702 + 0x30, 0xC0, // ## ##
703 + 0x30, 0xC0, // ## ##
704 + 0x30, 0xC0, // ## ##
705 + 0x31, 0x80, // ## ##
706 + 0x7F, 0x00, // #######
707 + 0x00, 0x00, //
708 + 0x00, 0x00, //
709 + 0x00, 0x00, //
710 + 0x00, 0x00, //
711 + 0x00, 0x00, //
712 +
713 + // @1184 'E' (11 pixels wide)
714 + 0x00, 0x00, //
715 + 0x00, 0x00, //
716 + 0x7F, 0x80, // ########
717 + 0x30, 0x80, // ## #
718 + 0x30, 0x80, // ## #
719 + 0x32, 0x00, // ## #
720 + 0x3E, 0x00, // #####
721 + 0x32, 0x00, // ## #
722 + 0x30, 0x80, // ## #
723 + 0x30, 0x80, // ## #
724 + 0x7F, 0x80, // ########
725 + 0x00, 0x00, //
726 + 0x00, 0x00, //
727 + 0x00, 0x00, //
728 + 0x00, 0x00, //
729 + 0x00, 0x00, //
730 +
731 + // @1216 'F' (11 pixels wide)
732 + 0x00, 0x00, //
733 + 0x00, 0x00, //
734 + 0x7F, 0xC0, // #########
735 + 0x30, 0x40, // ## #
736 + 0x30, 0x40, // ## #
737 + 0x32, 0x00, // ## #
738 + 0x3E, 0x00, // #####
739 + 0x32, 0x00, // ## #
740 + 0x30, 0x00, // ##
741 + 0x30, 0x00, // ##
742 + 0x7C, 0x00, // #####
743 + 0x00, 0x00, //
744 + 0x00, 0x00, //
745 + 0x00, 0x00, //
746 + 0x00, 0x00, //
747 + 0x00, 0x00, //
748 +
749 + // @1248 'G' (11 pixels wide)
750 + 0x00, 0x00, //
751 + 0x00, 0x00, //
752 + 0x1E, 0x80, // #### #
753 + 0x31, 0x80, // ## ##
754 + 0x60, 0x80, // ## #
755 + 0x60, 0x00, // ##
756 + 0x60, 0x00, // ##
757 + 0x67, 0xC0, // ## #####
758 + 0x61, 0x80, // ## ##
759 + 0x31, 0x80, // ## ##
760 + 0x1F, 0x00, // #####
761 + 0x00, 0x00, //
762 + 0x00, 0x00, //
763 + 0x00, 0x00, //
764 + 0x00, 0x00, //
765 + 0x00, 0x00, //
766 +
767 + // @1280 'H' (11 pixels wide)
768 + 0x00, 0x00, //
769 + 0x00, 0x00, //
770 + 0x7B, 0xC0, // #### ####
771 + 0x31, 0x80, // ## ##
772 + 0x31, 0x80, // ## ##
773 + 0x31, 0x80, // ## ##
774 + 0x3F, 0x80, // #######
775 + 0x31, 0x80, // ## ##
776 + 0x31, 0x80, // ## ##
777 + 0x31, 0x80, // ## ##
778 + 0x7B, 0xC0, // #### ####
779 + 0x00, 0x00, //
780 + 0x00, 0x00, //
781 + 0x00, 0x00, //
782 + 0x00, 0x00, //
783 + 0x00, 0x00, //
784 +
785 + // @1312 'I' (11 pixels wide)
786 + 0x00, 0x00, //
787 + 0x00, 0x00, //
788 + 0x3F, 0xC0, // ########
789 + 0x06, 0x00, // ##
790 + 0x06, 0x00, // ##
791 + 0x06, 0x00, // ##
792 + 0x06, 0x00, // ##
793 + 0x06, 0x00, // ##
794 + 0x06, 0x00, // ##
795 + 0x06, 0x00, // ##
796 + 0x3F, 0xC0, // ########
797 + 0x00, 0x00, //
798 + 0x00, 0x00, //
799 + 0x00, 0x00, //
800 + 0x00, 0x00, //
801 + 0x00, 0x00, //
802 +
803 + // @1344 'J' (11 pixels wide)
804 + 0x00, 0x00, //
805 + 0x00, 0x00, //
806 + 0x1F, 0xC0, // #######
807 + 0x03, 0x00, // ##
808 + 0x03, 0x00, // ##
809 + 0x03, 0x00, // ##
810 + 0x03, 0x00, // ##
811 + 0x63, 0x00, // ## ##
812 + 0x63, 0x00, // ## ##
813 + 0x63, 0x00, // ## ##
814 + 0x3E, 0x00, // #####
815 + 0x00, 0x00, //
816 + 0x00, 0x00, //
817 + 0x00, 0x00, //
818 + 0x00, 0x00, //
819 + 0x00, 0x00, //
820 +
821 + // @1376 'K' (11 pixels wide)
822 + 0x00, 0x00, //
823 + 0x00, 0x00, //
824 + 0x7B, 0xC0, // #### ####
825 + 0x31, 0x80, // ## ##
826 + 0x33, 0x00, // ## ##
827 + 0x36, 0x00, // ## ##
828 + 0x3C, 0x00, // ####
829 + 0x3E, 0x00, // #####
830 + 0x33, 0x00, // ## ##
831 + 0x31, 0x80, // ## ##
832 + 0x79, 0xC0, // #### ###
833 + 0x00, 0x00, //
834 + 0x00, 0x00, //
835 + 0x00, 0x00, //
836 + 0x00, 0x00, //
837 + 0x00, 0x00, //
838 +
839 + // @1408 'L' (11 pixels wide)
840 + 0x00, 0x00, //
841 + 0x00, 0x00, //
842 + 0x7E, 0x00, // ######
843 + 0x18, 0x00, // ##
844 + 0x18, 0x00, // ##
845 + 0x18, 0x00, // ##
846 + 0x18, 0x00, // ##
847 + 0x18, 0x40, // ## #
848 + 0x18, 0x40, // ## #
849 + 0x18, 0x40, // ## #
850 + 0x7F, 0xC0, // #########
851 + 0x00, 0x00, //
852 + 0x00, 0x00, //
853 + 0x00, 0x00, //
854 + 0x00, 0x00, //
855 + 0x00, 0x00, //
856 +
857 + // @1440 'M' (11 pixels wide)
858 + 0x00, 0x00, //
859 + 0x00, 0x00, //
860 + 0xE0, 0xE0, // ### ###
861 + 0x60, 0xC0, // ## ##
862 + 0x71, 0xC0, // ### ###
863 + 0x7B, 0xC0, // #### ####
864 + 0x6A, 0xC0, // ## # # ##
865 + 0x6E, 0xC0, // ## ### ##
866 + 0x64, 0xC0, // ## # ##
867 + 0x60, 0xC0, // ## ##
868 + 0xFB, 0xE0, // ##### #####
869 + 0x00, 0x00, //
870 + 0x00, 0x00, //
871 + 0x00, 0x00, //
872 + 0x00, 0x00, //
873 + 0x00, 0x00, //
874 +
875 + // @1472 'N' (11 pixels wide)
876 + 0x00, 0x00, //
877 + 0x00, 0x00, //
878 + 0x73, 0xC0, // ### ####
879 + 0x31, 0x80, // ## ##
880 + 0x39, 0x80, // ### ##
881 + 0x3D, 0x80, // #### ##
882 + 0x35, 0x80, // ## # ##
883 + 0x37, 0x80, // ## ####
884 + 0x33, 0x80, // ## ###
885 + 0x31, 0x80, // ## ##
886 + 0x79, 0x80, // #### ##
887 + 0x00, 0x00, //
888 + 0x00, 0x00, //
889 + 0x00, 0x00, //
890 + 0x00, 0x00, //
891 + 0x00, 0x00, //
892 +
893 + // @1504 'O' (11 pixels wide)
894 + 0x00, 0x00, //
895 + 0x00, 0x00, //
896 + 0x1F, 0x00, // #####
897 + 0x31, 0x80, // ## ##
898 + 0x60, 0xC0, // ## ##
899 + 0x60, 0xC0, // ## ##
900 + 0x60, 0xC0, // ## ##
901 + 0x60, 0xC0, // ## ##
902 + 0x60, 0xC0, // ## ##
903 + 0x31, 0x80, // ## ##
904 + 0x1F, 0x00, // #####
905 + 0x00, 0x00, //
906 + 0x00, 0x00, //
907 + 0x00, 0x00, //
908 + 0x00, 0x00, //
909 + 0x00, 0x00, //
910 +
911 + // @1536 'P' (11 pixels wide)
912 + 0x00, 0x00, //
913 + 0x00, 0x00, //
914 + 0x7F, 0x00, // #######
915 + 0x31, 0x80, // ## ##
916 + 0x31, 0x80, // ## ##
917 + 0x31, 0x80, // ## ##
918 + 0x31, 0x80, // ## ##
919 + 0x3F, 0x00, // ######
920 + 0x30, 0x00, // ##
921 + 0x30, 0x00, // ##
922 + 0x7E, 0x00, // ######
923 + 0x00, 0x00, //
924 + 0x00, 0x00, //
925 + 0x00, 0x00, //
926 + 0x00, 0x00, //
927 + 0x00, 0x00, //
928 +
929 + // @1568 'Q' (11 pixels wide)
930 + 0x00, 0x00, //
931 + 0x00, 0x00, //
932 + 0x1F, 0x00, // #####
933 + 0x31, 0x80, // ## ##
934 + 0x60, 0xC0, // ## ##
935 + 0x60, 0xC0, // ## ##
936 + 0x60, 0xC0, // ## ##
937 + 0x60, 0xC0, // ## ##
938 + 0x60, 0xC0, // ## ##
939 + 0x31, 0x80, // ## ##
940 + 0x1F, 0x00, // #####
941 + 0x0C, 0xC0, // ## ##
942 + 0x1F, 0x80, // ######
943 + 0x00, 0x00, //
944 + 0x00, 0x00, //
945 + 0x00, 0x00, //
946 +
947 + // @1600 'R' (11 pixels wide)
948 + 0x00, 0x00, //
949 + 0x00, 0x00, //
950 + 0x7F, 0x00, // #######
951 + 0x31, 0x80, // ## ##
952 + 0x31, 0x80, // ## ##
953 + 0x31, 0x80, // ## ##
954 + 0x3E, 0x00, // #####
955 + 0x33, 0x00, // ## ##
956 + 0x31, 0x80, // ## ##
957 + 0x31, 0x80, // ## ##
958 + 0x7C, 0xE0, // ##### ###
959 + 0x00, 0x00, //
960 + 0x00, 0x00, //
961 + 0x00, 0x00, //
962 + 0x00, 0x00, //
963 + 0x00, 0x00, //
964 +
965 + // @1632 'S' (11 pixels wide)
966 + 0x00, 0x00, //
967 + 0x00, 0x00, //
968 + 0x1F, 0x80, // ######
969 + 0x31, 0x80, // ## ##
970 + 0x31, 0x80, // ## ##
971 + 0x38, 0x00, // ###
972 + 0x1F, 0x00, // #####
973 + 0x03, 0x80, // ###
974 + 0x31, 0x80, // ## ##
975 + 0x31, 0x80, // ## ##
976 + 0x3F, 0x00, // ######
977 + 0x00, 0x00, //
978 + 0x00, 0x00, //
979 + 0x00, 0x00, //
980 + 0x00, 0x00, //
981 + 0x00, 0x00, //
982 +
983 + // @1664 'T' (11 pixels wide)
984 + 0x00, 0x00, //
985 + 0x00, 0x00, //
986 + 0x7F, 0x80, // ########
987 + 0x4C, 0x80, // # ## #
988 + 0x4C, 0x80, // # ## #
989 + 0x4C, 0x80, // # ## #
990 + 0x0C, 0x00, // ##
991 + 0x0C, 0x00, // ##
992 + 0x0C, 0x00, // ##
993 + 0x0C, 0x00, // ##
994 + 0x3F, 0x00, // ######
995 + 0x00, 0x00, //
996 + 0x00, 0x00, //
997 + 0x00, 0x00, //
998 + 0x00, 0x00, //
999 + 0x00, 0x00, //
1000 +
1001 + // @1696 'U' (11 pixels wide)
1002 + 0x00, 0x00, //
1003 + 0x00, 0x00, //
1004 + 0x7B, 0xC0, // #### ####
1005 + 0x31, 0x80, // ## ##
1006 + 0x31, 0x80, // ## ##
1007 + 0x31, 0x80, // ## ##
1008 + 0x31, 0x80, // ## ##
1009 + 0x31, 0x80, // ## ##
1010 + 0x31, 0x80, // ## ##
1011 + 0x31, 0x80, // ## ##
1012 + 0x1F, 0x00, // #####
1013 + 0x00, 0x00, //
1014 + 0x00, 0x00, //
1015 + 0x00, 0x00, //
1016 + 0x00, 0x00, //
1017 + 0x00, 0x00, //
1018 +
1019 + // @1728 'V' (11 pixels wide)
1020 + 0x00, 0x00, //
1021 + 0x00, 0x00, //
1022 + 0x7B, 0xC0, // #### ####
1023 + 0x31, 0x80, // ## ##
1024 + 0x31, 0x80, // ## ##
1025 + 0x1B, 0x00, // ## ##
1026 + 0x1B, 0x00, // ## ##
1027 + 0x1B, 0x00, // ## ##
1028 + 0x0A, 0x00, // # #
1029 + 0x0E, 0x00, // ###
1030 + 0x0E, 0x00, // ###
1031 + 0x00, 0x00, //
1032 + 0x00, 0x00, //
1033 + 0x00, 0x00, //
1034 + 0x00, 0x00, //
1035 + 0x00, 0x00, //
1036 +
1037 + // @1760 'W' (11 pixels wide)
1038 + 0x00, 0x00, //
1039 + 0x00, 0x00, //
1040 + 0xFB, 0xE0, // ##### #####
1041 + 0x60, 0xC0, // ## ##
1042 + 0x64, 0xC0, // ## # ##
1043 + 0x6E, 0xC0, // ## ### ##
1044 + 0x6E, 0xC0, // ## ### ##
1045 + 0x2A, 0x80, // # # # #
1046 + 0x3B, 0x80, // ### ###
1047 + 0x3B, 0x80, // ### ###
1048 + 0x31, 0x80, // ## ##
1049 + 0x00, 0x00, //
1050 + 0x00, 0x00, //
1051 + 0x00, 0x00, //
1052 + 0x00, 0x00, //
1053 + 0x00, 0x00, //
1054 +
1055 + // @1792 'X' (11 pixels wide)
1056 + 0x00, 0x00, //
1057 + 0x00, 0x00, //
1058 + 0x7B, 0xC0, // #### ####
1059 + 0x31, 0x80, // ## ##
1060 + 0x1B, 0x00, // ## ##
1061 + 0x0E, 0x00, // ###
1062 + 0x0E, 0x00, // ###
1063 + 0x0E, 0x00, // ###
1064 + 0x1B, 0x00, // ## ##
1065 + 0x31, 0x80, // ## ##
1066 + 0x7B, 0xC0, // #### ####
1067 + 0x00, 0x00, //
1068 + 0x00, 0x00, //
1069 + 0x00, 0x00, //
1070 + 0x00, 0x00, //
1071 + 0x00, 0x00, //
1072 +
1073 + // @1824 'Y' (11 pixels wide)
1074 + 0x00, 0x00, //
1075 + 0x00, 0x00, //
1076 + 0x79, 0xE0, // #### ####
1077 + 0x30, 0xC0, // ## ##
1078 + 0x19, 0x80, // ## ##
1079 + 0x0F, 0x00, // ####
1080 + 0x06, 0x00, // ##
1081 + 0x06, 0x00, // ##
1082 + 0x06, 0x00, // ##
1083 + 0x06, 0x00, // ##
1084 + 0x1F, 0x80, // ######
1085 + 0x00, 0x00, //
1086 + 0x00, 0x00, //
1087 + 0x00, 0x00, //
1088 + 0x00, 0x00, //
1089 + 0x00, 0x00, //
1090 +
1091 + // @1856 'Z' (11 pixels wide)
1092 + 0x00, 0x00, //
1093 + 0x00, 0x00, //
1094 + 0x3F, 0x80, // #######
1095 + 0x21, 0x80, // # ##
1096 + 0x23, 0x00, // # ##
1097 + 0x06, 0x00, // ##
1098 + 0x04, 0x00, // #
1099 + 0x0C, 0x00, // ##
1100 + 0x18, 0x80, // ## #
1101 + 0x30, 0x80, // ## #
1102 + 0x3F, 0x80, // #######
1103 + 0x00, 0x00, //
1104 + 0x00, 0x00, //
1105 + 0x00, 0x00, //
1106 + 0x00, 0x00, //
1107 + 0x00, 0x00, //
1108 +
1109 + // @1888 '[' (11 pixels wide)
1110 + 0x00, 0x00, //
1111 + 0x07, 0x80, // ####
1112 + 0x06, 0x00, // ##
1113 + 0x06, 0x00, // ##
1114 + 0x06, 0x00, // ##
1115 + 0x06, 0x00, // ##
1116 + 0x06, 0x00, // ##
1117 + 0x06, 0x00, // ##
1118 + 0x06, 0x00, // ##
1119 + 0x06, 0x00, // ##
1120 + 0x06, 0x00, // ##
1121 + 0x06, 0x00, // ##
1122 + 0x07, 0x80, // ####
1123 + 0x00, 0x00, //
1124 + 0x00, 0x00, //
1125 + 0x00, 0x00, //
1126 +
1127 + // @1920 '\' (11 pixels wide)
1128 + 0x30, 0x00, // ##
1129 + 0x30, 0x00, // ##
1130 + 0x18, 0x00, // ##
1131 + 0x18, 0x00, // ##
1132 + 0x0C, 0x00, // ##
1133 + 0x0C, 0x00, // ##
1134 + 0x06, 0x00, // ##
1135 + 0x03, 0x00, // ##
1136 + 0x03, 0x00, // ##
1137 + 0x01, 0x80, // ##
1138 + 0x01, 0x80, // ##
1139 + 0x00, 0xC0, // ##
1140 + 0x00, 0xC0, // ##
1141 + 0x00, 0x00, //
1142 + 0x00, 0x00, //
1143 + 0x00, 0x00, //
1144 +
1145 + // @1952 ']' (11 pixels wide)
1146 + 0x00, 0x00, //
1147 + 0x1E, 0x00, // ####
1148 + 0x06, 0x00, // ##
1149 + 0x06, 0x00, // ##
1150 + 0x06, 0x00, // ##
1151 + 0x06, 0x00, // ##
1152 + 0x06, 0x00, // ##
1153 + 0x06, 0x00, // ##
1154 + 0x06, 0x00, // ##
1155 + 0x06, 0x00, // ##
1156 + 0x06, 0x00, // ##
1157 + 0x06, 0x00, // ##
1158 + 0x1E, 0x00, // ####
1159 + 0x00, 0x00, //
1160 + 0x00, 0x00, //
1161 + 0x00, 0x00, //
1162 +
1163 + // @1984 '^' (11 pixels wide)
1164 + 0x04, 0x00, // #
1165 + 0x0A, 0x00, // # #
1166 + 0x0A, 0x00, // # #
1167 + 0x11, 0x00, // # #
1168 + 0x20, 0x80, // # #
1169 + 0x20, 0x80, // # #
1170 + 0x00, 0x00, //
1171 + 0x00, 0x00, //
1172 + 0x00, 0x00, //
1173 + 0x00, 0x00, //
1174 + 0x00, 0x00, //
1175 + 0x00, 0x00, //
1176 + 0x00, 0x00, //
1177 + 0x00, 0x00, //
1178 + 0x00, 0x00, //
1179 + 0x00, 0x00, //
1180 +
1181 + // @2016 '_' (11 pixels wide)
1182 + 0x00, 0x00, //
1183 + 0x00, 0x00, //
1184 + 0x00, 0x00, //
1185 + 0x00, 0x00, //
1186 + 0x00, 0x00, //
1187 + 0x00, 0x00, //
1188 + 0x00, 0x00, //
1189 + 0x00, 0x00, //
1190 + 0x00, 0x00, //
1191 + 0x00, 0x00, //
1192 + 0x00, 0x00, //
1193 + 0x00, 0x00, //
1194 + 0x00, 0x00, //
1195 + 0x00, 0x00, //
1196 + 0x00, 0x00, //
1197 + 0xFF, 0xE0, // ###########
1198 +
1199 + // @2048 '`' (11 pixels wide)
1200 + 0x08, 0x00, // #
1201 + 0x04, 0x00, // #
1202 + 0x02, 0x00, // #
1203 + 0x00, 0x00, //
1204 + 0x00, 0x00, //
1205 + 0x00, 0x00, //
1206 + 0x00, 0x00, //
1207 + 0x00, 0x00, //
1208 + 0x00, 0x00, //
1209 + 0x00, 0x00, //
1210 + 0x00, 0x00, //
1211 + 0x00, 0x00, //
1212 + 0x00, 0x00, //
1213 + 0x00, 0x00, //
1214 + 0x00, 0x00, //
1215 + 0x00, 0x00, //
1216 +
1217 + // @2080 'a' (11 pixels wide)
1218 + 0x00, 0x00, //
1219 + 0x00, 0x00, //
1220 + 0x00, 0x00, //
1221 + 0x00, 0x00, //
1222 + 0x1F, 0x00, // #####
1223 + 0x01, 0x80, // ##
1224 + 0x01, 0x80, // ##
1225 + 0x1F, 0x80, // ######
1226 + 0x31, 0x80, // ## ##
1227 + 0x33, 0x80, // ## ###
1228 + 0x1D, 0xC0, // ### ###
1229 + 0x00, 0x00, //
1230 + 0x00, 0x00, //
1231 + 0x00, 0x00, //
1232 + 0x00, 0x00, //
1233 + 0x00, 0x00, //
1234 +
1235 + // @2112 'b' (11 pixels wide)
1236 + 0x00, 0x00, //
1237 + 0x70, 0x00, // ###
1238 + 0x30, 0x00, // ##
1239 + 0x30, 0x00, // ##
1240 + 0x37, 0x00, // ## ###
1241 + 0x39, 0x80, // ### ##
1242 + 0x30, 0xC0, // ## ##
1243 + 0x30, 0xC0, // ## ##
1244 + 0x30, 0xC0, // ## ##
1245 + 0x39, 0x80, // ### ##
1246 + 0x77, 0x00, // ### ###
1247 + 0x00, 0x00, //
1248 + 0x00, 0x00, //
1249 + 0x00, 0x00, //
1250 + 0x00, 0x00, //
1251 + 0x00, 0x00, //
1252 +
1253 + // @2144 'c' (11 pixels wide)
1254 + 0x00, 0x00, //
1255 + 0x00, 0x00, //
1256 + 0x00, 0x00, //
1257 + 0x00, 0x00, //
1258 + 0x1E, 0x80, // #### #
1259 + 0x31, 0x80, // ## ##
1260 + 0x60, 0x80, // ## #
1261 + 0x60, 0x00, // ##
1262 + 0x60, 0x80, // ## #
1263 + 0x31, 0x80, // ## ##
1264 + 0x1F, 0x00, // #####
1265 + 0x00, 0x00, //
1266 + 0x00, 0x00, //
1267 + 0x00, 0x00, //
1268 + 0x00, 0x00, //
1269 + 0x00, 0x00, //
1270 +
1271 + // @2176 'd' (11 pixels wide)
1272 + 0x00, 0x00, //
1273 + 0x03, 0x80, // ###
1274 + 0x01, 0x80, // ##
1275 + 0x01, 0x80, // ##
1276 + 0x1D, 0x80, // ### ##
1277 + 0x33, 0x80, // ## ###
1278 + 0x61, 0x80, // ## ##
1279 + 0x61, 0x80, // ## ##
1280 + 0x61, 0x80, // ## ##
1281 + 0x33, 0x80, // ## ###
1282 + 0x1D, 0xC0, // ### ###
1283 + 0x00, 0x00, //
1284 + 0x00, 0x00, //
1285 + 0x00, 0x00, //
1286 + 0x00, 0x00, //
1287 + 0x00, 0x00, //
1288 +
1289 + // @2208 'e' (11 pixels wide)
1290 + 0x00, 0x00, //
1291 + 0x00, 0x00, //
1292 + 0x00, 0x00, //
1293 + 0x00, 0x00, //
1294 + 0x1F, 0x00, // #####
1295 + 0x31, 0x80, // ## ##
1296 + 0x60, 0xC0, // ## ##
1297 + 0x7F, 0xC0, // #########
1298 + 0x60, 0x00, // ##
1299 + 0x30, 0xC0, // ## ##
1300 + 0x1F, 0x80, // ######
1301 + 0x00, 0x00, //
1302 + 0x00, 0x00, //
1303 + 0x00, 0x00, //
1304 + 0x00, 0x00, //
1305 + 0x00, 0x00, //
1306 +
1307 + // @2240 'f' (11 pixels wide)
1308 + 0x00, 0x00, //
1309 + 0x07, 0xE0, // ######
1310 + 0x0C, 0x00, // ##
1311 + 0x0C, 0x00, // ##
1312 + 0x3F, 0x80, // #######
1313 + 0x0C, 0x00, // ##
1314 + 0x0C, 0x00, // ##
1315 + 0x0C, 0x00, // ##
1316 + 0x0C, 0x00, // ##
1317 + 0x0C, 0x00, // ##
1318 + 0x3F, 0x80, // #######
1319 + 0x00, 0x00, //
1320 + 0x00, 0x00, //
1321 + 0x00, 0x00, //
1322 + 0x00, 0x00, //
1323 + 0x00, 0x00, //
1324 +
1325 + // @2272 'g' (11 pixels wide)
1326 + 0x00, 0x00, //
1327 + 0x00, 0x00, //
1328 + 0x00, 0x00, //
1329 + 0x00, 0x00, //
1330 + 0x1D, 0xC0, // ### ###
1331 + 0x33, 0x80, // ## ###
1332 + 0x61, 0x80, // ## ##
1333 + 0x61, 0x80, // ## ##
1334 + 0x61, 0x80, // ## ##
1335 + 0x33, 0x80, // ## ###
1336 + 0x1D, 0x80, // ### ##
1337 + 0x01, 0x80, // ##
1338 + 0x01, 0x80, // ##
1339 + 0x1F, 0x00, // #####
1340 + 0x00, 0x00, //
1341 + 0x00, 0x00, //
1342 +
1343 + // @2304 'h' (11 pixels wide)
1344 + 0x00, 0x00, //
1345 + 0x70, 0x00, // ###
1346 + 0x30, 0x00, // ##
1347 + 0x30, 0x00, // ##
1348 + 0x37, 0x00, // ## ###
1349 + 0x39, 0x80, // ### ##
1350 + 0x31, 0x80, // ## ##
1351 + 0x31, 0x80, // ## ##
1352 + 0x31, 0x80, // ## ##
1353 + 0x31, 0x80, // ## ##
1354 + 0x7B, 0xC0, // #### ####
1355 + 0x00, 0x00, //
1356 + 0x00, 0x00, //
1357 + 0x00, 0x00, //
1358 + 0x00, 0x00, //
1359 + 0x00, 0x00, //
1360 +
1361 + // @2336 'i' (11 pixels wide)
1362 + 0x00, 0x00, //
1363 + 0x06, 0x00, // ##
1364 + 0x06, 0x00, // ##
1365 + 0x00, 0x00, //
1366 + 0x1E, 0x00, // ####
1367 + 0x06, 0x00, // ##
1368 + 0x06, 0x00, // ##
1369 + 0x06, 0x00, // ##
1370 + 0x06, 0x00, // ##
1371 + 0x06, 0x00, // ##
1372 + 0x3F, 0xC0, // ########
1373 + 0x00, 0x00, //
1374 + 0x00, 0x00, //
1375 + 0x00, 0x00, //
1376 + 0x00, 0x00, //
1377 + 0x00, 0x00, //
1378 +
1379 + // @2368 'j' (11 pixels wide)
1380 + 0x00, 0x00, //
1381 + 0x06, 0x00, // ##
1382 + 0x06, 0x00, // ##
1383 + 0x00, 0x00, //
1384 + 0x3F, 0x00, // ######
1385 + 0x03, 0x00, // ##
1386 + 0x03, 0x00, // ##
1387 + 0x03, 0x00, // ##
1388 + 0x03, 0x00, // ##
1389 + 0x03, 0x00, // ##
1390 + 0x03, 0x00, // ##
1391 + 0x03, 0x00, // ##
1392 + 0x03, 0x00, // ##
1393 + 0x3E, 0x00, // #####
1394 + 0x00, 0x00, //
1395 + 0x00, 0x00, //
1396 +
1397 + // @2400 'k' (11 pixels wide)
1398 + 0x00, 0x00, //
1399 + 0x70, 0x00, // ###
1400 + 0x30, 0x00, // ##
1401 + 0x30, 0x00, // ##
1402 + 0x37, 0x80, // ## ####
1403 + 0x36, 0x00, // ## ##
1404 + 0x3C, 0x00, // ####
1405 + 0x3C, 0x00, // ####
1406 + 0x36, 0x00, // ## ##
1407 + 0x33, 0x00, // ## ##
1408 + 0x77, 0xC0, // ### #####
1409 + 0x00, 0x00, //
1410 + 0x00, 0x00, //
1411 + 0x00, 0x00, //
1412 + 0x00, 0x00, //
1413 + 0x00, 0x00, //
1414 +
1415 + // @2432 'l' (11 pixels wide)
1416 + 0x00, 0x00, //
1417 + 0x1E, 0x00, // ####
1418 + 0x06, 0x00, // ##
1419 + 0x06, 0x00, // ##
1420 + 0x06, 0x00, // ##
1421 + 0x06, 0x00, // ##
1422 + 0x06, 0x00, // ##
1423 + 0x06, 0x00, // ##
1424 + 0x06, 0x00, // ##
1425 + 0x06, 0x00, // ##
1426 + 0x3F, 0xC0, // ########
1427 + 0x00, 0x00, //
1428 + 0x00, 0x00, //
1429 + 0x00, 0x00, //
1430 + 0x00, 0x00, //
1431 + 0x00, 0x00, //
1432 +
1433 + // @2464 'm' (11 pixels wide)
1434 + 0x00, 0x00, //
1435 + 0x00, 0x00, //
1436 + 0x00, 0x00, //
1437 + 0x00, 0x00, //
1438 + 0x7F, 0x80, // ########
1439 + 0x36, 0xC0, // ## ## ##
1440 + 0x36, 0xC0, // ## ## ##
1441 + 0x36, 0xC0, // ## ## ##
1442 + 0x36, 0xC0, // ## ## ##
1443 + 0x36, 0xC0, // ## ## ##
1444 + 0x76, 0xE0, // ### ## ###
1445 + 0x00, 0x00, //
1446 + 0x00, 0x00, //
1447 + 0x00, 0x00, //
1448 + 0x00, 0x00, //
1449 + 0x00, 0x00, //
1450 +
1451 + // @2496 'n' (11 pixels wide)
1452 + 0x00, 0x00, //
1453 + 0x00, 0x00, //
1454 + 0x00, 0x00, //
1455 + 0x00, 0x00, //
1456 + 0x77, 0x00, // ### ###
1457 + 0x39, 0x80, // ### ##
1458 + 0x31, 0x80, // ## ##
1459 + 0x31, 0x80, // ## ##
1460 + 0x31, 0x80, // ## ##
1461 + 0x31, 0x80, // ## ##
1462 + 0x7B, 0xC0, // #### ####
1463 + 0x00, 0x00, //
1464 + 0x00, 0x00, //
1465 + 0x00, 0x00, //
1466 + 0x00, 0x00, //
1467 + 0x00, 0x00, //
1468 +
1469 + // @2528 'o' (11 pixels wide)
1470 + 0x00, 0x00, //
1471 + 0x00, 0x00, //
1472 + 0x00, 0x00, //
1473 + 0x00, 0x00, //
1474 + 0x1F, 0x00, // #####
1475 + 0x31, 0x80, // ## ##
1476 + 0x60, 0xC0, // ## ##
1477 + 0x60, 0xC0, // ## ##
1478 + 0x60, 0xC0, // ## ##
1479 + 0x31, 0x80, // ## ##
1480 + 0x1F, 0x00, // #####
1481 + 0x00, 0x00, //
1482 + 0x00, 0x00, //
1483 + 0x00, 0x00, //
1484 + 0x00, 0x00, //
1485 + 0x00, 0x00, //
1486 +
1487 + // @2560 'p' (11 pixels wide)
1488 + 0x00, 0x00, //
1489 + 0x00, 0x00, //
1490 + 0x00, 0x00, //
1491 + 0x00, 0x00, //
1492 + 0x77, 0x00, // ### ###
1493 + 0x39, 0x80, // ### ##
1494 + 0x30, 0xC0, // ## ##
1495 + 0x30, 0xC0, // ## ##
1496 + 0x30, 0xC0, // ## ##
1497 + 0x39, 0x80, // ### ##
1498 + 0x37, 0x00, // ## ###
1499 + 0x30, 0x00, // ##
1500 + 0x30, 0x00, // ##
1501 + 0x7C, 0x00, // #####
1502 + 0x00, 0x00, //
1503 + 0x00, 0x00, //
1504 +
1505 + // @2592 'q' (11 pixels wide)
1506 + 0x00, 0x00, //
1507 + 0x00, 0x00, //
1508 + 0x00, 0x00, //
1509 + 0x00, 0x00, //
1510 + 0x1D, 0xC0, // ### ###
1511 + 0x33, 0x80, // ## ###
1512 + 0x61, 0x80, // ## ##
1513 + 0x61, 0x80, // ## ##
1514 + 0x61, 0x80, // ## ##
1515 + 0x33, 0x80, // ## ###
1516 + 0x1D, 0x80, // ### ##
1517 + 0x01, 0x80, // ##
1518 + 0x01, 0x80, // ##
1519 + 0x07, 0xC0, // #####
1520 + 0x00, 0x00, //
1521 + 0x00, 0x00, //
1522 +
1523 + // @2624 'r' (11 pixels wide)
1524 + 0x00, 0x00, //
1525 + 0x00, 0x00, //
1526 + 0x00, 0x00, //
1527 + 0x00, 0x00, //
1528 + 0x7B, 0x80, // #### ###
1529 + 0x1C, 0xC0, // ### ##
1530 + 0x18, 0x00, // ##
1531 + 0x18, 0x00, // ##
1532 + 0x18, 0x00, // ##
1533 + 0x18, 0x00, // ##
1534 + 0x7F, 0x00, // #######
1535 + 0x00, 0x00, //
1536 + 0x00, 0x00, //
1537 + 0x00, 0x00, //
1538 + 0x00, 0x00, //
1539 + 0x00, 0x00, //
1540 +
1541 + // @2656 's' (11 pixels wide)
1542 + 0x00, 0x00, //
1543 + 0x00, 0x00, //
1544 + 0x00, 0x00, //
1545 + 0x00, 0x00, //
1546 + 0x1F, 0x80, // ######
1547 + 0x31, 0x80, // ## ##
1548 + 0x3C, 0x00, // ####
1549 + 0x1F, 0x00, // #####
1550 + 0x03, 0x80, // ###
1551 + 0x31, 0x80, // ## ##
1552 + 0x3F, 0x00, // ######
1553 + 0x00, 0x00, //
1554 + 0x00, 0x00, //
1555 + 0x00, 0x00, //
1556 + 0x00, 0x00, //
1557 + 0x00, 0x00, //
1558 +
1559 + // @2688 't' (11 pixels wide)
1560 + 0x00, 0x00, //
1561 + 0x18, 0x00, // ##
1562 + 0x18, 0x00, // ##
1563 + 0x18, 0x00, // ##
1564 + 0x7F, 0x00, // #######
1565 + 0x18, 0x00, // ##
1566 + 0x18, 0x00, // ##
1567 + 0x18, 0x00, // ##
1568 + 0x18, 0x00, // ##
1569 + 0x18, 0x80, // ## #
1570 + 0x0F, 0x00, // ####
1571 + 0x00, 0x00, //
1572 + 0x00, 0x00, //
1573 + 0x00, 0x00, //
1574 + 0x00, 0x00, //
1575 + 0x00, 0x00, //
1576 +
1577 + // @2720 'u' (11 pixels wide)
1578 + 0x00, 0x00, //
1579 + 0x00, 0x00, //
1580 + 0x00, 0x00, //
1581 + 0x00, 0x00, //
1582 + 0x73, 0x80, // ### ###
1583 + 0x31, 0x80, // ## ##
1584 + 0x31, 0x80, // ## ##
1585 + 0x31, 0x80, // ## ##
1586 + 0x31, 0x80, // ## ##
1587 + 0x33, 0x80, // ## ###
1588 + 0x1D, 0xC0, // ### ###
1589 + 0x00, 0x00, //
1590 + 0x00, 0x00, //
1591 + 0x00, 0x00, //
1592 + 0x00, 0x00, //
1593 + 0x00, 0x00, //
1594 +
1595 + // @2752 'v' (11 pixels wide)
1596 + 0x00, 0x00, //
1597 + 0x00, 0x00, //
1598 + 0x00, 0x00, //
1599 + 0x00, 0x00, //
1600 + 0x7B, 0xC0, // #### ####
1601 + 0x31, 0x80, // ## ##
1602 + 0x31, 0x80, // ## ##
1603 + 0x1B, 0x00, // ## ##
1604 + 0x1B, 0x00, // ## ##
1605 + 0x0E, 0x00, // ###
1606 + 0x0E, 0x00, // ###
1607 + 0x00, 0x00, //
1608 + 0x00, 0x00, //
1609 + 0x00, 0x00, //
1610 + 0x00, 0x00, //
1611 + 0x00, 0x00, //
1612 +
1613 + // @2784 'w' (11 pixels wide)
1614 + 0x00, 0x00, //
1615 + 0x00, 0x00, //
1616 + 0x00, 0x00, //
1617 + 0x00, 0x00, //
1618 + 0xF1, 0xE0, // #### ####
1619 + 0x60, 0xC0, // ## ##
1620 + 0x64, 0xC0, // ## # ##
1621 + 0x6E, 0xC0, // ## ### ##
1622 + 0x3B, 0x80, // ### ###
1623 + 0x3B, 0x80, // ### ###
1624 + 0x31, 0x80, // ## ##
1625 + 0x00, 0x00, //
1626 + 0x00, 0x00, //
1627 + 0x00, 0x00, //
1628 + 0x00, 0x00, //
1629 + 0x00, 0x00, //
1630 +
1631 + // @2816 'x' (11 pixels wide)
1632 + 0x00, 0x00, //
1633 + 0x00, 0x00, //
1634 + 0x00, 0x00, //
1635 + 0x00, 0x00, //
1636 + 0x7B, 0xC0, // #### ####
1637 + 0x1B, 0x00, // ## ##
1638 + 0x0E, 0x00, // ###
1639 + 0x0E, 0x00, // ###
1640 + 0x0E, 0x00, // ###
1641 + 0x1B, 0x00, // ## ##
1642 + 0x7B, 0xC0, // #### ####
1643 + 0x00, 0x00, //
1644 + 0x00, 0x00, //
1645 + 0x00, 0x00, //
1646 + 0x00, 0x00, //
1647 + 0x00, 0x00, //
1648 +
1649 + // @2848 'y' (11 pixels wide)
1650 + 0x00, 0x00, //
1651 + 0x00, 0x00, //
1652 + 0x00, 0x00, //
1653 + 0x00, 0x00, //
1654 + 0x79, 0xE0, // #### ####
1655 + 0x30, 0xC0, // ## ##
1656 + 0x19, 0x80, // ## ##
1657 + 0x19, 0x80, // ## ##
1658 + 0x0B, 0x00, // # ##
1659 + 0x0F, 0x00, // ####
1660 + 0x06, 0x00, // ##
1661 + 0x06, 0x00, // ##
1662 + 0x0C, 0x00, // ##
1663 + 0x3E, 0x00, // #####
1664 + 0x00, 0x00, //
1665 + 0x00, 0x00, //
1666 +
1667 + // @2880 'z' (11 pixels wide)
1668 + 0x00, 0x00, //
1669 + 0x00, 0x00, //
1670 + 0x00, 0x00, //
1671 + 0x00, 0x00, //
1672 + 0x3F, 0x80, // #######
1673 + 0x21, 0x80, // # ##
1674 + 0x03, 0x00, // ##
1675 + 0x0E, 0x00, // ###
1676 + 0x18, 0x00, // ##
1677 + 0x30, 0x80, // ## #
1678 + 0x3F, 0x80, // #######
1679 + 0x00, 0x00, //
1680 + 0x00, 0x00, //
1681 + 0x00, 0x00, //
1682 + 0x00, 0x00, //
1683 + 0x00, 0x00, //
1684 +
1685 + // @2912 '{' (11 pixels wide)
1686 + 0x00, 0x00, //
1687 + 0x06, 0x00, // ##
1688 + 0x0C, 0x00, // ##
1689 + 0x0C, 0x00, // ##
1690 + 0x0C, 0x00, // ##
1691 + 0x0C, 0x00, // ##
1692 + 0x0C, 0x00, // ##
1693 + 0x18, 0x00, // ##
1694 + 0x0C, 0x00, // ##
1695 + 0x0C, 0x00, // ##
1696 + 0x0C, 0x00, // ##
1697 + 0x0C, 0x00, // ##
1698 + 0x06, 0x00, // ##
1699 + 0x00, 0x00, //
1700 + 0x00, 0x00, //
1701 + 0x00, 0x00, //
1702 +
1703 + // @2944 '|' (11 pixels wide)
1704 + 0x00, 0x00, //
1705 + 0x06, 0x00, // ##
1706 + 0x06, 0x00, // ##
1707 + 0x06, 0x00, // ##
1708 + 0x06, 0x00, // ##
1709 + 0x06, 0x00, // ##
1710 + 0x06, 0x00, // ##
1711 + 0x06, 0x00, // ##
1712 + 0x06, 0x00, // ##
1713 + 0x06, 0x00, // ##
1714 + 0x06, 0x00, // ##
1715 + 0x06, 0x00, // ##
1716 + 0x06, 0x00, // ##
1717 + 0x00, 0x00, //
1718 + 0x00, 0x00, //
1719 + 0x00, 0x00, //
1720 +
1721 + // @2976 '}' (11 pixels wide)
1722 + 0x00, 0x00, //
1723 + 0x0C, 0x00, // ##
1724 + 0x06, 0x00, // ##
1725 + 0x06, 0x00, // ##
1726 + 0x06, 0x00, // ##
1727 + 0x06, 0x00, // ##
1728 + 0x06, 0x00, // ##
1729 + 0x03, 0x00, // ##
1730 + 0x06, 0x00, // ##
1731 + 0x06, 0x00, // ##
1732 + 0x06, 0x00, // ##
1733 + 0x06, 0x00, // ##
1734 + 0x0C, 0x00, // ##
1735 + 0x00, 0x00, //
1736 + 0x00, 0x00, //
1737 + 0x00, 0x00, //
1738 +
1739 + // @3008 '~' (11 pixels wide)
1740 + 0x00, 0x00, //
1741 + 0x00, 0x00, //
1742 + 0x00, 0x00, //
1743 + 0x00, 0x00, //
1744 + 0x00, 0x00, //
1745 + 0x18, 0x00, // ##
1746 + 0x24, 0x80, // # # #
1747 + 0x03, 0x00, // ##
1748 + 0x00, 0x00, //
1749 + 0x00, 0x00, //
1750 + 0x00, 0x00, //
1751 + 0x00, 0x00, //
1752 + 0x00, 0x00, //
1753 + 0x00, 0x00, //
1754 + 0x00, 0x00, //
1755 + 0x00, 0x00, //
1756 +};
1757 +
1758 +sFONT Font16 = {
1759 + Font16_Table,
1760 + 11, /* Width */
1761 + 16, /* Height */
1762 +};
1763 +
1764 +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
1 +/**
2 + ******************************************************************************
3 + * @file font20.c
4 + * @author MCD Application Team
5 + * @version V1.0.0
6 + * @date 18-February-2014
7 + * @brief This file provides text font20 for STM32xx-EVAL's LCD driver.
8 + ******************************************************************************
9 + * @attention
10 + *
11 + * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
12 + *
13 + * Redistribution and use in source and binary forms, with or without modification,
14 + * are permitted provided that the following conditions are met:
15 + * 1. Redistributions of source code must retain the above copyright notice,
16 + * this list of conditions and the following disclaimer.
17 + * 2. Redistributions in binary form must reproduce the above copyright notice,
18 + * this list of conditions and the following disclaimer in the documentation
19 + * and/or other materials provided with the distribution.
20 + * 3. Neither the name of STMicroelectronics nor the names of its contributors
21 + * may be used to endorse or promote products derived from this software
22 + * without specific prior written permission.
23 + *
24 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25 + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27 + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
28 + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30 + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31 + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
32 + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33 + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 + *
35 + ******************************************************************************
36 + */
37 +
38 +/* Includes ------------------------------------------------------------------*/
39 +#include "fonts.h"
40 +
41 +// Character bitmaps for Courier New 15pt
42 +const uint8_t Font20_Table[] =
43 +{
44 + // @0 ' ' (14 pixels wide)
45 + 0x00, 0x00, //
46 + 0x00, 0x00, //
47 + 0x00, 0x00, //
48 + 0x00, 0x00, //
49 + 0x00, 0x00, //
50 + 0x00, 0x00, //
51 + 0x00, 0x00, //
52 + 0x00, 0x00, //
53 + 0x00, 0x00, //
54 + 0x00, 0x00, //
55 + 0x00, 0x00, //
56 + 0x00, 0x00, //
57 + 0x00, 0x00, //
58 + 0x00, 0x00, //
59 + 0x00, 0x00, //
60 + 0x00, 0x00, //
61 + 0x00, 0x00, //
62 + 0x00, 0x00, //
63 + 0x00, 0x00, //
64 + 0x00, 0x00, //
65 +
66 + // @40 '!' (14 pixels wide)
67 + 0x00, 0x00, //
68 + 0x07, 0x00, // ###
69 + 0x07, 0x00, // ###
70 + 0x07, 0x00, // ###
71 + 0x07, 0x00, // ###
72 + 0x07, 0x00, // ###
73 + 0x07, 0x00, // ###
74 + 0x07, 0x00, // ###
75 + 0x02, 0x00, // #
76 + 0x02, 0x00, // #
77 + 0x00, 0x00, //
78 + 0x00, 0x00, //
79 + 0x07, 0x00, // ###
80 + 0x07, 0x00, // ###
81 + 0x00, 0x00, //
82 + 0x00, 0x00, //
83 + 0x00, 0x00, //
84 + 0x00, 0x00, //
85 + 0x00, 0x00, //
86 + 0x00, 0x00, //
87 +
88 + // @80 '"' (14 pixels wide)
89 + 0x00, 0x00, //
90 + 0x00, 0x00, //
91 + 0x1C, 0xE0, // ### ###
92 + 0x1C, 0xE0, // ### ###
93 + 0x1C, 0xE0, // ### ###
94 + 0x08, 0x40, // # #
95 + 0x08, 0x40, // # #
96 + 0x08, 0x40, // # #
97 + 0x00, 0x00, //
98 + 0x00, 0x00, //
99 + 0x00, 0x00, //
100 + 0x00, 0x00, //
101 + 0x00, 0x00, //
102 + 0x00, 0x00, //
103 + 0x00, 0x00, //
104 + 0x00, 0x00, //
105 + 0x00, 0x00, //
106 + 0x00, 0x00, //
107 + 0x00, 0x00, //
108 + 0x00, 0x00, //
109 +
110 + // @120 '#' (14 pixels wide)
111 + 0x0C, 0xC0, // ## ##
112 + 0x0C, 0xC0, // ## ##
113 + 0x0C, 0xC0, // ## ##
114 + 0x0C, 0xC0, // ## ##
115 + 0x0C, 0xC0, // ## ##
116 + 0x3F, 0xF0, // ##########
117 + 0x3F, 0xF0, // ##########
118 + 0x0C, 0xC0, // ## ##
119 + 0x0C, 0xC0, // ## ##
120 + 0x3F, 0xF0, // ##########
121 + 0x3F, 0xF0, // ##########
122 + 0x0C, 0xC0, // ## ##
123 + 0x0C, 0xC0, // ## ##
124 + 0x0C, 0xC0, // ## ##
125 + 0x0C, 0xC0, // ## ##
126 + 0x0C, 0xC0, // ## ##
127 + 0x00, 0x00, //
128 + 0x00, 0x00, //
129 + 0x00, 0x00, //
130 + 0x00, 0x00, //
131 +
132 + // @160 '$' (14 pixels wide)
133 + 0x03, 0x00, // ##
134 + 0x03, 0x00, // ##
135 + 0x07, 0xE0, // ######
136 + 0x0F, 0xE0, // #######
137 + 0x18, 0x60, // ## ##
138 + 0x18, 0x00, // ##
139 + 0x1F, 0x00, // #####
140 + 0x0F, 0xC0, // ######
141 + 0x00, 0xE0, // ###
142 + 0x18, 0x60, // ## ##
143 + 0x18, 0x60, // ## ##
144 + 0x1F, 0xC0, // #######
145 + 0x1F, 0x80, // ######
146 + 0x03, 0x00, // ##
147 + 0x03, 0x00, // ##
148 + 0x03, 0x00, // ##
149 + 0x00, 0x00, //
150 + 0x00, 0x00, //
151 + 0x00, 0x00, //
152 + 0x00, 0x00, //
153 +
154 + // @200 '%' (14 pixels wide)
155 + 0x00, 0x00, //
156 + 0x1C, 0x00, // ###
157 + 0x22, 0x00, // # #
158 + 0x22, 0x00, // # #
159 + 0x22, 0x00, // # #
160 + 0x1C, 0x60, // ### ##
161 + 0x01, 0xE0, // ####
162 + 0x0F, 0x80, // #####
163 + 0x3C, 0x00, // ####
164 + 0x31, 0xC0, // ## ###
165 + 0x02, 0x20, // # #
166 + 0x02, 0x20, // # #
167 + 0x02, 0x20, // # #
168 + 0x01, 0xC0, // ###
169 + 0x00, 0x00, //
170 + 0x00, 0x00, //
171 + 0x00, 0x00, //
172 + 0x00, 0x00, //
173 + 0x00, 0x00, //
174 + 0x00, 0x00, //
175 +
176 + // @240 '&' (14 pixels wide)
177 + 0x00, 0x00, //
178 + 0x00, 0x00, //
179 + 0x00, 0x00, //
180 + 0x03, 0xE0, // #####
181 + 0x0F, 0xE0, // #######
182 + 0x0C, 0x00, // ##
183 + 0x0C, 0x00, // ##
184 + 0x06, 0x00, // ##
185 + 0x0F, 0x30, // #### ##
186 + 0x1F, 0xF0, // #########
187 + 0x19, 0xE0, // ## ####
188 + 0x18, 0xC0, // ## ##
189 + 0x1F, 0xF0, // #########
190 + 0x07, 0xB0, // #### ##
191 + 0x00, 0x00, //
192 + 0x00, 0x00, //
193 + 0x00, 0x00, //
194 + 0x00, 0x00, //
195 + 0x00, 0x00, //
196 + 0x00, 0x00, //
197 +
198 + // @280 ''' (14 pixels wide)
199 + 0x00, 0x00, //
200 + 0x00, 0x00, //
201 + 0x03, 0x80, // ###
202 + 0x03, 0x80, // ###
203 + 0x03, 0x80, // ###
204 + 0x01, 0x00, // #
205 + 0x01, 0x00, // #
206 + 0x01, 0x00, // #
207 + 0x00, 0x00, //
208 + 0x00, 0x00, //
209 + 0x00, 0x00, //
210 + 0x00, 0x00, //
211 + 0x00, 0x00, //
212 + 0x00, 0x00, //
213 + 0x00, 0x00, //
214 + 0x00, 0x00, //
215 + 0x00, 0x00, //
216 + 0x00, 0x00, //
217 + 0x00, 0x00, //
218 + 0x00, 0x00, //
219 +
220 + // @320 '(' (14 pixels wide)
221 + 0x00, 0x00, //
222 + 0x00, 0xC0, // ##
223 + 0x00, 0xC0, // ##
224 + 0x01, 0x80, // ##
225 + 0x01, 0x80, // ##
226 + 0x01, 0x80, // ##
227 + 0x03, 0x00, // ##
228 + 0x03, 0x00, // ##
229 + 0x03, 0x00, // ##
230 + 0x03, 0x00, // ##
231 + 0x03, 0x00, // ##
232 + 0x03, 0x00, // ##
233 + 0x01, 0x80, // ##
234 + 0x01, 0x80, // ##
235 + 0x01, 0x80, // ##
236 + 0x00, 0xC0, // ##
237 + 0x00, 0xC0, // ##
238 + 0x00, 0x00, //
239 + 0x00, 0x00, //
240 + 0x00, 0x00, //
241 +
242 + // @360 ')' (14 pixels wide)
243 + 0x00, 0x00, //
244 + 0x0C, 0x00, // ##
245 + 0x0C, 0x00, // ##
246 + 0x06, 0x00, // ##
247 + 0x06, 0x00, // ##
248 + 0x06, 0x00, // ##
249 + 0x03, 0x00, // ##
250 + 0x03, 0x00, // ##
251 + 0x03, 0x00, // ##
252 + 0x03, 0x00, // ##
253 + 0x03, 0x00, // ##
254 + 0x03, 0x00, // ##
255 + 0x06, 0x00, // ##
256 + 0x06, 0x00, // ##
257 + 0x06, 0x00, // ##
258 + 0x0C, 0x00, // ##
259 + 0x0C, 0x00, // ##
260 + 0x00, 0x00, //
261 + 0x00, 0x00, //
262 + 0x00, 0x00, //
263 +
264 + // @400 '*' (14 pixels wide)
265 + 0x00, 0x00, //
266 + 0x03, 0x00, // ##
267 + 0x03, 0x00, // ##
268 + 0x03, 0x00, // ##
269 + 0x1B, 0x60, // ## ## ##
270 + 0x1F, 0xE0, // ########
271 + 0x07, 0x80, // ####
272 + 0x07, 0x80, // ####
273 + 0x0F, 0xC0, // ######
274 + 0x0C, 0xC0, // ## ##
275 + 0x00, 0x00, //
276 + 0x00, 0x00, //
277 + 0x00, 0x00, //
278 + 0x00, 0x00, //
279 + 0x00, 0x00, //
280 + 0x00, 0x00, //
281 + 0x00, 0x00, //
282 + 0x00, 0x00, //
283 + 0x00, 0x00, //
284 + 0x00, 0x00, //
285 +
286 + // @440 '+' (14 pixels wide)
287 + 0x00, 0x00, //
288 + 0x00, 0x00, //
289 + 0x00, 0x00, //
290 + 0x03, 0x00, // ##
291 + 0x03, 0x00, // ##
292 + 0x03, 0x00, // ##
293 + 0x03, 0x00, // ##
294 + 0x3F, 0xF0, // ##########
295 + 0x3F, 0xF0, // ##########
296 + 0x03, 0x00, // ##
297 + 0x03, 0x00, // ##
298 + 0x03, 0x00, // ##
299 + 0x03, 0x00, // ##
300 + 0x00, 0x00, //
301 + 0x00, 0x00, //
302 + 0x00, 0x00, //
303 + 0x00, 0x00, //
304 + 0x00, 0x00, //
305 + 0x00, 0x00, //
306 + 0x00, 0x00, //
307 +
308 + // @480 ',' (14 pixels wide)
309 + 0x00, 0x00, //
310 + 0x00, 0x00, //
311 + 0x00, 0x00, //
312 + 0x00, 0x00, //
313 + 0x00, 0x00, //
314 + 0x00, 0x00, //
315 + 0x00, 0x00, //
316 + 0x00, 0x00, //
317 + 0x00, 0x00, //
318 + 0x00, 0x00, //
319 + 0x00, 0x00, //
320 + 0x03, 0x80, // ###
321 + 0x03, 0x00, // ##
322 + 0x03, 0x00, // ##
323 + 0x06, 0x00, // ##
324 + 0x06, 0x00, // ##
325 + 0x04, 0x00, // #
326 + 0x00, 0x00, //
327 + 0x00, 0x00, //
328 + 0x00, 0x00, //
329 +
330 + // @520 '-' (14 pixels wide)
331 + 0x00, 0x00, //
332 + 0x00, 0x00, //
333 + 0x00, 0x00, //
334 + 0x00, 0x00, //
335 + 0x00, 0x00, //
336 + 0x00, 0x00, //
337 + 0x00, 0x00, //
338 + 0x3F, 0xE0, // #########
339 + 0x3F, 0xE0, // #########
340 + 0x00, 0x00, //
341 + 0x00, 0x00, //
342 + 0x00, 0x00, //
343 + 0x00, 0x00, //
344 + 0x00, 0x00, //
345 + 0x00, 0x00, //
346 + 0x00, 0x00, //
347 + 0x00, 0x00, //
348 + 0x00, 0x00, //
349 + 0x00, 0x00, //
350 + 0x00, 0x00, //
351 +
352 + // @560 '.' (14 pixels wide)
353 + 0x00, 0x00, //
354 + 0x00, 0x00, //
355 + 0x00, 0x00, //
356 + 0x00, 0x00, //
357 + 0x00, 0x00, //
358 + 0x00, 0x00, //
359 + 0x00, 0x00, //
360 + 0x00, 0x00, //
361 + 0x00, 0x00, //
362 + 0x00, 0x00, //
363 + 0x00, 0x00, //
364 + 0x03, 0x80, // ###
365 + 0x03, 0x80, // ###
366 + 0x03, 0x80, // ###
367 + 0x00, 0x00, //
368 + 0x00, 0x00, //
369 + 0x00, 0x00, //
370 + 0x00, 0x00, //
371 + 0x00, 0x00, //
372 + 0x00, 0x00, //
373 +
374 + // @600 '/' (14 pixels wide)
375 + 0x00, 0x60, // ##
376 + 0x00, 0x60, // ##
377 + 0x00, 0xC0, // ##
378 + 0x00, 0xC0, // ##
379 + 0x00, 0xC0, // ##
380 + 0x01, 0x80, // ##
381 + 0x01, 0x80, // ##
382 + 0x03, 0x00, // ##
383 + 0x03, 0x00, // ##
384 + 0x06, 0x00, // ##
385 + 0x06, 0x00, // ##
386 + 0x0C, 0x00, // ##
387 + 0x0C, 0x00, // ##
388 + 0x0C, 0x00, // ##
389 + 0x18, 0x00, // ##
390 + 0x18, 0x00, // ##
391 + 0x00, 0x00, //
392 + 0x00, 0x00, //
393 + 0x00, 0x00, //
394 + 0x00, 0x00, //
395 +
396 + // @640 '0' (14 pixels wide)
397 + 0x00, 0x00, //
398 + 0x0F, 0x80, // #####
399 + 0x1F, 0xC0, // #######
400 + 0x18, 0xC0, // ## ##
401 + 0x30, 0x60, // ## ##
402 + 0x30, 0x60, // ## ##
403 + 0x30, 0x60, // ## ##
404 + 0x30, 0x60, // ## ##
405 + 0x30, 0x60, // ## ##
406 + 0x30, 0x60, // ## ##
407 + 0x30, 0x60, // ## ##
408 + 0x18, 0xC0, // ## ##
409 + 0x1F, 0xC0, // #######
410 + 0x0F, 0x80, // #####
411 + 0x00, 0x00, //
412 + 0x00, 0x00, //
413 + 0x00, 0x00, //
414 + 0x00, 0x00, //
415 + 0x00, 0x00, //
416 + 0x00, 0x00, //
417 +
418 + // @680 '1' (14 pixels wide)
419 + 0x00, 0x00, //
420 + 0x03, 0x00, // ##
421 + 0x1F, 0x00, // #####
422 + 0x1F, 0x00, // #####
423 + 0x03, 0x00, // ##
424 + 0x03, 0x00, // ##
425 + 0x03, 0x00, // ##
426 + 0x03, 0x00, // ##
427 + 0x03, 0x00, // ##
428 + 0x03, 0x00, // ##
429 + 0x03, 0x00, // ##
430 + 0x03, 0x00, // ##
431 + 0x1F, 0xE0, // ########
432 + 0x1F, 0xE0, // ########
433 + 0x00, 0x00, //
434 + 0x00, 0x00, //
435 + 0x00, 0x00, //
436 + 0x00, 0x00, //
437 + 0x00, 0x00, //
438 + 0x00, 0x00, //
439 +
440 + // @720 '2' (14 pixels wide)
441 + 0x00, 0x00, //
442 + 0x0F, 0x80, // #####
443 + 0x1F, 0xC0, // #######
444 + 0x38, 0xE0, // ### ###
445 + 0x30, 0x60, // ## ##
446 + 0x00, 0x60, // ##
447 + 0x00, 0xC0, // ##
448 + 0x01, 0x80, // ##
449 + 0x03, 0x00, // ##
450 + 0x06, 0x00, // ##
451 + 0x0C, 0x00, // ##
452 + 0x18, 0x00, // ##
453 + 0x3F, 0xE0, // #########
454 + 0x3F, 0xE0, // #########
455 + 0x00, 0x00, //
456 + 0x00, 0x00, //
457 + 0x00, 0x00, //
458 + 0x00, 0x00, //
459 + 0x00, 0x00, //
460 + 0x00, 0x00, //
461 +
462 + // @760 '3' (14 pixels wide)
463 + 0x00, 0x00, //
464 + 0x0F, 0x80, // #####
465 + 0x3F, 0xC0, // ########
466 + 0x30, 0xE0, // ## ###
467 + 0x00, 0x60, // ##
468 + 0x00, 0xE0, // ###
469 + 0x07, 0xC0, // #####
470 + 0x07, 0xC0, // #####
471 + 0x00, 0xE0, // ###
472 + 0x00, 0x60, // ##
473 + 0x00, 0x60, // ##
474 + 0x60, 0xE0, // ## ###
475 + 0x7F, 0xC0, // #########
476 + 0x3F, 0x80, // #######
477 + 0x00, 0x00, //
478 + 0x00, 0x00, //
479 + 0x00, 0x00, //
480 + 0x00, 0x00, //
481 + 0x00, 0x00, //
482 + 0x00, 0x00, //
483 +
484 + // @800 '4' (14 pixels wide)
485 + 0x00, 0x00, //
486 + 0x01, 0xC0, // ###
487 + 0x03, 0xC0, // ####
488 + 0x03, 0xC0, // ####
489 + 0x06, 0xC0, // ## ##
490 + 0x0C, 0xC0, // ## ##
491 + 0x0C, 0xC0, // ## ##
492 + 0x18, 0xC0, // ## ##
493 + 0x30, 0xC0, // ## ##
494 + 0x3F, 0xE0, // #########
495 + 0x3F, 0xE0, // #########
496 + 0x00, 0xC0, // ##
497 + 0x03, 0xE0, // #####
498 + 0x03, 0xE0, // #####
499 + 0x00, 0x00, //
500 + 0x00, 0x00, //
501 + 0x00, 0x00, //
502 + 0x00, 0x00, //
503 + 0x00, 0x00, //
504 + 0x00, 0x00, //
505 +
506 + // @840 '5' (14 pixels wide)
507 + 0x00, 0x00, //
508 + 0x1F, 0xC0, // #######
509 + 0x1F, 0xC0, // #######
510 + 0x18, 0x00, // ##
511 + 0x18, 0x00, // ##
512 + 0x1F, 0x80, // ######
513 + 0x1F, 0xC0, // #######
514 + 0x18, 0xE0, // ## ###
515 + 0x00, 0x60, // ##
516 + 0x00, 0x60, // ##
517 + 0x00, 0x60, // ##
518 + 0x30, 0xE0, // ## ###
519 + 0x3F, 0xC0, // ########
520 + 0x1F, 0x80, // ######
521 + 0x00, 0x00, //
522 + 0x00, 0x00, //
523 + 0x00, 0x00, //
524 + 0x00, 0x00, //
525 + 0x00, 0x00, //
526 + 0x00, 0x00, //
527 +
528 + // @880 '6' (14 pixels wide)
529 + 0x00, 0x00, //
530 + 0x03, 0xE0, // #####
531 + 0x0F, 0xE0, // #######
532 + 0x1E, 0x00, // ####
533 + 0x18, 0x00, // ##
534 + 0x38, 0x00, // ###
535 + 0x37, 0x80, // ## ####
536 + 0x3F, 0xC0, // ########
537 + 0x38, 0xE0, // ### ###
538 + 0x30, 0x60, // ## ##
539 + 0x30, 0x60, // ## ##
540 + 0x18, 0xE0, // ## ###
541 + 0x1F, 0xC0, // #######
542 + 0x07, 0x80, // ####
543 + 0x00, 0x00, //
544 + 0x00, 0x00, //
545 + 0x00, 0x00, //
546 + 0x00, 0x00, //
547 + 0x00, 0x00, //
548 + 0x00, 0x00, //
549 +
550 + // @920 '7' (14 pixels wide)
551 + 0x00, 0x00, //
552 + 0x3F, 0xE0, // #########
553 + 0x3F, 0xE0, // #########
554 + 0x30, 0x60, // ## ##
555 + 0x00, 0x60, // ##
556 + 0x00, 0xC0, // ##
557 + 0x00, 0xC0, // ##
558 + 0x00, 0xC0, // ##
559 + 0x01, 0x80, // ##
560 + 0x01, 0x80, // ##
561 + 0x01, 0x80, // ##
562 + 0x03, 0x00, // ##
563 + 0x03, 0x00, // ##
564 + 0x03, 0x00, // ##
565 + 0x00, 0x00, //
566 + 0x00, 0x00, //
567 + 0x00, 0x00, //
568 + 0x00, 0x00, //
569 + 0x00, 0x00, //
570 + 0x00, 0x00, //
571 +
572 + // @960 '8' (14 pixels wide)
573 + 0x00, 0x00, //
574 + 0x0F, 0x80, // #####
575 + 0x1F, 0xC0, // #######
576 + 0x38, 0xE0, // ### ###
577 + 0x30, 0x60, // ## ##
578 + 0x38, 0xE0, // ### ###
579 + 0x1F, 0xC0, // #######
580 + 0x1F, 0xC0, // #######
581 + 0x38, 0xE0, // ### ###
582 + 0x30, 0x60, // ## ##
583 + 0x30, 0x60, // ## ##
584 + 0x38, 0xE0, // ### ###
585 + 0x1F, 0xC0, // #######
586 + 0x0F, 0x80, // #####
587 + 0x00, 0x00, //
588 + 0x00, 0x00, //
589 + 0x00, 0x00, //
590 + 0x00, 0x00, //
591 + 0x00, 0x00, //
592 + 0x00, 0x00, //
593 +
594 + // @1000 '9' (14 pixels wide)
595 + 0x00, 0x00, //
596 + 0x0F, 0x00, // ####
597 + 0x1F, 0xC0, // #######
598 + 0x38, 0xC0, // ### ##
599 + 0x30, 0x60, // ## ##
600 + 0x30, 0x60, // ## ##
601 + 0x38, 0xE0, // ### ###
602 + 0x1F, 0xE0, // ########
603 + 0x0F, 0x60, // #### ##
604 + 0x00, 0xE0, // ###
605 + 0x00, 0xC0, // ##
606 + 0x03, 0xC0, // ####
607 + 0x3F, 0x80, // #######
608 + 0x3E, 0x00, // #####
609 + 0x00, 0x00, //
610 + 0x00, 0x00, //
611 + 0x00, 0x00, //
612 + 0x00, 0x00, //
613 + 0x00, 0x00, //
614 + 0x00, 0x00, //
615 +
616 + // @1040 ':' (14 pixels wide)
617 + 0x00, 0x00, //
618 + 0x00, 0x00, //
619 + 0x00, 0x00, //
620 + 0x00, 0x00, //
621 + 0x00, 0x00, //
622 + 0x03, 0x80, // ###
623 + 0x03, 0x80, // ###
624 + 0x03, 0x80, // ###
625 + 0x00, 0x00, //
626 + 0x00, 0x00, //
627 + 0x00, 0x00, //
628 + 0x03, 0x80, // ###
629 + 0x03, 0x80, // ###
630 + 0x03, 0x80, // ###
631 + 0x00, 0x00, //
632 + 0x00, 0x00, //
633 + 0x00, 0x00, //
634 + 0x00, 0x00, //
635 + 0x00, 0x00, //
636 + 0x00, 0x00, //
637 +
638 + // @1080 ';' (14 pixels wide)
639 + 0x00, 0x00, //
640 + 0x00, 0x00, //
641 + 0x00, 0x00, //
642 + 0x00, 0x00, //
643 + 0x00, 0x00, //
644 + 0x01, 0xC0, // ###
645 + 0x01, 0xC0, // ###
646 + 0x01, 0xC0, // ###
647 + 0x00, 0x00, //
648 + 0x00, 0x00, //
649 + 0x00, 0x00, //
650 + 0x03, 0x80, // ###
651 + 0x03, 0x00, // ##
652 + 0x06, 0x00, // ##
653 + 0x06, 0x00, // ##
654 + 0x04, 0x00, // #
655 + 0x00, 0x00, //
656 + 0x00, 0x00, //
657 + 0x00, 0x00, //
658 + 0x00, 0x00, //
659 +
660 + // @1120 '<' (14 pixels wide)
661 + 0x00, 0x00, //
662 + 0x00, 0x00, //
663 + 0x00, 0x00, //
664 + 0x00, 0x30, // ##
665 + 0x00, 0xF0, // ####
666 + 0x03, 0xC0, // ####
667 + 0x07, 0x00, // ###
668 + 0x1C, 0x00, // ###
669 + 0x78, 0x00, // ####
670 + 0x1C, 0x00, // ###
671 + 0x07, 0x00, // ###
672 + 0x03, 0xC0, // ####
673 + 0x00, 0xF0, // ####
674 + 0x00, 0x30, // ##
675 + 0x00, 0x00, //
676 + 0x00, 0x00, //
677 + 0x00, 0x00, //
678 + 0x00, 0x00, //
679 + 0x00, 0x00, //
680 + 0x00, 0x00, //
681 +
682 + // @1160 '=' (14 pixels wide)
683 + 0x00, 0x00, //
684 + 0x00, 0x00, //
685 + 0x00, 0x00, //
686 + 0x00, 0x00, //
687 + 0x00, 0x00, //
688 + 0x7F, 0xF0, // ###########
689 + 0x7F, 0xF0, // ###########
690 + 0x00, 0x00, //
691 + 0x00, 0x00, //
692 + 0x7F, 0xF0, // ###########
693 + 0x7F, 0xF0, // ###########
694 + 0x00, 0x00, //
695 + 0x00, 0x00, //
696 + 0x00, 0x00, //
697 + 0x00, 0x00, //
698 + 0x00, 0x00, //
699 + 0x00, 0x00, //
700 + 0x00, 0x00, //
701 + 0x00, 0x00, //
702 + 0x00, 0x00, //
703 +
704 + // @1200 '>' (14 pixels wide)
705 + 0x00, 0x00, //
706 + 0x00, 0x00, //
707 + 0x00, 0x00, //
708 + 0x30, 0x00, // ##
709 + 0x3C, 0x00, // ####
710 + 0x0F, 0x00, // ####
711 + 0x03, 0x80, // ###
712 + 0x00, 0xE0, // ###
713 + 0x00, 0x78, // ####
714 + 0x00, 0xE0, // ###
715 + 0x03, 0x80, // ###
716 + 0x0F, 0x00, // ####
717 + 0x3C, 0x00, // ####
718 + 0x30, 0x00, // ##
719 + 0x00, 0x00, //
720 + 0x00, 0x00, //
721 + 0x00, 0x00, //
722 + 0x00, 0x00, //
723 + 0x00, 0x00, //
724 + 0x00, 0x00, //
725 +
726 + // @1240 '?' (14 pixels wide)
727 + 0x00, 0x00, //
728 + 0x00, 0x00, //
729 + 0x0F, 0x80, // #####
730 + 0x1F, 0xC0, // #######
731 + 0x18, 0x60, // ## ##
732 + 0x18, 0x60, // ## ##
733 + 0x00, 0x60, // ##
734 + 0x01, 0xC0, // ###
735 + 0x03, 0x80, // ###
736 + 0x03, 0x00, // ##
737 + 0x00, 0x00, //
738 + 0x00, 0x00, //
739 + 0x07, 0x00, // ###
740 + 0x07, 0x00, // ###
741 + 0x00, 0x00, //
742 + 0x00, 0x00, //
743 + 0x00, 0x00, //
744 + 0x00, 0x00, //
745 + 0x00, 0x00, //
746 + 0x00, 0x00, //
747 +
748 + // @1280 '@' (14 pixels wide)
749 + 0x00, 0x00, //
750 + 0x03, 0x80, // ###
751 + 0x0C, 0x80, // ## #
752 + 0x08, 0x40, // # #
753 + 0x10, 0x40, // # #
754 + 0x10, 0x40, // # #
755 + 0x11, 0xC0, // # ###
756 + 0x12, 0x40, // # # #
757 + 0x12, 0x40, // # # #
758 + 0x12, 0x40, // # # #
759 + 0x11, 0xC0, // # ###
760 + 0x10, 0x00, // #
761 + 0x08, 0x00, // #
762 + 0x08, 0x40, // # #
763 + 0x07, 0x80, // ####
764 + 0x00, 0x00, //
765 + 0x00, 0x00, //
766 + 0x00, 0x00, //
767 + 0x00, 0x00, //
768 + 0x00, 0x00, //
769 +
770 + // @1320 'A' (14 pixels wide)
771 + 0x00, 0x00, //
772 + 0x00, 0x00, //
773 + 0x1F, 0x80, // ######
774 + 0x1F, 0x80, // ######
775 + 0x03, 0x80, // ###
776 + 0x06, 0xC0, // ## ##
777 + 0x06, 0xC0, // ## ##
778 + 0x0C, 0xC0, // ## ##
779 + 0x0C, 0x60, // ## ##
780 + 0x1F, 0xE0, // ########
781 + 0x1F, 0xE0, // ########
782 + 0x30, 0x30, // ## ##
783 + 0x78, 0x78, // #### ####
784 + 0x78, 0x78, // #### ####
785 + 0x00, 0x00, //
786 + 0x00, 0x00, //
787 + 0x00, 0x00, //
788 + 0x00, 0x00, //
789 + 0x00, 0x00, //
790 + 0x00, 0x00, //
791 +
792 + // @1360 'B' (14 pixels wide)
793 + 0x00, 0x00, //
794 + 0x00, 0x00, //
795 + 0x3F, 0x80, // #######
796 + 0x3F, 0xC0, // ########
797 + 0x18, 0x60, // ## ##
798 + 0x18, 0x60, // ## ##
799 + 0x18, 0xE0, // ## ###
800 + 0x1F, 0xC0, // #######
801 + 0x1F, 0xE0, // ########
802 + 0x18, 0x70, // ## ###
803 + 0x18, 0x30, // ## ##
804 + 0x18, 0x30, // ## ##
805 + 0x3F, 0xF0, // ##########
806 + 0x3F, 0xE0, // #########
807 + 0x00, 0x00, //
808 + 0x00, 0x00, //
809 + 0x00, 0x00, //
810 + 0x00, 0x00, //
811 + 0x00, 0x00, //
812 + 0x00, 0x00, //
813 +
814 + // @1400 'C' (14 pixels wide)
815 + 0x00, 0x00, //
816 + 0x00, 0x00, //
817 + 0x07, 0xB0, // #### ##
818 + 0x0F, 0xF0, // ########
819 + 0x1C, 0x70, // ### ###
820 + 0x38, 0x30, // ### ##
821 + 0x30, 0x00, // ##
822 + 0x30, 0x00, // ##
823 + 0x30, 0x00, // ##
824 + 0x30, 0x00, // ##
825 + 0x38, 0x30, // ### ##
826 + 0x1C, 0x70, // ### ###
827 + 0x0F, 0xE0, // #######
828 + 0x07, 0xC0, // #####
829 + 0x00, 0x00, //
830 + 0x00, 0x00, //
831 + 0x00, 0x00, //
832 + 0x00, 0x00, //
833 + 0x00, 0x00, //
834 + 0x00, 0x00, //
835 +
836 + // @1440 'D' (14 pixels wide)
837 + 0x00, 0x00, //
838 + 0x00, 0x00, //
839 + 0x7F, 0x80, // ########
840 + 0x7F, 0xC0, // #########
841 + 0x30, 0xE0, // ## ###
842 + 0x30, 0x70, // ## ###
843 + 0x30, 0x30, // ## ##
844 + 0x30, 0x30, // ## ##
845 + 0x30, 0x30, // ## ##
846 + 0x30, 0x30, // ## ##
847 + 0x30, 0x70, // ## ###
848 + 0x30, 0xE0, // ## ###
849 + 0x7F, 0xC0, // #########
850 + 0x7F, 0x80, // ########
851 + 0x00, 0x00, //
852 + 0x00, 0x00, //
853 + 0x00, 0x00, //
854 + 0x00, 0x00, //
855 + 0x00, 0x00, //
856 + 0x00, 0x00, //
857 +
858 + // @1480 'E' (14 pixels wide)
859 + 0x00, 0x00, //
860 + 0x00, 0x00, //
861 + 0x3F, 0xF0, // ##########
862 + 0x3F, 0xF0, // ##########
863 + 0x18, 0x30, // ## ##
864 + 0x18, 0x30, // ## ##
865 + 0x19, 0x80, // ## ##
866 + 0x1F, 0x80, // ######
867 + 0x1F, 0x80, // ######
868 + 0x19, 0x80, // ## ##
869 + 0x18, 0x30, // ## ##
870 + 0x18, 0x30, // ## ##
871 + 0x3F, 0xF0, // ##########
872 + 0x3F, 0xF0, // ##########
873 + 0x00, 0x00, //
874 + 0x00, 0x00, //
875 + 0x00, 0x00, //
876 + 0x00, 0x00, //
877 + 0x00, 0x00, //
878 + 0x00, 0x00, //
879 +
880 + // @1520 'F' (14 pixels wide)
881 + 0x00, 0x00, //
882 + 0x00, 0x00, //
883 + 0x3F, 0xF0, // ##########
884 + 0x3F, 0xF0, // ##########
885 + 0x18, 0x30, // ## ##
886 + 0x18, 0x30, // ## ##
887 + 0x19, 0x80, // ## ##
888 + 0x1F, 0x80, // ######
889 + 0x1F, 0x80, // ######
890 + 0x19, 0x80, // ## ##
891 + 0x18, 0x00, // ##
892 + 0x18, 0x00, // ##
893 + 0x3F, 0x00, // ######
894 + 0x3F, 0x00, // ######
895 + 0x00, 0x00, //
896 + 0x00, 0x00, //
897 + 0x00, 0x00, //
898 + 0x00, 0x00, //
899 + 0x00, 0x00, //
900 + 0x00, 0x00, //
901 +
902 + // @1560 'G' (14 pixels wide)
903 + 0x00, 0x00, //
904 + 0x00, 0x00, //
905 + 0x07, 0xB0, // #### ##
906 + 0x1F, 0xF0, // #########
907 + 0x18, 0x70, // ## ###
908 + 0x30, 0x30, // ## ##
909 + 0x30, 0x00, // ##
910 + 0x30, 0x00, // ##
911 + 0x31, 0xF8, // ## ######
912 + 0x31, 0xF8, // ## ######
913 + 0x30, 0x30, // ## ##
914 + 0x18, 0x30, // ## ##
915 + 0x1F, 0xF0, // #########
916 + 0x07, 0xC0, // #####
917 + 0x00, 0x00, //
918 + 0x00, 0x00, //
919 + 0x00, 0x00, //
920 + 0x00, 0x00, //
921 + 0x00, 0x00, //
922 + 0x00, 0x00, //
923 +
924 + // @1600 'H' (14 pixels wide)
925 + 0x00, 0x00, //
926 + 0x00, 0x00, //
927 + 0x3C, 0xF0, // #### ####
928 + 0x3C, 0xF0, // #### ####
929 + 0x18, 0x60, // ## ##
930 + 0x18, 0x60, // ## ##
931 + 0x18, 0x60, // ## ##
932 + 0x1F, 0xE0, // ########
933 + 0x1F, 0xE0, // ########
934 + 0x18, 0x60, // ## ##
935 + 0x18, 0x60, // ## ##
936 + 0x18, 0x60, // ## ##
937 + 0x3C, 0xF0, // #### ####
938 + 0x3C, 0xF0, // #### ####
939 + 0x00, 0x00, //
940 + 0x00, 0x00, //
941 + 0x00, 0x00, //
942 + 0x00, 0x00, //
943 + 0x00, 0x00, //
944 + 0x00, 0x00, //
945 +
946 + // @1640 'I' (14 pixels wide)
947 + 0x00, 0x00, //
948 + 0x00, 0x00, //
949 + 0x1F, 0xE0, // ########
950 + 0x1F, 0xE0, // ########
951 + 0x03, 0x00, // ##
952 + 0x03, 0x00, // ##
953 + 0x03, 0x00, // ##
954 + 0x03, 0x00, // ##
955 + 0x03, 0x00, // ##
956 + 0x03, 0x00, // ##
957 + 0x03, 0x00, // ##
958 + 0x03, 0x00, // ##
959 + 0x1F, 0xE0, // ########
960 + 0x1F, 0xE0, // ########
961 + 0x00, 0x00, //
962 + 0x00, 0x00, //
963 + 0x00, 0x00, //
964 + 0x00, 0x00, //
965 + 0x00, 0x00, //
966 + 0x00, 0x00, //
967 +
968 + // @1680 'J' (14 pixels wide)
969 + 0x00, 0x00, //
970 + 0x00, 0x00, //
971 + 0x03, 0xF8, // #######
972 + 0x03, 0xF8, // #######
973 + 0x00, 0x60, // ##
974 + 0x00, 0x60, // ##
975 + 0x00, 0x60, // ##
976 + 0x00, 0x60, // ##
977 + 0x30, 0x60, // ## ##
978 + 0x30, 0x60, // ## ##
979 + 0x30, 0x60, // ## ##
980 + 0x30, 0xE0, // ## ###
981 + 0x3F, 0xC0, // ########
982 + 0x0F, 0x80, // #####
983 + 0x00, 0x00, //
984 + 0x00, 0x00, //
985 + 0x00, 0x00, //
986 + 0x00, 0x00, //
987 + 0x00, 0x00, //
988 + 0x00, 0x00, //
989 +
990 + // @1720 'K' (14 pixels wide)
991 + 0x00, 0x00, //
992 + 0x00, 0x00, //
993 + 0x3E, 0xF8, // ##### #####
994 + 0x3E, 0xF8, // ##### #####
995 + 0x18, 0xE0, // ## ###
996 + 0x19, 0x80, // ## ##
997 + 0x1B, 0x00, // ## ##
998 + 0x1F, 0x00, // #####
999 + 0x1D, 0x80, // ### ##
1000 + 0x18, 0xC0, // ## ##
1001 + 0x18, 0xC0, // ## ##
1002 + 0x18, 0x60, // ## ##
1003 + 0x3E, 0x78, // ##### ####
1004 + 0x3E, 0x38, // ##### ###
1005 + 0x00, 0x00, //
1006 + 0x00, 0x00, //
1007 + 0x00, 0x00, //
1008 + 0x00, 0x00, //
1009 + 0x00, 0x00, //
1010 + 0x00, 0x00, //
1011 +
1012 + // @1760 'L' (14 pixels wide)
1013 + 0x00, 0x00, //
1014 + 0x00, 0x00, //
1015 + 0x3F, 0x00, // ######
1016 + 0x3F, 0x00, // ######
1017 + 0x0C, 0x00, // ##
1018 + 0x0C, 0x00, // ##
1019 + 0x0C, 0x00, // ##
1020 + 0x0C, 0x00, // ##
1021 + 0x0C, 0x00, // ##
1022 + 0x0C, 0x30, // ## ##
1023 + 0x0C, 0x30, // ## ##
1024 + 0x0C, 0x30, // ## ##
1025 + 0x3F, 0xF0, // ##########
1026 + 0x3F, 0xF0, // ##########
1027 + 0x00, 0x00, //
1028 + 0x00, 0x00, //
1029 + 0x00, 0x00, //
1030 + 0x00, 0x00, //
1031 + 0x00, 0x00, //
1032 + 0x00, 0x00, //
1033 +
1034 + // @1800 'M' (14 pixels wide)
1035 + 0x00, 0x00, //
1036 + 0x00, 0x00, //
1037 + 0x78, 0x78, // #### ####
1038 + 0x78, 0x78, // #### ####
1039 + 0x38, 0x70, // ### ###
1040 + 0x3C, 0xF0, // #### ####
1041 + 0x34, 0xB0, // ## # # ##
1042 + 0x37, 0xB0, // ## #### ##
1043 + 0x37, 0xB0, // ## #### ##
1044 + 0x33, 0x30, // ## ## ##
1045 + 0x33, 0x30, // ## ## ##
1046 + 0x30, 0x30, // ## ##
1047 + 0x7C, 0xF8, // ##### #####
1048 + 0x7C, 0xF8, // ##### #####
1049 + 0x00, 0x00, //
1050 + 0x00, 0x00, //
1051 + 0x00, 0x00, //
1052 + 0x00, 0x00, //
1053 + 0x00, 0x00, //
1054 + 0x00, 0x00, //
1055 +
1056 + // @1840 'N' (14 pixels wide)
1057 + 0x00, 0x00, //
1058 + 0x00, 0x00, //
1059 + 0x39, 0xF0, // ### #####
1060 + 0x3D, 0xF0, // #### #####
1061 + 0x1C, 0x60, // ### ##
1062 + 0x1E, 0x60, // #### ##
1063 + 0x1E, 0x60, // #### ##
1064 + 0x1B, 0x60, // ## ## ##
1065 + 0x1B, 0x60, // ## ## ##
1066 + 0x19, 0xE0, // ## ####
1067 + 0x19, 0xE0, // ## ####
1068 + 0x18, 0xE0, // ## ###
1069 + 0x3E, 0xE0, // ##### ###
1070 + 0x3E, 0x60, // ##### ##
1071 + 0x00, 0x00, //
1072 + 0x00, 0x00, //
1073 + 0x00, 0x00, //
1074 + 0x00, 0x00, //
1075 + 0x00, 0x00, //
1076 + 0x00, 0x00, //
1077 +
1078 + // @1880 'O' (14 pixels wide)
1079 + 0x00, 0x00, //
1080 + 0x00, 0x00, //
1081 + 0x07, 0x80, // ####
1082 + 0x0F, 0xC0, // ######
1083 + 0x1C, 0xE0, // ### ###
1084 + 0x38, 0x70, // ### ###
1085 + 0x30, 0x30, // ## ##
1086 + 0x30, 0x30, // ## ##
1087 + 0x30, 0x30, // ## ##
1088 + 0x30, 0x30, // ## ##
1089 + 0x38, 0x70, // ### ###
1090 + 0x1C, 0xE0, // ### ###
1091 + 0x0F, 0xC0, // ######
1092 + 0x07, 0x80, // ####
1093 + 0x00, 0x00, //
1094 + 0x00, 0x00, //
1095 + 0x00, 0x00, //
1096 + 0x00, 0x00, //
1097 + 0x00, 0x00, //
1098 + 0x00, 0x00, //
1099 +
1100 + // @1920 'P' (14 pixels wide)
1101 + 0x00, 0x00, //
1102 + 0x00, 0x00, //
1103 + 0x3F, 0xC0, // ########
1104 + 0x3F, 0xE0, // #########
1105 + 0x18, 0x70, // ## ###
1106 + 0x18, 0x30, // ## ##
1107 + 0x18, 0x30, // ## ##
1108 + 0x18, 0x70, // ## ###
1109 + 0x1F, 0xE0, // ########
1110 + 0x1F, 0xC0, // #######
1111 + 0x18, 0x00, // ##
1112 + 0x18, 0x00, // ##
1113 + 0x3F, 0x00, // ######
1114 + 0x3F, 0x00, // ######
1115 + 0x00, 0x00, //
1116 + 0x00, 0x00, //
1117 + 0x00, 0x00, //
1118 + 0x00, 0x00, //
1119 + 0x00, 0x00, //
1120 + 0x00, 0x00, //
1121 +
1122 + // @1960 'Q' (14 pixels wide)
1123 + 0x00, 0x00, //
1124 + 0x00, 0x00, //
1125 + 0x07, 0x80, // ####
1126 + 0x0F, 0xC0, // ######
1127 + 0x1C, 0xE0, // ### ###
1128 + 0x38, 0x70, // ### ###
1129 + 0x30, 0x30, // ## ##
1130 + 0x30, 0x30, // ## ##
1131 + 0x30, 0x30, // ## ##
1132 + 0x30, 0x30, // ## ##
1133 + 0x38, 0x70, // ### ###
1134 + 0x1C, 0xE0, // ### ###
1135 + 0x0F, 0xC0, // ######
1136 + 0x07, 0x80, // ####
1137 + 0x07, 0xB0, // #### ##
1138 + 0x0F, 0xF0, // ########
1139 + 0x0C, 0xE0, // ## ###
1140 + 0x00, 0x00, //
1141 + 0x00, 0x00, //
1142 + 0x00, 0x00, //
1143 +
1144 + // @2000 'R' (14 pixels wide)
1145 + 0x00, 0x00, //
1146 + 0x00, 0x00, //
1147 + 0x3F, 0xC0, // ########
1148 + 0x3F, 0xE0, // #########
1149 + 0x18, 0x70, // ## ###
1150 + 0x18, 0x30, // ## ##
1151 + 0x18, 0x70, // ## ###
1152 + 0x1F, 0xE0, // ########
1153 + 0x1F, 0xC0, // #######
1154 + 0x18, 0xE0, // ## ###
1155 + 0x18, 0x60, // ## ##
1156 + 0x18, 0x70, // ## ###
1157 + 0x3E, 0x38, // ##### ###
1158 + 0x3E, 0x18, // ##### ##
1159 + 0x00, 0x00, //
1160 + 0x00, 0x00, //
1161 + 0x00, 0x00, //
1162 + 0x00, 0x00, //
1163 + 0x00, 0x00, //
1164 + 0x00, 0x00, //
1165 +
1166 + // @2040 'S' (14 pixels wide)
1167 + 0x00, 0x00, //
1168 + 0x00, 0x00, //
1169 + 0x0F, 0xB0, // ##### ##
1170 + 0x1F, 0xF0, // #########
1171 + 0x38, 0x70, // ### ###
1172 + 0x30, 0x30, // ## ##
1173 + 0x38, 0x00, // ###
1174 + 0x1F, 0x80, // ######
1175 + 0x07, 0xE0, // ######
1176 + 0x00, 0x70, // ###
1177 + 0x30, 0x30, // ## ##
1178 + 0x38, 0x70, // ### ###
1179 + 0x3F, 0xE0, // #########
1180 + 0x37, 0xC0, // ## #####
1181 + 0x00, 0x00, //
1182 + 0x00, 0x00, //
1183 + 0x00, 0x00, //
1184 + 0x00, 0x00, //
1185 + 0x00, 0x00, //
1186 + 0x00, 0x00, //
1187 +
1188 + // @2080 'T' (14 pixels wide)
1189 + 0x00, 0x00, //
1190 + 0x00, 0x00, //
1191 + 0x3F, 0xF0, // ##########
1192 + 0x3F, 0xF0, // ##########
1193 + 0x33, 0x30, // ## ## ##
1194 + 0x33, 0x30, // ## ## ##
1195 + 0x33, 0x30, // ## ## ##
1196 + 0x03, 0x00, // ##
1197 + 0x03, 0x00, // ##
1198 + 0x03, 0x00, // ##
1199 + 0x03, 0x00, // ##
1200 + 0x03, 0x00, // ##
1201 + 0x0F, 0xC0, // ######
1202 + 0x0F, 0xC0, // ######
1203 + 0x00, 0x00, //
1204 + 0x00, 0x00, //
1205 + 0x00, 0x00, //
1206 + 0x00, 0x00, //
1207 + 0x00, 0x00, //
1208 + 0x00, 0x00, //
1209 +
1210 + // @2120 'U' (14 pixels wide)
1211 + 0x00, 0x00, //
1212 + 0x00, 0x00, //
1213 + 0x3C, 0xF0, // #### ####
1214 + 0x3C, 0xF0, // #### ####
1215 + 0x18, 0x60, // ## ##
1216 + 0x18, 0x60, // ## ##
1217 + 0x18, 0x60, // ## ##
1218 + 0x18, 0x60, // ## ##
1219 + 0x18, 0x60, // ## ##
1220 + 0x18, 0x60, // ## ##
1221 + 0x18, 0x60, // ## ##
1222 + 0x1C, 0xE0, // ### ###
1223 + 0x0F, 0xC0, // ######
1224 + 0x07, 0x80, // ####
1225 + 0x00, 0x00, //
1226 + 0x00, 0x00, //
1227 + 0x00, 0x00, //
1228 + 0x00, 0x00, //
1229 + 0x00, 0x00, //
1230 + 0x00, 0x00, //
1231 +
1232 + // @2160 'V' (14 pixels wide)
1233 + 0x00, 0x00, //
1234 + 0x00, 0x00, //
1235 + 0x78, 0xF0, // #### ####
1236 + 0x78, 0xF0, // #### ####
1237 + 0x30, 0x60, // ## ##
1238 + 0x30, 0x60, // ## ##
1239 + 0x18, 0xC0, // ## ##
1240 + 0x18, 0xC0, // ## ##
1241 + 0x0D, 0x80, // ## ##
1242 + 0x0D, 0x80, // ## ##
1243 + 0x0D, 0x80, // ## ##
1244 + 0x07, 0x00, // ###
1245 + 0x07, 0x00, // ###
1246 + 0x07, 0x00, // ###
1247 + 0x00, 0x00, //
1248 + 0x00, 0x00, //
1249 + 0x00, 0x00, //
1250 + 0x00, 0x00, //
1251 + 0x00, 0x00, //
1252 + 0x00, 0x00, //
1253 +
1254 + // @2200 'W' (14 pixels wide)
1255 + 0x00, 0x00, //
1256 + 0x00, 0x00, //
1257 + 0x7C, 0x7C, // ##### #####
1258 + 0x7C, 0x7C, // ##### #####
1259 + 0x30, 0x18, // ## ##
1260 + 0x33, 0x98, // ## ### ##
1261 + 0x33, 0x98, // ## ### ##
1262 + 0x33, 0x98, // ## ### ##
1263 + 0x36, 0xD8, // ## ## ## ##
1264 + 0x16, 0xD0, // # ## ## #
1265 + 0x1C, 0x70, // ### ###
1266 + 0x1C, 0x70, // ### ###
1267 + 0x1C, 0x70, // ### ###
1268 + 0x18, 0x30, // ## ##
1269 + 0x00, 0x00, //
1270 + 0x00, 0x00, //
1271 + 0x00, 0x00, //
1272 + 0x00, 0x00, //
1273 + 0x00, 0x00, //
1274 + 0x00, 0x00, //
1275 +
1276 + // @2240 'X' (14 pixels wide)
1277 + 0x00, 0x00, //
1278 + 0x00, 0x00, //
1279 + 0x78, 0xF0, // #### ####
1280 + 0x78, 0xF0, // #### ####
1281 + 0x30, 0x60, // ## ##
1282 + 0x18, 0xC0, // ## ##
1283 + 0x0D, 0x80, // ## ##
1284 + 0x07, 0x00, // ###
1285 + 0x07, 0x00, // ###
1286 + 0x0D, 0x80, // ## ##
1287 + 0x18, 0xC0, // ## ##
1288 + 0x30, 0x60, // ## ##
1289 + 0x78, 0xF0, // #### ####
1290 + 0x78, 0xF0, // #### ####
1291 + 0x00, 0x00, //
1292 + 0x00, 0x00, //
1293 + 0x00, 0x00, //
1294 + 0x00, 0x00, //
1295 + 0x00, 0x00, //
1296 + 0x00, 0x00, //
1297 +
1298 + // @2280 'Y' (14 pixels wide)
1299 + 0x00, 0x00, //
1300 + 0x00, 0x00, //
1301 + 0x3C, 0xF0, // #### ####
1302 + 0x3C, 0xF0, // #### ####
1303 + 0x18, 0x60, // ## ##
1304 + 0x0C, 0xC0, // ## ##
1305 + 0x07, 0x80, // ####
1306 + 0x07, 0x80, // ####
1307 + 0x03, 0x00, // ##
1308 + 0x03, 0x00, // ##
1309 + 0x03, 0x00, // ##
1310 + 0x03, 0x00, // ##
1311 + 0x0F, 0xC0, // ######
1312 + 0x0F, 0xC0, // ######
1313 + 0x00, 0x00, //
1314 + 0x00, 0x00, //
1315 + 0x00, 0x00, //
1316 + 0x00, 0x00, //
1317 + 0x00, 0x00, //
1318 + 0x00, 0x00, //
1319 +
1320 + // @2320 'Z' (14 pixels wide)
1321 + 0x00, 0x00, //
1322 + 0x00, 0x00, //
1323 + 0x1F, 0xE0, // ########
1324 + 0x1F, 0xE0, // ########
1325 + 0x18, 0x60, // ## ##
1326 + 0x18, 0xC0, // ## ##
1327 + 0x01, 0x80, // ##
1328 + 0x03, 0x00, // ##
1329 + 0x03, 0x00, // ##
1330 + 0x06, 0x00, // ##
1331 + 0x0C, 0x60, // ## ##
1332 + 0x18, 0x60, // ## ##
1333 + 0x1F, 0xE0, // ########
1334 + 0x1F, 0xE0, // ########
1335 + 0x00, 0x00, //
1336 + 0x00, 0x00, //
1337 + 0x00, 0x00, //
1338 + 0x00, 0x00, //
1339 + 0x00, 0x00, //
1340 + 0x00, 0x00, //
1341 +
1342 + // @2360 '[' (14 pixels wide)
1343 + 0x00, 0x00, //
1344 + 0x03, 0xC0, // ####
1345 + 0x03, 0xC0, // ####
1346 + 0x03, 0x00, // ##
1347 + 0x03, 0x00, // ##
1348 + 0x03, 0x00, // ##
1349 + 0x03, 0x00, // ##
1350 + 0x03, 0x00, // ##
1351 + 0x03, 0x00, // ##
1352 + 0x03, 0x00, // ##
1353 + 0x03, 0x00, // ##
1354 + 0x03, 0x00, // ##
1355 + 0x03, 0x00, // ##
1356 + 0x03, 0x00, // ##
1357 + 0x03, 0x00, // ##
1358 + 0x03, 0xC0, // ####
1359 + 0x03, 0xC0, // ####
1360 + 0x00, 0x00, //
1361 + 0x00, 0x00, //
1362 + 0x00, 0x00, //
1363 +
1364 + // @2400 '\' (14 pixels wide)
1365 + 0x18, 0x00, // ##
1366 + 0x18, 0x00, // ##
1367 + 0x0C, 0x00, // ##
1368 + 0x0C, 0x00, // ##
1369 + 0x0C, 0x00, // ##
1370 + 0x06, 0x00, // ##
1371 + 0x06, 0x00, // ##
1372 + 0x03, 0x00, // ##
1373 + 0x03, 0x00, // ##
1374 + 0x01, 0x80, // ##
1375 + 0x01, 0x80, // ##
1376 + 0x00, 0xC0, // ##
1377 + 0x00, 0xC0, // ##
1378 + 0x00, 0xC0, // ##
1379 + 0x00, 0x60, // ##
1380 + 0x00, 0x60, // ##
1381 + 0x00, 0x00, //
1382 + 0x00, 0x00, //
1383 + 0x00, 0x00, //
1384 + 0x00, 0x00, //
1385 +
1386 + // @2440 ']' (14 pixels wide)
1387 + 0x00, 0x00, //
1388 + 0x0F, 0x00, // ####
1389 + 0x0F, 0x00, // ####
1390 + 0x03, 0x00, // ##
1391 + 0x03, 0x00, // ##
1392 + 0x03, 0x00, // ##
1393 + 0x03, 0x00, // ##
1394 + 0x03, 0x00, // ##
1395 + 0x03, 0x00, // ##
1396 + 0x03, 0x00, // ##
1397 + 0x03, 0x00, // ##
1398 + 0x03, 0x00, // ##
1399 + 0x03, 0x00, // ##
1400 + 0x03, 0x00, // ##
1401 + 0x03, 0x00, // ##
1402 + 0x0F, 0x00, // ####
1403 + 0x0F, 0x00, // ####
1404 + 0x00, 0x00, //
1405 + 0x00, 0x00, //
1406 + 0x00, 0x00, //
1407 +
1408 + // @2480 '^' (14 pixels wide)
1409 + 0x00, 0x00, //
1410 + 0x02, 0x00, // #
1411 + 0x07, 0x00, // ###
1412 + 0x0D, 0x80, // ## ##
1413 + 0x18, 0xC0, // ## ##
1414 + 0x30, 0x60, // ## ##
1415 + 0x20, 0x20, // # #
1416 + 0x00, 0x00, //
1417 + 0x00, 0x00, //
1418 + 0x00, 0x00, //
1419 + 0x00, 0x00, //
1420 + 0x00, 0x00, //
1421 + 0x00, 0x00, //
1422 + 0x00, 0x00, //
1423 + 0x00, 0x00, //
1424 + 0x00, 0x00, //
1425 + 0x00, 0x00, //
1426 + 0x00, 0x00, //
1427 + 0x00, 0x00, //
1428 + 0x00, 0x00, //
1429 +
1430 + // @2520 '_' (14 pixels wide)
1431 + 0x00, 0x00, //
1432 + 0x00, 0x00, //
1433 + 0x00, 0x00, //
1434 + 0x00, 0x00, //
1435 + 0x00, 0x00, //
1436 + 0x00, 0x00, //
1437 + 0x00, 0x00, //
1438 + 0x00, 0x00, //
1439 + 0x00, 0x00, //
1440 + 0x00, 0x00, //
1441 + 0x00, 0x00, //
1442 + 0x00, 0x00, //
1443 + 0x00, 0x00, //
1444 + 0x00, 0x00, //
1445 + 0x00, 0x00, //
1446 + 0x00, 0x00, //
1447 + 0x00, 0x00, //
1448 + 0x00, 0x00, //
1449 + 0xFF, 0xFC, // ##############
1450 + 0xFF, 0xFC, // ##############
1451 +
1452 + // @2560 '`' (14 pixels wide)
1453 + 0x00, 0x00, //
1454 + 0x04, 0x00, // #
1455 + 0x03, 0x00, // ##
1456 + 0x00, 0x80, // #
1457 + 0x00, 0x00, //
1458 + 0x00, 0x00, //
1459 + 0x00, 0x00, //
1460 + 0x00, 0x00, //
1461 + 0x00, 0x00, //
1462 + 0x00, 0x00, //
1463 + 0x00, 0x00, //
1464 + 0x00, 0x00, //
1465 + 0x00, 0x00, //
1466 + 0x00, 0x00, //
1467 + 0x00, 0x00, //
1468 + 0x00, 0x00, //
1469 + 0x00, 0x00, //
1470 + 0x00, 0x00, //
1471 + 0x00, 0x00, //
1472 + 0x00, 0x00, //
1473 +
1474 + // @2600 'a' (14 pixels wide)
1475 + 0x00, 0x00, //
1476 + 0x00, 0x00, //
1477 + 0x00, 0x00, //
1478 + 0x00, 0x00, //
1479 + 0x00, 0x00, //
1480 + 0x0F, 0xC0, // ######
1481 + 0x1F, 0xE0, // ########
1482 + 0x00, 0x60, // ##
1483 + 0x0F, 0xE0, // #######
1484 + 0x1F, 0xE0, // ########
1485 + 0x38, 0x60, // ### ##
1486 + 0x30, 0xE0, // ## ###
1487 + 0x3F, 0xF0, // ##########
1488 + 0x1F, 0x70, // ##### ###
1489 + 0x00, 0x00, //
1490 + 0x00, 0x00, //
1491 + 0x00, 0x00, //
1492 + 0x00, 0x00, //
1493 + 0x00, 0x00, //
1494 + 0x00, 0x00, //
1495 +
1496 + // @2640 'b' (14 pixels wide)
1497 + 0x00, 0x00, //
1498 + 0x70, 0x00, // ###
1499 + 0x70, 0x00, // ###
1500 + 0x30, 0x00, // ##
1501 + 0x30, 0x00, // ##
1502 + 0x37, 0x80, // ## ####
1503 + 0x3F, 0xE0, // #########
1504 + 0x38, 0x60, // ### ##
1505 + 0x30, 0x30, // ## ##
1506 + 0x30, 0x30, // ## ##
1507 + 0x30, 0x30, // ## ##
1508 + 0x38, 0x60, // ### ##
1509 + 0x7F, 0xE0, // ##########
1510 + 0x77, 0x80, // ### ####
1511 + 0x00, 0x00, //
1512 + 0x00, 0x00, //
1513 + 0x00, 0x00, //
1514 + 0x00, 0x00, //
1515 + 0x00, 0x00, //
1516 + 0x00, 0x00, //
1517 +
1518 + // @2680 'c' (14 pixels wide)
1519 + 0x00, 0x00, //
1520 + 0x00, 0x00, //
1521 + 0x00, 0x00, //
1522 + 0x00, 0x00, //
1523 + 0x00, 0x00, //
1524 + 0x07, 0xB0, // #### ##
1525 + 0x1F, 0xF0, // #########
1526 + 0x18, 0x30, // ## ##
1527 + 0x30, 0x30, // ## ##
1528 + 0x30, 0x00, // ##
1529 + 0x30, 0x00, // ##
1530 + 0x38, 0x30, // ### ##
1531 + 0x1F, 0xF0, // #########
1532 + 0x0F, 0xC0, // ######
1533 + 0x00, 0x00, //
1534 + 0x00, 0x00, //
1535 + 0x00, 0x00, //
1536 + 0x00, 0x00, //
1537 + 0x00, 0x00, //
1538 + 0x00, 0x00, //
1539 +
1540 + // @2720 'd' (14 pixels wide)
1541 + 0x00, 0x00, //
1542 + 0x00, 0x70, // ###
1543 + 0x00, 0x70, // ###
1544 + 0x00, 0x30, // ##
1545 + 0x00, 0x30, // ##
1546 + 0x07, 0xB0, // #### ##
1547 + 0x1F, 0xF0, // #########
1548 + 0x18, 0x70, // ## ###
1549 + 0x30, 0x30, // ## ##
1550 + 0x30, 0x30, // ## ##
1551 + 0x30, 0x30, // ## ##
1552 + 0x38, 0x70, // ### ###
1553 + 0x1F, 0xF8, // ##########
1554 + 0x07, 0xB8, // #### ###
1555 + 0x00, 0x00, //
1556 + 0x00, 0x00, //
1557 + 0x00, 0x00, //
1558 + 0x00, 0x00, //
1559 + 0x00, 0x00, //
1560 + 0x00, 0x00, //
1561 +
1562 + // @2760 'e' (14 pixels wide)
1563 + 0x00, 0x00, //
1564 + 0x00, 0x00, //
1565 + 0x00, 0x00, //
1566 + 0x00, 0x00, //
1567 + 0x00, 0x00, //
1568 + 0x07, 0x80, // ####
1569 + 0x1F, 0xE0, // ########
1570 + 0x18, 0x60, // ## ##
1571 + 0x3F, 0xF0, // ##########
1572 + 0x3F, 0xF0, // ##########
1573 + 0x30, 0x00, // ##
1574 + 0x18, 0x30, // ## ##
1575 + 0x1F, 0xF0, // #########
1576 + 0x07, 0xC0, // #####
1577 + 0x00, 0x00, //
1578 + 0x00, 0x00, //
1579 + 0x00, 0x00, //
1580 + 0x00, 0x00, //
1581 + 0x00, 0x00, //
1582 + 0x00, 0x00, //
1583 +
1584 + // @2800 'f' (14 pixels wide)
1585 + 0x00, 0x00, //
1586 + 0x03, 0xF0, // ######
1587 + 0x07, 0xF0, // #######
1588 + 0x06, 0x00, // ##
1589 + 0x06, 0x00, // ##
1590 + 0x1F, 0xE0, // ########
1591 + 0x1F, 0xE0, // ########
1592 + 0x06, 0x00, // ##
1593 + 0x06, 0x00, // ##
1594 + 0x06, 0x00, // ##
1595 + 0x06, 0x00, // ##
1596 + 0x06, 0x00, // ##
1597 + 0x1F, 0xE0, // ########
1598 + 0x1F, 0xE0, // ########
1599 + 0x00, 0x00, //
1600 + 0x00, 0x00, //
1601 + 0x00, 0x00, //
1602 + 0x00, 0x00, //
1603 + 0x00, 0x00, //
1604 + 0x00, 0x00, //
1605 +
1606 + // @2840 'g' (14 pixels wide)
1607 + 0x00, 0x00, //
1608 + 0x00, 0x00, //
1609 + 0x00, 0x00, //
1610 + 0x00, 0x00, //
1611 + 0x00, 0x00, //
1612 + 0x07, 0xB8, // #### ###
1613 + 0x1F, 0xF8, // ##########
1614 + 0x18, 0x70, // ## ###
1615 + 0x30, 0x30, // ## ##
1616 + 0x30, 0x30, // ## ##
1617 + 0x30, 0x30, // ## ##
1618 + 0x18, 0x70, // ## ###
1619 + 0x1F, 0xF0, // #########
1620 + 0x07, 0xB0, // #### ##
1621 + 0x00, 0x30, // ##
1622 + 0x00, 0x70, // ###
1623 + 0x0F, 0xE0, // #######
1624 + 0x0F, 0xC0, // ######
1625 + 0x00, 0x00, //
1626 + 0x00, 0x00, //
1627 +
1628 + // @2880 'h' (14 pixels wide)
1629 + 0x00, 0x00, //
1630 + 0x38, 0x00, // ###
1631 + 0x38, 0x00, // ###
1632 + 0x18, 0x00, // ##
1633 + 0x18, 0x00, // ##
1634 + 0x1B, 0xC0, // ## ####
1635 + 0x1F, 0xE0, // ########
1636 + 0x1C, 0x60, // ### ##
1637 + 0x18, 0x60, // ## ##
1638 + 0x18, 0x60, // ## ##
1639 + 0x18, 0x60, // ## ##
1640 + 0x18, 0x60, // ## ##
1641 + 0x3C, 0xF0, // #### ####
1642 + 0x3C, 0xF0, // #### ####
1643 + 0x00, 0x00, //
1644 + 0x00, 0x00, //
1645 + 0x00, 0x00, //
1646 + 0x00, 0x00, //
1647 + 0x00, 0x00, //
1648 + 0x00, 0x00, //
1649 +
1650 + // @2920 'i' (14 pixels wide)
1651 + 0x00, 0x00, //
1652 + 0x03, 0x00, // ##
1653 + 0x03, 0x00, // ##
1654 + 0x00, 0x00, //
1655 + 0x00, 0x00, //
1656 + 0x1F, 0x00, // #####
1657 + 0x1F, 0x00, // #####
1658 + 0x03, 0x00, // ##
1659 + 0x03, 0x00, // ##
1660 + 0x03, 0x00, // ##
1661 + 0x03, 0x00, // ##
1662 + 0x03, 0x00, // ##
1663 + 0x1F, 0xE0, // ########
1664 + 0x1F, 0xE0, // ########
1665 + 0x00, 0x00, //
1666 + 0x00, 0x00, //
1667 + 0x00, 0x00, //
1668 + 0x00, 0x00, //
1669 + 0x00, 0x00, //
1670 + 0x00, 0x00, //
1671 +
1672 + // @2960 'j' (14 pixels wide)
1673 + 0x00, 0x00, //
1674 + 0x03, 0x00, // ##
1675 + 0x03, 0x00, // ##
1676 + 0x00, 0x00, //
1677 + 0x00, 0x00, //
1678 + 0x1F, 0xC0, // #######
1679 + 0x1F, 0xC0, // #######
1680 + 0x00, 0xC0, // ##
1681 + 0x00, 0xC0, // ##
1682 + 0x00, 0xC0, // ##
1683 + 0x00, 0xC0, // ##
1684 + 0x00, 0xC0, // ##
1685 + 0x00, 0xC0, // ##
1686 + 0x00, 0xC0, // ##
1687 + 0x00, 0xC0, // ##
1688 + 0x01, 0xC0, // ###
1689 + 0x3F, 0x80, // #######
1690 + 0x3F, 0x00, // ######
1691 + 0x00, 0x00, //
1692 + 0x00, 0x00, //
1693 +
1694 + // @3000 'k' (14 pixels wide)
1695 + 0x00, 0x00, //
1696 + 0x38, 0x00, // ###
1697 + 0x38, 0x00, // ###
1698 + 0x18, 0x00, // ##
1699 + 0x18, 0x00, // ##
1700 + 0x1B, 0xE0, // ## #####
1701 + 0x1B, 0xE0, // ## #####
1702 + 0x1B, 0x00, // ## ##
1703 + 0x1E, 0x00, // ####
1704 + 0x1E, 0x00, // ####
1705 + 0x1B, 0x00, // ## ##
1706 + 0x19, 0x80, // ## ##
1707 + 0x39, 0xF0, // ### #####
1708 + 0x39, 0xF0, // ### #####
1709 + 0x00, 0x00, //
1710 + 0x00, 0x00, //
1711 + 0x00, 0x00, //
1712 + 0x00, 0x00, //
1713 + 0x00, 0x00, //
1714 + 0x00, 0x00, //
1715 +
1716 + // @3040 'l' (14 pixels wide)
1717 + 0x00, 0x00, //
1718 + 0x1F, 0x00, // #####
1719 + 0x1F, 0x00, // #####
1720 + 0x03, 0x00, // ##
1721 + 0x03, 0x00, // ##
1722 + 0x03, 0x00, // ##
1723 + 0x03, 0x00, // ##
1724 + 0x03, 0x00, // ##
1725 + 0x03, 0x00, // ##
1726 + 0x03, 0x00, // ##
1727 + 0x03, 0x00, // ##
1728 + 0x03, 0x00, // ##
1729 + 0x1F, 0xE0, // ########
1730 + 0x1F, 0xE0, // ########
1731 + 0x00, 0x00, //
1732 + 0x00, 0x00, //
1733 + 0x00, 0x00, //
1734 + 0x00, 0x00, //
1735 + 0x00, 0x00, //
1736 + 0x00, 0x00, //
1737 +
1738 + // @3080 'm' (14 pixels wide)
1739 + 0x00, 0x00, //
1740 + 0x00, 0x00, //
1741 + 0x00, 0x00, //
1742 + 0x00, 0x00, //
1743 + 0x00, 0x00, //
1744 + 0x7E, 0xE0, // ###### ###
1745 + 0x7F, 0xF0, // ###########
1746 + 0x33, 0x30, // ## ## ##
1747 + 0x33, 0x30, // ## ## ##
1748 + 0x33, 0x30, // ## ## ##
1749 + 0x33, 0x30, // ## ## ##
1750 + 0x33, 0x30, // ## ## ##
1751 + 0x7B, 0xB8, // #### ### ###
1752 + 0x7B, 0xB8, // #### ### ###
1753 + 0x00, 0x00, //
1754 + 0x00, 0x00, //
1755 + 0x00, 0x00, //
1756 + 0x00, 0x00, //
1757 + 0x00, 0x00, //
1758 + 0x00, 0x00, //
1759 +
1760 + // @3120 'n' (14 pixels wide)
1761 + 0x00, 0x00, //
1762 + 0x00, 0x00, //
1763 + 0x00, 0x00, //
1764 + 0x00, 0x00, //
1765 + 0x00, 0x00, //
1766 + 0x3B, 0xC0, // ### ####
1767 + 0x3F, 0xE0, // #########
1768 + 0x1C, 0x60, // ### ##
1769 + 0x18, 0x60, // ## ##
1770 + 0x18, 0x60, // ## ##
1771 + 0x18, 0x60, // ## ##
1772 + 0x18, 0x60, // ## ##
1773 + 0x3C, 0xF0, // #### ####
1774 + 0x3C, 0xF0, // #### ####
1775 + 0x00, 0x00, //
1776 + 0x00, 0x00, //
1777 + 0x00, 0x00, //
1778 + 0x00, 0x00, //
1779 + 0x00, 0x00, //
1780 + 0x00, 0x00, //
1781 +
1782 + // @3160 'o' (14 pixels wide)
1783 + 0x00, 0x00, //
1784 + 0x00, 0x00, //
1785 + 0x00, 0x00, //
1786 + 0x00, 0x00, //
1787 + 0x00, 0x00, //
1788 + 0x07, 0x80, // ####
1789 + 0x1F, 0xE0, // ########
1790 + 0x18, 0x60, // ## ##
1791 + 0x30, 0x30, // ## ##
1792 + 0x30, 0x30, // ## ##
1793 + 0x30, 0x30, // ## ##
1794 + 0x18, 0x60, // ## ##
1795 + 0x1F, 0xE0, // ########
1796 + 0x07, 0x80, // ####
1797 + 0x00, 0x00, //
1798 + 0x00, 0x00, //
1799 + 0x00, 0x00, //
1800 + 0x00, 0x00, //
1801 + 0x00, 0x00, //
1802 + 0x00, 0x00, //
1803 +
1804 + // @3200 'p' (14 pixels wide)
1805 + 0x00, 0x00, //
1806 + 0x00, 0x00, //
1807 + 0x00, 0x00, //
1808 + 0x00, 0x00, //
1809 + 0x00, 0x00, //
1810 + 0x77, 0x80, // ### ####
1811 + 0x7F, 0xE0, // ##########
1812 + 0x38, 0x60, // ### ##
1813 + 0x30, 0x30, // ## ##
1814 + 0x30, 0x30, // ## ##
1815 + 0x30, 0x30, // ## ##
1816 + 0x38, 0x60, // ### ##
1817 + 0x3F, 0xE0, // #########
1818 + 0x37, 0x80, // ## ####
1819 + 0x30, 0x00, // ##
1820 + 0x30, 0x00, // ##
1821 + 0x7C, 0x00, // #####
1822 + 0x7C, 0x00, // #####
1823 + 0x00, 0x00, //
1824 + 0x00, 0x00, //
1825 +
1826 + // @3240 'q' (14 pixels wide)
1827 + 0x00, 0x00, //
1828 + 0x00, 0x00, //
1829 + 0x00, 0x00, //
1830 + 0x00, 0x00, //
1831 + 0x00, 0x00, //
1832 + 0x07, 0xB8, // #### ###
1833 + 0x1F, 0xF8, // ##########
1834 + 0x18, 0x70, // ## ###
1835 + 0x30, 0x30, // ## ##
1836 + 0x30, 0x30, // ## ##
1837 + 0x30, 0x30, // ## ##
1838 + 0x18, 0x70, // ## ###
1839 + 0x1F, 0xF0, // #########
1840 + 0x07, 0xB0, // #### ##
1841 + 0x00, 0x30, // ##
1842 + 0x00, 0x30, // ##
1843 + 0x00, 0xF8, // #####
1844 + 0x00, 0xF8, // #####
1845 + 0x00, 0x00, //
1846 + 0x00, 0x00, //
1847 +
1848 + // @3280 'r' (14 pixels wide)
1849 + 0x00, 0x00, //
1850 + 0x00, 0x00, //
1851 + 0x00, 0x00, //
1852 + 0x00, 0x00, //
1853 + 0x00, 0x00, //
1854 + 0x3C, 0xE0, // #### ###
1855 + 0x3D, 0xF0, // #### #####
1856 + 0x0F, 0x30, // #### ##
1857 + 0x0E, 0x00, // ###
1858 + 0x0C, 0x00, // ##
1859 + 0x0C, 0x00, // ##
1860 + 0x0C, 0x00, // ##
1861 + 0x3F, 0xC0, // ########
1862 + 0x3F, 0xC0, // ########
1863 + 0x00, 0x00, //
1864 + 0x00, 0x00, //
1865 + 0x00, 0x00, //
1866 + 0x00, 0x00, //
1867 + 0x00, 0x00, //
1868 + 0x00, 0x00, //
1869 +
1870 + // @3320 's' (14 pixels wide)
1871 + 0x00, 0x00, //
1872 + 0x00, 0x00, //
1873 + 0x00, 0x00, //
1874 + 0x00, 0x00, //
1875 + 0x00, 0x00, //
1876 + 0x07, 0xE0, // ######
1877 + 0x1F, 0xE0, // ########
1878 + 0x18, 0x60, // ## ##
1879 + 0x1E, 0x00, // ####
1880 + 0x0F, 0xC0, // ######
1881 + 0x01, 0xE0, // ####
1882 + 0x18, 0x60, // ## ##
1883 + 0x1F, 0xE0, // ########
1884 + 0x1F, 0x80, // ######
1885 + 0x00, 0x00, //
1886 + 0x00, 0x00, //
1887 + 0x00, 0x00, //
1888 + 0x00, 0x00, //
1889 + 0x00, 0x00, //
1890 + 0x00, 0x00, //
1891 +
1892 + // @3360 't' (14 pixels wide)
1893 + 0x00, 0x00, //
1894 + 0x00, 0x00, //
1895 + 0x0C, 0x00, // ##
1896 + 0x0C, 0x00, // ##
1897 + 0x0C, 0x00, // ##
1898 + 0x3F, 0xE0, // #########
1899 + 0x3F, 0xE0, // #########
1900 + 0x0C, 0x00, // ##
1901 + 0x0C, 0x00, // ##
1902 + 0x0C, 0x00, // ##
1903 + 0x0C, 0x00, // ##
1904 + 0x0C, 0x30, // ## ##
1905 + 0x0F, 0xF0, // ########
1906 + 0x07, 0xC0, // #####
1907 + 0x00, 0x00, //
1908 + 0x00, 0x00, //
1909 + 0x00, 0x00, //
1910 + 0x00, 0x00, //
1911 + 0x00, 0x00, //
1912 + 0x00, 0x00, //
1913 +
1914 + // @3400 'u' (14 pixels wide)
1915 + 0x00, 0x00, //
1916 + 0x00, 0x00, //
1917 + 0x00, 0x00, //
1918 + 0x00, 0x00, //
1919 + 0x00, 0x00, //
1920 + 0x38, 0xE0, // ### ###
1921 + 0x38, 0xE0, // ### ###
1922 + 0x18, 0x60, // ## ##
1923 + 0x18, 0x60, // ## ##
1924 + 0x18, 0x60, // ## ##
1925 + 0x18, 0x60, // ## ##
1926 + 0x18, 0xE0, // ## ###
1927 + 0x1F, 0xF0, // #########
1928 + 0x0F, 0x70, // #### ###
1929 + 0x00, 0x00, //
1930 + 0x00, 0x00, //
1931 + 0x00, 0x00, //
1932 + 0x00, 0x00, //
1933 + 0x00, 0x00, //
1934 + 0x00, 0x00, //
1935 +
1936 + // @3440 'v' (14 pixels wide)
1937 + 0x00, 0x00, //
1938 + 0x00, 0x00, //
1939 + 0x00, 0x00, //
1940 + 0x00, 0x00, //
1941 + 0x00, 0x00, //
1942 + 0x78, 0xF0, // #### ####
1943 + 0x78, 0xF0, // #### ####
1944 + 0x30, 0x60, // ## ##
1945 + 0x18, 0xC0, // ## ##
1946 + 0x18, 0xC0, // ## ##
1947 + 0x0D, 0x80, // ## ##
1948 + 0x0D, 0x80, // ## ##
1949 + 0x07, 0x00, // ###
1950 + 0x07, 0x00, // ###
1951 + 0x00, 0x00, //
1952 + 0x00, 0x00, //
1953 + 0x00, 0x00, //
1954 + 0x00, 0x00, //
1955 + 0x00, 0x00, //
1956 + 0x00, 0x00, //
1957 +
1958 + // @3480 'w' (14 pixels wide)
1959 + 0x00, 0x00, //
1960 + 0x00, 0x00, //
1961 + 0x00, 0x00, //
1962 + 0x00, 0x00, //
1963 + 0x00, 0x00, //
1964 + 0x78, 0xF0, // #### ####
1965 + 0x78, 0xF0, // #### ####
1966 + 0x32, 0x60, // ## # ##
1967 + 0x32, 0x60, // ## # ##
1968 + 0x37, 0xE0, // ## ######
1969 + 0x1D, 0xC0, // ### ###
1970 + 0x1D, 0xC0, // ### ###
1971 + 0x18, 0xC0, // ## ##
1972 + 0x18, 0xC0, // ## ##
1973 + 0x00, 0x00, //
1974 + 0x00, 0x00, //
1975 + 0x00, 0x00, //
1976 + 0x00, 0x00, //
1977 + 0x00, 0x00, //
1978 + 0x00, 0x00, //
1979 +
1980 + // @3520 'x' (14 pixels wide)
1981 + 0x00, 0x00, //
1982 + 0x00, 0x00, //
1983 + 0x00, 0x00, //
1984 + 0x00, 0x00, //
1985 + 0x00, 0x00, //
1986 + 0x3C, 0xF0, // #### ####
1987 + 0x3C, 0xF0, // #### ####
1988 + 0x0C, 0xC0, // ## ##
1989 + 0x07, 0x80, // ####
1990 + 0x03, 0x00, // ##
1991 + 0x07, 0x80, // ####
1992 + 0x0C, 0xC0, // ## ##
1993 + 0x3C, 0xF0, // #### ####
1994 + 0x3C, 0xF0, // #### ####
1995 + 0x00, 0x00, //
1996 + 0x00, 0x00, //
1997 + 0x00, 0x00, //
1998 + 0x00, 0x00, //
1999 + 0x00, 0x00, //
2000 + 0x00, 0x00, //
2001 +
2002 + // @3560 'y' (14 pixels wide)
2003 + 0x00, 0x00, //
2004 + 0x00, 0x00, //
2005 + 0x00, 0x00, //
2006 + 0x00, 0x00, //
2007 + 0x00, 0x00, //
2008 + 0x78, 0xF0, // #### ####
2009 + 0x78, 0xF0, // #### ####
2010 + 0x30, 0x60, // ## ##
2011 + 0x18, 0xC0, // ## ##
2012 + 0x18, 0xC0, // ## ##
2013 + 0x0D, 0x80, // ## ##
2014 + 0x0F, 0x80, // #####
2015 + 0x07, 0x00, // ###
2016 + 0x06, 0x00, // ##
2017 + 0x06, 0x00, // ##
2018 + 0x0C, 0x00, // ##
2019 + 0x7F, 0x00, // #######
2020 + 0x7F, 0x00, // #######
2021 + 0x00, 0x00, //
2022 + 0x00, 0x00, //
2023 +
2024 + // @3600 'z' (14 pixels wide)
2025 + 0x00, 0x00, //
2026 + 0x00, 0x00, //
2027 + 0x00, 0x00, //
2028 + 0x00, 0x00, //
2029 + 0x00, 0x00, //
2030 + 0x1F, 0xE0, // ########
2031 + 0x1F, 0xE0, // ########
2032 + 0x18, 0xC0, // ## ##
2033 + 0x01, 0x80, // ##
2034 + 0x03, 0x00, // ##
2035 + 0x06, 0x00, // ##
2036 + 0x0C, 0x60, // ## ##
2037 + 0x1F, 0xE0, // ########
2038 + 0x1F, 0xE0, // ########
2039 + 0x00, 0x00, //
2040 + 0x00, 0x00, //
2041 + 0x00, 0x00, //
2042 + 0x00, 0x00, //
2043 + 0x00, 0x00, //
2044 + 0x00, 0x00, //
2045 +
2046 + // @3640 '{' (14 pixels wide)
2047 + 0x00, 0x00, //
2048 + 0x01, 0xC0, // ###
2049 + 0x03, 0xC0, // ####
2050 + 0x03, 0x00, // ##
2051 + 0x03, 0x00, // ##
2052 + 0x03, 0x00, // ##
2053 + 0x03, 0x00, // ##
2054 + 0x03, 0x00, // ##
2055 + 0x07, 0x00, // ###
2056 + 0x0E, 0x00, // ###
2057 + 0x07, 0x00, // ###
2058 + 0x03, 0x00, // ##
2059 + 0x03, 0x00, // ##
2060 + 0x03, 0x00, // ##
2061 + 0x03, 0x00, // ##
2062 + 0x03, 0xC0, // ####
2063 + 0x01, 0xC0, // ###
2064 + 0x00, 0x00, //
2065 + 0x00, 0x00, //
2066 + 0x00, 0x00, //
2067 +
2068 + // @3680 '|' (14 pixels wide)
2069 + 0x00, 0x00, //
2070 + 0x03, 0x00, // ##
2071 + 0x03, 0x00, // ##
2072 + 0x03, 0x00, // ##
2073 + 0x03, 0x00, // ##
2074 + 0x03, 0x00, // ##
2075 + 0x03, 0x00, // ##
2076 + 0x03, 0x00, // ##
2077 + 0x03, 0x00, // ##
2078 + 0x03, 0x00, // ##
2079 + 0x03, 0x00, // ##
2080 + 0x03, 0x00, // ##
2081 + 0x03, 0x00, // ##
2082 + 0x03, 0x00, // ##
2083 + 0x03, 0x00, // ##
2084 + 0x03, 0x00, // ##
2085 + 0x03, 0x00, // ##
2086 + 0x00, 0x00, //
2087 + 0x00, 0x00, //
2088 + 0x00, 0x00, //
2089 +
2090 + // @3720 '}' (14 pixels wide)
2091 + 0x00, 0x00, //
2092 + 0x1C, 0x00, // ###
2093 + 0x1E, 0x00, // ####
2094 + 0x06, 0x00, // ##
2095 + 0x06, 0x00, // ##
2096 + 0x06, 0x00, // ##
2097 + 0x06, 0x00, // ##
2098 + 0x06, 0x00, // ##
2099 + 0x07, 0x00, // ###
2100 + 0x03, 0x80, // ###
2101 + 0x07, 0x00, // ###
2102 + 0x06, 0x00, // ##
2103 + 0x06, 0x00, // ##
2104 + 0x06, 0x00, // ##
2105 + 0x06, 0x00, // ##
2106 + 0x1E, 0x00, // ####
2107 + 0x1C, 0x00, // ###
2108 + 0x00, 0x00, //
2109 + 0x00, 0x00, //
2110 + 0x00, 0x00, //
2111 +
2112 + // @3760 '~' (14 pixels wide)
2113 + 0x00, 0x00, //
2114 + 0x00, 0x00, //
2115 + 0x00, 0x00, //
2116 + 0x00, 0x00, //
2117 + 0x00, 0x00, //
2118 + 0x00, 0x00, //
2119 + 0x0E, 0x00, // ###
2120 + 0x3F, 0x30, // ###### ##
2121 + 0x33, 0xF0, // ## ######
2122 + 0x01, 0xE0, // ####
2123 + 0x00, 0x00, //
2124 + 0x00, 0x00, //
2125 + 0x00, 0x00, //
2126 + 0x00, 0x00, //
2127 + 0x00, 0x00, //
2128 + 0x00, 0x00, //
2129 + 0x00, 0x00, //
2130 + 0x00, 0x00, //
2131 + 0x00, 0x00, //
2132 + 0x00, 0x00, //
2133 +};
2134 +
2135 +
2136 +sFONT Font20 = {
2137 + Font20_Table,
2138 + 14, /* Width */
2139 + 20, /* Height */
2140 +};
2141 +
2142 +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
1 +/**
2 + ******************************************************************************
3 + * @file font24.c
4 + * @author MCD Application Team
5 + * @version V1.0.0
6 + * @date 18-February-2014
7 + * @brief This file provides text font24 for STM32xx-EVAL's LCD driver.
8 + ******************************************************************************
9 + * @attention
10 + *
11 + * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
12 + *
13 + * Redistribution and use in source and binary forms, with or without modification,
14 + * are permitted provided that the following conditions are met:
15 + * 1. Redistributions of source code must retain the above copyright notice,
16 + * this list of conditions and the following disclaimer.
17 + * 2. Redistributions in binary form must reproduce the above copyright notice,
18 + * this list of conditions and the following disclaimer in the documentation
19 + * and/or other materials provided with the distribution.
20 + * 3. Neither the name of STMicroelectronics nor the names of its contributors
21 + * may be used to endorse or promote products derived from this software
22 + * without specific prior written permission.
23 + *
24 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25 + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27 + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
28 + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30 + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31 + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
32 + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33 + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 + *
35 + ******************************************************************************
36 + */
37 +
38 +/* Includes ------------------------------------------------------------------*/
39 +#include "fonts.h"
40 +
41 +const uint8_t Font24_Table [] =
42 +{
43 + // @0 ' ' (17 pixels wide)
44 + 0x00, 0x00, 0x00, //
45 + 0x00, 0x00, 0x00, //
46 + 0x00, 0x00, 0x00, //
47 + 0x00, 0x00, 0x00, //
48 + 0x00, 0x00, 0x00, //
49 + 0x00, 0x00, 0x00, //
50 + 0x00, 0x00, 0x00, //
51 + 0x00, 0x00, 0x00, //
52 + 0x00, 0x00, 0x00, //
53 + 0x00, 0x00, 0x00, //
54 + 0x00, 0x00, 0x00, //
55 + 0x00, 0x00, 0x00, //
56 + 0x00, 0x00, 0x00, //
57 + 0x00, 0x00, 0x00, //
58 + 0x00, 0x00, 0x00, //
59 + 0x00, 0x00, 0x00, //
60 + 0x00, 0x00, 0x00, //
61 + 0x00, 0x00, 0x00, //
62 + 0x00, 0x00, 0x00, //
63 + 0x00, 0x00, 0x00, //
64 + 0x00, 0x00, 0x00, //
65 + 0x00, 0x00, 0x00, //
66 + 0x00, 0x00, 0x00, //
67 + 0x00, 0x00, 0x00, //
68 +
69 + // @72 '!' (17 pixels wide)
70 + 0x00, 0x00, 0x00, //
71 + 0x00, 0x00, 0x00, //
72 + 0x03, 0x80, 0x00, // ###
73 + 0x03, 0x80, 0x00, // ###
74 + 0x03, 0x80, 0x00, // ###
75 + 0x03, 0x80, 0x00, // ###
76 + 0x03, 0x80, 0x00, // ###
77 + 0x03, 0x80, 0x00, // ###
78 + 0x03, 0x80, 0x00, // ###
79 + 0x03, 0x80, 0x00, // ###
80 + 0x03, 0x80, 0x00, // ###
81 + 0x01, 0x00, 0x00, // #
82 + 0x01, 0x00, 0x00, // #
83 + 0x00, 0x00, 0x00, //
84 + 0x00, 0x00, 0x00, //
85 + 0x03, 0x80, 0x00, // ###
86 + 0x03, 0x80, 0x00, // ###
87 + 0x00, 0x00, 0x00, //
88 + 0x00, 0x00, 0x00, //
89 + 0x00, 0x00, 0x00, //
90 + 0x00, 0x00, 0x00, //
91 + 0x00, 0x00, 0x00, //
92 + 0x00, 0x00, 0x00, //
93 + 0x00, 0x00, 0x00, //
94 +
95 + // @144 '"' (17 pixels wide)
96 + 0x00, 0x00, 0x00, //
97 + 0x00, 0x00, 0x00, //
98 + 0x00, 0x00, 0x00, //
99 + 0x0E, 0x70, 0x00, // ### ###
100 + 0x0E, 0x70, 0x00, // ### ###
101 + 0x0E, 0x70, 0x00, // ### ###
102 + 0x04, 0x20, 0x00, // # #
103 + 0x04, 0x20, 0x00, // # #
104 + 0x04, 0x20, 0x00, // # #
105 + 0x04, 0x20, 0x00, // # #
106 + 0x00, 0x00, 0x00, //
107 + 0x00, 0x00, 0x00, //
108 + 0x00, 0x00, 0x00, //
109 + 0x00, 0x00, 0x00, //
110 + 0x00, 0x00, 0x00, //
111 + 0x00, 0x00, 0x00, //
112 + 0x00, 0x00, 0x00, //
113 + 0x00, 0x00, 0x00, //
114 + 0x00, 0x00, 0x00, //
115 + 0x00, 0x00, 0x00, //
116 + 0x00, 0x00, 0x00, //
117 + 0x00, 0x00, 0x00, //
118 + 0x00, 0x00, 0x00, //
119 + 0x00, 0x00, 0x00, //
120 +
121 + // @216 '#' (17 pixels wide)
122 + 0x00, 0x00, 0x00, //
123 + 0x00, 0x00, 0x00, //
124 + 0x06, 0x60, 0x00, // ## ##
125 + 0x06, 0x60, 0x00, // ## ##
126 + 0x06, 0x60, 0x00, // ## ##
127 + 0x06, 0x60, 0x00, // ## ##
128 + 0x06, 0x60, 0x00, // ## ##
129 + 0x3F, 0xF8, 0x00, // ###########
130 + 0x3F, 0xF8, 0x00, // ###########
131 + 0x06, 0x60, 0x00, // ## ##
132 + 0x0C, 0xC0, 0x00, // ## ##
133 + 0x3F, 0xF8, 0x00, // ###########
134 + 0x3F, 0xF8, 0x00, // ###########
135 + 0x0C, 0xC0, 0x00, // ## ##
136 + 0x0C, 0xC0, 0x00, // ## ##
137 + 0x0C, 0xC0, 0x00, // ## ##
138 + 0x0C, 0xC0, 0x00, // ## ##
139 + 0x0C, 0xC0, 0x00, // ## ##
140 + 0x00, 0x00, 0x00, //
141 + 0x00, 0x00, 0x00, //
142 + 0x00, 0x00, 0x00, //
143 + 0x00, 0x00, 0x00, //
144 + 0x00, 0x00, 0x00, //
145 + 0x00, 0x00, 0x00, //
146 +
147 + // @288 '$' (17 pixels wide)
148 + 0x00, 0x00, 0x00, //
149 + 0x01, 0x80, 0x00, // ##
150 + 0x01, 0x80, 0x00, // ##
151 + 0x07, 0xB0, 0x00, // #### ##
152 + 0x0F, 0xF0, 0x00, // ########
153 + 0x18, 0x70, 0x00, // ## ###
154 + 0x18, 0x70, 0x00, // ## ###
155 + 0x1C, 0x00, 0x00, // ###
156 + 0x0F, 0x80, 0x00, // #####
157 + 0x07, 0xE0, 0x00, // ######
158 + 0x00, 0xF0, 0x00, // ####
159 + 0x18, 0x30, 0x00, // ## ##
160 + 0x1C, 0x30, 0x00, // ### ##
161 + 0x1C, 0x70, 0x00, // ### ###
162 + 0x1F, 0xE0, 0x00, // ########
163 + 0x1B, 0xC0, 0x00, // ## ####
164 + 0x01, 0x80, 0x00, // ##
165 + 0x01, 0x80, 0x00, // ##
166 + 0x01, 0x80, 0x00, // ##
167 + 0x01, 0x80, 0x00, // ##
168 + 0x00, 0x00, 0x00, //
169 + 0x00, 0x00, 0x00, //
170 + 0x00, 0x00, 0x00, //
171 + 0x00, 0x00, 0x00, //
172 +
173 + // @360 '%' (17 pixels wide)
174 + 0x00, 0x00, 0x00, //
175 + 0x00, 0x00, 0x00, //
176 + 0x07, 0x80, 0x00, // ####
177 + 0x0F, 0xC0, 0x00, // ######
178 + 0x1C, 0xE0, 0x00, // ### ###
179 + 0x18, 0x60, 0x00, // ## ##
180 + 0x18, 0x60, 0x00, // ## ##
181 + 0x1C, 0xE0, 0x00, // ### ###
182 + 0x0F, 0xF8, 0x00, // #########
183 + 0x07, 0xE0, 0x00, // ######
184 + 0x1F, 0xF0, 0x00, // #########
185 + 0x07, 0x38, 0x00, // ### ###
186 + 0x06, 0x18, 0x00, // ## ##
187 + 0x06, 0x18, 0x00, // ## ##
188 + 0x07, 0x38, 0x00, // ### ###
189 + 0x03, 0xF0, 0x00, // ######
190 + 0x01, 0xE0, 0x00, // ####
191 + 0x00, 0x00, 0x00, //
192 + 0x00, 0x00, 0x00, //
193 + 0x00, 0x00, 0x00, //
194 + 0x00, 0x00, 0x00, //
195 + 0x00, 0x00, 0x00, //
196 + 0x00, 0x00, 0x00, //
197 + 0x00, 0x00, 0x00, //
198 +
199 + // @432 '&' (17 pixels wide)
200 + 0x00, 0x00, 0x00, //
201 + 0x00, 0x00, 0x00, //
202 + 0x00, 0x00, 0x00, //
203 + 0x00, 0x00, 0x00, //
204 + 0x03, 0xF0, 0x00, // ######
205 + 0x07, 0xF0, 0x00, // #######
206 + 0x0C, 0x60, 0x00, // ## ##
207 + 0x0C, 0x00, 0x00, // ##
208 + 0x0C, 0x00, 0x00, // ##
209 + 0x06, 0x00, 0x00, // ##
210 + 0x07, 0x00, 0x00, // ###
211 + 0x0F, 0x9C, 0x00, // ##### ###
212 + 0x1D, 0xFC, 0x00, // ### #######
213 + 0x18, 0xF0, 0x00, // ## ####
214 + 0x18, 0x70, 0x00, // ## ###
215 + 0x0F, 0xFC, 0x00, // ##########
216 + 0x07, 0xDC, 0x00, // ##### ###
217 + 0x00, 0x00, 0x00, //
218 + 0x00, 0x00, 0x00, //
219 + 0x00, 0x00, 0x00, //
220 + 0x00, 0x00, 0x00, //
221 + 0x00, 0x00, 0x00, //
222 + 0x00, 0x00, 0x00, //
223 + 0x00, 0x00, 0x00, //
224 +
225 + // @504 ''' (17 pixels wide)
226 + 0x00, 0x00, 0x00, //
227 + 0x00, 0x00, 0x00, //
228 + 0x00, 0x00, 0x00, //
229 + 0x03, 0x80, 0x00, // ###
230 + 0x03, 0x80, 0x00, // ###
231 + 0x03, 0x80, 0x00, // ###
232 + 0x01, 0x00, 0x00, // #
233 + 0x01, 0x00, 0x00, // #
234 + 0x01, 0x00, 0x00, // #
235 + 0x01, 0x00, 0x00, // #
236 + 0x00, 0x00, 0x00, //
237 + 0x00, 0x00, 0x00, //
238 + 0x00, 0x00, 0x00, //
239 + 0x00, 0x00, 0x00, //
240 + 0x00, 0x00, 0x00, //
241 + 0x00, 0x00, 0x00, //
242 + 0x00, 0x00, 0x00, //
243 + 0x00, 0x00, 0x00, //
244 + 0x00, 0x00, 0x00, //
245 + 0x00, 0x00, 0x00, //
246 + 0x00, 0x00, 0x00, //
247 + 0x00, 0x00, 0x00, //
248 + 0x00, 0x00, 0x00, //
249 + 0x00, 0x00, 0x00, //
250 +
251 + // @576 '(' (17 pixels wide)
252 + 0x00, 0x00, 0x00, //
253 + 0x00, 0x00, 0x00, //
254 + 0x00, 0x18, 0x00, // ##
255 + 0x00, 0x38, 0x00, // ###
256 + 0x00, 0x70, 0x00, // ###
257 + 0x00, 0xF0, 0x00, // ####
258 + 0x00, 0xE0, 0x00, // ###
259 + 0x00, 0xE0, 0x00, // ###
260 + 0x01, 0xC0, 0x00, // ###
261 + 0x01, 0xC0, 0x00, // ###
262 + 0x01, 0xC0, 0x00, // ###
263 + 0x01, 0xC0, 0x00, // ###
264 + 0x01, 0xC0, 0x00, // ###
265 + 0x01, 0xC0, 0x00, // ###
266 + 0x00, 0xE0, 0x00, // ###
267 + 0x00, 0xE0, 0x00, // ###
268 + 0x00, 0x70, 0x00, // ###
269 + 0x00, 0x70, 0x00, // ###
270 + 0x00, 0x38, 0x00, // ###
271 + 0x00, 0x18, 0x00, // ##
272 + 0x00, 0x00, 0x00, //
273 + 0x00, 0x00, 0x00, //
274 + 0x00, 0x00, 0x00, //
275 + 0x00, 0x00, 0x00, //
276 +
277 + // @648 ')' (17 pixels wide)
278 + 0x00, 0x00, 0x00, //
279 + 0x00, 0x00, 0x00, //
280 + 0x18, 0x00, 0x00, // ##
281 + 0x1C, 0x00, 0x00, // ###
282 + 0x0E, 0x00, 0x00, // ###
283 + 0x0E, 0x00, 0x00, // ###
284 + 0x07, 0x00, 0x00, // ###
285 + 0x07, 0x00, 0x00, // ###
286 + 0x03, 0x80, 0x00, // ###
287 + 0x03, 0x80, 0x00, // ###
288 + 0x03, 0x80, 0x00, // ###
289 + 0x03, 0x80, 0x00, // ###
290 + 0x03, 0x80, 0x00, // ###
291 + 0x03, 0x80, 0x00, // ###
292 + 0x07, 0x00, 0x00, // ###
293 + 0x07, 0x00, 0x00, // ###
294 + 0x0F, 0x00, 0x00, // ####
295 + 0x0E, 0x00, 0x00, // ###
296 + 0x1C, 0x00, 0x00, // ###
297 + 0x18, 0x00, 0x00, // ##
298 + 0x00, 0x00, 0x00, //
299 + 0x00, 0x00, 0x00, //
300 + 0x00, 0x00, 0x00, //
301 + 0x00, 0x00, 0x00, //
302 +
303 + // @720 '*' (17 pixels wide)
304 + 0x00, 0x00, 0x00, //
305 + 0x00, 0x00, 0x00, //
306 + 0x01, 0x80, 0x00, // ##
307 + 0x01, 0x80, 0x00, // ##
308 + 0x01, 0x80, 0x00, // ##
309 + 0x1D, 0xB8, 0x00, // ### ## ###
310 + 0x1F, 0xF8, 0x00, // ##########
311 + 0x07, 0xE0, 0x00, // ######
312 + 0x03, 0xC0, 0x00, // ####
313 + 0x03, 0xC0, 0x00, // ####
314 + 0x06, 0x60, 0x00, // ## ##
315 + 0x06, 0x60, 0x00, // ## ##
316 + 0x00, 0x00, 0x00, //
317 + 0x00, 0x00, 0x00, //
318 + 0x00, 0x00, 0x00, //
319 + 0x00, 0x00, 0x00, //
320 + 0x00, 0x00, 0x00, //
321 + 0x00, 0x00, 0x00, //
322 + 0x00, 0x00, 0x00, //
323 + 0x00, 0x00, 0x00, //
324 + 0x00, 0x00, 0x00, //
325 + 0x00, 0x00, 0x00, //
326 + 0x00, 0x00, 0x00, //
327 + 0x00, 0x00, 0x00, //
328 +
329 + // @792 '+' (17 pixels wide)
330 + 0x00, 0x00, 0x00, //
331 + 0x00, 0x00, 0x00, //
332 + 0x00, 0x00, 0x00, //
333 + 0x00, 0x00, 0x00, //
334 + 0x01, 0x80, 0x00, // ##
335 + 0x01, 0x80, 0x00, // ##
336 + 0x01, 0x80, 0x00, // ##
337 + 0x01, 0x80, 0x00, // ##
338 + 0x01, 0x80, 0x00, // ##
339 + 0x3F, 0xFC, 0x00, // ############
340 + 0x3F, 0xFC, 0x00, // ############
341 + 0x01, 0x80, 0x00, // ##
342 + 0x01, 0x80, 0x00, // ##
343 + 0x01, 0x80, 0x00, // ##
344 + 0x01, 0x80, 0x00, // ##
345 + 0x01, 0x80, 0x00, // ##
346 + 0x00, 0x00, 0x00, //
347 + 0x00, 0x00, 0x00, //
348 + 0x00, 0x00, 0x00, //
349 + 0x00, 0x00, 0x00, //
350 + 0x00, 0x00, 0x00, //
351 + 0x00, 0x00, 0x00, //
352 + 0x00, 0x00, 0x00, //
353 + 0x00, 0x00, 0x00, //
354 +
355 + // @864 ',' (17 pixels wide)
356 + 0x00, 0x00, 0x00, //
357 + 0x00, 0x00, 0x00, //
358 + 0x00, 0x00, 0x00, //
359 + 0x00, 0x00, 0x00, //
360 + 0x00, 0x00, 0x00, //
361 + 0x00, 0x00, 0x00, //
362 + 0x00, 0x00, 0x00, //
363 + 0x00, 0x00, 0x00, //
364 + 0x00, 0x00, 0x00, //
365 + 0x00, 0x00, 0x00, //
366 + 0x00, 0x00, 0x00, //
367 + 0x00, 0x00, 0x00, //
368 + 0x00, 0x00, 0x00, //
369 + 0x00, 0x00, 0x00, //
370 + 0x00, 0xE0, 0x00, // ###
371 + 0x00, 0xC0, 0x00, // ##
372 + 0x01, 0xC0, 0x00, // ###
373 + 0x01, 0x80, 0x00, // ##
374 + 0x01, 0x80, 0x00, // ##
375 + 0x03, 0x00, 0x00, // ##
376 + 0x03, 0x00, 0x00, // ##
377 + 0x00, 0x00, 0x00, //
378 + 0x00, 0x00, 0x00, //
379 + 0x00, 0x00, 0x00, //
380 +
381 + // @936 '-' (17 pixels wide)
382 + 0x00, 0x00, 0x00, //
383 + 0x00, 0x00, 0x00, //
384 + 0x00, 0x00, 0x00, //
385 + 0x00, 0x00, 0x00, //
386 + 0x00, 0x00, 0x00, //
387 + 0x00, 0x00, 0x00, //
388 + 0x00, 0x00, 0x00, //
389 + 0x00, 0x00, 0x00, //
390 + 0x00, 0x00, 0x00, //
391 + 0x1F, 0xF8, 0x00, // ##########
392 + 0x1F, 0xF8, 0x00, // ##########
393 + 0x00, 0x00, 0x00, //
394 + 0x00, 0x00, 0x00, //
395 + 0x00, 0x00, 0x00, //
396 + 0x00, 0x00, 0x00, //
397 + 0x00, 0x00, 0x00, //
398 + 0x00, 0x00, 0x00, //
399 + 0x00, 0x00, 0x00, //
400 + 0x00, 0x00, 0x00, //
401 + 0x00, 0x00, 0x00, //
402 + 0x00, 0x00, 0x00, //
403 + 0x00, 0x00, 0x00, //
404 + 0x00, 0x00, 0x00, //
405 + 0x00, 0x00, 0x00, //
406 +
407 + // @1008 '.' (17 pixels wide)
408 + 0x00, 0x00, 0x00, //
409 + 0x00, 0x00, 0x00, //
410 + 0x00, 0x00, 0x00, //
411 + 0x00, 0x00, 0x00, //
412 + 0x00, 0x00, 0x00, //
413 + 0x00, 0x00, 0x00, //
414 + 0x00, 0x00, 0x00, //
415 + 0x00, 0x00, 0x00, //
416 + 0x00, 0x00, 0x00, //
417 + 0x00, 0x00, 0x00, //
418 + 0x00, 0x00, 0x00, //
419 + 0x00, 0x00, 0x00, //
420 + 0x00, 0x00, 0x00, //
421 + 0x00, 0x00, 0x00, //
422 + 0x03, 0xC0, 0x00, // ####
423 + 0x03, 0xC0, 0x00, // ####
424 + 0x03, 0xC0, 0x00, // ####
425 + 0x00, 0x00, 0x00, //
426 + 0x00, 0x00, 0x00, //
427 + 0x00, 0x00, 0x00, //
428 + 0x00, 0x00, 0x00, //
429 + 0x00, 0x00, 0x00, //
430 + 0x00, 0x00, 0x00, //
431 + 0x00, 0x00, 0x00, //
432 +
433 + // @1080 '/' (17 pixels wide)
434 + 0x00, 0x18, 0x00, // ##
435 + 0x00, 0x18, 0x00, // ##
436 + 0x00, 0x38, 0x00, // ###
437 + 0x00, 0x30, 0x00, // ##
438 + 0x00, 0x70, 0x00, // ###
439 + 0x00, 0x60, 0x00, // ##
440 + 0x00, 0x60, 0x00, // ##
441 + 0x00, 0xC0, 0x00, // ##
442 + 0x00, 0xC0, 0x00, // ##
443 + 0x01, 0x80, 0x00, // ##
444 + 0x01, 0x80, 0x00, // ##
445 + 0x03, 0x00, 0x00, // ##
446 + 0x03, 0x00, 0x00, // ##
447 + 0x06, 0x00, 0x00, // ##
448 + 0x06, 0x00, 0x00, // ##
449 + 0x0E, 0x00, 0x00, // ###
450 + 0x0C, 0x00, 0x00, // ##
451 + 0x1C, 0x00, 0x00, // ###
452 + 0x18, 0x00, 0x00, // ##
453 + 0x18, 0x00, 0x00, // ##
454 + 0x00, 0x00, 0x00, //
455 + 0x00, 0x00, 0x00, //
456 + 0x00, 0x00, 0x00, //
457 + 0x00, 0x00, 0x00, //
458 +
459 + // @1152 '0' (17 pixels wide)
460 + 0x00, 0x00, 0x00, //
461 + 0x00, 0x00, 0x00, //
462 + 0x03, 0xC0, 0x00, // ####
463 + 0x07, 0xE0, 0x00, // ######
464 + 0x0C, 0x30, 0x00, // ## ##
465 + 0x0C, 0x30, 0x00, // ## ##
466 + 0x18, 0x18, 0x00, // ## ##
467 + 0x18, 0x18, 0x00, // ## ##
468 + 0x18, 0x18, 0x00, // ## ##
469 + 0x18, 0x18, 0x00, // ## ##
470 + 0x18, 0x18, 0x00, // ## ##
471 + 0x18, 0x18, 0x00, // ## ##
472 + 0x18, 0x18, 0x00, // ## ##
473 + 0x0C, 0x30, 0x00, // ## ##
474 + 0x0C, 0x30, 0x00, // ## ##
475 + 0x07, 0xE0, 0x00, // ######
476 + 0x03, 0xC0, 0x00, // ####
477 + 0x00, 0x00, 0x00, //
478 + 0x00, 0x00, 0x00, //
479 + 0x00, 0x00, 0x00, //
480 + 0x00, 0x00, 0x00, //
481 + 0x00, 0x00, 0x00, //
482 + 0x00, 0x00, 0x00, //
483 + 0x00, 0x00, 0x00, //
484 +
485 + // @1224 '1' (17 pixels wide)
486 + 0x00, 0x00, 0x00, //
487 + 0x00, 0x00, 0x00, //
488 + 0x00, 0x80, 0x00, // #
489 + 0x07, 0x80, 0x00, // ####
490 + 0x1F, 0x80, 0x00, // ######
491 + 0x1D, 0x80, 0x00, // ### ##
492 + 0x01, 0x80, 0x00, // ##
493 + 0x01, 0x80, 0x00, // ##
494 + 0x01, 0x80, 0x00, // ##
495 + 0x01, 0x80, 0x00, // ##
496 + 0x01, 0x80, 0x00, // ##
497 + 0x01, 0x80, 0x00, // ##
498 + 0x01, 0x80, 0x00, // ##
499 + 0x01, 0x80, 0x00, // ##
500 + 0x01, 0x80, 0x00, // ##
501 + 0x1F, 0xF8, 0x00, // ##########
502 + 0x1F, 0xF8, 0x00, // ##########
503 + 0x00, 0x00, 0x00, //
504 + 0x00, 0x00, 0x00, //
505 + 0x00, 0x00, 0x00, //
506 + 0x00, 0x00, 0x00, //
507 + 0x00, 0x00, 0x00, //
508 + 0x00, 0x00, 0x00, //
509 + 0x00, 0x00, 0x00, //
510 +
511 + // @1296 '2' (17 pixels wide)
512 + 0x00, 0x00, 0x00, //
513 + 0x00, 0x00, 0x00, //
514 + 0x07, 0xC0, 0x00, // #####
515 + 0x1F, 0xF0, 0x00, // #########
516 + 0x38, 0x30, 0x00, // ### ##
517 + 0x30, 0x18, 0x00, // ## ##
518 + 0x30, 0x18, 0x00, // ## ##
519 + 0x00, 0x18, 0x00, // ##
520 + 0x00, 0x30, 0x00, // ##
521 + 0x00, 0x60, 0x00, // ##
522 + 0x01, 0xC0, 0x00, // ###
523 + 0x03, 0x80, 0x00, // ###
524 + 0x06, 0x00, 0x00, // ##
525 + 0x0C, 0x00, 0x00, // ##
526 + 0x18, 0x00, 0x00, // ##
527 + 0x3F, 0xF8, 0x00, // ###########
528 + 0x3F, 0xF8, 0x00, // ###########
529 + 0x00, 0x00, 0x00, //
530 + 0x00, 0x00, 0x00, //
531 + 0x00, 0x00, 0x00, //
532 + 0x00, 0x00, 0x00, //
533 + 0x00, 0x00, 0x00, //
534 + 0x00, 0x00, 0x00, //
535 + 0x00, 0x00, 0x00, //
536 +
537 + // @1368 '3' (17 pixels wide)
538 + 0x00, 0x00, 0x00, //
539 + 0x00, 0x00, 0x00, //
540 + 0x03, 0xC0, 0x00, // ####
541 + 0x0F, 0xE0, 0x00, // #######
542 + 0x0C, 0x70, 0x00, // ## ###
543 + 0x00, 0x30, 0x00, // ##
544 + 0x00, 0x30, 0x00, // ##
545 + 0x00, 0x60, 0x00, // ##
546 + 0x03, 0xC0, 0x00, // ####
547 + 0x03, 0xE0, 0x00, // #####
548 + 0x00, 0x70, 0x00, // ###
549 + 0x00, 0x18, 0x00, // ##
550 + 0x00, 0x18, 0x00, // ##
551 + 0x00, 0x18, 0x00, // ##
552 + 0x18, 0x38, 0x00, // ## ###
553 + 0x1F, 0xF0, 0x00, // #########
554 + 0x0F, 0xC0, 0x00, // ######
555 + 0x00, 0x00, 0x00, //
556 + 0x00, 0x00, 0x00, //
557 + 0x00, 0x00, 0x00, //
558 + 0x00, 0x00, 0x00, //
559 + 0x00, 0x00, 0x00, //
560 + 0x00, 0x00, 0x00, //
561 + 0x00, 0x00, 0x00, //
562 +
563 + // @1440 '4' (17 pixels wide)
564 + 0x00, 0x00, 0x00, //
565 + 0x00, 0x00, 0x00, //
566 + 0x00, 0xE0, 0x00, // ###
567 + 0x01, 0xE0, 0x00, // ####
568 + 0x01, 0xE0, 0x00, // ####
569 + 0x03, 0x60, 0x00, // ## ##
570 + 0x06, 0x60, 0x00, // ## ##
571 + 0x06, 0x60, 0x00, // ## ##
572 + 0x0C, 0x60, 0x00, // ## ##
573 + 0x0C, 0x60, 0x00, // ## ##
574 + 0x18, 0x60, 0x00, // ## ##
575 + 0x30, 0x60, 0x00, // ## ##
576 + 0x3F, 0xF8, 0x00, // ###########
577 + 0x3F, 0xF8, 0x00, // ###########
578 + 0x00, 0x60, 0x00, // ##
579 + 0x03, 0xF8, 0x00, // #######
580 + 0x03, 0xF8, 0x00, // #######
581 + 0x00, 0x00, 0x00, //
582 + 0x00, 0x00, 0x00, //
583 + 0x00, 0x00, 0x00, //
584 + 0x00, 0x00, 0x00, //
585 + 0x00, 0x00, 0x00, //
586 + 0x00, 0x00, 0x00, //
587 + 0x00, 0x00, 0x00, //
588 +
589 + // @1512 '5' (17 pixels wide)
590 + 0x00, 0x00, 0x00, //
591 + 0x00, 0x00, 0x00, //
592 + 0x1F, 0xF0, 0x00, // #########
593 + 0x1F, 0xF0, 0x00, // #########
594 + 0x18, 0x00, 0x00, // ##
595 + 0x18, 0x00, 0x00, // ##
596 + 0x18, 0x00, 0x00, // ##
597 + 0x1B, 0xC0, 0x00, // ## ####
598 + 0x1F, 0xF0, 0x00, // #########
599 + 0x1C, 0x30, 0x00, // ### ##
600 + 0x00, 0x18, 0x00, // ##
601 + 0x00, 0x18, 0x00, // ##
602 + 0x00, 0x18, 0x00, // ##
603 + 0x00, 0x18, 0x00, // ##
604 + 0x30, 0x30, 0x00, // ## ##
605 + 0x3F, 0xF0, 0x00, // ##########
606 + 0x0F, 0xC0, 0x00, // ######
607 + 0x00, 0x00, 0x00, //
608 + 0x00, 0x00, 0x00, //
609 + 0x00, 0x00, 0x00, //
610 + 0x00, 0x00, 0x00, //
611 + 0x00, 0x00, 0x00, //
612 + 0x00, 0x00, 0x00, //
613 + 0x00, 0x00, 0x00, //
614 +
615 + // @1584 '6' (17 pixels wide)
616 + 0x00, 0x00, 0x00, //
617 + 0x00, 0x00, 0x00, //
618 + 0x00, 0xF8, 0x00, // #####
619 + 0x03, 0xF8, 0x00, // #######
620 + 0x07, 0x00, 0x00, // ###
621 + 0x0E, 0x00, 0x00, // ###
622 + 0x0C, 0x00, 0x00, // ##
623 + 0x18, 0x00, 0x00, // ##
624 + 0x1B, 0xC0, 0x00, // ## ####
625 + 0x1F, 0xF0, 0x00, // #########
626 + 0x1C, 0x30, 0x00, // ### ##
627 + 0x18, 0x18, 0x00, // ## ##
628 + 0x18, 0x18, 0x00, // ## ##
629 + 0x18, 0x18, 0x00, // ## ##
630 + 0x0C, 0x38, 0x00, // ## ###
631 + 0x0F, 0xF0, 0x00, // ########
632 + 0x03, 0xE0, 0x00, // #####
633 + 0x00, 0x00, 0x00, //
634 + 0x00, 0x00, 0x00, //
635 + 0x00, 0x00, 0x00, //
636 + 0x00, 0x00, 0x00, //
637 + 0x00, 0x00, 0x00, //
638 + 0x00, 0x00, 0x00, //
639 + 0x00, 0x00, 0x00, //
640 +
641 + // @1656 '7' (17 pixels wide)
642 + 0x00, 0x00, 0x00, //
643 + 0x00, 0x00, 0x00, //
644 + 0x1F, 0xF8, 0x00, // ##########
645 + 0x1F, 0xF8, 0x00, // ##########
646 + 0x18, 0x18, 0x00, // ## ##
647 + 0x18, 0x38, 0x00, // ## ###
648 + 0x00, 0x30, 0x00, // ##
649 + 0x00, 0x30, 0x00, // ##
650 + 0x00, 0x70, 0x00, // ###
651 + 0x00, 0x60, 0x00, // ##
652 + 0x00, 0x60, 0x00, // ##
653 + 0x00, 0xE0, 0x00, // ###
654 + 0x00, 0xC0, 0x00, // ##
655 + 0x00, 0xC0, 0x00, // ##
656 + 0x01, 0xC0, 0x00, // ###
657 + 0x01, 0x80, 0x00, // ##
658 + 0x01, 0x80, 0x00, // ##
659 + 0x00, 0x00, 0x00, //
660 + 0x00, 0x00, 0x00, //
661 + 0x00, 0x00, 0x00, //
662 + 0x00, 0x00, 0x00, //
663 + 0x00, 0x00, 0x00, //
664 + 0x00, 0x00, 0x00, //
665 + 0x00, 0x00, 0x00, //
666 +
667 + // @1728 '8' (17 pixels wide)
668 + 0x00, 0x00, 0x00, //
669 + 0x00, 0x00, 0x00, //
670 + 0x07, 0xE0, 0x00, // ######
671 + 0x0F, 0xF0, 0x00, // ########
672 + 0x1C, 0x38, 0x00, // ### ###
673 + 0x18, 0x18, 0x00, // ## ##
674 + 0x18, 0x18, 0x00, // ## ##
675 + 0x0C, 0x30, 0x00, // ## ##
676 + 0x07, 0xE0, 0x00, // ######
677 + 0x07, 0xE0, 0x00, // ######
678 + 0x0C, 0x30, 0x00, // ## ##
679 + 0x18, 0x18, 0x00, // ## ##
680 + 0x18, 0x18, 0x00, // ## ##
681 + 0x18, 0x18, 0x00, // ## ##
682 + 0x1C, 0x38, 0x00, // ### ###
683 + 0x0F, 0xF0, 0x00, // ########
684 + 0x07, 0xE0, 0x00, // ######
685 + 0x00, 0x00, 0x00, //
686 + 0x00, 0x00, 0x00, //
687 + 0x00, 0x00, 0x00, //
688 + 0x00, 0x00, 0x00, //
689 + 0x00, 0x00, 0x00, //
690 + 0x00, 0x00, 0x00, //
691 + 0x00, 0x00, 0x00, //
692 +
693 + // @1800 '9' (17 pixels wide)
694 + 0x00, 0x00, 0x00, //
695 + 0x00, 0x00, 0x00, //
696 + 0x07, 0xC0, 0x00, // #####
697 + 0x0F, 0xF0, 0x00, // ########
698 + 0x1C, 0x30, 0x00, // ### ##
699 + 0x18, 0x18, 0x00, // ## ##
700 + 0x18, 0x18, 0x00, // ## ##
701 + 0x18, 0x18, 0x00, // ## ##
702 + 0x0C, 0x38, 0x00, // ## ###
703 + 0x0F, 0xF8, 0x00, // #########
704 + 0x03, 0xD8, 0x00, // #### ##
705 + 0x00, 0x18, 0x00, // ##
706 + 0x00, 0x30, 0x00, // ##
707 + 0x00, 0x70, 0x00, // ###
708 + 0x00, 0xE0, 0x00, // ###
709 + 0x1F, 0xC0, 0x00, // #######
710 + 0x1F, 0x00, 0x00, // #####
711 + 0x00, 0x00, 0x00, //
712 + 0x00, 0x00, 0x00, //
713 + 0x00, 0x00, 0x00, //
714 + 0x00, 0x00, 0x00, //
715 + 0x00, 0x00, 0x00, //
716 + 0x00, 0x00, 0x00, //
717 + 0x00, 0x00, 0x00, //
718 +
719 + // @1872 ':' (17 pixels wide)
720 + 0x00, 0x00, 0x00, //
721 + 0x00, 0x00, 0x00, //
722 + 0x00, 0x00, 0x00, //
723 + 0x00, 0x00, 0x00, //
724 + 0x00, 0x00, 0x00, //
725 + 0x00, 0x00, 0x00, //
726 + 0x03, 0xC0, 0x00, // ####
727 + 0x03, 0xC0, 0x00, // ####
728 + 0x03, 0xC0, 0x00, // ####
729 + 0x00, 0x00, 0x00, //
730 + 0x00, 0x00, 0x00, //
731 + 0x00, 0x00, 0x00, //
732 + 0x00, 0x00, 0x00, //
733 + 0x00, 0x00, 0x00, //
734 + 0x03, 0xC0, 0x00, // ####
735 + 0x03, 0xC0, 0x00, // ####
736 + 0x03, 0xC0, 0x00, // ####
737 + 0x00, 0x00, 0x00, //
738 + 0x00, 0x00, 0x00, //
739 + 0x00, 0x00, 0x00, //
740 + 0x00, 0x00, 0x00, //
741 + 0x00, 0x00, 0x00, //
742 + 0x00, 0x00, 0x00, //
743 + 0x00, 0x00, 0x00, //
744 +
745 + // @1944 ';' (17 pixels wide)
746 + 0x00, 0x00, 0x00, //
747 + 0x00, 0x00, 0x00, //
748 + 0x00, 0x00, 0x00, //
749 + 0x00, 0x00, 0x00, //
750 + 0x00, 0x00, 0x00, //
751 + 0x00, 0x00, 0x00, //
752 + 0x00, 0xF0, 0x00, // ####
753 + 0x00, 0xF0, 0x00, // ####
754 + 0x00, 0xF0, 0x00, // ####
755 + 0x00, 0x00, 0x00, //
756 + 0x00, 0x00, 0x00, //
757 + 0x00, 0x00, 0x00, //
758 + 0x00, 0x00, 0x00, //
759 + 0x00, 0xE0, 0x00, // ###
760 + 0x01, 0xC0, 0x00, // ###
761 + 0x01, 0x80, 0x00, // ##
762 + 0x01, 0x80, 0x00, // ##
763 + 0x03, 0x00, 0x00, // ##
764 + 0x02, 0x00, 0x00, // #
765 + 0x00, 0x00, 0x00, //
766 + 0x00, 0x00, 0x00, //
767 + 0x00, 0x00, 0x00, //
768 + 0x00, 0x00, 0x00, //
769 + 0x00, 0x00, 0x00, //
770 +
771 + // @2016 '<' (17 pixels wide)
772 + 0x00, 0x00, 0x00, //
773 + 0x00, 0x00, 0x00, //
774 + 0x00, 0x00, 0x00, //
775 + 0x00, 0x00, 0x00, //
776 + 0x00, 0x1C, 0x00, // ###
777 + 0x00, 0x3C, 0x00, // ####
778 + 0x00, 0xF0, 0x00, // ####
779 + 0x03, 0xC0, 0x00, // ####
780 + 0x0F, 0x00, 0x00, // ####
781 + 0x3C, 0x00, 0x00, // ####
782 + 0xF0, 0x00, 0x00, // ####
783 + 0x3C, 0x00, 0x00, // ####
784 + 0x0F, 0x00, 0x00, // ####
785 + 0x03, 0xC0, 0x00, // ####
786 + 0x00, 0xF0, 0x00, // ####
787 + 0x00, 0x3C, 0x00, // ####
788 + 0x00, 0x1C, 0x00, // ###
789 + 0x00, 0x00, 0x00, //
790 + 0x00, 0x00, 0x00, //
791 + 0x00, 0x00, 0x00, //
792 + 0x00, 0x00, 0x00, //
793 + 0x00, 0x00, 0x00, //
794 + 0x00, 0x00, 0x00, //
795 + 0x00, 0x00, 0x00, //
796 +
797 + // @2088 '=' (17 pixels wide)
798 + 0x00, 0x00, 0x00, //
799 + 0x00, 0x00, 0x00, //
800 + 0x00, 0x00, 0x00, //
801 + 0x00, 0x00, 0x00, //
802 + 0x00, 0x00, 0x00, //
803 + 0x00, 0x00, 0x00, //
804 + 0x00, 0x00, 0x00, //
805 + 0x7F, 0xFC, 0x00, // #############
806 + 0x7F, 0xFC, 0x00, // #############
807 + 0x00, 0x00, 0x00, //
808 + 0x00, 0x00, 0x00, //
809 + 0x7F, 0xFC, 0x00, // #############
810 + 0x7F, 0xFC, 0x00, // #############
811 + 0x00, 0x00, 0x00, //
812 + 0x00, 0x00, 0x00, //
813 + 0x00, 0x00, 0x00, //
814 + 0x00, 0x00, 0x00, //
815 + 0x00, 0x00, 0x00, //
816 + 0x00, 0x00, 0x00, //
817 + 0x00, 0x00, 0x00, //
818 + 0x00, 0x00, 0x00, //
819 + 0x00, 0x00, 0x00, //
820 + 0x00, 0x00, 0x00, //
821 + 0x00, 0x00, 0x00, //
822 +
823 + // @2160 '>' (17 pixels wide)
824 + 0x00, 0x00, 0x00, //
825 + 0x00, 0x00, 0x00, //
826 + 0x00, 0x00, 0x00, //
827 + 0x00, 0x00, 0x00, //
828 + 0x70, 0x00, 0x00, // ###
829 + 0x78, 0x00, 0x00, // ####
830 + 0x1E, 0x00, 0x00, // ####
831 + 0x07, 0x80, 0x00, // ####
832 + 0x01, 0xE0, 0x00, // ####
833 + 0x00, 0x78, 0x00, // ####
834 + 0x00, 0x1E, 0x00, // ####
835 + 0x00, 0x78, 0x00, // ####
836 + 0x01, 0xE0, 0x00, // ####
837 + 0x07, 0x80, 0x00, // ####
838 + 0x1E, 0x00, 0x00, // ####
839 + 0x78, 0x00, 0x00, // ####
840 + 0x70, 0x00, 0x00, // ###
841 + 0x00, 0x00, 0x00, //
842 + 0x00, 0x00, 0x00, //
843 + 0x00, 0x00, 0x00, //
844 + 0x00, 0x00, 0x00, //
845 + 0x00, 0x00, 0x00, //
846 + 0x00, 0x00, 0x00, //
847 + 0x00, 0x00, 0x00, //
848 +
849 + // @2232 '?' (17 pixels wide)
850 + 0x00, 0x00, 0x00, //
851 + 0x00, 0x00, 0x00, //
852 + 0x00, 0x00, 0x00, //
853 + 0x07, 0xC0, 0x00, // #####
854 + 0x0F, 0xE0, 0x00, // #######
855 + 0x18, 0x70, 0x00, // ## ###
856 + 0x18, 0x30, 0x00, // ## ##
857 + 0x18, 0x30, 0x00, // ## ##
858 + 0x00, 0x70, 0x00, // ###
859 + 0x00, 0xE0, 0x00, // ###
860 + 0x03, 0xC0, 0x00, // ####
861 + 0x03, 0x80, 0x00, // ###
862 + 0x03, 0x00, 0x00, // ##
863 + 0x00, 0x00, 0x00, //
864 + 0x00, 0x00, 0x00, //
865 + 0x07, 0x00, 0x00, // ###
866 + 0x07, 0x00, 0x00, // ###
867 + 0x00, 0x00, 0x00, //
868 + 0x00, 0x00, 0x00, //
869 + 0x00, 0x00, 0x00, //
870 + 0x00, 0x00, 0x00, //
871 + 0x00, 0x00, 0x00, //
872 + 0x00, 0x00, 0x00, //
873 + 0x00, 0x00, 0x00, //
874 +
875 + // @2304 '@' (17 pixels wide)
876 + 0x00, 0x00, 0x00, //
877 + 0x00, 0x00, 0x00, //
878 + 0x03, 0xE0, 0x00, // #####
879 + 0x07, 0xF0, 0x00, // #######
880 + 0x0E, 0x38, 0x00, // ### ###
881 + 0x0C, 0x18, 0x00, // ## ##
882 + 0x18, 0x78, 0x00, // ## ####
883 + 0x18, 0xF8, 0x00, // ## #####
884 + 0x19, 0xD8, 0x00, // ## ### ##
885 + 0x19, 0x98, 0x00, // ## ## ##
886 + 0x19, 0x98, 0x00, // ## ## ##
887 + 0x19, 0x98, 0x00, // ## ## ##
888 + 0x18, 0xF8, 0x00, // ## #####
889 + 0x18, 0x78, 0x00, // ## ####
890 + 0x18, 0x00, 0x00, // ##
891 + 0x0C, 0x00, 0x00, // ##
892 + 0x0E, 0x18, 0x00, // ### ##
893 + 0x07, 0xF8, 0x00, // ########
894 + 0x03, 0xE0, 0x00, // #####
895 + 0x00, 0x00, 0x00, //
896 + 0x00, 0x00, 0x00, //
897 + 0x00, 0x00, 0x00, //
898 + 0x00, 0x00, 0x00, //
899 + 0x00, 0x00, 0x00, //
900 +
901 + // @2376 'A' (17 pixels wide)
902 + 0x00, 0x00, 0x00, //
903 + 0x00, 0x00, 0x00, //
904 + 0x00, 0x00, 0x00, //
905 + 0x1F, 0x80, 0x00, // ######
906 + 0x1F, 0xC0, 0x00, // #######
907 + 0x01, 0xC0, 0x00, // ###
908 + 0x03, 0x60, 0x00, // ## ##
909 + 0x03, 0x60, 0x00, // ## ##
910 + 0x06, 0x30, 0x00, // ## ##
911 + 0x06, 0x30, 0x00, // ## ##
912 + 0x0C, 0x30, 0x00, // ## ##
913 + 0x0F, 0xF8, 0x00, // #########
914 + 0x1F, 0xF8, 0x00, // ##########
915 + 0x18, 0x0C, 0x00, // ## ##
916 + 0x30, 0x0C, 0x00, // ## ##
917 + 0xFC, 0x7F, 0x00, // ###### #######
918 + 0xFC, 0x7F, 0x00, // ###### #######
919 + 0x00, 0x00, 0x00, //
920 + 0x00, 0x00, 0x00, //
921 + 0x00, 0x00, 0x00, //
922 + 0x00, 0x00, 0x00, //
923 + 0x00, 0x00, 0x00, //
924 + 0x00, 0x00, 0x00, //
925 + 0x00, 0x00, 0x00, //
926 +
927 + // @2448 'B' (17 pixels wide)
928 + 0x00, 0x00, 0x00, //
929 + 0x00, 0x00, 0x00, //
930 + 0x00, 0x00, 0x00, //
931 + 0x7F, 0xE0, 0x00, // ##########
932 + 0x7F, 0xF0, 0x00, // ###########
933 + 0x18, 0x38, 0x00, // ## ###
934 + 0x18, 0x18, 0x00, // ## ##
935 + 0x18, 0x18, 0x00, // ## ##
936 + 0x18, 0x38, 0x00, // ## ###
937 + 0x1F, 0xF0, 0x00, // #########
938 + 0x1F, 0xF8, 0x00, // ##########
939 + 0x18, 0x1C, 0x00, // ## ###
940 + 0x18, 0x0C, 0x00, // ## ##
941 + 0x18, 0x0C, 0x00, // ## ##
942 + 0x18, 0x0C, 0x00, // ## ##
943 + 0x7F, 0xF8, 0x00, // ############
944 + 0x7F, 0xF0, 0x00, // ###########
945 + 0x00, 0x00, 0x00, //
946 + 0x00, 0x00, 0x00, //
947 + 0x00, 0x00, 0x00, //
948 + 0x00, 0x00, 0x00, //
949 + 0x00, 0x00, 0x00, //
950 + 0x00, 0x00, 0x00, //
951 + 0x00, 0x00, 0x00, //
952 +
953 + // @2520 'C' (17 pixels wide)
954 + 0x00, 0x00, 0x00, //
955 + 0x00, 0x00, 0x00, //
956 + 0x00, 0x00, 0x00, //
957 + 0x03, 0xEC, 0x00, // ##### ##
958 + 0x0F, 0xFC, 0x00, // ##########
959 + 0x1C, 0x1C, 0x00, // ### ###
960 + 0x18, 0x0C, 0x00, // ## ##
961 + 0x30, 0x0C, 0x00, // ## ##
962 + 0x30, 0x00, 0x00, // ##
963 + 0x30, 0x00, 0x00, // ##
964 + 0x30, 0x00, 0x00, // ##
965 + 0x30, 0x00, 0x00, // ##
966 + 0x30, 0x00, 0x00, // ##
967 + 0x18, 0x0C, 0x00, // ## ##
968 + 0x1C, 0x1C, 0x00, // ### ###
969 + 0x0F, 0xF8, 0x00, // #########
970 + 0x03, 0xF0, 0x00, // ######
971 + 0x00, 0x00, 0x00, //
972 + 0x00, 0x00, 0x00, //
973 + 0x00, 0x00, 0x00, //
974 + 0x00, 0x00, 0x00, //
975 + 0x00, 0x00, 0x00, //
976 + 0x00, 0x00, 0x00, //
977 + 0x00, 0x00, 0x00, //
978 +
979 + // @2592 'D' (17 pixels wide)
980 + 0x00, 0x00, 0x00, //
981 + 0x00, 0x00, 0x00, //
982 + 0x00, 0x00, 0x00, //
983 + 0x7F, 0xC0, 0x00, // #########
984 + 0x7F, 0xF0, 0x00, // ###########
985 + 0x18, 0x38, 0x00, // ## ###
986 + 0x18, 0x18, 0x00, // ## ##
987 + 0x18, 0x0C, 0x00, // ## ##
988 + 0x18, 0x0C, 0x00, // ## ##
989 + 0x18, 0x0C, 0x00, // ## ##
990 + 0x18, 0x0C, 0x00, // ## ##
991 + 0x18, 0x0C, 0x00, // ## ##
992 + 0x18, 0x0C, 0x00, // ## ##
993 + 0x18, 0x18, 0x00, // ## ##
994 + 0x18, 0x38, 0x00, // ## ###
995 + 0x7F, 0xF0, 0x00, // ###########
996 + 0x7F, 0xE0, 0x00, // ##########
997 + 0x00, 0x00, 0x00, //
998 + 0x00, 0x00, 0x00, //
999 + 0x00, 0x00, 0x00, //
1000 + 0x00, 0x00, 0x00, //
1001 + 0x00, 0x00, 0x00, //
1002 + 0x00, 0x00, 0x00, //
1003 + 0x00, 0x00, 0x00, //
1004 +
1005 + // @2664 'E' (17 pixels wide)
1006 + 0x00, 0x00, 0x00, //
1007 + 0x00, 0x00, 0x00, //
1008 + 0x00, 0x00, 0x00, //
1009 + 0x7F, 0xF8, 0x00, // ############
1010 + 0x7F, 0xF8, 0x00, // ############
1011 + 0x18, 0x18, 0x00, // ## ##
1012 + 0x18, 0x18, 0x00, // ## ##
1013 + 0x19, 0x98, 0x00, // ## ## ##
1014 + 0x19, 0x80, 0x00, // ## ##
1015 + 0x1F, 0x80, 0x00, // ######
1016 + 0x1F, 0x80, 0x00, // ######
1017 + 0x19, 0x80, 0x00, // ## ##
1018 + 0x19, 0x98, 0x00, // ## ## ##
1019 + 0x18, 0x18, 0x00, // ## ##
1020 + 0x18, 0x18, 0x00, // ## ##
1021 + 0x7F, 0xF8, 0x00, // ############
1022 + 0x7F, 0xF8, 0x00, // ############
1023 + 0x00, 0x00, 0x00, //
1024 + 0x00, 0x00, 0x00, //
1025 + 0x00, 0x00, 0x00, //
1026 + 0x00, 0x00, 0x00, //
1027 + 0x00, 0x00, 0x00, //
1028 + 0x00, 0x00, 0x00, //
1029 + 0x00, 0x00, 0x00, //
1030 +
1031 + // @2736 'F' (17 pixels wide)
1032 + 0x00, 0x00, 0x00, //
1033 + 0x00, 0x00, 0x00, //
1034 + 0x00, 0x00, 0x00, //
1035 + 0x3F, 0xFC, 0x00, // ############
1036 + 0x3F, 0xFC, 0x00, // ############
1037 + 0x0C, 0x0C, 0x00, // ## ##
1038 + 0x0C, 0x0C, 0x00, // ## ##
1039 + 0x0C, 0xCC, 0x00, // ## ## ##
1040 + 0x0C, 0xC0, 0x00, // ## ##
1041 + 0x0F, 0xC0, 0x00, // ######
1042 + 0x0F, 0xC0, 0x00, // ######
1043 + 0x0C, 0xC0, 0x00, // ## ##
1044 + 0x0C, 0xC0, 0x00, // ## ##
1045 + 0x0C, 0x00, 0x00, // ##
1046 + 0x0C, 0x00, 0x00, // ##
1047 + 0x3F, 0xC0, 0x00, // ########
1048 + 0x3F, 0xC0, 0x00, // ########
1049 + 0x00, 0x00, 0x00, //
1050 + 0x00, 0x00, 0x00, //
1051 + 0x00, 0x00, 0x00, //
1052 + 0x00, 0x00, 0x00, //
1053 + 0x00, 0x00, 0x00, //
1054 + 0x00, 0x00, 0x00, //
1055 + 0x00, 0x00, 0x00, //
1056 +
1057 + // @2808 'G' (17 pixels wide)
1058 + 0x00, 0x00, 0x00, //
1059 + 0x00, 0x00, 0x00, //
1060 + 0x00, 0x00, 0x00, //
1061 + 0x03, 0xEC, 0x00, // ##### ##
1062 + 0x0F, 0xFC, 0x00, // ##########
1063 + 0x1C, 0x1C, 0x00, // ### ###
1064 + 0x18, 0x0C, 0x00, // ## ##
1065 + 0x30, 0x0C, 0x00, // ## ##
1066 + 0x30, 0x00, 0x00, // ##
1067 + 0x30, 0x00, 0x00, // ##
1068 + 0x30, 0xFE, 0x00, // ## #######
1069 + 0x30, 0xFE, 0x00, // ## #######
1070 + 0x30, 0x0C, 0x00, // ## ##
1071 + 0x38, 0x0C, 0x00, // ### ##
1072 + 0x1C, 0x1C, 0x00, // ### ###
1073 + 0x0F, 0xFC, 0x00, // ##########
1074 + 0x03, 0xF0, 0x00, // ######
1075 + 0x00, 0x00, 0x00, //
1076 + 0x00, 0x00, 0x00, //
1077 + 0x00, 0x00, 0x00, //
1078 + 0x00, 0x00, 0x00, //
1079 + 0x00, 0x00, 0x00, //
1080 + 0x00, 0x00, 0x00, //
1081 + 0x00, 0x00, 0x00, //
1082 +
1083 + // @2880 'H' (17 pixels wide)
1084 + 0x00, 0x00, 0x00, //
1085 + 0x00, 0x00, 0x00, //
1086 + 0x00, 0x00, 0x00, //
1087 + 0x7E, 0x7E, 0x00, // ###### ######
1088 + 0x7E, 0x7E, 0x00, // ###### ######
1089 + 0x18, 0x18, 0x00, // ## ##
1090 + 0x18, 0x18, 0x00, // ## ##
1091 + 0x18, 0x18, 0x00, // ## ##
1092 + 0x18, 0x18, 0x00, // ## ##
1093 + 0x1F, 0xF8, 0x00, // ##########
1094 + 0x1F, 0xF8, 0x00, // ##########
1095 + 0x18, 0x18, 0x00, // ## ##
1096 + 0x18, 0x18, 0x00, // ## ##
1097 + 0x18, 0x18, 0x00, // ## ##
1098 + 0x18, 0x18, 0x00, // ## ##
1099 + 0x7E, 0x7E, 0x00, // ###### ######
1100 + 0x7E, 0x7E, 0x00, // ###### ######
1101 + 0x00, 0x00, 0x00, //
1102 + 0x00, 0x00, 0x00, //
1103 + 0x00, 0x00, 0x00, //
1104 + 0x00, 0x00, 0x00, //
1105 + 0x00, 0x00, 0x00, //
1106 + 0x00, 0x00, 0x00, //
1107 + 0x00, 0x00, 0x00, //
1108 +
1109 + // @2952 'I' (17 pixels wide)
1110 + 0x00, 0x00, 0x00, //
1111 + 0x00, 0x00, 0x00, //
1112 + 0x00, 0x00, 0x00, //
1113 + 0x1F, 0xF8, 0x00, // ##########
1114 + 0x1F, 0xF8, 0x00, // ##########
1115 + 0x01, 0x80, 0x00, // ##
1116 + 0x01, 0x80, 0x00, // ##
1117 + 0x01, 0x80, 0x00, // ##
1118 + 0x01, 0x80, 0x00, // ##
1119 + 0x01, 0x80, 0x00, // ##
1120 + 0x01, 0x80, 0x00, // ##
1121 + 0x01, 0x80, 0x00, // ##
1122 + 0x01, 0x80, 0x00, // ##
1123 + 0x01, 0x80, 0x00, // ##
1124 + 0x01, 0x80, 0x00, // ##
1125 + 0x1F, 0xF8, 0x00, // ##########
1126 + 0x1F, 0xF8, 0x00, // ##########
1127 + 0x00, 0x00, 0x00, //
1128 + 0x00, 0x00, 0x00, //
1129 + 0x00, 0x00, 0x00, //
1130 + 0x00, 0x00, 0x00, //
1131 + 0x00, 0x00, 0x00, //
1132 + 0x00, 0x00, 0x00, //
1133 + 0x00, 0x00, 0x00, //
1134 +
1135 + // @3024 'J' (17 pixels wide)
1136 + 0x00, 0x00, 0x00, //
1137 + 0x00, 0x00, 0x00, //
1138 + 0x00, 0x00, 0x00, //
1139 + 0x07, 0xFE, 0x00, // ##########
1140 + 0x07, 0xFE, 0x00, // ##########
1141 + 0x00, 0x30, 0x00, // ##
1142 + 0x00, 0x30, 0x00, // ##
1143 + 0x00, 0x30, 0x00, // ##
1144 + 0x00, 0x30, 0x00, // ##
1145 + 0x00, 0x30, 0x00, // ##
1146 + 0x30, 0x30, 0x00, // ## ##
1147 + 0x30, 0x30, 0x00, // ## ##
1148 + 0x30, 0x30, 0x00, // ## ##
1149 + 0x30, 0x30, 0x00, // ## ##
1150 + 0x30, 0x60, 0x00, // ## ##
1151 + 0x3F, 0xE0, 0x00, // #########
1152 + 0x0F, 0x80, 0x00, // #####
1153 + 0x00, 0x00, 0x00, //
1154 + 0x00, 0x00, 0x00, //
1155 + 0x00, 0x00, 0x00, //
1156 + 0x00, 0x00, 0x00, //
1157 + 0x00, 0x00, 0x00, //
1158 + 0x00, 0x00, 0x00, //
1159 + 0x00, 0x00, 0x00, //
1160 +
1161 + // @3096 'K' (17 pixels wide)
1162 + 0x00, 0x00, 0x00, //
1163 + 0x00, 0x00, 0x00, //
1164 + 0x00, 0x00, 0x00, //
1165 + 0x7F, 0x3E, 0x00, // ####### #####
1166 + 0x7F, 0x3E, 0x00, // ####### #####
1167 + 0x18, 0x30, 0x00, // ## ##
1168 + 0x18, 0x60, 0x00, // ## ##
1169 + 0x18, 0xC0, 0x00, // ## ##
1170 + 0x19, 0x80, 0x00, // ## ##
1171 + 0x1B, 0x80, 0x00, // ## ###
1172 + 0x1F, 0xC0, 0x00, // #######
1173 + 0x1C, 0xE0, 0x00, // ### ###
1174 + 0x18, 0x70, 0x00, // ## ###
1175 + 0x18, 0x30, 0x00, // ## ##
1176 + 0x18, 0x38, 0x00, // ## ###
1177 + 0x7F, 0x1F, 0x00, // ####### #####
1178 + 0x7F, 0x1F, 0x00, // ####### #####
1179 + 0x00, 0x00, 0x00, //
1180 + 0x00, 0x00, 0x00, //
1181 + 0x00, 0x00, 0x00, //
1182 + 0x00, 0x00, 0x00, //
1183 + 0x00, 0x00, 0x00, //
1184 + 0x00, 0x00, 0x00, //
1185 + 0x00, 0x00, 0x00, //
1186 +
1187 + // @3168 'L' (17 pixels wide)
1188 + 0x00, 0x00, 0x00, //
1189 + 0x00, 0x00, 0x00, //
1190 + 0x00, 0x00, 0x00, //
1191 + 0x7F, 0x80, 0x00, // ########
1192 + 0x7F, 0x80, 0x00, // ########
1193 + 0x0C, 0x00, 0x00, // ##
1194 + 0x0C, 0x00, 0x00, // ##
1195 + 0x0C, 0x00, 0x00, // ##
1196 + 0x0C, 0x00, 0x00, // ##
1197 + 0x0C, 0x00, 0x00, // ##
1198 + 0x0C, 0x00, 0x00, // ##
1199 + 0x0C, 0x0C, 0x00, // ## ##
1200 + 0x0C, 0x0C, 0x00, // ## ##
1201 + 0x0C, 0x0C, 0x00, // ## ##
1202 + 0x0C, 0x0C, 0x00, // ## ##
1203 + 0x7F, 0xFC, 0x00, // #############
1204 + 0x7F, 0xFC, 0x00, // #############
1205 + 0x00, 0x00, 0x00, //
1206 + 0x00, 0x00, 0x00, //
1207 + 0x00, 0x00, 0x00, //
1208 + 0x00, 0x00, 0x00, //
1209 + 0x00, 0x00, 0x00, //
1210 + 0x00, 0x00, 0x00, //
1211 + 0x00, 0x00, 0x00, //
1212 +
1213 + // @3240 'M' (17 pixels wide)
1214 + 0x00, 0x00, 0x00, //
1215 + 0x00, 0x00, 0x00, //
1216 + 0x00, 0x00, 0x00, //
1217 + 0xF0, 0x0F, 0x00, // #### ####
1218 + 0xF8, 0x1F, 0x00, // ##### #####
1219 + 0x38, 0x1C, 0x00, // ### ###
1220 + 0x3C, 0x3C, 0x00, // #### ####
1221 + 0x3C, 0x3C, 0x00, // #### ####
1222 + 0x36, 0x6C, 0x00, // ## ## ## ##
1223 + 0x36, 0x6C, 0x00, // ## ## ## ##
1224 + 0x33, 0xCC, 0x00, // ## #### ##
1225 + 0x33, 0xCC, 0x00, // ## #### ##
1226 + 0x31, 0x8C, 0x00, // ## ## ##
1227 + 0x30, 0x0C, 0x00, // ## ##
1228 + 0x30, 0x0C, 0x00, // ## ##
1229 + 0xFE, 0x7F, 0x00, // ####### #######
1230 + 0xFE, 0x7F, 0x00, // ####### #######
1231 + 0x00, 0x00, 0x00, //
1232 + 0x00, 0x00, 0x00, //
1233 + 0x00, 0x00, 0x00, //
1234 + 0x00, 0x00, 0x00, //
1235 + 0x00, 0x00, 0x00, //
1236 + 0x00, 0x00, 0x00, //
1237 + 0x00, 0x00, 0x00, //
1238 +
1239 + // @3312 'N' (17 pixels wide)
1240 + 0x00, 0x00, 0x00, //
1241 + 0x00, 0x00, 0x00, //
1242 + 0x00, 0x00, 0x00, //
1243 + 0x78, 0xFE, 0x00, // #### #######
1244 + 0x78, 0xFE, 0x00, // #### #######
1245 + 0x1C, 0x18, 0x00, // ### ##
1246 + 0x1E, 0x18, 0x00, // #### ##
1247 + 0x1F, 0x18, 0x00, // ##### ##
1248 + 0x1B, 0x18, 0x00, // ## ## ##
1249 + 0x1B, 0x98, 0x00, // ## ### ##
1250 + 0x19, 0xD8, 0x00, // ## ### ##
1251 + 0x18, 0xD8, 0x00, // ## ## ##
1252 + 0x18, 0xF8, 0x00, // ## #####
1253 + 0x18, 0x78, 0x00, // ## ####
1254 + 0x18, 0x38, 0x00, // ## ###
1255 + 0x7F, 0x18, 0x00, // ####### ##
1256 + 0x7F, 0x18, 0x00, // ####### ##
1257 + 0x00, 0x00, 0x00, //
1258 + 0x00, 0x00, 0x00, //
1259 + 0x00, 0x00, 0x00, //
1260 + 0x00, 0x00, 0x00, //
1261 + 0x00, 0x00, 0x00, //
1262 + 0x00, 0x00, 0x00, //
1263 + 0x00, 0x00, 0x00, //
1264 +
1265 + // @3384 'O' (17 pixels wide)
1266 + 0x00, 0x00, 0x00, //
1267 + 0x00, 0x00, 0x00, //
1268 + 0x00, 0x00, 0x00, //
1269 + 0x03, 0xC0, 0x00, // ####
1270 + 0x0F, 0xF0, 0x00, // ########
1271 + 0x1C, 0x38, 0x00, // ### ###
1272 + 0x18, 0x18, 0x00, // ## ##
1273 + 0x38, 0x1C, 0x00, // ### ###
1274 + 0x30, 0x0C, 0x00, // ## ##
1275 + 0x30, 0x0C, 0x00, // ## ##
1276 + 0x30, 0x0C, 0x00, // ## ##
1277 + 0x30, 0x0C, 0x00, // ## ##
1278 + 0x38, 0x1C, 0x00, // ### ###
1279 + 0x18, 0x18, 0x00, // ## ##
1280 + 0x1C, 0x38, 0x00, // ### ###
1281 + 0x0F, 0xF0, 0x00, // ########
1282 + 0x03, 0xC0, 0x00, // ####
1283 + 0x00, 0x00, 0x00, //
1284 + 0x00, 0x00, 0x00, //
1285 + 0x00, 0x00, 0x00, //
1286 + 0x00, 0x00, 0x00, //
1287 + 0x00, 0x00, 0x00, //
1288 + 0x00, 0x00, 0x00, //
1289 + 0x00, 0x00, 0x00, //
1290 +
1291 + // @3456 'P' (17 pixels wide)
1292 + 0x00, 0x00, 0x00, //
1293 + 0x00, 0x00, 0x00, //
1294 + 0x00, 0x00, 0x00, //
1295 + 0x3F, 0xF0, 0x00, // ##########
1296 + 0x3F, 0xF8, 0x00, // ###########
1297 + 0x0C, 0x1C, 0x00, // ## ###
1298 + 0x0C, 0x0C, 0x00, // ## ##
1299 + 0x0C, 0x0C, 0x00, // ## ##
1300 + 0x0C, 0x0C, 0x00, // ## ##
1301 + 0x0C, 0x18, 0x00, // ## ##
1302 + 0x0F, 0xF8, 0x00, // #########
1303 + 0x0F, 0xE0, 0x00, // #######
1304 + 0x0C, 0x00, 0x00, // ##
1305 + 0x0C, 0x00, 0x00, // ##
1306 + 0x0C, 0x00, 0x00, // ##
1307 + 0x3F, 0xC0, 0x00, // ########
1308 + 0x3F, 0xC0, 0x00, // ########
1309 + 0x00, 0x00, 0x00, //
1310 + 0x00, 0x00, 0x00, //
1311 + 0x00, 0x00, 0x00, //
1312 + 0x00, 0x00, 0x00, //
1313 + 0x00, 0x00, 0x00, //
1314 + 0x00, 0x00, 0x00, //
1315 + 0x00, 0x00, 0x00, //
1316 +
1317 + // @3528 'Q' (17 pixels wide)
1318 + 0x00, 0x00, 0x00, //
1319 + 0x00, 0x00, 0x00, //
1320 + 0x00, 0x00, 0x00, //
1321 + 0x03, 0xC0, 0x00, // ####
1322 + 0x0F, 0xF0, 0x00, // ########
1323 + 0x1C, 0x38, 0x00, // ### ###
1324 + 0x18, 0x18, 0x00, // ## ##
1325 + 0x38, 0x1C, 0x00, // ### ###
1326 + 0x30, 0x0C, 0x00, // ## ##
1327 + 0x30, 0x0C, 0x00, // ## ##
1328 + 0x30, 0x0C, 0x00, // ## ##
1329 + 0x30, 0x0C, 0x00, // ## ##
1330 + 0x38, 0x1C, 0x00, // ### ###
1331 + 0x18, 0x18, 0x00, // ## ##
1332 + 0x1C, 0x38, 0x00, // ### ###
1333 + 0x0F, 0xF0, 0x00, // ########
1334 + 0x07, 0xC0, 0x00, // #####
1335 + 0x07, 0xCC, 0x00, // ##### ##
1336 + 0x0F, 0xFC, 0x00, // ##########
1337 + 0x0C, 0x38, 0x00, // ## ###
1338 + 0x00, 0x00, 0x00, //
1339 + 0x00, 0x00, 0x00, //
1340 + 0x00, 0x00, 0x00, //
1341 + 0x00, 0x00, 0x00, //
1342 +
1343 + // @3600 'R' (17 pixels wide)
1344 + 0x00, 0x00, 0x00, //
1345 + 0x00, 0x00, 0x00, //
1346 + 0x00, 0x00, 0x00, //
1347 + 0x7F, 0xE0, 0x00, // ##########
1348 + 0x7F, 0xF0, 0x00, // ###########
1349 + 0x18, 0x38, 0x00, // ## ###
1350 + 0x18, 0x18, 0x00, // ## ##
1351 + 0x18, 0x18, 0x00, // ## ##
1352 + 0x18, 0x38, 0x00, // ## ###
1353 + 0x1F, 0xF0, 0x00, // #########
1354 + 0x1F, 0xC0, 0x00, // #######
1355 + 0x18, 0xE0, 0x00, // ## ###
1356 + 0x18, 0x70, 0x00, // ## ###
1357 + 0x18, 0x30, 0x00, // ## ##
1358 + 0x18, 0x38, 0x00, // ## ###
1359 + 0x7F, 0x1E, 0x00, // ####### ####
1360 + 0x7F, 0x0E, 0x00, // ####### ###
1361 + 0x00, 0x00, 0x00, //
1362 + 0x00, 0x00, 0x00, //
1363 + 0x00, 0x00, 0x00, //
1364 + 0x00, 0x00, 0x00, //
1365 + 0x00, 0x00, 0x00, //
1366 + 0x00, 0x00, 0x00, //
1367 + 0x00, 0x00, 0x00, //
1368 +
1369 + // @3672 'S' (17 pixels wide)
1370 + 0x00, 0x00, 0x00, //
1371 + 0x00, 0x00, 0x00, //
1372 + 0x00, 0x00, 0x00, //
1373 + 0x07, 0xD8, 0x00, // ##### ##
1374 + 0x0F, 0xF8, 0x00, // #########
1375 + 0x1C, 0x38, 0x00, // ### ###
1376 + 0x18, 0x18, 0x00, // ## ##
1377 + 0x18, 0x18, 0x00, // ## ##
1378 + 0x1E, 0x00, 0x00, // ####
1379 + 0x0F, 0xC0, 0x00, // ######
1380 + 0x03, 0xF0, 0x00, // ######
1381 + 0x00, 0x78, 0x00, // ####
1382 + 0x18, 0x18, 0x00, // ## ##
1383 + 0x18, 0x18, 0x00, // ## ##
1384 + 0x1C, 0x38, 0x00, // ### ###
1385 + 0x1F, 0xF0, 0x00, // #########
1386 + 0x1B, 0xE0, 0x00, // ## #####
1387 + 0x00, 0x00, 0x00, //
1388 + 0x00, 0x00, 0x00, //
1389 + 0x00, 0x00, 0x00, //
1390 + 0x00, 0x00, 0x00, //
1391 + 0x00, 0x00, 0x00, //
1392 + 0x00, 0x00, 0x00, //
1393 + 0x00, 0x00, 0x00, //
1394 +
1395 + // @3744 'T' (17 pixels wide)
1396 + 0x00, 0x00, 0x00, //
1397 + 0x00, 0x00, 0x00, //
1398 + 0x00, 0x00, 0x00, //
1399 + 0x3F, 0xFC, 0x00, // ############
1400 + 0x3F, 0xFC, 0x00, // ############
1401 + 0x31, 0x8C, 0x00, // ## ## ##
1402 + 0x31, 0x8C, 0x00, // ## ## ##
1403 + 0x31, 0x8C, 0x00, // ## ## ##
1404 + 0x31, 0x8C, 0x00, // ## ## ##
1405 + 0x01, 0x80, 0x00, // ##
1406 + 0x01, 0x80, 0x00, // ##
1407 + 0x01, 0x80, 0x00, // ##
1408 + 0x01, 0x80, 0x00, // ##
1409 + 0x01, 0x80, 0x00, // ##
1410 + 0x01, 0x80, 0x00, // ##
1411 + 0x0F, 0xF0, 0x00, // ########
1412 + 0x0F, 0xF0, 0x00, // ########
1413 + 0x00, 0x00, 0x00, //
1414 + 0x00, 0x00, 0x00, //
1415 + 0x00, 0x00, 0x00, //
1416 + 0x00, 0x00, 0x00, //
1417 + 0x00, 0x00, 0x00, //
1418 + 0x00, 0x00, 0x00, //
1419 + 0x00, 0x00, 0x00, //
1420 +
1421 + // @3816 'U' (17 pixels wide)
1422 + 0x00, 0x00, 0x00, //
1423 + 0x00, 0x00, 0x00, //
1424 + 0x00, 0x00, 0x00, //
1425 + 0x7E, 0x7E, 0x00, // ###### ######
1426 + 0x7E, 0x7E, 0x00, // ###### ######
1427 + 0x18, 0x18, 0x00, // ## ##
1428 + 0x18, 0x18, 0x00, // ## ##
1429 + 0x18, 0x18, 0x00, // ## ##
1430 + 0x18, 0x18, 0x00, // ## ##
1431 + 0x18, 0x18, 0x00, // ## ##
1432 + 0x18, 0x18, 0x00, // ## ##
1433 + 0x18, 0x18, 0x00, // ## ##
1434 + 0x18, 0x18, 0x00, // ## ##
1435 + 0x18, 0x18, 0x00, // ## ##
1436 + 0x0C, 0x30, 0x00, // ## ##
1437 + 0x0F, 0xF0, 0x00, // ########
1438 + 0x03, 0xC0, 0x00, // ####
1439 + 0x00, 0x00, 0x00, //
1440 + 0x00, 0x00, 0x00, //
1441 + 0x00, 0x00, 0x00, //
1442 + 0x00, 0x00, 0x00, //
1443 + 0x00, 0x00, 0x00, //
1444 + 0x00, 0x00, 0x00, //
1445 + 0x00, 0x00, 0x00, //
1446 +
1447 + // @3888 'V' (17 pixels wide)
1448 + 0x00, 0x00, 0x00, //
1449 + 0x00, 0x00, 0x00, //
1450 + 0x00, 0x00, 0x00, //
1451 + 0x7F, 0x7F, 0x00, // ####### #######
1452 + 0x7F, 0x7F, 0x00, // ####### #######
1453 + 0x18, 0x0C, 0x00, // ## ##
1454 + 0x0C, 0x18, 0x00, // ## ##
1455 + 0x0C, 0x18, 0x00, // ## ##
1456 + 0x0C, 0x18, 0x00, // ## ##
1457 + 0x06, 0x30, 0x00, // ## ##
1458 + 0x06, 0x30, 0x00, // ## ##
1459 + 0x03, 0x60, 0x00, // ## ##
1460 + 0x03, 0x60, 0x00, // ## ##
1461 + 0x03, 0x60, 0x00, // ## ##
1462 + 0x01, 0xC0, 0x00, // ###
1463 + 0x01, 0xC0, 0x00, // ###
1464 + 0x00, 0x80, 0x00, // #
1465 + 0x00, 0x00, 0x00, //
1466 + 0x00, 0x00, 0x00, //
1467 + 0x00, 0x00, 0x00, //
1468 + 0x00, 0x00, 0x00, //
1469 + 0x00, 0x00, 0x00, //
1470 + 0x00, 0x00, 0x00, //
1471 + 0x00, 0x00, 0x00, //
1472 +
1473 + // @3960 'W' (17 pixels wide)
1474 + 0x00, 0x00, 0x00, //
1475 + 0x00, 0x00, 0x00, //
1476 + 0x00, 0x00, 0x00, //
1477 + 0xFE, 0x3F, 0x80, // ####### #######
1478 + 0xFE, 0x3F, 0x80, // ####### #######
1479 + 0x30, 0x06, 0x00, // ## ##
1480 + 0x30, 0x06, 0x00, // ## ##
1481 + 0x30, 0x86, 0x00, // ## # ##
1482 + 0x19, 0xCC, 0x00, // ## ### ##
1483 + 0x19, 0xCC, 0x00, // ## ### ##
1484 + 0x1B, 0x6C, 0x00, // ## ## ## ##
1485 + 0x1B, 0x6C, 0x00, // ## ## ## ##
1486 + 0x1E, 0x7C, 0x00, // #### #####
1487 + 0x0E, 0x38, 0x00, // ### ###
1488 + 0x0E, 0x38, 0x00, // ### ###
1489 + 0x0C, 0x18, 0x00, // ## ##
1490 + 0x0C, 0x18, 0x00, // ## ##
1491 + 0x00, 0x00, 0x00, //
1492 + 0x00, 0x00, 0x00, //
1493 + 0x00, 0x00, 0x00, //
1494 + 0x00, 0x00, 0x00, //
1495 + 0x00, 0x00, 0x00, //
1496 + 0x00, 0x00, 0x00, //
1497 + 0x00, 0x00, 0x00, //
1498 +
1499 + // @4032 'X' (17 pixels wide)
1500 + 0x00, 0x00, 0x00, //
1501 + 0x00, 0x00, 0x00, //
1502 + 0x00, 0x00, 0x00, //
1503 + 0x7E, 0x7E, 0x00, // ###### ######
1504 + 0x7E, 0x7E, 0x00, // ###### ######
1505 + 0x18, 0x18, 0x00, // ## ##
1506 + 0x0C, 0x30, 0x00, // ## ##
1507 + 0x06, 0x60, 0x00, // ## ##
1508 + 0x03, 0xC0, 0x00, // ####
1509 + 0x01, 0x80, 0x00, // ##
1510 + 0x01, 0x80, 0x00, // ##
1511 + 0x03, 0xC0, 0x00, // ####
1512 + 0x06, 0x60, 0x00, // ## ##
1513 + 0x0C, 0x30, 0x00, // ## ##
1514 + 0x18, 0x18, 0x00, // ## ##
1515 + 0x7E, 0x7E, 0x00, // ###### ######
1516 + 0x7E, 0x7E, 0x00, // ###### ######
1517 + 0x00, 0x00, 0x00, //
1518 + 0x00, 0x00, 0x00, //
1519 + 0x00, 0x00, 0x00, //
1520 + 0x00, 0x00, 0x00, //
1521 + 0x00, 0x00, 0x00, //
1522 + 0x00, 0x00, 0x00, //
1523 + 0x00, 0x00, 0x00, //
1524 +
1525 + // @4104 'Y' (17 pixels wide)
1526 + 0x00, 0x00, 0x00, //
1527 + 0x00, 0x00, 0x00, //
1528 + 0x00, 0x00, 0x00, //
1529 + 0x7C, 0x7E, 0x00, // ##### ######
1530 + 0x7C, 0x7E, 0x00, // ##### ######
1531 + 0x18, 0x18, 0x00, // ## ##
1532 + 0x0C, 0x30, 0x00, // ## ##
1533 + 0x06, 0x60, 0x00, // ## ##
1534 + 0x06, 0x60, 0x00, // ## ##
1535 + 0x03, 0xC0, 0x00, // ####
1536 + 0x01, 0x80, 0x00, // ##
1537 + 0x01, 0x80, 0x00, // ##
1538 + 0x01, 0x80, 0x00, // ##
1539 + 0x01, 0x80, 0x00, // ##
1540 + 0x01, 0x80, 0x00, // ##
1541 + 0x0F, 0xF0, 0x00, // ########
1542 + 0x0F, 0xF0, 0x00, // ########
1543 + 0x00, 0x00, 0x00, //
1544 + 0x00, 0x00, 0x00, //
1545 + 0x00, 0x00, 0x00, //
1546 + 0x00, 0x00, 0x00, //
1547 + 0x00, 0x00, 0x00, //
1548 + 0x00, 0x00, 0x00, //
1549 + 0x00, 0x00, 0x00, //
1550 +
1551 + // @4176 'Z' (17 pixels wide)
1552 + 0x00, 0x00, 0x00, //
1553 + 0x00, 0x00, 0x00, //
1554 + 0x00, 0x00, 0x00, //
1555 + 0x1F, 0xF8, 0x00, // ##########
1556 + 0x1F, 0xF8, 0x00, // ##########
1557 + 0x18, 0x18, 0x00, // ## ##
1558 + 0x18, 0x30, 0x00, // ## ##
1559 + 0x18, 0x60, 0x00, // ## ##
1560 + 0x18, 0xC0, 0x00, // ## ##
1561 + 0x01, 0x80, 0x00, // ##
1562 + 0x03, 0x00, 0x00, // ##
1563 + 0x06, 0x18, 0x00, // ## ##
1564 + 0x0C, 0x18, 0x00, // ## ##
1565 + 0x18, 0x18, 0x00, // ## ##
1566 + 0x30, 0x18, 0x00, // ## ##
1567 + 0x3F, 0xF8, 0x00, // ###########
1568 + 0x3F, 0xF8, 0x00, // ###########
1569 + 0x00, 0x00, 0x00, //
1570 + 0x00, 0x00, 0x00, //
1571 + 0x00, 0x00, 0x00, //
1572 + 0x00, 0x00, 0x00, //
1573 + 0x00, 0x00, 0x00, //
1574 + 0x00, 0x00, 0x00, //
1575 + 0x00, 0x00, 0x00, //
1576 +
1577 + // @4248 '[' (17 pixels wide)
1578 + 0x00, 0x00, 0x00, //
1579 + 0x00, 0x00, 0x00, //
1580 + 0x01, 0xF0, 0x00, // #####
1581 + 0x01, 0xF0, 0x00, // #####
1582 + 0x01, 0x80, 0x00, // ##
1583 + 0x01, 0x80, 0x00, // ##
1584 + 0x01, 0x80, 0x00, // ##
1585 + 0x01, 0x80, 0x00, // ##
1586 + 0x01, 0x80, 0x00, // ##
1587 + 0x01, 0x80, 0x00, // ##
1588 + 0x01, 0x80, 0x00, // ##
1589 + 0x01, 0x80, 0x00, // ##
1590 + 0x01, 0x80, 0x00, // ##
1591 + 0x01, 0x80, 0x00, // ##
1592 + 0x01, 0x80, 0x00, // ##
1593 + 0x01, 0x80, 0x00, // ##
1594 + 0x01, 0x80, 0x00, // ##
1595 + 0x01, 0x80, 0x00, // ##
1596 + 0x01, 0xF0, 0x00, // #####
1597 + 0x01, 0xF0, 0x00, // #####
1598 + 0x00, 0x00, 0x00, //
1599 + 0x00, 0x00, 0x00, //
1600 + 0x00, 0x00, 0x00, //
1601 + 0x00, 0x00, 0x00, //
1602 +
1603 + // @4320 '\' (17 pixels wide)
1604 + 0x18, 0x00, 0x00, // ##
1605 + 0x18, 0x00, 0x00, // ##
1606 + 0x1C, 0x00, 0x00, // ###
1607 + 0x0C, 0x00, 0x00, // ##
1608 + 0x0E, 0x00, 0x00, // ###
1609 + 0x06, 0x00, 0x00, // ##
1610 + 0x06, 0x00, 0x00, // ##
1611 + 0x03, 0x00, 0x00, // ##
1612 + 0x03, 0x00, 0x00, // ##
1613 + 0x01, 0x80, 0x00, // ##
1614 + 0x01, 0x80, 0x00, // ##
1615 + 0x00, 0xC0, 0x00, // ##
1616 + 0x00, 0xC0, 0x00, // ##
1617 + 0x00, 0x60, 0x00, // ##
1618 + 0x00, 0x60, 0x00, // ##
1619 + 0x00, 0x70, 0x00, // ###
1620 + 0x00, 0x30, 0x00, // ##
1621 + 0x00, 0x38, 0x00, // ###
1622 + 0x00, 0x18, 0x00, // ##
1623 + 0x00, 0x18, 0x00, // ##
1624 + 0x00, 0x00, 0x00, //
1625 + 0x00, 0x00, 0x00, //
1626 + 0x00, 0x00, 0x00, //
1627 + 0x00, 0x00, 0x00, //
1628 +
1629 + // @4392 ']' (17 pixels wide)
1630 + 0x00, 0x00, 0x00, //
1631 + 0x00, 0x00, 0x00, //
1632 + 0x0F, 0x80, 0x00, // #####
1633 + 0x0F, 0x80, 0x00, // #####
1634 + 0x01, 0x80, 0x00, // ##
1635 + 0x01, 0x80, 0x00, // ##
1636 + 0x01, 0x80, 0x00, // ##
1637 + 0x01, 0x80, 0x00, // ##
1638 + 0x01, 0x80, 0x00, // ##
1639 + 0x01, 0x80, 0x00, // ##
1640 + 0x01, 0x80, 0x00, // ##
1641 + 0x01, 0x80, 0x00, // ##
1642 + 0x01, 0x80, 0x00, // ##
1643 + 0x01, 0x80, 0x00, // ##
1644 + 0x01, 0x80, 0x00, // ##
1645 + 0x01, 0x80, 0x00, // ##
1646 + 0x01, 0x80, 0x00, // ##
1647 + 0x01, 0x80, 0x00, // ##
1648 + 0x0F, 0x80, 0x00, // #####
1649 + 0x0F, 0x80, 0x00, // #####
1650 + 0x00, 0x00, 0x00, //
1651 + 0x00, 0x00, 0x00, //
1652 + 0x00, 0x00, 0x00, //
1653 + 0x00, 0x00, 0x00, //
1654 +
1655 + // @4464 '^' (17 pixels wide)
1656 + 0x00, 0x00, 0x00, //
1657 + 0x00, 0x80, 0x00, // #
1658 + 0x01, 0xC0, 0x00, // ###
1659 + 0x03, 0xE0, 0x00, // #####
1660 + 0x07, 0x70, 0x00, // ### ###
1661 + 0x06, 0x30, 0x00, // ## ##
1662 + 0x0C, 0x18, 0x00, // ## ##
1663 + 0x18, 0x0C, 0x00, // ## ##
1664 + 0x10, 0x04, 0x00, // # #
1665 + 0x00, 0x00, 0x00, //
1666 + 0x00, 0x00, 0x00, //
1667 + 0x00, 0x00, 0x00, //
1668 + 0x00, 0x00, 0x00, //
1669 + 0x00, 0x00, 0x00, //
1670 + 0x00, 0x00, 0x00, //
1671 + 0x00, 0x00, 0x00, //
1672 + 0x00, 0x00, 0x00, //
1673 + 0x00, 0x00, 0x00, //
1674 + 0x00, 0x00, 0x00, //
1675 + 0x00, 0x00, 0x00, //
1676 + 0x00, 0x00, 0x00, //
1677 + 0x00, 0x00, 0x00, //
1678 + 0x00, 0x00, 0x00, //
1679 + 0x00, 0x00, 0x00, //
1680 +
1681 + // @4536 '_' (17 pixels wide)
1682 + 0x00, 0x00, 0x00, //
1683 + 0x00, 0x00, 0x00, //
1684 + 0x00, 0x00, 0x00, //
1685 + 0x00, 0x00, 0x00, //
1686 + 0x00, 0x00, 0x00, //
1687 + 0x00, 0x00, 0x00, //
1688 + 0x00, 0x00, 0x00, //
1689 + 0x00, 0x00, 0x00, //
1690 + 0x00, 0x00, 0x00, //
1691 + 0x00, 0x00, 0x00, //
1692 + 0x00, 0x00, 0x00, //
1693 + 0x00, 0x00, 0x00, //
1694 + 0x00, 0x00, 0x00, //
1695 + 0x00, 0x00, 0x00, //
1696 + 0x00, 0x00, 0x00, //
1697 + 0x00, 0x00, 0x00, //
1698 + 0x00, 0x00, 0x00, //
1699 + 0x00, 0x00, 0x00, //
1700 + 0x00, 0x00, 0x00, //
1701 + 0x00, 0x00, 0x00, //
1702 + 0x00, 0x00, 0x00, //
1703 + 0x00, 0x00, 0x00, //
1704 + 0xFF, 0xFF, 0x00, // ################
1705 + 0xFF, 0xFF, 0x00, // ################
1706 +
1707 + // @4608 '`' (17 pixels wide)
1708 + 0x00, 0x00, 0x00, //
1709 + 0x03, 0x00, 0x00, // ##
1710 + 0x03, 0x80, 0x00, // ###
1711 + 0x00, 0xE0, 0x00, // ###
1712 + 0x00, 0x60, 0x00, // ##
1713 + 0x00, 0x00, 0x00, //
1714 + 0x00, 0x00, 0x00, //
1715 + 0x00, 0x00, 0x00, //
1716 + 0x00, 0x00, 0x00, //
1717 + 0x00, 0x00, 0x00, //
1718 + 0x00, 0x00, 0x00, //
1719 + 0x00, 0x00, 0x00, //
1720 + 0x00, 0x00, 0x00, //
1721 + 0x00, 0x00, 0x00, //
1722 + 0x00, 0x00, 0x00, //
1723 + 0x00, 0x00, 0x00, //
1724 + 0x00, 0x00, 0x00, //
1725 + 0x00, 0x00, 0x00, //
1726 + 0x00, 0x00, 0x00, //
1727 + 0x00, 0x00, 0x00, //
1728 + 0x00, 0x00, 0x00, //
1729 + 0x00, 0x00, 0x00, //
1730 + 0x00, 0x00, 0x00, //
1731 + 0x00, 0x00, 0x00, //
1732 +
1733 + // @4680 'a' (17 pixels wide)
1734 + 0x00, 0x00, 0x00, //
1735 + 0x00, 0x00, 0x00, //
1736 + 0x00, 0x00, 0x00, //
1737 + 0x00, 0x00, 0x00, //
1738 + 0x00, 0x00, 0x00, //
1739 + 0x00, 0x00, 0x00, //
1740 + 0x0F, 0xC0, 0x00, // ######
1741 + 0x1F, 0xE0, 0x00, // ########
1742 + 0x00, 0x30, 0x00, // ##
1743 + 0x00, 0x30, 0x00, // ##
1744 + 0x07, 0xF0, 0x00, // #######
1745 + 0x1F, 0xF0, 0x00, // #########
1746 + 0x38, 0x30, 0x00, // ### ##
1747 + 0x30, 0x30, 0x00, // ## ##
1748 + 0x30, 0x70, 0x00, // ## ###
1749 + 0x1F, 0xFC, 0x00, // ###########
1750 + 0x0F, 0xBC, 0x00, // ##### ####
1751 + 0x00, 0x00, 0x00, //
1752 + 0x00, 0x00, 0x00, //
1753 + 0x00, 0x00, 0x00, //
1754 + 0x00, 0x00, 0x00, //
1755 + 0x00, 0x00, 0x00, //
1756 + 0x00, 0x00, 0x00, //
1757 + 0x00, 0x00, 0x00, //
1758 +
1759 + // @4752 'b' (17 pixels wide)
1760 + 0x00, 0x00, 0x00, //
1761 + 0x00, 0x00, 0x00, //
1762 + 0x78, 0x00, 0x00, // ####
1763 + 0x78, 0x00, 0x00, // ####
1764 + 0x18, 0x00, 0x00, // ##
1765 + 0x18, 0x00, 0x00, // ##
1766 + 0x1B, 0xE0, 0x00, // ## #####
1767 + 0x1F, 0xF8, 0x00, // ##########
1768 + 0x1C, 0x18, 0x00, // ### ##
1769 + 0x18, 0x0C, 0x00, // ## ##
1770 + 0x18, 0x0C, 0x00, // ## ##
1771 + 0x18, 0x0C, 0x00, // ## ##
1772 + 0x18, 0x0C, 0x00, // ## ##
1773 + 0x18, 0x0C, 0x00, // ## ##
1774 + 0x1C, 0x18, 0x00, // ### ##
1775 + 0x7F, 0xF8, 0x00, // ############
1776 + 0x7B, 0xE0, 0x00, // #### #####
1777 + 0x00, 0x00, 0x00, //
1778 + 0x00, 0x00, 0x00, //
1779 + 0x00, 0x00, 0x00, //
1780 + 0x00, 0x00, 0x00, //
1781 + 0x00, 0x00, 0x00, //
1782 + 0x00, 0x00, 0x00, //
1783 + 0x00, 0x00, 0x00, //
1784 +
1785 + // @4824 'c' (17 pixels wide)
1786 + 0x00, 0x00, 0x00, //
1787 + 0x00, 0x00, 0x00, //
1788 + 0x00, 0x00, 0x00, //
1789 + 0x00, 0x00, 0x00, //
1790 + 0x00, 0x00, 0x00, //
1791 + 0x00, 0x00, 0x00, //
1792 + 0x03, 0xEC, 0x00, // ##### ##
1793 + 0x0F, 0xFC, 0x00, // ##########
1794 + 0x1C, 0x1C, 0x00, // ### ###
1795 + 0x38, 0x0C, 0x00, // ### ##
1796 + 0x30, 0x0C, 0x00, // ## ##
1797 + 0x30, 0x00, 0x00, // ##
1798 + 0x30, 0x00, 0x00, // ##
1799 + 0x38, 0x0C, 0x00, // ### ##
1800 + 0x1C, 0x1C, 0x00, // ### ###
1801 + 0x0F, 0xF8, 0x00, // #########
1802 + 0x03, 0xF0, 0x00, // ######
1803 + 0x00, 0x00, 0x00, //
1804 + 0x00, 0x00, 0x00, //
1805 + 0x00, 0x00, 0x00, //
1806 + 0x00, 0x00, 0x00, //
1807 + 0x00, 0x00, 0x00, //
1808 + 0x00, 0x00, 0x00, //
1809 + 0x00, 0x00, 0x00, //
1810 +
1811 + // @4896 'd' (17 pixels wide)
1812 + 0x00, 0x00, 0x00, //
1813 + 0x00, 0x00, 0x00, //
1814 + 0x00, 0x78, 0x00, // ####
1815 + 0x00, 0x78, 0x00, // ####
1816 + 0x00, 0x18, 0x00, // ##
1817 + 0x00, 0x18, 0x00, // ##
1818 + 0x07, 0xD8, 0x00, // ##### ##
1819 + 0x1F, 0xF8, 0x00, // ##########
1820 + 0x18, 0x38, 0x00, // ## ###
1821 + 0x30, 0x18, 0x00, // ## ##
1822 + 0x30, 0x18, 0x00, // ## ##
1823 + 0x30, 0x18, 0x00, // ## ##
1824 + 0x30, 0x18, 0x00, // ## ##
1825 + 0x30, 0x18, 0x00, // ## ##
1826 + 0x18, 0x38, 0x00, // ## ###
1827 + 0x1F, 0xFE, 0x00, // ############
1828 + 0x07, 0xDE, 0x00, // ##### ####
1829 + 0x00, 0x00, 0x00, //
1830 + 0x00, 0x00, 0x00, //
1831 + 0x00, 0x00, 0x00, //
1832 + 0x00, 0x00, 0x00, //
1833 + 0x00, 0x00, 0x00, //
1834 + 0x00, 0x00, 0x00, //
1835 + 0x00, 0x00, 0x00, //
1836 +
1837 + // @4968 'e' (17 pixels wide)
1838 + 0x00, 0x00, 0x00, //
1839 + 0x00, 0x00, 0x00, //
1840 + 0x00, 0x00, 0x00, //
1841 + 0x00, 0x00, 0x00, //
1842 + 0x00, 0x00, 0x00, //
1843 + 0x00, 0x00, 0x00, //
1844 + 0x07, 0xE0, 0x00, // ######
1845 + 0x1F, 0xF8, 0x00, // ##########
1846 + 0x18, 0x18, 0x00, // ## ##
1847 + 0x30, 0x0C, 0x00, // ## ##
1848 + 0x3F, 0xFC, 0x00, // ############
1849 + 0x3F, 0xFC, 0x00, // ############
1850 + 0x30, 0x00, 0x00, // ##
1851 + 0x30, 0x00, 0x00, // ##
1852 + 0x18, 0x0C, 0x00, // ## ##
1853 + 0x1F, 0xFC, 0x00, // ###########
1854 + 0x07, 0xF0, 0x00, // #######
1855 + 0x00, 0x00, 0x00, //
1856 + 0x00, 0x00, 0x00, //
1857 + 0x00, 0x00, 0x00, //
1858 + 0x00, 0x00, 0x00, //
1859 + 0x00, 0x00, 0x00, //
1860 + 0x00, 0x00, 0x00, //
1861 + 0x00, 0x00, 0x00, //
1862 +
1863 + // @5040 'f' (17 pixels wide)
1864 + 0x00, 0x00, 0x00, //
1865 + 0x00, 0x00, 0x00, //
1866 + 0x01, 0xFC, 0x00, // #######
1867 + 0x03, 0xFC, 0x00, // ########
1868 + 0x06, 0x00, 0x00, // ##
1869 + 0x06, 0x00, 0x00, // ##
1870 + 0x3F, 0xF8, 0x00, // ###########
1871 + 0x3F, 0xF8, 0x00, // ###########
1872 + 0x06, 0x00, 0x00, // ##
1873 + 0x06, 0x00, 0x00, // ##
1874 + 0x06, 0x00, 0x00, // ##
1875 + 0x06, 0x00, 0x00, // ##
1876 + 0x06, 0x00, 0x00, // ##
1877 + 0x06, 0x00, 0x00, // ##
1878 + 0x06, 0x00, 0x00, // ##
1879 + 0x3F, 0xF0, 0x00, // ##########
1880 + 0x3F, 0xF0, 0x00, // ##########
1881 + 0x00, 0x00, 0x00, //
1882 + 0x00, 0x00, 0x00, //
1883 + 0x00, 0x00, 0x00, //
1884 + 0x00, 0x00, 0x00, //
1885 + 0x00, 0x00, 0x00, //
1886 + 0x00, 0x00, 0x00, //
1887 + 0x00, 0x00, 0x00, //
1888 +
1889 + // @5112 'g' (17 pixels wide)
1890 + 0x00, 0x00, 0x00, //
1891 + 0x00, 0x00, 0x00, //
1892 + 0x00, 0x00, 0x00, //
1893 + 0x00, 0x00, 0x00, //
1894 + 0x00, 0x00, 0x00, //
1895 + 0x00, 0x00, 0x00, //
1896 + 0x07, 0xDE, 0x00, // ##### ####
1897 + 0x1F, 0xFE, 0x00, // ############
1898 + 0x18, 0x38, 0x00, // ## ###
1899 + 0x30, 0x18, 0x00, // ## ##
1900 + 0x30, 0x18, 0x00, // ## ##
1901 + 0x30, 0x18, 0x00, // ## ##
1902 + 0x30, 0x18, 0x00, // ## ##
1903 + 0x30, 0x18, 0x00, // ## ##
1904 + 0x18, 0x38, 0x00, // ## ###
1905 + 0x1F, 0xF8, 0x00, // ##########
1906 + 0x07, 0xD8, 0x00, // ##### ##
1907 + 0x00, 0x18, 0x00, // ##
1908 + 0x00, 0x18, 0x00, // ##
1909 + 0x00, 0x38, 0x00, // ###
1910 + 0x0F, 0xF0, 0x00, // ########
1911 + 0x0F, 0xC0, 0x00, // ######
1912 + 0x00, 0x00, 0x00, //
1913 + 0x00, 0x00, 0x00, //
1914 +
1915 + // @5184 'h' (17 pixels wide)
1916 + 0x00, 0x00, 0x00, //
1917 + 0x00, 0x00, 0x00, //
1918 + 0x78, 0x00, 0x00, // ####
1919 + 0x78, 0x00, 0x00, // ####
1920 + 0x18, 0x00, 0x00, // ##
1921 + 0x18, 0x00, 0x00, // ##
1922 + 0x1B, 0xE0, 0x00, // ## #####
1923 + 0x1F, 0xF0, 0x00, // #########
1924 + 0x1C, 0x38, 0x00, // ### ###
1925 + 0x18, 0x18, 0x00, // ## ##
1926 + 0x18, 0x18, 0x00, // ## ##
1927 + 0x18, 0x18, 0x00, // ## ##
1928 + 0x18, 0x18, 0x00, // ## ##
1929 + 0x18, 0x18, 0x00, // ## ##
1930 + 0x18, 0x18, 0x00, // ## ##
1931 + 0x7E, 0x7E, 0x00, // ###### ######
1932 + 0x7E, 0x7E, 0x00, // ###### ######
1933 + 0x00, 0x00, 0x00, //
1934 + 0x00, 0x00, 0x00, //
1935 + 0x00, 0x00, 0x00, //
1936 + 0x00, 0x00, 0x00, //
1937 + 0x00, 0x00, 0x00, //
1938 + 0x00, 0x00, 0x00, //
1939 + 0x00, 0x00, 0x00, //
1940 +
1941 + // @5256 'i' (17 pixels wide)
1942 + 0x00, 0x00, 0x00, //
1943 + 0x00, 0x00, 0x00, //
1944 + 0x01, 0x80, 0x00, // ##
1945 + 0x01, 0x80, 0x00, // ##
1946 + 0x00, 0x00, 0x00, //
1947 + 0x00, 0x00, 0x00, //
1948 + 0x1F, 0x80, 0x00, // ######
1949 + 0x1F, 0x80, 0x00, // ######
1950 + 0x01, 0x80, 0x00, // ##
1951 + 0x01, 0x80, 0x00, // ##
1952 + 0x01, 0x80, 0x00, // ##
1953 + 0x01, 0x80, 0x00, // ##
1954 + 0x01, 0x80, 0x00, // ##
1955 + 0x01, 0x80, 0x00, // ##
1956 + 0x01, 0x80, 0x00, // ##
1957 + 0x3F, 0xFC, 0x00, // ############
1958 + 0x3F, 0xFC, 0x00, // ############
1959 + 0x00, 0x00, 0x00, //
1960 + 0x00, 0x00, 0x00, //
1961 + 0x00, 0x00, 0x00, //
1962 + 0x00, 0x00, 0x00, //
1963 + 0x00, 0x00, 0x00, //
1964 + 0x00, 0x00, 0x00, //
1965 + 0x00, 0x00, 0x00, //
1966 +
1967 + // @5328 'j' (17 pixels wide)
1968 + 0x00, 0x00, 0x00, //
1969 + 0x00, 0x00, 0x00, //
1970 + 0x00, 0xC0, 0x00, // ##
1971 + 0x00, 0xC0, 0x00, // ##
1972 + 0x00, 0x00, 0x00, //
1973 + 0x00, 0x00, 0x00, //
1974 + 0x1F, 0xF0, 0x00, // #########
1975 + 0x1F, 0xF0, 0x00, // #########
1976 + 0x00, 0x30, 0x00, // ##
1977 + 0x00, 0x30, 0x00, // ##
1978 + 0x00, 0x30, 0x00, // ##
1979 + 0x00, 0x30, 0x00, // ##
1980 + 0x00, 0x30, 0x00, // ##
1981 + 0x00, 0x30, 0x00, // ##
1982 + 0x00, 0x30, 0x00, // ##
1983 + 0x00, 0x30, 0x00, // ##
1984 + 0x00, 0x30, 0x00, // ##
1985 + 0x00, 0x30, 0x00, // ##
1986 + 0x00, 0x30, 0x00, // ##
1987 + 0x00, 0x70, 0x00, // ###
1988 + 0x1F, 0xE0, 0x00, // ########
1989 + 0x1F, 0x80, 0x00, // ######
1990 + 0x00, 0x00, 0x00, //
1991 + 0x00, 0x00, 0x00, //
1992 +
1993 + // @5400 'k' (17 pixels wide)
1994 + 0x00, 0x00, 0x00, //
1995 + 0x00, 0x00, 0x00, //
1996 + 0x3C, 0x00, 0x00, // ####
1997 + 0x3C, 0x00, 0x00, // ####
1998 + 0x0C, 0x00, 0x00, // ##
1999 + 0x0C, 0x00, 0x00, // ##
2000 + 0x0C, 0xF8, 0x00, // ## #####
2001 + 0x0C, 0xF8, 0x00, // ## #####
2002 + 0x0C, 0xC0, 0x00, // ## ##
2003 + 0x0D, 0x80, 0x00, // ## ##
2004 + 0x0F, 0x80, 0x00, // #####
2005 + 0x0F, 0x00, 0x00, // ####
2006 + 0x0F, 0x80, 0x00, // #####
2007 + 0x0D, 0xC0, 0x00, // ## ###
2008 + 0x0C, 0xE0, 0x00, // ## ###
2009 + 0x3C, 0x7C, 0x00, // #### #####
2010 + 0x3C, 0x7C, 0x00, // #### #####
2011 + 0x00, 0x00, 0x00, //
2012 + 0x00, 0x00, 0x00, //
2013 + 0x00, 0x00, 0x00, //
2014 + 0x00, 0x00, 0x00, //
2015 + 0x00, 0x00, 0x00, //
2016 + 0x00, 0x00, 0x00, //
2017 + 0x00, 0x00, 0x00, //
2018 +
2019 + // @5472 'l' (17 pixels wide)
2020 + 0x00, 0x00, 0x00, //
2021 + 0x00, 0x00, 0x00, //
2022 + 0x1F, 0x80, 0x00, // ######
2023 + 0x1F, 0x80, 0x00, // ######
2024 + 0x01, 0x80, 0x00, // ##
2025 + 0x01, 0x80, 0x00, // ##
2026 + 0x01, 0x80, 0x00, // ##
2027 + 0x01, 0x80, 0x00, // ##
2028 + 0x01, 0x80, 0x00, // ##
2029 + 0x01, 0x80, 0x00, // ##
2030 + 0x01, 0x80, 0x00, // ##
2031 + 0x01, 0x80, 0x00, // ##
2032 + 0x01, 0x80, 0x00, // ##
2033 + 0x01, 0x80, 0x00, // ##
2034 + 0x01, 0x80, 0x00, // ##
2035 + 0x3F, 0xFC, 0x00, // ############
2036 + 0x3F, 0xFC, 0x00, // ############
2037 + 0x00, 0x00, 0x00, //
2038 + 0x00, 0x00, 0x00, //
2039 + 0x00, 0x00, 0x00, //
2040 + 0x00, 0x00, 0x00, //
2041 + 0x00, 0x00, 0x00, //
2042 + 0x00, 0x00, 0x00, //
2043 + 0x00, 0x00, 0x00, //
2044 +
2045 + // @5544 'm' (17 pixels wide)
2046 + 0x00, 0x00, 0x00, //
2047 + 0x00, 0x00, 0x00, //
2048 + 0x00, 0x00, 0x00, //
2049 + 0x00, 0x00, 0x00, //
2050 + 0x00, 0x00, 0x00, //
2051 + 0x00, 0x00, 0x00, //
2052 + 0xF7, 0x78, 0x00, // #### ### ####
2053 + 0xFF, 0xFC, 0x00, // ##############
2054 + 0x39, 0xCC, 0x00, // ### ### ##
2055 + 0x31, 0x8C, 0x00, // ## ## ##
2056 + 0x31, 0x8C, 0x00, // ## ## ##
2057 + 0x31, 0x8C, 0x00, // ## ## ##
2058 + 0x31, 0x8C, 0x00, // ## ## ##
2059 + 0x31, 0x8C, 0x00, // ## ## ##
2060 + 0x31, 0x8C, 0x00, // ## ## ##
2061 + 0xFD, 0xEF, 0x00, // ###### #### ####
2062 + 0xFD, 0xEF, 0x00, // ###### #### ####
2063 + 0x00, 0x00, 0x00, //
2064 + 0x00, 0x00, 0x00, //
2065 + 0x00, 0x00, 0x00, //
2066 + 0x00, 0x00, 0x00, //
2067 + 0x00, 0x00, 0x00, //
2068 + 0x00, 0x00, 0x00, //
2069 + 0x00, 0x00, 0x00, //
2070 +
2071 + // @5616 'n' (17 pixels wide)
2072 + 0x00, 0x00, 0x00, //
2073 + 0x00, 0x00, 0x00, //
2074 + 0x00, 0x00, 0x00, //
2075 + 0x00, 0x00, 0x00, //
2076 + 0x00, 0x00, 0x00, //
2077 + 0x00, 0x00, 0x00, //
2078 + 0x7B, 0xE0, 0x00, // #### #####
2079 + 0x7F, 0xF0, 0x00, // ###########
2080 + 0x1C, 0x38, 0x00, // ### ###
2081 + 0x18, 0x18, 0x00, // ## ##
2082 + 0x18, 0x18, 0x00, // ## ##
2083 + 0x18, 0x18, 0x00, // ## ##
2084 + 0x18, 0x18, 0x00, // ## ##
2085 + 0x18, 0x18, 0x00, // ## ##
2086 + 0x18, 0x18, 0x00, // ## ##
2087 + 0x7E, 0x7E, 0x00, // ###### ######
2088 + 0x7E, 0x7E, 0x00, // ###### ######
2089 + 0x00, 0x00, 0x00, //
2090 + 0x00, 0x00, 0x00, //
2091 + 0x00, 0x00, 0x00, //
2092 + 0x00, 0x00, 0x00, //
2093 + 0x00, 0x00, 0x00, //
2094 + 0x00, 0x00, 0x00, //
2095 + 0x00, 0x00, 0x00, //
2096 +
2097 + // @5688 'o' (17 pixels wide)
2098 + 0x00, 0x00, 0x00, //
2099 + 0x00, 0x00, 0x00, //
2100 + 0x00, 0x00, 0x00, //
2101 + 0x00, 0x00, 0x00, //
2102 + 0x00, 0x00, 0x00, //
2103 + 0x00, 0x00, 0x00, //
2104 + 0x03, 0xC0, 0x00, // ####
2105 + 0x0F, 0xF0, 0x00, // ########
2106 + 0x1C, 0x38, 0x00, // ### ###
2107 + 0x38, 0x1C, 0x00, // ### ###
2108 + 0x30, 0x0C, 0x00, // ## ##
2109 + 0x30, 0x0C, 0x00, // ## ##
2110 + 0x30, 0x0C, 0x00, // ## ##
2111 + 0x38, 0x1C, 0x00, // ### ###
2112 + 0x1C, 0x38, 0x00, // ### ###
2113 + 0x0F, 0xF0, 0x00, // ########
2114 + 0x03, 0xC0, 0x00, // ####
2115 + 0x00, 0x00, 0x00, //
2116 + 0x00, 0x00, 0x00, //
2117 + 0x00, 0x00, 0x00, //
2118 + 0x00, 0x00, 0x00, //
2119 + 0x00, 0x00, 0x00, //
2120 + 0x00, 0x00, 0x00, //
2121 + 0x00, 0x00, 0x00, //
2122 +
2123 + // @5760 'p' (17 pixels wide)
2124 + 0x00, 0x00, 0x00, //
2125 + 0x00, 0x00, 0x00, //
2126 + 0x00, 0x00, 0x00, //
2127 + 0x00, 0x00, 0x00, //
2128 + 0x00, 0x00, 0x00, //
2129 + 0x00, 0x00, 0x00, //
2130 + 0x7B, 0xE0, 0x00, // #### #####
2131 + 0x7F, 0xF8, 0x00, // ############
2132 + 0x1C, 0x18, 0x00, // ### ##
2133 + 0x18, 0x0C, 0x00, // ## ##
2134 + 0x18, 0x0C, 0x00, // ## ##
2135 + 0x18, 0x0C, 0x00, // ## ##
2136 + 0x18, 0x0C, 0x00, // ## ##
2137 + 0x18, 0x0C, 0x00, // ## ##
2138 + 0x1C, 0x18, 0x00, // ### ##
2139 + 0x1F, 0xF8, 0x00, // ##########
2140 + 0x1B, 0xE0, 0x00, // ## #####
2141 + 0x18, 0x00, 0x00, // ##
2142 + 0x18, 0x00, 0x00, // ##
2143 + 0x18, 0x00, 0x00, // ##
2144 + 0x7F, 0x00, 0x00, // #######
2145 + 0x7F, 0x00, 0x00, // #######
2146 + 0x00, 0x00, 0x00, //
2147 + 0x00, 0x00, 0x00, //
2148 +
2149 + // @5832 'q' (17 pixels wide)
2150 + 0x00, 0x00, 0x00, //
2151 + 0x00, 0x00, 0x00, //
2152 + 0x00, 0x00, 0x00, //
2153 + 0x00, 0x00, 0x00, //
2154 + 0x00, 0x00, 0x00, //
2155 + 0x00, 0x00, 0x00, //
2156 + 0x07, 0xDE, 0x00, // ##### ####
2157 + 0x1F, 0xFE, 0x00, // ############
2158 + 0x18, 0x38, 0x00, // ## ###
2159 + 0x30, 0x18, 0x00, // ## ##
2160 + 0x30, 0x18, 0x00, // ## ##
2161 + 0x30, 0x18, 0x00, // ## ##
2162 + 0x30, 0x18, 0x00, // ## ##
2163 + 0x30, 0x18, 0x00, // ## ##
2164 + 0x18, 0x38, 0x00, // ## ###
2165 + 0x1F, 0xF8, 0x00, // ##########
2166 + 0x07, 0xD8, 0x00, // ##### ##
2167 + 0x00, 0x18, 0x00, // ##
2168 + 0x00, 0x18, 0x00, // ##
2169 + 0x00, 0x18, 0x00, // ##
2170 + 0x00, 0xFE, 0x00, // #######
2171 + 0x00, 0xFE, 0x00, // #######
2172 + 0x00, 0x00, 0x00, //
2173 + 0x00, 0x00, 0x00, //
2174 +
2175 + // @5904 'r' (17 pixels wide)
2176 + 0x00, 0x00, 0x00, //
2177 + 0x00, 0x00, 0x00, //
2178 + 0x00, 0x00, 0x00, //
2179 + 0x00, 0x00, 0x00, //
2180 + 0x00, 0x00, 0x00, //
2181 + 0x00, 0x00, 0x00, //
2182 + 0x3E, 0x78, 0x00, // ##### ####
2183 + 0x3E, 0xFC, 0x00, // ##### ######
2184 + 0x07, 0xCC, 0x00, // ##### ##
2185 + 0x07, 0x00, 0x00, // ###
2186 + 0x06, 0x00, 0x00, // ##
2187 + 0x06, 0x00, 0x00, // ##
2188 + 0x06, 0x00, 0x00, // ##
2189 + 0x06, 0x00, 0x00, // ##
2190 + 0x06, 0x00, 0x00, // ##
2191 + 0x3F, 0xF0, 0x00, // ##########
2192 + 0x3F, 0xF0, 0x00, // ##########
2193 + 0x00, 0x00, 0x00, //
2194 + 0x00, 0x00, 0x00, //
2195 + 0x00, 0x00, 0x00, //
2196 + 0x00, 0x00, 0x00, //
2197 + 0x00, 0x00, 0x00, //
2198 + 0x00, 0x00, 0x00, //
2199 + 0x00, 0x00, 0x00, //
2200 +
2201 + // @5976 's' (17 pixels wide)
2202 + 0x00, 0x00, 0x00, //
2203 + 0x00, 0x00, 0x00, //
2204 + 0x00, 0x00, 0x00, //
2205 + 0x00, 0x00, 0x00, //
2206 + 0x00, 0x00, 0x00, //
2207 + 0x00, 0x00, 0x00, //
2208 + 0x07, 0xF8, 0x00, // ########
2209 + 0x0F, 0xF8, 0x00, // #########
2210 + 0x18, 0x18, 0x00, // ## ##
2211 + 0x18, 0x18, 0x00, // ## ##
2212 + 0x1F, 0x80, 0x00, // ######
2213 + 0x0F, 0xF0, 0x00, // ########
2214 + 0x00, 0xF8, 0x00, // #####
2215 + 0x18, 0x18, 0x00, // ## ##
2216 + 0x18, 0x38, 0x00, // ## ###
2217 + 0x1F, 0xF0, 0x00, // #########
2218 + 0x1F, 0xE0, 0x00, // ########
2219 + 0x00, 0x00, 0x00, //
2220 + 0x00, 0x00, 0x00, //
2221 + 0x00, 0x00, 0x00, //
2222 + 0x00, 0x00, 0x00, //
2223 + 0x00, 0x00, 0x00, //
2224 + 0x00, 0x00, 0x00, //
2225 + 0x00, 0x00, 0x00, //
2226 +
2227 + // @6048 't' (17 pixels wide)
2228 + 0x00, 0x00, 0x00, //
2229 + 0x00, 0x00, 0x00, //
2230 + 0x0C, 0x00, 0x00, // ##
2231 + 0x0C, 0x00, 0x00, // ##
2232 + 0x0C, 0x00, 0x00, // ##
2233 + 0x0C, 0x00, 0x00, // ##
2234 + 0x3F, 0xF0, 0x00, // ##########
2235 + 0x3F, 0xF0, 0x00, // ##########
2236 + 0x0C, 0x00, 0x00, // ##
2237 + 0x0C, 0x00, 0x00, // ##
2238 + 0x0C, 0x00, 0x00, // ##
2239 + 0x0C, 0x00, 0x00, // ##
2240 + 0x0C, 0x00, 0x00, // ##
2241 + 0x0C, 0x00, 0x00, // ##
2242 + 0x0C, 0x1C, 0x00, // ## ###
2243 + 0x07, 0xFC, 0x00, // #########
2244 + 0x03, 0xF0, 0x00, // ######
2245 + 0x00, 0x00, 0x00, //
2246 + 0x00, 0x00, 0x00, //
2247 + 0x00, 0x00, 0x00, //
2248 + 0x00, 0x00, 0x00, //
2249 + 0x00, 0x00, 0x00, //
2250 + 0x00, 0x00, 0x00, //
2251 + 0x00, 0x00, 0x00, //
2252 +
2253 + // @6120 'u' (17 pixels wide)
2254 + 0x00, 0x00, 0x00, //
2255 + 0x00, 0x00, 0x00, //
2256 + 0x00, 0x00, 0x00, //
2257 + 0x00, 0x00, 0x00, //
2258 + 0x00, 0x00, 0x00, //
2259 + 0x00, 0x00, 0x00, //
2260 + 0x78, 0x78, 0x00, // #### ####
2261 + 0x78, 0x78, 0x00, // #### ####
2262 + 0x18, 0x18, 0x00, // ## ##
2263 + 0x18, 0x18, 0x00, // ## ##
2264 + 0x18, 0x18, 0x00, // ## ##
2265 + 0x18, 0x18, 0x00, // ## ##
2266 + 0x18, 0x18, 0x00, // ## ##
2267 + 0x18, 0x18, 0x00, // ## ##
2268 + 0x18, 0x38, 0x00, // ## ###
2269 + 0x0F, 0xFE, 0x00, // ###########
2270 + 0x07, 0xDE, 0x00, // ##### ####
2271 + 0x00, 0x00, 0x00, //
2272 + 0x00, 0x00, 0x00, //
2273 + 0x00, 0x00, 0x00, //
2274 + 0x00, 0x00, 0x00, //
2275 + 0x00, 0x00, 0x00, //
2276 + 0x00, 0x00, 0x00, //
2277 + 0x00, 0x00, 0x00, //
2278 +
2279 + // @6192 'v' (17 pixels wide)
2280 + 0x00, 0x00, 0x00, //
2281 + 0x00, 0x00, 0x00, //
2282 + 0x00, 0x00, 0x00, //
2283 + 0x00, 0x00, 0x00, //
2284 + 0x00, 0x00, 0x00, //
2285 + 0x00, 0x00, 0x00, //
2286 + 0x7C, 0x3E, 0x00, // ##### #####
2287 + 0x7C, 0x3E, 0x00, // ##### #####
2288 + 0x18, 0x18, 0x00, // ## ##
2289 + 0x18, 0x18, 0x00, // ## ##
2290 + 0x0C, 0x30, 0x00, // ## ##
2291 + 0x0C, 0x30, 0x00, // ## ##
2292 + 0x06, 0x60, 0x00, // ## ##
2293 + 0x06, 0x60, 0x00, // ## ##
2294 + 0x07, 0xE0, 0x00, // ######
2295 + 0x03, 0xC0, 0x00, // ####
2296 + 0x03, 0xC0, 0x00, // ####
2297 + 0x00, 0x00, 0x00, //
2298 + 0x00, 0x00, 0x00, //
2299 + 0x00, 0x00, 0x00, //
2300 + 0x00, 0x00, 0x00, //
2301 + 0x00, 0x00, 0x00, //
2302 + 0x00, 0x00, 0x00, //
2303 + 0x00, 0x00, 0x00, //
2304 +
2305 + // @6264 'w' (17 pixels wide)
2306 + 0x00, 0x00, 0x00, //
2307 + 0x00, 0x00, 0x00, //
2308 + 0x00, 0x00, 0x00, //
2309 + 0x00, 0x00, 0x00, //
2310 + 0x00, 0x00, 0x00, //
2311 + 0x00, 0x00, 0x00, //
2312 + 0x78, 0x3C, 0x00, // #### ####
2313 + 0x78, 0x3C, 0x00, // #### ####
2314 + 0x31, 0x18, 0x00, // ## # ##
2315 + 0x33, 0x98, 0x00, // ## ### ##
2316 + 0x33, 0x98, 0x00, // ## ### ##
2317 + 0x1A, 0xB0, 0x00, // ## # # ##
2318 + 0x1E, 0xF0, 0x00, // #### ####
2319 + 0x1E, 0xF0, 0x00, // #### ####
2320 + 0x1C, 0x60, 0x00, // ### ##
2321 + 0x0C, 0x60, 0x00, // ## ##
2322 + 0x0C, 0x60, 0x00, // ## ##
2323 + 0x00, 0x00, 0x00, //
2324 + 0x00, 0x00, 0x00, //
2325 + 0x00, 0x00, 0x00, //
2326 + 0x00, 0x00, 0x00, //
2327 + 0x00, 0x00, 0x00, //
2328 + 0x00, 0x00, 0x00, //
2329 + 0x00, 0x00, 0x00, //
2330 +
2331 + // @6336 'x' (17 pixels wide)
2332 + 0x00, 0x00, 0x00, //
2333 + 0x00, 0x00, 0x00, //
2334 + 0x00, 0x00, 0x00, //
2335 + 0x00, 0x00, 0x00, //
2336 + 0x00, 0x00, 0x00, //
2337 + 0x00, 0x00, 0x00, //
2338 + 0x3E, 0x7C, 0x00, // ##### #####
2339 + 0x3E, 0x7C, 0x00, // ##### #####
2340 + 0x0C, 0x30, 0x00, // ## ##
2341 + 0x06, 0x60, 0x00, // ## ##
2342 + 0x03, 0xC0, 0x00, // ####
2343 + 0x01, 0x80, 0x00, // ##
2344 + 0x03, 0xC0, 0x00, // ####
2345 + 0x06, 0x60, 0x00, // ## ##
2346 + 0x0C, 0x30, 0x00, // ## ##
2347 + 0x3E, 0x7C, 0x00, // ##### #####
2348 + 0x3E, 0x7C, 0x00, // ##### #####
2349 + 0x00, 0x00, 0x00, //
2350 + 0x00, 0x00, 0x00, //
2351 + 0x00, 0x00, 0x00, //
2352 + 0x00, 0x00, 0x00, //
2353 + 0x00, 0x00, 0x00, //
2354 + 0x00, 0x00, 0x00, //
2355 + 0x00, 0x00, 0x00, //
2356 +
2357 + // @6408 'y' (17 pixels wide)
2358 + 0x00, 0x00, 0x00, //
2359 + 0x00, 0x00, 0x00, //
2360 + 0x00, 0x00, 0x00, //
2361 + 0x00, 0x00, 0x00, //
2362 + 0x00, 0x00, 0x00, //
2363 + 0x00, 0x00, 0x00, //
2364 + 0x7E, 0x1F, 0x00, // ###### #####
2365 + 0x7E, 0x1F, 0x00, // ###### #####
2366 + 0x18, 0x0C, 0x00, // ## ##
2367 + 0x0C, 0x18, 0x00, // ## ##
2368 + 0x0C, 0x18, 0x00, // ## ##
2369 + 0x06, 0x30, 0x00, // ## ##
2370 + 0x06, 0x30, 0x00, // ## ##
2371 + 0x03, 0x60, 0x00, // ## ##
2372 + 0x03, 0xE0, 0x00, // #####
2373 + 0x01, 0xC0, 0x00, // ###
2374 + 0x00, 0xC0, 0x00, // ##
2375 + 0x01, 0x80, 0x00, // ##
2376 + 0x01, 0x80, 0x00, // ##
2377 + 0x03, 0x00, 0x00, // ##
2378 + 0x3F, 0xC0, 0x00, // ########
2379 + 0x3F, 0xC0, 0x00, // ########
2380 + 0x00, 0x00, 0x00, //
2381 + 0x00, 0x00, 0x00, //
2382 +
2383 + // @6480 'z' (17 pixels wide)
2384 + 0x00, 0x00, 0x00, //
2385 + 0x00, 0x00, 0x00, //
2386 + 0x00, 0x00, 0x00, //
2387 + 0x00, 0x00, 0x00, //
2388 + 0x00, 0x00, 0x00, //
2389 + 0x00, 0x00, 0x00, //
2390 + 0x1F, 0xF8, 0x00, // ##########
2391 + 0x1F, 0xF8, 0x00, // ##########
2392 + 0x18, 0x30, 0x00, // ## ##
2393 + 0x18, 0x60, 0x00, // ## ##
2394 + 0x00, 0xC0, 0x00, // ##
2395 + 0x01, 0x80, 0x00, // ##
2396 + 0x03, 0x00, 0x00, // ##
2397 + 0x06, 0x18, 0x00, // ## ##
2398 + 0x0C, 0x18, 0x00, // ## ##
2399 + 0x1F, 0xF8, 0x00, // ##########
2400 + 0x1F, 0xF8, 0x00, // ##########
2401 + 0x00, 0x00, 0x00, //
2402 + 0x00, 0x00, 0x00, //
2403 + 0x00, 0x00, 0x00, //
2404 + 0x00, 0x00, 0x00, //
2405 + 0x00, 0x00, 0x00, //
2406 + 0x00, 0x00, 0x00, //
2407 + 0x00, 0x00, 0x00, //
2408 +
2409 + // @6552 '{' (17 pixels wide)
2410 + 0x00, 0x00, 0x00, //
2411 + 0x00, 0x00, 0x00, //
2412 + 0x00, 0xE0, 0x00, // ###
2413 + 0x01, 0xE0, 0x00, // ####
2414 + 0x01, 0x80, 0x00, // ##
2415 + 0x01, 0x80, 0x00, // ##
2416 + 0x01, 0x80, 0x00, // ##
2417 + 0x01, 0x80, 0x00, // ##
2418 + 0x01, 0x80, 0x00, // ##
2419 + 0x01, 0x80, 0x00, // ##
2420 + 0x03, 0x80, 0x00, // ###
2421 + 0x07, 0x00, 0x00, // ###
2422 + 0x03, 0x80, 0x00, // ###
2423 + 0x01, 0x80, 0x00, // ##
2424 + 0x01, 0x80, 0x00, // ##
2425 + 0x01, 0x80, 0x00, // ##
2426 + 0x01, 0x80, 0x00, // ##
2427 + 0x01, 0x80, 0x00, // ##
2428 + 0x01, 0xE0, 0x00, // ####
2429 + 0x00, 0xE0, 0x00, // ###
2430 + 0x00, 0x00, 0x00, //
2431 + 0x00, 0x00, 0x00, //
2432 + 0x00, 0x00, 0x00, //
2433 + 0x00, 0x00, 0x00, //
2434 +
2435 + // @6624 '|' (17 pixels wide)
2436 + 0x00, 0x00, 0x00, //
2437 + 0x00, 0x00, 0x00, //
2438 + 0x01, 0x80, 0x00, // ##
2439 + 0x01, 0x80, 0x00, // ##
2440 + 0x01, 0x80, 0x00, // ##
2441 + 0x01, 0x80, 0x00, // ##
2442 + 0x01, 0x80, 0x00, // ##
2443 + 0x01, 0x80, 0x00, // ##
2444 + 0x01, 0x80, 0x00, // ##
2445 + 0x01, 0x80, 0x00, // ##
2446 + 0x01, 0x80, 0x00, // ##
2447 + 0x01, 0x80, 0x00, // ##
2448 + 0x01, 0x80, 0x00, // ##
2449 + 0x01, 0x80, 0x00, // ##
2450 + 0x01, 0x80, 0x00, // ##
2451 + 0x01, 0x80, 0x00, // ##
2452 + 0x01, 0x80, 0x00, // ##
2453 + 0x01, 0x80, 0x00, // ##
2454 + 0x01, 0x80, 0x00, // ##
2455 + 0x01, 0x80, 0x00, // ##
2456 + 0x00, 0x00, 0x00, //
2457 + 0x00, 0x00, 0x00, //
2458 + 0x00, 0x00, 0x00, //
2459 + 0x00, 0x00, 0x00, //
2460 +
2461 + // @6696 '}' (17 pixels wide)
2462 + 0x00, 0x00, 0x00, //
2463 + 0x00, 0x00, 0x00, //
2464 + 0x07, 0x00, 0x00, // ###
2465 + 0x07, 0x80, 0x00, // ####
2466 + 0x01, 0x80, 0x00, // ##
2467 + 0x01, 0x80, 0x00, // ##
2468 + 0x01, 0x80, 0x00, // ##
2469 + 0x01, 0x80, 0x00, // ##
2470 + 0x01, 0x80, 0x00, // ##
2471 + 0x01, 0x80, 0x00, // ##
2472 + 0x01, 0xC0, 0x00, // ###
2473 + 0x00, 0xE0, 0x00, // ###
2474 + 0x01, 0xC0, 0x00, // ###
2475 + 0x01, 0x80, 0x00, // ##
2476 + 0x01, 0x80, 0x00, // ##
2477 + 0x01, 0x80, 0x00, // ##
2478 + 0x01, 0x80, 0x00, // ##
2479 + 0x01, 0x80, 0x00, // ##
2480 + 0x07, 0x80, 0x00, // ####
2481 + 0x07, 0x00, 0x00, // ###
2482 + 0x00, 0x00, 0x00, //
2483 + 0x00, 0x00, 0x00, //
2484 + 0x00, 0x00, 0x00, //
2485 + 0x00, 0x00, 0x00, //
2486 +
2487 + // @6768 '~' (17 pixels wide)
2488 + 0x00, 0x00, 0x00, //
2489 + 0x00, 0x00, 0x00, //
2490 + 0x00, 0x00, 0x00, //
2491 + 0x00, 0x00, 0x00, //
2492 + 0x00, 0x00, 0x00, //
2493 + 0x00, 0x00, 0x00, //
2494 + 0x00, 0x00, 0x00, //
2495 + 0x00, 0x00, 0x00, //
2496 + 0x0E, 0x00, 0x00, // ###
2497 + 0x1F, 0x18, 0x00, // ##### ##
2498 + 0x3B, 0xB8, 0x00, // ### ### ###
2499 + 0x31, 0xF0, 0x00, // ## #####
2500 + 0x00, 0xE0, 0x00, // ###
2501 + 0x00, 0x00, 0x00, //
2502 + 0x00, 0x00, 0x00, //
2503 + 0x00, 0x00, 0x00, //
2504 + 0x00, 0x00, 0x00, //
2505 + 0x00, 0x00, 0x00, //
2506 + 0x00, 0x00, 0x00, //
2507 + 0x00, 0x00, 0x00, //
2508 + 0x00, 0x00, 0x00, //
2509 + 0x00, 0x00, 0x00, //
2510 + 0x00, 0x00, 0x00, //
2511 + 0x00, 0x00, 0x00, //
2512 +};
2513 +
2514 +sFONT Font24 = {
2515 + Font24_Table,
2516 + 17, /* Width */
2517 + 24, /* Height */
2518 +};
2519 +
2520 +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
1 +/**
2 + ******************************************************************************
3 + * @file Font8.c
4 + * @author MCD Application Team
5 + * @version V1.0.0
6 + * @date 18-February-2014
7 + * @brief This file provides text Font8 for STM32xx-EVAL's LCD driver.
8 + ******************************************************************************
9 + * @attention
10 + *
11 + * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
12 + *
13 + * Redistribution and use in source and binary forms, with or without modification,
14 + * are permitted provided that the following conditions are met:
15 + * 1. Redistributions of source code must retain the above copyright notice,
16 + * this list of conditions and the following disclaimer.
17 + * 2. Redistributions in binary form must reproduce the above copyright notice,
18 + * this list of conditions and the following disclaimer in the documentation
19 + * and/or other materials provided with the distribution.
20 + * 3. Neither the name of STMicroelectronics nor the names of its contributors
21 + * may be used to endorse or promote products derived from this software
22 + * without specific prior written permission.
23 + *
24 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25 + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27 + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
28 + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30 + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31 + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
32 + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33 + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 + *
35 + ******************************************************************************
36 + */
37 +
38 +/* Includes ------------------------------------------------------------------*/
39 +#include "fonts.h"
40 +
41 +//
42 +// Font data for Courier New 12pt
43 +//
44 +
45 +const uint8_t Font8_Table[] =
46 +{
47 + // @0 ' ' (5 pixels wide)
48 + 0x00, //
49 + 0x00, //
50 + 0x00, //
51 + 0x00, //
52 + 0x00, //
53 + 0x00, //
54 + 0x00, //
55 + 0x00, //
56 +
57 + // @8 '!' (5 pixels wide)
58 + 0x20, // #
59 + 0x20, // #
60 + 0x20, // #
61 + 0x20, // #
62 + 0x00, //
63 + 0x20, // #
64 + 0x00, //
65 + 0x00, //
66 +
67 + // @16 '"' (5 pixels wide)
68 + 0x50, // # #
69 + 0x50, // # #
70 + 0x00, //
71 + 0x00, //
72 + 0x00, //
73 + 0x00, //
74 + 0x00, //
75 + 0x00, //
76 +
77 + // @24 '#' (5 pixels wide)
78 + 0x28, // # #
79 + 0x50, // # #
80 + 0xF8, // #####
81 + 0x50, // # #
82 + 0xF8, // #####
83 + 0x50, // # #
84 + 0xA0, // # #
85 + 0x00, //
86 +
87 + // @32 '$' (5 pixels wide)
88 + 0x20, // #
89 + 0x30, // ##
90 + 0x60, // ##
91 + 0x30, // ##
92 + 0x10, // #
93 + 0x60, // ##
94 + 0x20, // #
95 + 0x00, //
96 +
97 + // @40 '%' (5 pixels wide)
98 + 0x20, // #
99 + 0x20, // #
100 + 0x18, // ##
101 + 0x60, // ##
102 + 0x10, // #
103 + 0x10, // #
104 + 0x00, //
105 + 0x00, //
106 +
107 + // @48 '&' (5 pixels wide)
108 + 0x00, //
109 + 0x38, // ###
110 + 0x20, // #
111 + 0x60, // ##
112 + 0x50, // # #
113 + 0x78, // ####
114 + 0x00, //
115 + 0x00, //
116 +
117 + // @56 ''' (5 pixels wide)
118 + 0x20, // #
119 + 0x20, // #
120 + 0x20, // #
121 + 0x00, //
122 + 0x00, //
123 + 0x00, //
124 + 0x00, //
125 + 0x00, //
126 +
127 + // @64 '(' (5 pixels wide)
128 + 0x10, // #
129 + 0x20, // #
130 + 0x20, // #
131 + 0x20, // #
132 + 0x20, // #
133 + 0x20, // #
134 + 0x10, // #
135 + 0x00, //
136 +
137 + // @72 ')' (5 pixels wide)
138 + 0x40, // #
139 + 0x20, // #
140 + 0x20, // #
141 + 0x20, // #
142 + 0x20, // #
143 + 0x20, // #
144 + 0x40, // #
145 + 0x00, //
146 +
147 + // @80 '*' (5 pixels wide)
148 + 0x20, // #
149 + 0x70, // ###
150 + 0x20, // #
151 + 0x50, // # #
152 + 0x00, //
153 + 0x00, //
154 + 0x00, //
155 + 0x00, //
156 +
157 + // @88 '+' (5 pixels wide)
158 + 0x00, //
159 + 0x20, // #
160 + 0x20, // #
161 + 0xF8, // #####
162 + 0x20, // #
163 + 0x20, // #
164 + 0x00, //
165 + 0x00, //
166 +
167 + // @96 ',' (5 pixels wide)
168 + 0x00, //
169 + 0x00, //
170 + 0x00, //
171 + 0x00, //
172 + 0x10, // #
173 + 0x20, // #
174 + 0x20, // #
175 + 0x00, //
176 +
177 + // @104 '-' (5 pixels wide)
178 + 0x00, //
179 + 0x00, //
180 + 0x00, //
181 + 0x70, // ###
182 + 0x00, //
183 + 0x00, //
184 + 0x00, //
185 + 0x00, //
186 +
187 + // @112 '.' (5 pixels wide)
188 + 0x00, //
189 + 0x00, //
190 + 0x00, //
191 + 0x00, //
192 + 0x00, //
193 + 0x20, // #
194 + 0x00, //
195 + 0x00, //
196 +
197 + // @120 '/' (5 pixels wide)
198 + 0x10, // #
199 + 0x20, // #
200 + 0x20, // #
201 + 0x20, // #
202 + 0x40, // #
203 + 0x40, // #
204 + 0x80, // #
205 + 0x00, //
206 +
207 + // @128 '0' (5 pixels wide)
208 + 0x20, // #
209 + 0x50, // # #
210 + 0x50, // # #
211 + 0x50, // # #
212 + 0x50, // # #
213 + 0x20, // #
214 + 0x00, //
215 + 0x00, //
216 +
217 + // @136 '1' (5 pixels wide)
218 + 0x60, // ##
219 + 0x20, // #
220 + 0x20, // #
221 + 0x20, // #
222 + 0x20, // #
223 + 0xF8, // #####
224 + 0x00, //
225 + 0x00, //
226 +
227 + // @144 '2' (5 pixels wide)
228 + 0x20, // #
229 + 0x50, // # #
230 + 0x20, // #
231 + 0x20, // #
232 + 0x40, // #
233 + 0x70, // ###
234 + 0x00, //
235 + 0x00, //
236 +
237 + // @152 '3' (5 pixels wide)
238 + 0x20, // #
239 + 0x50, // # #
240 + 0x10, // #
241 + 0x20, // #
242 + 0x10, // #
243 + 0x60, // ##
244 + 0x00, //
245 + 0x00, //
246 +
247 + // @160 '4' (5 pixels wide)
248 + 0x10, // #
249 + 0x30, // ##
250 + 0x50, // # #
251 + 0x78, // ####
252 + 0x10, // #
253 + 0x38, // ###
254 + 0x00, //
255 + 0x00, //
256 +
257 + // @168 '5' (5 pixels wide)
258 + 0x70, // ###
259 + 0x40, // #
260 + 0x60, // ##
261 + 0x10, // #
262 + 0x50, // # #
263 + 0x20, // #
264 + 0x00, //
265 + 0x00, //
266 +
267 + // @176 '6' (5 pixels wide)
268 + 0x30, // ##
269 + 0x40, // #
270 + 0x60, // ##
271 + 0x50, // # #
272 + 0x50, // # #
273 + 0x60, // ##
274 + 0x00, //
275 + 0x00, //
276 +
277 + // @184 '7' (5 pixels wide)
278 + 0x70, // ###
279 + 0x50, // # #
280 + 0x10, // #
281 + 0x20, // #
282 + 0x20, // #
283 + 0x20, // #
284 + 0x00, //
285 + 0x00, //
286 +
287 + // @192 '8' (5 pixels wide)
288 + 0x20, // #
289 + 0x50, // # #
290 + 0x20, // #
291 + 0x50, // # #
292 + 0x50, // # #
293 + 0x20, // #
294 + 0x00, //
295 + 0x00, //
296 +
297 + // @200 '9' (5 pixels wide)
298 + 0x30, // ##
299 + 0x50, // # #
300 + 0x50, // # #
301 + 0x30, // ##
302 + 0x10, // #
303 + 0x60, // ##
304 + 0x00, //
305 + 0x00, //
306 +
307 + // @208 ':' (5 pixels wide)
308 + 0x00, //
309 + 0x00, //
310 + 0x20, // #
311 + 0x00, //
312 + 0x00, //
313 + 0x20, // #
314 + 0x00, //
315 + 0x00, //
316 +
317 + // @216 ';' (5 pixels wide)
318 + 0x00, //
319 + 0x00, //
320 + 0x10, // #
321 + 0x00, //
322 + 0x10, // #
323 + 0x20, // #
324 + 0x00, //
325 + 0x00, //
326 +
327 + // @224 '<' (5 pixels wide)
328 + 0x00, //
329 + 0x10, // #
330 + 0x20, // #
331 + 0xC0, // ##
332 + 0x20, // #
333 + 0x10, // #
334 + 0x00, //
335 + 0x00, //
336 +
337 + // @232 '=' (5 pixels wide)
338 + 0x00, //
339 + 0x70, // ###
340 + 0x00, //
341 + 0x70, // ###
342 + 0x00, //
343 + 0x00, //
344 + 0x00, //
345 + 0x00, //
346 +
347 + // @240 '>' (5 pixels wide)
348 + 0x00, //
349 + 0x40, // #
350 + 0x20, // #
351 + 0x18, // ##
352 + 0x20, // #
353 + 0x40, // #
354 + 0x00, //
355 + 0x00, //
356 +
357 + // @248 '?' (5 pixels wide)
358 + 0x20, // #
359 + 0x50, // # #
360 + 0x10, // #
361 + 0x20, // #
362 + 0x00, //
363 + 0x20, // #
364 + 0x00, //
365 + 0x00, //
366 +
367 + // @256 '@' (5 pixels wide)
368 + 0x30, // ##
369 + 0x48, // # #
370 + 0x48, // # #
371 + 0x58, // # ##
372 + 0x48, // # #
373 + 0x40, // #
374 + 0x38, // ###
375 + 0x00, //
376 +
377 + // @264 'A' (5 pixels wide)
378 + 0x60, // ##
379 + 0x20, // #
380 + 0x50, // # #
381 + 0x70, // ###
382 + 0x88, // # #
383 + 0xD8, // ## ##
384 + 0x00, //
385 + 0x00, //
386 +
387 + // @272 'B' (5 pixels wide)
388 + 0xF0, // ####
389 + 0x48, // # #
390 + 0x70, // ###
391 + 0x48, // # #
392 + 0x48, // # #
393 + 0xF0, // ####
394 + 0x00, //
395 + 0x00, //
396 +
397 + // @280 'C' (5 pixels wide)
398 + 0x70, // ###
399 + 0x50, // # #
400 + 0x40, // #
401 + 0x40, // #
402 + 0x40, // #
403 + 0x30, // ##
404 + 0x00, //
405 + 0x00, //
406 +
407 + // @288 'D' (5 pixels wide)
408 + 0xF0, // ####
409 + 0x48, // # #
410 + 0x48, // # #
411 + 0x48, // # #
412 + 0x48, // # #
413 + 0xF0, // ####
414 + 0x00, //
415 + 0x00, //
416 +
417 + // @296 'E' (5 pixels wide)
418 + 0xF8, // #####
419 + 0x48, // # #
420 + 0x60, // ##
421 + 0x40, // #
422 + 0x48, // # #
423 + 0xF8, // #####
424 + 0x00, //
425 + 0x00, //
426 +
427 + // @304 'F' (5 pixels wide)
428 + 0xF8, // #####
429 + 0x48, // # #
430 + 0x60, // ##
431 + 0x40, // #
432 + 0x40, // #
433 + 0xE0, // ###
434 + 0x00, //
435 + 0x00, //
436 +
437 + // @312 'G' (5 pixels wide)
438 + 0x70, // ###
439 + 0x40, // #
440 + 0x40, // #
441 + 0x58, // # ##
442 + 0x50, // # #
443 + 0x30, // ##
444 + 0x00, //
445 + 0x00, //
446 +
447 + // @320 'H' (5 pixels wide)
448 + 0xE8, // ### #
449 + 0x48, // # #
450 + 0x78, // ####
451 + 0x48, // # #
452 + 0x48, // # #
453 + 0xE8, // ### #
454 + 0x00, //
455 + 0x00, //
456 +
457 + // @328 'I' (5 pixels wide)
458 + 0x70, // ###
459 + 0x20, // #
460 + 0x20, // #
461 + 0x20, // #
462 + 0x20, // #
463 + 0x70, // ###
464 + 0x00, //
465 + 0x00, //
466 +
467 + // @336 'J' (5 pixels wide)
468 + 0x38, // ###
469 + 0x10, // #
470 + 0x10, // #
471 + 0x50, // # #
472 + 0x50, // # #
473 + 0x20, // #
474 + 0x00, //
475 + 0x00, //
476 +
477 + // @344 'K' (5 pixels wide)
478 + 0xD8, // ## ##
479 + 0x50, // # #
480 + 0x60, // ##
481 + 0x70, // ###
482 + 0x50, // # #
483 + 0xD8, // ## ##
484 + 0x00, //
485 + 0x00, //
486 +
487 + // @352 'L' (5 pixels wide)
488 + 0xE0, // ###
489 + 0x40, // #
490 + 0x40, // #
491 + 0x40, // #
492 + 0x48, // # #
493 + 0xF8, // #####
494 + 0x00, //
495 + 0x00, //
496 +
497 + // @360 'M' (5 pixels wide)
498 + 0xD8, // ## ##
499 + 0xD8, // ## ##
500 + 0xD8, // ## ##
501 + 0xA8, // # # #
502 + 0x88, // # #
503 + 0xD8, // ## ##
504 + 0x00, //
505 + 0x00, //
506 +
507 + // @368 'N' (5 pixels wide)
508 + 0xD8, // ## ##
509 + 0x68, // ## #
510 + 0x68, // ## #
511 + 0x58, // # ##
512 + 0x58, // # ##
513 + 0xE8, // ### #
514 + 0x00, //
515 + 0x00, //
516 +
517 + // @376 'O' (5 pixels wide)
518 + 0x30, // ##
519 + 0x48, // # #
520 + 0x48, // # #
521 + 0x48, // # #
522 + 0x48, // # #
523 + 0x30, // ##
524 + 0x00, //
525 + 0x00, //
526 +
527 + // @384 'P' (5 pixels wide)
528 + 0xF0, // ####
529 + 0x48, // # #
530 + 0x48, // # #
531 + 0x70, // ###
532 + 0x40, // #
533 + 0xE0, // ###
534 + 0x00, //
535 + 0x00, //
536 +
537 + // @392 'Q' (5 pixels wide)
538 + 0x30, // ##
539 + 0x48, // # #
540 + 0x48, // # #
541 + 0x48, // # #
542 + 0x48, // # #
543 + 0x30, // ##
544 + 0x18, // ##
545 + 0x00, //
546 +
547 + // @400 'R' (5 pixels wide)
548 + 0xF0, // ####
549 + 0x48, // # #
550 + 0x48, // # #
551 + 0x70, // ###
552 + 0x48, // # #
553 + 0xE8, // ### #
554 + 0x00, //
555 + 0x00, //
556 +
557 + // @408 'S' (5 pixels wide)
558 + 0x70, // ###
559 + 0x50, // # #
560 + 0x20, // #
561 + 0x10, // #
562 + 0x50, // # #
563 + 0x70, // ###
564 + 0x00, //
565 + 0x00, //
566 +
567 + // @416 'T' (5 pixels wide)
568 + 0xF8, // #####
569 + 0xA8, // # # #
570 + 0x20, // #
571 + 0x20, // #
572 + 0x20, // #
573 + 0x70, // ###
574 + 0x00, //
575 + 0x00, //
576 +
577 + // @424 'U' (5 pixels wide)
578 + 0xD8, // ## ##
579 + 0x48, // # #
580 + 0x48, // # #
581 + 0x48, // # #
582 + 0x48, // # #
583 + 0x30, // ##
584 + 0x00, //
585 + 0x00, //
586 +
587 + // @432 'V' (5 pixels wide)
588 + 0xD8, // ## ##
589 + 0x88, // # #
590 + 0x48, // # #
591 + 0x50, // # #
592 + 0x50, // # #
593 + 0x30, // ##
594 + 0x00, //
595 + 0x00, //
596 +
597 + // @440 'W' (5 pixels wide)
598 + 0xD8, // ## ##
599 + 0x88, // # #
600 + 0xA8, // # # #
601 + 0xA8, // # # #
602 + 0xA8, // # # #
603 + 0x50, // # #
604 + 0x00, //
605 + 0x00, //
606 +
607 + // @448 'X' (5 pixels wide)
608 + 0xD8, // ## ##
609 + 0x50, // # #
610 + 0x20, // #
611 + 0x20, // #
612 + 0x50, // # #
613 + 0xD8, // ## ##
614 + 0x00, //
615 + 0x00, //
616 +
617 + // @456 'Y' (5 pixels wide)
618 + 0xD8, // ## ##
619 + 0x88, // # #
620 + 0x50, // # #
621 + 0x20, // #
622 + 0x20, // #
623 + 0x70, // ###
624 + 0x00, //
625 + 0x00, //
626 +
627 + // @464 'Z' (5 pixels wide)
628 + 0x78, // ####
629 + 0x48, // # #
630 + 0x10, // #
631 + 0x20, // #
632 + 0x48, // # #
633 + 0x78, // ####
634 + 0x00, //
635 + 0x00, //
636 +
637 + // @472 '[' (5 pixels wide)
638 + 0x30, // ##
639 + 0x20, // #
640 + 0x20, // #
641 + 0x20, // #
642 + 0x20, // #
643 + 0x20, // #
644 + 0x30, // ##
645 + 0x00, //
646 +
647 + // @480 '\' (5 pixels wide)
648 + 0x80, // #
649 + 0x40, // #
650 + 0x40, // #
651 + 0x20, // #
652 + 0x20, // #
653 + 0x20, // #
654 + 0x10, // #
655 + 0x00, //
656 +
657 + // @488 ']' (5 pixels wide)
658 + 0x60, // ##
659 + 0x20, // #
660 + 0x20, // #
661 + 0x20, // #
662 + 0x20, // #
663 + 0x20, // #
664 + 0x60, // ##
665 + 0x00, //
666 +
667 + // @496 '^' (5 pixels wide)
668 + 0x20, // #
669 + 0x20, // #
670 + 0x50, // # #
671 + 0x00, //
672 + 0x00, //
673 + 0x00, //
674 + 0x00, //
675 + 0x00, //
676 +
677 + // @504 '_' (5 pixels wide)
678 + 0x00, //
679 + 0x00, //
680 + 0x00, //
681 + 0x00, //
682 + 0x00, //
683 + 0x00, //
684 + 0x00, //
685 + 0xF8, // #####
686 +
687 + // @512 '`' (5 pixels wide)
688 + 0x20, // #
689 + 0x10, // #
690 + 0x00, //
691 + 0x00, //
692 + 0x00, //
693 + 0x00, //
694 + 0x00, //
695 + 0x00, //
696 +
697 + // @520 'a' (5 pixels wide)
698 + 0x00, //
699 + 0x00, //
700 + 0x30, // ##
701 + 0x10, // #
702 + 0x70, // ###
703 + 0x78, // ####
704 + 0x00, //
705 + 0x00, //
706 +
707 + // @528 'b' (5 pixels wide)
708 + 0xC0, // ##
709 + 0x40, // #
710 + 0x70, // ###
711 + 0x48, // # #
712 + 0x48, // # #
713 + 0xF0, // ####
714 + 0x00, //
715 + 0x00, //
716 +
717 + // @536 'c' (5 pixels wide)
718 + 0x00, //
719 + 0x00, //
720 + 0x70, // ###
721 + 0x40, // #
722 + 0x40, // #
723 + 0x70, // ###
724 + 0x00, //
725 + 0x00, //
726 +
727 + // @544 'd' (5 pixels wide)
728 + 0x18, // ##
729 + 0x08, // #
730 + 0x38, // ###
731 + 0x48, // # #
732 + 0x48, // # #
733 + 0x38, // ###
734 + 0x00, //
735 + 0x00, //
736 +
737 + // @552 'e' (5 pixels wide)
738 + 0x00, //
739 + 0x00, //
740 + 0x70, // ###
741 + 0x70, // ###
742 + 0x40, // #
743 + 0x30, // ##
744 + 0x00, //
745 + 0x00, //
746 +
747 + // @560 'f' (5 pixels wide)
748 + 0x10, // #
749 + 0x20, // #
750 + 0x70, // ###
751 + 0x20, // #
752 + 0x20, // #
753 + 0x70, // ###
754 + 0x00, //
755 + 0x00, //
756 +
757 + // @568 'g' (5 pixels wide)
758 + 0x00, //
759 + 0x00, //
760 + 0x38, // ###
761 + 0x48, // # #
762 + 0x48, // # #
763 + 0x38, // ###
764 + 0x08, // #
765 + 0x30, // ##
766 +
767 + // @576 'h' (5 pixels wide)
768 + 0xC0, // ##
769 + 0x40, // #
770 + 0x70, // ###
771 + 0x48, // # #
772 + 0x48, // # #
773 + 0xE8, // ### #
774 + 0x00, //
775 + 0x00, //
776 +
777 + // @584 'i' (5 pixels wide)
778 + 0x20, // #
779 + 0x00, //
780 + 0x60, // ##
781 + 0x20, // #
782 + 0x20, // #
783 + 0x70, // ###
784 + 0x00, //
785 + 0x00, //
786 +
787 + // @592 'j' (5 pixels wide)
788 + 0x20, // #
789 + 0x00, //
790 + 0x70, // ###
791 + 0x10, // #
792 + 0x10, // #
793 + 0x10, // #
794 + 0x10, // #
795 + 0x70, // ###
796 +
797 + // @600 'k' (5 pixels wide)
798 + 0xC0, // ##
799 + 0x40, // #
800 + 0x58, // # ##
801 + 0x70, // ###
802 + 0x50, // # #
803 + 0xD8, // ## ##
804 + 0x00, //
805 + 0x00, //
806 +
807 + // @608 'l' (5 pixels wide)
808 + 0x60, // ##
809 + 0x20, // #
810 + 0x20, // #
811 + 0x20, // #
812 + 0x20, // #
813 + 0x70, // ###
814 + 0x00, //
815 + 0x00, //
816 +
817 + // @616 'm' (5 pixels wide)
818 + 0x00, //
819 + 0x00, //
820 + 0xD0, // ## #
821 + 0xA8, // # # #
822 + 0xA8, // # # #
823 + 0xA8, // # # #
824 + 0x00, //
825 + 0x00, //
826 +
827 + // @624 'n' (5 pixels wide)
828 + 0x00, //
829 + 0x00, //
830 + 0xF0, // ####
831 + 0x48, // # #
832 + 0x48, // # #
833 + 0xC8, // ## #
834 + 0x00, //
835 + 0x00, //
836 +
837 + // @632 'o' (5 pixels wide)
838 + 0x00, //
839 + 0x00, //
840 + 0x30, // ##
841 + 0x48, // # #
842 + 0x48, // # #
843 + 0x30, // ##
844 + 0x00, //
845 + 0x00, //
846 +
847 + // @640 'p' (5 pixels wide)
848 + 0x00, //
849 + 0x00, //
850 + 0xF0, // ####
851 + 0x48, // # #
852 + 0x48, // # #
853 + 0x70, // ###
854 + 0x40, // #
855 + 0xE0, // ###
856 +
857 + // @648 'q' (5 pixels wide)
858 + 0x00, //
859 + 0x00, //
860 + 0x38, // ###
861 + 0x48, // # #
862 + 0x48, // # #
863 + 0x38, // ###
864 + 0x08, // #
865 + 0x18, // ##
866 +
867 + // @656 'r' (5 pixels wide)
868 + 0x00, //
869 + 0x00, //
870 + 0x78, // ####
871 + 0x20, // #
872 + 0x20, // #
873 + 0x70, // ###
874 + 0x00, //
875 + 0x00, //
876 +
877 + // @664 's' (5 pixels wide)
878 + 0x00, //
879 + 0x00, //
880 + 0x30, // ##
881 + 0x20, // #
882 + 0x10, // #
883 + 0x60, // ##
884 + 0x00, //
885 + 0x00, //
886 +
887 + // @672 't' (5 pixels wide)
888 + 0x00, //
889 + 0x40, // #
890 + 0xF0, // ####
891 + 0x40, // #
892 + 0x48, // # #
893 + 0x30, // ##
894 + 0x00, //
895 + 0x00, //
896 +
897 + // @680 'u' (5 pixels wide)
898 + 0x00, //
899 + 0x00, //
900 + 0xD8, // ## ##
901 + 0x48, // # #
902 + 0x48, // # #
903 + 0x38, // ###
904 + 0x00, //
905 + 0x00, //
906 +
907 + // @688 'v' (5 pixels wide)
908 + 0x00, //
909 + 0x00, //
910 + 0xC8, // ## #
911 + 0x48, // # #
912 + 0x30, // ##
913 + 0x30, // ##
914 + 0x00, //
915 + 0x00, //
916 +
917 + // @696 'w' (5 pixels wide)
918 + 0x00, //
919 + 0x00, //
920 + 0xD8, // ## ##
921 + 0xA8, // # # #
922 + 0xA8, // # # #
923 + 0x50, // # #
924 + 0x00, //
925 + 0x00, //
926 +
927 + // @704 'x' (5 pixels wide)
928 + 0x00, //
929 + 0x00, //
930 + 0x48, // # #
931 + 0x30, // ##
932 + 0x30, // ##
933 + 0x48, // # #
934 + 0x00, //
935 + 0x00, //
936 +
937 + // @712 'y' (5 pixels wide)
938 + 0x00, //
939 + 0x00, //
940 + 0xD8, // ## ##
941 + 0x50, // # #
942 + 0x50, // # #
943 + 0x20, // #
944 + 0x20, // #
945 + 0x60, // ##
946 +
947 + // @720 'z' (5 pixels wide)
948 + 0x00, //
949 + 0x00, //
950 + 0x78, // ####
951 + 0x50, // # #
952 + 0x28, // # #
953 + 0x78, // ####
954 + 0x00, //
955 + 0x00, //
956 +
957 + // @728 '{' (5 pixels wide)
958 + 0x10, // #
959 + 0x20, // #
960 + 0x20, // #
961 + 0x60, // ##
962 + 0x20, // #
963 + 0x20, // #
964 + 0x10, // #
965 + 0x00, //
966 +
967 + // @736 '|' (5 pixels wide)
968 + 0x20, // #
969 + 0x20, // #
970 + 0x20, // #
971 + 0x20, // #
972 + 0x20, // #
973 + 0x20, // #
974 + 0x20, // #
975 + 0x00, //
976 +
977 + // @744 '}' (5 pixels wide)
978 + 0x40, // #
979 + 0x20, // #
980 + 0x20, // #
981 + 0x30, // ##
982 + 0x20, // #
983 + 0x20, // #
984 + 0x40, // #
985 + 0x00, //
986 +
987 + // @752 '~' (5 pixels wide)
988 + 0x00, //
989 + 0x00, //
990 + 0x00, //
991 + 0x28, // # #
992 + 0x50, // # #
993 + 0x00, //
994 + 0x00, //
995 + 0x00, //
996 +};
997 +
998 +sFONT Font8 = {
999 + Font8_Table,
1000 + 5, /* Width */
1001 + 8, /* Height */
1002 +};
1003 +
1004 +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
1 +/**
2 + ******************************************************************************
3 + * @file fonts.h
4 + * @author MCD Application Team
5 + * @version V1.0.0
6 + * @date 18-February-2014
7 + * @brief Header for fonts.c file
8 + ******************************************************************************
9 + * @attention
10 + *
11 + * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
12 + *
13 + * Redistribution and use in source and binary forms, with or without modification,
14 + * are permitted provided that the following conditions are met:
15 + * 1. Redistributions of source code must retain the above copyright notice,
16 + * this list of conditions and the following disclaimer.
17 + * 2. Redistributions in binary form must reproduce the above copyright notice,
18 + * this list of conditions and the following disclaimer in the documentation
19 + * and/or other materials provided with the distribution.
20 + * 3. Neither the name of STMicroelectronics nor the names of its contributors
21 + * may be used to endorse or promote products derived from this software
22 + * without specific prior written permission.
23 + *
24 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25 + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27 + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
28 + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30 + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31 + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
32 + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33 + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 + *
35 + ******************************************************************************
36 + */
37 +
38 +/* Define to prevent recursive inclusion -------------------------------------*/
39 +#ifndef __FONTS_H
40 +#define __FONTS_H
41 +
42 +/* Max size of bitmap will based on a font24 (17x24) */
43 +#define MAX_HEIGHT_FONT 24
44 +#define MAX_WIDTH_FONT 17
45 +#define OFFSET_BITMAP 54
46 +
47 +#ifdef __cplusplus
48 + extern "C" {
49 +#endif
50 +
51 +/* Includes ------------------------------------------------------------------*/
52 +#include <stdint.h>
53 +
54 +typedef struct _tFont
55 +{
56 + const uint8_t *table;
57 + uint16_t Width;
58 + uint16_t Height;
59 +
60 +} sFONT;
61 +
62 +extern sFONT Font24;
63 +extern sFONT Font20;
64 +extern sFONT Font16;
65 +extern sFONT Font12;
66 +extern sFONT Font8;
67 +
68 +#ifdef __cplusplus
69 +}
70 +#endif
71 +
72 +#endif /* __FONTS_H */
73 +
74 +
75 +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
1 +/**********************************************************
2 + *
3 + * @file : wifi.c
4 + * @author : HaewonSeo
5 + *
6 + * @note : ESP8266 WiFi Module
7 + *
8 + **********************************************************/
9 +
10 +#include <string.h>
11 +#include "wifi.h"
12 +
13 +/* Basic AT command */
14 +const char ATCommand_AT[] = "AT\r\n"; //Simple. AT.
15 +const char ATCommand_RST[] = "AT+RST\r\n"; //Restart
16 +const char ATCommand_GMR[] = "AT+GMR\r\n"; //Get version info
17 +const char ATCommand_END[] = "\r\n"; //ATCommand end format string
18 +
19 +/* WiFi Station */
20 +const char ATCommand_CWMODE_GET[] = "AT+CWMODE?\r\n"; //Get current mode
21 +const char ATCommand_CWMODE_SET1[] = "AT+CWMODE=1\r\n"; //Set current mode1 : Station
22 +const char ATCommand_CWMODE_SET2[] = "AT+CWMODE=2\r\n"; //Set current mode2 : softAP
23 +const char ATCommand_CWMODE_SET3[] = "AT+CWMODE=3\r\n"; //Set current mode3 : Station + softAP
24 +const char ATCommand_CWJAP_GET[] = "AT+CWJAP=?\r\n"; //Get AP's info which is connected
25 +const char ATCommand_CWJAP_SET[] = "AT+CWJAP=\"WIFIID\",\"WIFIIDPW\"\r\n"; //Connect to WiFi AP
26 +const char ATCommand_CIPSTA_GET[] = "AT+CIPSTA=?\r\n"; //Get Station IP
27 +const char ATCommand_CIPSTA_SET[] = "AT+CIPSTA=\"192.168.35.127\"\r\n"; //Set Station IP
28 +
29 +/* WiFi softAP*/
30 +
31 +/* TCP/IP Client */
32 +const char ATCommand_CIPSTATUS[] = "AT+CIPSTATUS\r\n"; //Get info about connection
33 +const char ATCommand_CIPMUX_GET[] = "AT+CIPMUX?\r\n"; //Get current mode(single or multiple)
34 +const char ATCommand_CIPMUX_SET0[] = "AT+CIPMUX=0\r\n"; //Set mode for single connection
35 +const char ATCommand_CIPMUX_SET1[] = "AT+CIPMUX=1\r\n"; //Set mode for multiple connection
36 +const char ATCommand_CIFSR[] = "AT+CIFSR\r\n"; //Get local IP address
37 +const char ATCommand_CIPSTART0[] = "AT+CIPSTART=0,\"TCP\",\"192.168.35.212\",80\r\n"; //Start connection(HTTP port)
38 +const char ATCommand_CIPSTART1[] = "AT+CIPSTART=1,\"TCP\",\"192.168.35.212\",2351\r\n"; //Start connection
39 +const char ATCommand_CIPSEND0[] = "AT+CIPSEND=0,";
40 +const char ATCommand_CIPSEND1[] = "AT+CIPSEND=1,"; //Send data(without data and end string)
41 +const char ATCommand_CIPCLOSE[] = "AT+CIPCLOSE\r\n"; //Close connection
42 +
43 +enum
44 +{
45 + PULSE,
46 + PUBKEY1,
47 + PUBKEY2,
48 + SIGNATURE_R,
49 + SIGNATURE_S
50 +};
51 +
52 +const char GET_MSG_HEAD[] = "GET /process.php?";
53 +const char *GET_MSG_BODY[5] = {"pulse=", "pubKey1=", "pubKey2=", "signatureR=", "signatureS="};
54 +const char GET_MSG_AND[] = "&";
55 +const char GET_MSG_TAIL[] = " HTTP/1.1\nHost: 127.0.0.1\nConnection: keep-alive\nAccept: */*\n\n";
56 +//const char GET_MSG[] = "GET /process.php?pulse=112345 HTTP/1.1\nHost: 192.168.35.128\nConnection: keep-alive\nAccept: */*\n\n";
57 +
58 +void printNetworkData(t_netData *netData)
59 +{
60 + printf("printNetworkData\n");
61 +
62 + printf("netLen : %d\n", netData->len);
63 + printf("netData : %s\n", netData->data);
64 + return;
65 +}
66 +
67 +static void stringKeyToKey(char *stringKey, uint8_t *key, int len)
68 +{
69 +
70 + //printSecure("StringKeyToKey\n", NULL, NULL);
71 +
72 + uint8_t temp0;
73 + int i = 0;
74 +
75 + //printSecure("stringKey[0] = %x\n", NULL,(uint8_t)stringKey[0]);
76 +
77 + for (int nb = 0; nb < len; nb++)
78 + {
79 + if (stringKey[nb] >= 0x30 && stringKey[nb] <= 0x39)
80 + {
81 + if (!(nb % 2))
82 + temp0 = ((uint8_t)stringKey[nb] - 0x30) << 4;
83 + else
84 + temp0 = temp0 | ((uint8_t)stringKey[nb] - 0x30);
85 + //printSecure("temp0_A : %x\n", NULL,temp0);
86 + }
87 + else if (stringKey[nb] >= 0x61 && stringKey[nb] <= 0x66)
88 + {
89 + if (!(nb % 2))
90 + temp0 = (stringKey[nb] - 0x57) << 4;
91 + else
92 + temp0 = temp0 | (stringKey[nb] - 0x57);
93 + //printSecure("temp0_B : %x\n", NULL,temp0);
94 + }
95 + else
96 + {
97 + printSecure("StringKeyToKey ERROR : Bad Key.\n", NULL, NULL);
98 + break;
99 + }
100 + i = (int)(nb / 2);
101 + key[i] = temp0;
102 + }
103 +}
104 +
105 +static void keyToStringKey(uint8_t *key, char *stringKey, int len)
106 +{
107 +
108 + //printSecure("keyToStringKey\n", NULL, NULL);
109 + //printSecure("key[0] = %x\n", NULL,(uint8_t)key[0]);
110 + uint8_t temp0;
111 + int i = 0;
112 +
113 + for (int nb = 0; nb < len; nb++)
114 + {
115 +
116 + i = (int)(nb / 2);
117 + if (!(nb % 2))
118 + temp0 = (key[i] >> 4) & 0x0f;
119 + else
120 + temp0 = 0x0f & key[i];
121 +
122 + if (temp0 >= 0 && temp0 <= 9)
123 + stringKey[nb] = (char)(temp0 + 0x30);
124 + else if (temp0 >= 0xa && temp0 <= 0xf)
125 + stringKey[nb] = (char)(temp0 + 0x57);
126 + }
127 +
128 + //printSecure("stringKey = %s\n", stringKey, NULL);
129 +}
130 +
131 +void WIFI_Init()
132 +{
133 + CLK->APBCLK0 |= CLK_APBCLK0_UART3CKEN_Msk;
134 + CLK->CLKSEL3 = (CLK->CLKSEL3 & (~CLK_CLKSEL3_UART3SEL_Msk)) | CLK_CLKSEL3_UART3SEL_HIRC;
135 +
136 + WIFI_PORT->LINE = UART_PARITY_NONE | UART_STOP_BIT_1 | UART_WORD_LEN_8;
137 + WIFI_PORT->BAUD = UART_BAUD_MODE2 | UART_BAUD_MODE2_DIVIDER(__HIRC, 115200);
138 +
139 + /* Set multi-function pins for RXD and TXD */
140 + //SYS->GPC_MFPL = (SYS->GPC_MFPL & (~(UART4_RXD_PC6_Msk | UART4_TXD_PC7_Msk))) | UART4_RXD_PC6 | UART4_TXD_PC7;
141 + SYS->GPD_MFPL = (SYS->GPD_MFPL & (~(UART3_RXD_PD0_Msk | UART3_TXD_PD1_Msk))) | UART3_RXD_PD0 | UART3_TXD_PD1;
142 +}
143 +
144 +void WIFI_Connect()
145 +{
146 +
147 + if (DEMO)
148 + {
149 + printf("| WiFi Module Loading ... |\n");
150 + printf("| |\n");
151 + }
152 +
153 + IOCTL_INIT;
154 +
155 + PWR_OFF = 1;
156 +
157 + //FW_UPDATE_OFF = 0; // Set 0 to enable WIFI module firmware update.
158 + FW_UPDATE_OFF = 1; // Set 1 to Disable WIFI module firmware update.
159 + CLK_SysTickLongDelay(1000000);
160 +
161 + PWR_OFF = 0;
162 +
163 + char buff;
164 + int ready = 0;
165 + int indx = 0;
166 + int loop = 0;
167 + int wifiUP = 0;
168 +
169 + while (wifiUP == 0)
170 + {
171 +
172 + //while((WIFI_PORT->FIFOSTS & UART_FIFOSTS_RXIDLE_Msk) == 1);
173 + while ((WIFI_PORT->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk) == 0)
174 + {
175 + loop = 0;
176 + buff = WIFI_PORT->DAT;
177 + //printf("%c",buff);
178 + if (indx == 0 && buff == 'r' && loop == 0)
179 + {
180 + indx = 1;
181 + loop = 1;
182 + //printf("%c",buff);
183 + }
184 + if (indx == 1 && buff == 'e' && loop == 0)
185 + {
186 + indx = 2;
187 + loop = 1;
188 + //printf("%c",buff);
189 + }
190 + else if (indx == 1 && loop == 0)
191 + indx = 0;
192 +
193 + if (indx == 2 && buff == 'a' && loop == 0)
194 + {
195 + indx = 3;
196 + loop = 1;
197 + //printf("%c",buff);
198 + }
199 + else if (indx == 2 && loop == 0)
200 + indx = 0;
201 +
202 + if (indx == 3 && buff == 'd' && loop == 0)
203 + {
204 + indx = 4;
205 + loop = 1;
206 + //printf("%c",buff);
207 + }
208 + else if (indx == 3 && loop == 0)
209 + indx = 0;
210 +
211 + if (indx == 4 && buff == 'y' && loop == 0)
212 + {
213 + ready = 1;
214 + loop = 1;
215 + //printf("%c",buff);
216 + }
217 + else if (indx == 4 && loop == 0)
218 + indx = 0;
219 + }
220 + if (ready)
221 + {
222 +
223 + WIFI_Write(PRINT, ATCommand_AT, strlen(ATCommand_AT));
224 + WIFI_Read(PRINT);
225 +
226 + WIFI_Write(PRINT, ATCommand_CWMODE_SET1, strlen(ATCommand_CWMODE_SET1));
227 + WIFI_Read(PRINT);
228 + if (DEMO)
229 + printf("| Current mode : Station |\n");
230 +
231 + WIFI_Write(PRINT, ATCommand_CWJAP_SET, strlen(ATCommand_CWJAP_SET));
232 + WIFI_Read(PRINT);
233 + if (DEMO)
234 + printf("| WiFi SSID : \"SK_WiFiGIGA7EB1\" |\n");
235 +
236 + WIFI_Write(PRINT, ATCommand_CIPSTA_SET, strlen(ATCommand_CIPSTA_SET));
237 + WIFI_Read(PRINT);
238 + if (DEMO)
239 + printf("| Set Station IP : 192.168.35.127 |\n");
240 +
241 + // WIFI_Write(PRINT, ATCommand_CIPMUX_SET0, strlen(ATCommand_CIPMUX_SET0));
242 + // WIFI_Read(PRINT);
243 + // if (DEMO) printf("| WiFi Single Server Connections Enabled |\n");
244 +
245 + WIFI_Write(PRINT, ATCommand_CIPMUX_SET1, strlen(ATCommand_CIPMUX_SET1));
246 + WIFI_Read(PRINT);
247 + if (DEMO)
248 + printf("| WiFi Multiple Server Connections Enabled |\n");
249 +
250 + WIFI_Write(PRINT, ATCommand_CIPSTATUS, strlen(ATCommand_CIPSTATUS));
251 + WIFI_Read(PRINT);
252 +
253 + WIFI_Write(PRINT, ATCommand_CIPSTART0, strlen(ATCommand_CIPSTART0));
254 + WIFI_Read(PRINT);
255 + if (DEMO)
256 + printf("| Server TCP enabled on 80 port |\n");
257 +
258 + WIFI_Write(PRINT, ATCommand_CIPSTART1, strlen(ATCommand_CIPSTART1));
259 + WIFI_Read(PRINT);
260 + if (DEMO)
261 + printf("| Server TCP enabled on 2351 port |\n");
262 +
263 + //WIFI_PORT_Write(command_CIPSTO, (sizeof(command_CIPSTO) / sizeof(char))-1);
264 + //printf("WiFi Nuvoton Timeout is : \n");
265 + //WIFI_PORT_Read(1);
266 +
267 + if (DEMO)
268 + {
269 + printf("| |\n");
270 + printf("| WiFi Module ESP8266 is Ready |\n");
271 + printf("+---------------------------------------------+\n");
272 + }
273 + wifiUP = 1;
274 + }
275 + }
276 +}
277 +
278 +/* Receive data from ESP8266 char by char, until last 'OK' message is received */
279 +void WIFI_Read(int print)
280 +{
281 + char buf = 0;
282 + char lastBuf = 0;
283 + int cmdOK = 0;
284 +
285 + while (cmdOK == 0)
286 + {
287 +
288 + while ((WIFI_PORT->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk) == 0)
289 + {
290 + buf = (char)WIFI_PORT->DAT;
291 + if (print)
292 + printf("%c", buf);
293 + if (lastBuf == 'O' && buf == 'K')
294 + {
295 + //printf("\n");
296 + cmdOK = 1;
297 + }
298 + else
299 + lastBuf = buf;
300 + }
301 + }
302 +}
303 +
304 +/* Send AT command on UART to ESP8266 char by char */
305 +void WIFI_Write(int print, const char *command, int lenCommand)
306 +{
307 +
308 + for (int i = 0; i < lenCommand; i++)
309 + {
310 + while ((WIFI_PORT->FIFOSTS & UART_FIFOSTS_TXFULL_Msk))
311 + ;
312 + WIFI_PORT->DAT = command[i];
313 + if (print)
314 + printf("%c", command[i]);
315 + }
316 +}
317 +
318 +/* AT+CIPSEND : Send data */
319 +int WIFI_SendData(int print, t_netData *netData, int port)
320 +{
321 + int lengthStrLen = 0;
322 + char *lengthStr;
323 + int tmpLen = netData->len;
324 +
325 + if (DEMO)
326 + printf("| NonSecure is running ... Send Data |\n");
327 +
328 + while (tmpLen)
329 + {
330 + lengthStrLen++;
331 + tmpLen /= 10;
332 + }
333 +
334 + lengthStr = calloc((lengthStrLen + 1), sizeof(char));
335 + sprintf(lengthStr, "%d", netData->len);
336 +
337 + // AT+CIPSEND=
338 + if (port == 0)
339 + WIFI_Write(print, ATCommand_CIPSEND0, strlen(ATCommand_CIPSEND0));
340 + else if (port == 1)
341 + WIFI_Write(print, ATCommand_CIPSEND1, strlen(ATCommand_CIPSEND1));
342 + // <length>
343 + WIFI_Write(print, lengthStr, lengthStrLen);
344 + // \r\n
345 + WIFI_Write(print, ATCommand_END, strlen(ATCommand_END));
346 +
347 + WIFI_Read(print);
348 +
349 + // >DATA
350 + WIFI_Write(print, netData->data, netData->len);
351 + // \r\n
352 + WIFI_Write(print, ATCommand_END, strlen(ATCommand_END));
353 +
354 + // SEND OK
355 + WIFI_Read(print);
356 +
357 + free(lengthStr);
358 +
359 + if (print)
360 + printf("\nData Sent !\n");
361 +
362 + return 1;
363 +}
364 +
365 +/* +IPD : Receive network data */
366 +int WIFI_ReceiveData(int print, t_netData *netData)
367 +{
368 + char buff = 0;
369 + int isReceive = 0;
370 + int loop = 0;
371 + int indx = 0;
372 + char dataR[64] = {0};
373 + int i = 0;
374 + int c = 0;
375 + int nbCharLength = 0;
376 + int lengthData = 0;
377 + int columnDetect = 0;
378 +
379 + if (DEMO)
380 + printf("| NonSecure is running ... Wait Data |\n");
381 +
382 + // +IPD,<channel>,<len>:data --- +IPD,1,4:abcd
383 + while (isReceive == 0)
384 + {
385 + //printf(".");
386 + while ((WIFI_PORT->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk) == 0)
387 + {
388 + loop = 0;
389 + buff = WIFI_PORT->DAT;
390 + printf("%c", buff);
391 + if (indx == 0 && buff == '+' && loop == 0)
392 + {
393 + indx = 1;
394 + loop = 1;
395 + //printf("%c",buff);
396 + }
397 + if (indx == 1 && buff == 'I' && loop == 0)
398 + {
399 + indx = 2;
400 + loop = 1;
401 + //printf("%c",buff);
402 + }
403 + else if (indx == 1 && loop == 0)
404 + indx = 0;
405 +
406 + if (indx == 2 && buff == 'P' && loop == 0)
407 + {
408 + indx = 3;
409 + loop = 1;
410 + //printf("%c",buff);
411 + }
412 + else if (indx == 2 && loop == 0)
413 + indx = 0;
414 +
415 + if (indx == 3 && buff == 'D' && loop == 0)
416 + {
417 + indx = 4;
418 + loop = 1;
419 + //printf("%c",buff);
420 + }
421 + else if (indx == 3 && loop == 0)
422 + indx = 0;
423 +
424 + if (indx == 4 && buff == ',' && loop == 0)
425 + {
426 + isReceive = 1;
427 + loop = 1;
428 + break;
429 + //printf("%c",buff);
430 + }
431 + else if (indx == 4 && loop == 0)
432 + indx = 0;
433 + }
434 + }
435 + printf("\n\n");
436 + while (isReceive)
437 + {
438 + //printf(",");
439 + while ((WIFI_PORT->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk) == 0)
440 + {
441 + buff = WIFI_PORT->DAT;
442 + printf("[%c]", buff);
443 +
444 + if (c == 0)
445 + {
446 + uint8_t channelID = buff - 0x30;
447 + if (print)
448 + printf("\nchannel ID : %d\n", channelID);
449 + }
450 +
451 + if (c == 1 && buff != ',')
452 + isReceive = 0; //ERROR
453 +
454 + //Data Read
455 + if (columnDetect && c < lengthData + 3 + nbCharLength)
456 + dataR[c - (3 + nbCharLength)] = buff;
457 +
458 + //Length parse
459 + if (c > 1 && columnDetect == 0)
460 + {
461 + //printf("#");
462 + if (buff == ':')
463 + {
464 + columnDetect = 1;
465 + lengthData--;
466 + if (print)
467 + printf("\nlengthData : %d\n", lengthData);
468 + }
469 + else
470 + {
471 + lengthData = 10 * lengthData + buff - 0x30;
472 + nbCharLength++;
473 + }
474 + }
475 +
476 + // 1,4:abcd
477 + // lengthData = "abcd"
478 + // 3 = "1,:"
479 + // nbCharLength = strlen("4")
480 + if (columnDetect && c == lengthData + 3 + nbCharLength)
481 + isReceive = 0;
482 + c++;
483 + }
484 + }
485 +
486 + for (int nb = 0; nb <= lengthData; nb++)
487 + (netData->data)[nb] = dataR[nb];
488 + netData->len = lengthData;
489 +
490 + printf("\ndataR : %s\n", dataR);
491 + //printf("lengthData : %d\n", lengthData);
492 +
493 + if (print)
494 + printNetworkData(netData);
495 +
496 + return 1;
497 +}
498 +
499 +void WIFI_Send_BPM(int pulse)
500 +{
501 + t_netData *get;
502 + int tmpPulse;
503 + char *strPulse;
504 + int strPulseLen = 0;
505 + int totalLen;
506 +
507 + //Convert int pulse to char *strPulse
508 + if (pulse == 0)
509 + strPulseLen = 1;
510 + else
511 + {
512 + tmpPulse = pulse;
513 + while (tmpPulse)
514 + {
515 + strPulseLen++;
516 + tmpPulse /= 10;
517 + }
518 + }
519 + strPulse = calloc((strPulseLen + 1), sizeof(char));
520 + sprintf(strPulse, "%d", pulse);
521 +
522 + //Create t_netData *get
523 + totalLen = strlen(GET_MSG_HEAD) + strlen(GET_MSG_BODY[PULSE]) + strlen(GET_MSG_TAIL) + strPulseLen;
524 +
525 + get = calloc(1, sizeof(t_netData));
526 + get->data = calloc(totalLen, sizeof(char));
527 + get->len = totalLen;
528 +
529 + strcat(get->data, GET_MSG_HEAD);
530 + strcat(get->data, GET_MSG_BODY[PULSE]);
531 + strcat(get->data, strPulse);
532 + strcat(get->data, GET_MSG_TAIL);
533 +
534 + //printNetworkData(get);
535 + WIFI_SendData(0, get, 0);
536 +
537 + free(get->data);
538 + free(get);
539 + free(strPulse);
540 +}
541 +
542 +void WIFI_Send_EncryptedMsg(uint8_t *encryptedMsg, int encryptedMsgBytes, uint32_t body)
543 +{
544 + t_netData *get;
545 + char *strMsg;
546 + int strMsgLen = encryptedMsgBytes * 2;
547 + int totalLen;
548 +
549 + //Convert uint8_t *encryptedBPM to char *strEncrytedBPM
550 + strMsg = calloc(strMsgLen + 1, sizeof(char));
551 + keyToStringKey(encryptedMsg, strMsg, strMsgLen);
552 + //printf("strMsg(%d) : %s\n", strMsgLen, strMsg);
553 +
554 + totalLen = strlen(GET_MSG_HEAD) + strlen(GET_MSG_BODY[body]) + strlen(GET_MSG_TAIL) + strMsgLen;
555 +
556 + //Create t_netData *get
557 + get = calloc(1, sizeof(t_netData));
558 + get->data = calloc(totalLen, sizeof(char));
559 + get->len = totalLen;
560 +
561 + strcat(get->data, GET_MSG_HEAD);
562 + strcat(get->data, GET_MSG_BODY[body]);
563 + strcat(get->data, strMsg);
564 + strcat(get->data, GET_MSG_TAIL);
565 +
566 + //printBlock(encryptedBPM);
567 + //printBlock(strPulse);
568 + //printf("\nstrPulse : %s\n", strPulse);
569 + // printf("\nstrPulseLen : %d\n", strlen(strPulse));
570 + printNetworkData(get);
571 +
572 + WIFI_SendData(0, get, 0);
573 +
574 + free(get->data);
575 + free(get);
576 + free(strMsg);
577 +}
578 +
579 +void WIFI_Send_DigitallySignedData(t_digitallySignedData *dsd)
580 +{
581 + uint32_t u32i;
582 +
583 + WIFI_Send_EncryptedMsg(dsd->data, 16, PULSE);
584 + WIFI_Send_EncryptedMsg(dsd->pubKey1, 24, PUBKEY1);
585 + WIFI_Send_EncryptedMsg(dsd->pubKey2, 24, PUBKEY2);
586 + WIFI_Send_EncryptedMsg(dsd->R, 24, SIGNATURE_R);
587 + WIFI_Send_EncryptedMsg(dsd->S, 24, SIGNATURE_S);
588 + return;
589 +}
590 +
591 +void WIFI_Send_EncryptedDigitallySignedData(t_digitallySignedData *dsd)
592 +{
593 + t_netData *get;
594 + char *strMsg;
595 + int dsdLen[5] = {16, 24, 24, 24, 24};
596 + int totalLen = 0;
597 +
598 + totalLen += strlen(GET_MSG_HEAD);
599 + totalLen += strlen(GET_MSG_BODY[PULSE]);
600 + totalLen += 2 * dsdLen[PULSE] + 1; // sttlen(data) + strlen(GET_MSG_AND);
601 + totalLen += strlen(GET_MSG_BODY[PUBKEY1]);
602 + totalLen += 2 * dsdLen[PUBKEY1] + 1; // sttlen(pubKey1) + strlen(GET_MSG_AND);
603 + totalLen += strlen(GET_MSG_BODY[PUBKEY2]);
604 + totalLen += 2 * dsdLen[PUBKEY2] + 1; // sttlen(pubKey1) + strlen(GET_MSG_AND);
605 + totalLen += strlen(GET_MSG_BODY[SIGNATURE_R]);
606 + totalLen += 2 * dsdLen[SIGNATURE_R] + 1; // sttlen(signatureR) + strlen(GET_MSG_AND);
607 + totalLen += strlen(GET_MSG_BODY[SIGNATURE_S]);
608 + totalLen += 2 * dsdLen[SIGNATURE_S]; // strlen(signatureR);
609 + totalLen += strlen(GET_MSG_TAIL);
610 +
611 + //Create t_netData *get
612 + get = calloc(1, sizeof(t_netData));
613 + get->data = calloc(totalLen, sizeof(char));
614 + get->len = totalLen;
615 +
616 + strcat(get->data, GET_MSG_HEAD);
617 +
618 + strcat(get->data, GET_MSG_BODY[PULSE]);
619 + strMsg = calloc(2 * dsdLen[PULSE] + 1, sizeof(char));
620 + keyToStringKey(dsd->data, strMsg, 2 * dsdLen[PULSE]);
621 + strcat(get->data, strMsg);
622 + free(strMsg);
623 + strcat(get->data, GET_MSG_AND);
624 +
625 + strcat(get->data, GET_MSG_BODY[PUBKEY1]);
626 + strMsg = calloc(2 * dsdLen[PUBKEY1] + 1, sizeof(char));
627 + keyToStringKey(dsd->pubKey1, strMsg, 2 * dsdLen[PUBKEY1]);
628 + strcat(get->data, strMsg);
629 + free(strMsg);
630 + strcat(get->data, GET_MSG_AND);
631 +
632 + strcat(get->data, GET_MSG_BODY[PUBKEY2]);
633 + strMsg = calloc(2 * dsdLen[PUBKEY2] + 1, sizeof(char));
634 + keyToStringKey(dsd->pubKey2, strMsg, 2 * dsdLen[PUBKEY2]);
635 + strcat(get->data, strMsg);
636 + free(strMsg);
637 + strcat(get->data, GET_MSG_AND);
638 +
639 + strcat(get->data, GET_MSG_BODY[SIGNATURE_R]);
640 + strMsg = calloc(2 * dsdLen[SIGNATURE_R] + 1, sizeof(char));
641 + keyToStringKey(dsd->R, strMsg, 2 * dsdLen[SIGNATURE_R]);
642 + strcat(get->data, strMsg);
643 + free(strMsg);
644 + strcat(get->data, GET_MSG_AND);
645 +
646 + strcat(get->data, GET_MSG_BODY[SIGNATURE_S]);
647 + strMsg = calloc(2 * dsdLen[SIGNATURE_S] + 1, sizeof(char));
648 + keyToStringKey(dsd->S, strMsg, 2 * dsdLen[SIGNATURE_S]);
649 + strcat(get->data, strMsg);
650 + free(strMsg);
651 +
652 + strcat(get->data, GET_MSG_TAIL);
653 +
654 + printNetworkData(get);
655 +
656 + WIFI_SendData(0, get, 0);
657 +
658 + free(get->data);
659 + free(get);
660 +}
1 + /**********************************************************
2 + *
3 + * @file : wifi.h
4 + * @author : HaewonSeo
5 + *
6 + * @note : ESP8266 WiFi Module
7 + *
8 + **********************************************************/
9 +
10 +#include <stdio.h>
11 +#include <stdlib.h>
12 +#include "NuMicro.h"
13 +#include "cssd_lib.h"
14 +
15 +#ifndef __WIFI_H__
16 +#define __WIFI_H__
17 +
18 +#define WIFI_PORT UART3_NS // Used to connect to WIFI module
19 +#define BYPASS_PORT UART0_NS // Used to byass WIFI module
20 +
21 +//#define LED_Y PC11_NS // Yellow LED
22 +//#define LED_G PC12_NS // Green LED
23 +#define PWR_OFF PD7_NS
24 +#define FW_UPDATE_OFF PD6_NS
25 +
26 +#define IOCTL_INIT { \
27 + PD_NS->MODE = (GPIO_MODE_OUTPUT << 6*2) | (GPIO_MODE_OUTPUT << 7*2); }\
28 + //PC_NS->MODE = (GPIO_MODE_OUTPUT << 11*2) | (GPIO_MODE_OUTPUT << 12*2); } \
29 + //PA->MODE = (GPIO_MODE_OUTPUT << 10*2) | (GPIO_MODE_OUTPUT << 11*2) ;}
30 +
31 +typedef struct s_netData
32 +{
33 + char *data;
34 + int len;
35 +} t_netData;
36 +
37 +
38 +void printNetworkData(t_netData *netData);
39 +void WIFI_Init();
40 +void WIFI_Connect();
41 +void WIFI_Read(int);
42 +void WIFI_Write(int, const char *, int);
43 +int WIFI_ReceiveData(int, t_netData *);
44 +int WIFI_SendData(int print, t_netData *netData, int port);
45 +
46 +void WIFI_Send_BPM(int pulse);
47 +void WIFI_Send_EncryptedMsg(uint8_t *encryptedMsg, int encryptedMsgBytes, uint32_t body);
48 +void WIFI_Send_DigitallySignedData(t_digitallySignedData *dsd);
49 +void WIFI_Send_EncryptedDigitallySignedData(t_digitallySignedData *dsd);
50 +
51 + #endif /* __WIFI_H__ */
1 + /**********************************************************
2 + *
3 + * @file : cssd_lib.h
4 + * @author : HaewonSeo
5 + *
6 + * @note : M2351 Collaborative Secure Software Development Library header file
7 + *
8 + **********************************************************/
9 +#include <stdint.h>
10 +
11 +#ifndef __CSSD_LIB_H__
12 +#define __CSSD_LIB_H__
13 +
14 +
15 +typedef struct s_digitallySignedData
16 +{
17 + uint8_t data[17];
18 + uint8_t pubKey1[25];
19 + uint8_t pubKey2[25];
20 + uint8_t R[25];
21 + uint8_t S[25];
22 +} t_digitallySignedData;
23 +
24 +/*----------------------------------------------------------------------------
25 + NonSecure Callable Functions from Secure Region
26 + *----------------------------------------------------------------------------*/
27 +extern uint32_t GetSystemCoreClock(void);
28 +
29 +extern int32_t Secure_OLED_On_callback(void (*)(uint32_t));
30 +extern int32_t Secure_OLED_Off_callback(void (*)(uint32_t));
31 +
32 +/*----------------------------------------------------------------------------
33 + MAX30102 Heart-Rate Sensor functions
34 + *----------------------------------------------------------------------------*/
35 +
36 +extern uint32_t Get_BPM();
37 +extern uint32_t Get_EncryptedDigitallySignedData(t_digitallySignedData *dsd);
38 +
39 +/*----------------------------------------------------------------------------
40 + CRYPTO functions
41 + *----------------------------------------------------------------------------*/
42 +
43 +extern int32_t Encrypt_data(uint8_t *plainData, uint8_t *encryptedData, uint32_t bytes);
44 +extern int32_t Decrypt_data(uint8_t *encryptedData, uint8_t *resultData, uint32_t bytes);
45 +extern void M2351_LoadKey();
46 +extern void M2351_DeleteKey();
47 +/*----------------------------------------------------------------------------
48 + PRINT functions
49 + *----------------------------------------------------------------------------*/
50 +
51 +extern void printBlock(uint8_t *block);
52 +extern void printSecure(char *string, void *ptr, uint8_t val);
53 +extern int32_t printDigitallySignedData(t_digitallySignedData *dsd);
54 +
55 +#endif //__CSSD_LIB_H__
1 + /**********************************************************
2 + *
3 + * @file : main_ns.c
4 + * @author : HaewonSeo
5 + *
6 + * @note : Main of Non-secure world, Non-secure code for Collaborative Secure Software Development
7 + *
8 + **********************************************************/
9 +
10 +#include <arm_cmse.h>
11 +#include <string.h>
12 +#include "NuMicro.h" /* Device header */
13 +#include "cssd_lib.h" /* Collaborative Secure Software Development Library header */
14 +#include "wifi.h"
15 +#include "OLED_GUI.h"
16 +
17 +#define SW2 PB0_NS
18 +#define SW3 PB1_NS
19 +
20 +extern const char ATCommand_CIPSTART[];
21 +extern void OLED_BPM(uint32_t bpm);
22 +
23 +/*----------------------------------------------------------------------------
24 + NonSecure Functions from NonSecure Region
25 + *----------------------------------------------------------------------------*/
26 +
27 +
28 +
29 +void Control_SW3()
30 +{
31 + int result = 0;
32 + t_netData *send;
33 +
34 + send = calloc(1, sizeof(t_netData));
35 + send->data = calloc(33, sizeof(char));
36 + send->len = 0;
37 +
38 + //result = WIFI_ReceiveData(1, rec);
39 +
40 + const char msg[] = "Hello..";
41 +
42 + send->len = strlen(msg);
43 + strcpy(send->data, msg);
44 +
45 + WIFI_SendData(1, send, 1);
46 +
47 + free(send->data);
48 + free(send);
49 +
50 + t_netData *rec = malloc(sizeof(t_netData));
51 + rec->data = malloc(sizeof(char)*33);
52 + (rec->data)[32] = '\0';
53 + rec->len = 0;
54 + WIFI_ReceiveData(1, rec);
55 +
56 + free(rec->data);
57 + free(rec);
58 +
59 + return ;
60 +}
61 +
62 +/*----------------------------------------------------------------------------
63 + SysTick IRQ Handler
64 + *----------------------------------------------------------------------------*/
65 +void SysTick_Handler(void)
66 +{
67 + static uint32_t u32Ticks;
68 +
69 + switch(u32Ticks++)
70 + {
71 + case 0:
72 + break;
73 + case 100:
74 + break;
75 + case 200:
76 + break;
77 + case 300:
78 + break;
79 + case 400:
80 + break;
81 + case 500:
82 + break;
83 + case 600:
84 + u32Ticks = 0;
85 + break;
86 + default:
87 + if(u32Ticks > 600)
88 + {
89 + u32Ticks = 0;
90 + }
91 + }
92 +}
93 +
94 +/*----------------------------------------------------------------------------
95 + Main function
96 + *----------------------------------------------------------------------------*/
97 +int main(void)
98 +{
99 + int32_t i = 0;
100 + int32_t ispulse = 0;
101 + uint32_t pulse = 0;
102 + t_digitallySignedData dsd;
103 + memset(&dsd, 0, sizeof(t_digitallySignedData));
104 +
105 + int32_t SW2_toggle = 0;
106 + int32_t ns_ticks = 0;
107 +
108 + printf("\n");
109 + printf("+---------------------------------------------+\n");
110 + printf("| Non-Secure is running ... |\n");
111 + printf("+---------------------------------------------+\n");
112 +
113 + /* register NonSecure callbacks in Secure application */
114 + Secure_OLED_On_callback(&OLED_BPM);
115 + //Secure_OLED_Off_callback(&NonSecure_OLED_Off);
116 +
117 + /* Call secure API to get system core clock */
118 + SystemCoreClock = GetSystemCoreClock();
119 +
120 + /* Generate Systick interrupt each 10 ms */
121 + SysTick_Config(SystemCoreClock / 100);
122 +
123 +
124 + printf("\n");
125 + printf("+---------------------------------------------+\n");
126 + printf("| SDK1327 OLED Init |\n");
127 + printf("+---------------------------------------------+\n");
128 +
129 + OLED_Config();
130 +
131 + printf("\n");
132 + printf("+---------------------------------------------+\n");
133 + printf("| ESP8266 WiFi Module Start |\n");
134 + printf("+---------------------------------------------+\n");
135 +
136 + WIFI_Connect();
137 +
138 + while(1)
139 + {
140 + /* SW2 */
141 + if(SW2 == 0)
142 + {
143 + while(SW2 == 0);
144 + SW2_toggle = !SW2_toggle;
145 + printf("\nSW2 ON in Non-secure code ...\n\n");
146 +
147 + if(SW2_toggle)
148 + {
149 + ns_ticks = 0;
150 + printf("\nMAX30102 On ...\n\n");
151 + M2351_LoadKey();
152 + OLED_Background_On();
153 + }
154 + else
155 + {
156 + printf("\nMAX30102 Off ...\n\n");
157 + M2351_DeleteKey();
158 + OLED_Off();
159 + }
160 + }
161 + /* SW3 */
162 + if(SW3 == 0)
163 + {
164 + while(SW3 == 0);
165 + printf("\nSW3 ON in Non-secure code ...\n\n");
166 + Control_SW3();
167 + }
168 + if(SW2_toggle)
169 + {
170 + /* Get digitally signed data of BPM from MAX30102 */
171 + ispulse = Get_EncryptedDigitallySignedData(&dsd);
172 + ns_ticks++;
173 + if (ns_ticks >= 60)
174 + {
175 + ns_ticks = 0;
176 + if (ispulse)
177 + {
178 + printf("\nEncrypted digitallySignedData\n");
179 + printDigitallySignedData(&dsd);
180 + /* Send digitally signed data of BPM to Server */
181 + //WIFI_Send_BPM(ispulse);
182 + WIFI_Send_EncryptedDigitallySignedData(&dsd);
183 + }
184 + }
185 + }
186 + }
187 +}
188 +
189 +//CLK_SysTickLongDelay(300000); //300000us = 300ms = 0.3s
190 +
191 +/*
192 +void testCryptDeCrypt() {
193 +
194 + //Test Function to cipher and decypher data
195 +
196 + //__attribute__((aligned(4))) uint8_t plainData[16] = {0x32, 0x43, 0xf6, 0xa8, 0x88, 0x5a, 0x30, 0x8d, 0x31, 0x31, 0x98, 0xa2, 0xe0, 0x37, 0x07, 0x34};
197 + __attribute__((aligned(4))) uint8_t plainData[16] = {0};
198 +
199 + __attribute__((aligned(4))) uint8_t cipheredData[16] = {0};
200 + __attribute__((aligned(4))) uint8_t resultData[16] = {0};
201 +
202 + __attribute__((aligned(4))) uint8_t key[16] =
203 + {
204 + 0x7f, 0x35, 0x91, 0xd3, 0x6f, 0xd5, 0x17, 0xa3, 0x7b, 0x6d, 0xe9, 0xe0, 0xdf, 0x93, 0x4b, 0x7a
205 + };
206 + __attribute__((aligned(4))) uint8_t iv[16] = {0};
207 +
208 + sprintf((char *)plainData, "%d", 123);
209 + printf("%s\n", plainData);
210 +
211 + if (DEMO) {
212 + //printSecure("&key = %p\n",key);
213 + //printBlock(key);
214 + //printSecure("&iv = %p\n",iv);
215 + //printBlock(iv);
216 + printSecure("&plainData = %p\n",plainData, NULL);
217 + printBlock(plainData);
218 + CLK_SysTickLongDelay(500000);
219 + }
220 +
221 +// Store_key(key);
222 +// Store_iv(iv);
223 +
224 + int c = Encrypt_data(plainData, cipheredData, 16);
225 + if (c == NULL) printSecure("Error : 128bits only", NULL, NULL);
226 +
227 + if (DEMO) {
228 + CLK_SysTickLongDelay(500000);
229 + printSecure("| Nonsecure is running ... |\n",NULL, NULL);
230 +
231 + printSecure("&cipheredData = %p\n",cipheredData, NULL);
232 + printBlock(cipheredData);
233 + }
234 +
235 + int r = Decrypt_data(cipheredData, resultData, 16);
236 + if (r == NULL) printSecure("Error : 128bits only", NULL, NULL);
237 +
238 + if (DEMO) {
239 + CLK_SysTickLongDelay(500000);
240 + printSecure("| Nonsecure is running ... |\n",NULL, NULL);
241 +
242 + printSecure("&resultData = %p\n",resultData, NULL);
243 + printBlock(resultData);
244 +
245 + uint8_t error = 0;
246 + for (uint8_t i = 0 ; i < 16 ; i++) {
247 +
248 + if (resultData[i] != plainData[i]) error++;
249 +
250 + }
251 + if (error != 0) printSecure("Error plainData is not equal to resultData", NULL, NULL);
252 + else printSecure("No error plainData is equal to resultData", NULL, NULL);
253 +
254 + }
255 +
256 +}
257 +*/
258 +
...\ No newline at end of file ...\ No newline at end of file
1 +<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
2 +<ProjectWorkspace xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_mpw.xsd">
3 +
4 + <SchemaVersion>1.0</SchemaVersion>
5 +
6 + <Header>### uVision Project, (C) Keil Software</Header>
7 +
8 + <WorkspaceName>WorkSpace</WorkspaceName>
9 +
10 + <project>
11 + <PathAndName>.\Secure\Secure.uvprojx</PathAndName>
12 + <NodeIsExpanded>1</NodeIsExpanded>
13 + </project>
14 +
15 + <project>
16 + <PathAndName>.\NonSecure\NonSecure.uvprojx</PathAndName>
17 + <NodeIsActive>1</NodeIsActive>
18 + <NodeIsExpanded>1</NodeIsExpanded>
19 + </project>
20 +
21 +</ProjectWorkspace>
1 +<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
2 +<ProjectGui xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_gui.xsd">
3 +
4 + <SchemaVersion>-6.1</SchemaVersion>
5 +
6 + <Header>### uVision Project, (C) Keil Software</Header>
7 +
8 + <WinLayoutEx>
9 + <sActiveDebugView></sActiveDebugView>
10 + <WindowPosition>
11 + <length>44</length>
12 + <flags>2</flags>
13 + <showCmd>1</showCmd>
14 + <MinPosition>
15 + <xPos>-1</xPos>
16 + <yPos>-1</yPos>
17 + </MinPosition>
18 + <MaxPosition>
19 + <xPos>-1</xPos>
20 + <yPos>-1</yPos>
21 + </MaxPosition>
22 + <NormalPosition>
23 + <Top>387</Top>
24 + <Left>666</Left>
25 + <Right>1946</Right>
26 + <Bottom>1067</Bottom>
27 + </NormalPosition>
28 + </WindowPosition>
29 + <MDIClientArea>
30 + <RegID>0</RegID>
31 + <MDITabState>
32 + <Len>1305</Len>
33 + <Data>010000000400000001000000010000000100000001000000000000000200000000000000010000000100000000000000280000002800000001000000060000000200000001000000AA433A5C55736572735C73687732365C4F6E6544726976655C4465736B746F705C323032315C323032312D315CC4B8BDBAC5E6B5F0C0DAC0CE325C4E75766F746F6E5C4D323335315F4253505F76332E30302E3030345C4D323335315365726965735F4253505F434D5349535F56332E30302E3030345C4D7950726F6A6563745C50756C73654D6F6E69746F72696E675C5365637572655C4D415833303130325C4D415833303130322E63000000000A4D415833303130322E6300000000C5D4F200FFFFFFFFA5433A5C55736572735C73687732365C4F6E6544726976655C4465736B746F705C323032315C323032312D315CC4B8BDBAC5E6B5F0C0DAC0CE325C4E75766F746F6E5C4D323335315F4253505F76332E30302E3030345C4D323335315365726965735F4253505F434D5349535F56332E30302E3030345C4D7950726F6A6563745C50756C73654D6F6E69746F72696E675C4E6F6E5365637572655C576946695C776966692E630000000006776966692E6300000000FFDC7800FFFFFFFFA3433A5C55736572735C73687732365C4F6E6544726976655C4465736B746F705C323032315C323032312D315CC4B8BDBAC5E6B5F0C0DAC0CE325C4E75766F746F6E5C4D323335315F4253505F76332E30302E3030345C4D323335315365726965735F4253505F434D5349535F56332E30302E3030345C4D7950726F6A6563745C50756C73654D6F6E69746F72696E675C4E6F6E5365637572655C6D61696E5F6E732E6300000000096D61696E5F6E732E6300000000BECEA100FFFFFFFFAA433A5C55736572735C73687732365C4F6E6544726976655C4465736B746F705C323032315C323032312D315CC4B8BDBAC5E6B5F0C0DAC0CE325C4E75766F746F6E5C4D323335315F4253505F76332E30302E3030345C4D323335315365726965735F4253505F434D5349535F56332E30302E3030345C4D7950726F6A6563745C50756C73654D6F6E69746F72696E675C5365637572655C4D415833303130325C4D415833303130322E68000000000A4D415833303130322E6800000000F0A0A100FFFFFFFF9C433A5C55736572735C73687732365C4F6E6544726976655C4465736B746F705C323032315C323032312D315CC4B8BDBAC5E6B5F0C0DAC0CE325C4E75766F746F6E5C4D323335315F4253505F76332E30302E3030345C4D323335315365726965735F4253505F434D5349535F56332E30302E3030345C4D7950726F6A6563745C50756C73654D6F6E69746F72696E675C5365637572655C6E73632E6300000000056E73632E6300000000BCA8E100FFFFFFFF9C433A5C55736572735C73687732365C4F6E6544726976655C4465736B746F705C323032315C323032312D315CC4B8BDBAC5E6B5F0C0DAC0CE325C4E75766F746F6E5C4D323335315F4253505F76332E30302E3030345C4D323335315365726965735F4253505F434D5349535F56332E30302E3030345C4D7950726F6A6563745C50756C73654D6F6E69746F72696E675C5365637572655C6E73632E6800000000056E73632E68000000009CC1B600FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000450100006E000000FF04000099040000</Data>
34 + </MDITabState>
35 + </MDIClientArea>
36 + <ViewEx>
37 + <ViewType>0</ViewType>
38 + <ViewName>Build</ViewName>
39 + <Window>
40 + <RegID>-1</RegID>
41 + <PaneID>-1</PaneID>
42 + <IsVisible>0</IsVisible>
43 + <IsFloating>0</IsFloating>
44 + <IsTabbed>0</IsTabbed>
45 + <IsActivated>0</IsActivated>
46 + <MRUWidth>32767</MRUWidth>
47 + <PinState>0</PinState>
48 + <RecentFrameAlignment>4096</RecentFrameAlignment>
49 + <RecentRowIndex>0</RecentRowIndex>
50 + <RectRecentDocked>
51 + <Len>16</Len>
52 + <Data>440100004F000000B0030000B3000000</Data>
53 + </RectRecentDocked>
54 + <RectRecentFloat>
55 + <Len>16</Len>
56 + <Data>4401000066000000B0030000CA000000</Data>
57 + </RectRecentFloat>
58 + </Window>
59 + <Window>
60 + <RegID>1005</RegID>
61 + <PaneID>1005</PaneID>
62 + <IsVisible>1</IsVisible>
63 + <IsFloating>0</IsFloating>
64 + <IsTabbed>0</IsTabbed>
65 + <IsActivated>0</IsActivated>
66 + <MRUWidth>32767</MRUWidth>
67 + <PinState>0</PinState>
68 + <RecentFrameAlignment>4096</RecentFrameAlignment>
69 + <RecentRowIndex>0</RecentRowIndex>
70 + <RectRecentDocked>
71 + <Len>16</Len>
72 + <Data>03000000660000003D01000061040000</Data>
73 + </RectRecentDocked>
74 + <RectRecentFloat>
75 + <Len>16</Len>
76 + <Data>3C0400009202000083050000C9060000</Data>
77 + </RectRecentFloat>
78 + </Window>
79 + <Window>
80 + <RegID>109</RegID>
81 + <PaneID>109</PaneID>
82 + <IsVisible>1</IsVisible>
83 + <IsFloating>0</IsFloating>
84 + <IsTabbed>0</IsTabbed>
85 + <IsActivated>0</IsActivated>
86 + <MRUWidth>32767</MRUWidth>
87 + <PinState>0</PinState>
88 + <RecentFrameAlignment>4096</RecentFrameAlignment>
89 + <RecentRowIndex>0</RecentRowIndex>
90 + <RectRecentDocked>
91 + <Len>16</Len>
92 + <Data>03000000660000003D01000061040000</Data>
93 + </RectRecentDocked>
94 + <RectRecentFloat>
95 + <Len>16</Len>
96 + <Data>4001000057010000BC02000068040000</Data>
97 + </RectRecentFloat>
98 + </Window>
99 + <Window>
100 + <RegID>1465</RegID>
101 + <PaneID>1465</PaneID>
102 + <IsVisible>0</IsVisible>
103 + <IsFloating>0</IsFloating>
104 + <IsTabbed>0</IsTabbed>
105 + <IsActivated>0</IsActivated>
106 + <MRUWidth>32767</MRUWidth>
107 + <PinState>0</PinState>
108 + <RecentFrameAlignment>4096</RecentFrameAlignment>
109 + <RecentRowIndex>0</RecentRowIndex>
110 + <RectRecentDocked>
111 + <Len>16</Len>
112 + <Data>FB04000090FDFFFFFB04000023010000</Data>
113 + </RectRecentDocked>
114 + <RectRecentFloat>
115 + <Len>16</Len>
116 + <Data>2B000000460100002C030000FF020000</Data>
117 + </RectRecentFloat>
118 + </Window>
119 + <Window>
120 + <RegID>1466</RegID>
121 + <PaneID>1466</PaneID>
122 + <IsVisible>0</IsVisible>
123 + <IsFloating>0</IsFloating>
124 + <IsTabbed>0</IsTabbed>
125 + <IsActivated>0</IsActivated>
126 + <MRUWidth>32767</MRUWidth>
127 + <PinState>0</PinState>
128 + <RecentFrameAlignment>4096</RecentFrameAlignment>
129 + <RecentRowIndex>0</RecentRowIndex>
130 + <RectRecentDocked>
131 + <Len>16</Len>
132 + <Data>FB04000090FDFFFFFB04000023010000</Data>
133 + </RectRecentDocked>
134 + <RectRecentFloat>
135 + <Len>16</Len>
136 + <Data>260100003D010000DE04000001020000</Data>
137 + </RectRecentFloat>
138 + </Window>
139 + <Window>
140 + <RegID>1467</RegID>
141 + <PaneID>1467</PaneID>
142 + <IsVisible>0</IsVisible>
143 + <IsFloating>0</IsFloating>
144 + <IsTabbed>0</IsTabbed>
145 + <IsActivated>0</IsActivated>
146 + <MRUWidth>32767</MRUWidth>
147 + <PinState>0</PinState>
148 + <RecentFrameAlignment>4096</RecentFrameAlignment>
149 + <RecentRowIndex>0</RecentRowIndex>
150 + <RectRecentDocked>
151 + <Len>16</Len>
152 + <Data>FB04000090FDFFFFFB04000023010000</Data>
153 + </RectRecentDocked>
154 + <RectRecentFloat>
155 + <Len>16</Len>
156 + <Data>2B000000460100002C030000FF020000</Data>
157 + </RectRecentFloat>
158 + </Window>
159 + <Window>
160 + <RegID>1468</RegID>
161 + <PaneID>1468</PaneID>
162 + <IsVisible>0</IsVisible>
163 + <IsFloating>0</IsFloating>
164 + <IsTabbed>0</IsTabbed>
165 + <IsActivated>0</IsActivated>
166 + <MRUWidth>32767</MRUWidth>
167 + <PinState>0</PinState>
168 + <RecentFrameAlignment>4096</RecentFrameAlignment>
169 + <RecentRowIndex>0</RecentRowIndex>
170 + <RectRecentDocked>
171 + <Len>16</Len>
172 + <Data>FB04000090FDFFFFFB04000023010000</Data>
173 + </RectRecentDocked>
174 + <RectRecentFloat>
175 + <Len>16</Len>
176 + <Data>2B000000460100002C030000FF020000</Data>
177 + </RectRecentFloat>
178 + </Window>
179 + <Window>
180 + <RegID>1506</RegID>
181 + <PaneID>1506</PaneID>
182 + <IsVisible>0</IsVisible>
183 + <IsFloating>0</IsFloating>
184 + <IsTabbed>0</IsTabbed>
185 + <IsActivated>0</IsActivated>
186 + <MRUWidth>32767</MRUWidth>
187 + <PinState>0</PinState>
188 + <RecentFrameAlignment>16384</RecentFrameAlignment>
189 + <RecentRowIndex>0</RecentRowIndex>
190 + <RectRecentDocked>
191 + <Len>16</Len>
192 + <Data>7302000066000000AD03000026010000</Data>
193 + </RectRecentDocked>
194 + <RectRecentFloat>
195 + <Len>16</Len>
196 + <Data>260100003D0100006602000050020000</Data>
197 + </RectRecentFloat>
198 + </Window>
199 + <Window>
200 + <RegID>1913</RegID>
201 + <PaneID>1913</PaneID>
202 + <IsVisible>0</IsVisible>
203 + <IsFloating>0</IsFloating>
204 + <IsTabbed>0</IsTabbed>
205 + <IsActivated>0</IsActivated>
206 + <MRUWidth>32767</MRUWidth>
207 + <PinState>0</PinState>
208 + <RecentFrameAlignment>4096</RecentFrameAlignment>
209 + <RecentRowIndex>0</RecentRowIndex>
210 + <RectRecentDocked>
211 + <Len>16</Len>
212 + <Data>4701000066000000AD0300009A000000</Data>
213 + </RectRecentDocked>
214 + <RectRecentFloat>
215 + <Len>16</Len>
216 + <Data>260100003D010000DE04000001020000</Data>
217 + </RectRecentFloat>
218 + </Window>
219 + <Window>
220 + <RegID>1935</RegID>
221 + <PaneID>1935</PaneID>
222 + <IsVisible>0</IsVisible>
223 + <IsFloating>0</IsFloating>
224 + <IsTabbed>0</IsTabbed>
225 + <IsActivated>0</IsActivated>
226 + <MRUWidth>32767</MRUWidth>
227 + <PinState>0</PinState>
228 + <RecentFrameAlignment>32768</RecentFrameAlignment>
229 + <RecentRowIndex>0</RecentRowIndex>
230 + <RectRecentDocked>
231 + <Len>16</Len>
232 + <Data>FB04000090FDFFFFFB04000023010000</Data>
233 + </RectRecentDocked>
234 + <RectRecentFloat>
235 + <Len>16</Len>
236 + <Data>260100003D0100006602000050020000</Data>
237 + </RectRecentFloat>
238 + </Window>
239 + <Window>
240 + <RegID>1936</RegID>
241 + <PaneID>1936</PaneID>
242 + <IsVisible>0</IsVisible>
243 + <IsFloating>0</IsFloating>
244 + <IsTabbed>0</IsTabbed>
245 + <IsActivated>0</IsActivated>
246 + <MRUWidth>32767</MRUWidth>
247 + <PinState>0</PinState>
248 + <RecentFrameAlignment>4096</RecentFrameAlignment>
249 + <RecentRowIndex>0</RecentRowIndex>
250 + <RectRecentDocked>
251 + <Len>16</Len>
252 + <Data>FB04000090FDFFFFFB04000023010000</Data>
253 + </RectRecentDocked>
254 + <RectRecentFloat>
255 + <Len>16</Len>
256 + <Data>260100003D0100006602000050020000</Data>
257 + </RectRecentFloat>
258 + </Window>
259 + <Window>
260 + <RegID>1937</RegID>
261 + <PaneID>1937</PaneID>
262 + <IsVisible>0</IsVisible>
263 + <IsFloating>0</IsFloating>
264 + <IsTabbed>0</IsTabbed>
265 + <IsActivated>0</IsActivated>
266 + <MRUWidth>32767</MRUWidth>
267 + <PinState>0</PinState>
268 + <RecentFrameAlignment>4096</RecentFrameAlignment>
269 + <RecentRowIndex>0</RecentRowIndex>
270 + <RectRecentDocked>
271 + <Len>16</Len>
272 + <Data>FB04000090FDFFFFFB04000023010000</Data>
273 + </RectRecentDocked>
274 + <RectRecentFloat>
275 + <Len>16</Len>
276 + <Data>2B000000460100002C030000FF020000</Data>
277 + </RectRecentFloat>
278 + </Window>
279 + <Window>
280 + <RegID>1939</RegID>
281 + <PaneID>1939</PaneID>
282 + <IsVisible>0</IsVisible>
283 + <IsFloating>0</IsFloating>
284 + <IsTabbed>0</IsTabbed>
285 + <IsActivated>0</IsActivated>
286 + <MRUWidth>32767</MRUWidth>
287 + <PinState>0</PinState>
288 + <RecentFrameAlignment>4096</RecentFrameAlignment>
289 + <RecentRowIndex>0</RecentRowIndex>
290 + <RectRecentDocked>
291 + <Len>16</Len>
292 + <Data>FB04000090FDFFFFFB04000023010000</Data>
293 + </RectRecentDocked>
294 + <RectRecentFloat>
295 + <Len>16</Len>
296 + <Data>260100003D010000DE04000001020000</Data>
297 + </RectRecentFloat>
298 + </Window>
299 + <Window>
300 + <RegID>1940</RegID>
301 + <PaneID>1940</PaneID>
302 + <IsVisible>0</IsVisible>
303 + <IsFloating>0</IsFloating>
304 + <IsTabbed>0</IsTabbed>
305 + <IsActivated>0</IsActivated>
306 + <MRUWidth>32767</MRUWidth>
307 + <PinState>0</PinState>
308 + <RecentFrameAlignment>4096</RecentFrameAlignment>
309 + <RecentRowIndex>0</RecentRowIndex>
310 + <RectRecentDocked>
311 + <Len>16</Len>
312 + <Data>FB04000090FDFFFFFB04000023010000</Data>
313 + </RectRecentDocked>
314 + <RectRecentFloat>
315 + <Len>16</Len>
316 + <Data>260100003D010000DE04000001020000</Data>
317 + </RectRecentFloat>
318 + </Window>
319 + <Window>
320 + <RegID>1941</RegID>
321 + <PaneID>1941</PaneID>
322 + <IsVisible>0</IsVisible>
323 + <IsFloating>0</IsFloating>
324 + <IsTabbed>0</IsTabbed>
325 + <IsActivated>0</IsActivated>
326 + <MRUWidth>32767</MRUWidth>
327 + <PinState>0</PinState>
328 + <RecentFrameAlignment>4096</RecentFrameAlignment>
329 + <RecentRowIndex>0</RecentRowIndex>
330 + <RectRecentDocked>
331 + <Len>16</Len>
332 + <Data>FB04000090FDFFFFFB04000023010000</Data>
333 + </RectRecentDocked>
334 + <RectRecentFloat>
335 + <Len>16</Len>
336 + <Data>260100003D010000DE04000001020000</Data>
337 + </RectRecentFloat>
338 + </Window>
339 + <Window>
340 + <RegID>1942</RegID>
341 + <PaneID>1942</PaneID>
342 + <IsVisible>0</IsVisible>
343 + <IsFloating>0</IsFloating>
344 + <IsTabbed>0</IsTabbed>
345 + <IsActivated>0</IsActivated>
346 + <MRUWidth>32767</MRUWidth>
347 + <PinState>0</PinState>
348 + <RecentFrameAlignment>4096</RecentFrameAlignment>
349 + <RecentRowIndex>0</RecentRowIndex>
350 + <RectRecentDocked>
351 + <Len>16</Len>
352 + <Data>FB04000090FDFFFFFB04000023010000</Data>
353 + </RectRecentDocked>
354 + <RectRecentFloat>
355 + <Len>16</Len>
356 + <Data>2B000000460100002C030000FF020000</Data>
357 + </RectRecentFloat>
358 + </Window>
359 + <Window>
360 + <RegID>195</RegID>
361 + <PaneID>195</PaneID>
362 + <IsVisible>1</IsVisible>
363 + <IsFloating>0</IsFloating>
364 + <IsTabbed>0</IsTabbed>
365 + <IsActivated>0</IsActivated>
366 + <MRUWidth>32767</MRUWidth>
367 + <PinState>0</PinState>
368 + <RecentFrameAlignment>4096</RecentFrameAlignment>
369 + <RecentRowIndex>0</RecentRowIndex>
370 + <RectRecentDocked>
371 + <Len>16</Len>
372 + <Data>03000000660000003D01000061040000</Data>
373 + </RectRecentDocked>
374 + <RectRecentFloat>
375 + <Len>16</Len>
376 + <Data>3C0400009202000083050000C9060000</Data>
377 + </RectRecentFloat>
378 + </Window>
379 + <Window>
380 + <RegID>196</RegID>
381 + <PaneID>196</PaneID>
382 + <IsVisible>1</IsVisible>
383 + <IsFloating>0</IsFloating>
384 + <IsTabbed>0</IsTabbed>
385 + <IsActivated>0</IsActivated>
386 + <MRUWidth>32767</MRUWidth>
387 + <PinState>0</PinState>
388 + <RecentFrameAlignment>4096</RecentFrameAlignment>
389 + <RecentRowIndex>0</RecentRowIndex>
390 + <RectRecentDocked>
391 + <Len>16</Len>
392 + <Data>03000000660000003D01000061040000</Data>
393 + </RectRecentDocked>
394 + <RectRecentFloat>
395 + <Len>16</Len>
396 + <Data>7000000087000000EC01000099030000</Data>
397 + </RectRecentFloat>
398 + </Window>
399 + <Window>
400 + <RegID>197</RegID>
401 + <PaneID>197</PaneID>
402 + <IsVisible>1</IsVisible>
403 + <IsFloating>0</IsFloating>
404 + <IsTabbed>0</IsTabbed>
405 + <IsActivated>0</IsActivated>
406 + <MRUWidth>32767</MRUWidth>
407 + <PinState>0</PinState>
408 + <RecentFrameAlignment>32768</RecentFrameAlignment>
409 + <RecentRowIndex>0</RecentRowIndex>
410 + <RectRecentDocked>
411 + <Len>16</Len>
412 + <Data>0000000092040000FE04000045050000</Data>
413 + </RectRecentDocked>
414 + <RectRecentFloat>
415 + <Len>16</Len>
416 + <Data>7000000087000000280400004B010000</Data>
417 + </RectRecentFloat>
418 + </Window>
419 + <Window>
420 + <RegID>198</RegID>
421 + <PaneID>198</PaneID>
422 + <IsVisible>0</IsVisible>
423 + <IsFloating>1</IsFloating>
424 + <IsTabbed>0</IsTabbed>
425 + <IsActivated>0</IsActivated>
426 + <MRUWidth>32767</MRUWidth>
427 + <PinState>0</PinState>
428 + <RecentFrameAlignment>32768</RecentFrameAlignment>
429 + <RecentRowIndex>0</RecentRowIndex>
430 + <RectRecentDocked>
431 + <Len>16</Len>
432 + <Data>00000000EB02000070070000C3030000</Data>
433 + </RectRecentDocked>
434 + <RectRecentFloat>
435 + <Len>16</Len>
436 + <Data>1DFBFFFF8F020000D5FEFFFF53030000</Data>
437 + </RectRecentFloat>
438 + </Window>
439 + <Window>
440 + <RegID>199</RegID>
441 + <PaneID>199</PaneID>
442 + <IsVisible>0</IsVisible>
443 + <IsFloating>0</IsFloating>
444 + <IsTabbed>0</IsTabbed>
445 + <IsActivated>0</IsActivated>
446 + <MRUWidth>32767</MRUWidth>
447 + <PinState>0</PinState>
448 + <RecentFrameAlignment>4096</RecentFrameAlignment>
449 + <RecentRowIndex>0</RecentRowIndex>
450 + <RectRecentDocked>
451 + <Len>16</Len>
452 + <Data>0300000095040000FD0900002C050000</Data>
453 + </RectRecentDocked>
454 + <RectRecentFloat>
455 + <Len>16</Len>
456 + <Data>7000000087000000280400004B010000</Data>
457 + </RectRecentFloat>
458 + </Window>
459 + <Window>
460 + <RegID>203</RegID>
461 + <PaneID>203</PaneID>
462 + <IsVisible>0</IsVisible>
463 + <IsFloating>0</IsFloating>
464 + <IsTabbed>0</IsTabbed>
465 + <IsActivated>0</IsActivated>
466 + <MRUWidth>32767</MRUWidth>
467 + <PinState>0</PinState>
468 + <RecentFrameAlignment>8192</RecentFrameAlignment>
469 + <RecentRowIndex>0</RecentRowIndex>
470 + <RectRecentDocked>
471 + <Len>16</Len>
472 + <Data>4701000066000000AD0300009A000000</Data>
473 + </RectRecentDocked>
474 + <RectRecentFloat>
475 + <Len>16</Len>
476 + <Data>260100003D010000DE04000001020000</Data>
477 + </RectRecentFloat>
478 + </Window>
479 + <Window>
480 + <RegID>204</RegID>
481 + <PaneID>204</PaneID>
482 + <IsVisible>0</IsVisible>
483 + <IsFloating>0</IsFloating>
484 + <IsTabbed>0</IsTabbed>
485 + <IsActivated>0</IsActivated>
486 + <MRUWidth>32767</MRUWidth>
487 + <PinState>0</PinState>
488 + <RecentFrameAlignment>4096</RecentFrameAlignment>
489 + <RecentRowIndex>0</RecentRowIndex>
490 + <RectRecentDocked>
491 + <Len>16</Len>
492 + <Data>4701000066000000AD0300009A000000</Data>
493 + </RectRecentDocked>
494 + <RectRecentFloat>
495 + <Len>16</Len>
496 + <Data>260100003D010000DE04000001020000</Data>
497 + </RectRecentFloat>
498 + </Window>
499 + <Window>
500 + <RegID>221</RegID>
501 + <PaneID>221</PaneID>
502 + <IsVisible>0</IsVisible>
503 + <IsFloating>0</IsFloating>
504 + <IsTabbed>0</IsTabbed>
505 + <IsActivated>0</IsActivated>
506 + <MRUWidth>32767</MRUWidth>
507 + <PinState>0</PinState>
508 + <RecentFrameAlignment>4096</RecentFrameAlignment>
509 + <RecentRowIndex>0</RecentRowIndex>
510 + <RectRecentDocked>
511 + <Len>16</Len>
512 + <Data>00000000000000000000000000000000</Data>
513 + </RectRecentDocked>
514 + <RectRecentFloat>
515 + <Len>16</Len>
516 + <Data>0A0000000A0000006E0000006E000000</Data>
517 + </RectRecentFloat>
518 + </Window>
519 + <Window>
520 + <RegID>2506</RegID>
521 + <PaneID>2506</PaneID>
522 + <IsVisible>0</IsVisible>
523 + <IsFloating>0</IsFloating>
524 + <IsTabbed>0</IsTabbed>
525 + <IsActivated>0</IsActivated>
526 + <MRUWidth>32767</MRUWidth>
527 + <PinState>0</PinState>
528 + <RecentFrameAlignment>4096</RecentFrameAlignment>
529 + <RecentRowIndex>0</RecentRowIndex>
530 + <RectRecentDocked>
531 + <Len>16</Len>
532 + <Data>7302000066000000AD03000026010000</Data>
533 + </RectRecentDocked>
534 + <RectRecentFloat>
535 + <Len>16</Len>
536 + <Data>7000000087000000B00100009A010000</Data>
537 + </RectRecentFloat>
538 + </Window>
539 + <Window>
540 + <RegID>2507</RegID>
541 + <PaneID>2507</PaneID>
542 + <IsVisible>0</IsVisible>
543 + <IsFloating>0</IsFloating>
544 + <IsTabbed>0</IsTabbed>
545 + <IsActivated>0</IsActivated>
546 + <MRUWidth>32767</MRUWidth>
547 + <PinState>0</PinState>
548 + <RecentFrameAlignment>4096</RecentFrameAlignment>
549 + <RecentRowIndex>0</RecentRowIndex>
550 + <RectRecentDocked>
551 + <Len>16</Len>
552 + <Data>FB04000090FDFFFFFB04000023010000</Data>
553 + </RectRecentDocked>
554 + <RectRecentFloat>
555 + <Len>16</Len>
556 + <Data>7000000087000000280400004B010000</Data>
557 + </RectRecentFloat>
558 + </Window>
559 + <Window>
560 + <RegID>343</RegID>
561 + <PaneID>343</PaneID>
562 + <IsVisible>0</IsVisible>
563 + <IsFloating>0</IsFloating>
564 + <IsTabbed>0</IsTabbed>
565 + <IsActivated>0</IsActivated>
566 + <MRUWidth>32767</MRUWidth>
567 + <PinState>0</PinState>
568 + <RecentFrameAlignment>4096</RecentFrameAlignment>
569 + <RecentRowIndex>0</RecentRowIndex>
570 + <RectRecentDocked>
571 + <Len>16</Len>
572 + <Data>4701000066000000AD0300009A000000</Data>
573 + </RectRecentDocked>
574 + <RectRecentFloat>
575 + <Len>16</Len>
576 + <Data>7000000087000000280400004B010000</Data>
577 + </RectRecentFloat>
578 + </Window>
579 + <Window>
580 + <RegID>346</RegID>
581 + <PaneID>346</PaneID>
582 + <IsVisible>0</IsVisible>
583 + <IsFloating>0</IsFloating>
584 + <IsTabbed>0</IsTabbed>
585 + <IsActivated>0</IsActivated>
586 + <MRUWidth>32767</MRUWidth>
587 + <PinState>0</PinState>
588 + <RecentFrameAlignment>4096</RecentFrameAlignment>
589 + <RecentRowIndex>0</RecentRowIndex>
590 + <RectRecentDocked>
591 + <Len>16</Len>
592 + <Data>4701000066000000AD0300009A000000</Data>
593 + </RectRecentDocked>
594 + <RectRecentFloat>
595 + <Len>16</Len>
596 + <Data>7000000087000000280400004B010000</Data>
597 + </RectRecentFloat>
598 + </Window>
599 + <Window>
600 + <RegID>35141</RegID>
601 + <PaneID>35141</PaneID>
602 + <IsVisible>0</IsVisible>
603 + <IsFloating>0</IsFloating>
604 + <IsTabbed>0</IsTabbed>
605 + <IsActivated>0</IsActivated>
606 + <MRUWidth>0</MRUWidth>
607 + <PinState>0</PinState>
608 + <RecentFrameAlignment>0</RecentFrameAlignment>
609 + <RecentRowIndex>0</RecentRowIndex>
610 + <RectRecentDocked>
611 + <Len>16</Len>
612 + <Data>4701000066000000AD0300009A000000</Data>
613 + </RectRecentDocked>
614 + <RectRecentFloat>
615 + <Len>16</Len>
616 + <Data>7000000087000000B00100009A010000</Data>
617 + </RectRecentFloat>
618 + </Window>
619 + <Window>
620 + <RegID>35824</RegID>
621 + <PaneID>35824</PaneID>
622 + <IsVisible>0</IsVisible>
623 + <IsFloating>0</IsFloating>
624 + <IsTabbed>0</IsTabbed>
625 + <IsActivated>0</IsActivated>
626 + <MRUWidth>32767</MRUWidth>
627 + <PinState>0</PinState>
628 + <RecentFrameAlignment>4096</RecentFrameAlignment>
629 + <RecentRowIndex>0</RecentRowIndex>
630 + <RectRecentDocked>
631 + <Len>16</Len>
632 + <Data>4701000066000000AD0300009A000000</Data>
633 + </RectRecentDocked>
634 + <RectRecentFloat>
635 + <Len>16</Len>
636 + <Data>7000000087000000280400004B010000</Data>
637 + </RectRecentFloat>
638 + </Window>
639 + <Window>
640 + <RegID>35885</RegID>
641 + <PaneID>35885</PaneID>
642 + <IsVisible>0</IsVisible>
643 + <IsFloating>0</IsFloating>
644 + <IsTabbed>0</IsTabbed>
645 + <IsActivated>0</IsActivated>
646 + <MRUWidth>32767</MRUWidth>
647 + <PinState>0</PinState>
648 + <RecentFrameAlignment>4096</RecentFrameAlignment>
649 + <RecentRowIndex>0</RecentRowIndex>
650 + <RectRecentDocked>
651 + <Len>16</Len>
652 + <Data>7302000066000000AD03000026010000</Data>
653 + </RectRecentDocked>
654 + <RectRecentFloat>
655 + <Len>16</Len>
656 + <Data>7000000087000000B00100009A010000</Data>
657 + </RectRecentFloat>
658 + </Window>
659 + <Window>
660 + <RegID>35886</RegID>
661 + <PaneID>35886</PaneID>
662 + <IsVisible>0</IsVisible>
663 + <IsFloating>0</IsFloating>
664 + <IsTabbed>0</IsTabbed>
665 + <IsActivated>0</IsActivated>
666 + <MRUWidth>32767</MRUWidth>
667 + <PinState>0</PinState>
668 + <RecentFrameAlignment>4096</RecentFrameAlignment>
669 + <RecentRowIndex>0</RecentRowIndex>
670 + <RectRecentDocked>
671 + <Len>16</Len>
672 + <Data>7302000066000000AD03000026010000</Data>
673 + </RectRecentDocked>
674 + <RectRecentFloat>
675 + <Len>16</Len>
676 + <Data>7000000087000000B00100009A010000</Data>
677 + </RectRecentFloat>
678 + </Window>
679 + <Window>
680 + <RegID>35887</RegID>
681 + <PaneID>35887</PaneID>
682 + <IsVisible>0</IsVisible>
683 + <IsFloating>0</IsFloating>
684 + <IsTabbed>0</IsTabbed>
685 + <IsActivated>0</IsActivated>
686 + <MRUWidth>32767</MRUWidth>
687 + <PinState>0</PinState>
688 + <RecentFrameAlignment>4096</RecentFrameAlignment>
689 + <RecentRowIndex>0</RecentRowIndex>
690 + <RectRecentDocked>
691 + <Len>16</Len>
692 + <Data>7302000066000000AD03000026010000</Data>
693 + </RectRecentDocked>
694 + <RectRecentFloat>
695 + <Len>16</Len>
696 + <Data>260100003D0100006602000050020000</Data>
697 + </RectRecentFloat>
698 + </Window>
699 + <Window>
700 + <RegID>35888</RegID>
701 + <PaneID>35888</PaneID>
702 + <IsVisible>0</IsVisible>
703 + <IsFloating>0</IsFloating>
704 + <IsTabbed>0</IsTabbed>
705 + <IsActivated>0</IsActivated>
706 + <MRUWidth>32767</MRUWidth>
707 + <PinState>0</PinState>
708 + <RecentFrameAlignment>4096</RecentFrameAlignment>
709 + <RecentRowIndex>0</RecentRowIndex>
710 + <RectRecentDocked>
711 + <Len>16</Len>
712 + <Data>7302000066000000AD03000026010000</Data>
713 + </RectRecentDocked>
714 + <RectRecentFloat>
715 + <Len>16</Len>
716 + <Data>260100003D0100006602000050020000</Data>
717 + </RectRecentFloat>
718 + </Window>
719 + <Window>
720 + <RegID>35889</RegID>
721 + <PaneID>35889</PaneID>
722 + <IsVisible>0</IsVisible>
723 + <IsFloating>0</IsFloating>
724 + <IsTabbed>0</IsTabbed>
725 + <IsActivated>0</IsActivated>
726 + <MRUWidth>32767</MRUWidth>
727 + <PinState>0</PinState>
728 + <RecentFrameAlignment>4096</RecentFrameAlignment>
729 + <RecentRowIndex>0</RecentRowIndex>
730 + <RectRecentDocked>
731 + <Len>16</Len>
732 + <Data>7302000066000000AD03000026010000</Data>
733 + </RectRecentDocked>
734 + <RectRecentFloat>
735 + <Len>16</Len>
736 + <Data>260100003D0100006602000050020000</Data>
737 + </RectRecentFloat>
738 + </Window>
739 + <Window>
740 + <RegID>35890</RegID>
741 + <PaneID>35890</PaneID>
742 + <IsVisible>0</IsVisible>
743 + <IsFloating>0</IsFloating>
744 + <IsTabbed>0</IsTabbed>
745 + <IsActivated>0</IsActivated>
746 + <MRUWidth>32767</MRUWidth>
747 + <PinState>0</PinState>
748 + <RecentFrameAlignment>4096</RecentFrameAlignment>
749 + <RecentRowIndex>0</RecentRowIndex>
750 + <RectRecentDocked>
751 + <Len>16</Len>
752 + <Data>7302000066000000AD03000026010000</Data>
753 + </RectRecentDocked>
754 + <RectRecentFloat>
755 + <Len>16</Len>
756 + <Data>260100003D0100006602000050020000</Data>
757 + </RectRecentFloat>
758 + </Window>
759 + <Window>
760 + <RegID>35891</RegID>
761 + <PaneID>35891</PaneID>
762 + <IsVisible>0</IsVisible>
763 + <IsFloating>0</IsFloating>
764 + <IsTabbed>0</IsTabbed>
765 + <IsActivated>0</IsActivated>
766 + <MRUWidth>32767</MRUWidth>
767 + <PinState>0</PinState>
768 + <RecentFrameAlignment>4096</RecentFrameAlignment>
769 + <RecentRowIndex>0</RecentRowIndex>
770 + <RectRecentDocked>
771 + <Len>16</Len>
772 + <Data>7302000066000000AD03000026010000</Data>
773 + </RectRecentDocked>
774 + <RectRecentFloat>
775 + <Len>16</Len>
776 + <Data>7000000087000000B00100009A010000</Data>
777 + </RectRecentFloat>
778 + </Window>
779 + <Window>
780 + <RegID>35892</RegID>
781 + <PaneID>35892</PaneID>
782 + <IsVisible>0</IsVisible>
783 + <IsFloating>0</IsFloating>
784 + <IsTabbed>0</IsTabbed>
785 + <IsActivated>0</IsActivated>
786 + <MRUWidth>32767</MRUWidth>
787 + <PinState>0</PinState>
788 + <RecentFrameAlignment>4096</RecentFrameAlignment>
789 + <RecentRowIndex>0</RecentRowIndex>
790 + <RectRecentDocked>
791 + <Len>16</Len>
792 + <Data>7302000066000000AD03000026010000</Data>
793 + </RectRecentDocked>
794 + <RectRecentFloat>
795 + <Len>16</Len>
796 + <Data>7000000087000000B00100009A010000</Data>
797 + </RectRecentFloat>
798 + </Window>
799 + <Window>
800 + <RegID>35893</RegID>
801 + <PaneID>0</PaneID>
802 + <IsVisible>0</IsVisible>
803 + <IsFloating>0</IsFloating>
804 + <IsTabbed>0</IsTabbed>
805 + <IsActivated>0</IsActivated>
806 + <MRUWidth>0</MRUWidth>
807 + <PinState>0</PinState>
808 + <RecentFrameAlignment>0</RecentFrameAlignment>
809 + <RecentRowIndex>0</RecentRowIndex>
810 + <RectRecentDocked>
811 + <Len>16</Len>
812 + <Data>7302000066000000AD03000026010000</Data>
813 + </RectRecentDocked>
814 + <RectRecentFloat>
815 + <Len>16</Len>
816 + <Data>A40A00005E000000E40B000071010000</Data>
817 + </RectRecentFloat>
818 + </Window>
819 + <Window>
820 + <RegID>35894</RegID>
821 + <PaneID>35894</PaneID>
822 + <IsVisible>0</IsVisible>
823 + <IsFloating>0</IsFloating>
824 + <IsTabbed>0</IsTabbed>
825 + <IsActivated>0</IsActivated>
826 + <MRUWidth>32767</MRUWidth>
827 + <PinState>0</PinState>
828 + <RecentFrameAlignment>4096</RecentFrameAlignment>
829 + <RecentRowIndex>0</RecentRowIndex>
830 + <RectRecentDocked>
831 + <Len>16</Len>
832 + <Data>7302000066000000AD03000026010000</Data>
833 + </RectRecentDocked>
834 + <RectRecentFloat>
835 + <Len>16</Len>
836 + <Data>7000000087000000B00100009A010000</Data>
837 + </RectRecentFloat>
838 + </Window>
839 + <Window>
840 + <RegID>35895</RegID>
841 + <PaneID>35895</PaneID>
842 + <IsVisible>0</IsVisible>
843 + <IsFloating>0</IsFloating>
844 + <IsTabbed>0</IsTabbed>
845 + <IsActivated>0</IsActivated>
846 + <MRUWidth>32767</MRUWidth>
847 + <PinState>0</PinState>
848 + <RecentFrameAlignment>4096</RecentFrameAlignment>
849 + <RecentRowIndex>0</RecentRowIndex>
850 + <RectRecentDocked>
851 + <Len>16</Len>
852 + <Data>7302000066000000AD03000026010000</Data>
853 + </RectRecentDocked>
854 + <RectRecentFloat>
855 + <Len>16</Len>
856 + <Data>7000000087000000B00100009A010000</Data>
857 + </RectRecentFloat>
858 + </Window>
859 + <Window>
860 + <RegID>35896</RegID>
861 + <PaneID>35896</PaneID>
862 + <IsVisible>0</IsVisible>
863 + <IsFloating>0</IsFloating>
864 + <IsTabbed>0</IsTabbed>
865 + <IsActivated>0</IsActivated>
866 + <MRUWidth>32767</MRUWidth>
867 + <PinState>0</PinState>
868 + <RecentFrameAlignment>4096</RecentFrameAlignment>
869 + <RecentRowIndex>0</RecentRowIndex>
870 + <RectRecentDocked>
871 + <Len>16</Len>
872 + <Data>7302000066000000AD03000026010000</Data>
873 + </RectRecentDocked>
874 + <RectRecentFloat>
875 + <Len>16</Len>
876 + <Data>7000000087000000B00100009A010000</Data>
877 + </RectRecentFloat>
878 + </Window>
879 + <Window>
880 + <RegID>35897</RegID>
881 + <PaneID>35897</PaneID>
882 + <IsVisible>0</IsVisible>
883 + <IsFloating>0</IsFloating>
884 + <IsTabbed>0</IsTabbed>
885 + <IsActivated>0</IsActivated>
886 + <MRUWidth>32767</MRUWidth>
887 + <PinState>0</PinState>
888 + <RecentFrameAlignment>4096</RecentFrameAlignment>
889 + <RecentRowIndex>0</RecentRowIndex>
890 + <RectRecentDocked>
891 + <Len>16</Len>
892 + <Data>7302000066000000AD03000026010000</Data>
893 + </RectRecentDocked>
894 + <RectRecentFloat>
895 + <Len>16</Len>
896 + <Data>7000000087000000B00100009A010000</Data>
897 + </RectRecentFloat>
898 + </Window>
899 + <Window>
900 + <RegID>35898</RegID>
901 + <PaneID>35898</PaneID>
902 + <IsVisible>0</IsVisible>
903 + <IsFloating>0</IsFloating>
904 + <IsTabbed>0</IsTabbed>
905 + <IsActivated>0</IsActivated>
906 + <MRUWidth>32767</MRUWidth>
907 + <PinState>0</PinState>
908 + <RecentFrameAlignment>4096</RecentFrameAlignment>
909 + <RecentRowIndex>0</RecentRowIndex>
910 + <RectRecentDocked>
911 + <Len>16</Len>
912 + <Data>7302000066000000AD03000026010000</Data>
913 + </RectRecentDocked>
914 + <RectRecentFloat>
915 + <Len>16</Len>
916 + <Data>4001000057010000800200006A020000</Data>
917 + </RectRecentFloat>
918 + </Window>
919 + <Window>
920 + <RegID>35899</RegID>
921 + <PaneID>0</PaneID>
922 + <IsVisible>0</IsVisible>
923 + <IsFloating>0</IsFloating>
924 + <IsTabbed>0</IsTabbed>
925 + <IsActivated>0</IsActivated>
926 + <MRUWidth>0</MRUWidth>
927 + <PinState>0</PinState>
928 + <RecentFrameAlignment>0</RecentFrameAlignment>
929 + <RecentRowIndex>0</RecentRowIndex>
930 + <RectRecentDocked>
931 + <Len>16</Len>
932 + <Data>7302000066000000AD03000026010000</Data>
933 + </RectRecentDocked>
934 + <RectRecentFloat>
935 + <Len>16</Len>
936 + <Data>A40A00005E000000E40B000071010000</Data>
937 + </RectRecentFloat>
938 + </Window>
939 + <Window>
940 + <RegID>35900</RegID>
941 + <PaneID>35900</PaneID>
942 + <IsVisible>0</IsVisible>
943 + <IsFloating>0</IsFloating>
944 + <IsTabbed>0</IsTabbed>
945 + <IsActivated>0</IsActivated>
946 + <MRUWidth>32767</MRUWidth>
947 + <PinState>0</PinState>
948 + <RecentFrameAlignment>4096</RecentFrameAlignment>
949 + <RecentRowIndex>0</RecentRowIndex>
950 + <RectRecentDocked>
951 + <Len>16</Len>
952 + <Data>7302000066000000AD03000026010000</Data>
953 + </RectRecentDocked>
954 + <RectRecentFloat>
955 + <Len>16</Len>
956 + <Data>7000000087000000B00100009A010000</Data>
957 + </RectRecentFloat>
958 + </Window>
959 + <Window>
960 + <RegID>35901</RegID>
961 + <PaneID>35901</PaneID>
962 + <IsVisible>0</IsVisible>
963 + <IsFloating>0</IsFloating>
964 + <IsTabbed>0</IsTabbed>
965 + <IsActivated>0</IsActivated>
966 + <MRUWidth>32767</MRUWidth>
967 + <PinState>0</PinState>
968 + <RecentFrameAlignment>4096</RecentFrameAlignment>
969 + <RecentRowIndex>0</RecentRowIndex>
970 + <RectRecentDocked>
971 + <Len>16</Len>
972 + <Data>7302000066000000AD03000026010000</Data>
973 + </RectRecentDocked>
974 + <RectRecentFloat>
975 + <Len>16</Len>
976 + <Data>7000000087000000B00100009A010000</Data>
977 + </RectRecentFloat>
978 + </Window>
979 + <Window>
980 + <RegID>35902</RegID>
981 + <PaneID>35902</PaneID>
982 + <IsVisible>0</IsVisible>
983 + <IsFloating>0</IsFloating>
984 + <IsTabbed>0</IsTabbed>
985 + <IsActivated>0</IsActivated>
986 + <MRUWidth>32767</MRUWidth>
987 + <PinState>0</PinState>
988 + <RecentFrameAlignment>4096</RecentFrameAlignment>
989 + <RecentRowIndex>0</RecentRowIndex>
990 + <RectRecentDocked>
991 + <Len>16</Len>
992 + <Data>7302000066000000AD03000026010000</Data>
993 + </RectRecentDocked>
994 + <RectRecentFloat>
995 + <Len>16</Len>
996 + <Data>260100003D0100006602000050020000</Data>
997 + </RectRecentFloat>
998 + </Window>
999 + <Window>
1000 + <RegID>35903</RegID>
1001 + <PaneID>35903</PaneID>
1002 + <IsVisible>0</IsVisible>
1003 + <IsFloating>0</IsFloating>
1004 + <IsTabbed>0</IsTabbed>
1005 + <IsActivated>0</IsActivated>
1006 + <MRUWidth>32767</MRUWidth>
1007 + <PinState>0</PinState>
1008 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1009 + <RecentRowIndex>0</RecentRowIndex>
1010 + <RectRecentDocked>
1011 + <Len>16</Len>
1012 + <Data>7302000066000000AD03000026010000</Data>
1013 + </RectRecentDocked>
1014 + <RectRecentFloat>
1015 + <Len>16</Len>
1016 + <Data>260100003D0100006602000050020000</Data>
1017 + </RectRecentFloat>
1018 + </Window>
1019 + <Window>
1020 + <RegID>35904</RegID>
1021 + <PaneID>35904</PaneID>
1022 + <IsVisible>0</IsVisible>
1023 + <IsFloating>0</IsFloating>
1024 + <IsTabbed>0</IsTabbed>
1025 + <IsActivated>0</IsActivated>
1026 + <MRUWidth>32767</MRUWidth>
1027 + <PinState>0</PinState>
1028 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1029 + <RecentRowIndex>0</RecentRowIndex>
1030 + <RectRecentDocked>
1031 + <Len>16</Len>
1032 + <Data>7302000066000000AD03000026010000</Data>
1033 + </RectRecentDocked>
1034 + <RectRecentFloat>
1035 + <Len>16</Len>
1036 + <Data>260100003D0100006602000050020000</Data>
1037 + </RectRecentFloat>
1038 + </Window>
1039 + <Window>
1040 + <RegID>35905</RegID>
1041 + <PaneID>35905</PaneID>
1042 + <IsVisible>0</IsVisible>
1043 + <IsFloating>0</IsFloating>
1044 + <IsTabbed>0</IsTabbed>
1045 + <IsActivated>0</IsActivated>
1046 + <MRUWidth>32767</MRUWidth>
1047 + <PinState>0</PinState>
1048 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1049 + <RecentRowIndex>0</RecentRowIndex>
1050 + <RectRecentDocked>
1051 + <Len>16</Len>
1052 + <Data>7302000066000000AD03000026010000</Data>
1053 + </RectRecentDocked>
1054 + <RectRecentFloat>
1055 + <Len>16</Len>
1056 + <Data>260100003D0100006602000050020000</Data>
1057 + </RectRecentFloat>
1058 + </Window>
1059 + <Window>
1060 + <RegID>38003</RegID>
1061 + <PaneID>38003</PaneID>
1062 + <IsVisible>0</IsVisible>
1063 + <IsFloating>0</IsFloating>
1064 + <IsTabbed>0</IsTabbed>
1065 + <IsActivated>0</IsActivated>
1066 + <MRUWidth>32767</MRUWidth>
1067 + <PinState>0</PinState>
1068 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1069 + <RecentRowIndex>0</RecentRowIndex>
1070 + <RectRecentDocked>
1071 + <Len>16</Len>
1072 + <Data>03000000660000003D0100006A040000</Data>
1073 + </RectRecentDocked>
1074 + <RectRecentFloat>
1075 + <Len>16</Len>
1076 + <Data>3C0400009202000083050000C9060000</Data>
1077 + </RectRecentFloat>
1078 + </Window>
1079 + <Window>
1080 + <RegID>38007</RegID>
1081 + <PaneID>38007</PaneID>
1082 + <IsVisible>0</IsVisible>
1083 + <IsFloating>0</IsFloating>
1084 + <IsTabbed>0</IsTabbed>
1085 + <IsActivated>0</IsActivated>
1086 + <MRUWidth>32767</MRUWidth>
1087 + <PinState>0</PinState>
1088 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1089 + <RecentRowIndex>0</RecentRowIndex>
1090 + <RectRecentDocked>
1091 + <Len>16</Len>
1092 + <Data>0300000095040000FD0900002C050000</Data>
1093 + </RectRecentDocked>
1094 + <RectRecentFloat>
1095 + <Len>16</Len>
1096 + <Data>4001000057010000F80400001B020000</Data>
1097 + </RectRecentFloat>
1098 + </Window>
1099 + <Window>
1100 + <RegID>436</RegID>
1101 + <PaneID>436</PaneID>
1102 + <IsVisible>0</IsVisible>
1103 + <IsFloating>0</IsFloating>
1104 + <IsTabbed>0</IsTabbed>
1105 + <IsActivated>0</IsActivated>
1106 + <MRUWidth>32767</MRUWidth>
1107 + <PinState>0</PinState>
1108 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1109 + <RecentRowIndex>0</RecentRowIndex>
1110 + <RectRecentDocked>
1111 + <Len>16</Len>
1112 + <Data>0300000095040000FD0900002C050000</Data>
1113 + </RectRecentDocked>
1114 + <RectRecentFloat>
1115 + <Len>16</Len>
1116 + <Data>7000000087000000EC01000099030000</Data>
1117 + </RectRecentFloat>
1118 + </Window>
1119 + <Window>
1120 + <RegID>437</RegID>
1121 + <PaneID>437</PaneID>
1122 + <IsVisible>0</IsVisible>
1123 + <IsFloating>0</IsFloating>
1124 + <IsTabbed>0</IsTabbed>
1125 + <IsActivated>0</IsActivated>
1126 + <MRUWidth>32767</MRUWidth>
1127 + <PinState>0</PinState>
1128 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1129 + <RecentRowIndex>0</RecentRowIndex>
1130 + <RectRecentDocked>
1131 + <Len>16</Len>
1132 + <Data>FB04000090FDFFFFFB04000023010000</Data>
1133 + </RectRecentDocked>
1134 + <RectRecentFloat>
1135 + <Len>16</Len>
1136 + <Data>7000000087000000B00100009A010000</Data>
1137 + </RectRecentFloat>
1138 + </Window>
1139 + <Window>
1140 + <RegID>440</RegID>
1141 + <PaneID>440</PaneID>
1142 + <IsVisible>0</IsVisible>
1143 + <IsFloating>0</IsFloating>
1144 + <IsTabbed>0</IsTabbed>
1145 + <IsActivated>0</IsActivated>
1146 + <MRUWidth>32767</MRUWidth>
1147 + <PinState>0</PinState>
1148 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1149 + <RecentRowIndex>0</RecentRowIndex>
1150 + <RectRecentDocked>
1151 + <Len>16</Len>
1152 + <Data>FB04000090FDFFFFFB04000023010000</Data>
1153 + </RectRecentDocked>
1154 + <RectRecentFloat>
1155 + <Len>16</Len>
1156 + <Data>7000000087000000B00100009A010000</Data>
1157 + </RectRecentFloat>
1158 + </Window>
1159 + <Window>
1160 + <RegID>463</RegID>
1161 + <PaneID>463</PaneID>
1162 + <IsVisible>0</IsVisible>
1163 + <IsFloating>0</IsFloating>
1164 + <IsTabbed>0</IsTabbed>
1165 + <IsActivated>0</IsActivated>
1166 + <MRUWidth>32767</MRUWidth>
1167 + <PinState>0</PinState>
1168 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1169 + <RecentRowIndex>0</RecentRowIndex>
1170 + <RectRecentDocked>
1171 + <Len>16</Len>
1172 + <Data>0300000095040000FD0900002C050000</Data>
1173 + </RectRecentDocked>
1174 + <RectRecentFloat>
1175 + <Len>16</Len>
1176 + <Data>7000000087000000EC01000099030000</Data>
1177 + </RectRecentFloat>
1178 + </Window>
1179 + <Window>
1180 + <RegID>466</RegID>
1181 + <PaneID>466</PaneID>
1182 + <IsVisible>0</IsVisible>
1183 + <IsFloating>0</IsFloating>
1184 + <IsTabbed>0</IsTabbed>
1185 + <IsActivated>0</IsActivated>
1186 + <MRUWidth>0</MRUWidth>
1187 + <PinState>0</PinState>
1188 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1189 + <RecentRowIndex>0</RecentRowIndex>
1190 + <RectRecentDocked>
1191 + <Len>16</Len>
1192 + <Data>0300000095040000FD0900002C050000</Data>
1193 + </RectRecentDocked>
1194 + <RectRecentFloat>
1195 + <Len>16</Len>
1196 + <Data>BE0A0000780000004A0B00002A040000</Data>
1197 + </RectRecentFloat>
1198 + </Window>
1199 + <Window>
1200 + <RegID>470</RegID>
1201 + <PaneID>470</PaneID>
1202 + <IsVisible>0</IsVisible>
1203 + <IsFloating>0</IsFloating>
1204 + <IsTabbed>0</IsTabbed>
1205 + <IsActivated>0</IsActivated>
1206 + <MRUWidth>32767</MRUWidth>
1207 + <PinState>0</PinState>
1208 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1209 + <RecentRowIndex>0</RecentRowIndex>
1210 + <RectRecentDocked>
1211 + <Len>16</Len>
1212 + <Data>4701000066000000AD0300009A000000</Data>
1213 + </RectRecentDocked>
1214 + <RectRecentFloat>
1215 + <Len>16</Len>
1216 + <Data>7000000087000000280400004B010000</Data>
1217 + </RectRecentFloat>
1218 + </Window>
1219 + <Window>
1220 + <RegID>50000</RegID>
1221 + <PaneID>50000</PaneID>
1222 + <IsVisible>0</IsVisible>
1223 + <IsFloating>0</IsFloating>
1224 + <IsTabbed>0</IsTabbed>
1225 + <IsActivated>0</IsActivated>
1226 + <MRUWidth>32767</MRUWidth>
1227 + <PinState>0</PinState>
1228 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1229 + <RecentRowIndex>0</RecentRowIndex>
1230 + <RectRecentDocked>
1231 + <Len>16</Len>
1232 + <Data>7302000066000000AD03000026010000</Data>
1233 + </RectRecentDocked>
1234 + <RectRecentFloat>
1235 + <Len>16</Len>
1236 + <Data>7000000087000000B00100009A010000</Data>
1237 + </RectRecentFloat>
1238 + </Window>
1239 + <Window>
1240 + <RegID>50001</RegID>
1241 + <PaneID>50001</PaneID>
1242 + <IsVisible>0</IsVisible>
1243 + <IsFloating>0</IsFloating>
1244 + <IsTabbed>0</IsTabbed>
1245 + <IsActivated>0</IsActivated>
1246 + <MRUWidth>32767</MRUWidth>
1247 + <PinState>0</PinState>
1248 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1249 + <RecentRowIndex>0</RecentRowIndex>
1250 + <RectRecentDocked>
1251 + <Len>16</Len>
1252 + <Data>7302000066000000AD03000026010000</Data>
1253 + </RectRecentDocked>
1254 + <RectRecentFloat>
1255 + <Len>16</Len>
1256 + <Data>4001000057010000800200006A020000</Data>
1257 + </RectRecentFloat>
1258 + </Window>
1259 + <Window>
1260 + <RegID>50002</RegID>
1261 + <PaneID>50002</PaneID>
1262 + <IsVisible>0</IsVisible>
1263 + <IsFloating>0</IsFloating>
1264 + <IsTabbed>0</IsTabbed>
1265 + <IsActivated>0</IsActivated>
1266 + <MRUWidth>32767</MRUWidth>
1267 + <PinState>0</PinState>
1268 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1269 + <RecentRowIndex>0</RecentRowIndex>
1270 + <RectRecentDocked>
1271 + <Len>16</Len>
1272 + <Data>7302000066000000AD03000026010000</Data>
1273 + </RectRecentDocked>
1274 + <RectRecentFloat>
1275 + <Len>16</Len>
1276 + <Data>7000000087000000B00100009A010000</Data>
1277 + </RectRecentFloat>
1278 + </Window>
1279 + <Window>
1280 + <RegID>50003</RegID>
1281 + <PaneID>50003</PaneID>
1282 + <IsVisible>0</IsVisible>
1283 + <IsFloating>0</IsFloating>
1284 + <IsTabbed>0</IsTabbed>
1285 + <IsActivated>0</IsActivated>
1286 + <MRUWidth>32767</MRUWidth>
1287 + <PinState>0</PinState>
1288 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1289 + <RecentRowIndex>0</RecentRowIndex>
1290 + <RectRecentDocked>
1291 + <Len>16</Len>
1292 + <Data>7302000066000000AD03000026010000</Data>
1293 + </RectRecentDocked>
1294 + <RectRecentFloat>
1295 + <Len>16</Len>
1296 + <Data>7000000087000000B00100009A010000</Data>
1297 + </RectRecentFloat>
1298 + </Window>
1299 + <Window>
1300 + <RegID>50004</RegID>
1301 + <PaneID>50004</PaneID>
1302 + <IsVisible>0</IsVisible>
1303 + <IsFloating>0</IsFloating>
1304 + <IsTabbed>0</IsTabbed>
1305 + <IsActivated>0</IsActivated>
1306 + <MRUWidth>0</MRUWidth>
1307 + <PinState>0</PinState>
1308 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1309 + <RecentRowIndex>0</RecentRowIndex>
1310 + <RectRecentDocked>
1311 + <Len>16</Len>
1312 + <Data>7302000066000000AD03000026010000</Data>
1313 + </RectRecentDocked>
1314 + <RectRecentFloat>
1315 + <Len>16</Len>
1316 + <Data>A40A00005E000000E40B000071010000</Data>
1317 + </RectRecentFloat>
1318 + </Window>
1319 + <Window>
1320 + <RegID>50005</RegID>
1321 + <PaneID>50005</PaneID>
1322 + <IsVisible>0</IsVisible>
1323 + <IsFloating>0</IsFloating>
1324 + <IsTabbed>0</IsTabbed>
1325 + <IsActivated>0</IsActivated>
1326 + <MRUWidth>32767</MRUWidth>
1327 + <PinState>0</PinState>
1328 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1329 + <RecentRowIndex>0</RecentRowIndex>
1330 + <RectRecentDocked>
1331 + <Len>16</Len>
1332 + <Data>7302000066000000AD03000026010000</Data>
1333 + </RectRecentDocked>
1334 + <RectRecentFloat>
1335 + <Len>16</Len>
1336 + <Data>3C000000530000007C01000066010000</Data>
1337 + </RectRecentFloat>
1338 + </Window>
1339 + <Window>
1340 + <RegID>50006</RegID>
1341 + <PaneID>50006</PaneID>
1342 + <IsVisible>0</IsVisible>
1343 + <IsFloating>0</IsFloating>
1344 + <IsTabbed>0</IsTabbed>
1345 + <IsActivated>0</IsActivated>
1346 + <MRUWidth>32767</MRUWidth>
1347 + <PinState>0</PinState>
1348 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1349 + <RecentRowIndex>0</RecentRowIndex>
1350 + <RectRecentDocked>
1351 + <Len>16</Len>
1352 + <Data>7302000066000000AD03000026010000</Data>
1353 + </RectRecentDocked>
1354 + <RectRecentFloat>
1355 + <Len>16</Len>
1356 + <Data>7000000087000000B00100009A010000</Data>
1357 + </RectRecentFloat>
1358 + </Window>
1359 + <Window>
1360 + <RegID>50007</RegID>
1361 + <PaneID>50007</PaneID>
1362 + <IsVisible>0</IsVisible>
1363 + <IsFloating>0</IsFloating>
1364 + <IsTabbed>0</IsTabbed>
1365 + <IsActivated>0</IsActivated>
1366 + <MRUWidth>32767</MRUWidth>
1367 + <PinState>0</PinState>
1368 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1369 + <RecentRowIndex>0</RecentRowIndex>
1370 + <RectRecentDocked>
1371 + <Len>16</Len>
1372 + <Data>7302000066000000AD03000026010000</Data>
1373 + </RectRecentDocked>
1374 + <RectRecentFloat>
1375 + <Len>16</Len>
1376 + <Data>7000000087000000B00100009A010000</Data>
1377 + </RectRecentFloat>
1378 + </Window>
1379 + <Window>
1380 + <RegID>50008</RegID>
1381 + <PaneID>50008</PaneID>
1382 + <IsVisible>0</IsVisible>
1383 + <IsFloating>0</IsFloating>
1384 + <IsTabbed>0</IsTabbed>
1385 + <IsActivated>0</IsActivated>
1386 + <MRUWidth>32767</MRUWidth>
1387 + <PinState>0</PinState>
1388 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1389 + <RecentRowIndex>0</RecentRowIndex>
1390 + <RectRecentDocked>
1391 + <Len>16</Len>
1392 + <Data>7302000066000000AD03000026010000</Data>
1393 + </RectRecentDocked>
1394 + <RectRecentFloat>
1395 + <Len>16</Len>
1396 + <Data>7000000087000000B00100009A010000</Data>
1397 + </RectRecentFloat>
1398 + </Window>
1399 + <Window>
1400 + <RegID>50009</RegID>
1401 + <PaneID>50009</PaneID>
1402 + <IsVisible>0</IsVisible>
1403 + <IsFloating>0</IsFloating>
1404 + <IsTabbed>0</IsTabbed>
1405 + <IsActivated>0</IsActivated>
1406 + <MRUWidth>32767</MRUWidth>
1407 + <PinState>0</PinState>
1408 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1409 + <RecentRowIndex>0</RecentRowIndex>
1410 + <RectRecentDocked>
1411 + <Len>16</Len>
1412 + <Data>7302000066000000AD03000026010000</Data>
1413 + </RectRecentDocked>
1414 + <RectRecentFloat>
1415 + <Len>16</Len>
1416 + <Data>7000000087000000B00100009A010000</Data>
1417 + </RectRecentFloat>
1418 + </Window>
1419 + <Window>
1420 + <RegID>50010</RegID>
1421 + <PaneID>50010</PaneID>
1422 + <IsVisible>0</IsVisible>
1423 + <IsFloating>0</IsFloating>
1424 + <IsTabbed>0</IsTabbed>
1425 + <IsActivated>0</IsActivated>
1426 + <MRUWidth>32767</MRUWidth>
1427 + <PinState>0</PinState>
1428 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1429 + <RecentRowIndex>0</RecentRowIndex>
1430 + <RectRecentDocked>
1431 + <Len>16</Len>
1432 + <Data>7302000066000000AD03000026010000</Data>
1433 + </RectRecentDocked>
1434 + <RectRecentFloat>
1435 + <Len>16</Len>
1436 + <Data>7000000087000000B00100009A010000</Data>
1437 + </RectRecentFloat>
1438 + </Window>
1439 + <Window>
1440 + <RegID>50011</RegID>
1441 + <PaneID>50011</PaneID>
1442 + <IsVisible>0</IsVisible>
1443 + <IsFloating>0</IsFloating>
1444 + <IsTabbed>0</IsTabbed>
1445 + <IsActivated>0</IsActivated>
1446 + <MRUWidth>32767</MRUWidth>
1447 + <PinState>0</PinState>
1448 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1449 + <RecentRowIndex>0</RecentRowIndex>
1450 + <RectRecentDocked>
1451 + <Len>16</Len>
1452 + <Data>7302000066000000AD03000026010000</Data>
1453 + </RectRecentDocked>
1454 + <RectRecentFloat>
1455 + <Len>16</Len>
1456 + <Data>7000000087000000B00100009A010000</Data>
1457 + </RectRecentFloat>
1458 + </Window>
1459 + <Window>
1460 + <RegID>50012</RegID>
1461 + <PaneID>50012</PaneID>
1462 + <IsVisible>0</IsVisible>
1463 + <IsFloating>0</IsFloating>
1464 + <IsTabbed>0</IsTabbed>
1465 + <IsActivated>0</IsActivated>
1466 + <MRUWidth>32767</MRUWidth>
1467 + <PinState>0</PinState>
1468 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1469 + <RecentRowIndex>0</RecentRowIndex>
1470 + <RectRecentDocked>
1471 + <Len>16</Len>
1472 + <Data>7302000066000000AD03000026010000</Data>
1473 + </RectRecentDocked>
1474 + <RectRecentFloat>
1475 + <Len>16</Len>
1476 + <Data>A40A00005E000000E40B000071010000</Data>
1477 + </RectRecentFloat>
1478 + </Window>
1479 + <Window>
1480 + <RegID>50013</RegID>
1481 + <PaneID>50013</PaneID>
1482 + <IsVisible>0</IsVisible>
1483 + <IsFloating>0</IsFloating>
1484 + <IsTabbed>0</IsTabbed>
1485 + <IsActivated>0</IsActivated>
1486 + <MRUWidth>32767</MRUWidth>
1487 + <PinState>0</PinState>
1488 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1489 + <RecentRowIndex>0</RecentRowIndex>
1490 + <RectRecentDocked>
1491 + <Len>16</Len>
1492 + <Data>7302000066000000AD03000026010000</Data>
1493 + </RectRecentDocked>
1494 + <RectRecentFloat>
1495 + <Len>16</Len>
1496 + <Data>7000000087000000B00100009A010000</Data>
1497 + </RectRecentFloat>
1498 + </Window>
1499 + <Window>
1500 + <RegID>50014</RegID>
1501 + <PaneID>0</PaneID>
1502 + <IsVisible>0</IsVisible>
1503 + <IsFloating>0</IsFloating>
1504 + <IsTabbed>0</IsTabbed>
1505 + <IsActivated>0</IsActivated>
1506 + <MRUWidth>0</MRUWidth>
1507 + <PinState>0</PinState>
1508 + <RecentFrameAlignment>0</RecentFrameAlignment>
1509 + <RecentRowIndex>0</RecentRowIndex>
1510 + <RectRecentDocked>
1511 + <Len>16</Len>
1512 + <Data>7302000066000000AD03000026010000</Data>
1513 + </RectRecentDocked>
1514 + <RectRecentFloat>
1515 + <Len>16</Len>
1516 + <Data>3C000000530000007C01000066010000</Data>
1517 + </RectRecentFloat>
1518 + </Window>
1519 + <Window>
1520 + <RegID>50015</RegID>
1521 + <PaneID>50015</PaneID>
1522 + <IsVisible>0</IsVisible>
1523 + <IsFloating>0</IsFloating>
1524 + <IsTabbed>0</IsTabbed>
1525 + <IsActivated>0</IsActivated>
1526 + <MRUWidth>32767</MRUWidth>
1527 + <PinState>0</PinState>
1528 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1529 + <RecentRowIndex>0</RecentRowIndex>
1530 + <RectRecentDocked>
1531 + <Len>16</Len>
1532 + <Data>7302000066000000AD03000026010000</Data>
1533 + </RectRecentDocked>
1534 + <RectRecentFloat>
1535 + <Len>16</Len>
1536 + <Data>7000000087000000B00100009A010000</Data>
1537 + </RectRecentFloat>
1538 + </Window>
1539 + <Window>
1540 + <RegID>50016</RegID>
1541 + <PaneID>50016</PaneID>
1542 + <IsVisible>0</IsVisible>
1543 + <IsFloating>0</IsFloating>
1544 + <IsTabbed>0</IsTabbed>
1545 + <IsActivated>0</IsActivated>
1546 + <MRUWidth>32767</MRUWidth>
1547 + <PinState>0</PinState>
1548 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1549 + <RecentRowIndex>0</RecentRowIndex>
1550 + <RectRecentDocked>
1551 + <Len>16</Len>
1552 + <Data>7302000066000000AD03000026010000</Data>
1553 + </RectRecentDocked>
1554 + <RectRecentFloat>
1555 + <Len>16</Len>
1556 + <Data>7000000087000000B00100009A010000</Data>
1557 + </RectRecentFloat>
1558 + </Window>
1559 + <Window>
1560 + <RegID>50017</RegID>
1561 + <PaneID>50017</PaneID>
1562 + <IsVisible>0</IsVisible>
1563 + <IsFloating>0</IsFloating>
1564 + <IsTabbed>0</IsTabbed>
1565 + <IsActivated>0</IsActivated>
1566 + <MRUWidth>32767</MRUWidth>
1567 + <PinState>0</PinState>
1568 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1569 + <RecentRowIndex>0</RecentRowIndex>
1570 + <RectRecentDocked>
1571 + <Len>16</Len>
1572 + <Data>7302000066000000AD03000026010000</Data>
1573 + </RectRecentDocked>
1574 + <RectRecentFloat>
1575 + <Len>16</Len>
1576 + <Data>7000000087000000B00100009A010000</Data>
1577 + </RectRecentFloat>
1578 + </Window>
1579 + <Window>
1580 + <RegID>50018</RegID>
1581 + <PaneID>50018</PaneID>
1582 + <IsVisible>0</IsVisible>
1583 + <IsFloating>0</IsFloating>
1584 + <IsTabbed>0</IsTabbed>
1585 + <IsActivated>0</IsActivated>
1586 + <MRUWidth>32767</MRUWidth>
1587 + <PinState>0</PinState>
1588 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1589 + <RecentRowIndex>0</RecentRowIndex>
1590 + <RectRecentDocked>
1591 + <Len>16</Len>
1592 + <Data>7302000066000000AD03000026010000</Data>
1593 + </RectRecentDocked>
1594 + <RectRecentFloat>
1595 + <Len>16</Len>
1596 + <Data>7000000087000000B00100009A010000</Data>
1597 + </RectRecentFloat>
1598 + </Window>
1599 + <Window>
1600 + <RegID>50019</RegID>
1601 + <PaneID>50019</PaneID>
1602 + <IsVisible>0</IsVisible>
1603 + <IsFloating>0</IsFloating>
1604 + <IsTabbed>0</IsTabbed>
1605 + <IsActivated>0</IsActivated>
1606 + <MRUWidth>0</MRUWidth>
1607 + <PinState>0</PinState>
1608 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1609 + <RecentRowIndex>0</RecentRowIndex>
1610 + <RectRecentDocked>
1611 + <Len>16</Len>
1612 + <Data>7302000066000000AD03000026010000</Data>
1613 + </RectRecentDocked>
1614 + <RectRecentFloat>
1615 + <Len>16</Len>
1616 + <Data>7000000087000000B00100009A010000</Data>
1617 + </RectRecentFloat>
1618 + </Window>
1619 + <Window>
1620 + <RegID>59392</RegID>
1621 + <PaneID>59392</PaneID>
1622 + <IsVisible>1</IsVisible>
1623 + <IsFloating>0</IsFloating>
1624 + <IsTabbed>0</IsTabbed>
1625 + <IsActivated>0</IsActivated>
1626 + <MRUWidth>966</MRUWidth>
1627 + <PinState>0</PinState>
1628 + <RecentFrameAlignment>8192</RecentFrameAlignment>
1629 + <RecentRowIndex>0</RecentRowIndex>
1630 + <RectRecentDocked>
1631 + <Len>16</Len>
1632 + <Data>0000000000000000D10300001C000000</Data>
1633 + </RectRecentDocked>
1634 + <RectRecentFloat>
1635 + <Len>16</Len>
1636 + <Data>0A0000000A0000006E0000006E000000</Data>
1637 + </RectRecentFloat>
1638 + </Window>
1639 + <Window>
1640 + <RegID>59393</RegID>
1641 + <PaneID>0</PaneID>
1642 + <IsVisible>1</IsVisible>
1643 + <IsFloating>0</IsFloating>
1644 + <IsTabbed>0</IsTabbed>
1645 + <IsActivated>0</IsActivated>
1646 + <MRUWidth>32767</MRUWidth>
1647 + <PinState>0</PinState>
1648 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1649 + <RecentRowIndex>0</RecentRowIndex>
1650 + <RectRecentDocked>
1651 + <Len>16</Len>
1652 + <Data>0000000045050000FE04000058050000</Data>
1653 + </RectRecentDocked>
1654 + <RectRecentFloat>
1655 + <Len>16</Len>
1656 + <Data>0A0000000A0000006E0000006E000000</Data>
1657 + </RectRecentFloat>
1658 + </Window>
1659 + <Window>
1660 + <RegID>59399</RegID>
1661 + <PaneID>59399</PaneID>
1662 + <IsVisible>1</IsVisible>
1663 + <IsFloating>0</IsFloating>
1664 + <IsTabbed>0</IsTabbed>
1665 + <IsActivated>0</IsActivated>
1666 + <MRUWidth>151</MRUWidth>
1667 + <PinState>0</PinState>
1668 + <RecentFrameAlignment>8192</RecentFrameAlignment>
1669 + <RecentRowIndex>1</RecentRowIndex>
1670 + <RectRecentDocked>
1671 + <Len>16</Len>
1672 + <Data>070000001C000000EE01000038000000</Data>
1673 + </RectRecentDocked>
1674 + <RectRecentFloat>
1675 + <Len>16</Len>
1676 + <Data>58FCFFFF3B020000F7FCFFFFE7020000</Data>
1677 + </RectRecentFloat>
1678 + </Window>
1679 + <Window>
1680 + <RegID>59400</RegID>
1681 + <PaneID>59400</PaneID>
1682 + <IsVisible>0</IsVisible>
1683 + <IsFloating>0</IsFloating>
1684 + <IsTabbed>0</IsTabbed>
1685 + <IsActivated>0</IsActivated>
1686 + <MRUWidth>38</MRUWidth>
1687 + <PinState>0</PinState>
1688 + <RecentFrameAlignment>8192</RecentFrameAlignment>
1689 + <RecentRowIndex>0</RecentRowIndex>
1690 + <RectRecentDocked>
1691 + <Len>16</Len>
1692 + <Data>00000000000000006F0200001C000000</Data>
1693 + </RectRecentDocked>
1694 + <RectRecentFloat>
1695 + <Len>16</Len>
1696 + <Data>0A0000000A0000006E0000006E000000</Data>
1697 + </RectRecentFloat>
1698 + </Window>
1699 + <Window>
1700 + <RegID>824</RegID>
1701 + <PaneID>824</PaneID>
1702 + <IsVisible>0</IsVisible>
1703 + <IsFloating>0</IsFloating>
1704 + <IsTabbed>0</IsTabbed>
1705 + <IsActivated>0</IsActivated>
1706 + <MRUWidth>32767</MRUWidth>
1707 + <PinState>0</PinState>
1708 + <RecentFrameAlignment>4096</RecentFrameAlignment>
1709 + <RecentRowIndex>0</RecentRowIndex>
1710 + <RectRecentDocked>
1711 + <Len>16</Len>
1712 + <Data>FB04000090FDFFFFFB04000023010000</Data>
1713 + </RectRecentDocked>
1714 + <RectRecentFloat>
1715 + <Len>16</Len>
1716 + <Data>260100003D0100006602000050020000</Data>
1717 + </RectRecentFloat>
1718 + </Window>
1719 + <DockMan>
1720 + <Len>3390</Len>
1721 + <Data>000000000A000000000000000020000000000000FFFFFFFFFFFFFFFF44010000B3000000B0030000B7000000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E6500200000000000004401000066000000B0030000CA000000440100004F000000B0030000B30000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF6C0200004F000000700200003F010000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C30000018000400000000000007002000066000000B003000056010000700200004F000000B00300003F01000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFF400100004F000000440100007A040000010000000200001004000000010000000000000000000000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000100000010000000000000066000000400100009A040000000000004F000000400100007A0400000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000037010000B00300003B0100000000000001000000040000000100000000000000000000000000000000000000000000000100000000000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB090000018000800000000000004401000066000000700700002A010000F804000079FDFFFFF80400003C01000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFD80100003B010000DC010000A701000000000000020000000400000000000000000000000000000000000000000000000000000001000000FFFFFFFF8F07000001000000FFFFFFFF8F070000000000000080000001000000FFFFFFFFFFFFFFFF000000007A040000FE0400007E04000001000000010000100400000001000000AEFBFFFFA2000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF0100007794000001800080000001000000000000009E040000000A000065050000000000007E040000FE040000450500000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC500000001000000FFFF02001400434D756C746950616E654672616D65576E644578000100841DFBFFFF8F020000D5FEFFFF5303000000000000000000000200000000000000C60000000000000000000000000000000000000001000000C60000000000000000000000</Data>
1722 + </DockMan>
1723 + <ToolBar>
1724 + <RegID>59392</RegID>
1725 + <Name>File</Name>
1726 + <Buttons>
1727 + <Len>2980</Len>
1728 + <Data>00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE80300000000000000000000000000000000000000000000000100000001000000960000000200205000000000144154436F6D6D616E645F43574D4F44455F5345549600000000000000140010574946495F5265636569766544617461036165736730323161356332633865653966656235633462396137353362376234373662376664363432326566316633646436373437363166613939643661633237633861396131393762323732383232663663643537613535616134663530616533313762313335343566056279746573144154436F6D6D616E645F43574D4F44455F534554154154436F6D6D616E645F43574D4F44455F534554330867656E65726174650367656E12636970686572656453657373696F6E4B657903636263104145535F4B45595F53495A455F313238094145535F537461727409657370383236362E680753484148617368134543435F5665726966795369676E61747572650C464D435F526561645F4F5450094765744D696C6C69730E6D696C6C69735F636F756E7465720F435250545F49525148616E646C65720D4D424544544C535F4E45545F430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65C6030000</Data>
1729 + </Buttons>
1730 + <OriginalItems>
1731 + <Len>1423</Len>
1732 + <Data>2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000</Data>
1733 + </OriginalItems>
1734 + <OrigResetItems>
1735 + <Len>1423</Len>
1736 + <Data>2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000</Data>
1737 + </OrigResetItems>
1738 + </ToolBar>
1739 + <ToolBar>
1740 + <RegID>59399</RegID>
1741 + <Name>Build</Name>
1742 + <Buttons>
1743 + <Len>978</Len>
1744 + <Data>00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000010000000000000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA0000000000000000000000000000000000000000000000000100000001000000960000000300205000000000094E6F6E53656375726596000000000000000100094E6F6E536563757265000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000000240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C6497000000</Data>
1745 + </Buttons>
1746 + <OriginalItems>
1747 + <Len>583</Len>
1748 + <Data>1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF0001000000000000000100000000000000010000000180A801000000000000FFFFFFFF00010000000000000001000000000000000100000001807202000000000000FFFFFFFF0001000000000000000100000000000000010000000180BE01000000000000FFFFFFFF000100000000000000010000000000000001000000</Data>
1749 + </OriginalItems>
1750 + <OrigResetItems>
1751 + <Len>583</Len>
1752 + <Data>1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A000000000000090000000000000000000000000000000001000000010000000180A8010000000000000A000000000000000000000000000000000100000001000000018072020000000000000B0000000000000000000000000000000001000000010000000180BE010000000000000C000000000000000000000000000000000100000001000000</Data>
1753 + </OrigResetItems>
1754 + </ToolBar>
1755 + <ToolBar>
1756 + <RegID>59400</RegID>
1757 + <Name>Debug</Name>
1758 + <Buttons>
1759 + <Len>2373</Len>
1760 + <Data>00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720100000000000000010000000000000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7201000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72010000000000000001000000000000000100000000000000000000000100000000000000000005446562756726000000</Data>
1761 + </Buttons>
1762 + <OriginalItems>
1763 + <Len>898</Len>
1764 + <Data>1900FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D88B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF000100000000000000010000000000000001000000</Data>
1765 + </OriginalItems>
1766 + <OrigResetItems>
1767 + <Len>898</Len>
1768 + <Data>1900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180D88B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180018900000000000013000000000000000000000000000000000100000001000000</Data>
1769 + </OrigResetItems>
1770 + </ToolBar>
1771 + <ControlBarsSummary>
1772 + <Bars>0</Bars>
1773 + <ScreenCX>2560</ScreenCX>
1774 + <ScreenCY>1440</ScreenCY>
1775 + </ControlBarsSummary>
1776 + </ViewEx>
1777 + </WinLayoutEx>
1778 +
1779 + <MDIGroups>
1780 + <Orientation>1</Orientation>
1781 + <ActiveMDIGroup>0</ActiveMDIGroup>
1782 + <MDIGroup>
1783 + <Size>100</Size>
1784 + <ActiveTab>2</ActiveTab>
1785 + <Doc>
1786 + <Name>&lt;1&gt;.\MAX30102\MAX30102.c</Name>
1787 + <ColumnNumber>18</ColumnNumber>
1788 + <TopLine>225</TopLine>
1789 + <CurrentLine>284</CurrentLine>
1790 + <Folding>1</Folding>
1791 + <ContractedFolders></ContractedFolders>
1792 + <PaneID>0</PaneID>
1793 + </Doc>
1794 + <Doc>
1795 + <Name>&lt;2&gt;.\WiFi\wifi.c</Name>
1796 + <ColumnNumber>53</ColumnNumber>
1797 + <TopLine>200</TopLine>
1798 + <CurrentLine>229</CurrentLine>
1799 + <Folding>1</Folding>
1800 + <ContractedFolders></ContractedFolders>
1801 + <PaneID>0</PaneID>
1802 + </Doc>
1803 + <Doc>
1804 + <Name>&lt;2&gt;.\main_ns.c</Name>
1805 + <ColumnNumber>54</ColumnNumber>
1806 + <TopLine>84</TopLine>
1807 + <CurrentLine>110</CurrentLine>
1808 + <Folding>1</Folding>
1809 + <ContractedFolders></ContractedFolders>
1810 + <PaneID>0</PaneID>
1811 + </Doc>
1812 + <Doc>
1813 + <Name>&lt;1&gt;.\MAX30102\MAX30102.h</Name>
1814 + <ColumnNumber>0</ColumnNumber>
1815 + <TopLine>1</TopLine>
1816 + <CurrentLine>1</CurrentLine>
1817 + <Folding>1</Folding>
1818 + <ContractedFolders></ContractedFolders>
1819 + <PaneID>0</PaneID>
1820 + </Doc>
1821 + <Doc>
1822 + <Name>&lt;1&gt;.\nsc.c</Name>
1823 + <ColumnNumber>1</ColumnNumber>
1824 + <TopLine>7</TopLine>
1825 + <CurrentLine>28</CurrentLine>
1826 + <Folding>1</Folding>
1827 + <ContractedFolders></ContractedFolders>
1828 + <PaneID>0</PaneID>
1829 + </Doc>
1830 + <Doc>
1831 + <Name>&lt;1&gt;.\nsc.h</Name>
1832 + <ColumnNumber>19</ColumnNumber>
1833 + <TopLine>37</TopLine>
1834 + <CurrentLine>69</CurrentLine>
1835 + <Folding>1</Folding>
1836 + <ContractedFolders></ContractedFolders>
1837 + <PaneID>0</PaneID>
1838 + </Doc>
1839 + </MDIGroup>
1840 + </MDIGroups>
1841 +
1842 +</ProjectGui>
1 +/**********************************************************
2 + *
3 + * @file : M2351_crypto.h
4 + * @author : HaewonSeo
5 + *
6 + * @note : M2351 Cryptographic Accelerator
7 + **********************************************************/
8 +#include "M2351_crypto.h"
9 +#include "nsc.h"
10 +
11 +uint32_t sessionKey[8] =
12 +{
13 + 0x30303030, 0x30303030, 0x30303030, 0x30303030,
14 + 0x30303030, 0x30303030, 0x30303030, 0x30303030
15 +};
16 +
17 +uint32_t sessionIV[4] =
18 +{
19 + 0x30303030, 0x30303030, 0x30303030, 0x30303030
20 +};
21 +
22 +char priKey[49] = {0};
23 +char pubKey1[49] = {0}, pubKey2[49] = {0};
24 +char R[49] = {0}, S[49] = {0};
25 +
26 +#define KEY_LENGTH 192 /* Select ECC P-192 curve, 192-bits key length */
27 +
28 +static char hex_char_tbl[] = "0123456789abcdef";
29 +
30 +static char get_Nth_nibble_char(uint32_t val32, uint32_t idx)
31 +{
32 + return hex_char_tbl[(val32 >> (idx * 4U)) & 0xfU ];
33 +}
34 +
35 +
36 +static void Reg2Hex(int32_t count, uint32_t volatile reg[], char output[])
37 +{
38 + int32_t idx, ri;
39 + uint32_t i;
40 +
41 + output[count] = 0U;
42 + idx = count - 1;
43 +
44 + for(ri = 0; idx >= 0; ri++)
45 + {
46 + for(i = 0UL; (i < 8UL) && (idx >= 0); i++)
47 + {
48 + output[idx] = get_Nth_nibble_char(reg[ri], i);
49 + idx--;
50 + }
51 + }
52 +}
53 +
54 +static void DumpBuffHex(uint8_t *pucBuff, int nBytes)
55 +{
56 + int32_t i32Idx, i;
57 +
58 + i32Idx = 0;
59 + while(nBytes > 0)
60 + {
61 + printf("0x%04X ", i32Idx);
62 + for(i = 0; i < 16; i++)
63 + printf("%02x ", pucBuff[i32Idx + i]);
64 + printf(" ");
65 + for(i = 0; i < 16; i++)
66 + {
67 + if((pucBuff[i32Idx + i] >= 0x20) && (pucBuff[i32Idx + i] < 127))
68 + printf("%c", pucBuff[i32Idx + i]);
69 + else
70 + printf(".");
71 + nBytes--;
72 + }
73 + i32Idx += 16;
74 + printf("\n");
75 + }
76 + printf("\n");
77 +}
78 +
79 +
80 +void CRPT_IRQHandler()
81 +{
82 + if(AES_GET_INT_FLAG(CRPT))
83 + {
84 + g_AES_done = 1;
85 + AES_CLR_INT_FLAG(CRPT);
86 + }
87 +
88 + ECC_DriverISR(CRPT);
89 +
90 +}
91 +
92 +void M2351_Crypto_Init(uint8_t channel, uint8_t modeAES)
93 +{
94 + if(modeAES != ENCRYPT && modeAES != DECRYPT)
95 + printf("Error mode , mode must be ENCRYPT or DECRYPT value\n");
96 +
97 + NVIC_EnableIRQ(CRPT_IRQn);
98 + AES_ENABLE_INT(CRPT);
99 +
100 + AES_Open(CRPT, channel, modeAES, AES_MODE_CBC, AES_KEY_SIZE_128, AES_IN_OUT_SWAP);
101 +}
102 +
103 +void M2351_Crypto_UseMasterKey()
104 +{
105 +
106 + CRPT_T *crpt = CRPT;
107 + uint32_t u32Channel = 1;
108 +
109 + /* Load Key */
110 + uint32_t key_reg_addr;
111 + // 0x3CUL : channel size
112 + key_reg_addr = (uint32_t)&crpt->AES0_KEY[0] + (u32Channel * 0x3CUL);
113 +
114 + /* Enable FMC ISP function */
115 + FMC_Open();
116 +
117 + outpw(key_reg_addr, FMC_ReadUID(0));
118 + outpw(key_reg_addr+4UL, FMC_ReadUID(1));
119 + outpw(key_reg_addr+8UL, FMC_ReadUID(2));
120 + outpw(key_reg_addr+12UL, FMC_ReadUID(0));
121 +
122 + //printf("\nmasterKey = %08x%08x%08x%08x\n",FMC_ReadUID(0),FMC_ReadUID(1),FMC_ReadUID(2),FMC_ReadUID(0));
123 +
124 + /* Disable FMC ISP function */
125 + FMC_Close();
126 +
127 + //outpw(key_reg_addr, 0x2b7e1516);
128 + //outpw(key_reg_addr+4UL, 0x28aed2a6);
129 + //outpw(key_reg_addr+8UL, 0xabf71588);
130 + //outpw(key_reg_addr+12UL, 0x09cf4f3c);
131 +
132 + /* Load IV */
133 + uint32_t iv_reg_addr;
134 + iv_reg_addr = (uint32_t)&crpt->AES0_IV[0] + (u32Channel * 0x3CUL);
135 +
136 + outpw(iv_reg_addr, 0x00000000);
137 + outpw(iv_reg_addr+4UL, 0x00000000);
138 + outpw(iv_reg_addr+8UL, 0x00000000);
139 + outpw(iv_reg_addr+12UL, 0x00000000);
140 +
141 +}
142 +
143 +void M2351_Crypto_UseSessionKey(uint8_t channel)
144 +{
145 +
146 + if (DEMO)
147 + printf("| Secure is running ... Use sessionKey |\n");
148 + uint32_t tmp_sk[4];
149 + uint32_t tmp_si[4];
150 +
151 + for (uint8_t z = 0; z < 4; z++)
152 + {
153 + tmp_sk[z] = sessionKey[z];
154 + tmp_si[z] = sessionIV[z];
155 + }
156 + AES_SetKey(CRPT, channel, tmp_sk, AES_KEY_SIZE_128);
157 + AES_SetInitVect(CRPT, channel, tmp_si);
158 +
159 +}
160 +
161 +/* Function M2351_encrypt_data is same as Nuvoton_M2351_decrypt_data */
162 +void M2351_Encrypt_Data(uint8_t channel, uint8_t InputData[], uint8_t OutputData[], uint32_t bytes)
163 +{
164 +
165 + //printf("AES ECB encrypt start.\n");
166 +
167 + //printf("&inputData = %p\n",InputData);
168 + //printf("&outputData = %p\n",OutputData);
169 +
170 + AES_SetDMATransfer(CRPT, channel, (uint32_t)InputData, (uint32_t)OutputData, bytes);
171 +/*
172 + printf("before start AES : \n"
173 + "CRPT->AES0_CNT : %d\n"
174 + "CRPT->AES0_DADDR : %d\n"
175 + "CRPT->AES0_IV : %d\n"
176 + "CRPT->AES0_KEY : %d\n"
177 + "CRPT->AES0_SADDR : %d\n", CRPT->AES0_CNT,CRPT->AES0_DADDR,CRPT->AES0_IV, CRPT->AES0_KEY, CRPT->AES0_SADDR);
178 +*/
179 +
180 + g_AES_done = 0;
181 + /* Start AES encrypt */
182 + AES_Start(CRPT, channel, CRYPTO_DMA_ONE_SHOT);
183 +
184 + /* Waiting for AES calculation */
185 + while(!g_AES_done);
186 +
187 + //printf("AES encrypt done.\n\n");
188 + //DumpBuffHex((uint8_t*)OutputData, sizeof((uint8_t*)InputData));
189 +
190 +}
191 +
192 +/* Function M2351_decrypt_data is same as Nuvoton_M2351_encrypt_data */
193 +void M2351_Decrypt_Data(uint8_t channel, uint8_t InputData[], uint8_t OutputData[], uint32_t bytes)
194 +{
195 +
196 + //printf("AES ECB decrypt start.\n");
197 + /*
198 + printf("&inputData = %p\n",InputData);
199 + printf("&outputData = %p\n",OutputData);
200 + */
201 +
202 + AES_SetDMATransfer(CRPT, channel, (uint32_t)InputData, (uint32_t)OutputData, bytes);
203 +/*
204 + printf("before start AES : \n"
205 + "CRPT->AES0_CNT : %d\n"
206 + "CRPT->AES0_DADDR : %d\n"
207 + "CRPT->AES0_IV : %d\n"
208 + "CRPT->AES0_KEY : %d\n"
209 + "CRPT->AES0_SADDR : %d\n", CRPT->AES0_CNT,CRPT->AES0_DADDR,CRPT->AES0_IV, CRPT->AES0_KEY, CRPT->AES0_SADDR);
210 +*/
211 + g_AES_done = 0;
212 + /* Start AES decrypt */
213 + AES_Start(CRPT, channel, CRYPTO_DMA_ONE_SHOT);
214 + /* Waiting for AES calculation */
215 + while(!g_AES_done);
216 +
217 + //printf("AES decrypt done.\n\n");
218 + //DumpBuffHex((uint8_t*)OutputData, sizeof((uint8_t*)InputData));
219 +}
220 +
221 +
222 +
223 +// OTPn : 64 bit
224 +void M2351_FMC_Read_Key(uint32_t num, uint32_t len, char *priKey)
225 +{
226 + uint32_t u32OtpHw, u32OtpLw;
227 + uint32_t i;
228 + uint32_t otpPrivateKey[6]= {0};
229 +
230 + printf("+---------------------------------------------+\n");
231 + printf("| FMC Read OTP Private Key |\n");
232 + printf("+---------------------------------------------+\n");
233 +
234 + if(num >= FMC_OTP_ENTRY_CNT)
235 + {
236 + printf("Invalid OTP number.\n");
237 + return ;
238 + }
239 +
240 + SYS_UnlockReg(); /* Unlock protected registers */
241 +
242 + FMC_Open(); /* Enable FMC ISP function */
243 +
244 + for (num = 0; num < len; num++)
245 + {
246 + if(FMC_Read_OTP(num, &u32OtpLw, &u32OtpHw) != 0)
247 + {
248 + printf("Read OTP%d failed!\n", num);
249 + goto lexit;
250 + }
251 + otpPrivateKey[2*num + 0] = u32OtpLw;
252 + otpPrivateKey[2*num + 1] = u32OtpHw;
253 + }
254 + for (num = 0; num < len; num++)
255 + printf("Read OTP%d : 0x%08x-0x%08x.\n", num, otpPrivateKey[2*num + 0], otpPrivateKey[2*num + 1]);
256 +
257 + Reg2Hex(48, otpPrivateKey, priKey);
258 +
259 +lexit:
260 + FMC_Close(); /* Disable FMC ISP function */
261 + SYS_LockReg(); /* Lock protected registers */
262 +
263 +}
264 +
265 +void M2351_FMC_Write_Key()
266 +{
267 + uint32_t u32i, u32OtpHw, u32OtpLw;
268 +
269 + SYS_UnlockReg(); /* Unlock protected registers */
270 +
271 + FMC_Open(); /* Enable FMC ISP function */
272 +
273 + for(u32i = 0; u32i < FMC_OTP_ENTRY_CNT; u32i++)
274 + {
275 + if(FMC_Read_OTP(u32i, &u32OtpLw, &u32OtpHw) != 0)
276 + {
277 + printf("Read OTP%d failed!\n", u32i);
278 + goto lexit;
279 + }
280 +
281 + if((u32OtpLw == 0xFFFFFFFF) && (u32OtpHw == 0xFFFFFFFF))
282 + {
283 + printf("OTP%d is 0xFFFFFFFF-0xFFFFFFFF. It should be a free entry.\n", u32i);
284 + break;
285 + }
286 + }
287 +
288 + if(u32i == FMC_OTP_ENTRY_CNT)
289 + {
290 + printf("All OTP entries are used.\n");
291 + goto lexit;
292 + }
293 +
294 + printf("Program OTP%d with 0x%x-0x%x...\n", u32i, 0x5A5A0000 | u32i, 0x00005A5A | u32i);
295 +
296 + if(FMC_Write_OTP(u32i, 0x5A5A0000 | u32i, 0x00005A5A | u32i) != 0)
297 + {
298 + printf("Failed to program OTP%d!\n", u32i);
299 + goto lexit;
300 + }
301 +
302 + if(FMC_Read_OTP(u32i, &u32OtpLw, &u32OtpHw) != 0)
303 + {
304 + printf("Read OTP%d failed after programmed!\n", u32i);
305 + goto lexit;
306 + }
307 +
308 + printf("Read back OTP%d: 0x%x-0x%x.\n", u32i, u32OtpLw, u32OtpHw);
309 +
310 + if((u32OtpLw != (0x5A5A0000 | u32i)) || (u32OtpHw != (0x00005A5A | u32i)))
311 + {
312 + printf("OTP%d value is not matched with programmed value!\n", u32i);
313 + goto lexit;
314 + }
315 +
316 + printf("Lock OTP%d...\n", u32i);
317 +
318 + if(FMC_Lock_OTP(u32i) != 0)
319 + {
320 + printf("Failed to lock OTP%d!\n", u32i);
321 + goto lexit;
322 + }
323 +
324 + if(FMC_Read_OTP(u32i, &u32OtpLw, &u32OtpHw) != 0)
325 + {
326 + printf("Read OTP%d failed after programmed!\n", u32i);
327 + goto lexit;
328 + }
329 +
330 + printf("Read OTP%d after locked: 0x%x-0x%x.\n", u32i, u32OtpLw, u32OtpHw);
331 +
332 + if((u32OtpLw != (0x5A5A0000 | u32i)) || (u32OtpHw != (0x00005A5A | u32i)))
333 + {
334 + printf("OTP%d value is incorrect after locked!\n", u32i);
335 + goto lexit;
336 + }
337 +
338 + printf("OTP Write done.\n");
339 +
340 +lexit:
341 + FMC_Close(); /* Disable FMC ISP function */
342 + SYS_LockReg(); /* Lock protected registers */
343 +
344 +}
345 +
346 +
347 +void M2351_ECC_GenerateKey(char *priKey, char *gKey1, char *gKey2)
348 +{
349 + //char gKey1[168], gKey2[168]; /* temporary buffer used to keep output public keys */
350 +
351 + char Qx[] = "1da18eaaa64fdd781bf699feb935744f18f1fa0efac1b255"; /* expected answer: public key 1 */
352 + char Qy[] = "0bbeb7ba3ba9d4e6b8aa5738ddef4cd15ce400611094d319"; /* expected answer: public key 2 */
353 +
354 + int32_t i;
355 +
356 + //SYS_UnlockReg();
357 + printf("+---------------------------------------------+\n");
358 + printf("| Crypto ECC Public Key Generation |\n");
359 + printf("+---------------------------------------------+\n");
360 +
361 + /* Enable ECC interrupt */
362 + NVIC_EnableIRQ(CRPT_IRQn);
363 + ECC_ENABLE_INT(CRPT);
364 +
365 + /* Generate public key from private key d */
366 + if(ECC_GeneratePublicKey(CRPT, CURVE_P_192, priKey, gKey1, gKey2) < 0)
367 + {
368 + printf("ECC key generation failed!!\n");
369 + while(1);
370 + }
371 +
372 + /* Verify public key 1 */
373 + /*
374 + if(memcmp(Qx, gKey1, KEY_LENGTH / 8))
375 + {
376 +
377 + printf("Public key 1 [%s] is not matched with expected [%s]!\n", gKey1, Qx);
378 +
379 + if(memcmp(Qx, gKey1, KEY_LENGTH / 8) == 0)
380 + printf("PASS.\n");
381 + else
382 + printf("Error !!\n");
383 +
384 +
385 + for(i = 0; i < KEY_LENGTH / 8; i++)
386 + {
387 + if(Qx[i] != gKey1[i])
388 + printf("\n%d - 0x%x 0x%x\n", i, Qx[i], gKey1[i]);
389 + }
390 + while(1);
391 + }
392 + */
393 +
394 + printf("ECC key generated OK.\n");
395 + //printf("pubKey1 : %s\npubKey2 : %s\n", gKey1, gKey2);
396 +}
397 +
398 +
399 +
400 +static int32_t SHAHash(uint32_t u32Mode, uint32_t *pu32Addr, int32_t size, uint32_t digest[])
401 +{
402 + int32_t i;
403 + int32_t n;
404 +
405 + /* Enable CRYPTO */
406 + CLK->AHBCLK |= CLK_AHBCLK_CRPTCKEN_Msk;
407 +
408 + /* Init SHA */
409 + CRPT->HMAC_CTL = (u32Mode << CRPT_HMAC_CTL_OPMODE_Pos) | CRPT_HMAC_CTL_INSWAP_Msk;
410 + CRPT->HMAC_DMACNT = size;
411 +
412 + /* Calculate SHA */
413 + while(size > 0)
414 + {
415 + if(size <= 4)
416 + {
417 + CRPT->HMAC_CTL |= CRPT_HMAC_CTL_DMALAST_Msk;
418 + }
419 +
420 + /* Trigger to start SHA processing */
421 + CRPT->HMAC_CTL |= CRPT_HMAC_CTL_START_Msk;
422 +
423 + /* Waiting for SHA data input ready */
424 + while((CRPT->HMAC_STS & CRPT_HMAC_STS_DATINREQ_Msk) == 0);
425 +
426 + /* Input new SHA date */
427 + CRPT->HMAC_DATIN = *pu32Addr;
428 + pu32Addr++;
429 + size -= 4;
430 + }
431 +
432 + /* Waiting for calculation done */
433 + while(CRPT->HMAC_STS & CRPT_HMAC_STS_BUSY_Msk);
434 +
435 + /* return SHA results */
436 + if(u32Mode == SHA_MODE_SHA1)
437 + n = 5;
438 + else if(u32Mode == SHA_MODE_SHA224)
439 + n = 7;
440 + else if(u32Mode == SHA_MODE_SHA256)
441 + n = 8;
442 + else if(u32Mode == SHA_MODE_SHA384)
443 + n = 12;
444 +
445 + for(i = 0; i < n; i++)
446 + digest[i] = CRPT->HMAC_DGST[i];
447 +
448 + return 0;
449 +}
450 +
451 +void M2351_SHA_Hash(uint8_t *msg, uint8_t *hash_msg)
452 +{
453 + int32_t i;
454 + uint32_t u32_hash[5];
455 +
456 + printf("+---------------------------------------------+\n");
457 + printf("| M2351 Crypto SHA-1 Hash |\n");
458 + printf("+---------------------------------------------+\n");
459 +
460 + NVIC_EnableIRQ(CRPT_IRQn);
461 +
462 + printf("Input data:\n");
463 + for(i=0;i<16;i++)
464 + {
465 + printf("%02x", msg[i]);
466 + }
467 +
468 + printf("\n");
469 + SHAHash(SHA_MODE_SHA1, (uint32_t *)msg, 16, u32_hash);
470 + //printf("\nOutput SHA1 Hash:\n");
471 + //for(i=0; i<5; i++)
472 + // printf("%08x", u32_hash[i]);
473 +
474 + /*
475 + printf("\n");
476 + SHAHash(SHA_MODE_SHA224, (uint32_t *)g_au8Test, 32, hash);
477 + printf("\nOutput SHA224 Hash:\n");
478 + for(i=0;i<7;i++)
479 + printf("%08x",hash[i]);
480 +
481 + printf("\n");
482 + SHAHash(SHA_MODE_SHA256, (uint32_t *)g_au8Test, 32, hash);
483 + printf("\nOutput SHA256 Hash:\n");
484 + for(i=0;i<8;i++)
485 + printf("%08x",hash[i]);
486 +
487 + printf("\n");
488 + SHAHash(SHA_MODE_SHA384, (uint32_t *)g_au8Test, 32, hash);
489 + printf("\nOutput SHA384 Hash:\n");
490 + for(i=0;i<12;i++)
491 + printf("%08x",hash[i]);
492 + */
493 +
494 + Reg2Hex(40, u32_hash, (char *)hash_msg);
495 + printf("\nOutput SHA1 Hash:\n%s\n", hash_msg);
496 +
497 + //while(1);
498 +}
499 +
500 +void M2351_ECDSA_GenerateSignature(uint8_t *msg, char *priKey, char* R, char *S)
501 +{
502 + //char g_SHA_msg[] = "608079423f12421de616b7493ebe551cf4d65b92"; /* SHA-1 hash */
503 + char hash_msg[41] = {0};
504 + //char gD[] = "e14f37b3d1374ff8b03f41b9b3fdd2f0ebccf275d660d7f3"; /* private key */
505 + char gK[] = "cb0abc7043a10783684556fb12c4154d57bc31a289685f25"; /* random integer k form [1, n-1] */
506 +
507 + //char gR1[] = "6994d962bdd0d793ffddf855ec5bf2f91a9698b46258a63e"; /* Expected answer: R of (R,S) digital signature */
508 + //char gS1[] = "9cbd7f157288b914a844d941bcdf46ae2355f993d040fbed"; /* Expected answer: S of (R,S) digital signature */
509 +
510 + //char gR[168], gS[168]; /* temporary buffer used to keep digital signature (R,S) pair */
511 +
512 + NVIC_EnableIRQ(CRPT_IRQn);
513 + ECC_ENABLE_INT(CRPT);
514 +
515 + printf("\n");
516 + printf("+---------------------------------------------+\n");
517 + printf("| Crypto ECDSA Singnature Generation |\n");
518 + printf("+---------------------------------------------+\n");
519 +
520 + M2351_SHA_Hash(msg, (uint8_t *)hash_msg);
521 +
522 + /* Calculate ECC signature */
523 + if(ECC_GenerateSignature(CRPT, CURVE_P_192, hash_msg, priKey, gK, R, S) < 0)
524 + {
525 + printf("ECC signature generation failed!!\n");
526 + while(1);
527 + }
528 +
529 + /* Verify the signature (R,S) */
530 + /*
531 + if(memcmp(gR, gR1, sizeof(gR)))
532 + {
533 + printf("Signature R [%s] is not matched with expected [%s]!\n", gR, gR1);
534 + while(1);
535 + }
536 +
537 + if(memcmp(gS, gS1, sizeof(gS)))
538 + {
539 + printf("Signature S [%s] is not matched with expected [%s]!\n", gS, gS1);
540 + while(1);
541 + }
542 + */
543 + printf("\nECC digital signature generated OK.\n");
544 + printf("Signature R : %s\nSignature S : %s\n", R, S);
545 +}
546 +
547 +void M2351_ECDSA_VerificationSignature(char *hash_msg, char *pubKey1, char* pubKey2, char* R, char *S)
548 +{
549 + //char sha_msg[] = "f621926efff296c8b7b5041577237d09d994b481"; /* SHA-1 hash */
550 + //char Qx[] = "1da18eaaa64fdd781bf699feb935744f18f1fa0efac1b255"; /* expected answer: public key 1 */
551 + //char Qy[] = "0bbeb7ba3ba9d4e6b8aa5738ddef4cd15ce400611094d319"; /* expected answer: public key 2 */
552 + //char R[] = "6994d962bdd0d793ffddf855ec5bf2f91a9698b46258a63e"; /* Expected answer: R of (R,S) digital signature */
553 + //char S[] = "ba2de074a517000325d5dbebef8acfb3943eab222ae56f46"; /* Expected answer: S of (R,S) digital signature */
554 +
555 + /* Enable crypto interrupt */
556 + NVIC_EnableIRQ(CRPT_IRQn);
557 + ECC_ENABLE_INT(CRPT);
558 +
559 + printf("+---------------------------------------------+\n");
560 + printf("| Crypto ECDSA Singnature Verification |\n");
561 + printf("+---------------------------------------------+\n");
562 +
563 + /* Verify the signature */
564 + if(ECC_VerifySignature(CRPT, CURVE_P_192, hash_msg, pubKey1, pubKey2, R, S) < 0)
565 + {
566 + printf("ECC signature verification failed!!\n");
567 + while(1);
568 + }
569 +
570 + printf("ECC digital signature verification OK.\n");
571 +
572 +}
573 +
574 +
1 +/**********************************************************
2 + *
3 + * @file : M2351_crypto.h
4 + * @author : HaewonSeo
5 + *
6 + * @note : M2351 Cryptographic Accelerator
7 + **********************************************************/
8 +#include <stdio.h>
9 +#include <string.h>
10 +#include "NuMicro.h"
11 +
12 +#ifndef M2351_CRYPTO_H_
13 +#define M2351_CRYPTO_H_
14 +
15 +#define ENCRYPT 1
16 +#define DECRYPT 0
17 +
18 +static volatile int32_t g_AES_done;
19 +
20 +void CRPT_IRQHandler(void);
21 +void M2351_Crypto_Init(uint8_t, uint8_t);
22 +void M2351_Crypto_UseSessionKey(uint8_t );
23 +void M2351_Crypto_UseMasterKey(void);
24 +void M2351_Encrypt_Data(uint8_t, uint8_t *, uint8_t *, uint32_t);
25 +void M2351_Decrypt_Data(uint8_t, uint8_t *, uint8_t *, uint32_t);
26 +
27 +void M2351_FMC_Read_Key(uint32_t num, uint32_t len, char *priKey);
28 +void M2351_FMC_Write_Key(void);
29 +
30 +void M2351_ECC_GenerateKey(char *priKey, char *gKey1, char *gKey2);
31 +void M2351_SHA_Hash(uint8_t *msg, uint8_t *hash_msg);
32 +void M2351_ECDSA_GenerateSignature(uint8_t *msg, char *priKey, char* R, char *S);
33 +void M2351_ECDSA_VerificationSignature(char *hash_msg, char *pubKey1, char* pubKey2, char* R, char *S);
34 +
35 +
36 +#endif /* M2351_CRYPTO_H_ */
1 +#include "crypto_aes.h"
2 +#include "nsc.h"
3 +
4 +uint8_t cipheredSessionKey[16];
5 +uint8_t sessionIv[16];
6 +
7 +void CRPT_IRQHandler()
8 +{
9 + if(AES_GET_INT_FLAG(CRPT))
10 + {
11 + g_AES_done = 1;
12 + AES_CLR_INT_FLAG(CRPT);
13 + }
14 +}
15 +
16 +void M2351_Crypto_Init(uint8_t channel, uint8_t modeAES)
17 +{
18 + if(modeAES != ENCRYPT && modeAES != DECRYPT)
19 + printf("Error mode , mode must be ENCRYPT or DECRYPT value\n");
20 +
21 + NVIC_EnableIRQ(CRPT_IRQn);
22 + AES_ENABLE_INT(CRPT);
23 +
24 + AES_Open(CRPT, channel, modeAES, AES_MODE_CBC, AES_KEY_SIZE_128, AES_IN_OUT_SWAP);
25 +}
26 +
27 +void M2351_Crypto_UseMasterKey()
28 +{
29 +
30 + CRPT_T *crpt = CRPT;
31 + uint32_t u32Channel = 1;
32 +
33 + /* Load Key */
34 + uint32_t key_reg_addr;
35 + // 0x3CUL : channel size
36 + key_reg_addr = (uint32_t)&crpt->AES0_KEY[0] + (u32Channel * 0x3CUL);
37 +
38 + /* Enable FMC ISP function */
39 + FMC_Open();
40 +
41 + outpw(key_reg_addr, FMC_ReadUID(0));
42 + outpw(key_reg_addr+4UL, FMC_ReadUID(1));
43 + outpw(key_reg_addr+8UL, FMC_ReadUID(2));
44 + outpw(key_reg_addr+12UL, FMC_ReadUID(0));
45 +
46 + //printf("\nmasterKey = %08x%08x%08x%08x\n",FMC_ReadUID(0),FMC_ReadUID(1),FMC_ReadUID(2),FMC_ReadUID(0));
47 +
48 + /* Disable FMC ISP function */
49 + FMC_Close();
50 +
51 + //outpw(key_reg_addr, 0x2b7e1516);
52 + //outpw(key_reg_addr+4UL, 0x28aed2a6);
53 + //outpw(key_reg_addr+8UL, 0xabf71588);
54 + //outpw(key_reg_addr+12UL, 0x09cf4f3c);
55 +
56 + /* Load IV */
57 + uint32_t iv_reg_addr;
58 + iv_reg_addr = (uint32_t)&crpt->AES0_IV[0] + (u32Channel * 0x3CUL);
59 +
60 + outpw(iv_reg_addr, 0x00000000);
61 + outpw(iv_reg_addr+4UL, 0x00000000);
62 + outpw(iv_reg_addr+8UL, 0x00000000);
63 + outpw(iv_reg_addr+12UL, 0x00000000);
64 +
65 +}
66 +
67 +void M2351_Crypto_UseSessionKey(uint8_t channel)
68 +{
69 +
70 + uint8_t sessionKey[16] = {0};
71 +
72 + //printf("&cipheredSessionKey = %p\n", cipheredSessionKey);
73 + //printBlock(cipheredSessionKey);
74 +
75 + //M2351_Crypto_Init(1, DECRYPT);
76 + //M2351_Crypto_UseMasterKey();
77 + //if (DEMO)
78 + // printf("| Secure is running ... decrypt sessionKey |\n");
79 + //M2351_Decrypt_Data(1, cipheredSessionKey, sessionKey);
80 +
81 + //printf("&sessionKey = %p\n", sessionKey);
82 + //printBlock(sessionKey);
83 +
84 +
85 + if (DEMO)
86 + printf("| Secure is running ... Use sessionKey |\n");
87 + uint32_t tmp_sk[4];
88 + uint32_t tmp_si[4];
89 +
90 + for (uint8_t z = 0; z < 4; z++)
91 + {
92 + tmp_sk[z] = (sessionKey[0+(4*z)] << 24) | (sessionKey[1+(4*z)] << 16) | (sessionKey[2+(4*z)] << 8) | sessionKey[3+(4*z)];
93 + tmp_si[z] = (sessionIv[0+(4*z)] << 24) | (sessionIv[1+(4*z)] << 16) | (sessionIv[2+(4*z)] << 8) | sessionIv[3+(4*z)];
94 + }
95 + AES_SetKey(CRPT, channel, tmp_sk, AES_KEY_SIZE_128);
96 + AES_SetInitVect(CRPT, channel, tmp_si);
97 +
98 + /* Reset memory */
99 + for (uint8_t z = 0; z < 16; z++) sessionKey[z] = 0;
100 +
101 + for (uint8_t z = 0; z < 4; z++) {
102 + tmp_sk[z] = 0;
103 + tmp_si[z] = 0;
104 + }
105 +
106 +}
107 +
108 +/* Function M2351_encrypt_data is same as Nuvoton_M2351_decrypt_data */
109 +void M2351_Encrypt_Data(uint8_t channel, uint8_t InputData[], uint8_t OutputData[])
110 +{
111 +
112 + //printf("AES ECB encrypt start.\n");
113 +
114 + //printf("&inputData = %p\n",InputData);
115 + //printf("&outputData = %p\n",OutputData);
116 +
117 + AES_SetDMATransfer(CRPT, channel, (uint32_t)InputData, (uint32_t)OutputData, 16);
118 +/*
119 + printf("before start AES : \n"
120 + "CRPT->AES0_CNT : %d\n"
121 + "CRPT->AES0_DADDR : %d\n"
122 + "CRPT->AES0_IV : %d\n"
123 + "CRPT->AES0_KEY : %d\n"
124 + "CRPT->AES0_SADDR : %d\n", CRPT->AES0_CNT,CRPT->AES0_DADDR,CRPT->AES0_IV, CRPT->AES0_KEY, CRPT->AES0_SADDR);
125 +*/
126 +
127 + g_AES_done = 0;
128 + /* Start AES encrypt */
129 + AES_Start(CRPT, channel, CRYPTO_DMA_ONE_SHOT);
130 +
131 + /* Waiting for AES calculation */
132 + while(!g_AES_done);
133 +
134 + //printf("AES CBC encrypt done.\n");
135 +
136 +}
137 +
138 +/* Function M2351_decrypt_data is same as Nuvoton_M2351_encrypt_data */
139 +void M2351_Decrypt_Data(uint8_t channel, uint8_t InputData[], uint8_t OutputData[])
140 +{
141 +
142 + //printf("AES ECB decrypt start.\n");
143 + /*
144 + printf("&inputData = %p\n",InputData);
145 + printf("&outputData = %p\n",OutputData);
146 + */
147 +
148 + AES_SetDMATransfer(CRPT, channel, (uint32_t)InputData, (uint32_t)OutputData, 16);
149 +/*
150 + printf("before start AES : \n"
151 + "CRPT->AES0_CNT : %d\n"
152 + "CRPT->AES0_DADDR : %d\n"
153 + "CRPT->AES0_IV : %d\n"
154 + "CRPT->AES0_KEY : %d\n"
155 + "CRPT->AES0_SADDR : %d\n", CRPT->AES0_CNT,CRPT->AES0_DADDR,CRPT->AES0_IV, CRPT->AES0_KEY, CRPT->AES0_SADDR);
156 +*/
157 + g_AES_done = 0;
158 + /* Start AES decrypt */
159 + AES_Start(CRPT, channel, CRYPTO_DMA_ONE_SHOT);
160 + /* Waiting for AES calculation */
161 + while(!g_AES_done);
162 +
163 + //printf("AES CBC decrypt done.\n");
164 +
165 +}
1 +#include <stdio.h>
2 +#include <string.h>
3 +#include "NuMicro.h"
4 +
5 +#ifndef CRYPTO_AES_H_
6 +#define CRYPTO_AES_H_
7 +
8 +#define ENCRYPT 1
9 +#define DECRYPT 0
10 +
11 +static volatile int32_t g_AES_done;
12 +
13 +void CRPT_IRQHandler(void);
14 +void M2351_Crypto_Init(uint8_t, uint8_t);
15 +void M2351_Crypto_UseSessionKey(uint8_t );
16 +void M2351_Crypto_UseMasterKey(void);
17 +void M2351_Encrypt_Data(uint8_t, uint8_t *, uint8_t *);
18 +void M2351_Decrypt_Data(uint8_t, uint8_t *, uint8_t *);
19 +
20 +#endif /* CRYPTO_AES_H_ */
1 +<?xml version="1.0" encoding="utf-8"?>
2 +
3 +<component_viewer schemaVersion="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="Component_Viewer.xsd">
4 +
5 +<component name="EventRecorderStub" version="1.0.0"/> <!--name and version of the component-->
6 + <events>
7 + </events>
8 +
9 +</component_viewer>
1 +///*************************************************************************
2 +// * @file MAX30102.c
3 +// * @brief
4 +// * MAX30102 driver header file
5 +// *
6 +// * @note
7 +// ********************************************************************** **/
8 +
9 +
10 +/*
11 + Optical Heart Rate Detection (PBA Algorithm)
12 + By: Nathan Seidle
13 + SparkFun Electronics
14 + Date: October 2nd, 2016
15 +
16 + Given a series of IR samples from the MAX30105 we discern when a heart beat is occurring
17 +
18 + Let's have a brief chat about what this code does. We're going to try to detect
19 + heart-rate optically. This is tricky and prone to give false readings. We really don't
20 + want to get anyone hurt so use this code only as an example of how to process optical
21 + data. Build fun stuff with our MAX30105 breakout board but don't use it for actual
22 + medical diagnosis.
23 +
24 + Excellent background on optical heart rate detection:
25 + http://www.ti.com/lit/an/slaa655/slaa655.pdf
26 +
27 + Good reading:
28 + http://www.techforfuture.nl/fjc_documents/mitrabaratchi-measuringheartratewithopticalsensor.pdf
29 + https://fruct.org/publications/fruct13/files/Lau.pdf
30 +
31 + This is an implementation of Maxim's PBA (Penpheral Beat Amplitude) algorithm. It's been
32 + converted to work within the Arduino framework.
33 +*/
34 +
35 +/* Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
36 +*
37 +* Permission is hereby granted, free of charge, to any person obtaining a
38 +* copy of this software and associated documentation files (the "Software"),
39 +* to deal in the Software without restriction, including without limitation
40 +* the rights to use, copy, modify, merge, publish, distribute, sublicense,
41 +* and/or sell copies of the Software, and to permit persons to whom the
42 +* Software is furnished to do so, subject to the following conditions:
43 +*
44 +* The above copyright notice and this permission notice shall be included
45 +* in all copies or substantial portions of the Software.
46 +*
47 +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
48 +* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
49 +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
50 +* IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
51 +* OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
52 +* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
53 +* OTHER DEALINGS IN THE SOFTWARE.
54 +*
55 +* Except as contained in this notice, the name of Maxim Integrated
56 +* Products, Inc. shall not be used except as stated in the Maxim Integrated
57 +* Products, Inc. Branding Policy.
58 +*
59 +* The mere transfer of this software does not imply any licenses
60 +* of trade secrets, proprietary technology, copyrights, patents,
61 +* trademarks, maskwork rights, or any other form of intellectual
62 +* property whatsoever. Maxim Integrated Products, Inc. retains all
63 +* ownership rights.
64 +*
65 +*/
66 +
67 +
68 +#include "NuMicro.h"
69 +#include "MAX30102.h"
70 +
71 +
72 +// Data buffer
73 +uint8_t au8RDataBuf[6];
74 +
75 +// Raw HR & SPo2 data from MAX30102 DATA FIFO
76 +volatile int32_t hr_val;
77 +volatile int32_t spo2_val;
78 +
79 +extern volatile uint32_t millis_counter;
80 +//extern uint32_t GetMillis();
81 +extern uint32_t OLED_printTime;
82 +
83 +int16_t IR_AC_Max = 20;
84 +int16_t IR_AC_Min = -20;
85 +
86 +int16_t IR_AC_Signal_Current = 0;
87 +int16_t IR_AC_Signal_Previous;
88 +int16_t IR_AC_Signal_min = 0;
89 +int16_t IR_AC_Signal_max = 0;
90 +int16_t IR_Average_Estimated;
91 +
92 +int16_t positiveEdge = 0;
93 +int16_t negativeEdge = 0;
94 +int32_t ir_avg_reg = 0;
95 +
96 +int16_t cbuf[32];
97 +uint8_t offset = 0;
98 +
99 +static const uint16_t FIRCoeffs[12] = {172, 321, 579, 927, 1360, 1858, 2390, 2916, 3391, 3768, 4012, 4096};
100 +
101 +const int32_t RATE_SIZE = 4; //Increase this for more averaging. 4 is good.
102 +int32_t rates[RATE_SIZE]; //Array of heart rates
103 +int32_t rateSpot = 0;
104 +long lastBeat = 0; //Time at which the last beat occurred
105 +
106 +float beatsPerMinute;
107 +int beatAvg;
108 +
109 +
110 +
111 +/*
112 + Configuration MAX30102 by write data to a MAX30102 and check return value
113 +*/
114 +void MAX30102_Config()
115 +{
116 + uint8_t ret = 2;
117 +
118 + printf("+---------------------------------------------+\n");
119 + printf("| Configuration MAX30102 in SECURE |\n");
120 + printf("+---------------------------------------------+\n");
121 +
122 +
123 + /* FIFO Config
124 + Sample_AVG 4, FIFO_ROLLOVER_EN
125 + 1*/
126 + ret = I2C_WriteByteOneReg(I2C0, MAX30102_ADDR, MAX30102_FIFO_CONFIG, 0x50);
127 + printf("| [1] MAX30102_FIFO_CONFIG ..... |\n");
128 +
129 + /* Mode Config
130 + Mode conrtol, Active LED Channels : Multi-LED Mode
131 + */
132 + ret = I2C_WriteByteOneReg(I2C0, MAX30102_ADDR, MAX30102_MODE_CONFIG, 0x07);
133 + printf("| [2] MAX30102_MODE_CONFIG ..... |\n");
134 +
135 + /* SpO2 Config
136 + SPO2 ADC range control(4096), SPO2 sample rate 400/1s,
137 + LED pulse width = 411, ADC Resolution = 18bit
138 + 0b00101111
139 + */
140 + ret = I2C_WriteByteOneReg(I2C0, MAX30102_ADDR, MAX30102_SPO2_CONFIG, 0x2F);
141 + printf("| [3] MAX30102_SPO2_CONFIG ..... |\n");
142 +
143 + /* LED Pulse Amplitude
144 + Typical LED1(RED) current : 2.0mA
145 + Typical LED2(IR) current : 6.2mA
146 + */
147 + ret = I2C_WriteByteOneReg(I2C0, MAX30102_ADDR, MAX30102_LED1_AMP, 0x0A);
148 + printf("| [4] MAX30102_LED1_AMP ..... |\n");
149 +
150 + ret = I2C_WriteByteOneReg(I2C0, MAX30102_ADDR, MAX30102_LED2_AMP, 0x1F);
151 + printf("| [5] MAX30102_LED2_AMP ..... |\n");
152 +
153 + /* Multi-LED Mode Control Registers
154 + Slot1 : LED1(RED), Slot2 : LED2(IR)
155 + */
156 + ret = I2C_WriteByteOneReg(I2C0, MAX30102_ADDR, MAX31012_MLED_CTRL1, 0x21);
157 + printf("| [6] MAX31012_MLED_CTRL1 ..... |\n");
158 +
159 + //ret = I2C_WriteByteOneReg(I2C0, MAX30102_ADDR, MAX31012_MLED_CTRL2, 0x00);
160 + //printf("| [5]MAX31012_MLED_CTRL2 --- ret %d |\n", ret);
161 +
162 +
163 + if (ret)
164 + printf("| MAX31012 Configuration Error! |\n");
165 +
166 + printf("+---------------------------------------------+\n");
167 +
168 +}
169 +
170 +
171 +
172 +// Heart Rate Monitor functions takes a sample value and the sample number
173 +// Returns true if a beat is detected
174 +// A running average of four samples is recommended for display on the screen.
175 +int checkForBeat(int32_t sample)
176 +{
177 + int beatDetected = 0;
178 +
179 + // Save current state
180 + IR_AC_Signal_Previous = IR_AC_Signal_Current;
181 +
182 + //This is good to view for debugging
183 + //Serial.print("Signal_Current: ");
184 + //Serial.println(IR_AC_Signal_Current);
185 +
186 + // Process next data sample
187 + IR_Average_Estimated = averageDCEstimator(&ir_avg_reg, sample);
188 + IR_AC_Signal_Current = lowPassFIRFilter(sample - IR_Average_Estimated);
189 +
190 + //printf("\n\t\t\t\t\t\t IR_AC_Signal_Previous(%d), IR_AC_Signal_Current(%d)\n", IR_AC_Signal_Previous , IR_AC_Signal_Current);
191 + // Detect positive zero crossing (rising edge)
192 + if ((IR_AC_Signal_Previous < 0) & (IR_AC_Signal_Current >= 0))
193 + {
194 +
195 + IR_AC_Max = IR_AC_Signal_max; //Adjust our AC max and min
196 + IR_AC_Min = IR_AC_Signal_min;
197 +
198 + positiveEdge = 1;
199 + negativeEdge = 0;
200 + IR_AC_Signal_max = 0;
201 +
202 +
203 + //printf("\n\t\t\t\t\t\tIR_AC_Max(%d) - IR_AC_Min(%d) : %d --------------------------------------------------------\n", IR_AC_Max, IR_AC_Max, IR_AC_Min - IR_AC_Min);
204 + //if ((IR_AC_Max - IR_AC_Min) > 20 & (IR_AC_Max - IR_AC_Min) < 1000)
205 + if ((IR_AC_Max - IR_AC_Min) > 20 & (IR_AC_Max - IR_AC_Min) < 1000)
206 + {
207 + //Heart beat!!!
208 + beatDetected = 1;
209 + }
210 + }
211 +
212 + // Detect negative zero crossing (falling edge)
213 + if ((IR_AC_Signal_Previous > 0) & (IR_AC_Signal_Current <= 0))
214 + {
215 + positiveEdge = 0;
216 + negativeEdge = 1;
217 + IR_AC_Signal_min = 0;
218 + }
219 +
220 + // Find Maximum value in positive cycle
221 + if (positiveEdge & (IR_AC_Signal_Current > IR_AC_Signal_Previous))
222 + {
223 + IR_AC_Signal_max = IR_AC_Signal_Current;
224 + }
225 +
226 + // Find Minimum value in negative cycle
227 + if (negativeEdge & (IR_AC_Signal_Current < IR_AC_Signal_Previous))
228 + {
229 + IR_AC_Signal_min = IR_AC_Signal_Current;
230 + }
231 +
232 + return(beatDetected);
233 +}
234 +
235 +// Average DC Estimator
236 +int16_t averageDCEstimator(int32_t *p, uint16_t x)
237 +{
238 + *p += ((((long) x << 15) - *p) >> 4);
239 + return (*p >> 15);
240 +}
241 +
242 +// Low Pass FIR Filter
243 +int16_t lowPassFIRFilter(int16_t din)
244 +{
245 + cbuf[offset] = din;
246 +
247 + int32_t z = mul16(FIRCoeffs[11], cbuf[(offset - 11) & 0x1F]);
248 +
249 + for (uint8_t i = 0 ; i < 11 ; i++)
250 + {
251 + z += mul16(FIRCoeffs[i], cbuf[(offset - i) & 0x1F] + cbuf[(offset - 22 + i) & 0x1F]);
252 + }
253 +
254 + offset++;
255 + offset %= 32; //Wrap condition
256 +
257 + return(z >> 15);
258 +}
259 +
260 +// Integer multiplier
261 +int32_t mul16(int16_t x, int16_t y)
262 +{
263 + return((long)x * (long)y);
264 +}
265 +
266 +
267 +/* Get FIFO from MAX30102 */
268 +void MAX30102_GetFIFO()
269 +{
270 +
271 + I2C_ReadMultiBytesOneReg(I2C0, MAX30102_ADDR, MAX30102_FIFO_DATA, au8RDataBuf, 6);
272 + hr_val = (au8RDataBuf[0]<<16)|(au8RDataBuf[1]<<8)|au8RDataBuf[2]; //RED LED
273 + spo2_val = (au8RDataBuf[3]<<16)|(au8RDataBuf[4]<<8)|au8RDataBuf[5]; //IR LED(pulse oximetry)
274 +
275 + //printf("\n+---------------------------------------------+\n");
276 + //printf("HR_val : %#08x(%d)\t \n", hr_val, hr_val);
277 + //printf("HR_val : %#08x(%d),\t Spo2_val : %#08x(%d) \r\n", hr_val, hr_val, spo2_val, spo2_val);
278 + //printf("+---------------------------------------------+\n");
279 + //CLK_SysTickDelay(300000); //300000us = 300ms = 0.3s
280 +
281 +}
282 +
283 +
284 +uint32_t MAX30102_ComputeBPM()
285 +{
286 + int i;
287 + long irValue;
288 + long delta;
289 +
290 + MAX30102_GetFIFO();
291 + irValue = (long)spo2_val;
292 +
293 + if (checkForBeat(irValue) == 1)
294 + {
295 + //printf("\nWe sensed a beat!\n");
296 + //printf("\nmillis = %d\t delta = %ld\n", millis_counter, delta);
297 +
298 + delta = (millis_counter - lastBeat) - OLED_printTime;
299 + lastBeat = millis_counter;
300 +
301 + beatsPerMinute = 60 / (delta / 1000.0);
302 +
303 + if (beatsPerMinute < 150 && beatsPerMinute > 20)
304 + {
305 + rates[rateSpot++] = (int)beatsPerMinute; //Store this reading in the array
306 + rateSpot %= RATE_SIZE; //Wrap variable
307 +
308 + //Take average of readings
309 + beatAvg = 0;
310 + for (i = 0 ; i < RATE_SIZE ; i++)
311 + beatAvg += rates[i];
312 + beatAvg /= RATE_SIZE;
313 + }
314 + }
315 +
316 + printf("\nIR = %ld\t", irValue);
317 + printf("BPM = %f\t", beatsPerMinute);
318 + printf("Avg BPM = %d\t", beatAvg);
319 +
320 + if (irValue < 50000)
321 + {
322 + printf("[No Finger]");
323 + return 0;
324 + }
325 + return 1;
326 +
327 +}
328 +
329 +
1 +/**********************************************************
2 + *
3 + * @file : MAX30102.h
4 + * @author : HaewonSeo
5 + *
6 + * @note : MAX30102-Heart-Rate Sensor
7 + **********************************************************/
8 +
9 +#ifndef __I2C_MAX30102_H__
10 +#define __I2C_MAX30102_H__
11 +
12 +#include <stdio.h>
13 +#include "M2351.h"
14 +
15 +/* MAX30102 I2C-ADDRESS */
16 +#define MAX30102_ADDR 0x57 // 8bit address converted to 7bit
17 +
18 +/* MAX30102 Register Map */
19 +#define MAX30102_INT_STATUS1 0x00 // Which interrupts are tripped
20 +#define MAX30102_INT_STATUS2 0x01 // Which interrupts are tripped
21 +#define MAX30102_INT_ENABLE1 0x02 // Which interrupts are active
22 +#define MAX30102_INT_ENABLE2 0x03 // Which interrupts are active
23 +
24 +#define MAX30102_FIFO_WR_PTR 0x04 // Where data is being written
25 +#define MAX30102_OVRFLOW_CTR 0x05 // Number of lost samples
26 +#define MAX30102_FIFO_RD_PTR 0x06 // Where to read from
27 +#define MAX30102_FIFO_DATA 0x07 // Ouput data buffer
28 +
29 +#define MAX30102_FIFO_CONFIG 0x08
30 +#define MAX30102_MODE_CONFIG 0x09 // Control register
31 +#define MAX30102_SPO2_CONFIG 0x0A // Oximetry settings
32 +#define MAX30102_LED1_AMP 0x0C
33 +#define MAX30102_LED2_AMP 0x0D
34 +#define MAX30102_PILOT 0x10
35 +#define MAX31012_MLED_CTRL1 0x11
36 +#define MAX31012_MLED_CTRL2 0x12
37 +#define MAX30102_TEMP_INTG 0x1F // Temperature value, whole number
38 +#define MAX30102_TEMP_FRAC 0x20 // Temperature value, fraction
39 +#define MAX30102_DIE_TEMP 0x21
40 +#define MAX30102_PROX_INT_TRESH 0x30
41 +#define MAX30102_REV_ID 0xFE // Part revision
42 +#define MAX30102_PART_ID 0xFF // Part ID, normally 0x11
43 +
44 +
45 +//void Get_Data_From_MAX30102();
46 +void MAX30102_Config();
47 +
48 +int checkForBeat(int32_t sample);
49 +int16_t averageDCEstimator(int32_t *p, uint16_t x);
50 +int16_t lowPassFIRFilter(int16_t din);
51 +int32_t mul16(int16_t x, int16_t y);
52 +
53 +void MAX30102_GetFIFO();
54 +uint32_t MAX30102_ComputeBPM();
55 +
56 +
57 +
58 +//extern void I2C1_Init(void);
59 +//extern int32_t I2C0_Read_Write_SLAVE(uint8_t u8SlvAddr);
60 +//extern int32_t I2C0_Read(uint8_t u8SlvAddr, uint8_t u8Reg, uint8_t u8Byte);
61 +
62 +#endif //__I2C_MAX30102_H__
63 +
64 +/*** (C) COPYRIGHT 2019 Nuvoton Technology Corp. ***/
1 +[Version]
2 +Nu_LinkVersion=V5.15
3 +[Process]
4 +ProcessID=0x000079c8
5 +ProcessCreationTime_L=0xab44af4b
6 +ProcessCreationTime_H=0x01d75ed7
7 +NuLinkID=0x180016bb
8 +NuLinkIDs_Count=0x00000001
9 +NuLinkID0=0x180016bb
10 +[ChipSelect]
11 +;ChipName=<NUC1xx|NUC2xx|M05x|N571|N572|Nano100|N512|Mini51|NUC505|General>
12 +ChipName=M2351
13 +[NUC505]
14 +Connect=0
15 +Reset=Autodetect
16 +MaxClock=1MHz
17 +MemoryVerify=0
18 +IOVoltage=3300
19 +Erase=1
20 +Program=1
21 +Verify=1
22 +ResetAndRun=0
23 +EnableFlashBreakpoint=0
24 +EnableLog=0
25 +MemAccessWhileRun=0
26 +RAMForAlgorithmStart=0x20000000
27 +RAMForAlgorithmSize=0x4000
28 +ProgramAlgorithm=NUC505_SPIFLASH.FLM
29 +[NUC4xx]
30 +Connect=0
31 +Reset=Autodetect
32 +MaxClock=1MHz
33 +MemoryVerify=0
34 +IOVoltage=3300
35 +FlashSelect=APROM
36 +Erase=1
37 +Program=1
38 +Verify=1
39 +ResetAndRun=0
40 +EnableFlashBreakpoint=1
41 +EnableLog=0
42 +MemAccessWhileRun=0
43 +RAMForAlgorithmStart=0x20000000
44 +RAMForAlgorithmSize=0x4000
45 +ProgramAlgorithm=NUC400_AP_512.FLM
46 +TraceConf0=0x00000002
47 +TraceConf1=0x014fb180
48 +TraceConf2=0x00000800
49 +TraceConf3=0x00000000
50 +TraceConf4=0x00000001
51 +TraceConf5=0x00000000
52 +[NUC2xx]
53 +Connect=0
54 +Reset=Autodetect
55 +MaxClock=1MHz
56 +MemoryVerify=0
57 +IOVoltage=3300
58 +FlashSelect=APROM
59 +Erase=1
60 +Program=1
61 +Verify=1
62 +ResetAndRun=0
63 +EnableFlashBreakpoint=1
64 +EnableLog=0
65 +MemAccessWhileRun=0
66 +RAMForAlgorithmStart=0x20000000
67 +RAMForAlgorithmSize=0x1000
68 +ProgramAlgorithm=NUC200_AP_128.FLM
69 +[NUC1311]
70 +Connect=0
71 +Reset=Autodetect
72 +MaxClock=1MHz
73 +MemoryVerify=0
74 +IOVoltage=3300
75 +FlashSelect=APROM
76 +Erase=1
77 +Program=1
78 +Verify=1
79 +ResetAndRun=0
80 +EnableFlashBreakpoint=1
81 +EnableLog=0
82 +MemAccessWhileRun=0
83 +RAMForAlgorithmStart=0x20000000
84 +RAMForAlgorithmSize=0x1000
85 +ProgramAlgorithm=NUC1311_AP_64.FLM
86 +[NUC126]
87 +Connect=0
88 +Reset=Autodetect
89 +MaxClock=1MHz
90 +MemoryVerify=0
91 +IOVoltage=3300
92 +FlashSelect=APROM
93 +Erase=1
94 +Program=1
95 +Verify=1
96 +ResetAndRun=0
97 +EnableFlashBreakpoint=1
98 +EnableLog=0
99 +MemAccessWhileRun=0
100 +RAMForAlgorithmStart=0x20000000
101 +RAMForAlgorithmSize=0x2000
102 +ProgramAlgorithm=NUC126_AP_256.FLM
103 +[NUC121]
104 +Connect=0
105 +Reset=Autodetect
106 +MaxClock=1MHz
107 +MemoryVerify=0
108 +IOVoltage=3300
109 +FlashSelect=APROM
110 +Erase=1
111 +Program=1
112 +Verify=1
113 +ResetAndRun=0
114 +EnableFlashBreakpoint=1
115 +EnableLog=0
116 +MemAccessWhileRun=0
117 +RAMForAlgorithmStart=0x20000000
118 +RAMForAlgorithmSize=0x1000
119 +ProgramAlgorithm=NUC121_AP_32.FLM
120 +[NUC1xx]
121 +Connect=0
122 +Reset=Autodetect
123 +MaxClock=1MHz
124 +MemoryVerify=0
125 +IOVoltage=3300
126 +FlashSelect=APROM
127 +Erase=1
128 +Program=1
129 +Verify=1
130 +ResetAndRun=0
131 +EnableFlashBreakpoint=1
132 +EnableLog=0
133 +MemAccessWhileRun=0
134 +RAMForAlgorithmStart=0x20000000
135 +RAMForAlgorithmSize=0x1000
136 +ProgramAlgorithm=NUC100_AP_128.FLM
137 +[NUC029]
138 +Connect=0
139 +Reset=Autodetect
140 +MaxClock=1MHz
141 +MemoryVerify=0
142 +IOVoltage=3300
143 +FlashSelect=APROM
144 +Erase=1
145 +Program=1
146 +Verify=1
147 +ResetAndRun=0
148 +EnableFlashBreakpoint=1
149 +EnableLog=0
150 +MemAccessWhileRun=0
151 +RAMForAlgorithmStart=0x20000000
152 +RAMForAlgorithmSize=0x800
153 +ProgramAlgorithm=NUC029_AP_16.FLM
154 +[NM1820]
155 +Connect=0
156 +Reset=Autodetect
157 +MaxClock=1MHz
158 +MemoryVerify=0
159 +IOVoltage=3300
160 +FlashSelect=APROM
161 +Erase=1
162 +Program=1
163 +Verify=1
164 +ResetAndRun=0
165 +EnableFlashBreakpoint=1
166 +EnableLog=0
167 +MemAccessWhileRun=0
168 +RAMForAlgorithmStart=0x20000000
169 +RAMForAlgorithmSize=0x800
170 +ProgramAlgorithm=NM1820_AP_17_5.FLM
171 +[NM1810]
172 +Connect=0
173 +Reset=Autodetect
174 +MaxClock=1MHz
175 +MemoryVerify=0
176 +IOVoltage=3300
177 +FlashSelect=APROM
178 +Erase=1
179 +Program=1
180 +Verify=1
181 +ResetAndRun=0
182 +EnableFlashBreakpoint=1
183 +EnableLog=0
184 +MemAccessWhileRun=0
185 +RAMForAlgorithmStart=0x20000000
186 +RAMForAlgorithmSize=0x800
187 +ProgramAlgorithm=NM1810_AP_29_5.FLM
188 +[NM1500]
189 +Connect=0
190 +Reset=Autodetect
191 +MaxClock=1MHz
192 +MemoryVerify=0
193 +IOVoltage=3300
194 +FlashSelect=APROM
195 +Erase=1
196 +Program=1
197 +Verify=1
198 +ResetAndRun=0
199 +EnableFlashBreakpoint=1
200 +EnableLog=0
201 +MemAccessWhileRun=0
202 +RAMForAlgorithmStart=0x20000000
203 +RAMForAlgorithmSize=0x1000
204 +ProgramAlgorithm=NM1500_AP_128.FLM
205 +[NM1330]
206 +Connect=0
207 +Reset=Autodetect
208 +MaxClock=1MHz
209 +MemoryVerify=0
210 +IOVoltage=3300
211 +FlashSelect=APROM
212 +Erase=1
213 +Program=1
214 +Verify=1
215 +ResetAndRun=0
216 +EnableFlashBreakpoint=1
217 +EnableLog=0
218 +MemAccessWhileRun=0
219 +RAMForAlgorithmStart=0x20000000
220 +RAMForAlgorithmSize=0x1000
221 +ProgramAlgorithm=NM1330_AP_64.FLM
222 +[NM1320]
223 +Connect=0
224 +Reset=Autodetect
225 +MaxClock=1MHz
226 +MemoryVerify=0
227 +IOVoltage=3300
228 +FlashSelect=APROM
229 +Erase=1
230 +Program=1
231 +Verify=1
232 +ResetAndRun=0
233 +EnableFlashBreakpoint=1
234 +EnableLog=0
235 +MemAccessWhileRun=0
236 +RAMForAlgorithmStart=0x20000000
237 +RAMForAlgorithmSize=0x1000
238 +ProgramAlgorithm=NM1320_AP_32.FLM
239 +[NM1240]
240 +Connect=0
241 +Reset=Autodetect
242 +MaxClock=1MHz
243 +MemoryVerify=0
244 +IOVoltage=3300
245 +FlashSelect=APROM
246 +Erase=1
247 +Program=1
248 +Verify=1
249 +ResetAndRun=0
250 +EnableFlashBreakpoint=1
251 +EnableLog=0
252 +MemAccessWhileRun=0
253 +RAMForAlgorithmStart=0x20000000
254 +RAMForAlgorithmSize=0x1000
255 +ProgramAlgorithm=NM1240_AP_64.FLM
256 +[NM1230]
257 +Connect=0
258 +Reset=Autodetect
259 +MaxClock=1MHz
260 +MemoryVerify=0
261 +IOVoltage=3300
262 +FlashSelect=APROM
263 +Erase=1
264 +Program=1
265 +Verify=1
266 +ResetAndRun=0
267 +EnableFlashBreakpoint=1
268 +EnableLog=0
269 +MemAccessWhileRun=0
270 +RAMForAlgorithmStart=0x20000000
271 +RAMForAlgorithmSize=0x1000
272 +ProgramAlgorithm=NM1230_AP_64.FLM
273 +[NM1200]
274 +Connect=0
275 +Reset=Autodetect
276 +MaxClock=1MHz
277 +MemoryVerify=0
278 +IOVoltage=3300
279 +FlashSelect=APROM
280 +Erase=1
281 +Program=1
282 +Verify=1
283 +ResetAndRun=0
284 +EnableFlashBreakpoint=1
285 +EnableLog=0
286 +MemAccessWhileRun=0
287 +RAMForAlgorithmStart=0x20000000
288 +RAMForAlgorithmSize=0x800
289 +ProgramAlgorithm=NM1200_AP_8.FLM
290 +[NM1120]
291 +Connect=0
292 +Reset=Autodetect
293 +MaxClock=1MHz
294 +MemoryVerify=0
295 +IOVoltage=3300
296 +FlashSelect=APROM
297 +Erase=1
298 +Program=1
299 +Verify=1
300 +ResetAndRun=0
301 +EnableFlashBreakpoint=1
302 +EnableLog=0
303 +MemAccessWhileRun=0
304 +RAMForAlgorithmStart=0x20000000
305 +RAMForAlgorithmSize=0x800
306 +ProgramAlgorithm=NM1120_AP_29_5.FLM
307 +[TF5100]
308 +Connect=0
309 +Reset=Autodetect
310 +MaxClock=1MHz
311 +MemoryVerify=0
312 +IOVoltage=3300
313 +FlashSelect=APROM
314 +Erase=1
315 +Program=1
316 +Verify=1
317 +ResetAndRun=0
318 +EnableFlashBreakpoint=1
319 +EnableLog=0
320 +MemAccessWhileRun=0
321 +RAMForAlgorithmStart=0x20000000
322 +RAMForAlgorithmSize=0x1000
323 +ProgramAlgorithm=TF5100_AP_64.FLM
324 +[NDA102]
325 +Connect=0
326 +Reset=Autodetect
327 +MaxClock=1MHz
328 +MemoryVerify=0
329 +IOVoltage=3300
330 +FlashSelect=APROM
331 +Erase=1
332 +Program=1
333 +Verify=1
334 +ResetAndRun=0
335 +EnableFlashBreakpoint=1
336 +EnableLog=0
337 +MemAccessWhileRun=0
338 +RAMForAlgorithmStart=0x20000000
339 +RAMForAlgorithmSize=0x800
340 +ProgramAlgorithm=NDA102_AP_29_5.FLM
341 +[Nano103]
342 +Connect=0
343 +Reset=Autodetect
344 +MaxClock=1MHz
345 +MemoryVerify=0
346 +IOVoltage=3300
347 +FlashSelect=APROM
348 +Erase=1
349 +Program=1
350 +Verify=1
351 +ResetAndRun=0
352 +EnableFlashBreakpoint=1
353 +EnableLog=0
354 +MemAccessWhileRun=0
355 +RAMForAlgorithmStart=0x20000000
356 +RAMForAlgorithmSize=0x1000
357 +ProgramAlgorithm=Nano103_AP_64.FLM
358 +[Nano100]
359 +Connect=0
360 +Reset=Autodetect
361 +MaxClock=1MHz
362 +MemoryVerify=0
363 +IOVoltage=3300
364 +FlashSelect=APROM
365 +Erase=1
366 +Program=1
367 +Verify=1
368 +ResetAndRun=0
369 +EnableFlashBreakpoint=1
370 +EnableLog=0
371 +MemAccessWhileRun=0
372 +RAMForAlgorithmStart=0x20000000
373 +RAMForAlgorithmSize=0x1000
374 +ProgramAlgorithm=Nano100_AP_64.FLM
375 +[N576]
376 +Connect=0
377 +Reset=Autodetect
378 +MaxClock=1MHz
379 +MemoryVerify=0
380 +IOVoltage=3300
381 +FlashSelect=APROM
382 +Erase=1
383 +Program=1
384 +Verify=1
385 +ResetAndRun=0
386 +EnableFlashBreakpoint=0
387 +EnableLog=0
388 +MemAccessWhileRun=0
389 +RAMForAlgorithmStart=0x20000000
390 +RAMForAlgorithmSize=0x1000
391 +ProgramAlgorithm=N576_AP_145.FLM
392 +[N575]
393 +Connect=0
394 +Reset=Autodetect
395 +MaxClock=1MHz
396 +MemoryVerify=0
397 +IOVoltage=3300
398 +FlashSelect=APROM
399 +Erase=1
400 +Program=1
401 +Verify=1
402 +ResetAndRun=0
403 +EnableFlashBreakpoint=0
404 +EnableLog=0
405 +MemAccessWhileRun=0
406 +RAMForAlgorithmStart=0x20000000
407 +RAMForAlgorithmSize=0x1000
408 +ProgramAlgorithm=N575_AP_145.FLM
409 +[N572]
410 +Connect=0
411 +Reset=Autodetect
412 +MaxClock=1MHz
413 +MemoryVerify=0
414 +IOVoltage=3300
415 +Erase=1
416 +Program=1
417 +Verify=1
418 +ResetAndRun=0
419 +EnableFlashBreakpoint=1
420 +EnableLog=0
421 +MemAccessWhileRun=0
422 +RAMForAlgorithmStart=0x20000000
423 +RAMForAlgorithmSize=0x2000
424 +ProgramAlgorithm=N572Fxxx.FLM
425 +[N571]
426 +Connect=0
427 +Reset=Autodetect
428 +MaxClock=1MHz
429 +MemoryVerify=0
430 +IOVoltage=3300
431 +Erase=1
432 +Program=1
433 +Verify=1
434 +ResetAndRun=0
435 +EnableFlashBreakpoint=1
436 +EnableLog=0
437 +MemAccessWhileRun=0
438 +RAMForAlgorithmStart=0x20000000
439 +RAMForAlgorithmSize=0x2000
440 +ProgramAlgorithm=N571E000.FLM
441 +[N570]
442 +Connect=0
443 +Reset=Autodetect
444 +MaxClock=1MHz
445 +MemoryVerify=0
446 +IOVoltage=3300
447 +FlashSelect=APROM
448 +Erase=1
449 +Program=1
450 +Verify=1
451 +ResetAndRun=0
452 +EnableFlashBreakpoint=0
453 +EnableLog=0
454 +MemAccessWhileRun=0
455 +RAMForAlgorithmStart=0x20000000
456 +RAMForAlgorithmSize=0x1000
457 +ProgramAlgorithm=N570_AP_64.FLM
458 +[N569]
459 +Connect=0
460 +Reset=Autodetect
461 +MaxClock=1MHz
462 +MemoryVerify=0
463 +IOVoltage=3300
464 +FlashSelect=APROM
465 +Erase=1
466 +Program=1
467 +Verify=1
468 +ResetAndRun=0
469 +EnableFlashBreakpoint=0
470 +EnableLog=0
471 +MemAccessWhileRun=0
472 +RAMForAlgorithmStart=0x20000000
473 +RAMForAlgorithmSize=0x1000
474 +ProgramAlgorithm=N569_AP_64.FLM
475 +[N512]
476 +Connect=0
477 +Reset=Autodetect
478 +MaxClock=1MHz
479 +MemoryVerify=0
480 +IOVoltage=3300
481 +FlashSelect=APROM
482 +Erase=1
483 +Program=1
484 +Verify=1
485 +ResetAndRun=0
486 +EnableFlashBreakpoint=1
487 +EnableLog=0
488 +MemAccessWhileRun=0
489 +RAMForAlgorithmStart=0x20000000
490 +RAMForAlgorithmSize=0x1000
491 +ProgramAlgorithm=N512_AP_64.FLM
492 +[Mini57]
493 +Connect=0
494 +Reset=Autodetect
495 +MaxClock=1MHz
496 +MemoryVerify=0
497 +IOVoltage=3300
498 +FlashSelect=APROM
499 +Erase=1
500 +Program=1
501 +Verify=1
502 +ResetAndRun=0
503 +EnableFlashBreakpoint=1
504 +EnableLog=0
505 +MemAccessWhileRun=0
506 +RAMForAlgorithmStart=0x20000000
507 +RAMForAlgorithmSize=0x800
508 +ProgramAlgorithm=Mini57_AP_29_5.FLM
509 +[Mini51]
510 +Connect=0
511 +Reset=Autodetect
512 +MaxClock=1MHz
513 +MemoryVerify=0
514 +IOVoltage=3300
515 +FlashSelect=APROM
516 +Erase=1
517 +Program=1
518 +Verify=1
519 +ResetAndRun=0
520 +EnableFlashBreakpoint=1
521 +EnableLog=0
522 +MemAccessWhileRun=0
523 +RAMForAlgorithmStart=0x20000000
524 +RAMForAlgorithmSize=0x800
525 +ProgramAlgorithm=Mini51_AP_16.FLM
526 +[M481]
527 +Connect=0
528 +Reset=Autodetect
529 +MaxClock=1MHz
530 +MemoryVerify=0
531 +IOVoltage=3300
532 +FlashSelect=APROM
533 +Erase=1
534 +Program=1
535 +Verify=1
536 +ResetAndRun=0
537 +EnableFlashBreakpoint=1
538 +EnableLog=0
539 +MemAccessWhileRun=0
540 +RAMForAlgorithmStart=0x20000000
541 +RAMForAlgorithmSize=0x4000
542 +ProgramAlgorithm=M481_AP_512.FLM
543 +TraceConf0=0x00000002
544 +TraceConf1=0x00b71b00
545 +TraceConf2=0x00000800
546 +TraceConf3=0x00000000
547 +TraceConf4=0x00000001
548 +TraceConf5=0x00000000
549 +[M480LD]
550 +Connect=0
551 +Reset=Autodetect
552 +MaxClock=1MHz
553 +MemoryVerify=0
554 +IOVoltage=3300
555 +FlashSelect=APROM
556 +Erase=1
557 +Program=1
558 +Verify=1
559 +ResetAndRun=0
560 +EnableFlashBreakpoint=1
561 +EnableLog=0
562 +MemAccessWhileRun=0
563 +RAMForAlgorithmStart=0x20000000
564 +RAMForAlgorithmSize=0x4000
565 +ProgramAlgorithm=M480LD_AP_256.FLM
566 +[M479]
567 +Connect=0
568 +Reset=Autodetect
569 +MaxClock=1MHz
570 +MemoryVerify=0
571 +IOVoltage=3300
572 +FlashSelect=APROM
573 +Erase=1
574 +Program=1
575 +Verify=1
576 +ResetAndRun=0
577 +EnableFlashBreakpoint=1
578 +EnableLog=0
579 +MemAccessWhileRun=0
580 +RAMForAlgorithmStart=0x20000000
581 +RAMForAlgorithmSize=0x4000
582 +ProgramAlgorithm=M479_AP_256.FLM
583 +[M451]
584 +Connect=0
585 +Reset=Autodetect
586 +MaxClock=1MHz
587 +MemoryVerify=0
588 +IOVoltage=3300
589 +FlashSelect=APROM
590 +Erase=1
591 +Program=1
592 +Verify=1
593 +ResetAndRun=0
594 +EnableFlashBreakpoint=1
595 +EnableLog=0
596 +MemAccessWhileRun=0
597 +RAMForAlgorithmStart=0x20000000
598 +RAMForAlgorithmSize=0x4000
599 +ProgramAlgorithm=M451_AP_256.FLM
600 +[M471]
601 +Connect=0
602 +Reset=Autodetect
603 +MaxClock=1MHz
604 +MemoryVerify=0
605 +IOVoltage=3300
606 +FlashSelect=APROM
607 +Bank=0
608 +Erase=1
609 +Program=1
610 +Verify=1
611 +ResetAndRun=1
612 +EnableFlashBreakpoint=0
613 +EnableLog=0
614 +MemAccessWhileRun=0
615 +RAMForAlgorithmStart=0x20000000
616 +RAMForAlgorithmSize=0x4000
617 +ProgramAlgorithm=M471_AP_512.FLM
618 +TraceConf0=0x00000002
619 +TraceConf1=0x00b71b00
620 +TraceConf2=0x00000800
621 +TraceConf3=0x00000000
622 +TraceConf4=0x00000001
623 +TraceConf5=0x00000000
624 +[M251]
625 +Connect=0
626 +Reset=Autodetect
627 +MaxClock=1MHz
628 +MemoryVerify=0
629 +IOVoltage=3300
630 +FlashSelect=APROM
631 +Erase=1
632 +Program=1
633 +Verify=1
634 +ResetAndRun=0
635 +EnableFlashBreakpoint=1
636 +EnableLog=0
637 +MemAccessWhileRun=0
638 +RAMForAlgorithmStart=0x20000000
639 +RAMForAlgorithmSize=0x2000
640 +ProgramAlgorithm=M251_AP_192.FLM
641 +[M2351]
642 +Connect=0
643 +Reset=Autodetect
644 +MaxClock=1MHz
645 +MemoryVerify=0
646 +IOVoltage=3300
647 +FlashSelect=APROM with IAP
648 +Erase=1
649 +Program=1
650 +Verify=1
651 +ResetAndRun=1
652 +EnableFlashBreakpoint=0
653 +EnableLog=0
654 +MemAccessWhileRun=0
655 +RAMForAlgorithmStart=0x20000000
656 +RAMForAlgorithmSize=0x00004000
657 +ProgramAlgorithm=M2351_AP_512.FLM
658 +TraceConf0=0x00000002
659 +TraceConf1=0x00b71b00
660 +TraceConf2=0x00000800
661 +TraceConf3=0x00000000
662 +TraceConf4=0x00000001
663 +TraceConf5=0x00000000
664 +CheckDPM=0
665 +DisableTimeoutDetect=0
666 +[M261]
667 +Connect=0
668 +Reset=Autodetect
669 +MaxClock=1MHz
670 +MemoryVerify=0
671 +IOVoltage=3300
672 +FlashSelect=APROM
673 +Erase=1
674 +Program=1
675 +Verify=1
676 +ResetAndRun=1
677 +EnableFlashBreakpoint=0
678 +EnableLog=0
679 +MemAccessWhileRun=0
680 +RAMForAlgorithmStart=0x20000000
681 +RAMForAlgorithmSize=0x4000
682 +ProgramAlgorithm=M261_AP_512.FLM
683 +TraceConf0=0x00000002
684 +TraceConf1=0x00b71b00
685 +TraceConf2=0x00000800
686 +TraceConf3=0x00000000
687 +TraceConf4=0x00000001
688 +TraceConf5=0x00000000
689 +[MR63]
690 +Connect=0
691 +Reset=Autodetect
692 +MaxClock=1MHz
693 +MemoryVerify=0
694 +IOVoltage=3300
695 +FlashSelect=APROM
696 +Erase=1
697 +Program=1
698 +Verify=1
699 +ResetAndRun=1
700 +EnableFlashBreakpoint=0
701 +EnableLog=0
702 +MemAccessWhileRun=0
703 +RAMForAlgorithmStart=0x20000000
704 +RAMForAlgorithmSize=0x4000
705 +ProgramAlgorithm=MR63_AP_512.FLM
706 +TraceConf0=0x00000002
707 +TraceConf1=0x00b71b00
708 +TraceConf2=0x00000800
709 +TraceConf3=0x00000000
710 +TraceConf4=0x00000001
711 +TraceConf5=0x00000000
712 +[M2354]
713 +Connect=0
714 +Reset=Autodetect
715 +MaxClock=1MHz
716 +MemoryVerify=0
717 +IOVoltage=3300
718 +FlashSelect=APROM
719 +Bank=0
720 +Erase=1
721 +Program=1
722 +Verify=1
723 +ResetAndRun=1
724 +EnableFlashBreakpoint=0
725 +EnableLog=0
726 +MemAccessWhileRun=0
727 +CheckDPM=0
728 +RAMForAlgorithmStart=0x20000000
729 +RAMForAlgorithmSize=0x4000
730 +ProgramAlgorithm=M2354_AP_1M.FLM
731 +TraceConf0=0x00000002
732 +TraceConf1=0x00b71b00
733 +TraceConf2=0x00000800
734 +TraceConf3=0x00000000
735 +TraceConf4=0x00000001
736 +TraceConf5=0x00000000
737 +[M071]
738 +Connect=0
739 +Reset=Autodetect
740 +MaxClock=1MHz
741 +MemoryVerify=0
742 +IOVoltage=3300
743 +FlashSelect=APROM
744 +Erase=1
745 +Program=1
746 +Verify=1
747 +ResetAndRun=0
748 +EnableFlashBreakpoint=1
749 +EnableLog=0
750 +MemAccessWhileRun=0
751 +RAMForAlgorithmStart=0x20000000
752 +RAMForAlgorithmSize=0x2000
753 +ProgramAlgorithm=M071_AP_128.FLM
754 +[M0564]
755 +Connect=0
756 +Reset=Autodetect
757 +MaxClock=1MHz
758 +MemoryVerify=0
759 +IOVoltage=3300
760 +FlashSelect=APROM
761 +Erase=1
762 +Program=1
763 +Verify=1
764 +ResetAndRun=0
765 +EnableFlashBreakpoint=1
766 +EnableLog=0
767 +MemAccessWhileRun=0
768 +RAMForAlgorithmStart=0x20000000
769 +RAMForAlgorithmSize=0x2000
770 +ProgramAlgorithm=M0564_AP_256.FLM
771 +[M0519]
772 +Connect=0
773 +Reset=Autodetect
774 +MaxClock=1MHz
775 +MemoryVerify=0
776 +IOVoltage=3300
777 +FlashSelect=APROM
778 +Erase=1
779 +Program=1
780 +Verify=1
781 +ResetAndRun=0
782 +EnableFlashBreakpoint=1
783 +EnableLog=0
784 +MemAccessWhileRun=0
785 +RAMForAlgorithmStart=0x20000000
786 +RAMForAlgorithmSize=0x1000
787 +ProgramAlgorithm=M0519_AP_128.FLM
788 +[M0518]
789 +Connect=0
790 +Reset=Autodetect
791 +MaxClock=1MHz
792 +MemoryVerify=0
793 +IOVoltage=3300
794 +FlashSelect=APROM
795 +Erase=1
796 +Program=1
797 +Verify=1
798 +ResetAndRun=0
799 +EnableFlashBreakpoint=1
800 +EnableLog=0
801 +MemAccessWhileRun=0
802 +RAMForAlgorithmStart=0x20000000
803 +RAMForAlgorithmSize=0x1000
804 +ProgramAlgorithm=M0518_AP_64.FLM
805 +[M05x]
806 +Connect=0
807 +Reset=Autodetect
808 +MaxClock=1MHz
809 +MemoryVerify=0
810 +IOVoltage=3300
811 +FlashSelect=APROM
812 +Erase=1
813 +Program=1
814 +Verify=1
815 +ResetAndRun=0
816 +EnableFlashBreakpoint=1
817 +EnableLog=0
818 +MemAccessWhileRun=0
819 +RAMForAlgorithmStart=0x20000000
820 +RAMForAlgorithmSize=0x800
821 +ProgramAlgorithm=M0516_AP_64.FLM
822 +[M0A21]
823 +Connect=0
824 +Reset=Autodetect
825 +MaxClock=1MHz
826 +MemoryVerify=0
827 +IOVoltage=3300
828 +FlashSelect=APROM
829 +Erase=1
830 +Program=1
831 +Verify=1
832 +ResetAndRun=1
833 +EnableFlashBreakpoint=0
834 +EnableLog=0
835 +MemAccessWhileRun=0
836 +RAMForAlgorithmStart=0x20000000
837 +RAMForAlgorithmSize=0x800
838 +ProgramAlgorithm=M0A21_AP_32.FLM
839 +[M030G]
840 +Connect=0
841 +Reset=Autodetect
842 +MaxClock=1MHz
843 +MemoryVerify=0
844 +IOVoltage=3300
845 +FlashSelect=APROM
846 +Erase=1
847 +Program=1
848 +Verify=1
849 +ResetAndRun=1
850 +EnableFlashBreakpoint=0
851 +EnableLog=0
852 +MemAccessWhileRun=0
853 +DisableTimeoutDetect=0
854 +RAMForAlgorithmStart=0x20000000
855 +RAMForAlgorithmSize=0x800
856 +ProgramAlgorithm=M030G_AP_64.FLM
857 +[M031]
858 +Connect=0
859 +Reset=Autodetect
860 +MaxClock=1MHz
861 +MemoryVerify=0
862 +IOVoltage=3300
863 +FlashSelect=APROM
864 +Bank=0
865 +Erase=1
866 +Program=1
867 +Verify=1
868 +ResetAndRun=1
869 +EnableFlashBreakpoint=0
870 +EnableLog=0
871 +MemAccessWhileRun=0
872 +RAMForAlgorithmStart=0x20000000
873 +RAMForAlgorithmSize=0x800
874 +ProgramAlgorithm=M031_AP_128.FLM
875 +[NPCX]
876 +Connect=0
877 +Reset=Autodetect
878 +MaxClock=1MHz
879 +MemoryVerify=0
880 +IOVoltage=3300
881 +FlashSelect=APROM
882 +Erase=1
883 +Program=1
884 +Verify=1
885 +ResetAndRun=0
886 +EnableFlashBreakpoint=0
887 +EnableLog=0
888 +MemAccessWhileRun=0
889 +RAMForAlgorithmStart=0x20000000
890 +RAMForAlgorithmSize=0x4000
891 +ProgramAlgorithm=NPCX_AP_512.FLM
892 +[I96000]
893 +Connect=0
894 +Reset=Autodetect
895 +MaxClock=1MHz
896 +MemoryVerify=0
897 +IOVoltage=3300
898 +Erase=2
899 +Program=0
900 +Verify=0
901 +ResetAndRun=0
902 +EnableLog=0
903 +MemAccessWhileRun=0
904 +RAMForAlgorithmStart=0x20000000
905 +RAMForAlgorithmSize=0x8000
906 +ProgramAlgorithm=
907 +[I94000]
908 +Connect=0
909 +Reset=Autodetect
910 +MaxClock=1MHz
911 +MemoryVerify=0
912 +IOVoltage=3300
913 +FlashSelect=APROM
914 +Erase=1
915 +Program=1
916 +Verify=1
917 +ResetAndRun=0
918 +EnableFlashBreakpoint=0
919 +EnableLog=0
920 +MemAccessWhileRun=0
921 +RAMForAlgorithmStart=0x20000000
922 +RAMForAlgorithmSize=0x4000
923 +ProgramAlgorithm=I94000_AP_512.FLM
924 +[ISD9300]
925 +Connect=0
926 +Reset=Autodetect
927 +MaxClock=1MHz
928 +MemoryVerify=0
929 +IOVoltage=3300
930 +FlashSelect=APROM
931 +Erase=1
932 +Program=1
933 +Verify=1
934 +ResetAndRun=0
935 +EnableFlashBreakpoint=0
936 +EnableLog=0
937 +MemAccessWhileRun=0
938 +RAMForAlgorithmStart=0x20000000
939 +RAMForAlgorithmSize=0x1000
940 +ProgramAlgorithm=ISD9300_AP_145.FLM
941 +[I9200]
942 +Connect=0
943 +Reset=Autodetect
944 +MaxClock=1MHz
945 +MemoryVerify=0
946 +IOVoltage=3300
947 +FlashSelect=APROM
948 +Erase=1
949 +Program=1
950 +Verify=1
951 +ResetAndRun=0
952 +EnableFlashBreakpoint=0
953 +EnableLog=0
954 +MemAccessWhileRun=0
955 +RAMForAlgorithmStart=0x20000000
956 +RAMForAlgorithmSize=0x1000
957 +ProgramAlgorithm=I9200_AP_128.FLM
958 +[ISD9xxx]
959 +Connect=0
960 +Reset=Autodetect
961 +MaxClock=1MHz
962 +MemoryVerify=0
963 +IOVoltage=3300
964 +FlashSelect=APROM
965 +Erase=1
966 +Program=1
967 +Verify=1
968 +ResetAndRun=0
969 +EnableFlashBreakpoint=0
970 +EnableLog=0
971 +MemAccessWhileRun=0
972 +RAMForAlgorithmStart=0x20000000
973 +RAMForAlgorithmSize=0x1000
974 +ProgramAlgorithm=ISD9100_AP_145.FLM
975 +[ISD9000]
976 +Connect=0
977 +Reset=Autodetect
978 +MaxClock=1MHz
979 +MemoryVerify=0
980 +IOVoltage=3300
981 +FlashSelect=APROM
982 +Erase=1
983 +Program=1
984 +Verify=1
985 +ResetAndRun=0
986 +EnableFlashBreakpoint=0
987 +EnableLog=0
988 +MemAccessWhileRun=0
989 +RAMForAlgorithmStart=0x20000000
990 +RAMForAlgorithmSize=0x1000
991 +ProgramAlgorithm=ISD9000_AP_64.FLM
992 +[AU9xxx]
993 +Connect=0
994 +Reset=Autodetect
995 +MaxClock=1MHz
996 +MemoryVerify=0
997 +IOVoltage=3300
998 +FlashSelect=APROM
999 +Erase=1
1000 +Program=1
1001 +Verify=1
1002 +ResetAndRun=0
1003 +EnableFlashBreakpoint=0
1004 +EnableLog=0
1005 +MemAccessWhileRun=0
1006 +RAMForAlgorithmStart=0x20000000
1007 +RAMForAlgorithmSize=0x1000
1008 +ProgramAlgorithm=AU9100_AP_145.FLM
1009 +[Autodetect]
1010 +Connect=0
1011 +Reset=Autodetect
1012 +MaxClock=1MHz
1013 +MemoryVerify=0
1014 +IOVoltage=3300
1015 +Erase=1
1016 +Program=1
1017 +Verify=1
1018 +ResetAndRun=0
1019 +EnableLog=0
1020 +MemAccessWhileRun=0
1021 +RAMForAlgorithmStart=0x20000000
1022 +RAMForAlgorithmSize=0x4000
1023 +ProgramAlgorithm=
1024 +[General]
1025 +Connect=0
1026 +Reset=Autodetect
1027 +MaxClock=1MHz
1028 +MemoryVerify=0
1029 +IOVoltage=3300
1030 +Erase=1
1031 +Program=1
1032 +Verify=1
1033 +ResetAndRun=0
1034 +EnableLog=0
1035 +MemAccessWhileRun=0
1036 +RAMForAlgorithmStart=0x20000000
1037 +RAMForAlgorithmSize=0x4000
1038 +ProgramAlgorithm=
1 +/*
2 + * Copyright (c) 2013-2018 Arm Limited. All rights reserved.
3 + *
4 + * SPDX-License-Identifier: Apache-2.0
5 + *
6 + * Licensed under the Apache License, Version 2.0 (the License); you may
7 + * not use this file except in compliance with the License.
8 + * You may obtain a copy of the License at
9 + *
10 + * www.apache.org/licenses/LICENSE-2.0
11 + *
12 + * Unless required by applicable law or agreed to in writing, software
13 + * distributed under the License is distributed on an AS IS BASIS, WITHOUT
14 + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 + * See the License for the specific language governing permissions and
16 + * limitations under the License.
17 + *
18 + * -----------------------------------------------------------------------------
19 + *
20 + * $Revision: V5.1.0
21 + *
22 + * Project: CMSIS-RTOS RTX
23 + * Title: RTX Configuration
24 + *
25 + * -----------------------------------------------------------------------------
26 + */
27 +
28 +#include "cmsis_compiler.h"
29 +#include "rtx_os.h"
30 +
31 +// OS Idle Thread
32 +__WEAK __NO_RETURN void osRtxIdleThread (void *argument) {
33 + (void)argument;
34 +
35 + for (;;) {}
36 +}
37 +
38 +// OS Error Callback function
39 +__WEAK uint32_t osRtxErrorNotify (uint32_t code, void *object_id) {
40 + (void)object_id;
41 +
42 + switch (code) {
43 + case osRtxErrorStackUnderflow:
44 + // Stack overflow detected for thread (thread_id=object_id)
45 + break;
46 + case osRtxErrorISRQueueOverflow:
47 + // ISR Queue overflow detected when inserting object (object_id)
48 + break;
49 + case osRtxErrorTimerQueueOverflow:
50 + // User Timer Callback Queue overflow detected for timer (timer_id=object_id)
51 + break;
52 + case osRtxErrorClibSpace:
53 + // Standard C/C++ library libspace not available: increase OS_THREAD_LIBSPACE_NUM
54 + break;
55 + case osRtxErrorClibMutex:
56 + // Standard C/C++ library mutex initialization failed
57 + break;
58 + default:
59 + // Reserved
60 + break;
61 + }
62 + for (;;) {}
63 +//return 0U;
64 +}
1 +/*
2 + * Copyright (c) 2013-2020 Arm Limited. All rights reserved.
3 + *
4 + * SPDX-License-Identifier: Apache-2.0
5 + *
6 + * Licensed under the Apache License, Version 2.0 (the License); you may
7 + * not use this file except in compliance with the License.
8 + * You may obtain a copy of the License at
9 + *
10 + * www.apache.org/licenses/LICENSE-2.0
11 + *
12 + * Unless required by applicable law or agreed to in writing, software
13 + * distributed under the License is distributed on an AS IS BASIS, WITHOUT
14 + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 + * See the License for the specific language governing permissions and
16 + * limitations under the License.
17 + *
18 + * -----------------------------------------------------------------------------
19 + *
20 + * $Revision: V5.5.1
21 + *
22 + * Project: CMSIS-RTOS RTX
23 + * Title: RTX Configuration definitions
24 + *
25 + * -----------------------------------------------------------------------------
26 + */
27 +
28 +#ifndef RTX_CONFIG_H_
29 +#define RTX_CONFIG_H_
30 +
31 +#ifdef _RTE_
32 +#include "RTE_Components.h"
33 +#ifdef RTE_RTX_CONFIG_H
34 +#include RTE_RTX_CONFIG_H
35 +#endif
36 +#endif
37 +
38 +//-------- <<< Use Configuration Wizard in Context Menu >>> --------------------
39 +
40 +// <h>System Configuration
41 +// =======================
42 +
43 +// <o>Global Dynamic Memory size [bytes] <0-1073741824:8>
44 +// <i> Defines the combined global dynamic memory size.
45 +// <i> Default: 32768
46 +#ifndef OS_DYNAMIC_MEM_SIZE
47 +#define OS_DYNAMIC_MEM_SIZE 32768
48 +#endif
49 +
50 +// <o>Kernel Tick Frequency [Hz] <1-1000000>
51 +// <i> Defines base time unit for delays and timeouts.
52 +// <i> Default: 1000 (1ms tick)
53 +#ifndef OS_TICK_FREQ
54 +#define OS_TICK_FREQ 1000
55 +#endif
56 +
57 +// <e>Round-Robin Thread switching
58 +// <i> Enables Round-Robin Thread switching.
59 +#ifndef OS_ROBIN_ENABLE
60 +#define OS_ROBIN_ENABLE 1
61 +#endif
62 +
63 +// <o>Round-Robin Timeout <1-1000>
64 +// <i> Defines how many ticks a thread will execute before a thread switch.
65 +// <i> Default: 5
66 +#ifndef OS_ROBIN_TIMEOUT
67 +#define OS_ROBIN_TIMEOUT 5
68 +#endif
69 +
70 +// </e>
71 +
72 +// <o>ISR FIFO Queue
73 +// <4=> 4 entries <8=> 8 entries <12=> 12 entries <16=> 16 entries
74 +// <24=> 24 entries <32=> 32 entries <48=> 48 entries <64=> 64 entries
75 +// <96=> 96 entries <128=> 128 entries <196=> 196 entries <256=> 256 entries
76 +// <i> RTOS Functions called from ISR store requests to this buffer.
77 +// <i> Default: 16 entries
78 +#ifndef OS_ISR_FIFO_QUEUE
79 +#define OS_ISR_FIFO_QUEUE 16
80 +#endif
81 +
82 +// <q>Object Memory usage counters
83 +// <i> Enables object memory usage counters (requires RTX source variant).
84 +#ifndef OS_OBJ_MEM_USAGE
85 +#define OS_OBJ_MEM_USAGE 0
86 +#endif
87 +
88 +// </h>
89 +
90 +// <h>Thread Configuration
91 +// =======================
92 +
93 +// <e>Object specific Memory allocation
94 +// <i> Enables object specific memory allocation.
95 +#ifndef OS_THREAD_OBJ_MEM
96 +#define OS_THREAD_OBJ_MEM 0
97 +#endif
98 +
99 +// <o>Number of user Threads <1-1000>
100 +// <i> Defines maximum number of user threads that can be active at the same time.
101 +// <i> Applies to user threads with system provided memory for control blocks.
102 +#ifndef OS_THREAD_NUM
103 +#define OS_THREAD_NUM 1
104 +#endif
105 +
106 +// <o>Number of user Threads with default Stack size <0-1000>
107 +// <i> Defines maximum number of user threads with default stack size.
108 +// <i> Applies to user threads with zero stack size specified.
109 +#ifndef OS_THREAD_DEF_STACK_NUM
110 +#define OS_THREAD_DEF_STACK_NUM 0
111 +#endif
112 +
113 +// <o>Total Stack size [bytes] for user Threads with user-provided Stack size <0-1073741824:8>
114 +// <i> Defines the combined stack size for user threads with user-provided stack size.
115 +// <i> Applies to user threads with user-provided stack size and system provided memory for stack.
116 +// <i> Default: 0
117 +#ifndef OS_THREAD_USER_STACK_SIZE
118 +#define OS_THREAD_USER_STACK_SIZE 0
119 +#endif
120 +
121 +// </e>
122 +
123 +// <o>Default Thread Stack size [bytes] <96-1073741824:8>
124 +// <i> Defines stack size for threads with zero stack size specified.
125 +// <i> Default: 3072
126 +#ifndef OS_STACK_SIZE
127 +#define OS_STACK_SIZE 3072
128 +#endif
129 +
130 +// <o>Idle Thread Stack size [bytes] <72-1073741824:8>
131 +// <i> Defines stack size for Idle thread.
132 +// <i> Default: 512
133 +#ifndef OS_IDLE_THREAD_STACK_SIZE
134 +#define OS_IDLE_THREAD_STACK_SIZE 512
135 +#endif
136 +
137 +// <o>Idle Thread TrustZone Module Identifier
138 +// <i> Defines TrustZone Thread Context Management Identifier.
139 +// <i> Applies only to cores with TrustZone technology.
140 +// <i> Default: 0 (not used)
141 +#ifndef OS_IDLE_THREAD_TZ_MOD_ID
142 +#define OS_IDLE_THREAD_TZ_MOD_ID 0
143 +#endif
144 +
145 +// <q>Stack overrun checking
146 +// <i> Enables stack overrun check at thread switch.
147 +// <i> Enabling this option increases slightly the execution time of a thread switch.
148 +#ifndef OS_STACK_CHECK
149 +#define OS_STACK_CHECK 1
150 +#endif
151 +
152 +// <q>Stack usage watermark
153 +// <i> Initializes thread stack with watermark pattern for analyzing stack usage.
154 +// <i> Enabling this option increases significantly the execution time of thread creation.
155 +#ifndef OS_STACK_WATERMARK
156 +#define OS_STACK_WATERMARK 0
157 +#endif
158 +
159 +// <o>Processor mode for Thread execution
160 +// <0=> Unprivileged mode
161 +// <1=> Privileged mode
162 +// <i> Default: Privileged mode
163 +#ifndef OS_PRIVILEGE_MODE
164 +#define OS_PRIVILEGE_MODE 1
165 +#endif
166 +
167 +// </h>
168 +
169 +// <h>Timer Configuration
170 +// ======================
171 +
172 +// <e>Object specific Memory allocation
173 +// <i> Enables object specific memory allocation.
174 +#ifndef OS_TIMER_OBJ_MEM
175 +#define OS_TIMER_OBJ_MEM 0
176 +#endif
177 +
178 +// <o>Number of Timer objects <1-1000>
179 +// <i> Defines maximum number of objects that can be active at the same time.
180 +// <i> Applies to objects with system provided memory for control blocks.
181 +#ifndef OS_TIMER_NUM
182 +#define OS_TIMER_NUM 1
183 +#endif
184 +
185 +// </e>
186 +
187 +// <o>Timer Thread Priority
188 +// <8=> Low
189 +// <16=> Below Normal <24=> Normal <32=> Above Normal
190 +// <40=> High
191 +// <48=> Realtime
192 +// <i> Defines priority for timer thread
193 +// <i> Default: High
194 +#ifndef OS_TIMER_THREAD_PRIO
195 +#define OS_TIMER_THREAD_PRIO 40
196 +#endif
197 +
198 +// <o>Timer Thread Stack size [bytes] <0-1073741824:8>
199 +// <i> Defines stack size for Timer thread.
200 +// <i> May be set to 0 when timers are not used.
201 +// <i> Default: 512
202 +#ifndef OS_TIMER_THREAD_STACK_SIZE
203 +#define OS_TIMER_THREAD_STACK_SIZE 512
204 +#endif
205 +
206 +// <o>Timer Thread TrustZone Module Identifier
207 +// <i> Defines TrustZone Thread Context Management Identifier.
208 +// <i> Applies only to cores with TrustZone technology.
209 +// <i> Default: 0 (not used)
210 +#ifndef OS_TIMER_THREAD_TZ_MOD_ID
211 +#define OS_TIMER_THREAD_TZ_MOD_ID 0
212 +#endif
213 +
214 +// <o>Timer Callback Queue entries <0-256>
215 +// <i> Number of concurrent active timer callback functions.
216 +// <i> May be set to 0 when timers are not used.
217 +// <i> Default: 4
218 +#ifndef OS_TIMER_CB_QUEUE
219 +#define OS_TIMER_CB_QUEUE 4
220 +#endif
221 +
222 +// </h>
223 +
224 +// <h>Event Flags Configuration
225 +// ============================
226 +
227 +// <e>Object specific Memory allocation
228 +// <i> Enables object specific memory allocation.
229 +#ifndef OS_EVFLAGS_OBJ_MEM
230 +#define OS_EVFLAGS_OBJ_MEM 0
231 +#endif
232 +
233 +// <o>Number of Event Flags objects <1-1000>
234 +// <i> Defines maximum number of objects that can be active at the same time.
235 +// <i> Applies to objects with system provided memory for control blocks.
236 +#ifndef OS_EVFLAGS_NUM
237 +#define OS_EVFLAGS_NUM 1
238 +#endif
239 +
240 +// </e>
241 +
242 +// </h>
243 +
244 +// <h>Mutex Configuration
245 +// ======================
246 +
247 +// <e>Object specific Memory allocation
248 +// <i> Enables object specific memory allocation.
249 +#ifndef OS_MUTEX_OBJ_MEM
250 +#define OS_MUTEX_OBJ_MEM 0
251 +#endif
252 +
253 +// <o>Number of Mutex objects <1-1000>
254 +// <i> Defines maximum number of objects that can be active at the same time.
255 +// <i> Applies to objects with system provided memory for control blocks.
256 +#ifndef OS_MUTEX_NUM
257 +#define OS_MUTEX_NUM 1
258 +#endif
259 +
260 +// </e>
261 +
262 +// </h>
263 +
264 +// <h>Semaphore Configuration
265 +// ==========================
266 +
267 +// <e>Object specific Memory allocation
268 +// <i> Enables object specific memory allocation.
269 +#ifndef OS_SEMAPHORE_OBJ_MEM
270 +#define OS_SEMAPHORE_OBJ_MEM 0
271 +#endif
272 +
273 +// <o>Number of Semaphore objects <1-1000>
274 +// <i> Defines maximum number of objects that can be active at the same time.
275 +// <i> Applies to objects with system provided memory for control blocks.
276 +#ifndef OS_SEMAPHORE_NUM
277 +#define OS_SEMAPHORE_NUM 1
278 +#endif
279 +
280 +// </e>
281 +
282 +// </h>
283 +
284 +// <h>Memory Pool Configuration
285 +// ============================
286 +
287 +// <e>Object specific Memory allocation
288 +// <i> Enables object specific memory allocation.
289 +#ifndef OS_MEMPOOL_OBJ_MEM
290 +#define OS_MEMPOOL_OBJ_MEM 0
291 +#endif
292 +
293 +// <o>Number of Memory Pool objects <1-1000>
294 +// <i> Defines maximum number of objects that can be active at the same time.
295 +// <i> Applies to objects with system provided memory for control blocks.
296 +#ifndef OS_MEMPOOL_NUM
297 +#define OS_MEMPOOL_NUM 1
298 +#endif
299 +
300 +// <o>Data Storage Memory size [bytes] <0-1073741824:8>
301 +// <i> Defines the combined data storage memory size.
302 +// <i> Applies to objects with system provided memory for data storage.
303 +// <i> Default: 0
304 +#ifndef OS_MEMPOOL_DATA_SIZE
305 +#define OS_MEMPOOL_DATA_SIZE 0
306 +#endif
307 +
308 +// </e>
309 +
310 +// </h>
311 +
312 +// <h>Message Queue Configuration
313 +// ==============================
314 +
315 +// <e>Object specific Memory allocation
316 +// <i> Enables object specific memory allocation.
317 +#ifndef OS_MSGQUEUE_OBJ_MEM
318 +#define OS_MSGQUEUE_OBJ_MEM 0
319 +#endif
320 +
321 +// <o>Number of Message Queue objects <1-1000>
322 +// <i> Defines maximum number of objects that can be active at the same time.
323 +// <i> Applies to objects with system provided memory for control blocks.
324 +#ifndef OS_MSGQUEUE_NUM
325 +#define OS_MSGQUEUE_NUM 1
326 +#endif
327 +
328 +// <o>Data Storage Memory size [bytes] <0-1073741824:8>
329 +// <i> Defines the combined data storage memory size.
330 +// <i> Applies to objects with system provided memory for data storage.
331 +// <i> Default: 0
332 +#ifndef OS_MSGQUEUE_DATA_SIZE
333 +#define OS_MSGQUEUE_DATA_SIZE 0
334 +#endif
335 +
336 +// </e>
337 +
338 +// </h>
339 +
340 +// <h>Event Recorder Configuration
341 +// ===============================
342 +
343 +// <e>Global Initialization
344 +// <i> Initialize Event Recorder during 'osKernelInitialize'.
345 +#ifndef OS_EVR_INIT
346 +#define OS_EVR_INIT 0
347 +#endif
348 +
349 +// <q>Start recording
350 +// <i> Start event recording after initialization.
351 +#ifndef OS_EVR_START
352 +#define OS_EVR_START 1
353 +#endif
354 +
355 +// <h>Global Event Filter Setup
356 +// <i> Initial recording level applied to all components.
357 +// <o.0>Error events
358 +// <o.1>API function call events
359 +// <o.2>Operation events
360 +// <o.3>Detailed operation events
361 +// </h>
362 +#ifndef OS_EVR_LEVEL
363 +#define OS_EVR_LEVEL 0x00U
364 +#endif
365 +
366 +// <h>RTOS Event Filter Setup
367 +// <i> Recording levels for RTX components.
368 +// <i> Only applicable if events for the respective component are generated.
369 +
370 +// <h>Memory Management
371 +// <i> Recording level for Memory Management events.
372 +// <o.0>Error events
373 +// <o.1>API function call events
374 +// <o.2>Operation events
375 +// <o.3>Detailed operation events
376 +// </h>
377 +#ifndef OS_EVR_MEMORY_LEVEL
378 +#define OS_EVR_MEMORY_LEVEL 0x01U
379 +#endif
380 +
381 +// <h>Kernel
382 +// <i> Recording level for Kernel events.
383 +// <o.0>Error events
384 +// <o.1>API function call events
385 +// <o.2>Operation events
386 +// <o.3>Detailed operation events
387 +// </h>
388 +#ifndef OS_EVR_KERNEL_LEVEL
389 +#define OS_EVR_KERNEL_LEVEL 0x01U
390 +#endif
391 +
392 +// <h>Thread
393 +// <i> Recording level for Thread events.
394 +// <o.0>Error events
395 +// <o.1>API function call events
396 +// <o.2>Operation events
397 +// <o.3>Detailed operation events
398 +// </h>
399 +#ifndef OS_EVR_THREAD_LEVEL
400 +#define OS_EVR_THREAD_LEVEL 0x05U
401 +#endif
402 +
403 +// <h>Generic Wait
404 +// <i> Recording level for Generic Wait events.
405 +// <o.0>Error events
406 +// <o.1>API function call events
407 +// <o.2>Operation events
408 +// <o.3>Detailed operation events
409 +// </h>
410 +#ifndef OS_EVR_WAIT_LEVEL
411 +#define OS_EVR_WAIT_LEVEL 0x01U
412 +#endif
413 +
414 +// <h>Thread Flags
415 +// <i> Recording level for Thread Flags events.
416 +// <o.0>Error events
417 +// <o.1>API function call events
418 +// <o.2>Operation events
419 +// <o.3>Detailed operation events
420 +// </h>
421 +#ifndef OS_EVR_THFLAGS_LEVEL
422 +#define OS_EVR_THFLAGS_LEVEL 0x01U
423 +#endif
424 +
425 +// <h>Event Flags
426 +// <i> Recording level for Event Flags events.
427 +// <o.0>Error events
428 +// <o.1>API function call events
429 +// <o.2>Operation events
430 +// <o.3>Detailed operation events
431 +// </h>
432 +#ifndef OS_EVR_EVFLAGS_LEVEL
433 +#define OS_EVR_EVFLAGS_LEVEL 0x01U
434 +#endif
435 +
436 +// <h>Timer
437 +// <i> Recording level for Timer events.
438 +// <o.0>Error events
439 +// <o.1>API function call events
440 +// <o.2>Operation events
441 +// <o.3>Detailed operation events
442 +// </h>
443 +#ifndef OS_EVR_TIMER_LEVEL
444 +#define OS_EVR_TIMER_LEVEL 0x01U
445 +#endif
446 +
447 +// <h>Mutex
448 +// <i> Recording level for Mutex events.
449 +// <o.0>Error events
450 +// <o.1>API function call events
451 +// <o.2>Operation events
452 +// <o.3>Detailed operation events
453 +// </h>
454 +#ifndef OS_EVR_MUTEX_LEVEL
455 +#define OS_EVR_MUTEX_LEVEL 0x01U
456 +#endif
457 +
458 +// <h>Semaphore
459 +// <i> Recording level for Semaphore events.
460 +// <o.0>Error events
461 +// <o.1>API function call events
462 +// <o.2>Operation events
463 +// <o.3>Detailed operation events
464 +// </h>
465 +#ifndef OS_EVR_SEMAPHORE_LEVEL
466 +#define OS_EVR_SEMAPHORE_LEVEL 0x01U
467 +#endif
468 +
469 +// <h>Memory Pool
470 +// <i> Recording level for Memory Pool events.
471 +// <o.0>Error events
472 +// <o.1>API function call events
473 +// <o.2>Operation events
474 +// <o.3>Detailed operation events
475 +// </h>
476 +#ifndef OS_EVR_MEMPOOL_LEVEL
477 +#define OS_EVR_MEMPOOL_LEVEL 0x01U
478 +#endif
479 +
480 +// <h>Message Queue
481 +// <i> Recording level for Message Queue events.
482 +// <o.0>Error events
483 +// <o.1>API function call events
484 +// <o.2>Operation events
485 +// <o.3>Detailed operation events
486 +// </h>
487 +#ifndef OS_EVR_MSGQUEUE_LEVEL
488 +#define OS_EVR_MSGQUEUE_LEVEL 0x01U
489 +#endif
490 +
491 +// </h>
492 +
493 +// </e>
494 +
495 +// <h>RTOS Event Generation
496 +// <i> Enables event generation for RTX components (requires RTX source variant).
497 +
498 +// <q>Memory Management
499 +// <i> Enables Memory Management event generation.
500 +#ifndef OS_EVR_MEMORY
501 +#define OS_EVR_MEMORY 1
502 +#endif
503 +
504 +// <q>Kernel
505 +// <i> Enables Kernel event generation.
506 +#ifndef OS_EVR_KERNEL
507 +#define OS_EVR_KERNEL 1
508 +#endif
509 +
510 +// <q>Thread
511 +// <i> Enables Thread event generation.
512 +#ifndef OS_EVR_THREAD
513 +#define OS_EVR_THREAD 1
514 +#endif
515 +
516 +// <q>Generic Wait
517 +// <i> Enables Generic Wait event generation.
518 +#ifndef OS_EVR_WAIT
519 +#define OS_EVR_WAIT 1
520 +#endif
521 +
522 +// <q>Thread Flags
523 +// <i> Enables Thread Flags event generation.
524 +#ifndef OS_EVR_THFLAGS
525 +#define OS_EVR_THFLAGS 1
526 +#endif
527 +
528 +// <q>Event Flags
529 +// <i> Enables Event Flags event generation.
530 +#ifndef OS_EVR_EVFLAGS
531 +#define OS_EVR_EVFLAGS 1
532 +#endif
533 +
534 +// <q>Timer
535 +// <i> Enables Timer event generation.
536 +#ifndef OS_EVR_TIMER
537 +#define OS_EVR_TIMER 1
538 +#endif
539 +
540 +// <q>Mutex
541 +// <i> Enables Mutex event generation.
542 +#ifndef OS_EVR_MUTEX
543 +#define OS_EVR_MUTEX 1
544 +#endif
545 +
546 +// <q>Semaphore
547 +// <i> Enables Semaphore event generation.
548 +#ifndef OS_EVR_SEMAPHORE
549 +#define OS_EVR_SEMAPHORE 1
550 +#endif
551 +
552 +// <q>Memory Pool
553 +// <i> Enables Memory Pool event generation.
554 +#ifndef OS_EVR_MEMPOOL
555 +#define OS_EVR_MEMPOOL 1
556 +#endif
557 +
558 +// <q>Message Queue
559 +// <i> Enables Message Queue event generation.
560 +#ifndef OS_EVR_MSGQUEUE
561 +#define OS_EVR_MSGQUEUE 1
562 +#endif
563 +
564 +// </h>
565 +
566 +// </h>
567 +
568 +// Number of Threads which use standard C/C++ library libspace
569 +// (when thread specific memory allocation is not used).
570 +#if (OS_THREAD_OBJ_MEM == 0)
571 +#ifndef OS_THREAD_LIBSPACE_NUM
572 +#define OS_THREAD_LIBSPACE_NUM 4
573 +#endif
574 +#else
575 +#define OS_THREAD_LIBSPACE_NUM OS_THREAD_NUM
576 +#endif
577 +
578 +//------------- <<< end of configuration section >>> ---------------------------
579 +
580 +#endif // RTX_CONFIG_H_
1 +/* -----------------------------------------------------------------------------
2 + * Copyright (c) 2019 Arm Limited (or its affiliates). All rights reserved.
3 + *
4 + * SPDX-License-Identifier: Apache-2.0
5 + *
6 + * Licensed under the Apache License, Version 2.0 (the License); you may
7 + * not use this file except in compliance with the License.
8 + * You may obtain a copy of the License at
9 + *
10 + * www.apache.org/licenses/LICENSE-2.0
11 + *
12 + * Unless required by applicable law or agreed to in writing, software
13 + * distributed under the License is distributed on an AS IS BASIS, WITHOUT
14 + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 + * See the License for the specific language governing permissions and
16 + * limitations under the License.
17 + *
18 + *
19 + * $Date: 12. November 2019
20 + * $Revision: V1.0
21 + *
22 + * Project: ESP8266 WiFi Driver
23 + * -------------------------------------------------------------------------- */
24 +
25 +//-------- <<< Use Configuration Wizard in Context Menu >>> --------------------
26 +
27 +// <h>ESP8266 WiFi Driver Configuration
28 +
29 +// <o> WiFi Driver Number (Driver_WiFi#) <0-255>
30 +// <i> Defines exported WiFi driver control block number (Driver_WiFi#)
31 +// <i> Default: 0
32 +#define WIFI_ESP8266_DRIVER_NUMBER 0
33 +
34 +// <o>Connect to hardware via Driver_USART# <0-255>
35 +// <i>Defines the serial driver control block number (Driver_USART#)
36 +// <i> Default: 0
37 +#define WIFI_ESP8266_SERIAL_DRIVER 0
38 +
39 +// <o> Serial interface baudrate <115200=>115200
40 +// <230400=>230400
41 +// <460800=>460800
42 +// <921600=>921600
43 +// <i> Defines the serial interface baudrate.
44 +// <i> Default: 115200
45 +#define WIFI_ESP8266_SERIAL_BAUDRATE 115200
46 +
47 +// <o> WiFi thread priority <0=>osPriorityLow
48 +// <1=>osPriorityBelowNormal
49 +// <2=>osPriorityNormal
50 +// <3=>osPriorityAboveNormal
51 +// <4=>osPriorityHigh
52 +// <5=>osPriorityRealtime
53 +// <i> Defines the WiFi driver thread priority.
54 +// <i> The priority of the WiFi thread should be higher as application thread priority.
55 +// <i> Default: 3
56 +#define WIFI_ESP8266_THREAD_PRIORITY 3
57 +
58 +// <o> WiFi thread stack size [bytes] <96-1073741824:8>
59 +// <i> Defines stack size for the WiFi Thread.
60 +// <i> Default: 512
61 +#define WIFI_ESP8266_THREAD_STACK_SIZE 512
62 +
63 +// <o> Socket buffer block size <128-16384:128>
64 +// <i> Defines the size of one memory block used for socket data buffering.
65 +// <i> Socket buffering consists of multiple blocks which are distributed across multiple sockets.
66 +// <i> Default: 512
67 +#define WIFI_ESP8266_SOCKET_BLOCK_SIZE 512
68 +
69 +// <o> Socket buffer block count <5-256>
70 +// <i> Defines the total number of memory blocks used for socket data buffering.
71 +// <i> Socket buffering consists of multiple blocks which are distributed across multiple sockets.
72 +// <i> Default: 8
73 +#define WIFI_ESP8266_SOCKET_BLOCK_COUNT 8
74 +
75 +// <o> Serial parser buffer block size
76 +// <i> Defines the size of one memory block in serial parser buffer.
77 +// <i> The total size of serial parser buffer is defined by memory block size and number of blocks.
78 +// <i> Default: 256
79 +#define WIFI_ESP8266_PARSER_BLOCK_SIZE 256
80 +
81 +// <o> Serial parser buffer block count
82 +// <i> Defines the number of memory blocks in serial parser buffer.
83 +// <i> The total size of serial parser buffer is defined by memory block size and number of blocks.
84 +// <i> Default: 8
85 +#define WIFI_ESP8266_PARSER_BLOCK_COUNT 8
86 +
87 +// </h>
88 +
89 +//------------- <<< end of configuration section >>> -------------------------
1 +/**************************************************************************//**
2 + * @file retarget.c
3 + * @version V3.00
4 + * @brief Debug Port and Semihost Setting Source File
5 + *
6 + * @note
7 + * SPDX-License-Identifier: Apache-2.0
8 + * Copyright (C) 2016-2020 Nuvoton Technology Corp. All rights reserved.
9 + *
10 + ******************************************************************************/
11 +
12 +
13 +#include <stdio.h>
14 +#include "NuMicro.h"
15 +
16 +#if defined (__ICCARM__)
17 +# pragma diag_suppress=Pm150
18 +#endif
19 +
20 +
21 +#if defined ( __CC_ARM )
22 +#if (__ARMCC_VERSION < 400000)
23 +#else
24 +/* Insist on keeping widthprec, to avoid X propagation by benign code in C-lib */
25 +#pragma import _printf_widthprec
26 +#endif
27 +#endif
28 +
29 +/*---------------------------------------------------------------------------------------------------------*/
30 +/* Global variables */
31 +/*---------------------------------------------------------------------------------------------------------*/
32 +#if !(defined(__ICCARM__) && (__VER__ >= 6010000))
33 +# if (__ARMCC_VERSION < 6040000)
34 +struct __FILE
35 +{
36 + int handle; /* Add whatever you need here */
37 +};
38 +# endif
39 +#elif(__VER__ >= 8000000)
40 +struct __FILE
41 +{
42 + int handle; /* Add whatever you need here */
43 +};
44 +#endif
45 +FILE __stdout;
46 +FILE __stdin;
47 +
48 +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION > 6040000)
49 +# if !defined(__MICROLIB)
50 +__asm(".global __ARM_use_no_argv\n\t" "__ARM_use_no_argv:\n\t");
51 +# endif
52 +#endif
53 +
54 +
55 +#if (defined(__ARMCC_VERSION) || defined(__ICCARM__))
56 +extern int32_t SH_DoCommand(int32_t n32In_R0, int32_t n32In_R1, int32_t *pn32Out_R0);
57 +
58 +#if defined( __ICCARM__ )
59 +__WEAK
60 +#else
61 +__attribute__((weak))
62 +#endif
63 +uint32_t ProcessHardFault(uint32_t lr, uint32_t msp, uint32_t psp);
64 +
65 +#endif
66 +
67 +#pragma pack(push)
68 +#pragma pack(1)
69 +typedef struct {
70 + char *name;
71 + uint32_t u32Addr;
72 + uint8_t u8NSIdx;
73 +} IP_T;
74 +#pragma pack(pop)
75 +
76 +#ifndef DEBUG_ENABLE_SEMIHOST
77 +static IP_T s_IpTbl[] = {
78 +{"SYS",SYS_BASE,0},
79 +{"CLK",CLK_BASE,0},
80 +{"INT",INT_BASE,0},
81 +{"GPIOA",GPIOA_BASE,224+0},
82 +{"GPIOB",GPIOB_BASE,224+1},
83 +{"GPIOC",GPIOC_BASE,224+2},
84 +{"GPIOD",GPIOD_BASE,224+3},
85 +{"GPIOE",GPIOE_BASE,224+4},
86 +{"GPIOF",GPIOF_BASE,224+5},
87 +{"GPIOG",GPIOG_BASE,224+6},
88 +{"GPIOH",GPIOH_BASE,224+7},
89 +{"GPIO_DBCTL",GPIO_DBCTL_BASE,0},
90 +{"PA",GPIO_PIN_DATA_BASE ,224+0},
91 +{"PB",GPIO_PIN_DATA_BASE+16*4 ,224+0},
92 +{"PC",GPIO_PIN_DATA_BASE+2*16*4,224+0},
93 +{"PD",GPIO_PIN_DATA_BASE+3*16*4,224+0},
94 +{"PE",GPIO_PIN_DATA_BASE+4*16*4,224+0},
95 +{"PF",GPIO_PIN_DATA_BASE+5*16*4,224+0},
96 +{"PG",GPIO_PIN_DATA_BASE+6*16*4,224+0},
97 +{"PH",GPIO_PIN_DATA_BASE+7*16*4,224+0},
98 +{"PDMA0",PDMA0_BASE,0},
99 +{"PDMA1",PDMA1_BASE,PDMA1_Attr},
100 +{"USBH",USBH_BASE,USBH_Attr},
101 +{"FMC",FMC_BASE,0},
102 +{"SDH0",SDH0_BASE,SDH0_Attr},
103 +{"EBI",EBI_BASE,EBI_Attr},
104 +{"SCU",SCU_BASE,0},
105 +{"CRC",CRC_BASE,CRC_Attr},
106 +{"CRPT",CRPT_BASE,CRPT_Attr},
107 +{"WDT",WDT_BASE,0},
108 +{"WWDT",WWDT_BASE,0},
109 +{"RTC",RTC_BASE,RTC_Attr},
110 +{"EADC",EADC_BASE,EADC_Attr},
111 +{"ACMP01",ACMP01_BASE,ACMP01_Attr},
112 +{"DAC0",DAC0_BASE,DAC_Attr},
113 +{"DAC1",DAC1_BASE,DAC_Attr},
114 +{"I2S0",I2S0_BASE,I2S0_Attr},
115 +{"OTG",OTG_BASE,OTG_Attr},
116 +{"TMR01",TMR01_BASE,0},
117 +{"TMR23",TMR23_BASE,TMR23_Attr},
118 +{"EPWM0",EPWM0_BASE,EPWM0_Attr},
119 +{"EPWM1",EPWM1_BASE,EPWM1_Attr},
120 +{"BPWM0",BPWM0_BASE,BPWM0_Attr},
121 +{"BPWM1",BPWM1_BASE,BPWM1_Attr},
122 +{"QSPI0",QSPI0_BASE,QSPI0_Attr},
123 +{"SPI0",SPI0_BASE,SPI0_Attr},
124 +{"SPI1",SPI1_BASE,SPI1_Attr},
125 +{"SPI2",SPI2_BASE,SPI2_Attr},
126 +{"SPI3",SPI3_BASE,SPI3_Attr},
127 +{"UART0",UART0_BASE,UART0_Attr},
128 +{"UART1",UART1_BASE,UART1_Attr},
129 +{"UART2",UART2_BASE,UART2_Attr},
130 +{"UART3",UART3_BASE,UART3_Attr},
131 +{"UART4",UART4_BASE,UART4_Attr},
132 +{"UART5",UART5_BASE,UART5_Attr},
133 +{"I2C0",I2C0_BASE,I2C0_Attr},
134 +{"I2C1",I2C1_BASE,I2C1_Attr},
135 +{"I2C2",I2C2_BASE,I2C2_Attr},
136 +{"SC0",SC0_BASE,SC0_Attr},
137 +{"SC1",SC1_BASE,SC1_Attr},
138 +{"SC2",SC2_BASE,SC2_Attr},
139 +{"CAN0",CAN0_BASE,CAN0_Attr},
140 +{"QEI0",QEI0_BASE,QEI0_Attr},
141 +{"QEI1",QEI1_BASE,QEI1_Attr},
142 +{"ECAP0",ECAP0_BASE,ECAP0_Attr},
143 +{"ECAP1",ECAP1_BASE,ECAP1_Attr},
144 +{"TRNG",TRNG_BASE,TRNG_Attr},
145 +{"USBD",USBD_BASE,USBD_Attr},
146 +{"USCI0",USCI0_BASE, USCI0_Attr},
147 +{"USCI1",USCI1_BASE, USCI1_Attr},
148 +{0,USCI1_BASE+4096, 0},
149 +};
150 +#endif
151 +
152 +int kbhit(void);
153 +int IsDebugFifoEmpty(void);
154 +void _ttywrch(int ch);
155 +int fputc(int ch, FILE *stream);
156 +
157 +#if (defined(__ARMCC_VERSION) || defined(__ICCARM__))
158 +int fgetc(FILE *stream);
159 +int ferror(FILE *stream);
160 +#endif
161 +
162 +char GetChar(void);
163 +void SendChar_ToUART(int ch);
164 +void SendChar(int ch);
165 +int32_t SH_Return(int32_t n32In_R0, int32_t n32In_R1, int32_t *pn32Out_R0);
166 +void _sys_exit(int return_code)__attribute__((noreturn));
167 +
168 +#if (defined(DEBUG_ENABLE_SEMIHOST) || defined(OS_USE_SEMIHOSTING))
169 +#if (defined(__ARMCC_VERSION) || defined(__ICCARM__) || defined(__GNUC__))
170 +/* The static buffer is used to speed up the semihost */
171 +static char g_buf[16];
172 +static char g_buf_len = 0;
173 +static volatile int32_t g_ICE_Conneced = 1;
174 +
175 +/**
176 + * @brief This function is called by Hardfault handler.
177 + * @param None
178 + * @returns None
179 + * @details This function is called by Hardfault handler and check if it is caused by __BKPT or not.
180 + *
181 + */
182 +
183 +uint32_t ProcessHardFault(uint32_t lr, uint32_t msp, uint32_t psp)
184 +{
185 + uint32_t *sp = 0;
186 + uint32_t inst;
187 +
188 + /* Check the used stack */
189 + if(lr & 0x40)
190 + {
191 + /* Secure stack used */
192 + if(lr & 4)
193 + sp = (uint32_t *)psp;
194 + else
195 + sp = (uint32_t *)msp;
196 +
197 + }
198 +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
199 + else
200 + {
201 + /* Non-secure stack used */
202 + if(lr & 4)
203 + sp = (uint32_t *)__TZ_get_PSP_NS();
204 + else
205 + sp = (uint32_t *)__TZ_get_MSP_NS();
206 +
207 + }
208 +#endif
209 +
210 + if (sp != 0)
211 + {
212 + /* Get the instruction caused the hardfault */
213 + inst = M16(sp[6]);
214 +
215 +
216 + if(inst == 0xBEAB)
217 + {
218 + /*
219 + If the instruction is 0xBEAB, it means it is caused by BKPT without ICE connected.
220 + We still return for output/input message to UART.
221 + */
222 + g_ICE_Conneced = 0; // Set a flag for ICE offline
223 + sp[6] += 2; // return to next instruction
224 + return lr; // Keep lr in R0
225 + }
226 + }
227 +
228 + /* It is casued by hardfault (Not semihost). Just process the hard fault here. */
229 + /* TODO: Implement your hardfault handle code here */
230 +
231 + /*
232 + printf(" HardFault!\n\n");
233 + printf("r0 = 0x%x\n", sp[0]);
234 + printf("r1 = 0x%x\n", sp[1]);
235 + printf("r2 = 0x%x\n", sp[2]);
236 + printf("r3 = 0x%x\n", sp[3]);
237 + printf("r12 = 0x%x\n", sp[4]);
238 + printf("lr = 0x%x\n", sp[5]);
239 + printf("pc = 0x%x\n", sp[6]);
240 + printf("psr = 0x%x\n", sp[7]);
241 + */
242 +
243 + while(1){}
244 +
245 +}
246 +
247 +
248 +
249 +/**
250 + *
251 + * @brief The function to process semihosted command
252 + * @param[in] n32In_R0 : semihost register 0
253 + * @param[in] n32In_R1 : semihost register 1
254 + * @param[out] pn32Out_R0: semihost register 0
255 + * @retval 0: No ICE debug
256 + * @retval 1: ICE debug
257 + *
258 + */
259 +
260 +int32_t SH_Return(int32_t n32In_R0, int32_t n32In_R1, int32_t *pn32Out_R0)
261 +{
262 + (void)n32In_R1;
263 + if(g_ICE_Conneced)
264 + {
265 + if(pn32Out_R0)
266 + *pn32Out_R0 = n32In_R0;
267 +
268 + return 1;
269 + }
270 + return 0;
271 +}
272 +
273 +
274 +
275 +#endif
276 +#else // defined(DEBUG_ENABLE_SEMIHOST)
277 +
278 +int32_t SH_Return(int32_t n32In_R0, int32_t n32In_R1, int32_t *pn32Out_R0);
279 +
280 +#if defined( __ICCARM__ )
281 +__WEAK
282 +#else
283 +__attribute__((weak))
284 +#endif
285 +uint32_t ProcessHardFault(uint32_t lr, uint32_t msp, uint32_t psp)
286 +{
287 + extern void SCU_IRQHandler(void);
288 + uint32_t *sp = 0ul;
289 + uint32_t i;
290 + uint32_t inst, addr,taddr = 0ul,tdata;
291 + int32_t secure;
292 + uint32_t rm,rn,rt, imm5, imm8;
293 + int32_t eFlag;
294 + uint8_t idx, bit;
295 + int32_t s;
296 +
297 + /* Check the used stack */
298 + secure = (lr & 0x40ul)?1ul:0ul;
299 + if(secure)
300 + {
301 + /* Secure stack used */
302 + if(lr & 4UL)
303 + {
304 + sp = (uint32_t *)psp;
305 + }
306 + else
307 + {
308 + sp = (uint32_t *)msp;
309 + }
310 +
311 + }
312 +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)
313 + else
314 + {
315 + /* Non-secure stack used */
316 + if(lr & 4)
317 + sp = (uint32_t *)(uint32_t)__TZ_get_PSP_NS();
318 + else
319 + sp = (uint32_t *)(uint32_t)__TZ_get_MSP_NS();
320 +
321 + }
322 +#endif
323 +
324 + /*
325 + r0 = sp[0]
326 + r1 = sp[1]
327 + r2 = sp[2]
328 + r3 = sp[3]
329 + r12 = sp[4]
330 + lr = sp[5]
331 + pc = sp[6]
332 + psr = sp[7]
333 + */
334 +
335 + printf("!!---------------------------------------------------------------!!\n");
336 + printf(" <<< HardFault >>>\n");
337 + /* Get the instruction caused the hardfault */
338 + addr = sp[6];
339 + inst = M16(addr);
340 + eFlag = 0;
341 + if((!secure) && ((addr & NS_OFFSET) == 0) )
342 + {
343 + printf(" Non-secure CPU try to fetch secure code in 0x%x\n", addr);
344 + printf(" Try to check NSC region or SAU settings.\n");
345 +
346 + eFlag = 1;
347 + }else if(inst == 0xBEAB)
348 + {
349 + printf(" Execute BKPT without ICE connected\n");
350 + eFlag = 2;
351 + }
352 + else if((inst >> 12) == 5)
353 + {
354 + eFlag = 3;
355 + /* 0101xx Load/store (register offset) on page C2-327 of armv8m ref */
356 + rm = (inst >> 6) & 0x7;
357 + rn = (inst >> 3) & 0x7;
358 + rt = inst & 0x7;
359 +
360 + taddr = sp[rn] + sp[rm];
361 + tdata = sp[rt];
362 + if(rn == rt)
363 + {
364 + printf(" [0x%08x] 0x%04x %s R%d [0x%x]\n",addr, inst,
365 + (inst&BIT11)?"LDR":"STR",rt, taddr);
366 + }
367 + else
368 + {
369 + printf(" [0x%08x] 0x%04x %s 0x%x [0x%x]\n",addr, inst,
370 + (inst&BIT11)?"LDR":"STR",tdata, taddr);
371 + }
372 +
373 + }
374 + else if((inst >> 13) == 3)
375 + {
376 + eFlag = 3;
377 + /* 011xxx Load/store word/byte (immediate offset) on page C2-327 of armv8m ref */
378 + imm5 = (inst >> 6) & 0x1f;
379 + rn = (inst >> 3) & 0x7;
380 + rt = inst & 0x7;
381 +
382 + taddr = sp[rn] + imm5;
383 + tdata = sp[rt];
384 + if(rt == rn)
385 + {
386 + printf(" [0x%08x] 0x%04x %s R%d [0x%x]\n",addr, inst,
387 + (inst&BIT11)?"LDR":"STR",rt, taddr);
388 + }
389 + else
390 + {
391 + printf(" [0x%08x] 0x%04x %s 0x%x [0x%x]\n",addr, inst,
392 + (inst&BIT11)?"LDR":"STR",tdata, taddr);
393 + }
394 + }
395 + else if((inst >> 12) == 8)
396 + {
397 + eFlag = 3;
398 + /* 1000xx Load/store halfword (immediate offset) on page C2-328 */
399 + imm5 = (inst >> 6) & 0x1f;
400 + rn = (inst >> 3) & 0x7;
401 + rt = inst & 0x7;
402 +
403 + taddr = sp[rn] + imm5;
404 + tdata = sp[rt];
405 + if(rt == rn)
406 + {
407 + printf(" [0x%08x] 0x%04x %s R%d [0x%x]\n",addr, inst,
408 + (inst&BIT11)?"LDR":"STR",rt, taddr);
409 + }
410 + else
411 + {
412 + printf(" [0x%08x] 0x%04x %s 0x%x [0x%x]\n",addr, inst,
413 + (inst&BIT11)?"LDR":"STR",tdata, taddr);
414 + }
415 +
416 + }
417 + else if((inst >> 12) == 9)
418 + {
419 + eFlag = 3;
420 + /* 1001xx Load/store (SP-relative) on page C2-328 */
421 + imm8 = inst & 0xff;
422 + rt = (inst >> 8) & 0x7;
423 +
424 + taddr = sp[6] + imm8;
425 + tdata = sp[rt];
426 + printf(" [0x%08x] 0x%04x %s 0x%x [0x%x]\n",addr, inst,
427 + (inst&BIT11)?"LDR":"STR",tdata, taddr);
428 + }
429 + else
430 + {
431 + eFlag = 4;
432 + printf(" Unexpected instruction: 0x%04x \n", inst);
433 + }
434 +
435 + if(eFlag == 3)
436 + {
437 + /* It is LDR/STR hardfault */
438 + if(!secure)
439 + {
440 + /* It is happened in Nonsecure code */
441 +
442 + for(i=0;i< (uint32_t)(sizeof(s_IpTbl)/sizeof(IP_T)-1);i++)
443 + {
444 + /* Case 1: Nonsecure code try to access secure IP. It also causes SCU violation */
445 + if((taddr >= s_IpTbl[i].u32Addr) && (taddr < (s_IpTbl[i+1].u32Addr)))
446 + {
447 + idx = s_IpTbl[i].u8NSIdx;
448 + bit = idx & 0x1f;
449 + idx = idx >> 5;
450 + s = (SCU->PNSSET[idx] >> bit) & 1ul;
451 + printf(" Illegal access to %s %s in Nonsecure code.\n",(s)?"Nonsecure":"Secure", s_IpTbl[i].name);
452 + break;
453 + }
454 +
455 + /* Case 2: Nonsecure code try to access Nonsecure IP but the IP is secure IP */
456 + if((taddr >= (s_IpTbl[i].u32Addr+NS_OFFSET)) && (taddr < (s_IpTbl[i+1].u32Addr+NS_OFFSET)))
457 + {
458 + idx = s_IpTbl[i].u8NSIdx;
459 + bit = idx & 0x1f;
460 + idx = idx >> 5;
461 + s = (SCU->PNSSET[idx] >> bit) & 1ul;
462 + printf(" Illegal access to %s %s in Nonsecure code.\nIt may be set as secure IP here.\n",(s)?"Nonsecure":"Secure", s_IpTbl[i].name);
463 + break;
464 + }
465 + }
466 + }
467 + else
468 + {
469 + /* It is happened in secure code */
470 +
471 +
472 + if(taddr > NS_OFFSET)
473 + {
474 + /* Case 3: Secure try to access secure IP through Nonsecure address. It also causes SCU violation */
475 + for(i=0;i< (uint32_t)(sizeof(s_IpTbl)/sizeof(IP_T)-1);i++)
476 + {
477 + if((taddr >= (s_IpTbl[i].u32Addr+NS_OFFSET)) && (taddr < (s_IpTbl[i+1].u32Addr+NS_OFFSET)))
478 + {
479 + idx = s_IpTbl[i].u8NSIdx;
480 + bit = idx & 0x1f;
481 + idx = idx >> 5;
482 + s = (SCU->PNSSET[idx] >> bit) & 1ul;
483 + printf(" Illegal to use Nonsecure address to access %s %s in Secure code\n",(s)?"Nonsecure":"Secure", s_IpTbl[i].name);
484 + break;
485 + }
486 + }
487 + }
488 +
489 +
490 + }
491 + }
492 +
493 + SCU_IRQHandler();
494 +
495 + printf("!!---------------------------------------------------------------!!\n");
496 +
497 + /* Or *sp to remove compiler warning */
498 + while(1U|*sp){}
499 +
500 + return lr;
501 +}
502 +
503 +
504 +int32_t SH_Return(int32_t n32In_R0, int32_t n32In_R1, int32_t *pn32Out_R0)
505 +{
506 + (void)n32In_R0;
507 + (void)n32In_R1;
508 + (void)pn32Out_R0;
509 + return 0;
510 +}
511 +
512 +#endif /* defined(DEBUG_ENABLE_SEMIHOST) */
513 +
514 +
515 +/**
516 + * @brief Routine to send a char
517 + *
518 + * @param[in] ch A character data writes to debug port
519 + *
520 + * @returns Send value from UART debug port
521 + *
522 + * @details Send a target char to UART debug port .
523 + */
524 +#ifndef NONBLOCK_PRINTF
525 +void SendChar_ToUART(int ch)
526 +{
527 +
528 + while(DEBUG_PORT->FIFOSTS & UART_FIFOSTS_TXFULL_Msk){}
529 + if((char)ch == '\n')
530 + {
531 + DEBUG_PORT->DAT = '\r';
532 + while(DEBUG_PORT->FIFOSTS & UART_FIFOSTS_TXFULL_Msk){}
533 + }
534 + DEBUG_PORT->DAT = (uint32_t)ch;
535 +}
536 +
537 +#else
538 +/* Non-block implement of send char */
539 +# define BUF_SIZE 512
540 +void SendChar_ToUART(int ch)
541 +{
542 + static uint8_t u8Buf[BUF_SIZE] = {0};
543 + static int32_t i32Head = 0;
544 + static int32_t i32Tail = 0;
545 + int32_t i32Tmp;
546 +
547 + /* Only flush the data in buffer to UART when ch == 0 */
548 + if(ch)
549 + {
550 + // Push char
551 + if(ch == '\n')
552 + {
553 + i32Tmp = i32Head+1;
554 + if(i32Tmp > BUF_SIZE) i32Tmp = 0;
555 + if(i32Tmp != i32Tail)
556 + {
557 + u8Buf[i32Head] = '\r';
558 + i32Head = i32Tmp;
559 + }
560 + }
561 +
562 + i32Tmp = i32Head+1;
563 + if(i32Tmp > BUF_SIZE) i32Tmp = 0;
564 + if(i32Tmp != i32Tail)
565 + {
566 + u8Buf[i32Head] = ch;
567 + i32Head = i32Tmp;
568 + }
569 + }
570 + else
571 + {
572 + if(i32Tail == i32Head)
573 + return;
574 + }
575 +
576 + // pop char
577 + do
578 + {
579 + i32Tmp = i32Tail + 1;
580 + if(i32Tmp > BUF_SIZE) i32Tmp = 0;
581 +
582 + if((DEBUG_PORT->FSR & UART_FSR_TX_FULL_Msk) == 0)
583 + {
584 + DEBUG_PORT->DATA = u8Buf[i32Tail];
585 + i32Tail = i32Tmp;
586 + }
587 + else
588 + break; // FIFO full
589 + }while(i32Tail != i32Head);
590 +}
591 +#endif
592 +
593 +/**
594 + * @brief Routine to send a char
595 + *
596 + * @param[in] ch A character data writes to debug port
597 + *
598 + * @returns Send value from UART debug port or semihost
599 + *
600 + * @details Send a target char to UART debug port or semihost.
601 + */
602 +void SendChar(int ch)
603 +{
604 +#if defined(DEBUG_ENABLE_SEMIHOST)
605 +
606 + g_buf[(uint8_t)g_buf_len++] = (char)ch;
607 + g_buf[(uint8_t)g_buf_len] = '\0';
608 + if(g_buf_len + 1 >= sizeof(g_buf) || ch == '\n' || ch == '\0')
609 + {
610 + /* Send the char */
611 + if(g_ICE_Conneced)
612 + {
613 +
614 + if(SH_DoCommand(0x04, (int)g_buf, NULL) != 0)
615 + {
616 + g_buf_len = 0;
617 +
618 + return;
619 + }
620 + }
621 + else
622 + {
623 +# if (DEBUG_ENABLE_SEMIHOST == 2) // Re-direct to UART Debug Port only when DEBUG_ENABLE_SEMIHOST=2
624 + int i;
625 +
626 + for(i = 0; i < g_buf_len; i++)
627 + SendChar_ToUART(g_buf[i]);
628 + g_buf_len = 0;
629 +# endif
630 + }
631 + }
632 +#else
633 + SendChar_ToUART(ch);
634 +#endif
635 +}
636 +
637 +/**
638 + * @brief Routine to get a char
639 + *
640 + * @param None
641 + *
642 + * @returns Get value from UART debug port or semihost
643 + *
644 + * @details Wait UART debug port or semihost to input a char.
645 + */
646 +char GetChar(void)
647 +{
648 +#ifdef DEBUG_ENABLE_SEMIHOST
649 +# if defined (__ICCARM__)
650 + int nRet;
651 + while(SH_DoCommand(0x7, 0, &nRet) != 0)
652 + {
653 + if(nRet != 0)
654 + return (char)nRet;
655 + }
656 +# else
657 + int nRet;
658 + while(SH_DoCommand(0x101, 0, &nRet) != 0)
659 + {
660 + if(nRet != 0)
661 + {
662 + SH_DoCommand(0x07, 0, &nRet);
663 + return (char)nRet;
664 + }
665 + }
666 +
667 +
668 +# if (DEBUG_ENABLE_SEMIHOST == 2) // Re-direct to UART Debug Port only when DEBUG_ENABLE_SEMIHOST=2
669 +
670 + /* Use debug port when ICE is not connected at semihost mode */
671 + while(!g_ICE_Conneced)
672 + {
673 + if((DEBUG_PORT->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk) == 0)
674 + {
675 + return (DEBUG_PORT->DAT);
676 + }
677 + }
678 +# endif
679 +
680 +# endif
681 + return (0);
682 +#else
683 +
684 + while(1)
685 + {
686 + if((DEBUG_PORT->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk) == 0U)
687 + {
688 + return ((char)DEBUG_PORT->DAT);
689 + }
690 + }
691 +
692 +#endif
693 +}
694 +
695 +/**
696 + * @brief Check any char input from UART
697 + *
698 + * @param None
699 + *
700 + * @retval 1: No any char input
701 + * @retval 0: Have some char input
702 + *
703 + * @details Check UART RSR RX EMPTY or not to determine if any char input from UART
704 + */
705 +
706 +int kbhit(void)
707 +{
708 + return !((DEBUG_PORT->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk) == 0U);
709 +}
710 +/**
711 + * @brief Check if debug message finished
712 + *
713 + * @param None
714 + *
715 + * @retval 1: Message is finished
716 + * @retval 0: Message is transmitting.
717 + *
718 + * @details Check if message finished (FIFO empty of debug port)
719 + */
720 +
721 +int IsDebugFifoEmpty(void)
722 +{
723 + return ((DEBUG_PORT->FIFOSTS & UART_FIFOSTS_TXEMPTYF_Msk) != 0U);
724 +}
725 +
726 +/**
727 + * @brief C library retargetting
728 + *
729 + * @param[in] ch Write a character data
730 + *
731 + * @returns None
732 + *
733 + * @details Check if message finished (FIFO empty of debug port)
734 + */
735 +
736 +void _ttywrch(int ch)
737 +{
738 + SendChar(ch);
739 + return;
740 +}
741 +
742 +
743 +/**
744 + * @brief Write character to stream
745 + *
746 + * @param[in] ch Character to be written. The character is passed as its int promotion.
747 + * @param[in] stream Pointer to a FILE object that identifies the stream where the character is to be written.
748 + *
749 + * @returns If there are no errors, the same character that has been written is returned.
750 + * If an error occurs, EOF is returned and the error indicator is set (see ferror).
751 + *
752 + * @details Writes a character to the stream and advances the position indicator.\n
753 + * The character is written at the current position of the stream as indicated \n
754 + * by the internal position indicator, which is then advanced one character.
755 + *
756 + * @note The above descriptions are copied from http://www.cplusplus.com/reference/clibrary/cstdio/fputc/.
757 + *
758 + *
759 + */
760 +
761 +int fputc(int ch, FILE *stream)
762 +{
763 + (void)stream;
764 + SendChar(ch);
765 + return ch;
766 +}
767 +
768 +
769 +#if (defined(__GNUC__) && !defined(__ARMCC_VERSION))
770 +
771 +#if !defined(OS_USE_SEMIHOSTING)
772 +int _write (int fd, char *ptr, int len)
773 +{
774 + int i = len;
775 +
776 + while(i--) {
777 + while(DEBUG_PORT->FIFOSTS & UART_FIFOSTS_TXFULL_Msk);
778 +
779 + if(*ptr == '\n') {
780 + DEBUG_PORT->DAT = '\r';
781 + while(DEBUG_PORT->FIFOSTS & UART_FIFOSTS_TXFULL_Msk);
782 + }
783 +
784 + DEBUG_PORT->DAT = *ptr++;
785 + }
786 + return len;
787 +}
788 +
789 +int _read (int fd, char *ptr, int len)
790 +{
791 +
792 + while((DEBUG_PORT->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk) != 0);
793 + *ptr = DEBUG_PORT->DAT;
794 + return 1;
795 +
796 +
797 +}
798 +#endif
799 +
800 +#else
801 +/**
802 + * @brief Get character from UART debug port or semihosting input
803 + *
804 + * @param[in] stream Pointer to a FILE object that identifies the stream on which the operation is to be performed.
805 + *
806 + * @returns The character read from UART debug port or semihosting
807 + *
808 + * @details For get message from debug port or semihosting.
809 + *
810 + */
811 +
812 +int fgetc(FILE *stream)
813 +{
814 + (void)stream;
815 + return ((int)GetChar());
816 +}
817 +
818 +/**
819 + * @brief Check error indicator
820 + *
821 + * @param[in] stream Pointer to a FILE object that identifies the stream.
822 + *
823 + * @returns If the error indicator associated with the stream was set, the function returns a nonzero value.
824 + * Otherwise, it returns a zero value.
825 + *
826 + * @details Checks if the error indicator associated with stream is set, returning a value different
827 + * from zero if it is. This indicator is generally set by a previous operation on the stream that failed.
828 + *
829 + * @note The above descriptions are copied from http://www.cplusplus.com/reference/clibrary/cstdio/ferror/.
830 + *
831 + */
832 +
833 +int ferror(FILE *stream)
834 +{
835 + (void)stream;
836 + return EOF;
837 +}
838 +#endif
839 +
840 +#ifdef DEBUG_ENABLE_SEMIHOST
841 +# ifdef __ICCARM__
842 +void __exit(int return_code)
843 +{
844 +
845 + /* Check if link with ICE */
846 + if(SH_DoCommand(0x18, 0x20026, NULL) == 0)
847 + {
848 + /* Make sure all message is print out */
849 + while(IsDebugFifoEmpty() == 0);
850 + }
851 +label:
852 + goto label; /* endless loop */
853 +}
854 +# else
855 +void _sys_exit(int return_code)
856 +{
857 + (void)return_code;
858 + /* Check if link with ICE */
859 + if(SH_DoCommand(0x18, 0x20026, NULL) == 0)
860 + {
861 + /* Make sure all message is print out */
862 + while(IsDebugFifoEmpty() == 0);
863 + }
864 +label:
865 + goto label; /* endless loop */
866 +}
867 +# endif
868 +#endif
869 +
870 +
871 +
872 +/*** (C) COPYRIGHT 2016-2020 Nuvoton Technology Corp. ***/
873 +
874 +
1 +;/**************************************************************************//**
2 +; * @file startup_M2351.s
3 +; * @version V2.00
4 +; * $Revision: 9 $
5 +; * $Date: 16/08/27 12:33p $
6 +; * @brief Startup Source File
7 +; *
8 +; * @note
9 +; * SPDX-License-Identifier: Apache-2.0
10 +; * Copyright (C) 2016-2020 Nuvoton Technology Corp. All rights reserved.
11 +; *
12 +; ******************************************************************************/
13 +
14 +
15 +;/*
16 +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------
17 +;*/
18 +; <h> Stack Configuration
19 +; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
20 +; </h>
21 +
22 + IF :LNOT: :DEF: Stack_Size
23 +Stack_Size EQU 0x00001000
24 + ENDIF
25 +
26 + AREA STACK, NOINIT, READWRITE, ALIGN=3
27 +Stack_Mem SPACE Stack_Size
28 +__initial_sp
29 +
30 +
31 +; <h> Heap Configuration
32 +; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
33 +; </h>
34 +
35 + IF :LNOT: :DEF: Heap_Size
36 +Heap_Size EQU 0x00002800
37 + ENDIF
38 +
39 + AREA HEAP, NOINIT, READWRITE, ALIGN=3
40 +__heap_base
41 +Heap_Mem SPACE Heap_Size
42 +__heap_limit
43 +
44 +
45 + PRESERVE8
46 + THUMB
47 +
48 +
49 +; Vector Table Mapped to Address 0 at Reset
50 +
51 + AREA RESET, DATA, READONLY
52 + EXPORT __Vectors
53 + EXPORT __Vectors_End
54 + EXPORT __Vectors_Size
55 + IMPORT SCU_IRQHandler
56 +
57 +
58 +__Vectors DCD __initial_sp ; Top of Stack
59 + DCD Reset_Handler ; Reset Handler
60 + DCD NMI_Handler ; NMI Handler
61 + DCD HardFault_Handler ; Hard Fault Handler
62 + DCD 0 ; Reserved
63 + DCD 0 ; Reserved
64 + DCD 0 ; Reserved
65 + DCD 0 ; Reserved
66 + DCD 0 ; Reserved
67 + DCD 0 ; Reserved
68 + DCD 0 ; Reserved
69 + DCD SVC_Handler ; SVCall Handler
70 + DCD 0 ; Reserved
71 + DCD 0 ; Reserved
72 + DCD PendSV_Handler ; PendSV Handler
73 + DCD SysTick_Handler ; SysTick Handler
74 +
75 + ; External Interrupts
76 + ; maximum of 32 External Interrupts are possible
77 + DCD BOD_IRQHandler ; 0
78 + DCD IRC_IRQHandler ; 1
79 + DCD PWRWU_IRQHandler ; 2
80 + DCD SRAM_IRQHandler ; 3
81 + DCD CLKFAIL_IRQHandler ; 4
82 + DCD DEFAULT_IRQHandler ; 5
83 + DCD RTC_IRQHandler ; 6
84 + DCD TAMPER_IRQHandler ; 7
85 + DCD WDT_IRQHandler ; 8
86 + DCD WWDT_IRQHandler ; 9
87 + DCD EINT0_IRQHandler ; 10
88 + DCD EINT1_IRQHandler ; 11
89 + DCD EINT2_IRQHandler ; 12
90 + DCD EINT3_IRQHandler ; 13
91 + DCD EINT4_IRQHandler ; 14
92 + DCD EINT5_IRQHandler ; 15
93 + DCD GPA_IRQHandler ; 16
94 + DCD GPB_IRQHandler ; 17
95 + DCD GPC_IRQHandler ; 18
96 + DCD GPD_IRQHandler ; 19
97 + DCD GPE_IRQHandler ; 20
98 + DCD GPF_IRQHandler ; 21
99 + DCD QSPI0_IRQHandler ; 22
100 + DCD SPI0_IRQHandler ; 23
101 + DCD BRAKE0_IRQHandler ; 24
102 + DCD EPWM0_P0_IRQHandler ; 25
103 + DCD EPWM0_P1_IRQHandler ; 26
104 + DCD EPWM0_P2_IRQHandler ; 27
105 + DCD BRAKE1_IRQHandler ; 28
106 + DCD EPWM1_P0_IRQHandler ; 29
107 + DCD EPWM1_P1_IRQHandler ; 30
108 + DCD EPWM1_P2_IRQHandler ; 31
109 + DCD TMR0_IRQHandler ; 32
110 + DCD TMR1_IRQHandler ; 33
111 + DCD TMR2_IRQHandler ; 34
112 + DCD TMR3_IRQHandler ; 35
113 + DCD UART0_IRQHandler ; 36
114 + DCD UART1_IRQHandler ; 37
115 + DCD I2C0_IRQHandler ; 38
116 + DCD I2C1_IRQHandler ; 39
117 + DCD PDMA0_IRQHandler ; 40
118 + DCD DAC_IRQHandler ; 41
119 + DCD EADC0_IRQHandler ; 42
120 + DCD EADC1_IRQHandler ; 43
121 + DCD ACMP01_IRQHandler ; 44
122 + DCD DEFAULT_IRQHandler ; 45
123 + DCD EADC2_IRQHandler ; 46
124 + DCD EADC3_IRQHandler ; 47
125 + DCD UART2_IRQHandler ; 48
126 + DCD UART3_IRQHandler ; 49
127 + DCD DEFAULT_IRQHandler ; 50
128 + DCD SPI1_IRQHandler ; 51
129 + DCD SPI2_IRQHandler ; 52
130 + DCD USBD_IRQHandler ; 53
131 + DCD USBH_IRQHandler ; 54
132 + DCD USBOTG_IRQHandler ; 55
133 + DCD CAN0_IRQHandler ; 56
134 + DCD DEFAULT_IRQHandler ; 57
135 + DCD SC0_IRQHandler ; 58
136 + DCD SC1_IRQHandler ; 59
137 + DCD SC2_IRQHandler ; 60
138 + DCD DEFAULT_IRQHandler ; 61
139 + DCD SPI3_IRQHandler ; 62
140 + DCD DEFAULT_IRQHandler ; 63
141 + DCD SDH0_IRQHandler ; 64
142 + DCD DEFAULT_IRQHandler ; 65
143 + DCD DEFAULT_IRQHandler ; 66
144 + DCD DEFAULT_IRQHandler ; 67
145 + DCD I2S0_IRQHandler ; 68
146 + DCD DEFAULT_IRQHandler ; 69
147 + DCD OPA0_IRQHandler ; 70
148 + DCD CRPT_IRQHandler ; 71
149 + DCD GPG_IRQHandler ; 72
150 + DCD EINT6_IRQHandler ; 73
151 + DCD UART4_IRQHandler ; 74
152 + DCD UART5_IRQHandler ; 75
153 + DCD USCI0_IRQHandler ; 76
154 + DCD USCI1_IRQHandler ; 77
155 + DCD BPWM0_IRQHandler ; 78
156 + DCD BPWM1_IRQHandler ; 79
157 + DCD DEFAULT_IRQHandler ; 80
158 + DCD DEFAULT_IRQHandler ; 81
159 + DCD I2C2_IRQHandler ; 82
160 + DCD DEFAULT_IRQHandler ; 83
161 + DCD QEI0_IRQHandler ; 84
162 + DCD QEI1_IRQHandler ; 85
163 + DCD ECAP0_IRQHandler ; 86
164 + DCD ECAP1_IRQHandler ; 87
165 + DCD GPH_IRQHandler ; 88
166 + DCD EINT7_IRQHandler ; 89
167 + DCD DEFAULT_IRQHandler ; 90
168 + DCD DEFAULT_IRQHandler ; 91
169 + DCD DEFAULT_IRQHandler ; 92
170 + DCD DEFAULT_IRQHandler ; 93
171 + DCD DEFAULT_IRQHandler ; 94
172 + DCD DEFAULT_IRQHandler ; 95
173 + DCD DEFAULT_IRQHandler ; 96
174 + DCD DEFAULT_IRQHandler ; 97
175 + DCD PDMA1_IRQHandler ; 98
176 + DCD SCU_IRQHandler ; 99
177 + DCD DEFAULT_IRQHandler ; 100
178 + DCD TRNG_IRQHandler ; 101
179 +
180 +
181 +
182 +__Vectors_End
183 +
184 +__Vectors_Size EQU __Vectors_End - __Vectors
185 +
186 + AREA |.text|, CODE, READONLY
187 +
188 +
189 +; Reset Handler
190 +
191 +Reset_Handler PROC
192 + EXPORT Reset_Handler [WEAK]
193 + IMPORT SystemInit
194 + IMPORT __main
195 +
196 +
197 + LDR R0, =SystemInit
198 + BLX R0
199 + LDR R0, =__main
200 + BX R0
201 + ENDP
202 +
203 +
204 +; Dummy Exception Handlers (infinite loops which can be modified)
205 +
206 +NMI_Handler PROC
207 + EXPORT NMI_Handler [WEAK]
208 + B .
209 + ENDP
210 +HardFault_Handler\
211 + PROC
212 + IMPORT ProcessHardFault
213 + EXPORT HardFault_Handler [WEAK]
214 + MOV R0, LR
215 + MRS R1, MSP
216 + MRS R2, PSP
217 + LDR R3, =ProcessHardFault
218 + BLX R3
219 + BX R0
220 + ENDP
221 +SVC_Handler PROC
222 + EXPORT SVC_Handler [WEAK]
223 + B .
224 + ENDP
225 +PendSV_Handler PROC
226 + EXPORT PendSV_Handler [WEAK]
227 + B .
228 + ENDP
229 +SysTick_Handler PROC
230 + EXPORT SysTick_Handler [WEAK]
231 + B .
232 + ENDP
233 +
234 +Default_Handler PROC
235 +
236 + EXPORT BOD_IRQHandler [WEAK] ; 0
237 + EXPORT IRC_IRQHandler [WEAK] ; 1
238 + EXPORT PWRWU_IRQHandler [WEAK] ; 2
239 + EXPORT SRAM_IRQHandler [WEAK] ; 3
240 + EXPORT CLKFAIL_IRQHandler [WEAK] ; 4
241 + ;EXPORT 0 [WEAK] ; 5
242 + EXPORT RTC_IRQHandler [WEAK] ; 6
243 + EXPORT TAMPER_IRQHandler [WEAK] ; 7
244 + EXPORT WDT_IRQHandler [WEAK] ; 8
245 + EXPORT WWDT_IRQHandler [WEAK] ; 9
246 + EXPORT EINT0_IRQHandler [WEAK] ; 10
247 + EXPORT EINT1_IRQHandler [WEAK] ; 11
248 + EXPORT EINT2_IRQHandler [WEAK] ; 12
249 + EXPORT EINT3_IRQHandler [WEAK] ; 13
250 + EXPORT EINT4_IRQHandler [WEAK] ; 14
251 + EXPORT EINT5_IRQHandler [WEAK] ; 15
252 + EXPORT GPA_IRQHandler [WEAK] ; 16
253 + EXPORT GPB_IRQHandler [WEAK] ; 17
254 + EXPORT GPC_IRQHandler [WEAK] ; 18
255 + EXPORT GPD_IRQHandler [WEAK] ; 19
256 + EXPORT GPE_IRQHandler [WEAK] ; 20
257 + EXPORT GPF_IRQHandler [WEAK] ; 21
258 + EXPORT QSPI0_IRQHandler [WEAK] ; 22
259 + EXPORT SPI0_IRQHandler [WEAK] ; 23
260 + EXPORT BRAKE0_IRQHandler [WEAK] ; 24
261 + EXPORT EPWM0_P0_IRQHandler [WEAK] ; 25
262 + EXPORT EPWM0_P1_IRQHandler [WEAK] ; 26
263 + EXPORT EPWM0_P2_IRQHandler [WEAK] ; 27
264 + EXPORT BRAKE1_IRQHandler [WEAK] ; 28
265 + EXPORT EPWM1_P0_IRQHandler [WEAK] ; 29
266 + EXPORT EPWM1_P1_IRQHandler [WEAK] ; 30
267 + EXPORT EPWM1_P2_IRQHandler [WEAK] ; 31
268 + EXPORT TMR0_IRQHandler [WEAK] ; 32
269 + EXPORT TMR1_IRQHandler [WEAK] ; 33
270 + EXPORT TMR2_IRQHandler [WEAK] ; 34
271 + EXPORT TMR3_IRQHandler [WEAK] ; 35
272 + EXPORT UART0_IRQHandler [WEAK] ; 36
273 + EXPORT UART1_IRQHandler [WEAK] ; 37
274 + EXPORT I2C0_IRQHandler [WEAK] ; 38
275 + EXPORT I2C1_IRQHandler [WEAK] ; 39
276 + EXPORT PDMA0_IRQHandler [WEAK] ; 40
277 + EXPORT DAC_IRQHandler [WEAK] ; 41
278 + EXPORT EADC0_IRQHandler [WEAK] ; 42
279 + EXPORT EADC1_IRQHandler [WEAK] ; 43
280 + EXPORT ACMP01_IRQHandler [WEAK] ; 44
281 + ;EXPORT 0 [WEAK] ; 45
282 + EXPORT EADC2_IRQHandler [WEAK] ; 46
283 + EXPORT EADC3_IRQHandler [WEAK] ; 47
284 + EXPORT UART2_IRQHandler [WEAK] ; 48
285 + EXPORT UART3_IRQHandler [WEAK] ; 49
286 + ;EXPORT 0 [WEAK] ; 50
287 + EXPORT SPI1_IRQHandler [WEAK] ; 51
288 + EXPORT SPI2_IRQHandler [WEAK] ; 52
289 + EXPORT USBD_IRQHandler [WEAK] ; 53
290 + EXPORT USBH_IRQHandler [WEAK] ; 54
291 + EXPORT USBOTG_IRQHandler [WEAK] ; 55
292 + EXPORT CAN0_IRQHandler [WEAK] ; 56
293 + EXPORT CAN1_IRQHandler [WEAK] ; 57
294 + EXPORT SC0_IRQHandler [WEAK] ; 58
295 + EXPORT SC1_IRQHandler [WEAK] ; 59
296 + EXPORT SC2_IRQHandler [WEAK] ; 60
297 + EXPORT SC3_IRQHandler [WEAK] ; 61
298 + EXPORT SPI3_IRQHandler [WEAK] ; 62
299 + ;EXPORT 0 [WEAK] ; 63
300 + EXPORT SDH0_IRQHandler [WEAK] ; 64
301 + ;EXPORT 0 [WEAK] ; 65
302 + ;EXPORT 0 [WEAK] ; 66
303 + ;EXPORT 0 [WEAK] ; 67
304 + EXPORT I2S0_IRQHandler [WEAK] ; 68
305 + ;EXPORT 0 [WEAK] ; 69
306 + EXPORT OPA0_IRQHandler [WEAK] ; 70
307 + EXPORT CRPT_IRQHandler [WEAK] ; 71
308 + EXPORT GPG_IRQHandler [WEAK] ; 72
309 + EXPORT EINT6_IRQHandler [WEAK] ; 73
310 + EXPORT UART4_IRQHandler [WEAK] ; 74
311 + EXPORT UART5_IRQHandler [WEAK] ; 75
312 + EXPORT USCI0_IRQHandler [WEAK] ; 76
313 + EXPORT USCI1_IRQHandler [WEAK] ; 77
314 + EXPORT BPWM0_IRQHandler [WEAK] ; 78
315 + EXPORT BPWM1_IRQHandler [WEAK] ; 79
316 + ;EXPORT 0 [WEAK] ; 80
317 + ;EXPORT 0 [WEAK] ; 81
318 + EXPORT I2C2_IRQHandler [WEAK] ; 82
319 + ;EXPORT 0 [WEAK] ; 83
320 + EXPORT QEI0_IRQHandler [WEAK] ; 84
321 + EXPORT QEI1_IRQHandler [WEAK] ; 85
322 + EXPORT ECAP0_IRQHandler [WEAK] ; 86
323 + EXPORT ECAP1_IRQHandler [WEAK] ; 87
324 + EXPORT GPH_IRQHandler [WEAK] ; 88
325 + EXPORT EINT7_IRQHandler [WEAK] ; 89
326 + EXPORT SDH1_IRQHandler [WEAK] ; 90
327 + ;EXPORT 0 [WEAK] ; 91
328 + ;EXPORT USBH_IRQHandler [WEAK] ; 92
329 + ;EXPORT 0 [WEAK] ; 93
330 + ;EXPORT 0 [WEAK] ; 94
331 + ;EXPORT 0 [WEAK] ; 95
332 + ;EXPORT 0 [WEAK] ; 96
333 + ;EXPORT 0 [WEAK] ; 97
334 + EXPORT PDMA1_IRQHandler [WEAK] ; 98
335 + ;EXPORT SCU_IRQHandler [WEAK] ; 99
336 + ;EXPORT 0 [WEAK] ; 100
337 + EXPORT TRNG_IRQHandler [WEAK] ; 101
338 +
339 +
340 +
341 + EXPORT DEFAULT_IRQHandler [WEAK]
342 +
343 +BOD_IRQHandler ; 0
344 +IRC_IRQHandler ; 1
345 +PWRWU_IRQHandler ; 2
346 +SRAM_IRQHandler ; 3
347 +CLKFAIL_IRQHandler ; 4
348 +;0 ; 5
349 +RTC_IRQHandler ; 6
350 +TAMPER_IRQHandler ; 7
351 +WDT_IRQHandler ; 8
352 +WWDT_IRQHandler ; 9
353 +EINT0_IRQHandler ; 10
354 +EINT1_IRQHandler ; 11
355 +EINT2_IRQHandler ; 12
356 +EINT3_IRQHandler ; 13
357 +EINT4_IRQHandler ; 14
358 +EINT5_IRQHandler ; 15
359 +GPA_IRQHandler ; 16
360 +GPB_IRQHandler ; 17
361 +GPC_IRQHandler ; 18
362 +GPD_IRQHandler ; 19
363 +GPE_IRQHandler ; 20
364 +GPF_IRQHandler ; 21
365 +QSPI0_IRQHandler ; 22
366 +SPI0_IRQHandler ; 23
367 +BRAKE0_IRQHandler ; 24
368 +EPWM0_P0_IRQHandler ; 25
369 +EPWM0_P1_IRQHandler ; 26
370 +EPWM0_P2_IRQHandler ; 27
371 +BRAKE1_IRQHandler ; 28
372 +EPWM1_P0_IRQHandler ; 29
373 +EPWM1_P1_IRQHandler ; 30
374 +EPWM1_P2_IRQHandler ; 31
375 +TMR0_IRQHandler ; 32
376 +TMR1_IRQHandler ; 33
377 +TMR2_IRQHandler ; 34
378 +TMR3_IRQHandler ; 35
379 +UART0_IRQHandler ; 36
380 +UART1_IRQHandler ; 37
381 +I2C0_IRQHandler ; 38
382 +I2C1_IRQHandler ; 39
383 +PDMA0_IRQHandler ; 40
384 +DAC_IRQHandler ; 41
385 +EADC0_IRQHandler ; 42
386 +EADC1_IRQHandler ; 43
387 +ACMP01_IRQHandler ; 44
388 +;0 ; 45
389 +EADC2_IRQHandler ; 46
390 +EADC3_IRQHandler ; 47
391 +UART2_IRQHandler ; 48
392 +UART3_IRQHandler ; 49
393 +;0 ; 50
394 +SPI1_IRQHandler ; 51
395 +SPI2_IRQHandler ; 52
396 +USBD_IRQHandler ; 53
397 +USBH_IRQHandler ; 54
398 +USBOTG_IRQHandler ; 55
399 +CAN0_IRQHandler ; 56
400 +CAN1_IRQHandler ; 57
401 +SC0_IRQHandler ; 58
402 +SC1_IRQHandler ; 59
403 +SC2_IRQHandler ; 60
404 +SC3_IRQHandler ; 61
405 +SPI3_IRQHandler ; 62
406 +;0 ; 63
407 +SDH0_IRQHandler ; 64
408 +;0 ; 65
409 +;0 ; 66
410 +;0 ; 67
411 +I2S0_IRQHandler ; 68
412 +;0 ; 69
413 +OPA0_IRQHandler ; 70
414 +CRPT_IRQHandler ; 71
415 +GPG_IRQHandler ; 72
416 +EINT6_IRQHandler ; 73
417 +UART4_IRQHandler ; 74
418 +UART5_IRQHandler ; 75
419 +USCI0_IRQHandler ; 76
420 +USCI1_IRQHandler ; 77
421 +BPWM0_IRQHandler ; 78
422 +BPWM1_IRQHandler ; 79
423 +;0 ; 80
424 +;0 ; 81
425 +I2C2_IRQHandler ; 82
426 +;0 ; 83
427 +QEI0_IRQHandler ; 84
428 +QEI1_IRQHandler ; 85
429 +ECAP0_IRQHandler ; 86
430 +ECAP1_IRQHandler ; 87
431 +GPH_IRQHandler ; 88
432 +EINT7_IRQHandler ; 89
433 +SDH1_IRQHandler ; 90
434 +;0 ; 91
435 +;USBH_IRQHandler ; 92
436 +;0 ; 93
437 +;0 ; 94
438 +;0 ; 95
439 +;0 ; 96
440 +;0 ; 97
441 +PDMA1_IRQHandler ; 98
442 +;SCU_IRQHandler ; 99
443 +;0 ; 100
444 +TRNG_IRQHandler ; 101
445 +DEFAULT_IRQHandler
446 + B .
447 + ENDP
448 +
449 + ALIGN
450 +
451 +
452 +; User Initial Stack & Heap
453 +
454 + IF :DEF:__MICROLIB
455 +
456 + EXPORT __initial_sp
457 + EXPORT __heap_base
458 + EXPORT __heap_limit
459 +
460 + ELSE
461 +
462 + IMPORT __use_two_region_memory
463 + EXPORT __user_initial_stackheap
464 +
465 +__user_initial_stackheap PROC
466 + LDR R0, = Heap_Mem
467 + LDR R1, = (Stack_Mem + Stack_Size)
468 + LDR R2, = (Heap_Mem + Heap_Size)
469 + LDR R3, = Stack_Mem
470 + BX LR
471 + ENDP
472 +
473 +
474 + ALIGN
475 +
476 + ENDIF
477 +
478 +;int32_t SH_DoCommand(int32_t n32In_R0, int32_t n32In_R1, int32_t *pn32Out_R0)
479 +SH_DoCommand PROC
480 +
481 + EXPORT SH_DoCommand
482 + IMPORT SH_Return
483 +
484 + BKPT 0xAB ; Wait ICE or HardFault
485 + LDR R3, =SH_Return
486 + MOV R4, lr
487 + BLX R3 ; Call SH_Return. The return value is in R0
488 + BX R4 ; Return value = R0
489 +
490 + ENDP
491 +
492 +__PC PROC
493 + EXPORT __PC
494 +
495 + MOV r0, lr
496 + BLX lr
497 + ALIGN
498 +
499 + ENDP
500 +
501 + END
1 +/**************************************************************************//**
2 + * @file system_M2351.c
3 + * @version V2.00
4 + * @brief System Setting Source File
5 + *
6 + * @note
7 + * SPDX-License-Identifier: Apache-2.0
8 + * Copyright (C) 2016-2020 Nuvoton Technology Corp. All rights reserved.
9 + *
10 + ******************************************************************************/
11 +#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) /* ARM Compiler 6 */
12 +#include <arm_cmse.h>
13 +#endif
14 +
15 +#include <stdio.h>
16 +#include <stdint.h>
17 +#include "NuMicro.h"
18 +
19 +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
20 +#include "partition_M2351.h"
21 +extern void SCU_IRQHandler(void);
22 +void TZ_SAU_Setup(void);
23 +#else
24 +extern void SCU_IRQHandler(void)__attribute__((noreturn));
25 +#endif
26 +
27 +extern void *__Vectors; /* see startup file */
28 +
29 +
30 +/*----------------------------------------------------------------------------
31 + Clock Variable definitions
32 + *----------------------------------------------------------------------------*/
33 +uint32_t SystemCoreClock = __HSI; /*!< System Clock Frequency (Core Clock) */
34 +uint32_t CyclesPerUs = (__HSI / 1000000UL);/*!< Cycles per micro second */
35 +uint32_t PllClock = __HSI; /*!< PLL Output Clock Frequency */
36 +//const uint32_t gau32ClkSrcTbl[] = {__HXT, __LXT, 0UL, __LIRC, 0UL, __HIRC48, 0UL, __HIRC};
37 +
38 +
39 +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
40 +
41 +void FMC_NSBA_Setup(void);
42 +void SCU_Setup(void);
43 +void NSC_Init(void);
44 +
45 +/**
46 + * @brief Setup Non-secure boundary
47 + *
48 + * @param None
49 + *
50 + * @return None
51 + *
52 + * @details This function is used to set Non-secure boundary according to
53 + * the configuration of partition header file
54 + */
55 +void FMC_NSBA_Setup(void)
56 +{
57 + /* Skip NSBA Setupt according config */
58 + if(FMC_INIT_NSBA == 0)
59 + return;
60 +
61 + /* Check if NSBA value with current active NSBA */
62 + if(SCU->FNSADDR != FMC_SECURE_ROM_SIZE)
63 + {
64 + /* Unlock Protected Register */
65 + SYS_UnlockReg();
66 +
67 + /* Enable ISP and config update */
68 + FMC->ISPCTL = FMC_ISPCTL_ISPEN_Msk | FMC_ISPCTL_CFGUEN_Msk;
69 +
70 + /* Config Base of NSBA */
71 + FMC->ISPADDR = FMC_NSCBA_BASE ;
72 +
73 + /* Read Non-secure base address config */
74 + FMC->ISPCMD = FMC_ISPCMD_READ;
75 + FMC->ISPTRG = FMC_ISPTRG_ISPGO_Msk;
76 + while(FMC->ISPTRG);
77 +
78 + /* Setting NSBA when it is empty */
79 + if(FMC->ISPDAT == 0xfffffffful)
80 + {
81 + /* Set new base */
82 + FMC->ISPDAT = FMC_SECURE_ROM_SIZE;
83 + FMC->ISPCMD = FMC_ISPCMD_PROGRAM;
84 + FMC->ISPTRG = FMC_ISPTRG_ISPGO_Msk;
85 + while(FMC->ISPTRG);
86 +
87 + /* Verify new base */
88 + FMC->ISPDAT = 0;
89 + FMC->ISPCMD = FMC_ISPCMD_READ;
90 + FMC->ISPTRG = FMC_ISPTRG_ISPGO_Msk;
91 + while(FMC->ISPTRG);
92 + if(FMC->ISPDAT == FMC_SECURE_ROM_SIZE)
93 + {
94 + /* Force Chip Reset to valid new setting */
95 + SYS->IPRST0 = SYS_IPRST0_CHIPRST_Msk;
96 + }
97 + }
98 + }
99 +
100 +}
101 +
102 +
103 +/**
104 + \brief Setup SCU Configuration Unit
105 + \details
106 +
107 + */
108 +void SCU_Setup(void)
109 +{
110 + int32_t i;
111 +
112 + SCU->PNSSET[0] = SCU_INIT_PNSSET0_VAL;
113 + SCU->PNSSET[1] = SCU_INIT_PNSSET1_VAL;
114 + SCU->PNSSET[2] = SCU_INIT_PNSSET2_VAL;
115 + SCU->PNSSET[3] = SCU_INIT_PNSSET3_VAL;
116 + SCU->PNSSET[4] = SCU_INIT_PNSSET4_VAL;
117 + SCU->PNSSET[5] = SCU_INIT_PNSSET5_VAL;
118 + SCU->PNSSET[6] = SCU_INIT_PNSSET6_VAL;
119 +
120 +
121 + SCU->IONSSET = SCU_INIT_IONSSET_VAL;
122 +
123 + /* Set Non-secure SRAM */
124 + for(i = 11; i >= SCU_SECURE_SRAM_SIZE / 8192; i--)
125 + {
126 + SCU->SRAMNSSET |= (1U << i);
127 + }
128 +
129 + /* Set interrupt to non-secure according to PNNSET settings */
130 + if(SCU_INIT_PNSSET0_VAL & BIT9 ) NVIC->ITNS[1] |= BIT22; /* Int of USBH_INT */
131 + if(SCU_INIT_PNSSET0_VAL & BIT13) NVIC->ITNS[2] |= BIT0 ; /* Int of SDHOST0_INT */
132 + if(SCU_INIT_PNSSET0_VAL & BIT24) NVIC->ITNS[3] |= BIT2 ; /* Int of PDMA1_INT */
133 + if(SCU_INIT_PNSSET1_VAL & BIT18) NVIC->ITNS[2] |= BIT7 ; /* Int of CRYPTO */
134 + if(SCU_INIT_PNSSET2_VAL & BIT2 ) NVIC->ITNS[3] |= BIT15; /* Int of EWDT_INT */
135 + if(SCU_INIT_PNSSET2_VAL & BIT2 ) NVIC->ITNS[3] |= BIT16; /* Int of EWWDT_INT */
136 + if(SCU_INIT_PNSSET2_VAL & BIT3 ) NVIC->ITNS[1] |= BIT10; /* Int of EADC0_INT */
137 + if(SCU_INIT_PNSSET2_VAL & BIT3 ) NVIC->ITNS[1] |= BIT11; /* Int of EADC1_INT */
138 + if(SCU_INIT_PNSSET2_VAL & BIT3 ) NVIC->ITNS[1] |= BIT14; /* Int of EADC2_INT */
139 + if(SCU_INIT_PNSSET2_VAL & BIT3 ) NVIC->ITNS[1] |= BIT15; /* Int of EADC3_INT */
140 + if(SCU_INIT_PNSSET2_VAL & BIT5 ) NVIC->ITNS[1] |= BIT12; /* Int of ACMP01_INT */
141 + if(SCU_INIT_PNSSET2_VAL & BIT7 ) NVIC->ITNS[1] |= BIT9 ; /* Int of DAC_INT */
142 + if(SCU_INIT_PNSSET2_VAL & BIT8 ) NVIC->ITNS[2] |= BIT4 ; /* Int of I2S0_INT */
143 + if(SCU_INIT_PNSSET2_VAL & BIT13) NVIC->ITNS[1] |= BIT23; /* Int of USBOTG_INT */
144 + if(SCU_INIT_PNSSET2_VAL & BIT17) NVIC->ITNS[1] |= BIT2 ; /* Int of TMR2_INT */
145 + if(SCU_INIT_PNSSET2_VAL & BIT17) NVIC->ITNS[1] |= BIT3 ; /* Int of TMR3_INT */
146 + if(SCU_INIT_PNSSET2_VAL & BIT24) NVIC->ITNS[0] |= BIT25; /* Int of EPWM0_P0_INT */
147 + if(SCU_INIT_PNSSET2_VAL & BIT24) NVIC->ITNS[0] |= BIT26; /* Int of EPWM0_P1_INT */
148 + if(SCU_INIT_PNSSET2_VAL & BIT24) NVIC->ITNS[0] |= BIT27; /* Int of EPWM0_P2_INT */
149 + if(SCU_INIT_PNSSET2_VAL & BIT25) NVIC->ITNS[0] |= BIT29; /* Int of EPWM1_P0_INT */
150 + if(SCU_INIT_PNSSET2_VAL & BIT25) NVIC->ITNS[0] |= BIT30; /* Int of EPWM1_P1_INT */
151 + if(SCU_INIT_PNSSET2_VAL & BIT25) NVIC->ITNS[0] |= BIT31; /* Int of EPWM1_P2_INT */
152 + if(SCU_INIT_PNSSET2_VAL & BIT26) NVIC->ITNS[2] |= BIT14; /* Int of BPWM0_INT */
153 + if(SCU_INIT_PNSSET2_VAL & BIT27) NVIC->ITNS[2] |= BIT15; /* Int of BPWM1_INT */
154 + if(SCU_INIT_PNSSET3_VAL & BIT0 ) NVIC->ITNS[0] |= BIT22; /* Int of QSPI0_INT */
155 + if(SCU_INIT_PNSSET3_VAL & BIT1 ) NVIC->ITNS[0] |= BIT23; /* Int of SPI0_INT */
156 + if(SCU_INIT_PNSSET3_VAL & BIT2 ) NVIC->ITNS[1] |= BIT19; /* Int of SPI1_INT */
157 + if(SCU_INIT_PNSSET3_VAL & BIT3 ) NVIC->ITNS[1] |= BIT20; /* Int of SPI2_INT */
158 + if(SCU_INIT_PNSSET3_VAL & BIT4 ) NVIC->ITNS[1] |= BIT30; /* Int of SPI3_INT */
159 + if(SCU_INIT_PNSSET3_VAL & BIT16) NVIC->ITNS[1] |= BIT4 ; /* Int of UART0_INT */
160 + if(SCU_INIT_PNSSET3_VAL & BIT17) NVIC->ITNS[1] |= BIT5 ; /* Int of UART1_INT */
161 + if(SCU_INIT_PNSSET3_VAL & BIT18) NVIC->ITNS[1] |= BIT16; /* Int of UART2_INT */
162 + if(SCU_INIT_PNSSET3_VAL & BIT19) NVIC->ITNS[1] |= BIT17; /* Int of UART3_INT */
163 + if(SCU_INIT_PNSSET3_VAL & BIT20) NVIC->ITNS[2] |= BIT10; /* Int of UART4_INT */
164 + if(SCU_INIT_PNSSET3_VAL & BIT21) NVIC->ITNS[2] |= BIT11; /* Int of UART5_INT */
165 + if(SCU_INIT_PNSSET4_VAL & BIT0 ) NVIC->ITNS[1] |= BIT6 ; /* Int of I2C0_INT */
166 + if(SCU_INIT_PNSSET4_VAL & BIT1 ) NVIC->ITNS[1] |= BIT7 ; /* Int of I2C1_INT */
167 + if(SCU_INIT_PNSSET4_VAL & BIT2 ) NVIC->ITNS[2] |= BIT18; /* Int of I2C2_INT */
168 + if(SCU_INIT_PNSSET4_VAL & BIT16) NVIC->ITNS[1] |= BIT26; /* Int of SC0_INT */
169 + if(SCU_INIT_PNSSET4_VAL & BIT17) NVIC->ITNS[1] |= BIT27; /* Int of SC1_INT */
170 + if(SCU_INIT_PNSSET4_VAL & BIT18) NVIC->ITNS[1] |= BIT28; /* Int of SC2_INT */
171 + if(SCU_INIT_PNSSET5_VAL & BIT0 ) NVIC->ITNS[1] |= BIT24; /* Int of CAN0_INT */
172 + if(SCU_INIT_PNSSET5_VAL & BIT16) NVIC->ITNS[2] |= BIT20; /* Int of QEI0_INT */
173 + if(SCU_INIT_PNSSET5_VAL & BIT17) NVIC->ITNS[2] |= BIT21; /* Int of QEI1_INT */
174 + if(SCU_INIT_PNSSET5_VAL & BIT20) NVIC->ITNS[2] |= BIT22; /* Int of ECAP0_INT */
175 + if(SCU_INIT_PNSSET5_VAL & BIT21) NVIC->ITNS[2] |= BIT23; /* Int of ECAP1_INT */
176 + if(SCU_INIT_PNSSET5_VAL & BIT25) NVIC->ITNS[3] |= BIT5 ; /* Int of TRNG_INT */
177 + if(SCU_INIT_PNSSET5_VAL & BIT27) NVIC->ITNS[3] |= BIT4 ; /* Int of LCD_INT */
178 + if(SCU_INIT_PNSSET5_VAL & BIT29) NVIC->ITNS[3] |= BIT14; /* Int of TAMPER_INT */
179 + if(SCU_INIT_PNSSET6_VAL & BIT0 ) NVIC->ITNS[1] |= BIT21; /* Int of USBD_INT */
180 + if(SCU_INIT_PNSSET6_VAL & BIT16) NVIC->ITNS[2] |= BIT12; /* Int of USCI0_INT */
181 + if(SCU_INIT_PNSSET6_VAL & BIT17) NVIC->ITNS[2] |= BIT13; /* Int of USCI1_INT */
182 + if(SCU_INIT_IONSSET_VAL & BIT0 ) NVIC->ITNS[0] |= BIT16; /* Int of PA */
183 + if(SCU_INIT_IONSSET_VAL & BIT1 ) NVIC->ITNS[0] |= BIT17; /* Int of PB */
184 + if(SCU_INIT_IONSSET_VAL & BIT2 ) NVIC->ITNS[0] |= BIT18; /* Int of PC */
185 + if(SCU_INIT_IONSSET_VAL & BIT3 ) NVIC->ITNS[0] |= BIT19; /* Int of PD */
186 + if(SCU_INIT_IONSSET_VAL & BIT4 ) NVIC->ITNS[0] |= BIT20; /* Int of PE */
187 + if(SCU_INIT_IONSSET_VAL & BIT5 ) NVIC->ITNS[0] |= BIT21; /* Int of PF */
188 + if(SCU_INIT_IONSSET_VAL & BIT6 ) NVIC->ITNS[2] |= BIT8 ; /* Int of PG */
189 + if(SCU_INIT_IONSSET_VAL & BIT7 ) NVIC->ITNS[2] |= BIT24; /* Int of PH */
190 +
191 +
192 + /* Enable SCU Int status */
193 + SCU->SVIOIEN = (uint32_t)-1;
194 + NVIC_EnableIRQ(SCU_IRQn);
195 +
196 +}
197 +
198 +#if defined( __ICCARM__ )
199 +__WEAK
200 +#else
201 +__attribute__((weak))
202 +#endif
203 +
204 +void SCU_IRQHandler(void)
205 +{
206 + char const *master[] = {"CPU", 0, 0, "PDMA0", "SDH0", "CRPT", "USBH", 0,0,0,0,"PDMA1"};
207 + char const *ipname[] = {"APB0","APB1",0,0,"GPIO","EBI","USBH","CRC","SDH0",0,"PDMA0","PDMA1"
208 + ,"SRAM0","SRAM1","FMC","FLASH","SCU","SYS","CRPT"};
209 + const uint8_t info[] = {0x34,0x3C,0,0, 0x44,0x4C,0x54,0x5C,0x64,0,0x74,0x7C,0x84,0x8C,0x94,0x9C,0xA4,0xAC,0xB4};
210 +
211 + uint32_t u32Reg, u32Addr;
212 + uint32_t i;
213 +
214 + /* TrustZone access policy */
215 + u32Reg = SCU->SVINTSTS;
216 + if(u32Reg)
217 + {
218 +
219 + /* Get violation address and source */
220 + for(i=0;i< sizeof(ipname);i++)
221 + {
222 + if(u32Reg & (1 << i))
223 + {
224 + u32Addr = M32(SCU_BASE+info[i]+4);
225 + printf(" %s(0x%08x) Alarm! illegal access by %s\n",ipname[i], u32Addr,master[M32(SCU_BASE+info[i])]);
226 + SCU->SVINTSTS = (1 << i);
227 + break;
228 +
229 + }
230 +
231 + }
232 + }
233 +}
234 +
235 +
236 +/**
237 + \brief Setup a Nonsecure callable Region
238 + \details The base and limit of Nonsecure callable region is dependent on the
239 + application code size.
240 + */
241 +void NSC_Init(void)
242 +{
243 + uint32_t u32Region;
244 + uint32_t u32Base, u32Limit;
245 +
246 +#if defined (__ICCARM__)
247 +# pragma section = "NSC"
248 + u32Base = (uint32_t)__section_begin("NSC");
249 + u32Limit = (uint32_t)__section_end("NSC");
250 +#elif defined(__ARMCC_VERSION)
251 +#pragma clang diagnostic push
252 +#pragma clang diagnostic ignored "-Wdollar-in-identifier-extension"
253 + extern uint32_t Image$$NSC_ROM$$XO$$Base[];
254 + extern uint32_t Image$$NSC_ROM$$XO$$Limit[];
255 + u32Base = (uint32_t)Image$$NSC_ROM$$XO$$Base;
256 + u32Limit = (uint32_t)Image$$NSC_ROM$$XO$$Limit;
257 +#pragma clang diagnostic pop
258 +#else
259 + extern uint32_t __start_NSC[];
260 + extern uint32_t __end_NSC[];
261 + u32Base = (uint32_t)__start_NSC;
262 + u32Limit = (uint32_t)__end_NSC;
263 +#endif
264 +
265 + /* SAU region 3 is dedicated for NSC */
266 + u32Region = 3;
267 + SAU->RNR = (u32Region & SAU_RNR_REGION_Msk);
268 + SAU->RBAR = (u32Base & SAU_RBAR_BADDR_Msk);
269 + SAU->RLAR = ((u32Limit-1) & SAU_RLAR_LADDR_Msk) |
270 + ((1ul << SAU_RLAR_NSC_Pos) & SAU_RLAR_NSC_Msk) | 1ul;
271 +
272 +}
273 +
274 +
275 +/**
276 + \brief Setup a SAU Region
277 + \details Writes the region information contained in SAU_Region to the
278 + registers SAU_RNR, SAU_RBAR, and SAU_RLAR
279 + */
280 +void TZ_SAU_Setup(void)
281 +{
282 +
283 +#if defined (__SAU_PRESENT) && (__SAU_PRESENT == 1U)
284 +
285 +#if defined (SAU_INIT_REGION0) && (SAU_INIT_REGION0 == 1U)
286 + SAU_INIT_REGION(0);
287 +#endif
288 +
289 +#if defined (SAU_INIT_REGION1) && (SAU_INIT_REGION1 == 1U)
290 + SAU_INIT_REGION(1);
291 +#endif
292 +
293 +#if defined (SAU_INIT_REGION2) && (SAU_INIT_REGION2 == 1U)
294 + SAU_INIT_REGION(2);
295 +#endif
296 +
297 +#if defined (SAU_INIT_REGION3) && (SAU_INIT_REGION3 == 1U)
298 + SAU_INIT_REGION(3);
299 +#endif
300 +
301 +#if defined (SAU_INIT_REGION4) && (SAU_INIT_REGION4 == 1U)
302 + SAU_INIT_REGION(4);
303 +#endif
304 +
305 +#if defined (SAU_INIT_REGION5) && (SAU_INIT_REGION5 == 1U)
306 + SAU_INIT_REGION(5);
307 +#endif
308 +
309 +#if defined (SAU_INIT_REGION6) && (SAU_INIT_REGION6 == 1U)
310 + SAU_INIT_REGION(6);
311 +#endif
312 +
313 +#if defined (SAU_INIT_REGION7) && (SAU_INIT_REGION7 == 1U)
314 + SAU_INIT_REGION(7);
315 +#endif
316 +
317 + /* repeat this for all possible SAU regions */
318 +
319 +
320 +#if defined (SAU_INIT_CTRL) && (SAU_INIT_CTRL == 1U)
321 + SAU->CTRL = ((SAU_INIT_CTRL_ENABLE << SAU_CTRL_ENABLE_Pos) & SAU_CTRL_ENABLE_Msk) |
322 + ((SAU_INIT_CTRL_ALLNS << SAU_CTRL_ALLNS_Pos) & SAU_CTRL_ALLNS_Msk) ;
323 +#endif
324 +
325 +#endif /* defined (__SAU_PRESENT) && (__SAU_PRESENT == 1U) */
326 +
327 +#if defined (SCB_CSR_AIRCR_INIT) && (SCB_CSR_AIRCR_INIT == 1U)
328 + SCB->SCR = (SCB->SCR & ~(SCB_SCR_SLEEPDEEPS_Msk)) |
329 + ((SCB_CSR_DEEPSLEEPS_VAL << SCB_SCR_SLEEPDEEPS_Pos) & SCB_SCR_SLEEPDEEPS_Msk);
330 +
331 + SCB->AIRCR = (0x05FA << 16) |
332 + ((SCB_AIRCR_SYSRESETREQS_VAL << SCB_AIRCR_SYSRESETREQS_Pos) & SCB_AIRCR_SYSRESETREQS_Msk) |
333 + ((SCB_AIRCR_BFHFNMINS_VAL << SCB_AIRCR_BFHFNMINS_Pos) & SCB_AIRCR_BFHFNMINS_Msk) |
334 + ((SCB_AIRCR_PRIS_VAL << SCB_AIRCR_PRIS_Pos) & SCB_AIRCR_PRIS_Msk);
335 +
336 +
337 +
338 +#endif /* defined (SCB_CSR_AIRCR_INIT) && (SCB_CSR_AIRCR_INIT == 1U) */
339 +
340 +#if defined (SCB_ICSR_INIT) && (SCB_ICSR_INIT == 1U)
341 + SCB->ICSR = (SCB->ICSR & ~(SCB_ICSR_STTNS_Msk)) |
342 + ((SCB_ICSR_STTNS_VAL << SCB_ICSR_STTNS_Pos) & SCB_ICSR_STTNS_Msk);
343 +#endif /* defined (SCB_ICSR_INIT) && (SCB_ICSR_INIT == 1U) */
344 +
345 + /* repeat this for all possible ITNS elements */
346 +
347 + /* Initial Nonsecure callable region */
348 + NSC_Init();
349 +
350 +
351 +}
352 +#else
353 +void SCU_IRQHandler(void)
354 +{
355 + while(1);
356 +}
357 +#endif
358 +
359 +
360 +/**
361 + * @brief Update the Variable SystemCoreClock
362 + *
363 + * @param None
364 + *
365 + * @return None
366 + *
367 + * @details This function is used to update the variable SystemCoreClock
368 + * and must be called whenever the core clock is changed.
369 + */
370 +void SystemCoreClockUpdate(void)
371 +{
372 + /* Update PLL Clock */
373 + PllClock = CLK_GetPLLClockFreq();
374 +
375 + /* Update System Core Clock */
376 + SystemCoreClock = CLK_GetCPUFreq();
377 +
378 + /* Update Cycles per micro second */
379 + CyclesPerUs = (SystemCoreClock + 500000UL) / 1000000UL;
380 +}
381 +
382 +
383 +
384 +/**
385 + * @brief System Initialization
386 + *
387 + * @param None
388 + *
389 + * @return None
390 + *
391 + * @details The necessary initialization of system. Global variables are forbidden here.
392 + */
393 +void SystemInit(void)
394 +{
395 +#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
396 + SCB->VTOR = (uint32_t) &__Vectors;
397 +#endif
398 +
399 +#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)
400 + TZ_SAU_Setup();
401 + SCU_Setup();
402 + FMC_NSBA_Setup();
403 +#endif
404 +
405 +#ifdef INIT_SYSCLK_AT_BOOTING
406 +
407 +#endif
408 +
409 +}
410 +
411 +
412 +#if USE_ASSERT
413 +
414 +/**
415 + * @brief Assert Error Message
416 + *
417 + * @param[in] file the source file name
418 + * @param[in] line line number
419 + *
420 + * @return None
421 + *
422 + * @details The function prints the source file name and line number where
423 + * the ASSERT_PARAM() error occurs, and then stops in an infinite loop.
424 + */
425 +void AssertError(uint8_t * file, uint32_t line)
426 +{
427 +
428 + printf("[%s] line %d : wrong parameters.\r\n", file, line);
429 +
430 + /* Infinite loop */
431 + while(1) ;
432 +}
433 +#endif
434 +
435 +
436 +#if (defined(__ICCARM__) && (__VER__ >= 7080000) && (__VER__ < 8020000))
437 +
438 +#if (__ARM_FEATURE_CMSE == 3U)
439 +/**
440 + \brief Get Process Stack Pointer (non-secure)
441 + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state.
442 + \return PSP Register value
443 + */
444 +uint32_t __TZ_get_PSP_NS(void)
445 +{
446 + register uint32_t result;
447 +
448 + __ASM volatile("MRS %0, psp_ns" : "=r"(result));
449 + return(result);
450 +}
451 +
452 +
453 +/**
454 + \brief Set Process Stack Pointer (non-secure)
455 + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state.
456 + \param [in] topOfProcStack Process Stack Pointer value to set
457 + */
458 +void __TZ_set_PSP_NS(uint32_t topOfProcStack)
459 +{
460 + __ASM volatile("MSR psp_ns, %0" : : "r"(topOfProcStack));
461 +}
462 +
463 +
464 +
465 +/**
466 + \brief Get Main Stack Pointer (non-secure)
467 + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state.
468 + \return MSP Register value
469 + */
470 +int32_t __TZ_get_MSP_NS(void)
471 +{
472 + register uint32_t result;
473 +
474 + __ASM volatile("MRS %0, msp_ns" : "=r"(result));
475 + return(result);
476 +}
477 +
478 +
479 +
480 +/**
481 + \brief Set Main Stack Pointer (non-secure)
482 + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state.
483 + \param [in] topOfMainStack Main Stack Pointer value to set
484 + */
485 +void __TZ_set_MSP_NS(uint32_t topOfMainStack)
486 +{
487 + __ASM volatile("MSR msp_ns, %0" : : "r"(topOfMainStack));
488 +}
489 +
490 +
491 +
492 +/**
493 + \brief Get Priority Mask (non-secure)
494 + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state.
495 + \return Priority Mask value
496 + */
497 +uint32_t __TZ_get_PRIMASK_NS(void)
498 +{
499 + uint32_t result;
500 +
501 + __ASM volatile("MRS %0, primask_ns" : "=r"(result));
502 + return(result);
503 +}
504 +
505 +
506 +
507 +/**
508 + \brief Set Priority Mask (non-secure)
509 + \details Assigns the given value to the non-secure Priority Mask Register when in secure state.
510 + \param [in] priMask Priority Mask
511 + */
512 +void __TZ_set_PRIMASK_NS(uint32_t priMask)
513 +{
514 + __ASM volatile("MSR primask_ns, %0" : : "r"(priMask) : "memory");
515 +}
516 +
517 +
518 +#endif
519 +
520 +
521 +#endif
522 +
523 +
524 +
1 +/*------------------------------------------------------------------------------
2 + * MDK Middleware - Component ::Network
3 + * Copyright (c) 2004-2019 Arm Limited (or its affiliates). All rights reserved.
4 + *------------------------------------------------------------------------------
5 + * Name: Net_Config.c
6 + * Purpose: Network Configuration
7 + * Rev.: V7.1.0
8 + *----------------------------------------------------------------------------*/
9 +
10 +//-------- <<< Use Configuration Wizard in Context Menu >>> --------------------
11 +
12 +// <h>Network System Settings
13 +// <i>Global Network System definitions
14 +// <s.15>Local Host Name
15 +// <i>This is the name under which embedded host can be
16 +// <i>accessed on a local area network.
17 +// <i>Default: "my_host"
18 +#define NET_HOST_NAME "my_host"
19 +
20 +// <o>Memory Pool Size <1536-262144:4>
21 +// <i>This is the size of a memory pool in bytes. Buffers for
22 +// <i>network packets are allocated from this memory pool.
23 +// <i>Default: 12000 bytes
24 +#define NET_MEM_POOL_SIZE 12000
25 +
26 +// <q>Start System Services
27 +// <i>If enabled, the system will automatically start server services
28 +// <i>(HTTP, FTP, TFTP server, ...) when initializing the network system.
29 +// <i>Default: Enabled
30 +#define NET_START_SERVICE 1
31 +
32 +// <h>OS Resource Settings
33 +// <i>These settings are used to optimize usage of OS resources.
34 +// <o>Core Thread Stack Size <512-65535:4>
35 +// <i>Default: 1024 bytes
36 +#define NET_THREAD_STACK_SIZE 1024
37 +
38 +// Core Thread Priority
39 +#define NET_THREAD_PRIORITY osPriorityNormal
40 +
41 +// </h>
42 +// </h>
43 +
44 +//------------- <<< end of configuration section >>> ---------------------------
45 +
46 +#include "RTE_Components.h"
47 +
48 +#ifdef RTE_Network_Interface_ETH_0
49 +#include "Net_Config_ETH_0.h"
50 +#endif
51 +#ifdef RTE_Network_Interface_ETH_1
52 +#include "Net_Config_ETH_1.h"
53 +#endif
54 +
55 +#ifdef RTE_Network_Interface_WiFi_0
56 +#include "Net_Config_WiFi_0.h"
57 +#endif
58 +
59 +#ifdef RTE_Network_Interface_WiFi_1
60 +#include "Net_Config_WiFi_1.h"
61 +#endif
62 +
63 +#ifdef RTE_Network_Interface_PPP
64 +#include "Net_Config_PPP.h"
65 +#endif
66 +
67 +#ifdef RTE_Network_Interface_SLIP
68 +#include "Net_Config_SLIP.h"
69 +#endif
70 +
71 +#ifdef RTE_Network_Socket_UDP
72 +#include "Net_Config_UDP.h"
73 +#endif
74 +#ifdef RTE_Network_Socket_TCP
75 +#include "Net_Config_TCP.h"
76 +#endif
77 +#ifdef RTE_Network_Socket_BSD
78 +#include "Net_Config_BSD.h"
79 +#endif
80 +
81 +#ifdef RTE_Network_Web_Server_RO
82 +#include "Net_Config_HTTP_Server.h"
83 +#endif
84 +#ifdef RTE_Network_Web_Server_FS
85 +#include "Net_Config_HTTP_Server.h"
86 +#endif
87 +
88 +#ifdef RTE_Network_Telnet_Server
89 +#include "Net_Config_Telnet_Server.h"
90 +#endif
91 +
92 +#ifdef RTE_Network_TFTP_Server
93 +#include "Net_Config_TFTP_Server.h"
94 +#endif
95 +#ifdef RTE_Network_TFTP_Client
96 +#include "Net_Config_TFTP_Client.h"
97 +#endif
98 +
99 +#ifdef RTE_Network_FTP_Server
100 +#include "Net_Config_FTP_Server.h"
101 +#endif
102 +#ifdef RTE_Network_FTP_Client
103 +#include "Net_Config_FTP_Client.h"
104 +#endif
105 +
106 +#ifdef RTE_Network_DNS_Client
107 +#include "Net_Config_DNS_Client.h"
108 +#endif
109 +
110 +#ifdef RTE_Network_SMTP_Client
111 +#include "Net_Config_SMTP_Client.h"
112 +#endif
113 +
114 +#ifdef RTE_Network_SNMP_Agent
115 +#include "Net_Config_SNMP_Agent.h"
116 +#endif
117 +
118 +#ifdef RTE_Network_SNTP_Client
119 +#include "Net_Config_SNTP_Client.h"
120 +#endif
121 +
122 +#include "net_config.h"
123 +
124 +/**
125 +\addtogroup net_genFunc
126 +@{
127 +*/
128 +/**
129 + \fn void net_sys_error (NET_ERROR error)
130 + \ingroup net_cores
131 + \brief Network system error handler.
132 +*/
133 +void net_sys_error (NET_ERROR error) {
134 + /* This function is called when a fatal error is encountered. */
135 + /* The normal program execution is not possible anymore. */
136 +
137 + switch (error) {
138 + case NET_ERROR_MEM_ALLOC:
139 + /* Out of memory */
140 + break;
141 +
142 + case NET_ERROR_MEM_FREE:
143 + /* Trying to release non existing memory block */
144 + break;
145 +
146 + case NET_ERROR_MEM_CORRUPT:
147 + /* Memory Link pointer corrupted */
148 + /* More data written than the size of allocated memory block */
149 + break;
150 +
151 + case NET_ERROR_CONFIG:
152 + /* Network configuration error detected */
153 + break;
154 +
155 + case NET_ERROR_UDP_ALLOC:
156 + /* Out of UDP Sockets */
157 + break;
158 +
159 + case NET_ERROR_TCP_ALLOC:
160 + /* Out of TCP Sockets */
161 + break;
162 +
163 + case NET_ERROR_TCP_STATE:
164 + /* TCP State machine in undefined state */
165 + break;
166 + }
167 +
168 + /* End-less loop */
169 + while (1);
170 +}
171 +/**
172 +@}
173 +*/
1 +/*------------------------------------------------------------------------------
2 + * MDK Middleware - Component ::Network:Socket
3 + * Copyright (c) 2004-2019 Arm Limited (or its affiliates). All rights reserved.
4 + *------------------------------------------------------------------------------
5 + * Name: Net_Config_TCP.h
6 + * Purpose: Network Configuration for TCP Sockets
7 + * Rev.: V7.1.1
8 + *----------------------------------------------------------------------------*/
9 +
10 +//-------- <<< Use Configuration Wizard in Context Menu >>> --------------------
11 +
12 +// <h>TCP Sockets
13 +#define TCP_ENABLE 1
14 +
15 +// <o>Number of TCP Sockets <1-20>
16 +// <i>Number of available TCP sockets
17 +// <i>Default: 6
18 +#define TCP_NUM_SOCKS 6
19 +
20 +// <o>Number of Retries <0-20>
21 +// <i>How many times TCP module will try to retransmit data
22 +// <i>before giving up. Increase this value for high-latency
23 +// <i>and low throughput networks.
24 +// <i>Default: 5
25 +#define TCP_MAX_RETRY 5
26 +
27 +// <o>Retry Timeout in seconds <1-10>
28 +// <i>If data frame not acknowledged within this time frame,
29 +// <i>TCP module will try to resend the data again.
30 +// <i>Default: 4
31 +#define TCP_RETRY_TOUT 4
32 +
33 +// <o>Default Connect Timeout in seconds <1-65535>
34 +// <i>If no TCP data frame has been exchanged during this time,
35 +// <i>the TCP connection is either closed or a keep-alive frame
36 +// <i>is sent to verify that the connection still exists.
37 +// <i>Default: 120
38 +#define TCP_DEFAULT_TOUT 120
39 +
40 +// <o>Maximum Segment Size <536-1440>
41 +// <i>The Maximum Segment Size specifies the maximum
42 +// <i>number of bytes in the TCP segment's Data field.
43 +// <i>Default: 1440
44 +#define TCP_MAX_SEG_SIZE 1440
45 +
46 +// <o>Receive Window Size <536-65535>
47 +// <i>Receive Window Size specifies the size of data,
48 +// <i>that the socket is able to buffer in flow-control mode.
49 +// <i>Default: 4320
50 +#define TCP_RECEIVE_WIN_SIZE 4320
51 +
52 +// </h>
53 +
54 +// TCP Initial Retransmit period in seconds
55 +#define TCP_INITIAL_RETRY_TOUT 1
56 +
57 +// TCP SYN frame retransmit period in seconds
58 +#define TCP_SYN_RETRY_TOUT 2
59 +
60 +// Number of retries to establish a connection
61 +#define TCP_CONNECT_RETRY 7
62 +
63 +// Dynamic port start (default 49152)
64 +#define TCP_DYN_PORT_START 49152
65 +
66 +// Dynamic port end (default 65535)
67 +#define TCP_DYN_PORT_END 65535
68 +
69 +//------------- <<< end of configuration section >>> ---------------------------
1 +/*------------------------------------------------------------------------------
2 + * MDK Middleware - Component ::Network:Interface
3 + * Copyright (c) 2004-2020 Arm Limited (or its affiliates). All rights reserved.
4 + *------------------------------------------------------------------------------
5 + * Name: Net_Config_WiFi_0.h
6 + * Purpose: Network Configuration for WiFi Interface
7 + * Rev.: V7.1.0
8 + *----------------------------------------------------------------------------*/
9 +
10 +//-------- <<< Use Configuration Wizard in Context Menu >>> --------------------
11 +
12 +// <h>WiFi Network Interface
13 +#define WIFI0_ENABLE 1
14 +
15 +// <o>Connect to hardware via Driver_WiFi# <0-255>
16 +// <i>Select driver control block for WiFi interface
17 +#define WIFI0_DRIVER 0
18 +
19 +// <o>WiFi Mode <0=>Station
20 +// <1=>Access Point
21 +// <i>Mode control setting for the WiFi driver
22 +#define WIFI0_MODE 0
23 +
24 +// <e>WiFi MAC
25 +// <i>If this option is enabled, a configured MAC address
26 +// <i>will be used. If disabled, MAC address provided in
27 +// <i>the WiFi module will be used.
28 +// <i>Default: disabled
29 +#define WIFI0_MAC_CONFIG 0
30 +
31 +// <s.17>MAC Address
32 +// <i>MAC Address in text representation
33 +// <i>Value FF-FF-FF-FF-FF-FF is not allowed,
34 +// <i>LSB of first byte must be 0 (Multicast bit).
35 +// <i>Default: "1E-30-6C-32-78-F8"
36 +#define WIFI0_MAC_ADDR "1E-30-6C-32-78-F8"
37 +// </e>
38 +
39 +// <e>IPv4
40 +// <i>Enable IPv4 Protocol for Network Interface
41 +#define WIFI0_IP4_ENABLE 1
42 +
43 +// <s.15>IP Address
44 +// <i>Static IPv4 Address in text representation
45 +// <i>Default: "192.168.1.100"
46 +#define WIFI0_IP4_ADDR "192.168.1.100"
47 +
48 +// <s.15>Subnet mask
49 +// <i>Local Subnet mask in text representation
50 +// <i>Default: "255.255.255.0"
51 +#define WIFI0_IP4_MASK "255.255.255.0"
52 +
53 +// <s.15>Default Gateway
54 +// <i>IP Address of Default Gateway in text representation
55 +// <i>Default: "192.168.1.254"
56 +#define WIFI0_IP4_GATEWAY "192.168.1.254"
57 +
58 +// <s.15>Primary DNS Server
59 +// <i>IP Address of Primary DNS Server in text representation
60 +// <i>Default: "8.8.8.8"
61 +#define WIFI0_IP4_PRIMARY_DNS "8.8.8.8"
62 +
63 +// <s.15>Secondary DNS Server
64 +// <i>IP Address of Secondary DNS Server in text representation
65 +// <i>Default: "8.8.4.4"
66 +#define WIFI0_IP4_SECONDARY_DNS "8.8.4.4"
67 +
68 +// <e>IP Fragmentation
69 +// <i>This option enables fragmentation of outgoing IP datagrams,
70 +// <i>and reassembling the fragments of incoming IP datagrams.
71 +// <i>Default: enabled
72 +#define WIFI0_IP4_FRAG_ENABLE 1
73 +
74 +// <o>MTU size <576-1500>
75 +// <i>Maximum Transmission Unit in bytes
76 +// <i>Default: 1500
77 +#define WIFI0_IP4_MTU 1500
78 +// </e>
79 +
80 +// <h>ARP Address Resolution
81 +// <i>ARP cache and node address resolver settings
82 +// <o>Cache Table size <5-100>
83 +// <i>Number of cached MAC/IP addresses
84 +// <i>Default: 10
85 +#define WIFI0_ARP_TAB_SIZE 10
86 +
87 +// <o>Cache Timeout in seconds <5-255>
88 +// <i>A timeout for cached hardware/IP addresses
89 +// <i>Default: 150
90 +#define WIFI0_ARP_CACHE_TOUT 150
91 +
92 +// <o>Number of Retries <0-20>
93 +// <i>Number of Retries to resolve an IP address
94 +// <i>before ARP module gives up
95 +// <i>Default: 4
96 +#define WIFI0_ARP_MAX_RETRY 4
97 +
98 +// <o>Resend Timeout in seconds <1-10>
99 +// <i>A timeout to resend the ARP Request
100 +// <i>Default: 2
101 +#define WIFI0_ARP_RESEND_TOUT 2
102 +
103 +// <q>Send Notification on Address changes
104 +// <i>When this option is enabled, the embedded host
105 +// <i>will send a Gratuitous ARP notification at startup,
106 +// <i>or when the device IP address has changed.
107 +// <i>Default: Disabled
108 +#define WIFI0_ARP_NOTIFY 0
109 +// </h>
110 +
111 +// <e>IGMP Group Management
112 +// <i>Enable or disable Internet Group Management Protocol
113 +#define WIFI0_IGMP_ENABLE 0
114 +
115 +// <o>Membership Table size <2-50>
116 +// <i>Number of Groups this host can join
117 +// <i>Default: 5
118 +#define WIFI0_IGMP_TAB_SIZE 5
119 +// </e>
120 +
121 +// <q>NetBIOS Name Service
122 +// <i>When this option is enabled, the embedded host can be
123 +// <i>accessed by its name on local LAN using NBNS protocol.
124 +#define WIFI0_NBNS_ENABLE 1
125 +
126 +// <e>Dynamic Host Configuration
127 +// <i>When this option is enabled, local IP address, Net Mask
128 +// <i>and Default Gateway are obtained automatically from
129 +// <i>the DHCP Server on local LAN.
130 +#define WIFI0_DHCP_ENABLE 1
131 +
132 +// <s.40>Vendor Class Identifier
133 +// <i>This value is optional. If specified, it is added
134 +// <i>to DHCP request message, identifying vendor type.
135 +// <i>Default: ""
136 +#define WIFI0_DHCP_VCID ""
137 +
138 +// <q>Bootfile Name
139 +// <i>This value is optional. If enabled, the Bootfile Name
140 +// <i>(option 67) is also requested from DHCP server.
141 +// <i>Default: disabled
142 +#define WIFI0_DHCP_BOOTFILE 0
143 +
144 +// <q>NTP Servers
145 +// <i>This value is optional. If enabled, a list of NTP Servers
146 +// <i>(option 42) is also requested from DHCP server.
147 +// <i>Default: disabled
148 +#define WIFI0_DHCP_NTP_SERVERS 0
149 +// </e>
150 +
151 +// Disable ICMP Echo response
152 +#define WIFI0_ICMP_NO_ECHO 0
153 +// </e>
154 +
155 +// <e>IPv6
156 +// <i>Enable IPv6 Protocol for Network Interface
157 +#define WIFI0_IP6_ENABLE 1
158 +
159 +// <s.40>IPv6 Address
160 +// <i>Static IPv6 Address in text representation
161 +// <i>Use unspecified address "::" when static
162 +// <i>IPv6 address is not used.
163 +// <i>Default: "fec0::2"
164 +#define WIFI0_IP6_ADDR "fec0::2"
165 +
166 +// <o>Subnet prefix-length <1-128>
167 +// <i>Number of bits that define network address
168 +// <i>Default: 64
169 +#define WIFI0_IP6_PREFIX_LEN 64
170 +
171 +// <s.40>Default Gateway
172 +// <i>Default Gateway IPv6 Address in text representation
173 +// <i>Default: "fec0::1"
174 +#define WIFI0_IP6_GATEWAY "fec0::1"
175 +
176 +// <s.40>Primary DNS Server
177 +// <i>Primary DNS Server IPv6 Address in text representation
178 +// <i>Default: "2001:4860:4860::8888"
179 +#define WIFI0_IP6_PRIMARY_DNS "2001:4860:4860::8888"
180 +
181 +// <s.40>Secondary DNS Server
182 +// <i>Secondary DNS Server IPv6 Address in text representation
183 +// <i>Default: "2001:4860:4860::8844"
184 +#define WIFI0_IP6_SECONDARY_DNS "2001:4860:4860::8844"
185 +
186 +// <h>Neighbor Discovery
187 +// <i>Neighbor cache and node address resolver settings
188 +// <o>Cache Table size <5-100>
189 +// <i>Number of cached node addresses
190 +// <i>Default: 5
191 +#define WIFI0_NDP_TAB_SIZE 5
192 +
193 +// <o>Cache Timeout in seconds <5-255>
194 +// <i>Timeout for cached node addresses
195 +// <i>Default: 150
196 +#define WIFI0_NDP_CACHE_TOUT 150
197 +
198 +// <o>Number of Retries <0-20>
199 +// <i>Number of retries to resolve an IP address
200 +// <i>before NDP module gives up
201 +// <i>Default: 4
202 +#define WIFI0_NDP_MAX_RETRY 4
203 +
204 +// <o>Resend Timeout in seconds <1-10>
205 +// <i>A timeout to resend Neighbor Solicitation
206 +// <i>Default: 2
207 +#define WIFI0_NDP_RESEND_TOUT 2
208 +// </h>
209 +
210 +// <e>Dynamic Host Configuration
211 +// <i>When this option is enabled, local IPv6 address is
212 +// <i>automatically configured.
213 +#define WIFI0_DHCP6_ENABLE 1
214 +
215 +// <o>DHCPv6 Client Mode <0=>Stateless Mode <1=>Statefull Mode
216 +// <i>Stateless DHCPv6 Client uses router advertisements
217 +// <i>for IPv6 address autoconfiguration (SLAAC).
218 +// <i>Statefull DHCPv6 Client connects to DHCPv6 server for a
219 +// <i>leased IPv6 address and DNS server IPv6 addresses.
220 +#define WIFI0_DHCP6_MODE 1
221 +
222 +// <e>Vendor Class Option
223 +// <i>If enabled, Vendor Class option is added to DHCPv6
224 +// <i>request message, identifying vendor type.
225 +// <i>Default: disabled
226 +#define WIFI0_DHCP6_VCLASS_ENABLE 0
227 +
228 +// <o>Enterprise ID
229 +// <i>Enterprise-number as registered with IANA.
230 +// <i>Default: 0 (Reserved)
231 +#define WIFI0_DHCP6_VCLASS_EID 0
232 +
233 +// <s.40>Vendor Class Data
234 +// <i>This string identifies vendor type.
235 +// <i>Default: ""
236 +#define WIFI0_DHCP6_VCLASS_DATA ""
237 +// </e>
238 +// </e>
239 +
240 +// Disable ICMP6 Echo response
241 +#define WIFI0_ICMP6_NO_ECHO 0
242 +// </e>
243 +
244 +// <h>OS Resource Settings
245 +// <i>These settings are used to optimize usage of OS resources.
246 +// <o>Interface Thread Stack Size <512-65535:4>
247 +// <i>Default: 512 bytes
248 +#define WIFI0_THREAD_STACK_SIZE 512
249 +
250 +// Interface Thread Priority
251 +#define WIFI0_THREAD_PRIORITY osPriorityAboveNormal
252 +
253 +// </h>
254 +// </h>
255 +
256 +//------------- <<< end of configuration section >>> ---------------------------
1 +/*
2 + * Configuration template
3 + *
4 + * Copyright (C) 2006-2021, Arm Limited, All Rights Reserved
5 + * SPDX-License-Identifier: Apache-2.0
6 + *
7 + * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 + * not use this file except in compliance with the License.
9 + * You may obtain a copy of the License at
10 + *
11 + * http://www.apache.org/licenses/LICENSE-2.0
12 + *
13 + * Unless required by applicable law or agreed to in writing, software
14 + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 + * See the License for the specific language governing permissions and
17 + * limitations under the License.
18 + */
19 +/*
20 + * This set of compile-time options may be used to enable
21 + * or disable features selectively, and reduce the global
22 + * memory footprint.
23 + */
24 +
25 +#ifndef MBEDTLS_CONFIG_H
26 +#define MBEDTLS_CONFIG_H
27 +
28 +/* System support */
29 +//#define MBEDTLS_HAVE_ASM
30 +//#define MBEDTLS_HAVE_TIME
31 +//#define MBEDTLS_HAVE_TIME_DATE
32 +//#define MBEDTLS_PLATFORM_MEMORY
33 +//#define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS
34 +//#define MBEDTLS_CHECK_PARAMS
35 +
36 +/* mbed TLS feature support */
37 +#define MBEDTLS_ENTROPY_HARDWARE_ALT
38 +#define MBEDTLS_AES_ROM_TABLES
39 +//#define MBEDTLS_AES_FEWER_TABLES
40 +//#define MBEDTLS_CAMELLIA_SMALL_MEMORY
41 +#define MBEDTLS_CIPHER_MODE_CBC
42 +#define MBEDTLS_CIPHER_MODE_CFB
43 +#define MBEDTLS_CIPHER_MODE_CTR
44 +//#define MBEDTLS_CIPHER_MODE_OFB
45 +//#define MBEDTLS_CIPHER_MODE_XTS
46 +#define MBEDTLS_CIPHER_PADDING_PKCS7
47 +#define MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS
48 +#define MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN
49 +#define MBEDTLS_CIPHER_PADDING_ZEROS
50 +#define MBEDTLS_REMOVE_ARC4_CIPHERSUITES
51 +#define MBEDTLS_REMOVE_3DES_CIPHERSUITES
52 +#define MBEDTLS_ECP_DP_SECP192R1_ENABLED
53 +#define MBEDTLS_ECP_DP_SECP224R1_ENABLED
54 +#define MBEDTLS_ECP_DP_SECP256R1_ENABLED
55 +#define MBEDTLS_ECP_DP_SECP384R1_ENABLED
56 +#define MBEDTLS_ECP_DP_SECP521R1_ENABLED
57 +#define MBEDTLS_ECP_DP_SECP192K1_ENABLED
58 +#define MBEDTLS_ECP_DP_SECP224K1_ENABLED
59 +#define MBEDTLS_ECP_DP_SECP256K1_ENABLED
60 +#define MBEDTLS_ECP_DP_BP256R1_ENABLED
61 +#define MBEDTLS_ECP_DP_BP384R1_ENABLED
62 +#define MBEDTLS_ECP_DP_BP512R1_ENABLED
63 +#define MBEDTLS_ECP_DP_CURVE25519_ENABLED
64 +#define MBEDTLS_ECP_DP_CURVE448_ENABLED
65 +#define MBEDTLS_ECP_NIST_OPTIM
66 +//#define MBEDTLS_ECP_RESTARTABLE
67 +#define MBEDTLS_ECDSA_DETERMINISTIC
68 +#define MBEDTLS_KEY_EXCHANGE_PSK_ENABLED
69 +#define MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED
70 +#define MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED
71 +#define MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED
72 +#define MBEDTLS_KEY_EXCHANGE_RSA_ENABLED
73 +#define MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED
74 +#define MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED
75 +#define MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
76 +#define MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED
77 +#define MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED
78 +//#define MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED
79 +#define MBEDTLS_PK_PARSE_EC_EXTENDED
80 +#define MBEDTLS_ERROR_STRERROR_DUMMY
81 +#define MBEDTLS_GENPRIME
82 +//#define MBEDTLS_FS_IO
83 +//#define MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES
84 +#define MBEDTLS_NO_PLATFORM_ENTROPY
85 +//#define MBEDTLS_ENTROPY_FORCE_SHA256
86 +//#define MBEDTLS_ENTROPY_NV_SEED
87 +//#define MBEDTLS_MEMORY_DEBUG
88 +//#define MBEDTLS_MEMORY_BACKTRACE
89 +#define MBEDTLS_PK_RSA_ALT_SUPPORT
90 +#define MBEDTLS_PKCS1_V15
91 +#define MBEDTLS_PKCS1_V21
92 +//#define MBEDTLS_PSA_CRYPTO_SPM
93 +//#define MBEDTLS_RSA_NO_CRT
94 +#define MBEDTLS_SELF_TEST
95 +//#define MBEDTLS_SHA256_SMALLER
96 +//#define MBEDTLS_SHA512_SMALLER
97 +//#define MBEDTLS_SHA512_NO_SHA384
98 +#define MBEDTLS_SSL_ALL_ALERT_MESSAGES
99 +//#define MBEDTLS_SSL_RECORD_CHECKING
100 +//#define MBEDTLS_SSL_DTLS_CONNECTION_ID
101 +//#define MBEDTLS_SSL_ASYNC_PRIVATE
102 +//#define MBEDTLS_SSL_CONTEXT_SERIALIZATION
103 +//#define MBEDTLS_SSL_DEBUG_ALL
104 +#define MBEDTLS_SSL_ENCRYPT_THEN_MAC
105 +#define MBEDTLS_SSL_EXTENDED_MASTER_SECRET
106 +#define MBEDTLS_SSL_FALLBACK_SCSV
107 +//#define MBEDTLS_SSL_KEEP_PEER_CERTIFICATE
108 +//#define MBEDTLS_SSL_HW_RECORD_ACCEL
109 +#define MBEDTLS_SSL_CBC_RECORD_SPLITTING
110 +#define MBEDTLS_SSL_RENEGOTIATION
111 +//#define MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO
112 +//#define MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE
113 +#define MBEDTLS_SSL_MAX_FRAGMENT_LENGTH
114 +#define MBEDTLS_SSL_PROTO_SSL3
115 +#define MBEDTLS_SSL_PROTO_TLS1
116 +#define MBEDTLS_SSL_PROTO_TLS1_1
117 +#define MBEDTLS_SSL_PROTO_TLS1_2
118 +#define MBEDTLS_SSL_PROTO_DTLS
119 +#define MBEDTLS_SSL_ALPN
120 +#define MBEDTLS_SSL_DTLS_ANTI_REPLAY
121 +#define MBEDTLS_SSL_DTLS_HELLO_VERIFY
122 +#define MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE
123 +#define MBEDTLS_SSL_DTLS_BADMAC_LIMIT
124 +#define MBEDTLS_SSL_SESSION_TICKETS
125 +//#define MBEDTLS_SSL_EXPORT_KEYS
126 +#define MBEDTLS_SSL_SERVER_NAME_INDICATION
127 +#define MBEDTLS_SSL_TRUNCATED_HMAC
128 +//#define MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH
129 +//#define MBEDTLS_USE_PSA_CRYPTO
130 +#define MBEDTLS_VERSION_FEATURES
131 +//#define MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3
132 +//#define MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION
133 +//#define MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK
134 +#define MBEDTLS_X509_CHECK_KEY_USAGE
135 +#define MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE
136 +#define MBEDTLS_X509_RSASSA_PSS_SUPPORT
137 +//#define MBEDTLS_ZLIB_SUPPORT
138 +
139 +/* mbed TLS modules */
140 +#define MBEDTLS_AES_C
141 +#define MBEDTLS_ARC4_C
142 +#define MBEDTLS_ASN1_PARSE_C
143 +#define MBEDTLS_ASN1_WRITE_C
144 +#define MBEDTLS_BASE64_C
145 +#define MBEDTLS_BIGNUM_C
146 +#define MBEDTLS_BLOWFISH_C
147 +#define MBEDTLS_CAMELLIA_C
148 +//#define MBEDTLS_ARIA_C
149 +#define MBEDTLS_CCM_C
150 +#define MBEDTLS_CERTS_C
151 +//#define MBEDTLS_CHACHA20_C
152 +//#define MBEDTLS_CHACHAPOLY_C
153 +#define MBEDTLS_CIPHER_C
154 +//#define MBEDTLS_CMAC_C
155 +#define MBEDTLS_CTR_DRBG_C
156 +#define MBEDTLS_DEBUG_C
157 +#define MBEDTLS_DES_C
158 +#define MBEDTLS_DHM_C
159 +#define MBEDTLS_ECDH_C
160 +#define MBEDTLS_ECDSA_C
161 +//#define MBEDTLS_ECJPAKE_C
162 +#define MBEDTLS_ECP_C
163 +#define MBEDTLS_ENTROPY_C
164 +#define MBEDTLS_ERROR_C
165 +#define MBEDTLS_GCM_C
166 +//#define MBEDTLS_HAVEGE_C
167 +//#define MBEDTLS_HKDF_C
168 +#define MBEDTLS_HMAC_DRBG_C
169 +//#define MBEDTLS_NIST_KW_C
170 +#define MBEDTLS_MD_C
171 +//#define MBEDTLS_MD2_C
172 +//#define MBEDTLS_MD4_C
173 +#define MBEDTLS_MD5_C
174 +//#define MBEDTLS_MEMORY_BUFFER_ALLOC_C
175 +#define MBEDTLS_NET_C
176 +#define MBEDTLS_OID_C
177 +#define MBEDTLS_PEM_PARSE_C
178 +#define MBEDTLS_PEM_WRITE_C
179 +#define MBEDTLS_PK_C
180 +#define MBEDTLS_PK_PARSE_C
181 +#define MBEDTLS_PK_WRITE_C
182 +#define MBEDTLS_PKCS5_C
183 +//#define MBEDTLS_PKCS11_C
184 +#define MBEDTLS_PKCS12_C
185 +#define MBEDTLS_PLATFORM_C
186 +//#define MBEDTLS_POLY1305_C
187 +//#define MBEDTLS_PSA_CRYPTO_C
188 +//#define MBEDTLS_PSA_CRYPTO_SE_C
189 +//#define MBEDTLS_PSA_CRYPTO_STORAGE_C
190 +//#define MBEDTLS_PSA_ITS_FILE_C
191 +#define MBEDTLS_RIPEMD160_C
192 +#define MBEDTLS_RSA_C
193 +#define MBEDTLS_SHA1_C
194 +#define MBEDTLS_SHA256_C
195 +#define MBEDTLS_SHA512_C
196 +#define MBEDTLS_SSL_CACHE_C
197 +#define MBEDTLS_SSL_COOKIE_C
198 +#define MBEDTLS_SSL_TICKET_C
199 +#define MBEDTLS_SSL_CLI_C
200 +//#define MBEDTLS_SSL_SRV_C
201 +#define MBEDTLS_SSL_TLS_C
202 +//#define MBEDTLS_THREADING_C
203 +//#define MBEDTLS_TIMING_C
204 +#define MBEDTLS_VERSION_C
205 +#define MBEDTLS_X509_USE_C
206 +#define MBEDTLS_X509_CRT_PARSE_C
207 +#define MBEDTLS_X509_CRL_PARSE_C
208 +#define MBEDTLS_X509_CSR_PARSE_C
209 +#define MBEDTLS_X509_CREATE_C
210 +#define MBEDTLS_X509_CRT_WRITE_C
211 +#define MBEDTLS_X509_CSR_WRITE_C
212 +#define MBEDTLS_XTEA_C
213 +
214 +#include "mbedtls/check_config.h"
215 +
216 +#endif /* MBEDTLS_CONFIG_H */
1 +
2 +/*
3 + * Auto generated Run-Time-Environment Configuration File
4 + * *** Do not modify ! ***
5 + *
6 + * Project: 'Secure'
7 + * Target: 'Secure'
8 + */
9 +
10 +#ifndef RTE_COMPONENTS_H
11 +#define RTE_COMPONENTS_H
12 +
13 +
14 +/*
15 + * Define the Device Header File:
16 + */
17 +#define CMSIS_device_header "M2351.h"
18 +
19 +/* ARM::Security:mbed TLS:2.24.0 */
20 +#define RTE_Security_mbedTLS /* Security mbed TLS */
21 +
22 +
23 +#endif /* RTE_COMPONENTS_H */
This diff could not be displayed because it is too large.
1 +<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
2 +<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_optx.xsd">
3 +
4 + <SchemaVersion>1.0</SchemaVersion>
5 +
6 + <Header>### uVision Project, (C) Keil Software</Header>
7 +
8 + <Extensions>
9 + <cExt>*.c</cExt>
10 + <aExt>*.s*; *.src; *.a*</aExt>
11 + <oExt>*.obj; *.o</oExt>
12 + <lExt>*.lib</lExt>
13 + <tExt>*.txt; *.h; *.inc; *.md</tExt>
14 + <pExt>*.plm</pExt>
15 + <CppX>*.cpp</CppX>
16 + <nMigrate>0</nMigrate>
17 + </Extensions>
18 +
19 + <DaveTm>
20 + <dwLowDateTime>0</dwLowDateTime>
21 + <dwHighDateTime>0</dwHighDateTime>
22 + </DaveTm>
23 +
24 + <Target>
25 + <TargetName>Secure</TargetName>
26 + <ToolsetNumber>0x4</ToolsetNumber>
27 + <ToolsetName>ARM-ADS</ToolsetName>
28 + <TargetOption>
29 + <CLKADS>12000000</CLKADS>
30 + <OPTTT>
31 + <gFlags>1</gFlags>
32 + <BeepAtEnd>1</BeepAtEnd>
33 + <RunSim>0</RunSim>
34 + <RunTarget>1</RunTarget>
35 + <RunAbUc>0</RunAbUc>
36 + </OPTTT>
37 + <OPTHX>
38 + <HexSelection>1</HexSelection>
39 + <FlashByte>65535</FlashByte>
40 + <HexRangeLowAddress>0</HexRangeLowAddress>
41 + <HexRangeHighAddress>0</HexRangeHighAddress>
42 + <HexOffset>0</HexOffset>
43 + </OPTHX>
44 + <OPTLEX>
45 + <PageWidth>79</PageWidth>
46 + <PageLength>66</PageLength>
47 + <TabStop>8</TabStop>
48 + <ListingPath>.\Listings\</ListingPath>
49 + </OPTLEX>
50 + <ListingPage>
51 + <CreateCListing>1</CreateCListing>
52 + <CreateAListing>1</CreateAListing>
53 + <CreateLListing>1</CreateLListing>
54 + <CreateIListing>0</CreateIListing>
55 + <AsmCond>1</AsmCond>
56 + <AsmSymb>1</AsmSymb>
57 + <AsmXref>0</AsmXref>
58 + <CCond>1</CCond>
59 + <CCode>0</CCode>
60 + <CListInc>0</CListInc>
61 + <CSymb>0</CSymb>
62 + <LinkerCodeListing>0</LinkerCodeListing>
63 + </ListingPage>
64 + <OPTXL>
65 + <LMap>1</LMap>
66 + <LComments>1</LComments>
67 + <LGenerateSymbols>1</LGenerateSymbols>
68 + <LLibSym>1</LLibSym>
69 + <LLines>1</LLines>
70 + <LLocSym>1</LLocSym>
71 + <LPubSym>1</LPubSym>
72 + <LXref>0</LXref>
73 + <LExpSel>0</LExpSel>
74 + </OPTXL>
75 + <OPTFL>
76 + <tvExp>1</tvExp>
77 + <tvExpOptDlg>0</tvExpOptDlg>
78 + <IsCurrentTarget>1</IsCurrentTarget>
79 + </OPTFL>
80 + <CpuCode>6</CpuCode>
81 + <DebugOpt>
82 + <uSim>0</uSim>
83 + <uTrg>1</uTrg>
84 + <sLdApp>1</sLdApp>
85 + <sGomain>1</sGomain>
86 + <sRbreak>1</sRbreak>
87 + <sRwatch>1</sRwatch>
88 + <sRmem>1</sRmem>
89 + <sRfunc>1</sRfunc>
90 + <sRbox>1</sRbox>
91 + <tLdApp>1</tLdApp>
92 + <tGomain>1</tGomain>
93 + <tRbreak>1</tRbreak>
94 + <tRwatch>1</tRwatch>
95 + <tRmem>1</tRmem>
96 + <tRfunc>0</tRfunc>
97 + <tRbox>1</tRbox>
98 + <tRtrace>1</tRtrace>
99 + <sRSysVw>1</sRSysVw>
100 + <tRSysVw>1</tRSysVw>
101 + <sRunDeb>0</sRunDeb>
102 + <sLrtime>0</sLrtime>
103 + <bEvRecOn>1</bEvRecOn>
104 + <bSchkAxf>0</bSchkAxf>
105 + <bTchkAxf>0</bTchkAxf>
106 + <nTsel>7</nTsel>
107 + <sDll></sDll>
108 + <sDllPa></sDllPa>
109 + <sDlgDll></sDlgDll>
110 + <sDlgPa></sDlgPa>
111 + <sIfile></sIfile>
112 + <tDll></tDll>
113 + <tDllPa></tDllPa>
114 + <tDlgDll></tDlgDll>
115 + <tDlgPa></tDlgPa>
116 + <tIfile></tIfile>
117 + <pMon>NULink\Nu_Link.dll</pMon>
118 + </DebugOpt>
119 + <TargetDriverDllRegistry>
120 + <SetRegEntry>
121 + <Number>0</Number>
122 + <Key>DLGTARM</Key>
123 + <Name>(6010=-1,-1,-1,-1,0)(6018=-1,-1,-1,-1,0)(6019=-1,-1,-1,-1,0)(6008=-1,-1,-1,-1,0)(6009=-1,-1,-1,-1,0)(6014=-1,-1,-1,-1,0)(6015=-1,-1,-1,-1,0)(6003=-1,-1,-1,-1,0)(6000=-1,-1,-1,-1,0)</Name>
124 + </SetRegEntry>
125 + <SetRegEntry>
126 + <Number>0</Number>
127 + <Key>ARMDBGFLAGS</Key>
128 + <Name></Name>
129 + </SetRegEntry>
130 + <SetRegEntry>
131 + <Number>0</Number>
132 + <Key>Nu_Link</Key>
133 + <Name></Name>
134 + </SetRegEntry>
135 + <SetRegEntry>
136 + <Number>0</Number>
137 + <Key>UL2V8M</Key>
138 + <Name>UL2V8M(-S0 -C0 -P0 -FD20000000 -FC1200 -FN1 -FF0M2351_AP_512 -FS00 -FL080000 -FP0($$Device:M2351KIAAE$Flash\M2351_AP_512.FLM))</Name>
139 + </SetRegEntry>
140 + </TargetDriverDllRegistry>
141 + <Breakpoint/>
142 + <MemoryWindow1>
143 + <Mm>
144 + <WinNumber>1</WinNumber>
145 + <SubType>0</SubType>
146 + <ItemText>netData</ItemText>
147 + <AccSizeX>0</AccSizeX>
148 + </Mm>
149 + </MemoryWindow1>
150 + <Tracepoint>
151 + <THDelay>0</THDelay>
152 + </Tracepoint>
153 + <DebugFlag>
154 + <trace>0</trace>
155 + <periodic>1</periodic>
156 + <aLwin>1</aLwin>
157 + <aCover>0</aCover>
158 + <aSer1>0</aSer1>
159 + <aSer2>0</aSer2>
160 + <aPa>0</aPa>
161 + <viewmode>1</viewmode>
162 + <vrSel>0</vrSel>
163 + <aSym>0</aSym>
164 + <aTbox>0</aTbox>
165 + <AscS1>0</AscS1>
166 + <AscS2>0</AscS2>
167 + <AscS3>0</AscS3>
168 + <aSer3>0</aSer3>
169 + <eProf>0</eProf>
170 + <aLa>0</aLa>
171 + <aPa1>0</aPa1>
172 + <AscS4>0</AscS4>
173 + <aSer4>0</aSer4>
174 + <StkLoc>0</StkLoc>
175 + <TrcWin>0</TrcWin>
176 + <newCpu>0</newCpu>
177 + <uProt>0</uProt>
178 + </DebugFlag>
179 + <LintExecutable></LintExecutable>
180 + <LintConfigFile></LintConfigFile>
181 + <bLintAuto>0</bLintAuto>
182 + <bAutoGenD>0</bAutoGenD>
183 + <LntExFlags>0</LntExFlags>
184 + <pMisraName></pMisraName>
185 + <pszMrule></pszMrule>
186 + <pSingCmds></pSingCmds>
187 + <pMultCmds></pMultCmds>
188 + <pMisraNamep></pMisraNamep>
189 + <pszMrulep></pszMrulep>
190 + <pSingCmdsp></pSingCmdsp>
191 + <pMultCmdsp></pMultCmdsp>
192 + <SystemViewers>
193 + <Entry>
194 + <Name>System Viewer\AES</Name>
195 + <WinId>35905</WinId>
196 + </Entry>
197 + <Entry>
198 + <Name>System Viewer\CRYPTO</Name>
199 + <WinId>35904</WinId>
200 + </Entry>
201 + </SystemViewers>
202 + </TargetOption>
203 + </Target>
204 +
205 + <Group>
206 + <GroupName>CMSIS</GroupName>
207 + <tvExp>1</tvExp>
208 + <tvExpOptDlg>0</tvExpOptDlg>
209 + <cbSel>0</cbSel>
210 + <RteFlg>0</RteFlg>
211 + <File>
212 + <GroupNumber>1</GroupNumber>
213 + <FileNumber>1</FileNumber>
214 + <FileType>1</FileType>
215 + <tvExp>0</tvExp>
216 + <tvExpOptDlg>0</tvExpOptDlg>
217 + <bDave2>0</bDave2>
218 + <PathWithFileName>..\..\..\Library\Device\Nuvoton\M2351\Source\system_M2351.c</PathWithFileName>
219 + <FilenameWithoutPath>system_M2351.c</FilenameWithoutPath>
220 + <RteFlg>0</RteFlg>
221 + <bShared>0</bShared>
222 + </File>
223 + <File>
224 + <GroupNumber>1</GroupNumber>
225 + <FileNumber>2</FileNumber>
226 + <FileType>2</FileType>
227 + <tvExp>0</tvExp>
228 + <tvExpOptDlg>0</tvExpOptDlg>
229 + <bDave2>0</bDave2>
230 + <PathWithFileName>..\..\..\Library\Device\Nuvoton\M2351\Source\ARM\startup_M2351.s</PathWithFileName>
231 + <FilenameWithoutPath>startup_M2351.s</FilenameWithoutPath>
232 + <RteFlg>0</RteFlg>
233 + <bShared>0</bShared>
234 + </File>
235 + </Group>
236 +
237 + <Group>
238 + <GroupName>Library</GroupName>
239 + <tvExp>1</tvExp>
240 + <tvExpOptDlg>0</tvExpOptDlg>
241 + <cbSel>0</cbSel>
242 + <RteFlg>0</RteFlg>
243 + <File>
244 + <GroupNumber>2</GroupNumber>
245 + <FileNumber>3</FileNumber>
246 + <FileType>1</FileType>
247 + <tvExp>0</tvExp>
248 + <tvExpOptDlg>0</tvExpOptDlg>
249 + <bDave2>0</bDave2>
250 + <PathWithFileName>..\..\..\Library\StdDriver\src\clk.c</PathWithFileName>
251 + <FilenameWithoutPath>clk.c</FilenameWithoutPath>
252 + <RteFlg>0</RteFlg>
253 + <bShared>0</bShared>
254 + </File>
255 + <File>
256 + <GroupNumber>2</GroupNumber>
257 + <FileNumber>4</FileNumber>
258 + <FileType>1</FileType>
259 + <tvExp>0</tvExp>
260 + <tvExpOptDlg>0</tvExpOptDlg>
261 + <bDave2>0</bDave2>
262 + <PathWithFileName>..\..\..\Library\StdDriver\src\crypto.c</PathWithFileName>
263 + <FilenameWithoutPath>crypto.c</FilenameWithoutPath>
264 + <RteFlg>0</RteFlg>
265 + <bShared>0</bShared>
266 + </File>
267 + <File>
268 + <GroupNumber>2</GroupNumber>
269 + <FileNumber>5</FileNumber>
270 + <FileType>1</FileType>
271 + <tvExp>0</tvExp>
272 + <tvExpOptDlg>0</tvExpOptDlg>
273 + <bDave2>0</bDave2>
274 + <PathWithFileName>..\..\..\Library\StdDriver\src\fmc.c</PathWithFileName>
275 + <FilenameWithoutPath>fmc.c</FilenameWithoutPath>
276 + <RteFlg>0</RteFlg>
277 + <bShared>0</bShared>
278 + </File>
279 + <File>
280 + <GroupNumber>2</GroupNumber>
281 + <FileNumber>6</FileNumber>
282 + <FileType>1</FileType>
283 + <tvExp>0</tvExp>
284 + <tvExpOptDlg>0</tvExpOptDlg>
285 + <bDave2>0</bDave2>
286 + <PathWithFileName>..\..\..\Library\StdDriver\src\gpio.c</PathWithFileName>
287 + <FilenameWithoutPath>gpio.c</FilenameWithoutPath>
288 + <RteFlg>0</RteFlg>
289 + <bShared>0</bShared>
290 + </File>
291 + <File>
292 + <GroupNumber>2</GroupNumber>
293 + <FileNumber>7</FileNumber>
294 + <FileType>1</FileType>
295 + <tvExp>0</tvExp>
296 + <tvExpOptDlg>0</tvExpOptDlg>
297 + <bDave2>0</bDave2>
298 + <PathWithFileName>..\..\..\Library\StdDriver\src\i2c.c</PathWithFileName>
299 + <FilenameWithoutPath>i2c.c</FilenameWithoutPath>
300 + <RteFlg>0</RteFlg>
301 + <bShared>0</bShared>
302 + </File>
303 + <File>
304 + <GroupNumber>2</GroupNumber>
305 + <FileNumber>8</FileNumber>
306 + <FileType>1</FileType>
307 + <tvExp>0</tvExp>
308 + <tvExpOptDlg>0</tvExpOptDlg>
309 + <bDave2>0</bDave2>
310 + <PathWithFileName>..\..\..\Library\StdDriver\src\retarget.c</PathWithFileName>
311 + <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
312 + <RteFlg>0</RteFlg>
313 + <bShared>0</bShared>
314 + </File>
315 + <File>
316 + <GroupNumber>2</GroupNumber>
317 + <FileNumber>9</FileNumber>
318 + <FileType>1</FileType>
319 + <tvExp>0</tvExp>
320 + <tvExpOptDlg>0</tvExpOptDlg>
321 + <bDave2>0</bDave2>
322 + <PathWithFileName>..\..\..\Library\StdDriver\src\spi.c</PathWithFileName>
323 + <FilenameWithoutPath>spi.c</FilenameWithoutPath>
324 + <RteFlg>0</RteFlg>
325 + <bShared>0</bShared>
326 + </File>
327 + <File>
328 + <GroupNumber>2</GroupNumber>
329 + <FileNumber>10</FileNumber>
330 + <FileType>1</FileType>
331 + <tvExp>0</tvExp>
332 + <tvExpOptDlg>0</tvExpOptDlg>
333 + <bDave2>0</bDave2>
334 + <PathWithFileName>..\..\..\Library\StdDriver\src\sys.c</PathWithFileName>
335 + <FilenameWithoutPath>sys.c</FilenameWithoutPath>
336 + <RteFlg>0</RteFlg>
337 + <bShared>0</bShared>
338 + </File>
339 + <File>
340 + <GroupNumber>2</GroupNumber>
341 + <FileNumber>11</FileNumber>
342 + <FileType>1</FileType>
343 + <tvExp>0</tvExp>
344 + <tvExpOptDlg>0</tvExpOptDlg>
345 + <bDave2>0</bDave2>
346 + <PathWithFileName>..\..\..\Library\StdDriver\src\uart.c</PathWithFileName>
347 + <FilenameWithoutPath>uart.c</FilenameWithoutPath>
348 + <RteFlg>0</RteFlg>
349 + <bShared>0</bShared>
350 + </File>
351 + </Group>
352 +
353 + <Group>
354 + <GroupName>Include</GroupName>
355 + <tvExp>1</tvExp>
356 + <tvExpOptDlg>0</tvExpOptDlg>
357 + <cbSel>0</cbSel>
358 + <RteFlg>0</RteFlg>
359 + <File>
360 + <GroupNumber>3</GroupNumber>
361 + <FileNumber>12</FileNumber>
362 + <FileType>5</FileType>
363 + <tvExp>0</tvExp>
364 + <tvExpOptDlg>0</tvExpOptDlg>
365 + <bDave2>0</bDave2>
366 + <PathWithFileName>.\nsc.h</PathWithFileName>
367 + <FilenameWithoutPath>nsc.h</FilenameWithoutPath>
368 + <RteFlg>0</RteFlg>
369 + <bShared>0</bShared>
370 + </File>
371 + <File>
372 + <GroupNumber>3</GroupNumber>
373 + <FileNumber>13</FileNumber>
374 + <FileType>5</FileType>
375 + <tvExp>0</tvExp>
376 + <tvExpOptDlg>0</tvExpOptDlg>
377 + <bDave2>0</bDave2>
378 + <PathWithFileName>.\MAX30102\MAX30102.h</PathWithFileName>
379 + <FilenameWithoutPath>MAX30102.h</FilenameWithoutPath>
380 + <RteFlg>0</RteFlg>
381 + <bShared>0</bShared>
382 + </File>
383 + <File>
384 + <GroupNumber>3</GroupNumber>
385 + <FileNumber>14</FileNumber>
386 + <FileType>5</FileType>
387 + <tvExp>0</tvExp>
388 + <tvExpOptDlg>0</tvExpOptDlg>
389 + <bDave2>0</bDave2>
390 + <PathWithFileName>.\Crypto\M2351_crypto.h</PathWithFileName>
391 + <FilenameWithoutPath>M2351_crypto.h</FilenameWithoutPath>
392 + <RteFlg>0</RteFlg>
393 + <bShared>0</bShared>
394 + </File>
395 + </Group>
396 +
397 + <Group>
398 + <GroupName>MAX30102</GroupName>
399 + <tvExp>1</tvExp>
400 + <tvExpOptDlg>0</tvExpOptDlg>
401 + <cbSel>0</cbSel>
402 + <RteFlg>0</RteFlg>
403 + <File>
404 + <GroupNumber>4</GroupNumber>
405 + <FileNumber>15</FileNumber>
406 + <FileType>1</FileType>
407 + <tvExp>0</tvExp>
408 + <tvExpOptDlg>0</tvExpOptDlg>
409 + <bDave2>0</bDave2>
410 + <PathWithFileName>.\MAX30102\MAX30102.c</PathWithFileName>
411 + <FilenameWithoutPath>MAX30102.c</FilenameWithoutPath>
412 + <RteFlg>0</RteFlg>
413 + <bShared>0</bShared>
414 + </File>
415 + </Group>
416 +
417 + <Group>
418 + <GroupName>Crypto</GroupName>
419 + <tvExp>1</tvExp>
420 + <tvExpOptDlg>0</tvExpOptDlg>
421 + <cbSel>0</cbSel>
422 + <RteFlg>0</RteFlg>
423 + <File>
424 + <GroupNumber>5</GroupNumber>
425 + <FileNumber>16</FileNumber>
426 + <FileType>1</FileType>
427 + <tvExp>0</tvExp>
428 + <tvExpOptDlg>0</tvExpOptDlg>
429 + <bDave2>0</bDave2>
430 + <PathWithFileName>.\Crypto\M2351_crypto.c</PathWithFileName>
431 + <FilenameWithoutPath>M2351_crypto.c</FilenameWithoutPath>
432 + <RteFlg>0</RteFlg>
433 + <bShared>0</bShared>
434 + </File>
435 + </Group>
436 +
437 + <Group>
438 + <GroupName>User</GroupName>
439 + <tvExp>1</tvExp>
440 + <tvExpOptDlg>0</tvExpOptDlg>
441 + <cbSel>0</cbSel>
442 + <RteFlg>0</RteFlg>
443 + <File>
444 + <GroupNumber>6</GroupNumber>
445 + <FileNumber>17</FileNumber>
446 + <FileType>1</FileType>
447 + <tvExp>0</tvExp>
448 + <tvExpOptDlg>0</tvExpOptDlg>
449 + <bDave2>0</bDave2>
450 + <PathWithFileName>.\nsc.c</PathWithFileName>
451 + <FilenameWithoutPath>nsc.c</FilenameWithoutPath>
452 + <RteFlg>0</RteFlg>
453 + <bShared>0</bShared>
454 + </File>
455 + <File>
456 + <GroupNumber>6</GroupNumber>
457 + <FileNumber>18</FileNumber>
458 + <FileType>5</FileType>
459 + <tvExp>0</tvExp>
460 + <tvExpOptDlg>0</tvExpOptDlg>
461 + <bDave2>0</bDave2>
462 + <PathWithFileName>.\partition_M2351.h</PathWithFileName>
463 + <FilenameWithoutPath>partition_M2351.h</FilenameWithoutPath>
464 + <RteFlg>0</RteFlg>
465 + <bShared>0</bShared>
466 + </File>
467 + <File>
468 + <GroupNumber>6</GroupNumber>
469 + <FileNumber>19</FileNumber>
470 + <FileType>5</FileType>
471 + <tvExp>0</tvExp>
472 + <tvExpOptDlg>0</tvExpOptDlg>
473 + <bDave2>0</bDave2>
474 + <PathWithFileName>.\mbedTLS_config.h</PathWithFileName>
475 + <FilenameWithoutPath>mbedTLS_config.h</FilenameWithoutPath>
476 + <RteFlg>0</RteFlg>
477 + <bShared>0</bShared>
478 + </File>
479 + <File>
480 + <GroupNumber>6</GroupNumber>
481 + <FileNumber>20</FileNumber>
482 + <FileType>1</FileType>
483 + <tvExp>0</tvExp>
484 + <tvExpOptDlg>0</tvExpOptDlg>
485 + <bDave2>0</bDave2>
486 + <PathWithFileName>.\main.c</PathWithFileName>
487 + <FilenameWithoutPath>main.c</FilenameWithoutPath>
488 + <RteFlg>0</RteFlg>
489 + <bShared>0</bShared>
490 + </File>
491 + </Group>
492 +
493 +</ProjectOpt>
1 +<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
2 +<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_projx.xsd">
3 +
4 + <SchemaVersion>2.1</SchemaVersion>
5 +
6 + <Header>### uVision Project, (C) Keil Software</Header>
7 +
8 + <Targets>
9 + <Target>
10 + <TargetName>Secure</TargetName>
11 + <ToolsetNumber>0x4</ToolsetNumber>
12 + <ToolsetName>ARM-ADS</ToolsetName>
13 + <pCCUsed>6150000::V6.15::ARMCLANG</pCCUsed>
14 + <uAC6>1</uAC6>
15 + <TargetOption>
16 + <TargetCommonOption>
17 + <Device>M2351KIAAE</Device>
18 + <Vendor>Nuvoton</Vendor>
19 + <PackID>Nuvoton.NuMicro_DFP.1.3.10</PackID>
20 + <PackURL>http://www.nuvoton.com/hq/enu/Documents/KEILSoftwarePack</PackURL>
21 + <Cpu>IRAM(0x20000000,0x8000) IRAM2(0x30008000,0x10000) IROM(0x00000000,0x40000) IROM2(0x10040000,0x40000) CPUTYPE("Cortex-M23") TZ CLOCK(12000000) ESEL ELITTLE</Cpu>
22 + <FlashUtilSpec></FlashUtilSpec>
23 + <StartupFile></StartupFile>
24 + <FlashDriverDll>UL2V8M(-S0 -C0 -P0 -FD20000000 -FC1200 -FN1 -FF0M2351_AP_512 -FS00 -FL080000 -FP0($$Device:M2351KIAAE$Flash\M2351_AP_512.FLM))</FlashDriverDll>
25 + <DeviceId>0</DeviceId>
26 + <RegisterFile>$$Device:M2351KIAAE$Device\M2351\Include\M2351.h</RegisterFile>
27 + <MemoryEnv></MemoryEnv>
28 + <Cmp></Cmp>
29 + <Asm></Asm>
30 + <Linker></Linker>
31 + <OHString></OHString>
32 + <InfinionOptionDll></InfinionOptionDll>
33 + <SLE66CMisc></SLE66CMisc>
34 + <SLE66AMisc></SLE66AMisc>
35 + <SLE66LinkerMisc></SLE66LinkerMisc>
36 + <SFDFile>$$Device:M2351KIAAE$SVD\Nuvoton\M2351_v1.svd</SFDFile>
37 + <bCustSvd>0</bCustSvd>
38 + <UseEnv>0</UseEnv>
39 + <BinPath></BinPath>
40 + <IncludePath></IncludePath>
41 + <LibPath></LibPath>
42 + <RegisterFilePath></RegisterFilePath>
43 + <DBRegisterFilePath></DBRegisterFilePath>
44 + <TargetStatus>
45 + <Error>0</Error>
46 + <ExitCodeStop>0</ExitCodeStop>
47 + <ButtonStop>0</ButtonStop>
48 + <NotGenerated>0</NotGenerated>
49 + <InvalidFlash>1</InvalidFlash>
50 + </TargetStatus>
51 + <OutputDirectory>.\Objects\</OutputDirectory>
52 + <OutputName>Secure</OutputName>
53 + <CreateExecutable>1</CreateExecutable>
54 + <CreateLib>0</CreateLib>
55 + <CreateHexFile>0</CreateHexFile>
56 + <DebugInformation>1</DebugInformation>
57 + <BrowseInformation>1</BrowseInformation>
58 + <ListingPath>.\Listings\</ListingPath>
59 + <HexFormatSelection>1</HexFormatSelection>
60 + <Merge32K>0</Merge32K>
61 + <CreateBatchFile>0</CreateBatchFile>
62 + <BeforeCompile>
63 + <RunUserProg1>0</RunUserProg1>
64 + <RunUserProg2>0</RunUserProg2>
65 + <UserProg1Name></UserProg1Name>
66 + <UserProg2Name></UserProg2Name>
67 + <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
68 + <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
69 + <nStopU1X>0</nStopU1X>
70 + <nStopU2X>0</nStopU2X>
71 + </BeforeCompile>
72 + <BeforeMake>
73 + <RunUserProg1>0</RunUserProg1>
74 + <RunUserProg2>0</RunUserProg2>
75 + <UserProg1Name></UserProg1Name>
76 + <UserProg2Name></UserProg2Name>
77 + <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
78 + <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
79 + <nStopB1X>0</nStopB1X>
80 + <nStopB2X>0</nStopB2X>
81 + </BeforeMake>
82 + <AfterMake>
83 + <RunUserProg1>0</RunUserProg1>
84 + <RunUserProg2>0</RunUserProg2>
85 + <UserProg1Name></UserProg1Name>
86 + <UserProg2Name></UserProg2Name>
87 + <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
88 + <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
89 + <nStopA1X>0</nStopA1X>
90 + <nStopA2X>0</nStopA2X>
91 + </AfterMake>
92 + <SelectedForBatchBuild>0</SelectedForBatchBuild>
93 + <SVCSIdString></SVCSIdString>
94 + </TargetCommonOption>
95 + <CommonProperty>
96 + <UseCPPCompiler>0</UseCPPCompiler>
97 + <RVCTCodeConst>0</RVCTCodeConst>
98 + <RVCTZI>0</RVCTZI>
99 + <RVCTOtherData>0</RVCTOtherData>
100 + <ModuleSelection>0</ModuleSelection>
101 + <IncludeInBuild>1</IncludeInBuild>
102 + <AlwaysBuild>0</AlwaysBuild>
103 + <GenerateAssemblyFile>0</GenerateAssemblyFile>
104 + <AssembleAssemblyFile>0</AssembleAssemblyFile>
105 + <PublicsOnly>0</PublicsOnly>
106 + <StopOnExitCode>3</StopOnExitCode>
107 + <CustomArgument></CustomArgument>
108 + <IncludeLibraryModules></IncludeLibraryModules>
109 + <ComprImg>1</ComprImg>
110 + </CommonProperty>
111 + <DllOption>
112 + <SimDllName></SimDllName>
113 + <SimDllArguments></SimDllArguments>
114 + <SimDlgDll></SimDlgDll>
115 + <SimDlgDllArguments></SimDlgDllArguments>
116 + <TargetDllName>SARMV8M.DLL</TargetDllName>
117 + <TargetDllArguments> -MPU</TargetDllArguments>
118 + <TargetDlgDll>TCM.DLL</TargetDlgDll>
119 + <TargetDlgDllArguments>-pCM23</TargetDlgDllArguments>
120 + </DllOption>
121 + <DebugOption>
122 + <OPTHX>
123 + <HexSelection>1</HexSelection>
124 + <HexRangeLowAddress>0</HexRangeLowAddress>
125 + <HexRangeHighAddress>0</HexRangeHighAddress>
126 + <HexOffset>0</HexOffset>
127 + <Oh166RecLen>16</Oh166RecLen>
128 + </OPTHX>
129 + </DebugOption>
130 + <Utilities>
131 + <Flash1>
132 + <UseTargetDll>1</UseTargetDll>
133 + <UseExternalTool>0</UseExternalTool>
134 + <RunIndependent>0</RunIndependent>
135 + <UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
136 + <Capability>1</Capability>
137 + <DriverSelection>4102</DriverSelection>
138 + </Flash1>
139 + <bUseTDR>1</bUseTDR>
140 + <Flash2>BIN\UL2V8M.DLL</Flash2>
141 + <Flash3>"" ()</Flash3>
142 + <Flash4></Flash4>
143 + <pFcarmOut></pFcarmOut>
144 + <pFcarmGrp>User</pFcarmGrp>
145 + <pFcArmRoot></pFcArmRoot>
146 + <FcArmLst>0</FcArmLst>
147 + </Utilities>
148 + <TargetArmAds>
149 + <ArmAdsMisc>
150 + <GenerateListings>0</GenerateListings>
151 + <asHll>1</asHll>
152 + <asAsm>1</asAsm>
153 + <asMacX>1</asMacX>
154 + <asSyms>1</asSyms>
155 + <asFals>1</asFals>
156 + <asDbgD>1</asDbgD>
157 + <asForm>1</asForm>
158 + <ldLst>0</ldLst>
159 + <ldmm>1</ldmm>
160 + <ldXref>1</ldXref>
161 + <BigEnd>0</BigEnd>
162 + <AdsALst>1</AdsALst>
163 + <AdsACrf>1</AdsACrf>
164 + <AdsANop>0</AdsANop>
165 + <AdsANot>0</AdsANot>
166 + <AdsLLst>1</AdsLLst>
167 + <AdsLmap>1</AdsLmap>
168 + <AdsLcgr>1</AdsLcgr>
169 + <AdsLsym>1</AdsLsym>
170 + <AdsLszi>1</AdsLszi>
171 + <AdsLtoi>1</AdsLtoi>
172 + <AdsLsun>1</AdsLsun>
173 + <AdsLven>1</AdsLven>
174 + <AdsLsxf>1</AdsLsxf>
175 + <RvctClst>1</RvctClst>
176 + <GenPPlst>1</GenPPlst>
177 + <AdsCpuType>"Cortex-M23"</AdsCpuType>
178 + <RvctDeviceName></RvctDeviceName>
179 + <mOS>0</mOS>
180 + <uocRom>0</uocRom>
181 + <uocRam>0</uocRam>
182 + <hadIROM>1</hadIROM>
183 + <hadIRAM>1</hadIRAM>
184 + <hadXRAM>0</hadXRAM>
185 + <uocXRam>0</uocXRam>
186 + <RvdsVP>0</RvdsVP>
187 + <RvdsMve>0</RvdsMve>
188 + <RvdsCdeCp>0</RvdsCdeCp>
189 + <hadIRAM2>1</hadIRAM2>
190 + <hadIROM2>1</hadIROM2>
191 + <StupSel>8</StupSel>
192 + <useUlib>1</useUlib>
193 + <EndSel>1</EndSel>
194 + <uLtcg>0</uLtcg>
195 + <nSecure>1</nSecure>
196 + <RoSelD>3</RoSelD>
197 + <RwSelD>4</RwSelD>
198 + <CodeSel>0</CodeSel>
199 + <OptFeed>0</OptFeed>
200 + <NoZi1>0</NoZi1>
201 + <NoZi2>0</NoZi2>
202 + <NoZi3>0</NoZi3>
203 + <NoZi4>0</NoZi4>
204 + <NoZi5>0</NoZi5>
205 + <Ro1Chk>0</Ro1Chk>
206 + <Ro2Chk>0</Ro2Chk>
207 + <Ro3Chk>0</Ro3Chk>
208 + <Ir1Chk>1</Ir1Chk>
209 + <Ir2Chk>0</Ir2Chk>
210 + <Ra1Chk>0</Ra1Chk>
211 + <Ra2Chk>0</Ra2Chk>
212 + <Ra3Chk>0</Ra3Chk>
213 + <Im1Chk>1</Im1Chk>
214 + <Im2Chk>0</Im2Chk>
215 + <OnChipMemories>
216 + <Ocm1>
217 + <Type>0</Type>
218 + <StartAddress>0x0</StartAddress>
219 + <Size>0x0</Size>
220 + </Ocm1>
221 + <Ocm2>
222 + <Type>0</Type>
223 + <StartAddress>0x0</StartAddress>
224 + <Size>0x0</Size>
225 + </Ocm2>
226 + <Ocm3>
227 + <Type>0</Type>
228 + <StartAddress>0x0</StartAddress>
229 + <Size>0x0</Size>
230 + </Ocm3>
231 + <Ocm4>
232 + <Type>0</Type>
233 + <StartAddress>0x0</StartAddress>
234 + <Size>0x0</Size>
235 + </Ocm4>
236 + <Ocm5>
237 + <Type>0</Type>
238 + <StartAddress>0x0</StartAddress>
239 + <Size>0x0</Size>
240 + </Ocm5>
241 + <Ocm6>
242 + <Type>0</Type>
243 + <StartAddress>0x0</StartAddress>
244 + <Size>0x0</Size>
245 + </Ocm6>
246 + <IRAM>
247 + <Type>0</Type>
248 + <StartAddress>0x20000000</StartAddress>
249 + <Size>0x8000</Size>
250 + </IRAM>
251 + <IROM>
252 + <Type>1</Type>
253 + <StartAddress>0x0</StartAddress>
254 + <Size>0x40000</Size>
255 + </IROM>
256 + <XRAM>
257 + <Type>0</Type>
258 + <StartAddress>0x0</StartAddress>
259 + <Size>0x0</Size>
260 + </XRAM>
261 + <OCR_RVCT1>
262 + <Type>1</Type>
263 + <StartAddress>0x0</StartAddress>
264 + <Size>0x0</Size>
265 + </OCR_RVCT1>
266 + <OCR_RVCT2>
267 + <Type>1</Type>
268 + <StartAddress>0x0</StartAddress>
269 + <Size>0x0</Size>
270 + </OCR_RVCT2>
271 + <OCR_RVCT3>
272 + <Type>1</Type>
273 + <StartAddress>0x0</StartAddress>
274 + <Size>0x0</Size>
275 + </OCR_RVCT3>
276 + <OCR_RVCT4>
277 + <Type>1</Type>
278 + <StartAddress>0x0</StartAddress>
279 + <Size>0x40000</Size>
280 + </OCR_RVCT4>
281 + <OCR_RVCT5>
282 + <Type>1</Type>
283 + <StartAddress>0x10040000</StartAddress>
284 + <Size>0x40000</Size>
285 + </OCR_RVCT5>
286 + <OCR_RVCT6>
287 + <Type>0</Type>
288 + <StartAddress>0x0</StartAddress>
289 + <Size>0x0</Size>
290 + </OCR_RVCT6>
291 + <OCR_RVCT7>
292 + <Type>0</Type>
293 + <StartAddress>0x0</StartAddress>
294 + <Size>0x0</Size>
295 + </OCR_RVCT7>
296 + <OCR_RVCT8>
297 + <Type>0</Type>
298 + <StartAddress>0x0</StartAddress>
299 + <Size>0x0</Size>
300 + </OCR_RVCT8>
301 + <OCR_RVCT9>
302 + <Type>0</Type>
303 + <StartAddress>0x20000000</StartAddress>
304 + <Size>0x8000</Size>
305 + </OCR_RVCT9>
306 + <OCR_RVCT10>
307 + <Type>0</Type>
308 + <StartAddress>0x30008000</StartAddress>
309 + <Size>0x10000</Size>
310 + </OCR_RVCT10>
311 + </OnChipMemories>
312 + <RvctStartVector></RvctStartVector>
313 + </ArmAdsMisc>
314 + <Cads>
315 + <interw>1</interw>
316 + <Optim>2</Optim>
317 + <oTime>0</oTime>
318 + <SplitLS>0</SplitLS>
319 + <OneElfS>1</OneElfS>
320 + <Strict>0</Strict>
321 + <EnumInt>0</EnumInt>
322 + <PlainCh>0</PlainCh>
323 + <Ropi>0</Ropi>
324 + <Rwpi>0</Rwpi>
325 + <wLevel>0</wLevel>
326 + <uThumb>0</uThumb>
327 + <uSurpInc>0</uSurpInc>
328 + <uC99>0</uC99>
329 + <uGnu>0</uGnu>
330 + <useXO>0</useXO>
331 + <v6Lang>5</v6Lang>
332 + <v6LangP>3</v6LangP>
333 + <vShortEn>1</vShortEn>
334 + <vShortWch>1</vShortWch>
335 + <v6Lto>0</v6Lto>
336 + <v6WtE>0</v6WtE>
337 + <v6Rtti>0</v6Rtti>
338 + <VariousControls>
339 + <MiscControls></MiscControls>
340 + <Define>DEBUG_PORT = UART0_NS</Define>
341 + <Undefine></Undefine>
342 + <IncludePath>..\Secure;.\Crypto;.\MAX30102;..\..\..\Library\CMSIS\Include;..\..\..\Library\Device\Nuvoton\M2351\Include;..\..\..\Library\StdDriver\inc;..\..\..\ThirdParty\mbedTLS\include;..\..\..\ThirdParty\mbedTLS\include\mbedtls</IncludePath>
343 + </VariousControls>
344 + </Cads>
345 + <Aads>
346 + <interw>1</interw>
347 + <Ropi>0</Ropi>
348 + <Rwpi>0</Rwpi>
349 + <thumb>1</thumb>
350 + <SplitLS>0</SplitLS>
351 + <SwStkChk>0</SwStkChk>
352 + <NoWarn>1</NoWarn>
353 + <uSurpInc>0</uSurpInc>
354 + <useXO>0</useXO>
355 + <ClangAsOpt>1</ClangAsOpt>
356 + <VariousControls>
357 + <MiscControls></MiscControls>
358 + <Define></Define>
359 + <Undefine></Undefine>
360 + <IncludePath></IncludePath>
361 + </VariousControls>
362 + </Aads>
363 + <LDads>
364 + <umfTarg>0</umfTarg>
365 + <Ropi>0</Ropi>
366 + <Rwpi>0</Rwpi>
367 + <noStLib>0</noStLib>
368 + <RepFail>1</RepFail>
369 + <useFile>0</useFile>
370 + <TextAddressRange></TextAddressRange>
371 + <DataAddressRange></DataAddressRange>
372 + <pXoBase></pXoBase>
373 + <ScatterFile>.\Objects\Secure.sct</ScatterFile>
374 + <IncludeLibs></IncludeLibs>
375 + <IncludeLibsPath></IncludeLibsPath>
376 + <Misc>--import-cmse-lib-out .\lib\nsclib.o</Misc>
377 + <LinkerInputFile></LinkerInputFile>
378 + <DisabledWarnings></DisabledWarnings>
379 + </LDads>
380 + </TargetArmAds>
381 + </TargetOption>
382 + <Groups>
383 + <Group>
384 + <GroupName>CMSIS</GroupName>
385 + <Files>
386 + <File>
387 + <FileName>system_M2351.c</FileName>
388 + <FileType>1</FileType>
389 + <FilePath>..\..\..\Library\Device\Nuvoton\M2351\Source\system_M2351.c</FilePath>
390 + </File>
391 + <File>
392 + <FileName>startup_M2351.s</FileName>
393 + <FileType>2</FileType>
394 + <FilePath>..\..\..\Library\Device\Nuvoton\M2351\Source\ARM\startup_M2351.s</FilePath>
395 + </File>
396 + </Files>
397 + </Group>
398 + <Group>
399 + <GroupName>Library</GroupName>
400 + <Files>
401 + <File>
402 + <FileName>clk.c</FileName>
403 + <FileType>1</FileType>
404 + <FilePath>..\..\..\Library\StdDriver\src\clk.c</FilePath>
405 + </File>
406 + <File>
407 + <FileName>crypto.c</FileName>
408 + <FileType>1</FileType>
409 + <FilePath>..\..\..\Library\StdDriver\src\crypto.c</FilePath>
410 + </File>
411 + <File>
412 + <FileName>fmc.c</FileName>
413 + <FileType>1</FileType>
414 + <FilePath>..\..\..\Library\StdDriver\src\fmc.c</FilePath>
415 + </File>
416 + <File>
417 + <FileName>gpio.c</FileName>
418 + <FileType>1</FileType>
419 + <FilePath>..\..\..\Library\StdDriver\src\gpio.c</FilePath>
420 + </File>
421 + <File>
422 + <FileName>i2c.c</FileName>
423 + <FileType>1</FileType>
424 + <FilePath>..\..\..\Library\StdDriver\src\i2c.c</FilePath>
425 + </File>
426 + <File>
427 + <FileName>retarget.c</FileName>
428 + <FileType>1</FileType>
429 + <FilePath>..\..\..\Library\StdDriver\src\retarget.c</FilePath>
430 + </File>
431 + <File>
432 + <FileName>spi.c</FileName>
433 + <FileType>1</FileType>
434 + <FilePath>..\..\..\Library\StdDriver\src\spi.c</FilePath>
435 + </File>
436 + <File>
437 + <FileName>sys.c</FileName>
438 + <FileType>1</FileType>
439 + <FilePath>..\..\..\Library\StdDriver\src\sys.c</FilePath>
440 + </File>
441 + <File>
442 + <FileName>uart.c</FileName>
443 + <FileType>1</FileType>
444 + <FilePath>..\..\..\Library\StdDriver\src\uart.c</FilePath>
445 + </File>
446 + </Files>
447 + </Group>
448 + <Group>
449 + <GroupName>Include</GroupName>
450 + <Files>
451 + <File>
452 + <FileName>nsc.h</FileName>
453 + <FileType>5</FileType>
454 + <FilePath>.\nsc.h</FilePath>
455 + </File>
456 + <File>
457 + <FileName>MAX30102.h</FileName>
458 + <FileType>5</FileType>
459 + <FilePath>.\MAX30102\MAX30102.h</FilePath>
460 + </File>
461 + <File>
462 + <FileName>M2351_crypto.h</FileName>
463 + <FileType>5</FileType>
464 + <FilePath>.\Crypto\M2351_crypto.h</FilePath>
465 + </File>
466 + </Files>
467 + </Group>
468 + <Group>
469 + <GroupName>MAX30102</GroupName>
470 + <Files>
471 + <File>
472 + <FileName>MAX30102.c</FileName>
473 + <FileType>1</FileType>
474 + <FilePath>.\MAX30102\MAX30102.c</FilePath>
475 + </File>
476 + </Files>
477 + </Group>
478 + <Group>
479 + <GroupName>Crypto</GroupName>
480 + <Files>
481 + <File>
482 + <FileName>M2351_crypto.c</FileName>
483 + <FileType>1</FileType>
484 + <FilePath>.\Crypto\M2351_crypto.c</FilePath>
485 + </File>
486 + </Files>
487 + </Group>
488 + <Group>
489 + <GroupName>User</GroupName>
490 + <Files>
491 + <File>
492 + <FileName>nsc.c</FileName>
493 + <FileType>1</FileType>
494 + <FilePath>.\nsc.c</FilePath>
495 + </File>
496 + <File>
497 + <FileName>partition_M2351.h</FileName>
498 + <FileType>5</FileType>
499 + <FilePath>.\partition_M2351.h</FilePath>
500 + </File>
501 + <File>
502 + <FileName>mbedTLS_config.h</FileName>
503 + <FileType>5</FileType>
504 + <FilePath>.\mbedTLS_config.h</FilePath>
505 + </File>
506 + <File>
507 + <FileName>main.c</FileName>
508 + <FileType>1</FileType>
509 + <FilePath>.\main.c</FilePath>
510 + </File>
511 + </Files>
512 + </Group>
513 + </Groups>
514 + </Target>
515 + </Targets>
516 +
517 + <RTE>
518 + <apis/>
519 + <components/>
520 + <files>
521 + <file attr="config" category="source" name="CMSIS\RTOS2\RTX\Config\RTX_Config.c" version="5.1.0">
522 + <instance index="0" removed="1">RTE\CMSIS\RTX_Config.c</instance>
523 + <component Capiversion="2.1.3" Cclass="CMSIS" Cgroup="RTOS2" Csub="Keil RTX5" Cvariant="Library" Cvendor="ARM" Cversion="5.5.2" condition="RTOS2 RTX5"/>
524 + <package name="CMSIS" schemaVersion="1.3" url="http://www.keil.com/pack/" vendor="ARM" version="5.7.0"/>
525 + <targetInfos/>
526 + </file>
527 + <file attr="config" category="header" name="CMSIS\RTOS2\RTX\Config\RTX_Config.h" version="5.5.1">
528 + <instance index="0" removed="1">RTE\CMSIS\RTX_Config.h</instance>
529 + <component Capiversion="2.1.3" Cclass="CMSIS" Cgroup="RTOS2" Csub="Keil RTX5" Cvariant="Library" Cvendor="ARM" Cversion="5.5.2" condition="RTOS2 RTX5"/>
530 + <package name="CMSIS" schemaVersion="1.3" url="http://www.keil.com/pack/" vendor="ARM" version="5.7.0"/>
531 + <targetInfos/>
532 + </file>
533 + <file attr="config" category="header" name="WiFi\ESP8266\Config\WiFi_ESP8266_Config.h" version="1.0.0">
534 + <instance index="0" removed="1">RTE\CMSIS_Driver\WiFi_ESP8266_Config.h</instance>
535 + <component Capiversion="1.1.0" Cclass="CMSIS Driver" Cgroup="WiFi" Csub="ESP8266" Cvariant="UART" Cvendor="Keil" Cversion="1.4.0" condition="CMSIS Core with RTOS2 and USART Driver"/>
536 + <package name="CMSIS-Driver" schemaVersion="1.4.9" url="http://www.keil.com/pack/" vendor="ARM" version="2.6.1"/>
537 + <targetInfos/>
538 + </file>
539 + <file attr="config" category="sourceC" name="Device\M2351\StdDriver\src\retarget.c" version="0.00.001">
540 + <instance index="0" removed="1">RTE\Device\M2351KIAAE\retarget.c</instance>
541 + <component Cclass="Device" Cgroup="Startup" Cvendor="Nuvoton" Cversion="0.00.001" condition="M23NuMicro M2351 Device"/>
542 + <package name="NuMicro_DFP" schemaVersion="1.2" url="http://www.nuvoton.com/hq/enu/Documents/KEILSoftwarePack" vendor="Nuvoton" version="1.3.10"/>
543 + <targetInfos/>
544 + </file>
545 + <file attr="config" category="sourceAsm" condition="Compiler ARM" name="Device\M2351\Source\ARM\startup_M2351.s" version="0.00.001">
546 + <instance index="0" removed="1">RTE\Device\M2351KIAAE\startup_M2351.s</instance>
547 + <component Cclass="Device" Cgroup="Startup" Cvendor="Nuvoton" Cversion="0.00.001" condition="M23NuMicro M2351 Device"/>
548 + <package name="NuMicro_DFP" schemaVersion="1.2" url="http://www.nuvoton.com/hq/enu/Documents/KEILSoftwarePack" vendor="Nuvoton" version="1.3.10"/>
549 + <targetInfos/>
550 + </file>
551 + <file attr="config" category="source" name="Device\M2351\Source\system_M2351.c" version="0.00.001">
552 + <instance index="0" removed="1">RTE\Device\M2351KIAAE\system_M2351.c</instance>
553 + <component Cclass="Device" Cgroup="Startup" Cvendor="Nuvoton" Cversion="0.00.001" condition="M23NuMicro M2351 Device"/>
554 + <package name="NuMicro_DFP" schemaVersion="1.2" url="http://www.nuvoton.com/hq/enu/Documents/KEILSoftwarePack" vendor="Nuvoton" version="1.3.10"/>
555 + <targetInfos/>
556 + </file>
557 + <file attr="config" category="source" name="Network\Config\Net_Config.c" version="7.1.0">
558 + <instance index="0" removed="1">RTE\Network\Net_Config.c</instance>
559 + <component Cbundle="MDK-Plus" Cclass="Network" Cgroup="CORE" Cvariant="IPv4 Release" Cvendor="Keil" Cversion="7.14.0" condition="CMSIS Core with RTOS" isDefaultVariant="1"/>
560 + <package name="MDK-Middleware" schemaVersion="1.4" url="http://www.keil.com/pack/" vendor="Keil" version="7.12.0"/>
561 + <targetInfos/>
562 + </file>
563 + <file attr="config" category="header" name="Network\Config\Net_Config_TCP.h" version="7.1.1">
564 + <instance index="0" removed="1">RTE\Network\Net_Config_TCP.h</instance>
565 + <component Cbundle="MDK-Plus" Cclass="Network" Cgroup="Socket" Csub="TCP" Cvendor="Keil" Cversion="7.14.0" condition="Network Interface"/>
566 + <package name="MDK-Middleware" schemaVersion="1.4" url="http://www.keil.com/pack/" vendor="Keil" version="7.12.0"/>
567 + <targetInfos/>
568 + </file>
569 + <file attr="config" category="header" name="Network\Config\Net_Config_WiFi.h" version="7.1.0">
570 + <instance index="0" removed="1">RTE\Network\Net_Config_WiFi_0.h</instance>
571 + <component Cbundle="MDK-Plus" Cclass="Network" Cgroup="Interface" Csub="WiFi" Cvendor="Keil" Cversion="7.14.0" condition="Network Driver WiFi" maxInstances="2"/>
572 + <package name="MDK-Middleware" schemaVersion="1.4" url="http://www.keil.com/pack/" vendor="Keil" version="7.12.0"/>
573 + <targetInfos/>
574 + </file>
575 + <file attr="config" category="header" name="configs\mbedTLS_config.h" version="2.24.0">
576 + <instance index="0" removed="1">RTE\Security\mbedTLS_config.h</instance>
577 + <component Cclass="Security" Cgroup="mbed TLS" Cvendor="ARM" Cversion="2.24.0"/>
578 + <package name="mbedTLS" schemaVersion="1.6.3" url="http://www.keil.com/pack/" vendor="ARM" version="1.7.0"/>
579 + <targetInfos/>
580 + </file>
581 + </files>
582 + </RTE>
583 +
584 + <LayerInfo>
585 + <Layers>
586 + <Layer>
587 + <LayName>Secure</LayName>
588 + <LayPrjMark>1</LayPrjMark>
589 + </Layer>
590 + </Layers>
591 + </LayerInfo>
592 +
593 +</Project>
1 +/**********************************************************
2 + *
3 + * @file : main.c
4 + * @author : HaewonSeo
5 + *
6 + * @note : Main of secure world
7 + **********************************************************/
8 +
9 +#include <arm_cmse.h>
10 +#include <stdio.h>
11 +#include <stdint.h>
12 +#include "NuMicro.h"
13 +#include "partition_M2351.h"
14 +#include "nsc.h"
15 +#include "MAX30102.h"
16 +#include "M2351_crypto.h"
17 +
18 +//extern int ssl_client1(void);
19 +
20 +#define DEBUG_PORT UART0_NS
21 +#define WIFI_PORT UART3_NS // Used to connect to WIFI module
22 +
23 +#define NEXT_BOOT_BASE 0x10040000
24 +#define JUMP_HERE 0xe7fee7ff /* Instruction Code of "B ." */
25 +
26 +/* typedef for NonSecure callback functions */
27 +typedef __NONSECURE_CALL void (*NonSecure_funcptr)(uint32_t);
28 +typedef int32_t (*Secure_funcptr)(uint32_t);
29 +
30 +volatile uint32_t millis_counter;
31 +
32 +/*----------------------------------------------------------------------------
33 + SysTick IRQ Handler
34 + *----------------------------------------------------------------------------*/
35 +void SysTick_Handler(void)
36 +{
37 + static uint32_t u32Ticks;
38 +
39 + millis_counter++;
40 +
41 + switch(u32Ticks++)
42 + {
43 + case 0:
44 + break;
45 + case 100:
46 + break;
47 + case 200:
48 + break;
49 + case 300:
50 + break;
51 + case 400:
52 + break;
53 + case 500:
54 + break;
55 + case 600:
56 + u32Ticks = 0;
57 + break;
58 + default:
59 + if(u32Ticks > 600)
60 + {
61 + u32Ticks = 0;
62 + }
63 + }
64 +
65 +}
66 +
67 +/*---------------------------------------------------------------------------*/
68 +/* Functions */
69 +/*---------------------------------------------------------------------------*/
70 +void SYS_Init(void)
71 +{
72 + /* Set PF multi-function pins for XT1_OUT(PF.2) and XT1_IN(PF.3) */
73 + SYS->GPF_MFPL = (SYS->GPF_MFPL & (~SYS_GPF_MFPL_PF2MFP_Msk)) | SYS_GPF_MFPL_PF2MFP_XT1_OUT;
74 + SYS->GPF_MFPL = (SYS->GPF_MFPL & (~SYS_GPF_MFPL_PF3MFP_Msk)) | SYS_GPF_MFPL_PF3MFP_XT1_IN;
75 +
76 + /*---------------------------------------------------------------------------------------------------------*/
77 + /* Init System Clock */
78 + /*---------------------------------------------------------------------------------------------------------*/
79 +
80 + /* Enable HIRC clock */
81 + CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);
82 +
83 + /* Wait for HIRC clock ready */
84 + CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);
85 +
86 + /* Select HCLK clock source as HIRC and HCLK source divider as 1 */
87 + CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));
88 +
89 + /* Enable HXT clock */
90 + CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);
91 +
92 + /* Wait for HXT clock ready */
93 + CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);
94 +
95 +
96 + /* Enable PLL */
97 + CLK->PLLCTL = CLK_PLLCTL_128MHz_HIRC;
98 +
99 + /* Waiting for PLL stable */
100 + CLK_WaitClockReady(CLK_STATUS_PLLSTB_Msk);
101 +
102 + /* Select HCLK clock source as PLL and HCLK source divider as 1 */
103 + CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_PLL, CLK_CLKDIV0_HCLK(1));
104 +
105 +
106 + /* Select UART clock source */
107 + //CLK->CLKSEL1 = (CLK->CLKSEL1 & (~CLK_CLKSEL1_UART0SEL_Msk)) | CLK_CLKSEL1_UART0SEL_HIRC;
108 + //CLK->CLKSEL3 = (CLK->CLKSEL3 & (~CLK_CLKSEL3_UART3SEL_Msk)) | CLK_CLKSEL3_UART3SEL_HIRC;
109 +
110 + CLK->PWRCTL |= CLK_PWRCTL_HIRC48EN_Msk;
111 + while((CLK->STATUS & CLK_STATUS_HIRC48STB_Msk) == 0);
112 + CLK->CLKSEL0 = CLK_CLKSEL0_HCLKSEL_HIRC48;
113 +
114 + /* Select IP clock source */
115 + CLK->CLKSEL1 = CLK_CLKSEL1_UART0SEL_HIRC | CLK_CLKSEL1_UART1SEL_HIRC;
116 + CLK->CLKSEL3 = CLK_CLKSEL3_UART2SEL_HIRC | CLK_CLKSEL3_UART3SEL_HIRC | CLK_CLKSEL3_UART5SEL_HIRC;
117 +
118 + /* Enable Crypto Accelerator */
119 + CLK->AHBCLK |= CLK_AHBCLK_CRPTCKEN_Msk;
120 +
121 + /* Enable IP clock */
122 + CLK->APBCLK0 |= CLK_APBCLK0_UART0CKEN_Msk | CLK_APBCLK0_TMR0CKEN_Msk | CLK_APBCLK0_UART1CKEN_Msk |
123 + CLK_APBCLK0_UART2CKEN_Msk | CLK_APBCLK0_UART3CKEN_Msk | CLK_APBCLK0_UART5CKEN_Msk;
124 +
125 +
126 + /* Enable UART module clock */
127 + //CLK_EnableModuleClock(UART0_MODULE);
128 +
129 + /* Select UART module clock source as HXT `and UART module clock divider as 1 */
130 + //CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HXT, CLK_CLKDIV0_UART0(1));
131 +
132 + /* Select HIRC as the clock source of SPI0 */
133 + CLK_SetModuleClock(SPI1_MODULE, CLK_CLKSEL2_SPI1SEL_PCLK0, MODULE_NoMsk);
134 + //CLK_SetModuleClock(SDH0_MODULE, CLK_CLKSEL2_SPI0SEL_HIRC, MODULE_NoMsk);
135 +
136 + /* Enable I2C0 peripheral clock */
137 + CLK_EnableModuleClock(I2C0_MODULE);
138 +
139 + /* Enable I2C1 peripheral clock */
140 + //CLK_EnableModuleClock(I2C1_MODULE);
141 +
142 + /* Enable SPI0 peripheral clock */
143 + CLK_EnableModuleClock(SPI1_MODULE);
144 + //CLK_EnableModuleClock(SDH0_MODULE);
145 +
146 +
147 +
148 + /* Update System Core Clock */
149 + /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
150 + //SystemCoreClockUpdate();
151 + PllClock = 128000000; // PLL
152 + SystemCoreClock = 64000000 / 1; // HCLK
153 + CyclesPerUs = 64000000 / 1000000; // For SYS_SysTickDelay()
154 +
155 + /*---------------------------------------------------------------------------------------------------------*/
156 + /* Init I/O Multi-function */
157 + /*---------------------------------------------------------------------------------------------------------*/
158 +
159 + /* Set multi-function pins for UART0 RXD and TXD */
160 + SYS->GPB_MFPH = (SYS->GPB_MFPH & (~(UART0_RXD_PB12_Msk | UART0_TXD_PB13_Msk))) | UART0_RXD_PB12 | UART0_TXD_PB13;
161 +
162 + /* Set PA multi-function pins for I2C0 SDA and SCL */
163 + /* PA.4(56):SDA, PA.5(55):SCL*/
164 + SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA4MFP_Msk | SYS_GPA_MFPL_PA5MFP_Msk);
165 + SYS->GPA_MFPL |= (SYS_GPA_MFPL_PA4MFP_I2C0_SDA | SYS_GPA_MFPL_PA5MFP_I2C0_SCL);
166 +
167 + /* Set PA multi-function pins for I2C1 SDA and SCL */
168 + /* PA.2(58):SDA, PA.3(57):SCL*/
169 + //SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA2MFP_Msk | SYS_GPA_MFPL_PA3MFP_Msk);
170 + //SYS->GPA_MFPL |= (SYS_GPA_MFPL_PA2MFP_I2C1_SDA | SYS_GPA_MFPL_PA3MFP_I2C1_SCL);
171 +
172 + /* Setup SPI0 multi-function pins */
173 + /* Reference the Arduino UNO compatible interface */
174 + //SYS->GPF_MFPL &= ~(SYS_GPF_MFPL_PF6MFP_Msk | SYS_GPF_MFPL_PF7MFP_Msk | SYS_GPF_MFPH_PF8MFP_Msk | SYS_GPF_MFPH_PF9MFP_Msk);
175 + //SYS->GPF_MFPL |= (SYS_GPF_MFPL_PF6MFP_SPI0_MOSI | SYS_GPF_MFPL_PF7MFP_SPI0_MISO | SYS_GPF_MFPH_PF8MFP_SPI0_CLK | SYS_GPF_MFPH_PF9MFP_SPI0_SS);
176 +
177 + /* Setup SPI0 multi-function pins */
178 + //SYS->GPD_MFPL &= ~(SYS_GPD_MFPL_PD0MFP_Msk | SYS_GPD_MFPL_PD2MFP_Msk | SYS_GPD_MFPL_PD3MFP_Msk);
179 + //SYS->GPD_MFPL |= (SYS_GPD_MFPL_PD0MFP_SPI0_MOSI | SYS_GPD_MFPL_PD2MFP_SPI0_CLK | SYS_GPD_MFPL_PD3MFP_SPI0_SS);
180 +
181 + /* Setup SPI0 multi-function pins */
182 + //SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA0MFP_Msk | SYS_GPA_MFPL_PA2MFP_Msk | SYS_GPA_MFPL_PA3MFP_Msk);
183 + //SYS->GPA_MFPL |= (SYS_GPA_MFPL_PA0MFP_SPI0_MOSI | SYS_GPA_MFPL_PA2MFP_SPI0_CLK | SYS_GPA_MFPL_PA3MFP_SPI0_SS);
184 +
185 + /* Setup SPI1 multi-function pins */
186 + SYS->GPH_MFPH &= ~(SYS_GPH_MFPH_PH8MFP_Msk | SYS_GPH_MFPH_PH9MFP_Msk);
187 + SYS->GPH_MFPH |= (SYS_GPH_MFPH_PH8MFP_SPI1_CLK | SYS_GPH_MFPH_PH9MFP_SPI1_SS);
188 +
189 + SYS->GPE_MFPL &= ~(SYS_GPE_MFPL_PE0MFP_Msk);
190 + SYS->GPE_MFPL |= (SYS_GPE_MFPL_PE0MFP_SPI1_MOSI);
191 +}
192 +
193 +
194 +/*---------------------------------------------------------------------------------------------------------*/
195 +/* Init UART0_NS :115200, 8-bit word, no parity bit, 1 stop bit. */
196 +/*---------------------------------------------------------------------------------------------------------*/
197 +void DEBUG_PORT_Init()
198 +{
199 + DEBUG_PORT->LINE = UART_PARITY_NONE | UART_STOP_BIT_1 | UART_WORD_LEN_8;
200 + DEBUG_PORT->BAUD = UART_BAUD_MODE2 | UART_BAUD_MODE2_DIVIDER(__HIRC, 115200);
201 +}
202 +
203 +/*---------------------------------------------------------------------------------------------------------*/
204 +/* Init UART3_NS :115200, 8-bit word, no parity bit, 1 stop bit. */
205 +/*---------------------------------------------------------------------------------------------------------*/
206 +void WIFI_PORT_Init()
207 +{
208 + CLK->APBCLK0 |= CLK_APBCLK0_UART4CKEN_Msk;
209 + CLK->CLKSEL3 = (CLK->CLKSEL3 & (~CLK_CLKSEL3_UART3SEL_Msk)) | CLK_CLKSEL3_UART3SEL_HIRC;
210 +
211 + WIFI_PORT->LINE = UART_PARITY_NONE | UART_STOP_BIT_1 | UART_WORD_LEN_8;
212 + WIFI_PORT->BAUD = UART_BAUD_MODE2 | UART_BAUD_MODE2_DIVIDER(__HIRC, 115200);
213 +
214 + /* Set multi-function pins for RXD and TXD */
215 + //SYS->GPC_MFPL = (SYS->GPC_MFPL & (~(UART4_RXD_PC6_Msk | UART4_TXD_PC7_Msk))) | UART4_RXD_PC6 | UART4_TXD_PC7;
216 + SYS->GPD_MFPL = (SYS->GPD_MFPL & (~(UART3_RXD_PD0_Msk | UART3_TXD_PD1_Msk))) | UART3_RXD_PD0 | UART3_TXD_PD1;
217 +}
218 +
219 +/*---------------------------------------------------------------------------------------------------------*/
220 +/* Init I2C0 */
221 +/*---------------------------------------------------------------------------------------------------------*/
222 +void I2C0_Init(void)
223 +{
224 +
225 + /* Open I2C0 module and set bus clock */
226 + I2C_Open(I2C0, 400000);
227 +
228 + /* Get I2C0 Bus Clock */
229 + //printf("I2C0 clock %d Hz\n", I2C_GetBusClockFreq(I2C0));
230 +
231 + /* Set I2C0 Slave Addresses */
232 + I2C_SetSlaveAddr(I2C0, 0, MAX30102_ADDR, 0); /* MAX30102 Slave Address : 0x57 */
233 +
234 +}
235 +
236 +/*---------------------------------------------------------------------------------------------------------*/
237 +/* Init SPI */
238 +/*---------------------------------------------------------------------------------------------------------*/
239 +/* Configure as a master, clock idle low, 32-bit transaction, drive output on falling clock edge and latch input on rising edge. */
240 +void SPI_Init(void)
241 +{
242 + /* Set IP clock divider. SPI clock rate = 2MHz */
243 + SPI_Open(SPI1_NS, SPI_MASTER, SPI_MODE_0, 32, 2000000);
244 +
245 + /* Enable the automatic hardware slave select function. Select the SS pin and configure as low-active. */
246 + SPI_EnableAutoSS(SPI1_NS, SPI_SS, SPI_SS_ACTIVE_LOW);
247 +
248 + SPI_SET_DATA_WIDTH(SPI1_NS, 8);
249 +}
250 +
251 +
252 +void Nonsecure_Init(void)
253 +{
254 + NonSecure_funcptr fp;
255 +
256 + /* SCB_NS.VTOR points to the Non-secure vector table base address. */
257 + SCB_NS->VTOR = NEXT_BOOT_BASE;
258 +
259 + /* 1st Entry in the vector table is the Non-secure Main Stack Pointer. */
260 + __TZ_set_MSP_NS(*((uint32_t *)SCB_NS->VTOR)); /* Set up MSP in Non-secure code */
261 +
262 + /* 2nd entry contains the address of the Reset_Handler (CMSIS-CORE) function */
263 + fp = ((NonSecure_funcptr)(*(((uint32_t *)SCB_NS->VTOR) + 1)));
264 +
265 + /* Clear the LSB of the function address to indicate the function-call
266 + will cause a state switch from Secure to Non-secure */
267 + fp = cmse_nsfptr_create(fp);
268 +
269 + /* Check if the Reset_Handler address is in Non-secure space */
270 + if(cmse_is_nsfptr(fp) && (((uint32_t)fp & 0xf0000000) == 0x10000000))
271 + {
272 + printf("\nExecute Non-secure code ...\n");
273 + fp(0); /* Non-secure function call */
274 + }
275 + else
276 + {
277 + /* Something went wrong */
278 + printf("No code in non-secure region!\n");
279 + printf("CPU will halted at non-secure state\n");
280 +
281 + /* Set nonsecure MSP in nonsecure region */
282 + __TZ_set_MSP_NS(NON_SECURE_SRAM_BASE + 512);
283 +
284 + /* Try to halted in non-secure state (SRAM) */
285 + M32(NON_SECURE_SRAM_BASE) = JUMP_HERE;
286 + fp = (NonSecure_funcptr)(NON_SECURE_SRAM_BASE + 1);
287 + fp(0);
288 +
289 + while(1);
290 + }
291 +}
292 +
293 +
294 +/*---------------------------------------------------------------------------------------------------------*/
295 +/* Main Function */
296 +/*---------------------------------------------------------------------------------------------------------*/
297 +int32_t main(void)
298 +{
299 +
300 + /* Unlock protected registers */
301 + SYS_UnlockReg();
302 +
303 + /* Init System, IP clock and multi-function I/O. */
304 + SYS_Init();
305 +
306 + /* Lock protected registers */
307 + SYS_LockReg();
308 +
309 + /* Call secure API to get system core clock */
310 + //SystemCoreClock = GetSystemCoreClock();
311 +
312 + /* Generate Systick interrupt each 1 ms */
313 + SysTick_Config(SystemCoreClock / 1000);
314 +
315 + /* Inin UART and I2C0 */
316 + DEBUG_PORT_Init();
317 + WIFI_PORT_Init();
318 + I2C0_Init();
319 + SPI_Init();
320 +
321 + printf("+---------------------------------------------+\n");
322 + printf("| Secure is running ... |\n");
323 + printf("+---------------------------------------------+\n");
324 +
325 + /* Config MAX30102 */
326 + MAX30102_Config();
327 +
328 + Nonsecure_Init();
329 +
330 + do
331 + {
332 + //OLED_HeartRate(0, hr++);
333 + //CLK_SysTickLongDelay(2000000);
334 + __WFI();
335 + }
336 + while(1);
337 +
338 +
339 +}
340 +
1 +/*
2 + * Configuration template
3 + *
4 + * Copyright (C) 2006-2021, Arm Limited, All Rights Reserved
5 + * SPDX-License-Identifier: Apache-2.0
6 + *
7 + * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 + * not use this file except in compliance with the License.
9 + * You may obtain a copy of the License at
10 + *
11 + * http://www.apache.org/licenses/LICENSE-2.0
12 + *
13 + * Unless required by applicable law or agreed to in writing, software
14 + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 + * See the License for the specific language governing permissions and
17 + * limitations under the License.
18 + */
19 +/*
20 + * This set of compile-time options may be used to enable
21 + * or disable features selectively, and reduce the global
22 + * memory footprint.
23 + */
24 +
25 +#ifndef MBEDTLS_CONFIG_H
26 +#define MBEDTLS_CONFIG_H
27 +
28 +/* System support */
29 +//#define MBEDTLS_HAVE_ASM
30 +//#define MBEDTLS_HAVE_TIME
31 +//#define MBEDTLS_HAVE_TIME_DATE
32 +//#define MBEDTLS_PLATFORM_MEMORY
33 +//#define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS
34 +//#define MBEDTLS_CHECK_PARAMS
35 +
36 +/* mbed TLS feature support */
37 +#define MBEDTLS_ENTROPY_HARDWARE_ALT
38 +#define MBEDTLS_AES_ROM_TABLES
39 +//#define MBEDTLS_AES_FEWER_TABLES
40 +//#define MBEDTLS_CAMELLIA_SMALL_MEMORY
41 +#define MBEDTLS_CIPHER_MODE_CBC
42 +#define MBEDTLS_CIPHER_MODE_CFB
43 +#define MBEDTLS_CIPHER_MODE_CTR
44 +//#define MBEDTLS_CIPHER_MODE_OFB
45 +//#define MBEDTLS_CIPHER_MODE_XTS
46 +#define MBEDTLS_CIPHER_PADDING_PKCS7
47 +#define MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS
48 +#define MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN
49 +#define MBEDTLS_CIPHER_PADDING_ZEROS
50 +#define MBEDTLS_REMOVE_ARC4_CIPHERSUITES
51 +#define MBEDTLS_REMOVE_3DES_CIPHERSUITES
52 +#define MBEDTLS_ECP_DP_SECP192R1_ENABLED
53 +#define MBEDTLS_ECP_DP_SECP224R1_ENABLED
54 +#define MBEDTLS_ECP_DP_SECP256R1_ENABLED
55 +#define MBEDTLS_ECP_DP_SECP384R1_ENABLED
56 +#define MBEDTLS_ECP_DP_SECP521R1_ENABLED
57 +#define MBEDTLS_ECP_DP_SECP192K1_ENABLED
58 +#define MBEDTLS_ECP_DP_SECP224K1_ENABLED
59 +#define MBEDTLS_ECP_DP_SECP256K1_ENABLED
60 +#define MBEDTLS_ECP_DP_BP256R1_ENABLED
61 +#define MBEDTLS_ECP_DP_BP384R1_ENABLED
62 +#define MBEDTLS_ECP_DP_BP512R1_ENABLED
63 +#define MBEDTLS_ECP_DP_CURVE25519_ENABLED
64 +#define MBEDTLS_ECP_DP_CURVE448_ENABLED
65 +#define MBEDTLS_ECP_NIST_OPTIM
66 +//#define MBEDTLS_ECP_RESTARTABLE
67 +#define MBEDTLS_ECDSA_DETERMINISTIC
68 +#define MBEDTLS_KEY_EXCHANGE_PSK_ENABLED
69 +#define MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED
70 +#define MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED
71 +#define MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED
72 +#define MBEDTLS_KEY_EXCHANGE_RSA_ENABLED
73 +#define MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED
74 +#define MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED
75 +#define MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED
76 +#define MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED
77 +#define MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED
78 +//#define MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED
79 +#define MBEDTLS_PK_PARSE_EC_EXTENDED
80 +#define MBEDTLS_ERROR_STRERROR_DUMMY
81 +#define MBEDTLS_GENPRIME
82 +//#define MBEDTLS_FS_IO
83 +//#define MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES
84 +#define MBEDTLS_NO_PLATFORM_ENTROPY
85 +//#define MBEDTLS_ENTROPY_FORCE_SHA256
86 +//#define MBEDTLS_ENTROPY_NV_SEED
87 +//#define MBEDTLS_MEMORY_DEBUG
88 +//#define MBEDTLS_MEMORY_BACKTRACE
89 +#define MBEDTLS_PK_RSA_ALT_SUPPORT
90 +#define MBEDTLS_PKCS1_V15
91 +#define MBEDTLS_PKCS1_V21
92 +//#define MBEDTLS_PSA_CRYPTO_SPM
93 +//#define MBEDTLS_RSA_NO_CRT
94 +#define MBEDTLS_SELF_TEST
95 +//#define MBEDTLS_SHA256_SMALLER
96 +//#define MBEDTLS_SHA512_SMALLER
97 +//#define MBEDTLS_SHA512_NO_SHA384
98 +#define MBEDTLS_SSL_ALL_ALERT_MESSAGES
99 +//#define MBEDTLS_SSL_RECORD_CHECKING
100 +//#define MBEDTLS_SSL_DTLS_CONNECTION_ID
101 +//#define MBEDTLS_SSL_ASYNC_PRIVATE
102 +//#define MBEDTLS_SSL_CONTEXT_SERIALIZATION
103 +//#define MBEDTLS_SSL_DEBUG_ALL
104 +#define MBEDTLS_SSL_ENCRYPT_THEN_MAC
105 +#define MBEDTLS_SSL_EXTENDED_MASTER_SECRET
106 +#define MBEDTLS_SSL_FALLBACK_SCSV
107 +//#define MBEDTLS_SSL_KEEP_PEER_CERTIFICATE
108 +//#define MBEDTLS_SSL_HW_RECORD_ACCEL
109 +#define MBEDTLS_SSL_CBC_RECORD_SPLITTING
110 +#define MBEDTLS_SSL_RENEGOTIATION
111 +//#define MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO
112 +//#define MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE
113 +#define MBEDTLS_SSL_MAX_FRAGMENT_LENGTH
114 +#define MBEDTLS_SSL_PROTO_SSL3
115 +#define MBEDTLS_SSL_PROTO_TLS1
116 +#define MBEDTLS_SSL_PROTO_TLS1_1
117 +#define MBEDTLS_SSL_PROTO_TLS1_2
118 +#define MBEDTLS_SSL_PROTO_DTLS
119 +#define MBEDTLS_SSL_ALPN
120 +#define MBEDTLS_SSL_DTLS_ANTI_REPLAY
121 +#define MBEDTLS_SSL_DTLS_HELLO_VERIFY
122 +#define MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE
123 +#define MBEDTLS_SSL_DTLS_BADMAC_LIMIT
124 +#define MBEDTLS_SSL_SESSION_TICKETS
125 +//#define MBEDTLS_SSL_EXPORT_KEYS
126 +#define MBEDTLS_SSL_SERVER_NAME_INDICATION
127 +#define MBEDTLS_SSL_TRUNCATED_HMAC
128 +//#define MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH
129 +//#define MBEDTLS_USE_PSA_CRYPTO
130 +#define MBEDTLS_VERSION_FEATURES
131 +//#define MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3
132 +//#define MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION
133 +//#define MBEDTLS_X509_TRUSTED_CERTIFICATE_CALLBACK
134 +#define MBEDTLS_X509_CHECK_KEY_USAGE
135 +#define MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE
136 +#define MBEDTLS_X509_RSASSA_PSS_SUPPORT
137 +//#define MBEDTLS_ZLIB_SUPPORT
138 +
139 +/* mbed TLS modules */
140 +#define MBEDTLS_AES_C
141 +#define MBEDTLS_ARC4_C
142 +#define MBEDTLS_ASN1_PARSE_C
143 +#define MBEDTLS_ASN1_WRITE_C
144 +#define MBEDTLS_BASE64_C
145 +#define MBEDTLS_BIGNUM_C
146 +#define MBEDTLS_BLOWFISH_C
147 +#define MBEDTLS_CAMELLIA_C
148 +//#define MBEDTLS_ARIA_C
149 +#define MBEDTLS_CCM_C
150 +#define MBEDTLS_CERTS_C
151 +//#define MBEDTLS_CHACHA20_C
152 +//#define MBEDTLS_CHACHAPOLY_C
153 +#define MBEDTLS_CIPHER_C
154 +//#define MBEDTLS_CMAC_C
155 +#define MBEDTLS_CTR_DRBG_C
156 +#define MBEDTLS_DEBUG_C
157 +#define MBEDTLS_DES_C
158 +#define MBEDTLS_DHM_C
159 +#define MBEDTLS_ECDH_C
160 +#define MBEDTLS_ECDSA_C
161 +//#define MBEDTLS_ECJPAKE_C
162 +#define MBEDTLS_ECP_C
163 +#define MBEDTLS_ENTROPY_C
164 +#define MBEDTLS_ERROR_C
165 +#define MBEDTLS_GCM_C
166 +//#define MBEDTLS_HAVEGE_C
167 +//#define MBEDTLS_HKDF_C
168 +#define MBEDTLS_HMAC_DRBG_C
169 +//#define MBEDTLS_NIST_KW_C
170 +#define MBEDTLS_MD_C
171 +//#define MBEDTLS_MD2_C
172 +//#define MBEDTLS_MD4_C
173 +#define MBEDTLS_MD5_C
174 +//#define MBEDTLS_MEMORY_BUFFER_ALLOC_C
175 +#define MBEDTLS_NET_C
176 +#define MBEDTLS_OID_C
177 +#define MBEDTLS_PEM_PARSE_C
178 +#define MBEDTLS_PEM_WRITE_C
179 +#define MBEDTLS_PK_C
180 +#define MBEDTLS_PK_PARSE_C
181 +#define MBEDTLS_PK_WRITE_C
182 +#define MBEDTLS_PKCS5_C
183 +//#define MBEDTLS_PKCS11_C
184 +#define MBEDTLS_PKCS12_C
185 +#define MBEDTLS_PLATFORM_C
186 +//#define MBEDTLS_POLY1305_C
187 +//#define MBEDTLS_PSA_CRYPTO_C
188 +//#define MBEDTLS_PSA_CRYPTO_SE_C
189 +//#define MBEDTLS_PSA_CRYPTO_STORAGE_C
190 +//#define MBEDTLS_PSA_ITS_FILE_C
191 +#define MBEDTLS_RIPEMD160_C
192 +#define MBEDTLS_RSA_C
193 +#define MBEDTLS_SHA1_C
194 +#define MBEDTLS_SHA256_C
195 +#define MBEDTLS_SHA512_C
196 +#define MBEDTLS_SSL_CACHE_C
197 +#define MBEDTLS_SSL_COOKIE_C
198 +#define MBEDTLS_SSL_TICKET_C
199 +#define MBEDTLS_SSL_CLI_C
200 +//#define MBEDTLS_SSL_SRV_C
201 +#define MBEDTLS_SSL_TLS_C
202 +//#define MBEDTLS_THREADING_C
203 +//#define MBEDTLS_TIMING_C
204 +#define MBEDTLS_VERSION_C
205 +#define MBEDTLS_X509_USE_C
206 +#define MBEDTLS_X509_CRT_PARSE_C
207 +#define MBEDTLS_X509_CRL_PARSE_C
208 +#define MBEDTLS_X509_CSR_PARSE_C
209 +#define MBEDTLS_X509_CREATE_C
210 +#define MBEDTLS_X509_CRT_WRITE_C
211 +#define MBEDTLS_X509_CSR_WRITE_C
212 +#define MBEDTLS_XTEA_C
213 +
214 +#include "mbedtls/check_config.h"
215 +
216 +#endif /* MBEDTLS_CONFIG_H */
1 +/**********************************************************
2 + *
3 + * @file : nsc.c
4 + * @author : HaewonSeo
5 + *
6 + * @note : Non-Secure callable
7 + **********************************************************/
8 +
9 +#include "nsc.h"
10 +
11 +uint32_t startTime, endTime, OLED_printTime;
12 +
13 +extern char priKey[49];
14 +extern char pubKey1[49], pubKey2[49];
15 +extern char R[49], S[49];
16 +
17 +t_digitallySignedData gDSD;
18 +
19 +/*----------------------------------------------------------------------------
20 + NonSecure callable function for NonSecure callback
21 + *----------------------------------------------------------------------------*/
22 +
23 +NonSecure_funcptr pfNonSecure_OLED_On = (NonSecure_funcptr)NULL;
24 +NonSecure_funcptr pfNonSecure_OLED_Off = (NonSecure_funcptr)NULL;
25 +
26 +__NONSECURE_ENTRY
27 +int32_t Secure_OLED_On_callback(NonSecure_funcptr *callback)
28 +{
29 + pfNonSecure_OLED_On = (NonSecure_funcptr)cmse_nsfptr_create(callback);
30 + return 0;
31 +}
32 +
33 +__NONSECURE_ENTRY
34 +int32_t Secure_OLED_Off_callback(NonSecure_funcptr *callback)
35 +{
36 + pfNonSecure_OLED_Off = (NonSecure_funcptr)cmse_nsfptr_create(callback);
37 + return 0;
38 +}
39 +
40 +/*----------------------------------------------------------------------------
41 + Secure functions exported to NonSecure application
42 + Must place in Non-secure Callable
43 + *----------------------------------------------------------------------------*/
44 +
45 +__NONSECURE_ENTRY
46 +uint32_t GetSystemCoreClock(void)
47 +{
48 + //printf("System core clock = %d.\n", SystemCoreClock);
49 + return SystemCoreClock;
50 +}
51 +
52 +
53 +__NONSECURE_ENTRY
54 +uint32_t Get_BPM()
55 +{
56 + uint32_t ret;
57 + static uint32_t ticks;
58 +
59 + ret = MAX30102_ComputeBPM();
60 +
61 + ticks++;
62 +
63 + if (ticks == 60)
64 + {
65 + ticks = 0;
66 + startTime = millis_counter;
67 + /* Refresh OLED */
68 + pfNonSecure_OLED_On(9999);
69 + pfNonSecure_OLED_On(beatAvg);
70 + endTime = millis_counter;
71 +
72 + OLED_printTime = endTime - startTime;
73 + //printf("OLED print time = %u\n", OLED_printTime);
74 + }
75 + else
76 + OLED_printTime = 0;
77 +
78 + if (ret == 0)
79 + return 0;
80 +
81 + return beatAvg;
82 +}
83 +
84 +__NONSECURE_ENTRY
85 +uint32_t Get_EncryptedDigitallySignedData(t_digitallySignedData *dsd)
86 +{
87 + uint32_t ret;
88 + static uint32_t ticks;
89 + __attribute__((aligned(4))) uint8_t plainBPM[16] = //{0};
90 + {
91 + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
92 + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30
93 + };
94 +
95 + ret = MAX30102_ComputeBPM();
96 +
97 + ticks++;
98 +
99 + if (ticks >= 60)
100 + {
101 + ticks = 0;
102 + startTime = millis_counter;
103 +
104 + /* Refresh OLED */
105 + pfNonSecure_OLED_On(9999);
106 + pfNonSecure_OLED_On(beatAvg);
107 + endTime = millis_counter;
108 +
109 + OLED_printTime = endTime - startTime;
110 + //printf("OLED print time = %u\n", OLED_printTime);
111 +
112 + /* Encyrpt beatAvg */
113 + memcpy(plainBPM, &beatAvg, sizeof(uint8_t));
114 +
115 + /* hashing(sha1) -> Generate Signature -> Encrypt plainBPM & Signiture */
116 +
117 + M2351_ECDSA_GenerateSignature((uint8_t *)plainBPM, priKey, R, S);
118 +
119 + Encrypt_data((uint8_t *)plainBPM, (uint8_t *)dsd->data, sizeof(plainBPM));
120 + Encrypt_data((uint8_t *)pubKey1, (uint8_t *)dsd->pubKey1, 24);
121 + Encrypt_data((uint8_t *)pubKey2, (uint8_t *)dsd->pubKey2, 24);
122 + Encrypt_data((uint8_t *)R, (uint8_t *)dsd->R, 24);
123 + Encrypt_data((uint8_t *)S, (uint8_t *)dsd->S, 24);
124 +
125 + printf("\nplainBPM\n");
126 + printBlock(plainBPM);
127 + printf("\nencryptedBPM\n");
128 + printBlock((uint8_t *)dsd->data);
129 + }
130 + else
131 + OLED_printTime = 0;
132 +
133 + if (beatAvg == 0)
134 + return 0;
135 +
136 + return 1;
137 +}
138 +
139 +
140 +
141 +/*----------------------------------------------------------------------------
142 + CRYPTO Secure functions exported to NonSecure application
143 + Must place in Non-secure Callable
144 + *----------------------------------------------------------------------------*/
145 +
146 +__NONSECURE_ENTRY
147 +int32_t Encrypt_data(uint8_t *plainData, uint8_t *encryptedData, uint32_t bytes) {
148 +
149 + if (DEMO) printf("\n| Secure is running ... Encrypt_data |\n");
150 +
151 + M2351_Crypto_Init(0, ENCRYPT);
152 + M2351_Crypto_UseSessionKey(0);
153 + M2351_Encrypt_Data(0, plainData, encryptedData, bytes);
154 +
155 + //M2351_crypto_init(1, ENCRYPT);
156 + //M2351_crypto_useMasterKey();
157 + //M2351_encrypt_data(1, plainData, cipheredData);
158 +
159 + return (int32_t)encryptedData;
160 +}
161 +
162 +__NONSECURE_ENTRY
163 +int32_t Decrypt_data(uint8_t *encryptedData, uint8_t *resultData, uint32_t bytes) {
164 +
165 + if (DEMO) printf("\n| Secure is running ... Decrypt_data |\n");
166 +
167 + M2351_Crypto_Init(0, DECRYPT);
168 + M2351_Crypto_UseSessionKey(0);
169 + M2351_Decrypt_Data(0, encryptedData, resultData, bytes);
170 +
171 +
172 + //M2351_crypto_init(1, DECRYPT);
173 + //M2351_crypto_useMasterKey();
174 + //M2351_decrypt_data(1, cipheredData, resultData);
175 +
176 + return (int32_t)resultData;
177 +}
178 +
179 +
180 +__NONSECURE_ENTRY
181 +void M2351_LoadKey()
182 +{
183 + static int called;
184 +
185 + if (called)
186 + return ;
187 +
188 + called = 1;
189 +
190 + printf("+---------------------------------------------+\n");
191 + printf("| Load PriKey from OTP & Generate PubKey |\n");
192 + printf("+---------------------------------------------+\n");
193 +
194 + M2351_FMC_Read_Key(0, 3, priKey);
195 + printf("prikey(%d-bits) : %s\n", strlen(priKey) * 4, priKey);
196 +
197 + M2351_ECC_GenerateKey(priKey, pubKey1, pubKey2);
198 + printf("pubKey1(%d-bits) : %s\npubKey2(%d-bits) : %s\n", strlen(pubKey1) * 4, pubKey1, strlen(pubKey2) * 4, pubKey2);
199 +
200 + return ;
201 +}
202 +
203 +__NONSECURE_ENTRY
204 +void M2351_DeleteKey()
205 +{
206 + memset(priKey, 0, sizeof(char) * 49);
207 + memset(pubKey1, 0, sizeof(char) * 49);
208 + memset(pubKey2, 0, sizeof(char) * 49);
209 + memset(R, 0, sizeof(char) * 49);
210 + memset(S, 0, sizeof(char) * 49);
211 + //memset(&gDSD, 0, sizeof(t_digitallySignedData));
212 +
213 + printf("\nDelete Key & Signature OK.\n");
214 +}
215 +
216 +/*----------------------------------------------------------------------------
217 + PRINT Secure functions exported to NonSecure application
218 + Must place in Non-secure Callable
219 + *----------------------------------------------------------------------------*/
220 +
221 +
222 +__NONSECURE_ENTRY
223 +int32_t printBlock(uint8_t *block) {
224 +
225 + //printf("&block = %p\n",block);
226 +
227 + for (uint8_t i = 0; i < 4; i++) {
228 + printf("|");
229 + for (uint8_t j = 0; j < 16; j = j+4) {
230 +
231 + printf(" %02x",block[i+j]);
232 +
233 + }
234 + printf(" |\n");
235 + }
236 + printf("\n");
237 +
238 + return 1;
239 +}
240 +
241 +__NONSECURE_ENTRY
242 +int32_t printSecure(char *string, void *ptr, uint8_t val) {
243 +
244 + if (ptr == NULL && val == NULL) printf("%s\n",string);
245 + if (ptr == NULL && val != NULL) printf(string,val);
246 + if (ptr != NULL && val == NULL) printf(string,ptr);
247 +
248 + return 1;
249 +}
250 +
251 +
252 +
253 +__NONSECURE_ENTRY
254 +int32_t printDigitallySignedData(t_digitallySignedData *dsd)
255 +{
256 + int32_t i;
257 +
258 + printf(".data(%d-bits):\n", (sizeof(dsd->data)-1) * 8);
259 + for(i=0; i<16; i++)
260 + printf("%02x", dsd->data[i]);
261 +
262 + //printf("\n.pubKey1(%d-bits):\n", (sizeof(dsd->pubKey1)-1) * 8);
263 + //for(i=0; i<24; i++)
264 + // printf("%02x", dsd->pubKey1[i]);
265 +
266 + //printf("\n.pubKey2(%d-bits):\n", (sizeof(dsd->pubKey2)-1) * 8);
267 + //for(i=0; i<24; i++)
268 + // printf("%02x", dsd->pubKey2[i]);
269 +
270 + printf("\n.SignatureR(%d-bits):\n", (sizeof(dsd->R)-1) * 8);
271 + for(i=0; i<24; i++)
272 + printf("%02x", dsd->R[i]);
273 +
274 + printf("\n.SignatureS(%d-bits):\n", (sizeof(dsd->S)-1) * 8);
275 + for(i=0; i<24; i++)
276 + printf("%02x", dsd->S[i]);
277 +
278 + printf("\n");
279 +
280 + return 1;
281 +}
282 +
1 +/**********************************************************
2 + *
3 + * @file : nsc.h
4 + * @author : HaewonSeo
5 + *
6 + * @note : Non-Secure callable
7 + **********************************************************/
8 +#ifndef __NSC_H__
9 +#define __NSC_H__
10 +
11 +#include <arm_cmse.h>
12 +#include <stdio.h>
13 +#include <stdlib.h>
14 +#include "NuMicro.h"
15 +#include "M2351_crypto.h"
16 +#include "MAX30102.h"
17 +
18 +#define DEMO 1
19 +#define SUCCESS 1
20 +#define FAIL 0
21 +
22 +// Raw HR & SPo2 data from FIFO
23 +extern volatile int32_t hr_val;
24 +extern volatile int32_t spo2_val;
25 +
26 +/* typedef for NonSecure callback functions */
27 +typedef __NONSECURE_CALL void (*NonSecure_funcptr)(uint32_t);
28 +
29 +extern volatile uint32_t millis_counter;
30 +extern float beatsPerMinute;
31 +extern uint32_t beatAvg;
32 +
33 +typedef struct s_netData
34 +{
35 + char *data;
36 + int len;
37 +} t_netData;
38 +
39 +typedef struct s_digitallySignedData
40 +{
41 + uint8_t data[17];
42 + uint8_t pubKey1[25];
43 + uint8_t pubKey2[25];
44 + uint8_t R[25];
45 + uint8_t S[25];
46 +} t_digitallySignedData;
47 +
48 +
49 +__NONSECURE_ENTRY
50 +uint32_t GetSystemCoreClock(void);
51 +
52 +/*----------------------------------------------------------------------------
53 + NonSecure callable function for NonSecure callback
54 + *----------------------------------------------------------------------------*/
55 +
56 +__NONSECURE_ENTRY
57 +int32_t Secure_OLED_On_callback(NonSecure_funcptr *callback);
58 +
59 +__NONSECURE_ENTRY
60 +int32_t Secure_OLED_On_callback(NonSecure_funcptr *callback);
61 +
62 +
63 +/*----------------------------------------------------------------------------
64 + MAX30102 Heart-Rate Sensor functions exported to NonSecure application
65 + Must place in Non-secure Callable
66 + *----------------------------------------------------------------------------*/
67 +
68 +__NONSECURE_ENTRY
69 +uint32_t Get_BPM();
70 +
71 +__NONSECURE_ENTRY
72 +uint32_t Get_EncryptedDigitallySignedData();
73 +
74 +/*----------------------------------------------------------------------------
75 + CRYPTO functions exported to NonSecure application
76 + Must place in Non-secure Callable
77 + *----------------------------------------------------------------------------*/
78 +
79 +__NONSECURE_ENTRY
80 +int32_t Encrypt_data(uint8_t *,uint8_t *, uint32_t);
81 +__NONSECURE_ENTRY
82 +int32_t Decrypt_data(uint8_t *,uint8_t *, uint32_t);
83 +
84 +__NONSECURE_ENTRY
85 +void M2351_LoadKey();
86 +__NONSECURE_ENTRY
87 +void M2351_DeleteKey();
88 +
89 +/*----------------------------------------------------------------------------
90 + PRINT functions exported to NonSecure application
91 + Must place in Non-secure Callable
92 + *----------------------------------------------------------------------------*/
93 +
94 +__NONSECURE_ENTRY
95 +int32_t printBlock(uint8_t *);
96 +__NONSECURE_ENTRY
97 +int32_t printSecure(char *,void *,uint8_t);
98 +__NONSECURE_ENTRY
99 +int32_t printDigitallySignedData(t_digitallySignedData *dsd);
100 +
101 +
102 +#endif /* __NSC_H__ */
1 +/**************************************************************************//**
2 + * @file partition_M2351.c
3 + * @version V3.00
4 + * @brief SAU configuration for secure/nonsecure region settings.
5 + *
6 + * @note
7 + * Copyright (C) 2016 Nuvoton Technology Corp. All rights reserved.
8 + *
9 + ******************************************************************************/
10 +
11 +#ifndef PARTITION_M2351
12 +#define PARTITION_M2351
13 +
14 +/*
15 +//-------- <<< Use Configuration Wizard in Context Menu >>> -----------------
16 +*/
17 +
18 +
19 +/*
20 + SRAMNSSET
21 +*/
22 +/*
23 +// Bit 0..16
24 +// <o.0..16> Secure SRAM Size <0=> 0 KB
25 +// <0x2000=> 8KB
26 +// <0x4000=> 16KB
27 +// <0x6000=> 24KB
28 +// <0x8000=> 32KB
29 +// <0xa000=> 40KB
30 +// <0xc000=> 48KB
31 +// <0xe000=> 56KB
32 +// <0x10000=> 64KB
33 +// <0x12000=> 72KB
34 +// <0x14000=> 80KB
35 +// <0x16000=> 88KB
36 +// <0x18000=> 96KB
37 +*/
38 +#define SCU_SECURE_SRAM_SIZE 0x08000
39 +#define NON_SECURE_SRAM_BASE (0x30000000 + SCU_SECURE_SRAM_SIZE)
40 +
41 +
42 +
43 +/*--------------------------------------------------------------------------------------------------------*/
44 +
45 +/*
46 + NSBA
47 +*/
48 +#define FMC_INIT_NSBA 1
49 +/*
50 +// <o>Secure Flash ROM Size <0x800-0x80000:0x800>
51 +*/
52 +
53 +#define FMC_SECURE_ROM_SIZE 0x40000
54 +#define FMC_NON_SECURE_BASE (0x10000000 + FMC_SECURE_ROM_SIZE)
55 +
56 +
57 +/*--------------------------------------------------------------------------------------------------------*/
58 +
59 +
60 +/*
61 +// <h> Peripheral Secure Attribution Configuration
62 +*/
63 +
64 +/*
65 + PNSSET0
66 +*/
67 +/*
68 +// Module 0..31
69 +// <o.9> USBH <0=> Secure <1=> Non-Secure
70 +// <o.13> SD0 <0=> Secure <1=> Non-Secure
71 +// <o.16> EBI <0=> Secure <1=> Non-Secure
72 +// <o.24> PDMA1 <0=> Secure <1=> Non-Secure
73 +*/
74 +#define SCU_INIT_PNSSET0_VAL 0x0
75 +/*
76 + PNSSET1
77 +*/
78 +/*
79 +// Module 0..31
80 +// <o.17> CRC <0=> Secure <1=> Non-Secure
81 +// <o.18> CRPT <0=> Secure <1=> Non-Secure
82 +*/
83 +#define SCU_INIT_PNSSET1_VAL 0x00000
84 +/*
85 + PNSSET2
86 +*/
87 +/*
88 +// Module 0..31
89 +// <o.1> RTC <0=> Secure <1=> Non-Secure
90 +// <o.3> EADC <0=> Secure <1=> Non-Secure
91 +// <o.5> ACMP01 <0=> Secure <1=> Non-Secure
92 +//
93 +// <o.7> DAC <0=> Secure <1=> Non-Secure
94 +// <o.8> I2S0 <0=> Secure <1=> Non-Secure
95 +// <o.13> OTG <0=> Secure <1=> Non-Secure
96 +// <o.17> TMR23 <0=> Secure <1=> Non-Secure
97 +// <h> PWM
98 +// <o.24> EPWM0 <0=> Secure <1=> Non-Secure
99 +// <o.25> EPWM1 <0=> Secure <1=> Non-Secure
100 +// <o.26> BPWM0 <0=> Secure <1=> Non-Secure
101 +// <o.27> BPWM1 <0=> Secure <1=> Non-Secure
102 +// </h>
103 +*/
104 +#define SCU_INIT_PNSSET2_VAL 0x0
105 +/*
106 + PNSSET3
107 +*/
108 +/*
109 +// Module 0..31
110 +// <h> SPI
111 +// <o.0> QSPI0 <0=> Secure <1=> Non-Secure
112 +// <o.1> SPI0 <0=> Secure <1=> Non-Secure
113 +// <o.2> SPI1 <0=> Secure <1=> Non-Secure
114 +// <o.3> SPI2 <0=> Secure <1=> Non-Secure
115 +// <o.4> SPI3 <0=> Secure <1=> Non-Secure
116 +// </h>
117 +// <h> UART
118 +// <o.16> UART0 <0=> Secure <1=> Non-Secure
119 +// <o.17> UART1 <0=> Secure <1=> Non-Secure
120 +// <o.18> UART2 <0=> Secure <1=> Non-Secure
121 +// <o.19> UART3 <0=> Secure <1=> Non-Secure
122 +// <o.20> UART4 <0=> Secure <1=> Non-Secure
123 +// <o.21> UART5 <0=> Secure <1=> Non-Secure
124 +// </h>
125 +*/
126 +#define SCU_INIT_PNSSET3_VAL 0x90004
127 +/*
128 + PNSSET4
129 +*/
130 +/*
131 +// Module 0..31
132 +// <h> I2C
133 +// <o.0> I2C0 <0=> Secure <1=> Non-Secure
134 +// <o.1> I2C1 <0=> Secure <1=> Non-Secure
135 +// <o.2> I2C2 <0=> Secure <1=> Non-Secure
136 +// </h>
137 +// <h> Smart Card
138 +// <o.16> SC0 <0=> Secure <1=> Non-Secure
139 +// <o.17> SC1 <0=> Secure <1=> Non-Secure
140 +// <o.18> SC2 <0=> Secure <1=> Non-Secure
141 +// </h>
142 +*/
143 +#define SCU_INIT_PNSSET4_VAL 0x0
144 +/*
145 + PNSSET5
146 +*/
147 +/*
148 +// Module 0..31
149 +// <o.0> CAN0 <0=> Secure <1=> Non-Secure
150 +// <h> QEI
151 +// <o.16> QEI0 <0=> Secure <1=> Non-Secure
152 +// <o.17> QEI1 <0=> Secure <1=> Non-Secure
153 +// </h>
154 +// <h> ECAP
155 +// <o.20> ECAP0 <0=> Secure <1=> Non-Secure
156 +// <o.21> ECAP1 <0=> Secure <1=> Non-Secure
157 +// </h>
158 +// <o.25> TRNG <0=> Secure <1=> Non-Secure
159 +*/
160 +#define SCU_INIT_PNSSET5_VAL 0x0
161 +/*
162 + PNSSET6
163 +*/
164 +/*
165 +// Module 0..31
166 +// <o.0> USBD <0=> Secure <1=> Non-Secure
167 +// <h> USCI
168 +// <o.16> USCI0 <0=> Secure <1=> Non-Secure
169 +// <o.17> USCI1 <0=> Secure <1=> Non-Secure
170 +// </h>
171 +*/
172 +#define SCU_INIT_PNSSET6_VAL 0x0
173 +/*
174 +// </h>
175 +*/
176 +
177 +
178 +
179 +/*
180 +// <h> GPIO Secure Attribution Configuration
181 +*/
182 +
183 +/*
184 + IONSSET
185 +*/
186 +/*
187 +// Bit 0..31
188 +// <o.0> PA <0=> Secure <1=> Non-Secure
189 +// <o.1> PB <0=> Secure <1=> Non-Secure
190 +// <o.2> PC <0=> Secure <1=> Non-Secure
191 +// <o.3> PD <0=> Secure <1=> Non-Secure
192 +// <o.4> PE <0=> Secure <1=> Non-Secure
193 +// <o.5> PF <0=> Secure <1=> Non-Secure
194 +// <o.6> PG <0=> Secure <1=> Non-Secure
195 +// <o.7> PH <0=> Secure <1=> Non-Secure
196 +*/
197 +#define SCU_INIT_IONSSET_VAL 0x9E
198 +/*
199 +// </h>
200 +*/
201 +
202 +
203 +
204 +/* ---------------------------------------------------------------------------------------------------- */
205 +
206 +/*
207 +// <e>Secure Attribute Unit (SAU) Control
208 +*/
209 +#define SAU_INIT_CTRL 1
210 +
211 +/*
212 +// <q> Enable SAU
213 +// <i> To enable Secure Attribute Unit (SAU).
214 +*/
215 +#define SAU_INIT_CTRL_ENABLE 1
216 +
217 +/*
218 +// <o> All Memory Attribute When SAU is disabled
219 +// <0=> All Memory is Secure
220 +// <1=> All Memory is Non-Secure
221 +// <i> To set the ALLNS bit in SAU CTRL.
222 +// <i> When all Memory is Non-Secure (ALLNS is 1), IDAU can override memory map configuration.
223 +*/
224 +#define SAU_INIT_CTRL_ALLNS 0
225 +
226 +/*
227 +// </e>
228 +*/
229 +
230 +
231 +/*
232 +// <h>Enable and Set Secure/Non-Secure region
233 +*/
234 +#define SAU_REGIONS_MAX 8 /* Max. number of SAU regions */
235 +
236 +/*
237 +// <e>SAU Region 0
238 +// <i> Setup SAU Region 0
239 +*/
240 +#define SAU_INIT_REGION0 1
241 +/*
242 +// <o>Start Address <0-0xFFFFFFE0>
243 +*/
244 +#define SAU_INIT_START0 0x0003F000 /* start address of SAU region 0 */
245 +/*
246 +// <o>End Address <0x1F-0xFFFFFFFF>
247 +*/
248 +#define SAU_INIT_END0 0x0003FFFF /* end address of SAU region 0 */
249 +/*
250 +// <o>Region is
251 +// <0=>Non-Secure
252 +// <1=>Secure, Non-Secure Callable
253 +*/
254 +#define SAU_INIT_NSC0 1
255 +/*
256 +// </e>
257 +*/
258 +
259 +/*
260 +// <e>SAU Region 1
261 +// <i> Setup SAU Region 1
262 +*/
263 +#define SAU_INIT_REGION1 0
264 +/*
265 +// <o>Start Address <0-0xFFFFFFE0>
266 +*/
267 +#define SAU_INIT_START1 0x10040000
268 +/*
269 +// <o>End Address <0x1F-0xFFFFFFFF>
270 +*/
271 +#define SAU_INIT_END1 0x1007FFFF
272 +/*
273 +// <o>Region is
274 +// <0=>Non-Secure
275 +// <1=>Secure, Non-Secure Callable
276 +*/
277 +#define SAU_INIT_NSC1 0
278 +/*
279 +// </e>
280 +*/
281 +
282 +/*
283 +// <e>SAU Region 2
284 +// <i> Setup SAU Region 2
285 +*/
286 +#define SAU_INIT_REGION2 0
287 +/*
288 +// <o>Start Address <0-0xFFFFFFE0>
289 +*/
290 +#define SAU_INIT_START2 0x2000F000
291 +/*
292 +// <o>End Address <0x1F-0xFFFFFFFF>
293 +*/
294 +#define SAU_INIT_END2 0x2000FFFF
295 +/*
296 +// <o>Region is
297 +// <0=>Non-Secure
298 +// <1=>Secure, Non-Secure Callable
299 +*/
300 +#define SAU_INIT_NSC2 1
301 +/*
302 +// </e>
303 +*/
304 +
305 +/*
306 +// <e>SAU Region 3
307 +// <i> Setup SAU Region 3
308 +*/
309 +#define SAU_INIT_REGION3 0
310 +/*
311 +// <o>Start Address <0-0xFFFFFFE0>
312 +*/
313 +#define SAU_INIT_START3 0x3f000
314 +/*
315 +// <o>End Address <0x1F-0xFFFFFFFF>
316 +*/
317 +#define SAU_INIT_END3 0x3f7ff
318 +/*
319 +// <o>Region is
320 +// <0=>Non-Secure
321 +// <1=>Secure, Non-Secure Callable
322 +*/
323 +#define SAU_INIT_NSC3 1
324 +/*
325 +// </e>
326 +*/
327 +
328 +/*
329 + <e>SAU Region 4
330 + <i> Setup SAU Region 4
331 +*/
332 +#define SAU_INIT_REGION4 1
333 +/*
334 + <o>Start Address <0-0xFFFFFFE0>
335 +*/
336 +#define SAU_INIT_START4 FMC_NON_SECURE_BASE /* start address of SAU region 4 */
337 +
338 +/*
339 + <o>End Address <0x1F-0xFFFFFFFF>
340 +*/
341 +#define SAU_INIT_END4 0x1007FFFF /* end address of SAU region 4 */
342 +
343 +/*
344 + <o>Region is
345 + <0=>Non-Secure
346 + <1=>Secure, Non-Secure Callable
347 +*/
348 +#define SAU_INIT_NSC4 0
349 +/*
350 + </e>
351 +*/
352 +
353 +/*
354 + <e>SAU Region 5
355 + <i> Setup SAU Region 5
356 +*/
357 +#define SAU_INIT_REGION5 1
358 +
359 +/*
360 + <o>Start Address <0-0xFFFFFFE0>
361 +*/
362 +#define SAU_INIT_START5 0x00807E00
363 +
364 +/*
365 + <o>End Address <0x1F-0xFFFFFFFF>
366 +*/
367 +#define SAU_INIT_END5 0x00807FFF
368 +
369 +/*
370 + <o>Region is
371 + <0=>Non-Secure
372 + <1=>Secure, Non-Secure Callable
373 +*/
374 +#define SAU_INIT_NSC5 1
375 +/*
376 + </e>
377 +*/
378 +
379 +/*
380 + <e>SAU Region 6
381 + <i> Setup SAU Region 6
382 +*/
383 +#define SAU_INIT_REGION6 1
384 +
385 +/*
386 + <o>Start Address <0-0xFFFFFFE0>
387 +*/
388 +#define SAU_INIT_START6 NON_SECURE_SRAM_BASE
389 +
390 +/*
391 + <o>End Address <0x1F-0xFFFFFFFF>
392 +*/
393 +#define SAU_INIT_END6 0x30017FFF
394 +
395 +/*
396 + <o>Region is
397 + <0=>Non-Secure
398 + <1=>Secure, Non-Secure Callable
399 +*/
400 +#define SAU_INIT_NSC6 0
401 +/*
402 + </e>
403 +*/
404 +
405 +/*
406 + <e>SAU Region 7
407 + <i> Setup SAU Region 7
408 +*/
409 +#define SAU_INIT_REGION7 1
410 +
411 +/*
412 + <o>Start Address <0-0xFFFFFFE0>
413 +*/
414 +#define SAU_INIT_START7 0x50000000
415 +
416 +/*
417 + <o>End Address <0x1F-0xFFFFFFFF>
418 +*/
419 +#define SAU_INIT_END7 0x5FFFFFFF
420 +
421 +/*
422 + <o>Region is
423 + <0=>Non-Secure
424 + <1=>Secure, Non-Secure Callable
425 +*/
426 +#define SAU_INIT_NSC7 0
427 +/*
428 + </e>
429 +*/
430 +
431 +/*
432 +// </h>
433 +*/
434 +
435 +/*
436 +// <e>Setup behavior of Sleep and Exception Handling
437 +*/
438 +#define SCB_CSR_AIRCR_INIT 1
439 +
440 +/*
441 +// <o> Deep Sleep can be enabled by
442 +// <0=>Secure and Non-Secure state
443 +// <1=>Secure state only
444 +// <i> Value for SCB->CSR register bit DEEPSLEEPS
445 +*/
446 +#define SCB_CSR_DEEPSLEEPS_VAL 0
447 +
448 +/*
449 +// <o>System reset request accessible from
450 +// <0=> Secure and Non-Secure state
451 +// <1=> Secure state only
452 +// <i> Value for SCB->AIRCR register bit SYSRESETREQS
453 +*/
454 +#define SCB_AIRCR_SYSRESETREQS_VAL 0
455 +
456 +/*
457 +// <o>Priority of Non-Secure exceptions is
458 +// <0=> Not altered
459 +// <1=> Lowered to 0x80-0xFF
460 +// <i> Value for SCB->AIRCR register bit PRIS
461 +*/
462 +#define SCB_AIRCR_PRIS_VAL 0
463 +
464 +/* Assign HardFault to be always secure for safe */
465 +#define SCB_AIRCR_BFHFNMINS_VAL 0
466 +
467 +/*
468 +// </e>
469 +*/
470 +
471 +/*
472 + max 128 SAU regions.
473 + SAU regions are defined in partition.h
474 + */
475 +
476 +#define SAU_INIT_REGION(n) \
477 + SAU->RNR = (n & SAU_RNR_REGION_Msk); \
478 + SAU->RBAR = (SAU_INIT_START##n & SAU_RBAR_BADDR_Msk); \
479 + SAU->RLAR = (SAU_INIT_END##n & SAU_RLAR_LADDR_Msk) | \
480 + ((SAU_INIT_NSC##n << SAU_RLAR_NSC_Pos) & SAU_RLAR_NSC_Msk) | 1U
481 +
482 +
483 +#endif /* PARTITION_M2351 */
484 +
1 +/*
2 + * SSL client demonstration program
3 + *
4 + * Copyright The Mbed TLS Contributors
5 + * SPDX-License-Identifier: Apache-2.0
6 + *
7 + * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 + * not use this file except in compliance with the License.
9 + * You may obtain a copy of the License at
10 + *
11 + * http://www.apache.org/licenses/LICENSE-2.0
12 + *
13 + * Unless required by applicable law or agreed to in writing, software
14 + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 + * See the License for the specific language governing permissions and
17 + * limitations under the License.
18 + */
19 +
20 +#if !defined(MBEDTLS_CONFIG_FILE)
21 +#include "mbedtls/config.h"
22 +#else
23 +#include MBEDTLS_CONFIG_FILE
24 +#endif
25 +
26 +#if defined(MBEDTLS_PLATFORM_C)
27 +#include "mbedtls/platform.h"
28 +#else
29 +#include <stdio.h>
30 +#include <stdlib.h>
31 +#define mbedtls_time time
32 +#define mbedtls_time_t time_t
33 +#define mbedtls_fprintf fprintf
34 +#define mbedtls_printf printf
35 +#define mbedtls_exit exit
36 +#define MBEDTLS_EXIT_SUCCESS EXIT_SUCCESS
37 +#define MBEDTLS_EXIT_FAILURE EXIT_FAILURE
38 +#endif /* MBEDTLS_PLATFORM_C */
39 +
40 +#if !defined(MBEDTLS_BIGNUM_C) || !defined(MBEDTLS_ENTROPY_C) || \
41 + !defined(MBEDTLS_SSL_TLS_C) || !defined(MBEDTLS_SSL_CLI_C) || \
42 + !defined(MBEDTLS_NET_C) || !defined(MBEDTLS_RSA_C) || \
43 + !defined(MBEDTLS_CERTS_C) || !defined(MBEDTLS_PEM_PARSE_C) || \
44 + !defined(MBEDTLS_CTR_DRBG_C) || !defined(MBEDTLS_X509_CRT_PARSE_C)
45 +int main( void )
46 +{
47 + mbedtls_printf("MBEDTLS_BIGNUM_C and/or MBEDTLS_ENTROPY_C and/or "
48 + "MBEDTLS_SSL_TLS_C and/or MBEDTLS_SSL_CLI_C and/or "
49 + "MBEDTLS_NET_C and/or MBEDTLS_RSA_C and/or "
50 + "MBEDTLS_CTR_DRBG_C and/or MBEDTLS_X509_CRT_PARSE_C "
51 + "not defined.\n");
52 + mbedtls_exit( 0 );
53 +}
54 +#else
55 +
56 +#include "mbedtls/net_sockets.h"
57 +#include "mbedtls/debug.h"
58 +#include "mbedtls/ssl.h"
59 +#include "mbedtls/entropy.h"
60 +#include "mbedtls/ctr_drbg.h"
61 +#include "mbedtls/error.h"
62 +#include "mbedtls/certs.h"
63 +
64 +#include <string.h>
65 +
66 +#define SERVER_PORT "4433"
67 +#define SERVER_NAME "172.27.145.87"
68 +//#define SERVER_PORT "443"
69 +//#define SERVER_NAME "tls.mbed.org"
70 +#define GET_REQUEST "GET / HTTP/1.0\r\n\r\n"
71 +
72 +#define DEBUG_LEVEL 1
73 +
74 +
75 +static void my_debug( void *ctx, int level,
76 + const char *file, int line,
77 + const char *str )
78 +{
79 + ((void) level);
80 +
81 + mbedtls_fprintf( (FILE *) ctx, "%s:%04d: %s", file, line, str );
82 + fflush( (FILE *) ctx );
83 +}
84 +
85 +int ssl_client1( void )
86 +{
87 + int ret = 1, len;
88 + int exit_code = MBEDTLS_EXIT_FAILURE;
89 + mbedtls_net_context server_fd;
90 + uint32_t flags;
91 + unsigned char buf[1024];
92 + const char *pers = "ssl_client1";
93 +
94 + mbedtls_entropy_context entropy;
95 + mbedtls_ctr_drbg_context ctr_drbg;
96 + mbedtls_ssl_context ssl;
97 + mbedtls_ssl_config conf;
98 + mbedtls_x509_crt cacert;
99 +
100 +#if defined(MBEDTLS_DEBUG_C)
101 + mbedtls_debug_set_threshold( DEBUG_LEVEL );
102 +#endif
103 +
104 + /*
105 + * 0. Initialize the RNG and the session data
106 + */
107 + mbedtls_net_init( &server_fd );
108 + mbedtls_ssl_init( &ssl );
109 + mbedtls_ssl_config_init( &conf );
110 + mbedtls_x509_crt_init( &cacert );
111 + mbedtls_ctr_drbg_init( &ctr_drbg );
112 +
113 + mbedtls_printf( "\n . Seeding the random number generator..." );
114 + fflush( stdout );
115 +
116 + mbedtls_entropy_init( &entropy );
117 + if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,
118 + (const unsigned char *) pers,
119 + strlen( pers ) ) ) != 0 )
120 + {
121 + mbedtls_printf( " failed\n ! mbedtls_ctr_drbg_seed returned %d\n", ret );
122 + goto exit;
123 + }
124 +
125 + mbedtls_printf( " ok\n" );
126 +
127 + /*
128 + * 0. Initialize certificates
129 + */
130 + mbedtls_printf( " . Loading the CA root certificate ..." );
131 + fflush( stdout );
132 +
133 + ret = mbedtls_x509_crt_parse( &cacert, (const unsigned char *) mbedtls_test_cas_pem,
134 + mbedtls_test_cas_pem_len );
135 + if( ret < 0 )
136 + {
137 + mbedtls_printf( " failed\n ! mbedtls_x509_crt_parse returned -0x%x\n\n", (unsigned int) -ret );
138 + goto exit;
139 + }
140 +
141 + mbedtls_printf( " ok (%d skipped)\n", ret );
142 +
143 + /*
144 + * 1. Start the connection
145 + */
146 + mbedtls_printf( " . Connecting to tcp/%s/%s...", SERVER_NAME, SERVER_PORT );
147 + fflush( stdout );
148 +
149 + if( ( ret = mbedtls_net_connect( &server_fd, SERVER_NAME,
150 + SERVER_PORT, MBEDTLS_NET_PROTO_TCP ) ) != 0 )
151 + {
152 + mbedtls_printf( " failed\n ! mbedtls_net_connect returned %d\n\n", ret );
153 + goto exit;
154 + }
155 +
156 + mbedtls_printf( " ok\n" );
157 +
158 + /*
159 + * 2. Setup stuff
160 + */
161 + mbedtls_printf( " . Setting up the SSL/TLS structure..." );
162 + fflush( stdout );
163 +
164 + if( ( ret = mbedtls_ssl_config_defaults( &conf,
165 + MBEDTLS_SSL_IS_CLIENT,
166 + MBEDTLS_SSL_TRANSPORT_STREAM,
167 + MBEDTLS_SSL_PRESET_DEFAULT ) ) != 0 )
168 + {
169 + mbedtls_printf( " failed\n ! mbedtls_ssl_config_defaults returned %d\n\n", ret );
170 + goto exit;
171 + }
172 +
173 + mbedtls_printf( " ok\n" );
174 +
175 + /* OPTIONAL is not optimal for security,
176 + * but makes interop easier in this simplified example */
177 + mbedtls_ssl_conf_authmode( &conf, MBEDTLS_SSL_VERIFY_OPTIONAL );
178 + mbedtls_ssl_conf_ca_chain( &conf, &cacert, NULL );
179 + mbedtls_ssl_conf_rng( &conf, mbedtls_ctr_drbg_random, &ctr_drbg );
180 + mbedtls_ssl_conf_dbg( &conf, my_debug, stdout );
181 +
182 + if( ( ret = mbedtls_ssl_setup( &ssl, &conf ) ) != 0 )
183 + {
184 + mbedtls_printf( " failed\n ! mbedtls_ssl_setup returned %d\n\n", ret );
185 + goto exit;
186 + }
187 +
188 + if( ( ret = mbedtls_ssl_set_hostname( &ssl, SERVER_NAME ) ) != 0 )
189 + {
190 + mbedtls_printf( " failed\n ! mbedtls_ssl_set_hostname returned %d\n\n", ret );
191 + goto exit;
192 + }
193 +
194 + mbedtls_ssl_set_bio( &ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL );
195 +
196 + /*
197 + * 4. Handshake
198 + */
199 + mbedtls_printf( " . Performing the SSL/TLS handshake..." );
200 + fflush( stdout );
201 +
202 + while( ( ret = mbedtls_ssl_handshake( &ssl ) ) != 0 )
203 + {
204 + if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE )
205 + {
206 + mbedtls_printf( " failed\n ! mbedtls_ssl_handshake returned -0x%x\n\n", (unsigned int) -ret );
207 + goto exit;
208 + }
209 + }
210 +
211 + mbedtls_printf( " ok\n" );
212 +
213 + /*
214 + * 5. Verify the server certificate
215 + */
216 + mbedtls_printf( " . Verifying peer X.509 certificate..." );
217 +
218 + /* In real life, we probably want to bail out when ret != 0 */
219 + if( ( flags = mbedtls_ssl_get_verify_result( &ssl ) ) != 0 )
220 + {
221 + char vrfy_buf[512];
222 +
223 + mbedtls_printf( " failed\n" );
224 +
225 + mbedtls_x509_crt_verify_info( vrfy_buf, sizeof( vrfy_buf ), " ! ", flags );
226 +
227 + mbedtls_printf( "%s\n", vrfy_buf );
228 + }
229 + else
230 + mbedtls_printf( " ok\n" );
231 +
232 + /*
233 + * 3. Write the GET request
234 + */
235 + mbedtls_printf( " > Write to server:" );
236 + fflush( stdout );
237 +
238 + len = sprintf( (char *) buf, GET_REQUEST );
239 +
240 + while( ( ret = mbedtls_ssl_write( &ssl, buf, len ) ) <= 0 )
241 + {
242 + if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE )
243 + {
244 + mbedtls_printf( " failed\n ! mbedtls_ssl_write returned %d\n\n", ret );
245 + goto exit;
246 + }
247 + }
248 +
249 + len = ret;
250 + mbedtls_printf( " %d bytes written\n\n%s", len, (char *) buf );
251 +
252 + /*
253 + * 7. Read the HTTP response
254 + */
255 + mbedtls_printf( " < Read from server:" );
256 + fflush( stdout );
257 +
258 + do
259 + {
260 + len = sizeof( buf ) - 1;
261 + memset( buf, 0, sizeof( buf ) );
262 + ret = mbedtls_ssl_read( &ssl, buf, len );
263 +
264 + if( ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE )
265 + continue;
266 +
267 + if( ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY )
268 + break;
269 +
270 + if( ret < 0 )
271 + {
272 + mbedtls_printf( "failed\n ! mbedtls_ssl_read returned %d\n\n", ret );
273 + break;
274 + }
275 +
276 + if( ret == 0 )
277 + {
278 + mbedtls_printf( "\n\nEOF\n\n" );
279 + break;
280 + }
281 +
282 + len = ret;
283 + mbedtls_printf( " %d bytes read\n\n%s", len, (char *) buf );
284 + }
285 + while( 1 );
286 +
287 + mbedtls_ssl_close_notify( &ssl );
288 +
289 + exit_code = MBEDTLS_EXIT_SUCCESS;
290 +
291 +exit:
292 +
293 +#ifdef MBEDTLS_ERROR_C
294 + if( exit_code != MBEDTLS_EXIT_SUCCESS )
295 + {
296 + char error_buf[100];
297 + mbedtls_strerror( ret, error_buf, 100 );
298 + mbedtls_printf("Last error was: %d - %s\n\n", ret, error_buf );
299 + }
300 +#endif
301 +
302 + mbedtls_net_free( &server_fd );
303 +
304 + mbedtls_x509_crt_free( &cacert );
305 + mbedtls_ssl_free( &ssl );
306 + mbedtls_ssl_config_free( &conf );
307 + mbedtls_ctr_drbg_free( &ctr_drbg );
308 + mbedtls_entropy_free( &entropy );
309 +
310 +#if defined(_WIN32)
311 + mbedtls_printf( " + Press Enter to exit this program.\n" );
312 + fflush( stdout ); getchar();
313 +#endif
314 +
315 + mbedtls_exit( exit_code );
316 +}
317 +#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_ENTROPY_C && MBEDTLS_SSL_TLS_C &&
318 + MBEDTLS_SSL_CLI_C && MBEDTLS_NET_C && MBEDTLS_RSA_C &&
319 + MBEDTLS_CERTS_C && MBEDTLS_PEM_PARSE_C && MBEDTLS_CTR_DRBG_C &&
320 + MBEDTLS_X509_CRT_PARSE_C */
1 +FROM debian:buster
2 +
3 +LABEL maintainer="shw2662@khu.ac.kr"
4 +
5 +RUN apt-get update && apt-get install -y \
6 + nginx \
7 + openssl \
8 + vim \
9 + php-fpm \
10 + mariadb-server \
11 + php-mysql \
12 + php-mbstring \
13 + wget \
14 + php \
15 + gcc \
16 + libssl-dev \
17 + netstat
18 +
19 +COPY ./srcs/default ./tmp/
20 +COPY ./srcs/wordpress-5.6.2.tar.gz ./tmp/
21 +COPY ./srcs/wp-config.php ./tmp/
22 +COPY ./srcs/phpMyAdmin-4.9.7-all-languages.tar.gz ./tmp/
23 +COPY ./srcs/config.inc.php ./tmp/
24 +COPY ./srcs/run.sh ./
25 +
26 +COPY ./srcs/input.php ./tmp/
27 +COPY ./srcs/process.php ./tmp/
28 +COPY ./srcs/highcharts.php ./tmp/
29 +COPY ./srcs/socket.php ./tmp/
30 +
31 +COPY ./srcs/tcp.h ./home/
32 +COPY ./srcs/tcps.s ./home/
33 +
34 +EXPOSE 80 443 2351
35 +
36 +CMD bash run.sh
1 +<?php
2 +/* vim: set expandtab sw=4 ts=4 sts=4: */
3 +/**
4 + * phpMyAdmin sample configuration, you can use it as base for
5 + * manual configuration. For easier setup you can use setup/
6 + *
7 + * All directives are explained in documentation in the doc/ folder
8 + * or at <https://docs.phpmyadmin.net/>.
9 + *
10 + * @package PhpMyAdmin
11 + */
12 +
13 +/**
14 + * This is needed for cookie based authentication to encrypt password in
15 + * cookie. Needs to be 32 chars long.
16 + */
17 +$cfg['blowfish_secret'] = '0k}CJ:h,X,mt0Dp.,IAPww,0.6gSor,B'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
18 +
19 +/**
20 + * Servers configuration
21 + */
22 +$i = 0;
23 +
24 +/**
25 + * First server
26 + */
27 +$i++;
28 +/* Authentication type */
29 +$cfg['Servers'][$i]['auth_type'] = 'cookie';
30 +/* Server parameters */
31 +$cfg['Servers'][$i]['host'] = 'localhost';
32 +$cfg['Servers'][$i]['compress'] = false;
33 +$cfg['Servers'][$i]['AllowNoPassword'] = false;
34 +
35 +/**
36 + * phpMyAdmin configuration storage settings.
37 + */
38 +
39 +/* User used to manipulate with storage */
40 +// $cfg['Servers'][$i]['controlhost'] = '';
41 +// $cfg['Servers'][$i]['controlport'] = '';
42 +// $cfg['Servers'][$i]['controluser'] = 'pma';
43 +// $cfg['Servers'][$i]['controlpass'] = 'pmapass';
44 +
45 +/* Storage database and tables */
46 +// $cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
47 +// $cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark';
48 +// $cfg['Servers'][$i]['relation'] = 'pma__relation';
49 +// $cfg['Servers'][$i]['table_info'] = 'pma__table_info';
50 +// $cfg['Servers'][$i]['table_coords'] = 'pma__table_coords';
51 +// $cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages';
52 +// $cfg['Servers'][$i]['column_info'] = 'pma__column_info';
53 +// $cfg['Servers'][$i]['history'] = 'pma__history';
54 +// $cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs';
55 +// $cfg['Servers'][$i]['tracking'] = 'pma__tracking';
56 +// $cfg['Servers'][$i]['userconfig'] = 'pma__userconfig';
57 +// $cfg['Servers'][$i]['recent'] = 'pma__recent';
58 +// $cfg['Servers'][$i]['favorite'] = 'pma__favorite';
59 +// $cfg['Servers'][$i]['users'] = 'pma__users';
60 +// $cfg['Servers'][$i]['usergroups'] = 'pma__usergroups';
61 +// $cfg['Servers'][$i]['navigationhiding'] = 'pma__navigationhiding';
62 +// $cfg['Servers'][$i]['savedsearches'] = 'pma__savedsearches';
63 +// $cfg['Servers'][$i]['central_columns'] = 'pma__central_columns';
64 +// $cfg['Servers'][$i]['designer_settings'] = 'pma__designer_settings';
65 +// $cfg['Servers'][$i]['export_templates'] = 'pma__export_templates';
66 +
67 +/**
68 + * End of servers configuration
69 + */
70 +
71 +/**
72 + * Directories for saving/loading files from server
73 + */
74 +$cfg['UploadDir'] = '';
75 +$cfg['SaveDir'] = '';
76 +
77 +/**
78 + * Whether to display icons or text or both icons and text in table row
79 + * action segment. Value can be either of 'icons', 'text' or 'both'.
80 + * default = 'both'
81 + */
82 +//$cfg['RowActionType'] = 'icons';
83 +
84 +/**
85 + * Defines whether a user should be displayed a "show all (records)"
86 + * button in browse mode or not.
87 + * default = false
88 + */
89 +//$cfg['ShowAll'] = true;
90 +
91 +/**
92 + * Number of rows displayed when browsing a result set. If the result
93 + * set contains more rows, "Previous" and "Next".
94 + * Possible values: 25, 50, 100, 250, 500
95 + * default = 25
96 + */
97 +//$cfg['MaxRows'] = 50;
98 +
99 +/**
100 + * Disallow editing of binary fields
101 + * valid values are:
102 + * false allow editing
103 + * 'blob' allow editing except for BLOB fields
104 + * 'noblob' disallow editing except for BLOB fields
105 + * 'all' disallow editing
106 + * default = 'blob'
107 + */
108 +//$cfg['ProtectBinary'] = false;
109 +
110 +/**
111 + * Default language to use, if not browser-defined or user-defined
112 + * (you find all languages in the locale folder)
113 + * uncomment the desired line:
114 + * default = 'en'
115 + */
116 +//$cfg['DefaultLang'] = 'en';
117 +//$cfg['DefaultLang'] = 'de';
118 +
119 +/**
120 + * How many columns should be used for table display of a database?
121 + * (a value larger than 1 results in some information being hidden)
122 + * default = 1
123 + */
124 +//$cfg['PropertiesNumColumns'] = 2;
125 +
126 +/**
127 + * Set to true if you want DB-based query history.If false, this utilizes
128 + * JS-routines to display query history (lost by window close)
129 + *
130 + * This requires configuration storage enabled, see above.
131 + * default = false
132 + */
133 +//$cfg['QueryHistoryDB'] = true;
134 +
135 +/**
136 + * When using DB-based query history, how many entries should be kept?
137 + * default = 25
138 + */
139 +//$cfg['QueryHistoryMax'] = 100;
140 +
141 +/**
142 + * Whether or not to query the user before sending the error report to
143 + * the phpMyAdmin team when a JavaScript error occurs
144 + *
145 + * Available options
146 + * ('ask' | 'always' | 'never')
147 + * default = 'ask'
148 + */
149 +//$cfg['SendErrorReports'] = 'always';
150 +
151 +/**
152 + * You can find more configuration options in the documentation
153 + * in the doc/ folder or at <https://docs.phpmyadmin.net/>.
154 + */
1 +##
2 +# You should look at the following URL's in order to grasp a solid understanding
3 +# of Nginx configuration files in order to fully unleash the power of Nginx.
4 +# https://www.nginx.com/resources/wiki/start/
5 +# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
6 +# https://wiki.debian.org/Nginx/DirectoryStructure
7 +#
8 +# In most cases, administrators will remove this file from sites-enabled/ and
9 +# leave it as reference inside of sites-available where it will continue to be
10 +# updated by the nginx packaging team.
11 +#
12 +# This file will automatically load configuration files provided by other
13 +# applications, such as Drupal or Wordpress. These applications will be made
14 +# available underneath a path with that package name, such as /drupal8.
15 +#
16 +# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
17 +##
18 +
19 +# Default server configuration
20 +#
21 +server {
22 + listen 80;
23 + listen [::]:80;
24 +
25 + root /var/www/html;
26 +
27 + # Add index.php to the list if you are using PHP
28 + index index.html index.htm index.nginx-debian.html input.php;
29 +
30 + server_name ft_server80;
31 +
32 + location / {
33 + # First attempt to serve request as file, then
34 + # as directory, then fall back to displaying a 404.
35 + # autoindex on;
36 + try_files $uri $uri/ =404;
37 + }
38 +
39 + # pass PHP scripts to FastCGI server
40 + #
41 + location ~ \.php$ {
42 + include snippets/fastcgi-php.conf;
43 +
44 + # With php-fpm (or other unix sockets):
45 + fastcgi_pass unix:/run/php/php7.3-fpm.sock;
46 + # # With php-cgi (or other tcp sockets):
47 + # fastcgi_pass 127.0.0.1:9000;
48 + }
49 +
50 + # return 301 https://$host$request_uri;
51 +}
52 +
53 +server {
54 + listen 443 ssl;
55 + listen [::]:443 ssl;
56 +
57 + # SSL configuration
58 + #
59 + # listen 443 ssl default_server;
60 + # listen [::]:443 ssl default_server;
61 + #
62 + # Note: You should disable gzip for SSL traffic.
63 + # See: https://bugs.debian.org/773332
64 + #
65 + # Read up on ssl_ciphers to ensure a secure configuration.
66 + # See: https://bugs.debian.org/765782
67 + #
68 + # Self signed certs generated by the ssl-cert package
69 + # Don't use them in a production server!
70 + #
71 + # include snippets/snakeoil.conf;
72 +
73 + ssl on;
74 + ssl_certificate /etc/ssl/certs/localhost.dev.crt;
75 + ssl_certificate_key /etc/ssl/private/localhost.dev.key;
76 +
77 + root /var/www/html;
78 +
79 + # Add index.php to the list if you are using PHP
80 + index index.html index.htm index.nginx-debian.html index.php;
81 +
82 + server_name ft_server;
83 +
84 + location / {
85 + # First attempt to serve request as file, then
86 + # as directory, then fall back to displaying a 404.
87 + autoindex on;
88 + try_files $uri $uri/ =404;
89 + }
90 +
91 + # pass PHP scripts to FastCGI server
92 + #
93 + location ~ \.php$ {
94 + include snippets/fastcgi-php.conf;
95 +
96 + # With php-fpm (or other unix sockets):
97 + fastcgi_pass unix:/run/php/php7.3-fpm.sock;
98 + # # With php-cgi (or other tcp sockets):
99 + # fastcgi_pass 127.0.0.1:9000;
100 + }
101 +
102 + # deny access to .htaccess files, if Apache's document root
103 + # concurs with nginx's one
104 + #
105 + #location ~ /\.ht {
106 + # deny all;
107 + #}
108 +}
109 +
110 +
111 +# Virtual Host configuration for example.com
112 +#
113 +# You can move that to a different file under sites-available/ and symlink that
114 +# to sites-enabled/ to enable it.
115 +#
116 +#server {
117 +# listen 80;
118 +# listen [::]:80;
119 +#
120 +# server_name example.com;
121 +#
122 +# root /var/www/example.com;
123 +# index index.html;
124 +#
125 +# location / {
126 +# try_files $uri $uri/ =404;
127 +# }
128 +#}
1 +<?php
2 +
3 +$mysql_host = 'localhost';
4 +$mysql_user = 'haseo';
5 +$mysql_password = 'haseo';
6 +$mysql_db = 'M2351';
7 +
8 +// DB 접속
9 +$conn = mysqli_connect($mysql_host, $mysql_user, $mysql_password, $mysql_db);
10 +
11 +
12 +// charset 설정, 설정하지 않으면 기본 mysql 설정으로 됨, 대체적으로 euc-kr를 많이 사용
13 +//mysql_query("set names utf8");
14 +
15 +
16 +// $sql="
17 +// select * from (
18 +// SELECT DATE_FORMAT( regday, '%m-%d %HH' ) mdh , COUNT( * ) cnt, SUM( temperature ) , round(SUM( temperature ) / COUNT( * ),2) atemper
19 +// FROM `temperature`
20 +// GROUP BY DATE_FORMAT( regday, '%Y%m%d%H' )
21 +// order by regday desc
22 +// limit 12
23 +// ) t_a
24 +// order by t_a.mdh
25 +// ";
26 +//echo $sql;
27 +
28 +//$sql = "SELECT * FROM pulseTable";
29 +$sql = "SELECT * FROM
30 + (SELECT * FROM pulseTable ORDER BY date DESC LIMIT 30) A ORDER BY A.date ASC";
31 +//echo $sql;
32 +
33 +$result = mysqli_query($conn, $sql);
34 +//echo $result;
35 +
36 +$str_date="";
37 +$str_heartrate="";
38 +
39 +while ($row = mysqli_fetch_assoc($result))
40 +{
41 + $str_date .="'".$row['date']."',";
42 + $str_heartrate .="".$row['pulse'].",";
43 +}
44 +
45 +$str_date= substr($str_date,0,-1);
46 +$str_heartrate= substr($str_heartrate,0,-1);
47 +//$str_date= substr($str_date,0,-1);
48 +//$str_heartrate= substr($str_heartrate,0,-1);
49 +//echo $str_date."</br>";
50 +//echo $str_heartrate."</br>";
51 +
52 +mysqli_close($conn);
53 +
54 +?>
55 +
56 +<!DOCTYPE HTML>
57 +<html>
58 + <head>
59 + <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
60 + <title>Heart Rate Monitoring</title>
61 +
62 + <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
63 + <style type="text/css">
64 +${demo.css}
65 + </style>
66 + <script type="text/javascript">
67 +$(function () {
68 + $('#container').highcharts({
69 + chart: {
70 + type: 'line',
71 + events: {
72 + load: function() {
73 +
74 + // set up the updating of the chart each second
75 + var series = this.series[0];
76 + setInterval(function refresh(){
77 + window.location.reload();
78 + }, 3000);
79 + }
80 + }
81 + },
82 + title: {
83 + text: 'Heart Rate Monitoring'
84 + },
85 + subtitle: {
86 + text: 'Data was obtained from the MAX30102 in NuMaker-PFM-M2351 Secure World'
87 + },
88 + xAxis: {
89 + categories: [<?php echo $str_date?>]
90 + },
91 + yAxis: {
92 + title: {
93 + text: 'Heart Rate (bpm)'
94 + }
95 + },
96 + plotOptions: {
97 + line: {
98 + dataLabels: {
99 + enabled: true
100 + },
101 + enableMouseTracking: true,
102 + color: '#FF0000'
103 + }
104 + },
105 + series: [{
106 + name: 'Heart Rate',
107 + data: [<?php echo $str_heartrate?>]
108 + }
109 + ]
110 + });
111 +});
112 + </script>
113 + </head>
114 +
115 + <body>
116 +<script src="https://code.highcharts.com/highcharts.js"></script>
117 +<script src="https://code.highcharts.com/modules/series-label.js"></script>
118 +<script src="https://code.highcharts.com/modules/exporting.js"></script>
119 +<script src="https://code.highcharts.com/modules/export-data.js"></script>
120 +<script src="https://code.highcharts.com/modules/accessibility.js"></script>
121 +<div id="container" style="min-width: 310px; height: 400px; margin: 0 auto"></div>
122 +
123 + </body>
124 +</html>
1 +<!DOCTYPE html>
2 +<html>
3 + <head>
4 + <meta charset="utf-8" />
5 + </head>
6 +
7 + <body>
8 + <form action="process.php" method="get">
9 + <p>Pulse : <input type="text" name="pulse"></p>
10 + <p>pubKey1 : <input type="text" name="pubKey1"></p>
11 + <p>pubKey2 : <input type="text" name="pubKey2"></p>
12 + <p>signatureR : <input type="text" name="signatureR"></p>
13 + <p>signatureS : <input type="text" name="signatureS"></p>
14 + <p><input type="submit" /></p>
15 + </form>
16 + </body>
17 +</html>
1 +<?php
2 +header("Content-Type: text/html; charset=UTF-8");
3 +
4 +$KEY_128 = '0000000000000000';
5 +$IV_128 = '0000000000000000';
6 +
7 +echo "[pubKey of Device]<br/>";
8 +$pubKey1 = $_GET['pubKey1'];
9 +echo "pubKey1 = $pubKey1<br/>";
10 +$pubKey2 = $_GET['pubKey2'];
11 +echo "pubKey2 = $pubKey2<br/><br/>";
12 +
13 +echo "[Encrypted digitally signed data]<br/>";
14 +$pulse = $_GET['pulse'];
15 +echo "pulse = $pulse<br/>";
16 +//$pubKey1 = $_GET['pubKey1'];
17 +//echo "pubKey1 = $pubKey1<br/>";
18 +//$pubKey2 = $_GET['pubKey2'];
19 +//echo "pubKey2 = $pubKey2<br/>";
20 +$signatureR = $_GET['signatureR'];
21 +echo "signatureR = $signatureR<br/>";
22 +$signatureS = $_GET['signatureS'];
23 +echo "signatureS = $signatureS<br/>";
24 +
25 +
26 +echo "<br/>[Decrypted digitally signed data]<br/>";
27 +
28 +$pulse = hex2bin($pulse);
29 +$pulse = openssl_decrypt($pulse, 'AES-128-CBC', $KEY_128, OPENSSL_NO_PADDING, $IV_128);
30 +//echo "pulse = $pulse<br/>";
31 +$pulse = bin2hex($pulse);
32 +echo "pulse = $pulse<br/>";
33 +
34 +$pubKey1 = openssl_decrypt($pubKey1, 'AES-128-CBC', $KEY_128, OPENSSL_NO_PADDING, $IV_128);
35 +$pubKey1 = bin2hex($pubKey1);
36 +$pubKey1 = substr($pubKey1, 1, strlen($pubKey1) / 2);
37 +//echo "pubKey1 = $pubKey1<br/>";
38 +
39 +$pubKey2 = openssl_decrypt($pubKey2, 'AES-128-CBC', $KEY_128, OPENSSL_NO_PADDING, $IV_128);
40 +$pubKey2 = bin2hex($pubKey2);
41 +$pubKey2 = substr($pubKey2, 1, strlen($pubKey2) / 2);
42 +//echo "pubKey2 = $pubKey2<br/>";
43 +
44 +$signatureR = openssl_decrypt($signatureR, 'AES-128-CBC', $KEY_128, OPENSSL_NO_PADDING, $IV_128);
45 +$signatureR = bin2hex($signatureR);
46 +$signatureR = substr($signatureR, 1, strlen($signatureR) / 2);
47 +echo "signatureR = $signatureR<br/>";
48 +
49 +$signatureS = openssl_decrypt($signatureS, 'AES-128-CBC', $KEY_128, OPENSSL_NO_PADDING, $IV_128);
50 +$signatureS = bin2hex($signatureS);
51 +$signatureS = substr($signatureS, 1, strlen($signatureS) / 2);
52 +echo "signatureS = $signatureS<br/>";
53 +
54 +echo "<br/>[Digital signature verification]<br/>";
55 +$hashPulse = sha1($hashPulse);
56 +echo "hashPulse = $hashPulse<br/>";
57 +
58 +echo "Verify signature with hashed data<br/>";
59 +$result = openssl_verify($hashPulse, $signatureR, $pubKey1, 'ecdsa-with-SHA1');
60 +
61 +// if ($result == 1) {
62 +// echo "Valid<br/>";
63 +// } elseif ($result == 0) {
64 +// echo "Invalid<br/>";
65 +// } else {
66 +// echo "error: ".openssl_error_string();
67 +// }
68 +
69 +
70 +$host = 'localhost';
71 +$user = 'haseo';
72 +$pw = 'haseo';
73 +$dbName = 'M2351';
74 +
75 +$mysqli = new mysqli($host, $user, $pw, $dbName);
76 +
77 + if($mysqli){
78 + echo "<br/>[MySQL successfully connected!]<br/>";
79 + echo "Convert binary to decimal<br/>";
80 + $pulse = hexdec($pulse[0].$pulse[1]);
81 + echo "pulse = $pulse<br/>";
82 +
83 + $query = "INSERT INTO pulseTable(pulse) VALUES ('$pulse')";
84 + mysqli_query($mysqli,$query);
85 + echo "<br/>[Success insert pulse data to DB Table!!]";
86 + }
87 + else{
88 + echo "MySQL could not be connected";
89 + }
90 +
91 +mysqli_close($mysqli);
92 +
93 +
94 +/*
95 +$encryptedBPM = $_GET['pulse'];
96 +echo 'encryptedBPM : '.$encryptedBPM.'<br/>';
97 +
98 +$decryptedBPM = Hex2Char($encryptedBPM);
99 +echo 'decryptedBPM : '.$decryptedBPM.'<br/><br/>';
100 +
101 +//echo 'decryptedBPM : '.hex2bin($decryptedBPM).'<br/><br/>';
102 +//$decryptedBPM = Hex2String($decryptedBPM);
103 +// echo 'decryptedBPM : '.$decryptedBPM.'<br/><br/>'
104 +$decryptedBPM = openssl_encrypt($decryptedBPM, 'AES-128-CBC', $KEY_128, OPENSSL_NO_PADDING, $IV_128);
105 +echo 'decryptedBPM : '.$decryptedBPM.'<br/><br/>';
106 +
107 +
108 +$teststr = '414243';
109 +echo 'teststr : '.$teststr.'<br/>';
110 +$teststr = Hex2Char($teststr);
111 +echo 'teststr : '.$teststr.'<br/>';
112 +$teststr = openssl_encrypt($teststr, 'AES-128-CBC', $KEY_128, OPENSSL_NO_PADDING, $IV_128);
113 +echo 'teststr : '.$teststr.'<br/>';
114 +$teststr = openssl_decrypt($teststr, 'AES-128-CBC', $KEY_128, OPENSSL_NO_PADDING, $IV_128);
115 +echo 'teststr : '.$teststr.'<br/>';
116 +
117 +$plain = '=000000000000000';
118 +$plain = openssl_encrypt($plain, 'AES-128-CBC', $KEY_128, OPENSSL_NO_PADDING, $IV_128);
119 +echo 'plain : '.bin2hex($plain).'<br/>';
120 +echo 'plain : '.$plain.'<br/>';
121 +$plain = openssl_decrypt($plain, 'AES-128-CBC', $KEY_128, OPENSSL_NO_PADDING, $IV_128);
122 +echo 'plain : '.$plain.'<br/>';
123 +
124 +function HexStr2Str($string){
125 + $hex='';
126 + for ($i=0; $i < strlen($string); $i+=2){
127 + $hex .= hex2bin(hexdec(($string[$i].$string[$i+1])));
128 + }
129 + return $hex;
130 +}
131 +function HexStr2DecStr($string){
132 + $hex='';
133 + for ($i=0; $i < strlen($string); $i+=2){
134 + $hex .= hexdec(($string[$i].$string[$i+1]));
135 + }
136 + return $hex;
137 +}
138 +function Hex2Char($hex){
139 + $string='';
140 + for ($i=0; $i < strlen($hex); $i+=2){
141 + $string .= chr(hexdec($hex[$i].$hex[$i+1]));
142 + }
143 + return $string;
144 +
145 +}
146 +
147 +function HexStr2Hex($str)
148 +{
149 +
150 +}
151 +*/
152 +?>
153 +
1 +#!/bin/bash
2 +
3 +service mysql start
4 +
5 +# ssl configuration
6 +openssl req -newkey rsa:4096 \
7 + -days 365 \
8 + -nodes \
9 + -x509 \
10 + -subj "/C=KR/ST=Seoul/O=KHU/OU=CSE/CN=localhost" \
11 + -keyout localhost.dev.key \
12 + -out localhost.dev.crt
13 +
14 +mv localhost.dev.key /etc/ssl/private/
15 +mv localhost.dev.crt /etc/ssl/certs/
16 +chmod 600 /etc/ssl/private/localhost.dev.key /etc/ssl/certs/localhost.dev.crt
17 +
18 +# Nginx configuration
19 +cp -p ./tmp/default /etc/nginx/sites-available
20 +
21 +# Wordpress configuration
22 +tar -xvf ./tmp/wordpress-5.6.2.tar.gz
23 +rm ./tmp/wordpress-5.6.2.tar.gz
24 +mv /wordpress/ /var/www/html
25 +cp ./tmp/wp-config.php /var/www/html/wordpress
26 +
27 +# Move PHP files
28 +mv ./tmp/input.php /var/www/html
29 +mv ./tmp/process.php /var/www/html
30 +mv ./tmp/highcharts.php /var/www/html
31 +mv ./tmp/socket.php /var/www/html
32 +
33 +# MariaDB configuration
34 +echo "CREATE USER 'haseo'@'localhost' IDENTIFIED BY 'haseo';" \
35 + | mysql -u root --skip-password
36 +
37 +echo "CREATE DATABASE wordpress;" \
38 + | mysql -u root --skip-password
39 +echo "GRANT ALL PRIVILEGES ON wordpress.* TO 'haseo'@'localhost' WITH GRANT OPTION;" \
40 + | mysql -u root --skip-password
41 +echo "FLUSH PRIVILEGES" \
42 + | mysql -u root --skip-password
43 +
44 +echo "CREATE DATABASE M2351;" \
45 + | mysql -u root --skip-password
46 +echo "GRANT ALL PRIVILEGES ON M2351.* TO 'haseo'@'localhost' WITH GRANT OPTION;" \
47 + | mysql -u root --skip-password
48 +echo "FLUSH PRIVILEGES" \
49 + | mysql -u root --skip-password
50 +
51 +
52 +# phpMyAdmin configuration
53 +tar -xvf ./tmp/phpMyAdmin-4.9.7-all-languages.tar.gz
54 +rm ./tmp/phpMyAdmin-4.9.7-all-languages.tar.gz
55 +mv phpMyAdmin-4.9.7-all-languages phpmyadmin
56 +mv phpmyadmin /var/www/html/
57 +cp ./tmp/config.inc.php /var/www/html/phpmyadmin/
58 +mysql < /var/www/html/phpmyadmin/sql/create_tables.sql
59 +
60 +# permission setting
61 +chown -R www-data:www-data /var/www/*
62 +find /var/www -type d -exec chmod 755 {} \;
63 +find /var/www -type f -exec chmod 644 {} \;
64 +
65 +# service start
66 +service nginx start
67 +service mysql restart
68 +service php7.3-fpm start
69 +service php7.3-fpm status
70 +
71 +bash
1 +#!/usr/local/bin/php -q
2 +
3 +<?php
4 +
5 +define("_IP", "127.0.0.1");
6 +define("_PORT", "2351");
7 +
8 +$sSock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
9 +socket_bind($sSock, _IP, _PORT);
10 +socket_listen($sSock);
11 +
12 +while($cSock = socket_accept($sSock))
13 +{
14 + socket_getpeername($cSock, $addr, $port);
15 + echo "SERVER >> client connected $addr:$port \n";
16 + $date = date("Y/m/d H:i:s");
17 + socket_write($cSock, $date);
18 + socket_close($cSock);
19 + echo "SERVER >> client Close.\n";
20 +}
21 +
22 +?>
1 +#define SERV_TCP_PORT (2351)
2 +#define SERV_HOST_ADDR "127.0.0.1"
3 +
4 +typedef struct {
5 + char data[64];
6 +}
7 + MsgType;
1 +// TCP sockek example
2 +// TCP server
3 +#include <stdio.h>
4 +#include <sys/types.h>
5 +#include <sys/socket.h>
6 +#include <netinet/in.h>
7 +#include <arpa/inet.h>
8 +#include <signal.h>
9 +#include "tcp.h"
10 +#include <stdlib.h>
11 +#include <unistd.h>
12 +#include <string.h>
13 +
14 +int Sockfd;
15 +
16 +void CloseServer()
17 +{
18 + close(Sockfd);
19 + printf("\nTCP Server exit.....\n");
20 +
21 + exit(0);
22 +}
23 +
24 +void main(int argc, char *argv[])
25 +{
26 + int newSockfd, cliAddrLen, n;
27 + struct sockaddr_in cliAddr, servAddr; // PF_INET, IPv4
28 + MsgType msg;
29 +
30 + // register a signal handler
31 + signal(SIGINT, CloseServer);
32 +
33 + // SOCKET
34 + // create a socket for TCP
35 + if ((Sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
36 + {
37 + perror("socket");
38 + exit(1);
39 + }
40 +
41 + // initailize a servAddr
42 + bzero((char *)&servAddr, sizeof(servAddr));
43 + servAddr.sin_family = PF_INET; //protocol family
44 + servAddr.sin_addr.s_addr = htonl(INADDR_ANY); // network byte ordered 32-bit address
45 + // receive any IP addresses
46 + servAddr.sin_port = htons(SERV_TCP_PORT);
47 +
48 + // BIND
49 + if (bind(Sockfd, (struct sockaddr *)&servAddr, sizeof(servAddr)) < 0)
50 + {
51 + perror("bind");
52 + exit(1);
53 + }
54 +
55 + // LISTEN
56 + listen(Sockfd, 5);
57 +
58 + printf("TCP Server started.....\n");
59 +
60 + // kernel allocate a cliAddr ifself
61 + cliAddrLen = sizeof(cliAddr);
62 +
63 + while (1)
64 + {
65 + memset(&msg, 0, sizeof(MsgType));
66 + // ACCEPT
67 + newSockfd = accept(Sockfd, (struct sockaddr *)&cliAddr, &cliAddrLen);
68 + if (newSockfd < 0)
69 + {
70 + perror("accept");
71 + exit(1);
72 + }
73 + printf("Accept a new socket\n");
74 +
75 + // READ
76 + if ((n = read(newSockfd, (char *)&msg, sizeof(msg))) < 0)
77 + {
78 + perror("read");
79 + exit(1);
80 + }
81 + printf("Received message from M2351: %s\n", msg.data);
82 +
83 + // WRITE
84 + //sprintf(msg.data, "This is a reply from %d.", getpid());
85 + char aesKey[20] = {0x61, 0x62, 0x63, 0x64, 0x65,
86 + 0x66, 0x67, 0x68, 0x69, 0x6a,
87 + 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
88 + 0x70, 0x71, 0x72, 0x73, 0x74};
89 +
90 + strcpy(msg.data, aesKey);
91 + printf("aesKey : %s\n", msg.data);
92 + if (write(newSockfd, (char *)&msg, sizeof(msg)) < 0)
93 + {
94 + perror("write");
95 + exit(1);
96 + }
97 +
98 + printf("Replied.\n");
99 +
100 + usleep(5000);
101 + // CLOSE
102 + close(newSockfd);
103 + }
104 +}
This file is too large to display.
1 +<?php
2 +/**
3 + * The base configuration for WordPress
4 + *
5 + * The wp-config.php creation script uses this file during the
6 + * installation. You don't have to use the web site, you can
7 + * copy this file to "wp-config.php" and fill in the values.
8 + *
9 + * This file contains the following configurations:
10 + *
11 + * * MySQL settings
12 + * * Secret keys
13 + * * Database table prefix
14 + * * ABSPATH
15 + *
16 + * @link https://wordpress.org/support/article/editing-wp-config-php/
17 + *
18 + * @package WordPress
19 + */
20 +
21 +// ** MySQL settings - You can get this info from your web host ** //
22 +/** The name of the database for WordPress */
23 +define( 'DB_NAME', 'wordpress' );
24 +
25 +/** MySQL database username */
26 +define( 'DB_USER', 'haseo' );
27 +
28 +/** MySQL database password */
29 +define( 'DB_PASSWORD', 'haseo' );
30 +
31 +/** MySQL hostname */
32 +define( 'DB_HOST', 'localhost' );
33 +
34 +/** Database Charset to use in creating database tables. */
35 +define( 'DB_CHARSET', 'utf8' );
36 +
37 +/** The Database Collate type. Don't change this if in doubt. */
38 +define( 'DB_COLLATE', '' );
39 +
40 +/**#@+
41 + * Authentication Unique Keys and Salts.
42 + *
43 + * Change these to different unique phrases!
44 + * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
45 + * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
46 + *
47 + * @since 2.6.0
48 + */
49 +define( 'AUTH_KEY', 'put your unique phrase here' );
50 +define( 'SECURE_AUTH_KEY', 'put your unique phrase here' );
51 +define( 'LOGGED_IN_KEY', 'put your unique phrase here' );
52 +define( 'NONCE_KEY', 'put your unique phrase here' );
53 +define( 'AUTH_SALT', 'put your unique phrase here' );
54 +define( 'SECURE_AUTH_SALT', 'put your unique phrase here' );
55 +define( 'LOGGED_IN_SALT', 'put your unique phrase here' );
56 +define( 'NONCE_SALT', 'put your unique phrase here' );
57 +
58 +/**#@-*/
59 +
60 +/**
61 + * WordPress Database Table prefix.
62 + *
63 + * You can have multiple installations in one database if you give each
64 + * a unique prefix. Only numbers, letters, and underscores please!
65 + */
66 +$table_prefix = 'wp_';
67 +
68 +/**
69 + * For developers: WordPress debugging mode.
70 + *
71 + * Change this to true to enable the display of notices during development.
72 + * It is strongly recommended that plugin and theme developers use WP_DEBUG
73 + * in their development environments.
74 + *
75 + * For information on other constants that can be used for debugging,
76 + * visit the documentation.
77 + *
78 + * @link https://wordpress.org/support/article/debugging-in-wordpress/
79 + */
80 +define( 'WP_DEBUG', false );
81 +
82 +/* That's all, stop editing! Happy publishing. */
83 +
84 +/** Absolute path to the WordPress directory. */
85 +if ( ! defined( 'ABSPATH' ) ) {
86 + define( 'ABSPATH', __DIR__ . '/' );
87 +}
88 +
89 +/** Sets up WordPress vars and included files. */
90 +require_once ABSPATH . 'wp-settings.php';