【linux】【platform[1]】简述device和driver几种匹配方式

news2025/8/1 1:20:25

文章目录

  • 0.env
  • 10. 简述
  • 20. 测试源码
    • 1. driver
    • 2. device
      • 2.1 方式一:DTS
      • 2.2 方式二:ACPI
      • 2.3 方式三:id table
      • 2.4 方式四:NAME
    • 3. 测试log


0.env

ARM 32bit
linux4.4.60

10. 简述

  1. 主要讲述了几种device和driver匹配的方式以及demo框架
  2. 文章不涉及数据处理部分,resource部分后续再补充
  1. 匹配DTS (目前主流方式)
  2. 匹配ACPI
  3. 匹配id table
    3.1 . driver提供id table的数据,device提供一个id变量,遍历drvier中的id table来匹配
    3.2. device中platform_device.name 和 id_entry,name 要一致
  4. 匹配name
    4.1. 四种优先级中最低的一层,也是默认的方式,尽量在device中都放进去。

20. 测试源码

1. driver

  1. id table这个成员不为空时,
    platfrom match就只能匹配前三种方式,默认的name就没法匹配了
  2. 可以通过打开如下四个宏来查看各类匹配方式的区别

#define SUPPORT_DTS
#define SUPPORT_ACPI
#define SUPPORT_ID_TABLE
#define SUPPORT_DEV_NAME

#include <linux/module.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <linux/slab.h>
#include <linux/uaccess.h>
#include <linux/device.h>
#include <linux/gpio.h>
#include <linux/gpio/consumer.h>
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/spinlock.h>
#include <linux/platform_device.h>

#define SUPPORT_DTS
#define SUPPORT_ACPI
#define SUPPORT_ID_TABLE
#define SUPPORT_DEV_NAME

#ifndef SUPPORT_DEV_NAME
#define SUPPORT_DEV_NAME
#endif

/* Add platform driver */
static int sc_liam_dri_probe(struct platform_device *pdev)
{
    pr_info("----- driver probe  -----\n");
    pr_info("dev id = %d\n", pdev->id);
    return 0;
}
static int sc_liam_dri_remove(struct platform_device *pdev)
{
    pr_info("----- driver remove -----\n");
    return 0;
}

#ifdef SUPPORT_DTS
static const struct of_device_id sc_liam_of_match[] = {
    {   .compatible = "xxxx,sc_liam_dev"    },
    {   }
};
#endif
#ifdef SUPPORT_ACPI
#endif
#ifdef SUPPORT_ID_TABLE
static const struct platform_device_id sc_liam_id[] = {
    {   .name = "sc_liam_id_1", 0},
    {   .name = "sc_liam_id_2", 0},
    {   .name = "sc_liam_id_3", 0},
    {   }
};
#endif

static struct platform_driver sc_liam_driver = {
    .probe = sc_liam_dri_probe,
    .remove = sc_liam_dri_remove,
    .driver     = {
        .name = "sc_liam",
#ifdef SUPPORT_DTS
        .of_match_table = sc_liam_of_match,
#endif
#ifdef SUPPORT_ACPI
#endif
    },
#ifdef SUPPORT_ID_TABLE
    .id_table   = sc_liam_id,
#endif
};

#if 0
module_platform_driver(sc_liam_driver);
#else
static int __init sc_liam_dri_init(void)
{
    int err;
    pr_info("--- driver init ---\n");
    err = platform_driver_register(&sc_liam_driver);
    if (err){
        pr_info("--- driver init : fail ---\n");
    }
    return err;
}

static void __exit sc_liam_dri_exit(void)
{
    pr_info("--- driver exit ---\n");
    platform_driver_unregister(&sc_liam_driver);
}

module_init(sc_liam_dri_init);
module_exit(sc_liam_dri_exit);
#endif

/* 5. module info */
MODULE_LICENSE("GPL v2"); 
MODULE_AUTHOR("liam"); 

2. device

2.1 方式一:DTS

  1. DTS文件中:

