首页 > 系统相关 >嵌入式linux总线设备驱动模型分析

嵌入式linux总线设备驱动模型分析

时间:2023-10-30 11:06:41浏览次数:34  
标签:总线 Linux driver 嵌入式 platform linux device 驱动


嵌入式linux系统按照,分层,抽象的思想,按照这样的思想来设计我们的程序可以更容易写出耦合性低、独立性强、可重用性强的代码。

Linux内核中更是存在着更多的分离、分层思想的代码,platform平台设备驱动就是用了这样的思想。本篇笔记我们一起来学习一下platform驱动框架。

Linux引入platform的原因

对于 Linux 这样一个成熟、庞大、 复杂的操作系统,代码的重用性非常重要,否则的话就会在 Linux 内核中存在大量无意义的重复代码。

为了能提高驱动代码的重用性,因此引入了 platform。下面以一个例子来说明传统的设动转变至Linux 总线、驱动和设备模式 (来源:《正点原子Linux驱动开发指南》):

嵌入式linux总线设备驱动模型分析_服务器

嵌入式linux总线设备驱动模型分析_重用性_02

嵌入式linux总线设备驱动模型分析_运维_03

嵌入式linux总线设备驱动模型分析_设备树_04

最后一张图就是Linux下的总线(bus)、驱动(driver)和设备(device)模型。但是在 SOC 中有些外设是没有总线这个概念的,但是又要使用总线、驱动和设备模型该怎么办呢?

为了解决此问题, Linux 提出了 platform_bus  这个虚拟总线,相应的就有 platform_driver 和 platform_device。

嵌入式linux总线设备驱动模型分析_重用性_05

总线设备驱动模型

嵌入式linux总线设备驱动模型分析_服务器_06

1、platform_bus

platform总线实例(在文件drivers/base/platform.c 中):

嵌入式linux总线设备驱动模型分析_运维_07

这里我们重点关注匹配函数platform_match:

嵌入式linux总线设备驱动模型分析_重用性_08

我们暂且先知道其有几种匹配方法。

2、platform_driver

platform驱动结构体(在文件include/linux/platform_device.h 中):

嵌入式linux总线设备驱动模型分析_linux_09

platform_driver 结构体中的driver成员所属的结构体类型为(在文件include/linux/device.h 中):

嵌入式linux总线设备驱动模型分析_设备树_10

这里体现出了C语言的面向对象的思想,其中driver相当于基类,platform_driver继承了这个基类。

struct device_driver 结构体中(在文件include/linux/device.h 中)的name成员在上面提到的匹配函数platform_match里用到,即:

嵌入式linux总线设备驱动模型分析_设备树_11

platform_driver 结构体中的id_table成员所属的结构体类型为(在文件include/linux/mod_devicetable.h 中):

嵌入式linux总线设备驱动模型分析_服务器_12

注册/卸载函数:

platform 驱动注册函数:

int platform_driver_register(struct platform_driver *driver);

platform 驱动卸载函数:

void platform_driver_unregister(struct platform_driver *drv);

3、platform_device

描述设备有两种方法:一种是用用设备树来指定,另一种是直接用platform_device结构体来指定。

设备树的内容不在我们本篇笔记的学习范围内。下面先来看一下platform设备结构体(在文件include/linux/platform_device.h 中):

嵌入式linux总线设备驱动模型分析_重用性_13

platform_device结构体中的resource成员所属的结构体类型为(在文件include/linux/ioport.h  中):

嵌入式linux总线设备驱动模型分析_服务器_14

注册、卸载函数:

platform 驱动注册函数:

int platform_device_register(struct platform_device *pdev);

platform 驱动卸载函数:

void platform_device_unregister(struct platform_device *pdev);

driver与device如何匹配

platform_driver与platform_device的匹配围绕着上面说的platform_match函数。

上面有说描述设备有两种方法,这里暂且只分享直接用platform_device结构体来指定设备时platform_driver与platform_device的匹配过程。(参考来源:百问网)

嵌入式linux总线设备驱动模型分析_运维_15

嵌入式linux总线设备驱动模型分析_设备树_16

嵌入式linux总线设备驱动模型分析_设备树_17

嵌入式linux总线设备驱动模型分析_设备树_18

以上就是本次的笔记分享~期待你的、转发~

