serival(串口驱动)分析

serival(串口驱动)分析

ID:20484584

大小:370.71 KB

页数:24页

时间:2018-10-13

serival(串口驱动)分析_第1页
serival(串口驱动)分析_第2页
serival(串口驱动)分析_第3页
serival(串口驱动)分析_第4页
serival(串口驱动)分析_第5页
资源描述:

《serival(串口驱动)分析》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、分析ttySn驱动之前先明确儿个概念(1)/dev/ttySm串口端口终端,是使用串口计算机终端连接的终端设备,对应我们具体的华口设备(2)/dev/tty:如果当前进程有控制终端的话,那么/dev/tty就是当前进程的控制终端的特殊设备文件可用ps-ef来查看,对于你登录的shell/dev/tty就是你使用的终端⑶/dev/ttyn/dev/console:控制台终端开始分析之前来看2张图:图1Hardwarelinediscipline表示这条终端“线程”的输入与输出规范设置,主要用来进行输入/输出数据的预定义处理,处理完后,将数据交给serial_core,最后serial_

2、core会调用具体的rk_serial.c的操作。用户想要访问linux的串口设备,在用户空间通过read/write/bctl等,首先通过设备文件(字符设备)和tty_core交互,tty一core根据交互类型选择tty_driver或者linediscipline执行,如果是ioctl这交给tty_driver(这里是servila_core)去处理,如果是read/write这交给linediscipline去处理。图2用户空M再看第二张图,一个uart_driver通常会注册一段设备号.即在用户空间会看到uart_driver对应有多个设备节点。例如:/dev/ttySO/d

3、ev/ttySl每个设备节点是对应一个具体硬件的,这样就可做到对多个硬件设备的统一管理,而毎个设备文件应该对应一个uart_port,也就是说:uart_device要和多个uart_port关系起来。并且每个uart_port对应一个circ_buf(用来接收数据〉,所以uart_port必须要和这个缓存区关系起来。有了上而的理解,我们开始进入代码去研宄具体的实现过程以RK3288平台作为媒介去研究tty_core源码在:kernel/drivers/tty/tty_io.c这个文件主要将tty注册成一个chardev,对应上面的tty_core的部分。先放一卜,先看看serial

4、_core的代码。kernel/drivers/tty/serial/serial_core.c这个文件对应的serial_core的操作,里而主要的函数有:EXPORT_SYMBOL(uart_write_wakeup);EXPORT_SYMBOL(uart_register_driver);EXPORT_SYMBOL(uart_unregister_driver);EXPORT_SYMBOL(uart_suspend_port);EXPORT_SYMBOL(uart_resume_port);EXPORT_SYMBOL(uart_add_one_port);EXPORT_SYMB

5、OL(uart_remove_one_port);这里和linux大多数core的做法一样,提供一个主要函数给具体的设备驱动注册到对应的core,那么需要从具体的uart驱动开始分析。具体驱动代码在:kernel/drivers/tty/serial/rk_serial.c开始分析这个文件module_init(serial_rk_init);->linux设备驱动入口函数staticstructuart_driverserial一rk_reg={.owner=THIS_MODULE,.driver_name="rk29_ser1al",•dev_name="ttyS",.major

6、=TTY_MAJOR,.minor=64,.cons=SERIAL_CONSOLE,•nr=UART_NR,};staticint_initserial_rk_init(void){ret=uart_register_driver(&serial_rk_reg);ret=platform_driver_register(&serial_rk_drjver);}这个函数只有2个执行函数,从uart_resister_driver开始分析,这个函数在serial_core.c实现intuart_register_driver(structuart_driver*drv){//每个端口对应

7、一•个statedrv->state=kzaIloc(sizeof(structuart_state)*drv-〉nr,GFP_KERNEL);//分配该串口驱动对应的tty_drivernormal=a11oc_tty_driver(drv->nr);drv->tty_driver=normal;//设置相关属性normal->ownernormal->driver_namenormal->namenormal->majornormal->minor_s

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。