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 },};