基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离

news2024/12/27 13:52:24

一、篇头

本文介绍Platform平台驱动框架,使用此框架,将可以用上DTS设备树文件,实现设备的静态枚举,实现设备与驱动的分离。

本文基于Amlogic T972 , Android 9.0, 内核版本 4.9.113

二、系列文章

第1篇:基于Amlogic 安卓9.0, 驱动简说(一):字符设备驱动,手动创建设备
第2篇:基于Amlogic 安卓9.0, 驱动简说(二):字符设备驱动,自动创建设备
第3篇:基于Amlogic 安卓9.0, 驱动简说(三):使用misc框架,让驱动更简单
第4篇:基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离


三、源码解析

3.1 编辑DTS设备树文件

  • 如下添加 aml_plat_dev 节点,其compatible 与驱动中of_device_id的设定完全相同
	aml_plat_dev {
		compatible = "szhou,aml_plat_dev";
	};

3.2 解析:驱动源码

  • 文件名:helloworld_platform_amlogic_driver.c
  • 位置:android9.0\common\drivers\amlogic\input\helloworld_platform_amlogic_driver.c
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/miscdevice.h> 
#include <linux/platform_device.h> /*platform 驱动框架头文件*/


/* 实现系统调用接口:open(),在platform中保持不变 */
static int aml_misc_open(struct inode *inode, struct file *file)
{
	pr_info("aml_misc_open()-> platform is called.\n");
	return 0;
}


/* 实现系统调用接口:close(),在platform中保持不变  */
static int aml_misc_close(struct inode *inode, struct file *file)
{
	pr_info("aml_misc_close()-> platform is called.\n");
	return 0;
}


/* 实现系统调用接口:ioctl(),在platform中保持不变  */
static long aml_misc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
	pr_info("aml_misc_ioctl()-> platform is called. cmd = %d, arg = %ld\n", cmd, arg);
	return 0;
}

static const struct file_operations aml_misc_fops = {
	.owner = THIS_MODULE,  /* 固定搭配 */
	.open = aml_misc_open, /* 提供open(), fopen()系统调用 */
	.release = aml_misc_close, /* 提供close(), fclose()系统调用 */
	.unlocked_ioctl = aml_misc_ioctl, /* 提供ioctl()系统调用 */
};

/* 声明 struct miscdevice 结构体变量,并赋值*/
static struct miscdevice aml_misc_device = {
		.minor = MISC_DYNAMIC_MINOR,  /* 优点:misc设备已由misc框架提供了主设备号,其余设备通过此设定,自动分配一个次设备号*/
		.name = "aml_plat_misc_dev",  /* 将创建/dev/aml_plat_misc_dev    以及 /sys/class/misc/aml_plat_misc_dev */
		.fops = &aml_misc_fops, 
};


//static int __init aml_misc_init(void)
//驱动在DTS中探测到相兼容的设备,将自动运行probe初始化,并创建设备,相比misc驱动,只是更换函数接口,实现大体还是一样
static int __init my_probe(struct platform_device *pdev)

{
	int ret;
	pr_info("aml_misc_init-> my_probe\n");

	/* 将miscdevice对象注册进内核 */
	ret = misc_register(&aml_misc_device);

	if (ret != 0) {
		pr_err("Failded: misc_register aml_misc_dev-> my_probe\n");
		return ret;
	}

	pr_info("init alloc aml_misc_dev's minor[%i]-> my_probe\n",aml_misc_device.minor);
	return 0;
}

//static void __exit aml_misc_exit(void)
//同样的,用platform的remove替代之前的exit,相比misc驱动,只是更换函数接口,实现大体还是一样
static int __exit my_remove(struct platform_device *pdev)
{
	pr_info("aml_misc_exit -> my_remove\n");

	/* 注销miscdevice对象 */
	misc_deregister(&aml_misc_device);
	return 0;
}

