Linux驱动14 --- 平台设备总线
目录
一、设备树节点的多个属性值
二、平台设备总线
2.1 介绍
平台设备总线
2.2 匹配设备树 --- 必须掌握
驱动端注册
驱动端注销
资源的获取
2.3 设备端和驱动端都写 --- 了解
设备端
设备端注册
设备端注销
驱动端
获取资源
一、设备树节点的多个属性值
二、平台设备总线
2.1 介绍
平台设备总线
用于解决内核冗余问题的方式
设备树也是解决冗余的
平台设备总线会将驱动开发再次分割为两层
驱动层,设备层
设备层去提供设备信息 --- 设备树
驱动层去根据设备信息完成驱动的编写
驱动的编写 --- 生成设备文件,描述文件接口,控制硬件设备的运行
之前做的就是驱动端 ,平台设备总线给我们了一个规范
从设备树获取节点信息的规范
在加入设备树之后 --- 核心就是获取节点信息
获取节点信息的核心 --- 找到节点
2.2 匹配设备树 --- 必须掌握
设备端不需要写,设备树就是设备端,只需要完成驱动端
关键字:platform
头文件:#include <platform_device.h>
驱动端注册
函数原型
int platform_driver_register(struct platform_driver *)
函数参数
struct platform_driver{ //平台设备总线驱动端核心结构体//核心作用 --- 匹配设备树节点信息int (*probe)(struct platform_device *) //匹配成功之后执行的第一个函数int (*remove)(struct platform_device *) //调用卸载函数会执行这个函数中的内容struct device_driver driver{const char *name; //驱动端和设备端匹配方式之一 ,但是不是我们匹配设备树的方式struct module *owner; //固定填写const struct of_device_id *of_match_table{char name[32]; //设备节点的名字char compatible[128]; //设备节点中的 compatible 属性}}}
函数返回值
成功返回 0,失败返回非 0
但是在实际应用中,这个返回值不准确
之前遇到的成员都是指针类型,现在有了一个数组类型
数组只有在定义的时候可以直接给数组赋值
在使用平台设备总线的时候,加载函数一般只做驱动端匹配(核心结构体的注册),卸载函数一般只做驱动的注销
原本加载函数中的内容需要写在(*probe)函数,原本卸载函数的内容就写在(*remove)函数
驱动端注销
函数原型
void platform_driver_unregister(struct platform_driver *)
函数参数
同上
资源的获取
(*probe)函数的参数
struct platform_device{struct device dev{struct device_node *of_node;}}
2.3 设备端和驱动端都写 --- 了解
用户需要完成两个.c 文件,总共两个.ko 文件
设备端需要用户填充具体的资源信息
驱动端匹配设备端,获取设备端的资源信息
只有驱动端和设备端匹配成功才可以执行 --- (*probe)函数
和匹配设备树的区别
资源 --- 结构体填充
匹配方式
设备端
设备端注册
函数原型
int platform_device_register(struct platform_device *)
函数参数
struct platform_device{ //平台设备总线设备端核心结构体const char *name; //平台设备总线一般方法的匹配名字int id; //固定填-1struct device dev;{void(*release)(struct device *dev) //无所谓,给个空函数}u32 num_resources; //传递资源的数量struct resource *resource;{resource_size_t start; //资源的起始地址 --- 可以用来传递有效电平resource_size_t end; //资源的结束地址 --- 可以用来传递 GPIO 号const char *name; //传递和不传递都可以 --- 可以用来传递设备文件名unsigned long flags; //资源的类型 ,使用的是内存资源 --- IORESOURCE_MEM}}
函数返回值
成功返回 0,失败返回负数
其中包括了资源的填充
设备端注销
函数原型
void platform_device_unregister(struct platform_device *)
驱动端
获取资源
函数原型
struct resource *platform_get_resource(struct platform_device *dev, unsigned int type, unsigned int num)
函数参数
struct platform_device *:(*probe)的参数
type:类型 --- 获取资源的类型 --- IORESOURCE_MEM
num:获取资源的下标
可以一次性传递多个资源 --- 下标从 0 开始
函数返回值
成功返回资源核心结构体 ,失败返回 NULL