| /* alt_log_printf.h |
| * |
| * ALT_LOG is designed to provide extra logging/debugging messages from HAL |
| * through a different port than stdout. It is enabled by the ALT_LOG_ENABLE |
| * define, which needs to supplied at compile time. When logging is turned off, |
| * code size is unaffected. Thus, this should be transparent to the user |
| * when it is not actively turned on, and should not affect projects in any way. |
| * |
| * There are macros sprinkled within different components, such as the jtag uart |
| * and timer, in the HAL code. They are always named ALT_LOG_<name>, and can be |
| * safely ignored if ALT_LOG is turned off. |
| * |
| * To turn on ALT_LOG, ALT_LOG_ENABLE must be defined, and ALT_LOG_PORT_TYPE and |
| * ALT_LOG_PORT_BASE must be set in system.h. This is done through editing |
| * <project>.ptf, by editing the alt_log_port_type & alt_log_port_base settings. |
| * See the documentation html file for examples. |
| * |
| * When it is turned on, it will output extra HAL messages to a port specified |
| * in system.h. This can be a UART or JTAG UART port. By default it will |
| * output boot messages, detailing every step of the boot process. |
| * |
| * Extra logging is designed to be enabled by flags, which are defined in |
| * alt_log_printf.c. The default value is that all flags are off, so only the |
| * boot up logging messages show up. ALT_LOG_FLAGS can be set to enable certain |
| * groupings of flags, and that grouping is done in this file. Each flag can |
| * also be overridden with a -D at compile time. |
| * |
| * This header file includes the necessary prototypes for using the alt_log |
| * functions. It also contains all the macros that are used to remove the code |
| * from alt log is turned off. Also, the macros in other HAL files are defined |
| * here at the bottom. These macros all call some C function that is in |
| * alt_log_printf.c. |
| * |
| * The logging has functions for printing in C (ALT_LOG_PRINTF) and in assembly |
| * (ALT_LOG_PUTS). This was needed because the assembly printing occurs before |
| * the device is initialized. The assembly function corrupts register R4-R7, |
| * which are not used in the normal boot process. For this reason, do not call |
| * the assembly function in C. |
| * |
| * author: gkwan |
| */ |
| |
| |
| #ifndef __ALT_LOG_PRINTF_H__ |
| #define __ALT_LOG_PRINTF_H__ |
| |
| #include <system.h> |
| |
| /* Global switch to turn on logging functions */ |
| #ifdef ALT_LOG_ENABLE |
| |
| /* ALT_LOG_PORT_TYPE values as defined in system.h. They are defined as |
| * numbers here first becasue the C preprocessor does not handle string |
| * comparisons. */ |
| #define ALTERA_AVALON_JTAG_UART 1 |
| #define ALTERA_AVALON_UART 0 |
| |
| /* If this .h file is included by an assembly file, skip over include files |
| * that won't compile in assembly. */ |
| #ifndef ALT_ASM_SRC |
| #include <stdarg.h> |
| #include "sys/alt_alarm.h" |
| #include "sys/alt_dev.h" |
| #ifdef __ALTERA_AVALON_JTAG_UART |
| #include "altera_avalon_jtag_uart.h" |
| #endif |
| #endif /* ALT_ASM_SRC */ |
| |
| /* These are included for the port register offsets and masks, needed |
| * to write to the port. Only include if the port type is set correctly, |
| * otherwise error. If alt_log is turned on and the port to output to is |
| * incorrect or does not exist, then should exit. */ |
| #if ALT_LOG_PORT_TYPE == ALTERA_AVALON_JTAG_UART |
| #ifdef __ALTERA_AVALON_JTAG_UART |
| #include <altera_avalon_jtag_uart_regs.h> |
| #else |
| #error ALT_LOG: JTAG_UART port chosen, but no JTAG_UART in system. |
| #endif |
| #elif ALT_LOG_PORT_TYPE == ALTERA_AVALON_UART |
| #ifdef __ALTERA_AVALON_UART |
| #include <altera_avalon_uart_regs.h> |
| #else |
| #error ALT_LOG: UART Port chosen, but no UART in system. |
| #endif |
| #else |
| #error ALT_LOG: alt_log_port_type declaration invalid! |
| #endif |
| |
| /* ALT_LOG_ENABLE turns on the basic printing function */ |
| #define ALT_LOG_PRINTF(...) do {alt_log_printf_proc(__VA_ARGS__);} while (0) |
| |
| /* Assembly macro for printing in assembly, calls tx_log_str |
| * which is in alt_log_macro.S. |
| * If alt_log_boot_on_flag is 0, skips the printing */ |
| #define ALT_LOG_PUTS(str) movhi r4, %hiadj(alt_log_boot_on_flag) ; \ |
| addi r4, r4, %lo(alt_log_boot_on_flag) ; \ |
| ldwio r5, 0(r4) ; \ |
| beq r0, r5, 0f ; \ |
| movhi r4, %hiadj(str) ; \ |
| addi r4, r4, %lo(str) ; \ |
| call tx_log_str ; \ |
| 0: |
| |
| /* These defines are here to faciliate the use of one output function |
| * (alt_log_txchar) to print to both the JTAG UART or the UART. Depending |
| * on the port type, the status register, read mask, and output register |
| * are set to the appropriate value for the port. */ |
| #if ALT_LOG_PORT_TYPE == ALTERA_AVALON_JTAG_UART |
| #define ALT_LOG_PRINT_REG_RD IORD_ALTERA_AVALON_JTAG_UART_CONTROL |
| #define ALT_LOG_PRINT_MSK ALTERA_AVALON_JTAG_UART_CONTROL_WSPACE_MSK |
| #define ALT_LOG_PRINT_TXDATA_WR IOWR_ALTERA_AVALON_JTAG_UART_DATA |
| #define ALT_LOG_PRINT_REG_OFFSET (ALTERA_AVALON_JTAG_UART_CONTROL_REG*0x4) |
| #define ALT_LOG_PRINT_TXDATA_REG_OFFSET (ALTERA_AVALON_JTAG_UART_DATA_REG*0x4) |
| #elif ALT_LOG_PORT_TYPE == ALTERA_AVALON_UART |
| #define ALT_LOG_PRINT_REG_RD IORD_ALTERA_AVALON_UART_STATUS |
| #define ALT_LOG_PRINT_MSK ALTERA_AVALON_UART_STATUS_TRDY_MSK |
| #define ALT_LOG_PRINT_TXDATA_WR IOWR_ALTERA_AVALON_UART_TXDATA |
| #define ALT_LOG_PRINT_REG_OFFSET (ALTERA_AVALON_UART_STATUS_REG*0x4) |
| #define ALT_LOG_PRINT_TXDATA_REG_OFFSET (ALTERA_AVALON_UART_TXDATA_REG*0x4) |
| #endif /* ALT_LOG_PORT */ |
| |
| /* Grouping of flags via ALT_LOG_FLAGS. Each specific flag can be set via |
| * -D at compile time, or else they'll be set to a default value according |
| * to ALT_LOG_FLAGS. ALT_LOG_FLAGS = 0 or not set is the default, where |
| * only the boot messages will be printed. As ALT_LOG_FLAGS increase, they |
| * increase in intrusiveness to the program, and will affect performance. |
| * |
| * Flag Level 1 - turns on system clock and JTAG UART startup status |
| * 2 - turns on write echo and JTAG_UART alarm (periodic report) |
| * 3 - turns on JTAG UART ISR logging - will slow performance |
| * significantly. |
| * -1 - All logging output is off, but if ALT_LOG_ENABLE is |
| * defined all logging function is built and code size |
| * remains constant |
| * |
| * Flag settings - 1 = on, 0 = off. */ |
| |
| /* This flag turns on "boot" messages for printing. This includes messages |
| * during crt0.S, then alt_main, and finally alt_exit. */ |
| #ifndef ALT_LOG_BOOT_ON_FLAG_SETTING |
| #if ALT_LOG_FLAGS == 1 |
| #define ALT_LOG_BOOT_ON_FLAG_SETTING 0x1 |
| #elif ALT_LOG_FLAGS == 2 |
| #define ALT_LOG_BOOT_ON_FLAG_SETTING 0x1 |
| #elif ALT_LOG_FLAGS == 3 |
| #define ALT_LOG_BOOT_ON_FLAG_SETTING 0x1 |
| #elif ALT_LOG_FLAGS == -1 /* silent mode */ |
| #define ALT_LOG_BOOT_ON_FLAG_SETTING 0x0 |
| #else /* default setting */ |
| #define ALT_LOG_BOOT_ON_FLAG_SETTING 0x1 |
| #endif |
| #endif /* ALT_LOG_BOOT_ON_FLAG_SETTING */ |
| |
| #ifndef ALT_LOG_SYS_CLK_ON_FLAG_SETTING |
| #if ALT_LOG_FLAGS == 1 |
| #define ALT_LOG_SYS_CLK_ON_FLAG_SETTING 0x1 |
| #elif ALT_LOG_FLAGS == 2 |
| #define ALT_LOG_SYS_CLK_ON_FLAG_SETTING 0x1 |
| #elif ALT_LOG_FLAGS == 3 |
| #define ALT_LOG_SYS_CLK_ON_FLAG_SETTING 0x1 |
| #elif ALT_LOG_FLAGS == -1 /* silent mode */ |
| #define ALT_LOG_SYS_CLK_ON_FLAG_SETTING 0x0 |
| #else /* default setting */ |
| #define ALT_LOG_SYS_CLK_ON_FLAG_SETTING 0x0 |
| #endif |
| #endif /* ALT_LOG_SYS_CLK_ON_FLAG_SETTING */ |
| |
| #ifndef ALT_LOG_WRITE_ON_FLAG_SETTING |
| #if ALT_LOG_FLAGS == 1 |
| #define ALT_LOG_WRITE_ON_FLAG_SETTING 0x0 |
| #elif ALT_LOG_FLAGS == 2 |
| #define ALT_LOG_WRITE_ON_FLAG_SETTING 0x1 |
| #elif ALT_LOG_FLAGS == 3 |
| #define ALT_LOG_WRITE_ON_FLAG_SETTING 0x1 |
| #elif ALT_LOG_FLAGS == -1 /* silent mode */ |
| #define ALT_LOG_WRITE_ON_FLAG_SETTING 0x0 |
| #else /* default setting */ |
| #define ALT_LOG_WRITE_ON_FLAG_SETTING 0x0 |
| #endif |
| #endif /* ALT_LOG_WRITE_ON_FLAG_SETTING */ |
| |
| #ifndef ALT_LOG_JTAG_UART_ALARM_ON_FLAG_SETTING |
| #ifndef __ALTERA_AVALON_JTAG_UART |
| #define ALT_LOG_JTAG_UART_ALARM_ON_FLAG_SETTING 0x0 |
| #elif ALT_LOG_FLAGS == 1 |
| #define ALT_LOG_JTAG_UART_ALARM_ON_FLAG_SETTING 0x0 |
| #elif ALT_LOG_FLAGS == 2 |
| #define ALT_LOG_JTAG_UART_ALARM_ON_FLAG_SETTING 0x1 |
| #elif ALT_LOG_FLAGS == 3 |
| #define ALT_LOG_JTAG_UART_ALARM_ON_FLAG_SETTING 0x1 |
| #elif ALT_LOG_FLAGS == -1 /* silent mode */ |
| #define ALT_LOG_JTAG_UART_ALARM_ON_FLAG_SETTING 0x0 |
| #else /* default setting */ |
| #define ALT_LOG_JTAG_UART_ALARM_ON_FLAG_SETTING 0x0 |
| #endif |
| #endif /* ALT_LOG_JTAG_UART_ALARM_ON_FLAG_SETTING */ |
| |
| #ifndef ALT_LOG_JTAG_UART_STARTUP_INFO_ON_FLAG_SETTING |
| #ifndef __ALTERA_AVALON_JTAG_UART |
| #define ALT_LOG_JTAG_UART_STARTUP_INFO_ON_FLAG_SETTING 0x0 |
| #elif ALT_LOG_FLAGS == 1 |
| #define ALT_LOG_JTAG_UART_STARTUP_INFO_ON_FLAG_SETTING 0x1 |
| #elif ALT_LOG_FLAGS == 2 |
| #define ALT_LOG_JTAG_UART_STARTUP_INFO_ON_FLAG_SETTING 0x1 |
| #elif ALT_LOG_FLAGS == 3 |
| #define ALT_LOG_JTAG_UART_STARTUP_INFO_ON_FLAG_SETTING 0x1 |
| #elif ALT_LOG_FLAGS == -1 /* silent mode */ |
| #define ALT_LOG_JTAG_UART_STARTUP_INFO_ON_FLAG_SETTING 0x0 |
| #else /* default setting */ |
| #define ALT_LOG_JTAG_UART_STARTUP_INFO_ON_FLAG_SETTING 0x0 |
| #endif |
| #endif /* ALT_LOG_JTAG_UART_STARTUP_INFO_FLAG_SETTING */ |
| |
| #ifndef ALT_LOG_JTAG_UART_ISR_ON_FLAG_SETTING |
| #ifndef __ALTERA_AVALON_JTAG_UART |
| #define ALT_LOG_JTAG_UART_ISR_ON_FLAG_SETTING 0x0 |
| #elif ALT_LOG_FLAGS == 1 |
| #define ALT_LOG_JTAG_UART_ISR_ON_FLAG_SETTING 0x0 |
| #elif ALT_LOG_FLAGS == 2 |
| #define ALT_LOG_JTAG_UART_ISR_ON_FLAG_SETTING 0x0 |
| #elif ALT_LOG_FLAGS == 3 |
| #define ALT_LOG_JTAG_UART_ISR_ON_FLAG_SETTING 0x1 |
| #elif ALT_LOG_FLAGS == -1 /* silent mode */ |
| #define ALT_LOG_JTAG_UART_ISR_ON_FLAG_SETTING 0x0 |
| #else /* default setting */ |
| #define ALT_LOG_JTAG_UART_ISR_ON_FLAG_SETTING 0x0 |
| #endif |
| #endif /* ALT_LOG_JTAG_UART_ISR_ON_FLAG_SETTING */ |
| |
| #ifndef ALT_ASM_SRC |
| /* Function Prototypes */ |
| void alt_log_txchar(int c,char *uartBase); |
| void alt_log_private_printf(const char *fmt,int base,va_list args); |
| void alt_log_repchar(char c,int r,int base); |
| int alt_log_printf_proc(const char *fmt, ... ); |
| void alt_log_system_clock(); |
| #ifdef __ALTERA_AVALON_JTAG_UART |
| alt_u32 altera_avalon_jtag_uart_report_log(void * context); |
| void alt_log_jtag_uart_startup_info(altera_avalon_jtag_uart_state* dev, int base); |
| void alt_log_jtag_uart_print_control_reg(altera_avalon_jtag_uart_state* dev, \ |
| int base, const char* header); |
| void alt_log_jtag_uart_isr_proc(int base, altera_avalon_jtag_uart_state* dev); |
| #endif |
| void alt_log_write(const void *ptr, size_t len); |
| |
| /* extern all global variables */ |
| /* CASE:368514 - The boot message flag is linked into the sdata section |
| * because if it is zero, it would otherwise be placed in the bss section. |
| * alt_log examines this variable before the BSS is cleared in the boot-up |
| * process. |
| */ |
| extern volatile alt_u32 alt_log_boot_on_flag __attribute__ ((section (".sdata"))); |
| extern volatile alt_u8 alt_log_write_on_flag; |
| extern volatile alt_u8 alt_log_sys_clk_on_flag; |
| extern volatile alt_u8 alt_log_jtag_uart_alarm_on_flag; |
| extern volatile alt_u8 alt_log_jtag_uart_isr_on_flag; |
| extern volatile alt_u8 alt_log_jtag_uart_startup_info_on_flag; |
| extern volatile int alt_log_sys_clk_count; |
| extern volatile int alt_system_clock_in_sec; |
| extern alt_alarm alt_log_jtag_uart_alarm_1; |
| #endif /* ALT_ASM_SRC */ |
| |
| |
| /* Below are the MACRO defines used in various HAL files. They check |
| * if their specific flag is turned on; if it is, then it executes its |
| * code. |
| * |
| * To keep this file reasonable, most of these macros calls functions, |
| * which are defined in alt_log_printf.c. Look there for implementation |
| * details. */ |
| |
| /* Boot Messages Logging */ |
| #define ALT_LOG_PRINT_BOOT(...) \ |
| do { if (alt_log_boot_on_flag==1) {ALT_LOG_PRINTF(__VA_ARGS__);} \ |
| } while (0) |
| |
| /* JTAG UART Logging */ |
| /* number of ticks before alarm runs logging function */ |
| #ifndef ALT_LOG_JTAG_UART_TICKS_DIVISOR |
| #define ALT_LOG_JTAG_UART_TICKS_DIVISOR 10 |
| #endif |
| #ifndef ALT_LOG_JTAG_UART_TICKS |
| #define ALT_LOG_JTAG_UART_TICKS \ |
| (alt_ticks_per_second()/ALT_LOG_JTAG_UART_TICKS_DIVISOR) |
| #endif |
| |
| /* if there's a JTAG UART defined, then enable these macros */ |
| #ifdef __ALTERA_AVALON_JTAG_UART |
| |
| /* Macro in altera_avalon_jtag_uart.c, to register the alarm function. |
| * Also, the startup register info is also printed here, as this is |
| * called within the device driver initialization. */ |
| #define ALT_LOG_JTAG_UART_ALARM_REGISTER(dev, base) \ |
| do { if (alt_log_jtag_uart_alarm_on_flag==1) { \ |
| alt_alarm_start(&alt_log_jtag_uart_alarm_1, \ |
| ALT_LOG_JTAG_UART_TICKS, &altera_avalon_jtag_uart_report_log,\ |
| dev);} \ |
| if (alt_log_jtag_uart_startup_info_on_flag==1) {\ |
| alt_log_jtag_uart_startup_info(dev, base);} \ |
| } while (0) |
| |
| /* JTAG UART IRQ Logging (when buffer is empty) |
| * Inserted in the ISR in altera_avalon_jtag_uart.c */ |
| #define ALT_LOG_JTAG_UART_ISR_FUNCTION(base, dev) \ |
| do { alt_log_jtag_uart_isr_proc(base, dev); } while (0) |
| /* else, define macros to nothing. Or else the jtag_uart specific types |
| * will throw compiler errors */ |
| #else |
| #define ALT_LOG_JTAG_UART_ALARM_REGISTER(dev, base) |
| #define ALT_LOG_JTAG_UART_ISR_FUNCTION(base, dev) |
| #endif |
| |
| /* System clock logging |
| * How often (in seconds) the system clock logging prints. |
| * The default value is every 1 second */ |
| #ifndef ALT_LOG_SYS_CLK_INTERVAL_MULTIPLIER |
| #define ALT_LOG_SYS_CLK_INTERVAL_MULTIPLIER 1 |
| #endif |
| #ifndef ALT_LOG_SYS_CLK_INTERVAL |
| #define ALT_LOG_SYS_CLK_INTERVAL \ |
| (alt_ticks_per_second()*ALT_LOG_SYS_CLK_INTERVAL_MULTIPLIER) |
| #endif |
| |
| /* System clock logging - prints a message every interval (set above) |
| * to show that the system clock is alive. |
| * This macro is used in altera_avalon_timer_sc.c */ |
| #define ALT_LOG_SYS_CLK_HEARTBEAT() \ |
| do { alt_log_system_clock(); } while (0) |
| |
| /* alt_write_logging - echos a message every time write() is called, |
| * displays the first ALT_LOG_WRITE_ECHO_LEN characters. |
| * This macro is used in alt_write.c */ |
| #ifndef ALT_LOG_WRITE_ECHO_LEN |
| #define ALT_LOG_WRITE_ECHO_LEN 15 |
| #endif |
| |
| #define ALT_LOG_WRITE_FUNCTION(ptr,len) \ |
| do { alt_log_write(ptr,len); } while (0) |
| |
| #else /* ALT_LOG_ENABLE not defined */ |
| |
| /* logging is off, set all relevant macros to null */ |
| #define ALT_LOG_PRINT_BOOT(...) |
| #define ALT_LOG_PRINTF(...) |
| #define ALT_LOG_JTAG_UART_ISR_FUNCTION(base, dev) |
| #define ALT_LOG_JTAG_UART_ALARM_REGISTER(dev, base) |
| #define ALT_LOG_SYS_CLK_HEARTBEAT() |
| #define ALT_LOG_PUTS(str) |
| #define ALT_LOG_WRITE_FUNCTION(ptr,len) |
| |
| #endif /* ALT_LOG_ENABLE */ |
| |
| #endif /* __ALT_LOG_PRINTF_H__ */ |
| |