linux printk

printk如何调用底层驱动?

printk->vprintk_func->vprintk_default(在未定义CONFIG_PRINTK_NMI)->vprintk_emit->console_unlock->call_console_drivers(通过遍历console_drivers(for_each_console))->(con->write)

asmlinkage __visible int printk(const char *fmt, ...)
{
   
	va_list args;
	int r;

	va_start(args, fmt);
	r = vprintk_func(fmt, args);
	va_end(args);

	return r;
}
static inline __printf(1, 0) int vprintk_func(const char *fmt, va_list args)
{
   
	return vprintk_default(fmt, args);
}

int vprintk_default(const char *fmt, va_list args)
{
   
	int r;
	r = vprintk_emit(0, LOGLEVEL_DEFAULT, NULL, 0, fmt, args);
	return r;
}
asmlinkage int vprintk_emit(int facility, int level,
			    const char *dict, size_t dictlen,
			    const char *fmt, va_list args) {
   
	console_unlock();
}
static void call_console_drivers(int level,
				 const char *ext_text, size_t ext_len,
				 const char *text, size_t len)
{
   
	struct console *con;

	trace_console_rcuidle(text, len);

	if (!console_drivers)
		return;
	//for (con = console_drivers; con != NULL; con = con->next)
	for_each_console(con) {
   
		if (exclusive_console && con != exclusive_console)
			continue;
		if (!(con->flags & CON_ENABLED))
			continue;
		if (!con->write)
			continue;
		if (!cpu_online(smp_processor_id()) &&
		    !(con->flags & CON_ANYTIME))
			continue;
		if (con->flags & CON_EXTENDED)
			con->write(con, ext_text, ext_len);
		else
			con->write(con, text, len);
	}
}

查看控制台如何注册的,通过s3c244x.c来进行分析:

#define S3C24XX_SERIAL_NAME	"ttySAC"
static struct console s3c24xx_serial_console = {
   
	.name		= S3C24XX_SERIAL_NAME,
	.device		= uart_console_device,
	.flags		= CON_PRINTBUFFER,
	.index		= -1,
	.write		= s3c24xx_serial_console_write,
	.setup		= s3c24xx_serial_console_setup,
	.data		= &s3c24xx_uart_drv,
};

#define console_initcall(fn)					\
	static initcall_t __initcall_
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值