【1:引言: linux字符设备驱动的基本编程流程】

1.实现模块加载函数
  a.申请主设备号
    register_chrdev(major,name,file_operations);
  b.创建字符设备cdev,注册字符设备
    cdev_alloc cdev_init cdev_add
  c.创建设备文件
    class_create device_create
  d.注册中断
    ret =request_irq(中断号,...,...,...,...);
  e.映射
    虚拟地址=ioremap(物理地址,大小)
  f.初始化(初始化等待队列头,初始化tasklet,初始化工作队列)
  ...
2.实现模块卸载函数
3.构建file_operations结构体变量
4.实现操作硬件的方法
  xxx_open xxx_write xxx_read


为了提高驱动的可移植性,减少驱动开发周期,最好将跟硬件/平台相关的东西分离出来,以便增强驱动的可移植性

中断号,物理地址----->归为设备资源

最好将设备资源与设备驱动分离开来

                       平台设备驱动机制
platform_device                             platform_driver
设备资源(设备)           <------>            设备驱动

【2:设备总线驱动模型:内核用来管理设备与驱动的一种方式】

设备总线驱动模型:以对象的思想来实现的
    每一个设备对应唯一的一个驱动
    每个驱动则可能服务多个设备
    系统中有很多总线:1)实际的物理总线(如:i2c总线,usb总线,SDIO总线,SPI总线...)
                     2)虚拟总线(只有一条:平台总线)

【对象思想】

/*1.在系统用来表示一个设备*/
struct device {
 struct device_driver *driver;  //设备驱动
 struct bus_type *bus;     //所属总线
 struct device  *parent;   //父设备
 dev_t   devt;     //设备号
 void  *platform_data;    //私有数据
 ....
}

/*2.在系统中用来表示设备驱动*/
struct device_driver {
 const char  *name;   //驱动名字
 struct bus_type  *bus;  //所属总线
 struct module  *owner;  //拥有者
 int (*probe) (struct device *dev); //probe函数
}

/*3.在系统中用来表示总线*/
struct bus_type {
 const char  *name;   //总线名字
 /*mach函数,匹配函数,每条总线里面都会有自己的
  *mach,但不同总线的mach的匹配方法可能会不同
  */
 int (*match)(struct device *dev, struct device_driver *drv);  
 
 /*当设备与驱动匹配成功的时候,便会调用probe函数
  *不过,一般总线中不会实现probe函数,在匹配成功
  *的时候,会直接调用设备驱动中的probe函数
  */
 int (*probe)(struct device *dev);
 int (*remove)(struct device *dev);
}

【设备总线驱动模型里面的操作函数】

/*1.总线注册*/
int bus_register(struct bus_type *bus)
void bus_unregister(struct bus_type *bus)
/*2.设备注册*/
int device_register(struct device *dev)
void device_unregister(struct device *dev)
/*3.设备驱动注册*/
int driver_register(struct device_driver *drv)
void driver_unregister(struct device_driver *drv)

【3:平台设备驱动机制】

借助于设备总线驱动模型,虚拟出一条总线,用来实现设备资源与设备驱动的匹配
===============================================
平台设备驱动机制采用了:分离的思想,对象的思想

分离的思想:设备资源与设备驱动分离开

【对象思想】

);
}

【总线注册】

/*内核启动时的第一个C语言入口函数*/
start_kernel     //init/main.c
     rest_init
     /*创建一个内核线程*/
     kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);  
     kernel_init
          do_basic_setup   //init/main.c
           driver_init
            platform_bus_init
         /*1.注册平台总线*/
         bus_register(&platform_bus_type);

【平台设备驱动模型的关键接口函数】

/*1.注册平台设备*/
int platform_device_register(struct platform_device *pdev)
void platform_device_unregister(struct platform_device *pdev)

/*2.注册平台驱动*/
int platform_driver_register(struct platform_driver *drv)
void platform_driver_unregister(struct platform_driver *drv)

/*3.获取平台资源*/
platform_get_resource(struct platform_device * dev, unsigned int type, unsigned int num)

【linux设备驱动之设备总线驱动模型】

【设备总线驱动模型】

@成鹏致远(wwwlllll@126.com)