1.1 在根节点(或者其他地方)添加一个node,
1.2 最基础的需要添加compatible 来匹配driver,
1.3 关于status:只有显式定义status状态为disabled才不使能这个设备,其他情况(包括不定义)都默认使能该设备。
在这里插入图片描述

2.2 方式二:ACPI

2.3 方式三:id table

  1. #define SUPPORT_ID_TABLE,调试dev_1
  2. 定义platform_device_id
  3. name相同
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <linux/slab.h>
#include <linux/uaccess.h>
#include <linux/device.h>
#include <linux/gpio.h>
#include <linux/gpio/consumer.h>
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/spinlock.h>
#include <linux/platform_device.h>

#define SUPPORT_ID_TABLE

static void sc_liam_dev_release(struct device * dev)
{
    return ;
}

#ifdef SUPPORT_ID_TABLE
static const struct platform_device_id sc_liam_id = {
    .name = "sc_liam_id_1" , // same with platform_device.name 
};
#endif

static struct platform_device sc_liam_dev_1 = {
    .id = 1,
#ifdef SUPPORT_ID_TABLE
    .id_entry = &sc_liam_id,
    .name = "sc_liam_id_1",
#else
    .name = "sc_liam",
#endif
    .dev = {
        /* FIX : add release() if xxx_register() */
        .release = sc_liam_dev_release,
    }
};

static struct platform_device sc_liam_dev_9 = {
    .id = 9,
    .name = "sc_liam",
    .dev = {
        /* FIX : add release() if xxx_register() */
        .release = sc_liam_dev_release,
    }
};

/* mod_init */
static int __init sc_liam_dev_init(void)
{
    int err;
	printk("--- device init ---\n");
    err = platform_device_register(&sc_liam_dev_1);
    if (err){
        printk("--- device init : fail ---\n");
#ifdef SUPPORT_ID_TABLE
    }else{
        printk("device id_table.name = %s\n", sc_liam_dev_1.id_entry->name);
#endif
    }
    err = platform_device_register(&sc_liam_dev_9);
    if (err){
        printk("--- device init : fail ---\n");
    }
	return 0;
}

/* mod_exit */
static void __exit sc_liam_dev_exit(void)
{
    platform_device_unregister(&sc_liam_dev_1);
    platform_device_unregister(&sc_liam_dev_9);
	printk("--- device exit ---\n");
}

module_init(sc_liam_dev_init);
module_exit(sc_liam_dev_exit);

/* module info */
MODULE_LICENSE("GPL v2"); 
MODULE_AUTHOR("liam"); 

2.4 方式四:NAME

  1. name:
    上述源码中,打开/#define SUPPORT_ID_TABLE,调试dev_9

3. 测试log

使用的是id table来匹配的log

root@OpenWrt:/# 
root@OpenWrt:/# insmod sc_liam_driver.ko 
[ 3118.526703] --- driver init ---
root@OpenWrt:/# 
root@OpenWrt:/# insmod sc_liam_device.ko 
[ 3123.622959] --- device init ---
[ 3123.623265] ----- driver probe  -----
[ 3123.624902] dev id = 1
[ 3123.628770] device id_table.name = sc_liam_id_1
root@OpenWrt:/# 
root@OpenWrt:/# rmmod sc_liam_driver.ko 
module is not loaded
root@OpenWrt:/# rmmod sc_liam_dri
[ 3134.948927] --- driver exit ---
[ 3134.948976] ----- driver remove -----
root@OpenWrt:/# 
root@OpenWrt:/# rmmod sc_liam_dev
[ 3256.197876] --- device exit ---
root@OpenWrt:/# 

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

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

相关文章

82055-94-5|N3-PEG-N3|Azide-PEG-Azide|叠氮PEG叠氮可修饰蛋白质

可用来修饰蛋白质、多肽以及其他材料的叠氮-PEG-叠氮&#xff0c;其英文名为N3-PEG-N3或Azide-PEG-Azide&#xff0c;它所属分类为Azide PEG。 该peg试剂的分子量均可定制&#xff0c;有&#xff1a;叠氮-PEG-叠氮 2000、叠氮peg叠氮 1000、叠氮-聚乙二醇-叠氮 5000、N3-PEG-N…

