A20串口驱动分析

串口驱动的整体框架实际上和显示驱动类似

驱动程序是一个字符设备,驱动的实质内容都是在一个平台总线设备驱动程序里


1.  串口驱动的分析,从"drivers/tty/serial/8250/8250.c"开始

     serial8250_init为入口函数,从这个函数一路分析下去,下面列出主要代码

             serial8250_reg.nr = UART_NR;          UART_NR为8,查看datasheet可知A20支持8个uart
             ret = uart_register_driver(&serial8250_reg);


     uart_register_driver在”drivers/tty/serial/serial_core.c“中可以找到

             normal->type  = TTY_DRIVER_TYPE_SERIAL; 

             normal->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;

             tty_register_driver


    tty_register_driver"drivers/tty/tty_io.c"这个文件中找到如下函数

           alloc_chrdev_region

           register_chrdev_region

           cdev_init

            cdev_add

           if (!(driver->flags & TTY_DRIVER_DYNAMIC_DEV)) {
                  for (i = 0; i < driver->num; i++) {
                          d = tty_register_device(driver, i, NULL);
                          if (IS_ERR(d)) {
                               error = PTR_ERR(d);
                              goto err;
                          }
                  }
          }

          前四个函数是创建一个字符设备驱动程序的典型函数,后面那段if语句之所以拿出来说一下,是因为

          tty_register_device这个函数是用来创建设备文件的,但是这个if语句是不会执行,因为从上面的分析可 

          知道这个驱动的flags里TTY_DRIVER_DYNAMIC_DEV。那么什么时候创建了设备文件呢。实际上,上面几个文件只是一个框架性的东西。


2.   接下来分析另一路主线

      ”drivers/tty/serial/8250/8250_sunxi.c"

       sw_serial_init

       这里注册了一个平台总线驱动和平台总线设备

             script_get_item(uart_para, "uart_used", &val);

             从配置文件中得到某一个串口是否可用如果可用的话,在调用如下函数

            platform_device_register

            platform_driver_register

           来完成平台总线驱动和平台总线设备的匹配

          分析device和driver 如下

          static struct platform_driver sw_serial_driver = {
                   .probe      = sw_serial_probe,
                   .remove     = sw_serial_remove,
                   .suspend    = sw_serial_suspend,
                   .resume     = sw_serial_resume,
                   .driver     = {
                            .name   = "sunxi-uart",
                            .owner  = THIS_MODULE,
                   },
          };

        struct platform_device sw_uart_dev[] = {
    [0] = {.name = "sunxi-uart", .id = 0, .num_resources = ARRAY_SIZE(sw_uart_res[0]), .resource = &sw_uart_res[0][0], .dev.release = sunxi_serial_release},
    [1] = {.name = "sunxi-uart", .id = 1, .num_resources = ARRAY_SIZE(sw_uart_res[1]), .resource = &sw_uart_res[1][0], .dev.release = sunxi_serial_release},
    [2] = {.name = "sunxi-uart", .id = 2, .num_resources = ARRAY_SIZE(sw_uart_res[2]), .resource = &sw_uart_res[2][0], .dev.release = sunxi_serial_release},
    [3] = {.name = "sunxi-uart", .id = 3, .num_resources = ARRAY_SIZE(sw_uart_res[3]), .resource = &sw_uart_res[3][0], .dev.release = sunxi_serial_release},
    [4] = {.name = "sunxi-uart", .id = 4, .num_resources = ARRAY_SIZE(sw_uart_res[4]), .resource = &sw_uart_res[4][0], .dev.release = sunxi_serial_release},
    [5] = {.name = "sunxi-uart", .id = 5, .num_resources = ARRAY_SIZE(sw_uart_res[5]), .resource = &sw_uart_res[5][0], .dev.release = sunxi_serial_release},
    [6] = {.name = "sunxi-uart", .id = 6, .num_resources = ARRAY_SIZE(sw_uart_res[6]), .resource = &sw_uart_res[6][0], .dev.release = sunxi_serial_release},
    [7] = {.name = "sunxi-uart", .id = 7, .num_resources = ARRAY_SIZE(sw_uart_res[7]), .resource = &sw_uart_res[7][0], .dev.release = sunxi_serial_release},
};

        从上面两个结构体可以看出,8个平台总线设备匹配了1个平台总线驱动。

       那么接下来我们看看平台总线驱动的probe函数实现了什么。