【Linux高级驱动】linux设备驱动模型之平台设备驱动机制的更多相关文章

  1. Linux中总线设备驱动模型及平台设备驱动实例

    本文将简要地介绍Linux总线设备驱动模型及其实现方式,并不会过多地涉及其在内核中的具体实现,最后,本文将会以平台总线为例介绍设备和驱动程序的实现过程. 目录: 一.总线设备驱动模型总体介绍及其实现方 ...

  2. 【总结】设备树对platform平台设备驱动带来的变化(史上最强分析)【转】

    本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/74375086 版权声明:本文为博主原创文章,转载请注明http://blog.c ...

  3. linux设备驱动那点事儿之平台设备理论篇

    一:Platform总线 1.1概述 一个现实的linux设备驱动通常需要挂接在一种总线上,对于本身依附于PCI,USB,IIC,SPI等的设备而言,这自然不是问题,但是在嵌入式系统里面,SOC系统中 ...

  4. 字符设备驱动、平台设备驱动、设备驱动模型、sysfs的比较和关联

    转载自:http://www.kancloud.cn/yueqian_scut/emlinux/106829 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sy ...

  5. [kernel]字符设备驱动、平台设备驱动、设备驱动模型、sysfs几者之间的比较和关联

    转自:http://www.2cto.com/kf/201510/444943.html Linux驱动开发经验总结,绝对干货! 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动 ...

  6. LCD驱动分析(二)帧缓冲设备作为平台设备

    参考:S3C2440 LCD驱动(FrameBuffer)实例开发<一>   S3C2440 LCD驱动(FrameBuffer)实例开发<二> 1.平台设备注册 1.1在li ...

  7. 高通 android平台LCD驱动分析

    目前手机芯片厂家提供的源码里包含整个LCD驱动框架,一般厂家会定义一个xxx_fb.c的源文件,注册一个平台设备和平台驱动,在驱动的probe函数中来调用register_framebuffer(), ...

  8. 46.Linux-创建rc红外遥控平台设备,实现重复功能(2)

    上章链接:46.Linux-分析rc红外遥控平台驱动框架,修改内核的NEC解码函数BUG(1) 在上章分析了红外platform_driver后,已经修改bug后,接下来我们自己创建一个红外platf ...

  9. Linux驱动之平台设备驱动模型简析(驱动分离分层概念的建立)

    Linux设备模型的目的:为内核建立一个统一的设备模型,从而有一个对系统结构的一般性抽象描述.换句话说,Linux设备模型提取了设备操作的共同属性,进行抽象,并将这部分共同的属性在内核中实现,而为需要 ...

随机推荐

  1. unbuntu 18.04 LTS 版 安装Samba服务器

      首先需要注意的是,此时服务器的版本是乌班图18.04 LTS Server ,安装配置Samba服务器 . 首先来对当前的软件进行更新. 1 sudo apt-get upgrade 2 sudo ...

  2. python模块——PrettyTable

    python模块——PrettyTable 一. 简介 Python通过prettytable模块将输出内容如表格方式整齐输出,可用来生成美观的ASCII格式的表格,十分实用. python本身并不内 ...

  3. Python - 利用flask搭建一个共享服务器

    零.概述 我利用flask搭建了一个简易的共享服务器,分享给大家 一.python代码 import os import time from flask import Flask,render_tem ...

  4. Selenium3 + Python3自动化测试系列二——selenium元素定位

    一.selenium元素定位 Selenium对网页的控制是基于各种前端元素的,在使用过程中,对于元素的定位是基础,只有准去抓取到对应元素 才能进行后续的自动化控制,我在这里将对selenium8种元 ...

  5. Xamarin.Android部署失败

    Xamarin.Android部署失败   项目编译.生成没有错误信息,并且可以找到生成的APK包,但部署失败.提示信息如下: "apksigner.BAT"已退出,代码为1.   ...

  6. bzoj2830: [Shoi2012]随机树

    题目链接 bzoj2830: [Shoi2012]随机树 题解 q1好做 设f[n]为扩展n次后的平均深度 那么\(f[n] = \frac{f[n - 1] * (n - 1) + f[n - 1] ...

  7. Python3字符串-最容易理解的方式

    字符串的创建 字符串创建符号 ' ' " " ''' ''' """ """ 转义符\ >>> str ...

  8. Shiro笔记(一)基本概念

    Shiro笔记(一)基本概念 一.简介 Shiro是一个Java安全框架,可以帮助我们完成:认证.授权.加密.会话管理.与Web集成.缓存等. Authentication:身份认证/登录,验证用户是 ...

  9. 数据结构+算法面试100题~~~摘自CSDN

    数据结构+算法面试100题~~~摘自CSDN,作者July 1.把二元查找树转变成排序的双向链表(树) 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调 ...

  10. Linux和类Unix系统上5个最佳开源备份工具

    一个好的备份最基本的目的就是为了能够从一些错误中恢复: 人为的失误 磁盘阵列或是硬盘故障 文件系统崩溃 数据中心被破坏等等. 所以,我为大家罗列了一些开源的软件备份工具. 当为一个企业选择备份工具的时 ...