天宇优配|国产海上风电装备大突破,行业复合增速将超3

在全球加紧应对气候变化以及能源供应严重的布景下&#xff0c;海优势电工业面对历史性开展机会。 全球单机容量最劲风电机组下线 据央视新闻&#xff0c;近日&#xff0c;我国自主研制的16兆瓦海优势电机组在福建三峡海优势电世界工业园下线。单机容量16兆瓦海优势电机组&…

MCE 抗乳腺癌化合物库上线丨靶向乳腺癌知多少?

乳腺癌是全世界女性最常见的恶性肿瘤&#xff0c;世界卫生组织 (WHO) 数据显示&#xff0c;全球每年大约有 210 万女性受乳腺癌影响&#xff0c;乳腺癌死亡率在女性肿瘤中居于首位。 认识乳腺癌 ■ 什么是乳腺癌&#xff1f; 乳腺癌 (Breast cancer) 是一种具有多种亚型的异质…

PG::Ha-natraj

nmap -Pn -p- -T4 --min-rate1000 192.168.134.80 nmap -Pn -p 22,80 -sCV 192.168.134.80 查看80端口的页面 未发现可利用的信息&#xff0c;对路径进行爆破 在/console目录下发现file.php 测试发现有本地文件包含 未发现别的利用方式&#xff0c;结合之前做过的靶机&am…

JAVA多线程2_Lock

文章目录一、ReentrantLock类1.使用ReentrantLock2.使用ReentrantLock实现多对多3.公平锁与非公平锁4.ReentrantLock类其他方法的使用二、ReentrantReadWriteLock类1.读读共享2.写写互斥3.读写互斥4.写读互斥总结一、ReentrantLock类 1.使用ReentrantLock 创建reentrantlock.s…

【计算机毕业设计】36.网易购商城购物平台源码

一、系统截图&#xff08;需要演示视频可以私聊 摘 要 本毕业设计的内容是设计并且实现一个基于JSP技术的网易购购物平台。它是在Windows下&#xff0c;以MYSQL为数据库开发平台&#xff0c;Tomcat网络信息服务作为应用服务器。网易购购物平台的功能已基本实现&#xff0c;主…

sqli-labs/Less-62

欢迎界面提示我们一共由130次机会 而且还是以id作为注入点 每次重置都会随机分配表名、字段名、表格数据 首先判断注入类型 输入id1 and 12 回显如下 说明不属于数字型 接着输入1 回显如下 没有回显 说明注入点带有单引号 佐证一下吧 输入1-- 回显如下 说明不是纯粹的单引号…

【Redis技术探索】「高可用架构模式」哨兵(sentinel)模式实现主从故障互切换模式详解

哨兵&#xff08;sentinel&#xff09;模式实现主从故障互切换模式详解Redis的多种模式Redis单机模式Redis单机模式的优点Redis单机模式的缺点Redis主从复制旧版本配置新版本配置查看主节点信息主从模式的优点主从复制的弊端Redis哨兵模式分析哨兵结构组成哨兵模式的主从切换Re…

ROS-TCP-Connector and ROS-TCP-Endpoint

Unity官方提供了和ROS交互的接口&#xff1a;ROS-TCP-Connector and ROS-TCP-Endpoint。有了这两个Unity就能够更好的和真实机器人做交互。两个接口的实现基于ROS#、ros_bridge&#xff0c;所以基本上以后用这个就可以了。 源码如下&#xff1a;   ROS-TCP-Endpoint&#xff…

学生党蓝牙耳机怎么选?四款性价比高的蓝牙耳机推荐

随着时代的发展&#xff0c;人们越来越追求事物的使用体验感。便捷的蓝牙耳机成为更多人的选择&#xff0c;对于学生党来说&#xff0c;蓝牙耳机的重要性不言而喻。接下来&#xff0c;我来推荐几款适合学生党的蓝牙耳机。 1、南卡小音舱蓝牙耳机 综合得分&#xff1a;96分(满…

骨传导耳机伤耳朵吗?带你一分钟了解骨传导耳机

