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