概述
static int __init pl011_init(void)
{
int ret;
printk(KERN_INFO "Serial: AMBA PL011 UART drivern");
ret = uart_register_driver(&amba_reg);
if (ret == 0) {
ret = amba_driver_register(&pl011_driver);
if (ret)
uart_unregister_driver(&amba_reg);
}
return ret;
}
static void __exit pl011_exit(void)
{
amba_driver_unregister(&pl011_driver);
uart_unregister_driver(&amba_reg);
}
在arch 初始化的时候,会执行pl011 的初始化。
这个函数执行了uart_register_driver,amba_driver_register,注册了uart 驱动和amba 驱动。
1.uart_driver
描述了串口驱动的设备号,操作函数等内容
static struct uart_driver amba_reg = {
.owner = THIS_MODULE,
.driver_name = "ttyAMA",
.dev_name = "ttyAMA",
.major = SERIAL_AMBA_MAJOR,
.minor = SERIAL_AMBA_MINOR,
.nr = UART_NR,
.cons = AMBA_CONSOLE,
};
static struct console amba_console = {
.name = "ttyAMA",
.write = pl011_console_write,
.device = uart_console_device,
.setup = pl011_console_setup,
.flags = CON_PRINTBUFFER,
.index = -1,
.data = &amba_reg,
};
uart_register_driver 干的事情
1.为uart_state分配空间,并配置
2.初始化tty_driver
3.注册tty 驱动。
调用了接口:alloc_tty_driver(),tty_set_operations(),tty_port_init(),tty_port_init(),tty_register_driver()。
用到的全局变量:
tty_std_termios,amba_reg,uart_ops,uart_port_ops,
tty 驱动的注册,另外在分析。注册完之后。
其中,uart_port 端口在pl011_probe()函数中调用uart_add_one_port ,给该驱动添加串口设备的端口。
2.amba_driver_register
这个函数完成pl011_driver 结构体的填充。
static struct amba_driver pl011_driver = {
.drv = {
.name = "uart-pl011",
},
.id_table = pl011_ids,
.probe = pl011_probe,
.remove = pl011_remove,
#ifdef CONFIG_PM
.suspend = pl011_suspend,
.resume = pl011_resume,
#endif
};
struct bus_type amba_bustype = {
.name = "amba",
.dev_attrs = amba_dev_attrs,
.match = amba_match,
.uevent = amba_uevent,
.pm = AMBA_PM,
};
static struct amba_id pl011_ids[] = {
{
.id = 0x00041011,
.mask = 0x000fffff,
.data = &vendor_arm,
},
{
.id = 0x00380802,
.mask = 0x00ffffff,
.data = &vendor_st,
},
{ 0, 0 },
};
最后
以上就是朴实大侠为你收集整理的pl011_init的全部内容,希望文章能够帮你解决pl011_init所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复