打开log控制:
bootable/bootloader/lk/project/项目名.mk 中添加下面一行:
DEFINES += ENABLE_FBCON_LOGGING=1代码中打印log可用下面接口:
dprintf(CRITICAL, "xcz dprintf enter oem_panel_select");
代码实现:
//log级别控制
bootable/bootloader/lk/project/项目名.mk 中
ifeq ($(TARGET_BUILD_VARIANT),user)
DEBUG := 0
else
DEBUG := 1
endif
bootable/bootloader/lk/include/debug.h
#if defined(DEBUG)
#define DEBUGLEVEL DEBUG
#else
#define DEBUGLEVEL 2
#endif
/* debug levels */
#define CRITICAL 0
#define ALWAYS 0
#define INFO 1
#define SPEW 2
#define dputc(level, str) do { if ((level) <= DEBUGLEVEL) { _dputc(str); } } while (0)
#define dputs(level, str) do { if ((level) <= DEBUGLEVEL) { _dputs(str); } } while (0)
#define dprintf(level, x...) do { if ((level) <= DEBUGLEVEL) { _dprintf(x); } } while (0)
#define dvprintf(level, x...) do { if ((level) <= DEBUGLEVEL) { _dvprintf(x); } } while (0)
//最终实现是_dputc实现
bootable/bootloader/lk/lib/debug/debug.c
int _dputs(const char *str)
{
while(*str != 0) {
_dputc(*str++);
}
return 0;
}
int _dprintf(const char *fmt, ...)
{
char buf[256];
char ts_buf[13];
int err;
snprintf(ts_buf, sizeof(ts_buf), "[%u] ", current_time());
dputs(ALWAYS, ts_buf); //时间总会打印出来
#if ENABLE_FBCON_LOGGING
dputs(ALWAYS, ts_buf);
#endif
va_list ap;
va_start(ap, fmt);
err = vsnprintf(buf, sizeof(buf), fmt, ap);
va_end(ap);
#if ENABLE_FBCON_LOGGING
dputs(ALWAYS, buf);
#endif
return err;
}
//_dputc的实现依赖 uart_putc(0, c);
bootable/bootloader/lk//platform/msm_shared/debug.c
void _dputc(char c)
{
#if WITH_DEBUG_LOG_BUF //存入log缓冲区力-4kB
log_putc(c);
#endif
#if WITH_DEBUG_DCC //关闭
if (c == '\n') {
write_dcc('\r');
}
write_dcc(c) ;
#endif
#if WITH_DEBUG_UART
uart_putc(0, c);
#endif
#if WITH_DEBUG_FBCON && WITH_DEV_FBCON //关闭
fbcon_putc(c);
#endif
#if WITH_DEBUG_JTAG //关闭
jtag_dputc(c);
#endif
}
bootable/bootloader/lk/project/项目名.mk 中
#DEFINES += WITH_DEBUG_DCC=1
DEFINES += WITH_DEBUG_LOG_BUF=1
DEFINES += WITH_DEBUG_UART=1
#DEFINES += WITH_DEBUG_FBCON=1
//下面看一下 uart_putc 实现
1、平台msm7x30、msm7x27a、msm7k
bootable/bootloader/lk/platform/msm_shared/uart.c
2、其他平台定于在下面文件中,msm8909对号入座,用的下面这个
bootable/bootloader/lk/platform/msm_shared/uart_dm.c
int uart_putc(int port, char c)
{
uint32_t uart_base = port_lookup[port];
/* Don't do anything if UART is not initialized */
if (!uart_init_flag) //有个控制开关
return -1;
msm_boot_uart_dm_write(uart_base, &c, 1); //硬件寄存器写一个字符
return 0;
}
//下面再看下串口初始化的实现
bootable/bootloader/lk/target/项目名/init.c 中
void target_early_init(void)
{
#if WITH_DEBUG_UART
/* Do not intilaise UART in case the h/w
* is RCM.
*/
if( board_hardware_id()!= HW_PLATFORM_RCM ) //硬件实际id是HW_PLATFORM_MTP
uart_dm_init(1, 0, BLSP1_UART0_BASE); //串口0被初始化
else
return;
#endif
}
//uart_dm_init中完成初始化 clk,gpio,reg
bootable/bootloader/lk/platform/msm_shared/include/uart_dm.h
bootable/bootloader/lk/platform/msm_shared/uart_dm.c
void uart_dm_init(uint8_t id, uint32_t gsbi_base, uint32_t uart_dm_base)
{
static uint8_t port = 0;
char *data = "Android Bootloader - UART_DM Initialized!!!\n";
/* Configure the uart clock */
clock_config_uart_dm(id);
dsb();
/* Configure GPIO to provide connectivity between UART block
product ports and chip pads */
gpio_config_uart_dm(id);
dsb();
/* Configure GSBI for UART_DM protocol.
* I2C on 2 ports, UART (without HS flow control) on the other 2.
* This is only on chips that have GSBI block
*/
if(gsbi_base)
writel(GSBI_PROTOCOL_CODE_I2C_UART <<
GSBI_CTRL_REG_PROTOCOL_CODE_S,
GSBI_CTRL_REG(gsbi_base));
dsb();
/* Configure clock selection register for tx and rx rates.
* Selecting 115.2k for both RX and TX.
*/
writel(UART_DM_CLK_RX_TX_BIT_RATE, MSM_BOOT_UART_DM_CSR(uart_dm_base));
dsb();
/* Intialize UART_DM */
msm_boot_uart_dm_init(uart_dm_base);
msm_boot_uart_dm_write(uart_dm_base, data, 44);
ASSERT(port < ARRAY_SIZE(port_lookup));
port_lookup[port++] = uart_dm_base; //完成初始化+1
/* Set UART init flag */
uart_init_flag = 1; //控制开关打开
}
Android中的log实现-bootloader 完成