1、b.struct uart_mxr_port mxc_ports8 mxc_ports数组是自定义的 uart_mxc_port 数组,数组大小为 8,在 mx51 中只用到前 3 个。mxc_ports中包含的最重要的结构体是 struct uart_port,它们之间的关系详见数据结构关系图。static uart_mxc_port*mxc_portsMXC_UART_NR;/MXC_UART_NR=82.数据结构关系图数据结构关系图 uart_driver const char*driver_name;const char*dev_name;struct console*cons;int
2、 nr;*state;*tty_driver;uart_state.port;.xmit;*uart_port;tty_driver int magic;const char*driver_name;const char*name;struct cdev cdev;struct tty_struct*ttys;struct ktermios*termios;const struct tty_operations*ops;int num;struct list_head tty_drivers;uart_mxc_port.port;struct clk*clk;uart_port unsigne
3、d int irq;unsigned int line;unsigned int type;unsigned int uartclk;struct uart_icount icount;const struct uart_ops*ops;struct device *dev;struct uart_state*state;void *private_data;tty_port struct tty_struct*tty;Const struct tty_port_operations *ops;unsigned char *xmit_buf;tty_struct int magic;*driv
4、er;int index;struct tty_ldisc*ldisc;struct tty_bufhead buf;*port;void*driver_data;char*write_buf circ_buf char*buf;int head;int tail;tty_bufhead struct tty_buffer*head;struct tty_buffer*tail;struct tty_buffer*free;int memory_used;tty_buffer struct tty_buffer*next;char*char_buf_ptr;unsigned char*flag
5、_buf_ptr;int used;int size;int commit;int read;unsigned long data0;tty_ldisc Struct tty_ldisc_ops*ops;四四、uart 注册及注册及初始化初始化 1.uart 注册注册 uart 驱动程序入口:module_init(mxcuart_init);static int _init mxcuart_init(void)/uart_register_driver(uart_driver*)-tty_register_driver(tty_driver*)cdev_add()/最终注册了nr(nr=8)
6、个字符设备驱动ret=uart_register_driver(&mxc_reg);/mxc_reg定义见数据结构1ret=platform_driver_register(&mxcuart_driver);/mxcuart_driver见下面定义 在mxcuart_init()函数中,我们重点分析uart_register_driver(struct uart_driver*),对于 platform_driver_register(),详见平台设备注册文档分析。下面重点分析 uart_register_driver(struct uart_driver*)在 uart_register_d
7、river()中,构建了 tty_driver,并将 uart_driver 中的相关成员赋值给 tty_driver,最终调用到 tty_register_driver(struct tty_driver*)。uart_register_driver(struct uart_driver*drv)drv-state=kzalloc(sizeof(struct uart_state)*drv-nr,GFP_KERNEL);struct tty_driver*normal=alloc_tty_driver(drv-nr);/将 uart_driver 中的成员变量赋值给 tty_driver,例
8、如:主次/设备号,驱动名、设备名、通信相关 init_termios 设置等 tty_set_operations(normal,&uart_ops);tty_port_init(port);/初始化上面申请的(drv-nr)个 uart_state 中的 tty_port tty_register_driver(normal);在 tty_register_driver(struct tty_driver*)中,最终注册了 8 个字符设备驱动,其操作函数为 tty_fops。static const struct file_operations tty_fops=.read=tty_read
9、,.write=tty_write,.open=tty_open,;下面分析不同层次间几个 operations 函数的关系,如图:tty_register_driver(struct tty_driver*driver)dev=MKDEV(driver-major,driver-minor_start);register_chrdev_region(dev,driver-num,driver-name);cdev_init(&driver-cdev,&tty_fops);cdev_add(&driver-cdev,dev,driver-num);/注册了 8 个字符驱动 list_add(&
10、driver-tty_drivers,&tty_drivers);/将 tty_drivers 加入一个全局的 tty_drivers 链表 tty_register_device(driver,i,NULL);/i=07,循环注册 8 个 device 在上面前 3 层中,每一层都给自己的下一层提供了操作函数的接口,tty_core是一个字符设备驱动,实现了字符设备提供的 struct file_operations,同时给自己的下层提供了 struct tty_operations 操作接口。serial_core 使用了 tty_core 提供的 struct tty_operation
11、s 操作接口,同时给自己的下层提供了 struct uart_ops 操作接口。在后面的打开、数据读写过程中我们将会看到具体的层层调用关系。到这里 uart 注册告一段落。2.uart 初始化初始化 uart 平台设备在/arch/arm/mach-mx5/serial.c 中 arch_initcall(mxc_init_uart)注册,注册了 3 个平台设备。uart 平台驱动和 uart 平台设备通过名字“mxcintuart”匹配,匹配成功调用uart 平台驱动中的 mxcuart_probe()。在mxcuart_probe 中主要是将平台资源给mxc_ports中的uart_por
12、t,然后调用uart_add_one_port(),它根据 uart_port中的 line 拿到 uart_driver中对应的tty_core serial_core uart 驱动 struct file_operations.open.read.write struct tty_operations .open.read.write struct uart_ops .open.read.write 字符驱动 uart_state,然后配置好这个 port 并调用 tty_register_device()注册该 port。匹配成功后将调用到 mxcuart_probe()。static
13、 struct platform_driver mxcuart_driver=.driver=.name=mxcintuart,.probe=mxcuart_probe,.remove=mxcuart_remove,.suspend=mxcuart_suspend,.resume=mxcuart_resume,;static struct platform_device mxc_uart_device1=.name=mxcintuart,.id=0,.num_resources=ARRAY_SIZE(mxc_uart_resources1),.resource=mxc_uart_resources1,.dev=.platform_data=&mxc_ports0,;static struct resource mxc_uart_resources1=.start=UART1_BASE_ADDR,.end=UART1_BASE_ADDR+0 x0B5,.flags=IORESOURCE_MEM,.start=MXC_INT_UART1,.flags=IORESOURCE_IRQ,;static
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1