123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354 |
- /* 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__ */
|