platform总线
创始人
2024-02-29 20:47:04
0

1、什么是platform总线?

platform是Linux内核抽象出来的软件代码,用于设备与驱动的连接,设备与驱动通过总线进行匹配;匹配成功后会执行驱动中的probe函数,在probe函数中可以获取到设备的信息;

设备与驱动的信息分别通过链表进行管理。

2、如何运用platform

编写驱动和设备端的代码----搭建platform框架

设备与硬件有三种匹配方式:名字匹配,id_table匹配,设备树匹配

名字匹配:

驱动代码

#include 
#include 
#include 
struct resource *res;
int irqno;//定义一个probe函数int pdrv_probe(struct platform_device *pdev){//获取MEM类型的资源res=platform_get_resource(pdev,IORESOURCE_MEM,0);if(res==NULL){printk("获取MEM资源失败\n");return ENODATA;}//获取中断类型的资源irqno=platform_get_irq(pdev,0);if(irqno<0){printk("获取中断资源失败\n");return ENODATA;}printk("addr:%#llx ,irqno:%d\n",res->start,irqno);return 0;}int pdrv_remove(struct platform_device *pdev){printk("%s:%d\n",__func__,__LINE__);return 0;}//热插拔宏,可以在插入硬件时,自动安装驱动MODULE_DEVICE_TABLE(platform,idtable);//对象初始化struct platform_driver pdrv={.probe=pdrv_probe,.remove=pdrv_remove,  .driver={.name="aaaaa",  //按名字匹配,只能匹配一个设备     }, };module_platform_driver(pdrv);  //一键注册驱动
MODULE_LICENSE("GPL");

设备代码

#include 
#include 
#include //对设备信息进行填充struct resource res[]={[0]={.start=0x12345678,.end=0x12345678+49,.flags= IORESOURCE_MEM,     },[1]={.start=71,.end=71,.flags= IORESOURCE_IRQ,      },};//定义一个relese函数
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 mycdev_init(void)
{//注册devicereturn platform_device_register(&pdev);
}
static void __exit mycdev_exit(void)
{//注销deviceplatform_device_unregister(&pdev);}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

id_table匹配

#include 
#include 
#include 
#include 
struct resource *res;
int irqno;//定义一个probe函数int pdrv_probe(struct platform_device *pdev){//获取MEM类型的资源res=platform_get_resource(pdev,IORESOURCE_MEM,0);if(res==NULL){printk("获取MEM资源失败\n");return ENODATA;}//获取中断类型的资源irqno=platform_get_irq(pdev,0);if(irqno<0){printk("获取中断资源失败\n");return ENODATA;}printk("addr:%#llx ,irqno:%d\n",res->start,irqno);return 0;}int pdrv_remove(struct platform_device *pdev){printk("%s:%d\n",__func__,__LINE__);return 0;}//id_table创建struct platform_device_id idtable[]={{"hi1",0},{"hi2",1},{"hi3",2},{},//防止越界};//热插拔宏,可以在插入硬件时,自动安装驱动MODULE_DEVICE_TABLE(platform,idtable);//对象初始化struct platform_driver pdrv={.probe=pdrv_probe,.remove=pdrv_remove,  .driver={.name="aaaaa",  //按名字匹配,只能匹配一个设备     }, .id_table=idtable, //设置名字表匹配,可以匹配多个硬件设备};module_platform_driver(pdrv);
MODULE_LICENSE("GPL");

设备树匹配:

1、编写自己的设备树节点---编译设备树,开发板上电加载
2、驱动对象中,匹配方式-----设备树匹配
3、构建comptible表
struct of_device_id oftable[]={
{.compatible="hqyj,platform",},
};设备初始化结构体中,添加设备树匹配
.of_match_table=oftable,

 驱动编译后拷贝到~/nfs/rootfs

#include 
#include 
#include 
#include 
#include 
#include 
struct resource *res;
int irqno;
struct gpio_desc *gpiono; //存放gpio编号//定义一个probe函数int pdrv_probe(struct platform_device *pdev){//获取MEM类型的资源res=platform_get_resource(pdev,IORESOURCE_MEM,0);if(res==NULL){printk("获取MEM资源失败\n");return ENODATA;}//获取中断类型的资源irqno=platform_get_irq(pdev,0);if(irqno<0){printk("获取中断资源失败\n");return ENODATA;}printk("addr:%#x ,irqno:%d\n",res->start,irqno);//解析设备树节点信息gpiono=gpiod_get_from_of_node(pdev->dev.of_node,"myled1",0,GPIOD_OUT_HIGH,NULL);if(IS_ERR(gpiono)){printk("获取gpio编号失败\n");return PTR_ERR(gpiono);}printk("点亮led1\n");gpiod_set_value(gpiono,1);return 0;}int pdrv_remove(struct platform_device *pdev){gpiod_set_value(gpiono,0);gpiod_put(gpiono);return 0;}struct of_device_id oftable[]={{.compatible="hqyj,platform",},{},
};//热插拔宏,可以在插入硬件时,自动安装驱动MODULE_DEVICE_TABLE(of,oftable);//对象初始化struct platform_driver pdrv={.probe=pdrv_probe,.remove=pdrv_remove,  .driver={.name="aaaaa",  //按名字匹配,只能匹配一个设备.of_match_table=oftable,//设备树匹配     }, };module_platform_driver(pdrv);
MODULE_LICENSE("GPL");

 现象:

