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

简介: 本文介绍了如何在基于Amlogic T972的Android 9.0系统上使用Platform平台驱动框架和设备树(DTS),实现设备与驱动的分离,并通过静态枚举在设备树中描述设备,自动触发驱动程序的加载和设备创建。

一、篇头

本文介绍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 #

五、源码下载

git clone git@gitee.com:amizhou/amlogic_t972_android9_driver.git

六、篇尾

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

相关文章
|
1月前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
109 1
|
2月前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
29天前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
81 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
2月前
|
监控 Android开发 iOS开发
深入探索安卓与iOS的系统架构差异:理解两大移动平台的技术根基在移动技术日新月异的今天,安卓和iOS作为市场上最为流行的两个操作系统,各自拥有独特的技术特性和庞大的用户基础。本文将深入探讨这两个平台的系统架构差异,揭示它们如何支撑起各自的生态系统,并影响着全球数亿用户的使用体验。
本文通过对比分析安卓和iOS的系统架构,揭示了这两个平台在设计理念、安全性、用户体验和技术生态上的根本区别。不同于常规的技术综述,本文以深入浅出的方式,带领读者理解这些差异是如何影响应用开发、用户选择和市场趋势的。通过梳理历史脉络和未来展望,本文旨在为开发者、用户以及行业分析师提供有价值的见解,帮助大家更好地把握移动技术发展的脉络。
92 6
|
2月前
|
IDE 开发工具 Android开发
安卓与iOS开发对比:平台选择对项目成功的影响
【9月更文挑战第10天】在移动应用开发的世界中,选择正确的平台是至关重要的。本文将深入探讨安卓和iOS这两大主要移动操作系统的开发环境,通过比较它们的市场份额、开发工具、编程语言和用户群体等方面,为开发者提供一个清晰的指南。我们将分析这两个平台的优势和劣势,并讨论如何根据项目需求和目标受众来做出最佳选择。无论你是初学者还是有经验的开发者,这篇文章都将帮助你更好地理解每个平台的特性,并指导你做出明智的决策。
|
2月前
|
开发工具 Android开发 iOS开发
安卓与iOS开发:平台选择的艺术与科学
在移动应用开发的广阔天地中,安卓与iOS两大平台如同东西方哲学的碰撞,既有共通之处又各具特色。本文将深入探讨这两个平台的设计理念、开发工具和市场定位,旨在为开发者提供一份简明扼要的指南,帮助他们在这场技术与商业的博弈中找到自己的道路。通过比较分析,我们将揭示每个平台的优势与局限,以及它们如何影响应用的性能、用户体验和市场接受度。无论你是初涉江湖的新手,还是经验丰富的老手,这篇文章都将为你的选择提供新的视角和思考。
37 5
|
2月前
|
人工智能 Android开发 iOS开发
安卓与iOS开发:平台选择的艺术
在移动应用开发的广阔天地里,安卓和iOS两大操作系统各占半壁江山。本文将深入探讨这两个平台的开发环境、工具及市场趋势,帮助开发者在选择适合自己项目的平台时做出更明智的决策。通过比较各自的优势与局限,我们不仅能更好地理解每个系统的核心特性,还能洞察未来技术发展的脉络。无论你是刚入行的新手还是资深开发者,这篇文章都将为你提供有价值的参考和启示。
48 5
|
2月前
|
Linux Android开发 iOS开发
探索Android与iOS开发:平台之战还是互补共生?
在移动应用开发的浩瀚宇宙中,Android和iOS这两大星系始终吸引着无数开发者的目光。它们各自拥有独特的引力场,引领着技术潮流的方向。本文将穿梭于这两个平台的星际空间,揭示它们背后的力量对比,以及如何在这两者之间找到平衡点,共同推动移动应用开发的进步。
39 1
|
2月前
|
移动开发 开发框架 Android开发
安卓与iOS开发:平台之战的新篇章
在移动应用开发的广阔天地中,安卓和iOS始终占据着主导地位。本文通过比较这两个平台的发展历程、技术特点及未来趋势,探讨了它们之间的竞争与合作。文章旨在为开发者提供一个清晰的平台选择指南,并预测未来移动开发的可能走向。
48 1
|
2月前
|
移动开发 开发工具 Android开发
安卓与iOS开发:平台差异及其对开发者的影响
在移动开发的大潮中,安卓和iOS两大阵营各领风骚。本文将探讨这两个平台的关键差异,包括开发环境、编程语言、用户界面设计、应用分发以及商业模式等方面。通过比较分析,我们旨在为开发者提供一个清晰的指导,帮助他们根据项目需求和个人偏好做出明智的平台选择。同时,文章也将分享一些跨平台开发工具的使用经验,以期最大化开发效率和市场覆盖。
67 1