最近听到最多的一句话就是&#xff1a;骨传导耳机伤耳朵吗&#xff1f;骨传导耳机不会伤害耳朵&#xff0c;反而更能保护耳朵。骨传导耳机是不入耳的&#xff0c;既不伤耳&#xff0c;还能保护耳部。骨传导耳机我用过很多款&#xff0c;知道有哪些骨传导耳机是比较好的&#xf…

产品公开后就不能再申请专利了吗?

问题一&#xff1a;申请专利会导致产品技术泄密吗&#xff1f; 很多人担心申请专利后会导致自己的专利技术公之于众&#xff0c;会让同行模仿生产。其实&#xff0c;我们不妨反向思考一下&#xff0c;假如我们没有申请专利&#xff0c;我们销售生产出去的产品就不容易被模仿吗…

华为机试 - TLV解析Ⅰ

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 TLV编码是按[Tag Length Value]格式进行编码的&#xff0c;一段码流中的信元用Tag标识&#xff0c;Tag在码流中唯一不重复&#xff0c;Length表示信元Value的长度&#xff0c;Value表示信元的值。 码…

【Canvas】JavaScript用Canvas制作美丽的对称图案

生活中有看到一个对称图案&#xff0c;看着很美&#xff0c;于是想到&#xff0c;试试用Canvas试着画对称图形来&#xff0c;想到就做&#xff0c;自己还真捣鼓出来了&#xff0c;自己弄了好多的对称图这里就不晒出来了&#xff0c;接下来讲讲怎么做&#xff0c;有兴趣的同学可…

java 自定义生成验证码

目录说明效果展示Base64编码的文件类型枚举类验证码默认常量值验证码生成工具类使用说明 项目登录或者其他重要的操作中都要生成验证码&#xff0c;其重要性在此不多说。 主要是介绍自己封装的验证码生成工具类的使用。 建议安装lombok插件,不使用此插件则需要手动生成get、s…

cron表达式,结构、字段说明、特殊字符说明、常用表达式

1.cron表达式的结构 Cron表达式是一个字符串&#xff0c;结构非常简单。Cron表达式从左到右分为6或7个字段&#xff0c;每个字段代表一个含义&#xff0c;用空格隔开。如下图所示&#xff1a; 2.cron表达式中各个字段的说明和规则 Cron一共有7位&#xff0c;最后一位是年份&…

浅析资源调度框架YARN

第一章 资源调度框架YARN理论 1.1 YARN概述 分布式操作系统 hadoop 1.xMapReduce主从架构 主节点JobTracker 从节点TaskTrackerslot hadoop 2.xMapReduce编程API YARN主从架构 主节点ResourceManager 从节点NodeManagerContainer hadoop 3.xCommonHDFS 纠删码 …

关于升级高德地图导航9.5.0的问题 ‘com.amap.api:navi-3dmap:9.5.0_3dmap9.5.0‘

最近打开项目&#xff0c;发现高德有新版本更新&#xff0c;果断更新。哈哈哈哈。然而结果好像并没有这么简单。要是世界上什么事情这么简单就好了。年轻人。还是太年轻了啊。 然后更新完最新的依赖 /*高德地图远程依赖*/implementation com.amap.api:navi-3dmap:9.5.0_3dmap9…

I/O 设备(输入/输出设备)

文章目录I/O 设备输入设备输出设备1&#xff0c;显示器2&#xff0c;打印机3&#xff0c;投影仪I/O 设备 输入设备 借助计算机的输入设备&#xff0c;用户能够轻松地将数据或者指令传递给计算机。同时&#xff0c;计算机中的 CPU 会接收用户输入的指令或数据&#xff0c;并对…

Tesla M40 下Ubuntu anaconda pycharm pytorch安装

显卡&#xff1a;Tesla M40 24GB (2张&#xff09; 显卡驱动版本(推荐)&#xff1a;470.57.02 cuda版本&#xff1a;11.4 安装前需要&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;禁用nouveau驱动&#xff01;&#xff01;&#xff01;&#xff01;&#x…