/*
 * (1) 新增of_device_id,用于与DTS中静态描述的设备做匹配
 * (2) 需要在DTS中添加具备 .compatible 属性的节点,否则无法触发 probe()函数的执行
*/
static const struct of_device_id my_of_ids[] = {
	{ .compatible = "szhou,aml_plat_dev"},
	{},
};

//导出my_of_ids符号,供内核使用
MODULE_DEVICE_TABLE(of, my_of_ids);

/* 定义platform_driver对象,用于注册到内核Platform总线中 */
static struct platform_driver my_platform_driver = {
	.probe = my_probe,
	.remove = my_remove,
	.driver = {
		.name = "aml_plat_dev",
		.of_match_table = my_of_ids,
		.owner = THIS_MODULE,
	}
};

/* 注册我们的platform驱动 */
module_platform_driver(my_platform_driver);

/*下面两句可以省略了,驱动在DTS中探测到相兼容的设备,将自动运行probe初始化,并创建设备*/
//module_init(aml_misc_init);
//module_exit(aml_misc_exit);

MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("szhou <66176468@qq.com>");
MODULE_DESCRIPTION("simple say[3]: misc device driver");

3.3 Makefile

obj-m += helloworld_platform_amlogic_driver.o

四、编译、部署、测试

4.1 编译

参考之前文章,因为需要同时编译KO和DTS文件,直接执行内核编译命令即可。

4.2 烧录

步骤一:复制dt.img到烧录工具夹
在这里插入图片描述

步骤二:执行burning.bat程序,烧录dt.img
在这里插入图片描述

4.3 KO部署

PS Z:\> adb  root
PS Z:\> adb  push .\helloworld_platform_amlogic_driver.ko /data/
PS Z:\>    

命令图示如下:
在这里插入图片描述


4.4 KO加载测试

1)加载KO之前,可见已有aml_plat_dev设备信息,但却没有 /dev/aml_plat_misc_dev  
:/ # cd /sys
:/sys # find  . -name aml_plat_dev
./devices/platform/aml_plat_dev
./firmware/devicetree/base/aml_plat_dev
./bus/platform/devices/aml_plat_dev

(2)查看/dev下是否有创建设备文件(尚未创建,需要待驱动insmod后执行probe匹配后才会创建)
:/sys # cd /dev
1|:/dev # ls -l /dev/aml_plat_misc_dev
ls: /dev/aml_plat_misc_dev: No such file or directory                                                        
:/dev # 


(3)加载KO文件
:/data # insmod helloworld_platform_amlogic_driver.ko                          
[  198.651146@3]- type=1400 audit(1672309615.242:1119): avc: denied { getattr } for pid=5274 comm="sh" path="/data/helloworld_platform_amlogic_driver.ko" dev="mmcblk0p20" ino=16 scontext=u:r:install_recovery:s0 tcontext=u:object_r:system_data_file:s0 tclass=file permissive=1
[  198.652941@2]- aml_misc_init-> my_probe
[  198.656100@1]- init alloc aml_misc_dev's minor[47]-> my_probe

(4)查看设备添加情况,发现设备已创建:
:/data # ls -l /dev/aml_plat_misc_dev
crw------- 1 root root  10,  47 2022-12-29 18:26 /dev/aml_plat_misc_dev
:/data # 

4.5 APP测试

  • 直接使用第3篇中所编写的APP即可
130|:/data # ./hello_aml  /dev/aml_plat_misc_dev                               
[  214.842417@0]- aml_misc_open()-> platform is called.
[  214.842497@0]- aml_misc_ioctl()-> platform is called. cmd = 18, arg = -1146983912
[  214.980620@0]- aml_misc_close()-> platform is called.
:/data # 

五、源码下载

  • 地址:https://gitee.com/amizhou/amlogic_t972_android9_driver/tree/master/index_01_simpleSay_drivers/lesson_04
git clone git@gitee.com:amizhou/amlogic_t972_android9_driver.git

六、篇尾

保持持续学习, 欢迎私信交流。

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

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

相关文章

【Docker基础篇】一文完成快速使用

