pl011_init
来源:互联网 发布:中国调查数据网 编辑:程序博客网 时间:2024/06/09 23:26
static int __init pl011_init(void){ int ret; printk(KERN_INFO "Serial: AMBA PL011 UART driver\n"); 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 },};