Linux平台驱动分析
/*platform总线,驱动,设备模型。 这是一种机制。这样会使得驱动编写方便,便于维护*//*platform总线是一种虚拟的总线。 其实platform总线也是当作设备*//*******************************platform总线******************************************************/
int __init platform_bus_init(void)
{int error;early_platform_cleanup();/*注册一个设备, 名为platform*/error = device_register(&platform_bus);if (error)return error;/* 注册一个总线,总线类型为platform_bus_type */error = bus_register(&platform_bus_type);if (error)device_unregister(&platform_bus);return error;
}/*platform总线的名字*/
struct device platform_bus = {.init_name = "platform",
};/*platform 总线设备类型*/
struct bus_type platform_bus_type = {.name = "platform", //总线名字.dev_attrs = platform_dev_attrs, //设备属性.match = platform_match, //总线匹配函数.uevent = platform_uevent, //热插拔函数.pm = &platform_dev_pm_ops,
};/*******************************platform驱动******************************************************//*平台驱动注册*/
int platform_driver_register(struct platform_driver *drv)
{return driver_register(&drv->driver);
}int driver_register(struct device_driver *drv)
{ret = bus_add_driver(drv);
}
//Add a driver to the bus.
int bus_add_driver(struct device_driver *drv)
{driver_attach(drv);
}int driver_attach(struct device_driver *drv)
{return bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);
}//回调函数
static int __driver_attach(struct device *dev, void *data)
{if (!driver_match_device(drv, dev))return 0;
}//用总线的match函数进行匹配
static inline int driver_match_device(struct device_driver *drv,struct device *dev)
{return drv->bus->match ? drv->bus->match(dev, drv) : 1;
}//通过设备的名称和驱动的名称想匹配
static int platform_match(struct device *dev, struct device_driver *drv)
{/* fall-back to driver name match */return (strcmp(pdev->name, drv->name) == 0);
}/*总结: 把新注册的plarform_drv放入drv链表中, 从platform_dev链表中依次取出每一个dev,用bus的match函数匹配。而bus的match函数是通过匹配设备和驱动的name的。如果相互匹配,然后就调用drv的probe函数。
*//*******************************platform设备******************************************************///平台设备注册
int platform_device_register(struct platform_device *pdev)
{device_initialize(&pdev->dev);return platform_device_add(pdev);
}platform_device_add()->device_add()->bus_probe_device()->device_attach()->__device_attach()->driver_probe_device()->really_probe()static int really_probe(struct device *dev, struct device_driver *drv)
{if (dev->bus->probe) {ret = dev->bus->probe(dev);
}/*总结: 当一个新的platform设备注册到platform总线时, 会把platform设备放入到platform_bus中的dev链表中。 然后与platform_driver中的链表一一比较。 如果匹配成功则会调用platform_bus中probe函数。 其实和piatform驱动注册时的流程是一样的。其实,platform总线, 设备, 驱动只是一种机制。 这种机制可以方便编程。如果要编写基于platform总线设备驱动模型的驱动。 对于程序员来说只需要编写platform设备文件和platform驱动文件。platform_dev文件中需要定义设备的资源等。platform_drv文件中最主要的是编写probe函数。这个函数一般都是和硬件相关的操作在里面。
*/
Linux平台驱动分析相关推荐
- linux串口驱动分析
linux串口驱动分析 硬件资源及描写叙述 s3c2440A 通用异步接收器和发送器(UART)提供了三个独立的异步串行 I/O(SIO)port,每一个port都能够在中断模式或 DMA 模式下操作 ...
- Linux spi驱动分析(四)----SPI设备驱动(W25Q32BV)
一.W25Q32BV芯片简介 W25X是一系列SPI接口Flash芯片的简称,它采用SPI接口和CPU通信,本文使用的W25Q32BV容量为32M,具体特性如下: 1.1.基本特性 该芯片最大支持10 ...
- Linux spi驱动分析----SPI设备驱动(W25Q32BV)
转载地址:http://blog.chinaunix.net/uid-25445243-id-4026974.html 一.W25Q32BV芯片简介 W25X是一系列SPI接口Flash芯片的简称,它 ...
- Linux网卡驱动分析之RTL8139(五)
Linux网卡驱动分析之RTL8139(五) deliver_skb(dev.c) // 该函数就是调用个协议的接收函数处理该skb 包,进入第三层网络层处理 static __inline__ in ...
- linux pinctrl驱动分析
linux pinctrl驱动分析 altas200模块 准备 设备树节点 pinctrl驱动分析 pcs_probe函数 pcs_allocate_pin_table函数 pcs_add_pin函数 ...
- linux 网卡驱动分析,LINUX_网卡驱动分析
LINUX_网卡驱动分析 (36页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.9 积分 Linux DM9000网卡驱动程序完全分析说明仁 本文分 ...
- Linux UART驱动分析及测试
1.Linux TTY驱动程序框架 Linux TTY驱动程序代码位于/drivers/tty下面.TTY的层次接口包括TTY应用层.TTY文件层.TTY线路规程层.TTY驱动层.TTY设备驱动层.T ...
- Linux网络设备驱动分析,以W5300以太网驱动为例
前言 本文是笔者在分析Linux网络驱动时记录的笔记,在这里分享给大家.因为笔者目前也属于学习阶段,因此可能会存在分析不清楚甚至分析错误的地方,欢迎大家评判指正!! 版本说明 Linux内核版本:4. ...
- linux 网卡驱动分析,基于linux下网卡驱动分析及实现技术研究
摘 要 Linux技术是当前计算机技术中最大的一个热点,在我国以及全世界得到了迅猛的发展,被广泛的应用于嵌入式系统.服务器.网络系统.安全等领域.从而使得掌握在 Linux环境下的开发技术,成为 ...
- linux 触摸屏驱动分析
mini2440驱动分析系列之 ---------------------------------------Mini2440触摸屏程序分析 By JeefJiang July,8th,2009 这是 ...
最新文章
- 卡成PPT不开心?GAN也能生成流畅的连续表情了 |ECCV Oral · 代码
- 数论重大突破:120年后,希尔伯特的第12个数学难题借助计算机获得解决
- hihoCoder #1068 : RMQ-ST算法(模板)
- Java中BigDecimal的一个除法异常
- AlgorithmMan,一套免费的算法演示神器(开源动画演示版)
- TiDB-新一代数据库入门介绍
- 我本人一直以来犯的错误,在看了 Think In Java 后才抓了出来
- 刚刚,史上最强Apollo3.5在CES发布!暗藏百度无人驾驶7大黑科技武器
- 笨办法学C 练习43:一个简单的统计引擎
- OpenStack KVM环境搭建
- Mac无法打开“XX”,因为Apple无法检查其是否包含恶意软件。”的解决办法
- CNC精雕机加工需要牢记的22个常识,一起来学习
- ubuntu20.04下opencv4.4编译、给图片加中文标注及tensorflow的问题记录、ubuntu下使用cv::text::OCRTesseract模块字符识别
- bch纠错码 码长8_密码学BCH纠错编码算法
- 架构之占位式插件化框架 --组件通信
- 通过无人机获取影像或三维模型辅助小区域大比例尺地形图的想法和问题
- MySql零基础教学,超细致,从小白到精通
- Linux 多线程编程(三)
- 使用Java+SSM框架+JSP开发简单在线电影推荐网 电影推荐系统 豆瓣电影爬虫 基于用户、物品的协同过滤推荐算法 大数据 机器学习 SimpleMovieRecommendOnline
- 暗影精灵6加装M.2固态硬盘详细教程