Docker基础篇前言Docker是什么&#xff1f;Docker与传统虚拟机技术区别Docker作用、为什么用docker原理Docker常用命令案例展示redis各种软件安装打包到本地、上传到远程仓库打包到本地推送到远程仓库前言 所有的权威均来自与官方&#xff0c;如有疑问请参考官网文献。人非圣贤…

网络厂商 Aruba 2022 年业绩成倍增长的经验是什么

转眼&#xff0c;2022 年马上就要结束了。 在多重不确定的经济环境之下&#xff0c;网络厂商 Aruba 中国在 2022 年的业绩&#xff0c;与上一财年相比仍然实现了成倍的增长。今年初&#xff0c;CSDN 曾采访过 Aruba 中国区的管理者 Aruba 中国区总经理谢建国与 Aruba 北中国区大…

alpine的介绍与使用

目录 1. alpine 简介 2. 基于alpine构建jdk8镜像 2.1 Dockerfile 2.2 将构建目录上传到linux中 2.3 执行构建 3. 镜像瘦身 4. 上传阿里云镜像仓库 1. alpine 简介 Alpine Linux是一个轻型Linux发行版&#xff0c;它不同于通常的Linux发行版&#xff0c;Alpine采用了musl …

【车间调度】基于卷积神经网络的柔性作业车间调度问题的两阶段算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

CryptoJS加密解密

1.CryptoJS CryptoJS库是前端js写的一个加密解密的工具&#xff0c;使用场景就是对于像账户密码等重要信息要显示在页面上时&#xff0c;需要加密&#xff0c;这样才能保证安全&#xff0c;CryptoJS提供了许多加密的方法&#xff0c; 请参考&#xff1a; cryptojs-JavaScrip…

OSPF的汇总实验

目录 1.拓扑图 2.实验要求 3.实验思路 4.主要配置 5.测试 6.实验总结 1.拓扑图 2.实验要求 R4为ISP&#xff0c;其上只能配置ip&#xff0c;R4与其他所有直连设备间使用公有ip&#xff1b;解决ospf不规则区域&#xff1b;整个ospf环境ip地址为172.16.0.0/16&#xff0c;…

pure pursuit纯跟踪

Pure Pursuit是一种几何追踪方法,速度越小,performance越好; :汽车前轮转角 L:前后轮轴距(车长) R:转弯半径 将车辆模型简化为自行车模型(这里默认左轮和右轮的旋转是一致的)!!! bicycle model: pure pursuit建立于自行车模型和阿克曼小车模型的基础上,goal point为距离后…

2022年用于Web开发的15种最佳编程语言

Web 开发是一个常青的领域&#xff0c;机会总是很多。自 90 年代初出现以来&#xff0c;开发行业在各种方式和领域中发展并蓬勃发展。今天&#xff0c;在 21 世纪&#xff0c;Web 开发仍然是最受欢迎的技能之一。要在这个领域开始职业生涯&#xff0c;掌握Web 开发语言是必不可…

UDS-10.4 SecurityAccess (27) service

10.4 安全访问(27)服务 来自&#xff1a;ISO 14229-1-2020.pdf 10.4.1 服务描述 本服务的目的是提供一种访问数据和/或诊断服务的方法&#xff0c;这些数据和/或诊断服务由于安全、排放或安全原因而被限制访问。用于将例程或数据下载/上传到服务器以及从服务器读取特定内存位置…

spring 基础知识-- IOC 和 DI 的配置和使用。

目录 一、基本概念 二、Spring 核心概念 1、问题分析 2、IOC、IOC容器、Bean、DI 3、IOC 入门案例 4、DI 入门案例 三、IOC 详解 1、bean 基础配置 2、bean 实例化 3、bean 生命周期 四、DI 详解 1、setter 注入 2、构造器注入 3、自动配置 4、集合注入 一、基…

go调度和性能分析利器之trace

