华清远见(上海中心)22071

news2024/10/6 12:33:54

platform总线,三种匹配方式

一、设备名字匹配

设备文件代码>>>

#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>

//对设备信息进行填充
struct resource res[]={
    [0]={
        .start=0x12345678,
        .end=0x12345678+40,
        .flags=IORESOURCE_MEM,
    },
    [1]={
        .start=71,
        .end=71,
        .flags=IORESOURCE_IRQ,
    },
};
//定义一个release函数
void pdev_release(struct device *dev)
{
    printk("%s:%d\n",__func__,__LINE__);
}
//给对象赋值
struct platform_device pdev={
    .name="aaaaa",
    .id=PLATFORM_DEVID_AUTO,
    .dev={
        .release=pdev_release,
    },
    .resource=res,
    .num_resources=ARRAY_SIZE(res),
};
static int __init demo_init(void)
{
    
    return platform_device_register(&pdev);
}
static void __exit demo_exit(void)
{
    platform_device_unregister(&pdev);   
}
module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");

驱动文件代码>>>

#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>

int pdir_probe(struct platform_device *pdev)
{
    printk("%s:%d\n",__func__,__LINE__);
    return 0;
}
int pdir_remove(struct platform_device *pdev)
{
    printk("%s:%d\n",__func__,__LINE__);
    return 0;
}
struct platform_driver pdir={
    .probe=pdir_probe,
    .remove=pdir_remove,
    .driver={
        .name="aaaaa",//通过设备名字匹配
    },
};
static int __init demo_init(void)
{
    platform_driver_register(&pdir);
    return 0;
}
static void __exit demo_exit(void)
{
    platform_driver_unregister(&pdir);
}
module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");

实验现象>>>

匹配成功

 

二、通过id_table的方式匹配

设备文件代码>>>

        在给对象赋值时,将name改为名字列表中的名字即可

#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>

//对设备信息进行填充
struct resource res[]={
    [0]={
        .start=0x12345678,
        .end=0x12345678+40,
        .flags=IORESOURCE_MEM,
    },
    [1]={
        .start=71,
        .end=71,
        .flags=IORESOURCE_IRQ,
    },
};
//定义一个release函数
void pdev_release(struct device *dev)
{
    printk("%s:%d\n",__func__,__LINE__);
}
//给对象赋值
struct platform_device pdev={
    .name="hello1",     //选择名字列表中的名字
    .id=PLATFORM_DEVID_AUTO,
    .dev={
        .release=pdev_release,
    },
    .resource=res,
    .num_resources=ARRAY_SIZE(res),
};
static int __init demo_init(void)
{
    
    return platform_device_register(&pdev);
}
static void __exit demo_exit(void)
{
    platform_device_unregister(&pdev);   
}
module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");

驱动文件代码>>>

        构建名字表

#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/mod_devicetable.h>
#include <linux/module.h>
struct resource *res;
int irqno;

int pdir_probe(struct platform_device *pdev)
{
    //获取MEM类型的资源
    res = platform_get_resource(pdev,IORESOURCE_MEM,0);
    if(res==NULL)
    {
        printk("get MEM resource error\n");
        return -ENODATA;
    }
    irqno = platform_get_irq(pdev,0);
    if(irqno<0)
    {
        printk("get irq resource error\n");
        return -ENODATA;
    }
    printk("addr:%#llx,irqno:%d\n",res->start,irqno);
    return 0;
}
int pdir_remove(struct platform_device *pdev)
{
    printk("%s:%d\n",__func__,__LINE__);
    return 0;
}
//构建名字表
struct platform_device_id idtable[]={
    {"hello1",0},
    {"hello2",1},
    {"hello3",2},
    {},
};
//热插拔宏
MODULE_DEVICE_TABLE(platform,idtable);
//对象初始化
struct platform_driver pdir={
    .probe=pdir_probe,
    .remove=pdir_remove,
    .driver={
        .name="aaaaa",
    },
    .id_table=idtable,
};
//使用一键注册宏
module_platform_driver(pdir);
MODULE_LICENSE("GPL");

实验现象>>>

         匹配成功,打印设备信息结构体的首地址

三、通过设备树匹配

添加设备树节点>>>

 驱动程序>>>

#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/mod_devicetable.h>
#include <linux/module.h>
struct resource *res;
int irqno;