如何让设备安装时,驱动自动加载,就像插入u盘,系统会自动识别硬件安装驱动

MODULE_DEVICE_TABLE(platform,idtable);添加此行即可

 

相关内容

热门资讯

谢灵运山水诗对李白的创作影响 谢灵运山水诗对李白的创作影响  东晋诗人谢灵运,作为中国古典诗歌山水诗派的开创者之一,在晋宋之交,为...
永远的守巢人诗歌_歌颂老师   又到毕业季,又有不少的孩子即将离开那个呵护了他们三年的小乐园,开始第一次学会和朋友们说再见。下面...
小学生抗疫情诗歌 小学生抗疫情诗歌  无论是身处学校还是步入社会,大家一定没少看到经典的诗歌吧,诗歌语言言简义丰,具有...
忘不掉你的承诺诗歌 忘不掉你的承诺诗歌  当自己心中的那个他走了之后,  让人最难忘记的是“记忆”  因为,  那一段记...
你是我心中永远的痛爱情诗歌 你是我心中永远的痛爱情诗歌  你我曾经  肩并肩、手牵着手徜徉在花丛中  一起观赏人间的四季美景  ...
爱情的诗歌 有关爱情的诗歌  在平时的学习、工作或生活中,大家都看到过许多经典的诗歌吧,诗歌是按照一定的音节、韵...
适合过年听的欢快的歌曲 适合过年听的欢快的歌曲  过年期间都是一个很喜庆的时间,很多店铺商场都开始放一些音乐去吸引客人或者说...
醉生梦死诗歌 醉生梦死诗歌醉生梦死诗歌1  禁果的滋味  苦涩而甜蜜  人生第一次爱过  不知不觉已成悲伤之人  ...
《雨说》诗歌 《雨说》诗歌  在平日的学习、工作和生活里,许多人都接触过一些比较经典的诗歌吧,诗歌饱含丰富的感情和...
蜗行诗歌 蜗行诗歌  在生活、工作和学习中,大家总免不了要接触或使用诗歌吧,诗歌在形式上,不是以句子为单位,而...
国庆节的诗歌 关于国庆节的诗歌再过几天就是十月一号的国庆节了,自古以来,吟诗作赋是文人对节日的表达感情方式之一。下...
歌颂伟大的母亲党成立100周... 弹指间,2021年来了,我们伟大的母亲中国共产党也走过了100年,那歌颂伟大的母亲中国共产党成立10...
欧阳修的醉翁亭记 欧阳修的醉翁亭记  《醉翁亭记》不仅是一首千古传诵的游记,散文中饶有诗情画意,别具清丽格调,是一篇具...
关于中秋节的诗歌大全 关于中秋节的诗歌大全,小编为你推荐下文,希望可以帮助到你。欢迎你的阅读参考。1、《中秋》唐·李朴皓魄...
《落日怅望》诗歌鉴赏 《落日怅望》诗歌鉴赏  落日怅望  马戴  孤云与归鸟,千里片时间。  念我何留滞,辞家久未还。  ...
小学画课文原文 小学画课文原文  画为初唐诗人王维所做的一首五言绝句。下面就随小编一起去阅读小学画古诗原文,相信能带...
诗歌赏析:《六月的雨》 诗歌赏析:《六月的雨》  在平日的学习、工作和生活里,大家都经常接触到诗歌吧,诗歌是一种抒情言志的文...
泰山嵯峨夏云在,疑是白波涨东... “泰山嵯峨夏云在,疑是白波涨东海。”出处 出自 唐代 李白 的《早秋单父南楼酬窦公衡》“泰山嵯峨夏云...
彻夜难眠的经典诗句 彻夜难眠的经典诗句  在平凡的学习、工作、生活中,大家都经常接触到诗句吧,诗句具有语言节奏鲜明的特点...
描写长江雄阔的诗句 描写长江雄阔的诗句  白日依山尽,黄河入海流。王之涣《登鹳雀楼》  春别曲【唐】张籍长江春水绿堪染,...