1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #pragma once
6 
7 #ifdef __cplusplus
8 extern "C" {
9 #endif
10 
11 #include <stdio_tfs.h>
12 #include <stdarg.h>
13 #include <stdlib.h>
14 #include <time.h>
15 #include <modules.h>
16 #include <targetos.h>
17 
18 /***********************************************************************/
19 /* Symbol Definitions                                                  */
20 /***********************************************************************/
21 #define VERBOSE 1
22 
23 // Removable Card/Device Types
24 
25 #define DEV_FAT_VOL 1
26 #define DEV_NI 2
27 #define DEV_UART 3
28 
29 /***********************************************************************/
30 /* Definitions related to reading/writing NVRAM memory.                */
31 /***********************************************************************/
32 void NvLoad(void);
33 int NvRead(const char* name, void* data, int type);
34 int NvReadBin(const char* name, void* data, int len);
35 int NvReadStr(const char* name, void* data, int maxlen);
36 int NvWrite(const char* name, const void* data, int type);
37 int NvWriteBin(const char* name, const void* data, int len);
38 int NvReadBinSize(const char* name);
39 #define NV_BYTE 0
40 #define NV_SHORT 1
41 #define NV_LONG 2
42 #define NV_STRING 3
43 #define NV_IP_ADDR 4
44 #define NV_ETH_ADDR 5
45 #define NV_ERR_LOG 6
46 #define NV_IP6_ADDR 7
47 #define NV_BINARY 8
48 int NvDelete(const char* name, int type);
49 void NvSave(void);
50 extern uint NvSize;
51 extern ui8* NvBuffer;
52 
53 /***********************************************************************/
54 /* Definitions related to interactive I/O.                             */
55 /***********************************************************************/
56 
57 // Shell Command List Entry
58 typedef struct {
59     const char* cmd;
60     void (*func)(char* cmd_line);
61     const char* help;
62 } CmdEntry;
63 
64 char* SysGetArg(char** cmd_linep);
65 int getString(char* str, int max_val);
66 int getCmdKey(void);
67 int getKey(void);
68 ui32 getInt(ui32 def_val, ui32 min_val, ui32 max_val);
69 ui32 getHex(ui32 def_val, ui32 min_val, ui32 max_val);
70 ui8 getDigit(ui8 value, ui8 min_val, ui8 max_val);
71 int More(int* more_lines);
72 
73 int getIP(ui32* ip_addrp);
74 int printIP(ui32 ip_addr);
75 int sprintIP(char* str, ui32 ip_addr);
76 int sscanIP(const char* str, ui32* ip_addr);
77 
78 int getEth(ui8* eth_addr);
79 int printEth(void* eth_addr);
80 int sprintEth(char* str, void* eth_addr);
81 int sscanEth(const char* str, void* eth_addr);
82 
83 struct in6_addr;
84 struct sockaddr_in6;
85 int getIP6(struct sockaddr_in6* sockp);
86 int printIP6(const struct in6_addr* ip_addr);
87 int sprintIP6(char* str, const struct in6_addr* ip_addr);
88 int sscanIP6(const char* str, struct in6_addr* ip_addr);
89 
90 /***********************************************************************/
91 /* UART-related Declarations                                           */
92 /***********************************************************************/
93 
94 // UART Mode Structure
95 typedef struct uart_mode {
96     ui32 baudrate;
97     ui8 char_len;
98     ui8 num_stop_bits;
99     ui8 flow_ctrl;
100 #define TTY_FC_NONE 0
101 #define TTY_FC_SW 1
102 #define TTY_FC_HW 2
103     ui8 conv_nl;
104     ui8 ctrl_brk;
105     ui8 parity;
106 #define TTY_PARITY_NONE 0
107 #define TTY_PARITY_EVEN 1
108 #define TTY_PARITY_ODD 2
109 #define TTY_PARITY_MARK 3
110 #define TTY_PARITY_SPACE 4
111 } UartMode;
112 
113 // TtyIoctl() Commands and Prototype
114 
115 typedef enum { TTY_KB_HIT, TTY_ESC_HIT, TTY_SET_MODE, TTY_GET_MODE, TTY_RECV_TO } TTY_IOCTLS;
116 int TtyIoctl(FILE_TFS* stream, int code, ...);
117 void TtySetEsc(FILE_TFS* stream);
118 
119 /***********************************************************************/
120 /* Loader-related Declarations                                         */
121 /***********************************************************************/
122 
123 // Loader's parameter structure
124 typedef struct {
125     FILE_TFS* stream; // stream handle for file to be loaded
126     ui32 lo_limit;    // lower bound of downloadable memory
127     ui32 hi_limit;    // upper bound of downloadable memory
128     ui32 lo_addr;     // lowest accessed address
129     ui32 hi_addr;     // highest accessed address
130     ui32 exe_addr;    // executation start address
131     ui32 offset;      // load address offset
132     ui32 incr;        // progress dot increment
133     ui32 announce;    // progress dot threshold
134     int byte_cnt;     // number of bytes loaded
135     ui32 file_offset; // offset into load file
136     ui8 verbose;      // verbose flag
137     ui8 try_seek;     // private flag
138     ui8 byte_sum;     // S-record byte sum
139     ui8 num_dots;     // number of progress dots
140 } LoadParam;
141 int Loader(LoadParam* params);
142 void StartImage(const LoadParam* params);
143 
144 /***********************************************************************/
145 /* Miscellaneous Routines                                              */
146 /***********************************************************************/
147 time_t RtcGet(void);
148 int RtcSet(struct tm* new_time);
149 void SysShowTOD(void);
150 int printSize(char* label, ui32 num_blks, ui32 blk_size);
151 void SysEditTOD(void);
152 void SetHeapHi(void);
153 void StartApp(int (*func)(void));
154 void SysWait50ms(void);
155 void spin_wait_us(ui32 us);
156 void spin_wait_ms(ui32 ms);
157 ui32 SysCounter(void);
158 ui64 SysCounter64(void);
159 void SysMon(void);
160 void SysShell(void);
161 void cliLabel(char* banner);
162 void AssertError(int line, char* file);
163 void SyncCache(void);
164 void dCacheInval(const volatile void* base, long length);
165 void dCacheStore(const volatile void* base, long length);
166 void netWaitNi(int verbose);
167 int StrMatch(const char* str1, const char* str2);
168 void Spaces(int num);
169 int bspTick(void);
170 void bspReset(void);
171 void dbg_print(const char* format, ...);
172 void extra_free(ui32 start, ui32 end);
173 void free_clear(void* alloc_ptr_addr);
174 int testLoop(void);
175 void testPassed(void);
176 void DParse(void (*parse)(ui32 sample));
177 void DLog(const volatile ui32* reg_addr, ui32 mask);
178 
179 // Cache Line-Aligned Allocation/Deallocation Routines
180 void* aalloc(size_t size);
181 void afree_clear(void* aaloc_ptr_addr);
182 
183 /***********************************************************************/
184 /* Password Related Definitions                                        */
185 /***********************************************************************/
186 
187 // Structure of entries in Application Access List.
188 typedef struct secret Secret;
189 struct secret {
190     char* username;
191     char* password;
192     char* home_dir;
193     ui16 uid;
194     ui16 gid;
195 };
196 
197 // Login Data
198 typedef struct {
199     char* username;
200     char* password;
201     void* addr; // pointer to IP address
202 } SysLoginData;
203 
204 extern Secret Secrets[];
205 extern int (*SysLoginReport)(uint event, SysLoginData* login_data);
206 
207 void* SysPassword(const void* username);
208 Secret* SysLogin(SysLoginData* login_data);
209 
210 // Login Events
211 #define SYSLOGIN_PASSED 0
212 #define SYSLOGIN_FAILED 1
213 #define SYSLOGIN_LOGOUT 2
214 
215 /***********************************************************************/
216 /* Raw Flash File Related Definitions                                  */
217 /***********************************************************************/
218 typedef struct {
219     FILE_TFS* file;
220     void* vol;
221     int page_size;
222     int block_size;
223     int num_blocks;
224     ui32 base_addr;
225     int (*read_page)(ui32 addr, void* buf, void* vol);
226     int (*write_page)(ui32 addr, void* buf, void* vol);
227     int (*erase_blk)(ui32 addr, void* vol);
228     void (*lock_blk)(ui32 base, ui32 num_blks, void* vol);
229     void (*unlock_blk)(ui32 base, ui32 num_blks, void* vol);
230 } RawFile;
231 void* rawFileInit(RawFile* rawf);
232 
233 /***********************************************************************/
234 /* Benchmark Measurement Prototypes                                    */
235 /***********************************************************************/
236 void measStart(void);
237 void measStop(void);
238 int measfReportBW(int fid, const char* fmt, ui32 data_size);
239 int measfReportSec(int fid, char* fmt);
240 int measfReportTime(int fid, char* fmt);
241 int measReportBW(const char* fmt, ui32 data_size);
242 int measReportRate(const char* fmt, ui32 count);
243 int measReportSec(char* fmt);
244 int measReportTime(char* fmt);
245 int measReportTicks(const char* fmt, time_t ticks);
246 ui32 measTime(void);
247 void measStartOuter(void);
248 void measStopOuter(void);
249 
250 /***********************************************************************/
251 /* Boot Programmer Related Definitions                                 */
252 /***********************************************************************/
253 typedef struct {
254     void* vol;
255     int page_size;
256     int block_size;
257     int num_blocks;
258     ui32 flash_base;
259 #ifdef __NIOS2__
260     ui32 hw_image_base;
261     ui32 hw_image_size;
262 #endif
263     ui32 start_addr;
264     int (*write_page)(ui32 addr, const void* buffer, void* vol);
265     int (*read_page)(ui32 addr, void* buffer, void* vol);
266     int (*erase_blk)(ui32 addr, void* vol);
267     void (*lock_blk)(ui32 base, ui32 num_blks, void* vol);
268     void (*unlock_blk)(ui32 base, ui32 num_blks, void* vol);
269 } BootPgmr;
270 extern BootPgmr Boot;
271 int BootPrgmr(char* file_name);
272 int FpgaPrgmr(char* file_name);
273 
274 /***********************************************************************/
275 /* CRC32 Related Definitions/Declaration                               */
276 /***********************************************************************/
277 extern const ui32 Crc32Tbl[256];
278 #define CRC32_START 0xFFFFFFFF // starting CRC bit string
279 #define CRC32_FINAL 0xDEBB20E3 // summed over data and CRC
280 #define CRC32_UPDATE(crc, c) ((crc >> 8) ^ Crc32Tbl[(ui8)(crc ^ c)])
281 
282 /***********************************************************************/
283 /* Macros for to redirecting stdio to Telnet when not using TargetOS   */
284 /***********************************************************************/
285 #if !INC_TARGETCORE && INC_TARGET_TCP && TELNET_SRV_INC
286 #define TEL_PRINT_REG 3 /* register used for Telnet print socket */
287 
288 #define printf telPrint
289 int telPrint(const char* format, ...);
290 
291 #undef putchar
292 #define putchar(ch) telPutchar(ch)
293 int telPutchar(int ch);
294 
295 #undef getchar
296 #define getchar telGetchar
297 int telGetchar(void);
298 
299 #define puts(s) telPuts(s)
300 int telPuts(const char* s);
301 
302 #define perror(s) telPerror(s)
303 void telPerror(const char* s);
304 
305 #define TtyIoctl telTtyIoctl
306 int telTtyIoctl(FILE_TFS* stream, int code, ...);
307 
308 #endif
309 
310 /***********************************************************************/
311 /* Miscellaneous Data Declarations                                     */
312 /***********************************************************************/
313 extern char SysWarmBoot;         // TRUE iff executing RAM build
314 extern struct unknown SysHeapLo; // base address of heap
315 extern struct unk SysDataLo;     // base address of variables
316 extern ui32 SysHeapHi;           // ending address of heap
317 extern ui32 SysRamBase;          // base address of RAM
318 extern ui32 SysRamSize;          // size of RAM
319 extern char SysMenuRequested;    // TRUE iff user requests system menu
320 extern ui32 SysTtyBaud;
321 extern const char* AppName;
322 extern ui32 SysCountFreq;
323 extern int SysMonFlag;
324 extern FILE_TFS* dbgout;
325 extern char* MonPrompt;
326 extern char* ShellPrompt;
327 extern const char* StartAppName;
328 extern int EnableDST;
329 extern int UtcOffsetMinutes;
330 
331 /***********************************************************************/
332 /* Fatal Error Codes (written to errno) and Log Structure              */
333 /***********************************************************************/
334 typedef enum sys_errs { SYS_ASSERT = 200, SYS_BUS_ERROR, SYS_STRAY_INTR } SysErrors;
335 
336 // Fatal Error Log Format
337 typedef struct {
338     int err_code;
339     ui32 intr_lvl;
340     ui32 pc;
341     ui32 sp;
342     time_t sec_cnt;
343     ui32 lword1;
344     ui32 lword2;
345     char tname[8];
346 } FatErrType;
347 extern FatErrType SysFatErr;
348 
349 #ifdef __cplusplus
350 }
351 #endif
352