3. sw_serial_probe函数分析

              sw_serial_get_config这个函数从配置文件中得到type和port两个参数,type应该是管脚数目,比如基本的串口使用了tx,rx,那个type就是2,加两个流控,type就是4,全串口type就是8.

          sw_serial_get_resource这个函数,从配置文件中得到管脚的定义,并从平台设备的resources中得到,内存和中断资源。

          serial8250_register_port      serial8250_register_port定义8250.c中

          uart_add_one_port   定义在serial_core.c中

          tty_register_device  定义在tty_io.c中

          下面主要分析这个函数

4. struct device *tty_register_device(struct tty_driver *driver, unsigned index,
                   struct device *device)
    {
         char name[64];

         这句构造主次设备号

         dev_t dev = MKDEV(driver->major, driver->minor_start) + index;

        
          if (index >= driver->num) {
                printk(KERN_ERR "Attempt to register invalid tty line number "
                       " (%d).\n", index);
                 return ERR_PTR(-EINVAL);
         }

         if (driver->type == TTY_DRIVER_TYPE_PTY)
                  pty_line_name(driver, index, name);
         else

                  这句构造串口设备文件

                  tty_line_name(driver, index, name);

           这句用name来创建一个设备文件
          return device_create(tty_class, device, dev, NULL, name);
   }

     最终在这里创建了串口的设备文件,实际这个串口真正硬件资源相关的东西都是在这个平台总线设备和平台总线驱动里来管理的。

     最上面的那个串口字符设备驱动只是一个框架性的东西。实际和显示驱动类似,2.6内核以后的很多驱动程序都是这种分层的方式,用平台总线驱动程序来实现。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php vo 遍历,thinkPHP简单遍历数组方法分析

thinkPHP简单遍历数组方法分析文章主要介绍了thinkPHP简单遍历数组方法,结合实例形式分析了thinkPHP使用volist标签遍历数组的技巧,并对比分析了织梦cms的arclist标签加强对thinkPHP数组遍历的理解,需要的朋友可以参考下。本文实例分析了thinkPHP简单遍历数组方法。分享给大家供…

【Demo 0011】多媒体播放器

本章学习要点: 1. 掌握AVAudioPlayer 基本使用; 2. 掌握AVPlayer 基本使用; 3. 掌握系统声音播放以及震动; 4. 掌握MPMediaPlayerController 基本使用; 5. 掌握音乐后台播发以及普通应用后台工作方法; 转载于:https://www.cnblogs.com/ztercel/p/3225689.html

oracle对某两列求和再求和_函数实战:多列条件求和

今天和新手小伙伴们分享有关条件求和的内容&#xff0c;高手请忽略哈。先来看一组销售数据&#xff0c;是某商场不同品牌电视机的三天销售记录&#xff1a;现在需要根据G列的品牌&#xff0c;计算其三天的销售总和。想必有表亲已经想到办法了&#xff0c;既然是按条件求和&…

Mysql安装时出现APPLY security settings错误

1 APPLY security settings错误&#xff0c;经过许久的揣摩&#xff0c;发现第一次安装时不会出现这样的错误&#xff0c;而在重新安装时&#xff0c;就会很容易的出现apply security setting error&#xff08;access denied for user rootlocalhost(using password: YES)&…

php 访问第三方接口吗,PHP-----------HTTP请求的第三方接口

2019独角兽企业重金招聘Python工程师标准>>>开发中常常遇到接口请求这个功能&#xff0c;后台也不例外&#xff0c;因为遇到了&#xff0c;所以写一篇。前段时间做商城后台时&#xff0c;需要用到第三方物流接口查询物流信息。post&#xff1a;/***** param $url* par…

(IOS)截图Demo

思路是建一个UIView的子类&#xff0c;获取划动出的矩形&#xff0c;用协议将矩形传递给代理对象&#xff0c;依据该矩形完成图像数据的截取&#xff0c;并显示出来。 截图视图类&#xff1a; #import <UIKit/UIKit.h>protocol UICutImgDelegate;interface BIDCutView : …

python的map怎么用_python中的map怎么使用

python中的map方法怎么使用&#xff1f;下面给大家介绍一下具体使用的方法&#xff1a;描述map() 会根据提供的函数对指定序列做映射。第一个参数 function 以参数序列中的每一个元素调用 function 函数&#xff0c;返回包含每次 function 函数返回值的新列表。语法map() 函数语…

关于linux kernel编译的几项关键点:

1. make参数&#xff1a; CROSS_COMPILE即交叉编译器的前缀&#xff08;prefix)&#xff0c;也就是选择将代码编译成目标cpu的指令的工具&#xff0c;如指定makeCROSS_COMPILEarm-none-linux-gnueabi-就是使用arm-none-linux-gnueabi-gcc,arm-none-linux-gnueabi-ld等工具将代码…

POJ1033 Defragment