int pdir_probe(struct platform_device *pdev)
{
    //获取MEM类型的资源
    res = platform_get_resource(pdev,IORESOURCE_MEM,0);
    if(res==NULL)
    {
        printk("get MEM resource error\n");
        return -ENODATA;
    }
    irqno = platform_get_irq(pdev,0);
    if(irqno<0)
    {
        printk("get irq resource error\n");
        return -ENODATA;
    }
    printk("addr:%#x,irqno:%d\n",res->start,irqno);
    return 0;
}
int pdir_remove(struct platform_device *pdev)
{
    printk("%s:%d\n",__func__,__LINE__);
    return 0;
}

//构建compatible表
struct of_device_id oftable[]={
    {.compatible="hqyj,platform",},
    {}
};
//热插拔宏
MODULE_DEVICE_TABLE(of,oftable);
//对象初始化
struct platform_driver pdir={
    .probe=pdir_probe,
    .remove=pdir_remove,
    .driver={
        .name="aaaaa",
        .of_match_table=oftable,
    },
};
module_platform_driver(pdir);
MODULE_LICENSE("GPL");

实验现象>>>

 

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

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

相关文章

服务网关之Spring Cloud Gateway

目录一、网关简介二、Gateway简介三、Gateway快速入门1、基础版2、增强版3、简写版四、Gateway核心架构1、基本概念2、执行流程五、断言1、内置路由断言工厂2、自定义路由断言工厂一、网关简介 大家都知道在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客…

Linux Docker基础学习

Linux Docker基础学习Linux指令Linux安装Docker检查是否安装成功容器容器的创建删除运行停止容器端口转发查看容器提供的端口号Docker交互模式镜像镜像的拉取删除镜像的导入导出Dockerfile制作镜像上传镜像到DockerhubDockerfile文件详解FROMRUN指令镜像中添加文件&#xff08;…

运维监控系统PIGOSS BSM 对“实时数据复制”系统的监控管理

前言 随着应用信息化程度的不断深入&#xff0c;长期积累的业务数据变得价值连城。业务数据备份安全是业务连续性的重要保障&#xff1b; 而同时&#xff0c;业务数据也指导成为企业进行业务分析最有价值的科学依据。 所以&#xff0c;人们纷纷为业务系统建设容灾备份系统&…

【性能|优化】TB级flink任务报错分析:Could not compute the container Resource

文章目录一. 问题引入1. 场景描述2. 日志简析二. 初级问题分析与解决1. 问题分析1.1. yarn的调度器设置1.2. 程序设置2. 问题解决三. &#xff08;性能&#xff09;新的问题1. 问题描述2. 理想化的最优方案3. "PlanB"的解决方案四. 反思与迭代一. 问题引入 1. 场景描…

2022年工业与电力物联网技术现状分析

主要内容22年工业与电力物联网技术现状分析10大科技趋势达摩院 2022 十大科技趋势腾讯 融合2022年十大数字科技前沿应用趋势艾瑞咨询 2022年中国科技与IT十大趋势物联网技术物联网架构体系结构简介应用层2022年整体情况物联网平台及相关能力平台2022年整体情况物联网网络2022年…

Python学习:json对象与string相互转换教程

首先要明确&#xff0c;python里有json这个库&#xff0c;但并没有json这个类&#xff0c;所以所谓的json对象本质上就是一个dict&#xff1b;而json这个库&#xff0c;用于实现dict到string、string到dict的互转。 更具体一点&#xff0c;json对象&#xff08;dict&#xff0…

鼠标监视 | 拖拽方块 | Vue

title: 拖拽功能 tags: Vue categories: JavaScript abbrlink: 18a433ce date: 2022-11-26 21:14:19 效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" co…

使用 KubeSphere 部署高可用 RocketMQ 集群

作者&#xff1a;老Z&#xff0c;云原生爱好者&#xff0c;目前专注于云原生运维&#xff0c;KubeSphere Ambassador。 Spring Cloud Alibaba 全家桶之 RocketMQ 是一款典型的分布式架构下的消息中间件产品&#xff0c;使用异步通信方式和发布订阅的消息传输模型。 很多基于 S…

红色荧光染料AF 594活性酯,Alexa Fluor 594 NHS ester,CAS:295348-87-7

一&#xff1a;产品描述 1、名称 英文&#xff1a; AF 594 NHS Ester AF 594 Succinimidyl Ester Alexa Fluor 594 NHS Ester 中文&#xff1a;AF 594活性酯 2、CAS编号&#xff1a;295348-87-7 3、分子式&#xff1a;C39H37N3O13S2 4、分子量&#xff1a;819.85 5、…

