lk中printf的实现

打开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 完成





















  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值