【Linux高级驱动】linux设备驱动模型之平台设备驱动机制
【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)虚拟总线(只有一条:平台总线)
【对象思想】
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);
}
【设备总线驱动模型里面的操作函数】
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:平台设备驱动机制】
借助于设备总线驱动模型,虚拟出一条总线,用来实现设备资源与设备驱动的匹配
===============================================
平台设备驱动机制采用了:分离的思想,对象的思想
分离的思想:设备资源与设备驱动分离开
【对象思想】
}
【总线注册】
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);
【平台设备驱动模型的关键接口函数】
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设备驱动模型之平台设备驱动机制的更多相关文章
- Linux中总线设备驱动模型及平台设备驱动实例
本文将简要地介绍Linux总线设备驱动模型及其实现方式,并不会过多地涉及其在内核中的具体实现,最后,本文将会以平台总线为例介绍设备和驱动程序的实现过程. 目录: 一.总线设备驱动模型总体介绍及其实现方 ...
- 【总结】设备树对platform平台设备驱动带来的变化(史上最强分析)【转】
本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/74375086 版权声明:本文为博主原创文章,转载请注明http://blog.c ...
- linux设备驱动那点事儿之平台设备理论篇
一:Platform总线 1.1概述 一个现实的linux设备驱动通常需要挂接在一种总线上,对于本身依附于PCI,USB,IIC,SPI等的设备而言,这自然不是问题,但是在嵌入式系统里面,SOC系统中 ...
- 字符设备驱动、平台设备驱动、设备驱动模型、sysfs的比较和关联
转载自:http://www.kancloud.cn/yueqian_scut/emlinux/106829 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sy ...
- [kernel]字符设备驱动、平台设备驱动、设备驱动模型、sysfs几者之间的比较和关联
转自:http://www.2cto.com/kf/201510/444943.html Linux驱动开发经验总结,绝对干货! 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动 ...
- LCD驱动分析(二)帧缓冲设备作为平台设备
参考:S3C2440 LCD驱动(FrameBuffer)实例开发<一> S3C2440 LCD驱动(FrameBuffer)实例开发<二> 1.平台设备注册 1.1在li ...
- 高通 android平台LCD驱动分析
目前手机芯片厂家提供的源码里包含整个LCD驱动框架,一般厂家会定义一个xxx_fb.c的源文件,注册一个平台设备和平台驱动,在驱动的probe函数中来调用register_framebuffer(), ...
- 46.Linux-创建rc红外遥控平台设备,实现重复功能(2)
上章链接:46.Linux-分析rc红外遥控平台驱动框架,修改内核的NEC解码函数BUG(1) 在上章分析了红外platform_driver后,已经修改bug后,接下来我们自己创建一个红外platf ...
- Linux驱动之平台设备驱动模型简析(驱动分离分层概念的建立)
Linux设备模型的目的:为内核建立一个统一的设备模型,从而有一个对系统结构的一般性抽象描述.换句话说,Linux设备模型提取了设备操作的共同属性,进行抽象,并将这部分共同的属性在内核中实现,而为需要 ...
随机推荐
- C# 反编译防范
C# 编写的代码通过VS编译器生成 dll 或 exe ,很容易被一些反编译工具查看到源码或对源码进行修改.为防止代码被反编译或被篡改,我们可以进行一定的防范措施.但不能杜绝,因为DotNet编写代码 ...
- BZOJ.1443.[JSOI2009]游戏Game(二分图博弈 匈牙利)
题目链接 \(Description\) 一个\(N*M\)的有障碍的棋盘,先手放置棋子后,从后手开始轮流移动棋子,不能走重复的位置,不能移动的输.求在哪些位置放棋子是先手必胜的. \(Solutio ...
- wamp memcache 的安装与扩展(Windows 64)
一.windows操作系统下的memcache安装 1.此处提供32位的安装包链接,如果需要64位的应该可惜查得到.将下载的压缩包解压到自己确定的安装目录,我的参考如下: 2.为了安装顺利,所以需要以 ...
- bootStrap中的ul导航
<!doctype html><html > <head> <meta charset="utf-8"> <link rel= ...
- 修复bug及修复过程
1.本地存储数据显示不出问题 问题细节: 本地使用如下语句存储成绩,"ScoreDisplay"为键,值为this.score.toString(),但是在cocos creato ...
- tomcat配置问题
1.首先安装JDK和Tomcat(我的tomcat是解压缩版的) 2.配置JDK环境变量 3.配置tomcat环境变量 4.在MyEcliipse中配置JDK(可以使用MyEclipse自带的tomc ...
- [Beego模型] 一、ORM 使用方法
[Beego模型] 一.ORM 使用方法 [Beego模型] 二.CRUD 操作 [Beego模型] 三.高级查询 [Beego模型] 四.使用SQL语句进行查询 [Beego模型] 五.构造查询 [ ...
- Reading privileged memory with a side-channel
https://googleprojectzero.blogspot.jp/2018/01/reading-privileged-memory-with-side.html https://devel ...
- [Sqoop]将Hive数据表导出到Mysql
业务背景 mysql表YHD_CATEG_PRIOR的结构例如以下: -- Table "YHD_CATEG_PRIOR" DDL CREATE TABLE `YHD_CATEG_ ...
- Android的Databinding-自定义生成类名字
1. 在xml中,添加class的属性并设置为自定义名字<data class="com.example.CustomBinding"></data>2. ...