【人工智能 机器学习 深度学习】基础选择题1~30题 练习

目录 一、1~10题1.1 题目1.2 答案二、11~20题2.1 题目2.2 答案三、21~30题3.1 题目3.2 答案写在前面:适用于对 人工智能&机器学习&深度学习 进行复习的同学,同时,也可以通过基础题目的练习,加深理解。 一、1~10题 均是先给出10道题目,而后给出 10道题目的答案。 …

(十二)Java算法:桶排序(详细图解)

目录一、前言1.1、概念1.2、算法步骤二、maven依赖三、流程解析3.1、桶编号计算3.2、桶元素排序四、编码实现一、前言 1.1、概念 计数排序&#xff1a;的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序&#xff0c;计数排序要求输入…

SpringCloud全系列知识(2)—— Nacos配置和集群

Nacos配置和集群 一 统一配置管理 Nacos官方文档 1.配置热更新 1.新建配置文件 在Nacos的配置列表中新建一个配置文件。 注意事项&#xff1a; Data ID 命名规则&#xff1a;一般情况下使用使用 “微服务名称运行环境” 作为DataID&#xff0c;后缀名建议使用文件后缀全…

集成一个以官网(微信,QQ,微博)为标准的登录分享功能

Hello&#xff0c;各位老铁&#xff0c;今天要分享的是一个老生常谈的一个功能&#xff0c;也是网上一搜一大片的技术点&#xff0c;没什么技术含量&#xff0c;就是整合一下&#xff0c;提供一下方便&#xff0c;相对于友盟&#xff0c;ShareSdk中夹杂着一些别的功能&#xff…

Python编程 集合

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.集合 1.集合介绍(掌握) 2.集合创建(掌握) 3.添加元素(熟悉) 4.集合…

区域治理杂志区域治理杂志社区域治理编辑部2022年第40期目录

政策 乡村振兴人才发展战略分析 (1) 高庸江 声音《区域治理》投稿&#xff1a;cnqikantg126.com 迈向智能党建&#xff1a;智能媒体在党建工作中的创新运用 (5) 申娟 经验 北京市昌平区节水问题及水资源利用对策研究 (9) 彭聪 重庆市低碳创新政策优化研究 (13) 林芳 …

怎么把Word翻译成中文?建议收藏这些方法

相信不少小伙伴在撰写论文的时候&#xff0c;都有查阅大量的国内外文献吧。有时由于国外文献里面会含有大量的深奥词汇&#xff0c;我们一时半会儿没法马上理解文献的内容。其实我们可以使用软件直接翻译Word文档&#xff0c;那你们知道Word文档怎么翻译吗&#xff1f;有需要对…

【Android App】实战项目之仿抖音的短视频分享App(附源码和演示视频 超详细必看)

需要全部代码请点赞关注收藏后评论区留言私信~~~ 与传统的影视行业相比&#xff0c;诞生于移动互联网时代的短视频是个全新行业&#xff0c;它制作方便又容易传播&#xff0c;一出现就成为大街小巷的时髦潮流。 各行各业的人们均可通过短视频展示自己&#xff0c;短小精悍的视频…

网络面试-0x12 UDP和TCP的区别以及应用场景

一、 UDP &#xff08;user datagram protocol&#xff09;用户数据报协议 ①&#xff1a; 一种简单的面向数据报的通讯协议&#xff0c;即&#xff1a;应用层传下来的报文&#xff0c;不合并&#xff0c;不拆分&#xff0c;只是在其上面加上首部后就交给了下面的网络层。无论应…

Github优秀项目-使用Python基于CPM文本自动生成

基于CPM模型的中文文本生成项目,可用于作文、小说、新闻、古诗等中文生成任务。 虽然说开源的,但是实际部署应用的过程中很多小伙伴还遇见了不少的问题,这里我用自己的方式部署应用,如果还没有实现该功能的小伙伴可以跟我一起来操作。 如果有不了解的小伙伴先来看一下实验…

【多目标进化优化】多目标进化算法的收敛性

0 前言 \quad\quad对 MOEAMOEAMOEA 收敛性的研究是 MOEAMOEAMOEA 研究的重要内容&#xff0c;但目前这方面的研究结果比较少。 一个 MOEAMOEAMOEA 的收敛性可以从两个方面考虑&#xff1b;一是有限时间内的收敛&#xff1b;二是当时间趋向于无穷大时的收敛。第一类收敛是最理想…