trace的使用示例 import ("fmt""log""os""runtime/trace""sync" )func main() {//runtime.GOMAXPROCS(1)// 1. 创建trace持久化的文件句柄f, err : os.Create("trace.out")if err ! nil {log.Fatalf("failed…

再次学习make

目录 1.Makefile的重要性 2.MakeFile的概念 3.Makefile的优点 4.Makefile的基本语法 5.变量 5.1 自定义变量 5.2 变量的赋值 5.3自动变量 5.4 Makefile的隐含变量 6.Makefile的函数 6.1意义&#xff1a; 6.2 基本语法&#xff1a; 6.3 部分常用函数 6.4 自定义函…

ECS-弹性容器服务 - Part 1

67-ECS-弹性容器服务 - Part 1 Hello大家好&#xff0c;我们今天的课时内容是ECS-AWS的弹性容器服务。 ECS-AWS的弹性容器服务 ECS是高度可扩展的、快速的容器管理和编排服务。 使用ECS&#xff0c;能够将您的Docker容器运行在AWS EC2或者 Fargate管理的无服务器架构上。 将容…

磨金石教育摄影技能干货分享|什么是序列摄影?它让摄影更加深刻

著名摄影师肖尔曾这样表达过自己的摄影理念。 他说&#xff1a;“吸引我的总是平淡无奇的瞬间”。 他与著名的纪实摄影师布列松不同&#xff0c;他不喜欢去游荡在生活之外&#xff0c;去抓拍他人的精彩瞬间。 他也不喜欢报道式的摄影&#xff0c;不去过多关注社会话题。 而是将…

第二证券|首批浮动费率基金三年成绩出炉 规模虽小收益可观

2019年12月18日至12月26日&#xff0c;6家基金公司试点建立了职业第一批逐笔比例提取成绩酬劳的起浮办理费率基金&#xff08;下称“起浮费率基金”&#xff09;。如今&#xff0c;这6只起浮费率基金运作均已满三年&#xff0c;到2022年12月26日&#xff0c;6只产品建立以来均匀…

Selenium Webdriver 实现原理详解

目录 1. Selenium 概述 2. 术语解释&#xff1a; 3. Selenium WebDriver 实现原理 4. 安装selenium 客户端&#xff0c;浏览器&#xff0c;驱动 4.1 安装selenium client lib 4.2 安装浏览器和浏览器驱动 4.3 例子代码 4.4 省略浏览器驱动的方法 4.5 测试代码与Webdr…

MAC控制器驱动

嵌入式Linux开发模式下&#xff0c;以太网硬件架构一般都是 MAC与PHY是独立的。所以以太网模块的硬件相关的驱动代码主要包括 GMAC 和 PHY&#xff0c;其中MAC控制器驱动由SoC厂商开发&#xff0c;PHY芯片驱动由PHY厂商开发&#xff0c;PHY 驱动一般使用通用 PHY 驱动&#xff…

无线烧录器(2)

传送门&#xff1a;连接 继上次完成了ESP32无线烧录器。那么有一个问题就是&#xff0c;一堆人都在一起想用这个来无线烧录呢&#xff0c;那么固件中定死的热点名称岂不是会互相的扰乱。所以需要自己编译属于自己的热点名称。 首先需要准备以下几样东西。 Ubuntu &#xff08;需…

excel数据透视表:善用这些功能,提高工作效率!下篇

在上篇文章中&#xff0c;我们为大家分享了透视表的前5条妙用&#xff0c;分别是合并同类项、按条件汇总数据、统计非重复数据、排名、批量创建表格&#xff0c;不知道大家都还记得吗&#xff1f;那么今天我们书接上回&#xff0c;继续为大家分享关于透视表的后5条妙用。 六、…

密码学_SM4国密算法

目录 简介 两类参数 加密流程 RKi和Ki4的生成方法 Xi4的生成方法​编辑 左移的概念 简介 在商用密码体系中&#xff0c;SM4主要用于数据加密&#xff0c;其算法公开&#xff0c;分组长度与密钥长度均为128bit&#xff0c;加密算法与密钥扩展算法都采用32轮非线性迭代结构&…