基于platform总线的字符设备驱动实例

前言

本文主要介绍如何编写基于platfrom的字符设备驱动


一、platform是什么

在Linux 2.6 版本以后的设备驱动模型中,主要是总线、设备和驱动3个实体构成,总线将设备和驱动绑定。在系统每注册一个设备的时候,会寻找与之匹配的驱动;相反的,在系统每注册一个驱动的时候,会寻找与之匹配的设备,而匹配由总线完成。

一个现实的Linux设备和驱动通常都需要挂接在一种总线上,对于本身依附于PCI、USB、I2C、SPI等的设备而言,这自然不是问题,但是在嵌入式系统里面,SoC系统中集成的独立的外设控制器、挂接在SoC内存空间的外设等确不依附于此类总线。基于这一背景,Linux发明了一种虚拟的总线,称为platform总线,相应的设备称为platform_device,而驱动成为 platform_driver。

二、platform是如何匹配device和driver

如下图所示,在platform_device(设备) 和 platform_driver(驱动)注册时,注册函数里面最终都会调用到如下函数-----platform_match(), 该函数就是platform总线用来匹配驱动和设备的,该函数首先会去调用 of_driver_match_device() 函数匹配设备树信息,如果设备在设备在设备树中有描述,并且相关的设备描述和驱动匹配,则设备和驱动匹配成功,直接返回, 如果设备在设备树中没有描述或描述和驱动中的不匹配, 则该函数继续往下,尝试使用id_table去匹配, 如果匹配成功,直接推出, 否则该函数继续往下,最后使用设备和驱动的name去进行匹配。

在这里插入图片描述

从上可知, platform_device(设备) 和 platform_driver(驱动)共有三种匹配方式, 使用设备树作为匹配方式的优先级最高,使用name作为匹配的方式优先级最低。
设备和驱动注册的时候是如何调用到platform_match()函数,可以查看 platform_device_register()platform_driver_register() 函数,进行追踪。

三、platform 字符设备驱动实例

1. 使用name 进行platform_device和platform_driver匹配的实例

如下代码所示, 实现了platform_device和platform_driver通过name 进行匹配,成功进行platform_driver 驱动的probe函数注册字符设备的功能

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

#include <linux/device.h>
#include <linux/cdev.h>
#include <linux/fs.h>

#include <linux/platform_device.h>



#define DEV_NAME "khl"

static unsigned int major = 0;
static unsigned int minor = 0;

static struct class *class_demo;
static struct device *device_demo;



static int char_device_demo_open(struct inode *inode, struct file *filp)
{
   
		printk(KERN_INFO "in char_device_demo_open\n");
        return 0;
}

static int char_device_demo_close(struct inode *inode, struct file 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值