Linux uart驱动及应用.docx

上传人:pu****.1 文档编号:562089318 上传时间:2023-08-11 格式:DOCX 页数:13 大小:182.78KB
返回 下载 相关 举报
Linux uart驱动及应用.docx_第1页
第1页 / 共13页
Linux uart驱动及应用.docx_第2页
第2页 / 共13页
Linux uart驱动及应用.docx_第3页
第3页 / 共13页
Linux uart驱动及应用.docx_第4页
第4页 / 共13页
Linux uart驱动及应用.docx_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《Linux uart驱动及应用.docx》由会员分享,可在线阅读,更多相关《Linux uart驱动及应用.docx(13页珍藏版)》请在金锄头文库上搜索。

1、#define TTY_MAJOR4#define TTYAUX_MAJOR5 Tty : 终端设备的统称。一般分为:控制台、串口和pty./dev/ttySn: 串行端口终端(串口),串行端口被看做字符设备。4:66 (设备号)- ././devices/platform/serial8250/tty/ttyS24:67 - ././devices/platform/serial8250/tty/ttyS34:68 - ././devices/platform/serial8250/tty/ttyS4echo test /dev/ttyS2 可接串口来测试ttyS2。Pty: pseudo

2、tty 虚拟(伪)终端pts(pseudo-terminal slave) 与 ptmx(pseudo-terminal master) 配合使用实现 pty。打开一个伪terminal,那么将会在devpts文件系统/dev/pts下创建一个对应的pts字符文件。通过tty命令(或者who am i)查看当前终端,可以看出此伪terminal对应着pts3。再打开一个伪terminal:此伪terminal对应着pts4.两个终端间传输信息:/dev/tty: 就是当前使用的终端。设备号:5:0tty可以是pts3,也可以是tty1。控制台终端:tty0:代表当前使用的控制台终端。设备号4:

3、0.Ubuntu下:图像界面下通过Ctrl + Alt + F1F6 可以切换到tty1到tty6。Ctrl + Alt + F7切会图像界面。Pts3 发送到tty1。/dev/console是指向当前console。设备号5:1-Tty 核心:struct tty_driver *alloc_tty_driver(int lines)struct tty_driver *driver;driver = kzalloc(sizeof(struct tty_driver), GFP_KERNEL);if (driver) kref_init(&driver-kref);driver-magic

4、 = TTY_DRIVER_MAGIC;driver-num = lines; (次设备个数)/* later well move allocation of tables here */return driver;/分配一个结构体tty_driver,初始化其magic、num。int tty_register_driver(struct tty_driver *driver)if (!(driver-flags & TTY_DRIVER_DEVPTS_MEM) & driver-num) p = kzalloc(driver-num * 2 * sizeof(void *), GFP_KE

5、RNEL);if (!driver-major) error = alloc_chrdev_region(&dev, driver-minor_start,driver-num, driver-name); else dev = MKDEV(driver-major, driver-minor_start);error = register_chrdev_region(dev, driver-num, driver-name); /如果没有指定主设备号,则分配并注册,否则直接注册设备号。if (p) driver-ttys = (struct tty_struct *)p;driver-ter

6、mios = (struct ktermios *)(p + driver-num); else driver-ttys = NULL;driver-termios = NULL;cdev_init(&driver-cdev, &tty_fops); /初始化设备操作函数集。driver-cdev.owner = driver-owner;error = cdev_add(&driver-cdev, dev, driver-num); /注册字符设备。mutex_lock(&tty_mutex);list_add(&driver-tty_drivers, &tty_drivers); /此dr

7、iver-tty_drivers加到链表tty_drivers上mutex_unlock(&tty_mutex);if (!(driver-flags & TTY_DRIVER_DYNAMIC_DEV) for (i = 0; i num; i+) d = tty_register_device(driver, i, NULL); /如果没有指定TTY_DRIVER_DYNAMIC_DEV,则注册tty设备(在sysfs上建立相应的文件)proc_tty_register_driver(driver);driver-flags |= TTY_DRIVER_INSTALLED; /标记为已安装r

8、eturn 0;struct tty_struct struct tty_driver *driver;struct tty_ldisc *ldisc;下面分析一下tty_fops:static const struct file_operations tty_fops = .llseek= no_llseek,.read= tty_read,.write= tty_write,.poll= tty_poll,.unlocked_ioctl= tty_ioctl,.compat_ioctl= tty_compat_ioctl,.open= tty_open,.release= tty_rele

9、ase,.fasync= tty_fasync,;tty_write - do_tty_write - tty-ldisc-ops-writetty_read - tty-ldisc -ops-readtty - ldisc在哪里赋值?在tty_open里。tty_open - tty_init_dev - initialize_tty_struct - tty_ldisc_init在initialize_tty_struct 里还有:tty-ops = driver-ops;-Tty线路规程:void tty_ldisc_init(struct tty_struct *tty)struct

10、tty_ldisc *ld = tty_ldisc_get(N_TTY); / ldops = tty_ldiscsdisc; ld-ops = ldops;tty_ldisc_assign(tty, ld); / tty-ldisc = ld;全局变量tty_ldiscs 在哪里赋值?start_kernel - console_init - tty_ldisc_begin - tty_register_ldisc -tty_ldiscsdisc = tty_ldisc_N_TTYstruct tty_ldisc_ops tty_ldisc_N_TTY = .magic = TTY_LDIS

11、C_MAGIC,.name = n_tty,.open = n_tty_open,.close = n_tty_close,.flush_buffer = n_tty_flush_buffer,.chars_in_buffer = n_tty_chars_in_buffer,.read = n_tty_read,.write = n_tty_write,.ioctl = n_tty_ioctl,.set_termios = n_tty_set_termios,.poll = n_tty_poll,.receive_buf = n_tty_receive_buf,.write_wakeup =

12、n_tty_write_wakeup;n_tty_write - tty-ops-write即(driver-ops-write)n_tty_read 没有直接掉用下一层的read,使用了tty-read_buf进行交互。-Tty驱动程序:struct uart_driver struct uart_state*state;struct tty_driver*tty_driver;uart_register_driver - tty_register_driverint uart_register_driver(struct uart_driver *drv)drv-state = kzalloc(sizeof(struct uart_state) * drv-nr, GFP_KERNEL);/分配uart_state,一个端口对应一个normal = alloc_tty_driver(drv-nr); / 分配tty_driverdrv-tty_driver = normal;normal-owner= drv-owner;normal-driver_name= drv-driver_name;normal-name= drv-dev_name;normal-major= drv-major;normal-minor_start= drv

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号