题目来源&#xff1a;http://poj.org/problem?id1033 题目大意&#xff1a; 某操作系统的文件系统中&#xff0c;所有的磁盘空间被分为N个大小相等的cluster&#xff0c;编号1至N。每个文件占用一个或多个cluster。所有没有被文件占用的cluster称为是空闲的。磁盘上的一个文件…

php怎么和数据库通信,php – 如何处理域和数据库层之间的通信?

加布里埃尔,这被称为“impedance matching problem”.有许多解决方案,从重量级的实体bean,如J2EE实体bean到Ruby ActiveRecord,再到简单的手工连接编码.更新好吧,很难在没有更多信息的情况下很难确切地知道如何攻击它,但这是基本的方法.任何这些架构问题都是由性能等非功能性需…

pcb过孔漏铜_【企业资讯】大正瑞地:专注PCB药水二十年,品质、性能可靠

企业简介公司拥有领先的技术及产品、顾问型服务、PCB药水全系列体系化运行。沉铜、电镀、中/超粗化、减铜药水、化镍金、OSP、显影、退膜及辅助物料等全系列PCB药水&#xff0c;自主研发&#xff0c;拥有核心技术&#xff0c;自成体系&#xff0c;可以全面、系统的供应产品及全…

asterisk extconfig.conf文件解析

1. int read_config_maps(void), 定义在main/config.c,被main函数调用&#xff0c;下面开始分析read_config_maps struct ast_config *config, *configtmp; 新建一个配置结构体 configtmp ast_config_new(); 从extconfig_conf即extconfig.conf得到配置信息并存储在config 中…

php微信模板信息发送的代码例子,微信模板消息发送样例

微信模板消息发送样例://先构建一个http发送function http_request($url, $data array()){$ch curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($ch, CURLOPT_S…

前端切换视图_前端架构 101(五):从 Flux 进化到 Model-View-Presenter

李熠&#xff1a;前端架构 101&#xff08;一&#xff09;&#xff1a;在谈论它们之前我们需要达成的共识​zhuanlan.zhihu.com李熠&#xff1a;前端架构 101&#xff08;二&#xff09;&#xff1a; MVC 初探​zhuanlan.zhihu.com李熠&#xff1a;前端架构 101&#xff08;三&…

[转+整理]十道海量数据处理面试题与十个方法大总结

海量数据处理&#xff1a;十道面试题与十个海量数据处理方法总结 作者&#xff1a;July、youwang、yanxionglu。 时间&#xff1a;二零一一年三月二十六日 本文之总结&#xff1a;教你如何迅速秒杀掉&#xff1a;99%的海量数据处理面试题。有任何问题&#xff0c;欢迎随时交流、…

java fx 建立窗体,3花式窗体与JavaFX CSS

2019独角兽企业重金招聘Python工程师标准>>>3花式窗体与JavaFX CSS本教程是通过添加级联样式表(CSS)来使您的JavaFX应用程序看起来很有吸引力。您开发设计&#xff0c;创建.css文件并应用新样式。在本教程中&#xff0c;您将使用一个使用默认样式进行标签&#xff0c;…

asterisk几个通用函数说明

1. #define ast_config_load(filename, flags) ast_config_load2(filename, AST_MODULE, flags) 加载配置文件filename&#xff0c;并返回一个ast_config结构体指针。 ast_config_load2是调用了 struct ast_config *ast_config_internal_load(const char *filename, struc…

python如何进行格式化输出变量_Python变量格式化输出实现原理解析

print() 函数使用以 % 开头的转换说明符对各种类型的数据进行格式化输出。转换说明符(Conversion Specifier)只是一个占位符(也称为格式化操作符)&#xff0c;它会被后面表达式(变量、常量、数字、字符串、加减乘除等各种形式)的值代替。转换说明符解释%d、%i转换为带符号的十进…

java json 返回null,[] Spring4 MVC 返回json格式时候 设置不返回null值属性的有关问题...

[求助] Spring4 MVC 返回json格式时候 设置不返回null值属性的问题本帖最后由 bighong0404 于 2015-10-06 12:45:38 编辑背景:使用responseBody设置以json格式返回数据时候. 有时候被返回的对象有些属性是null值, 默认还是会输出. 例如下面代码. 在与移动端交互时候会很浪费流量…

log4j无厘头异常

今天系统升级&#xff0c;是web程序&#xff0c;备份程序之后&#xff0c;替换class下面的com的全部类文件后shutdown tomcat&#xff0c;然后启动程序&#xff0c;startup之后出现 java.lang.NullPointerException at org.apache.log4j.spi.LocationInfo.<init>(Loca…