标签:总线,Linux,driver,嵌入式,platform,linux,device,驱动
From: https://blog.51cto.com/u_11947739/8086434

相关文章

  • 嵌入式linux系统中设备树基础知识
    笔记整理自百问网+正点原子前言之前分享的笔记:【Linux笔记】总线设备驱动模型中在platform_device部分有简单说明描述设备有两种方法:一种是使用platform_device结构体来指定;另一种是使用设备树来描述。本篇笔记我们就来简单地学习一下设备树的一些知识。什么是设备树设备树简单理解......
  • Linux 虚拟内存参数配置
    一、问题出发点Jun110:30:21audit1kernel:swapper:pageallocationfailure.order:1,mode:0x20Jun110:30:21audit1kernel:Pid:0,comm:swapperTainted:G---------------T2.6.32-431.20.3.el6.x86_64#1Jun110:30:21audit1kernel:CallTrace:Jun11......
  • 嵌入式linux系统设备树实例分析
    前言我们可以从LED程序中榨取很多知识:基本的驱动框架、驱动的简单分层、驱动的分层+分离思想、总线设备驱动模型、设备树等。这大多都是结合韦老师的教程学的。这篇笔记结合第6个demo(基于设备树)来学习、分析:框图下面是LED程序的几个层次结构图:注意:层与层之间的箭头指向是相对的,从哪......
  • 【Python】在linux环境下, Django 3.0+版本遇到的一些问题
    1.Django3.2版本升级后的一些报错,导致项目运行失败1.1site-packages/rest_framework/serializers.py fromdjango.db.models.fieldsimportFieldDoesNotExistImportError:cannotimportname'FieldDoesNotExist'解决办法:改变FieldDoesNotExist的导入方式fromdjango......
  • 嵌入式硬件中常见的100种硬件选型方式
    1请列举您知道的电阻、电容、电感品牌(最好包括国内、国外品牌)。电阻:美国:AVX、VISHAY威世日本:KOA兴亚、Kyocera京瓷、muRata村田、Panasonic松下、ROHM罗姆、susumu、TDK台湾:LIZ丽智、PHYCOM飞元、RALEC旺诠、ROYALOHM厚生、SUPEROHM美隆、TA-I大毅、TMTEC泰铭、TOK......
  • 嵌入式硬件库的基本操作方式与分析
    本次要介绍的开源软件是c-periphery:https://github.com/vsergeev/c-periphery一个用C语言编写的硬件外设访问库。我们可以用它来读写Serial、SPI、I2C等,非常适合在嵌入式产品上使用。我们可以基于它优秀的代码框架,不断地扩展出更多的功能模块,最终形成自己产品适用的Linux硬......
  • 实战攻防演练-Linux写入ssh密钥,利用密钥登录
    前言密钥形式登录的原理是利用密钥生成器制作一对密钥,一只公钥和一只私钥。将公钥添加到服务器的某个账户上,然后在客户端利用私钥即可完成认证并登录。这样一来,没有私钥,任何人都无法通过SSH暴力破解你的密码来远程登录到系统。此外,如果将公钥复制到其他账户甚至主机,利用私钥也......
  • linux基本文件命令复习笔记
    1,放大缩小终端窗口字体  放大 ctrlshift+=   缩小  ctrl-2,6个常见终端命令 (1)ls  查看当前文件夹下的内容 (2)pwd 查看当前所在文件夹  (3)cd目录名 切换文件夹 (4)touch文件名 如果文件不存在,新建文件。和mkdir不同的是,mkdir创......
  • python进阶14大模块200页知识体系md笔记,第3篇:linux命令进阶
    本完整笔记从14大模块展示了python高级用的应用。分别有Linux命令,多任务编程、网络编程、Http协议和静态Web编程、html+css、JavaScript、jQuery、MySql数据库的各种用法、python的闭包和装饰器、mini-web框架、正则表达式等相关文章的详细讲述。完整版笔记直接地址:请移步这里......
  • 第九周 Linux课后技术总结
    5.1初始进程什么是进程?进程是已启动的可执行程序的运行实例。进程有以下组成部分。已分配内存的地址空间。安全属性,包括所有权凭据和特权。程序代码的一个或多个的执行线程。进程状态。每个进程都有唯一的进程标识PID,一个PID只能标识一个进程。(使用pidof命令查看sshd......