基于Amlogic 安卓9.0, 驱动简说(三):使用misc框架,让驱动更简单

news2024/11/16 15:33:45

文章目录

  • 一、前文总结
  • 二、系列文章
  • 三、MISC框架驱动
  • 四、解析:完整源码
    • 4.1 helloworld_misc_amlogic_driver.c
    • 4.2 Makefile
  • 五、编译执行
    • (1)编译及部署
    • (2)运行
  • 六、应用层调用
    • 6.1 APP源码
    • 6.2 命令及运行效果
  • 七、源码下载
  • 八、篇尾

一、前文总结

  • 在第1篇文章《驱动简说(一):字符设备驱动,手动创建设备》中,我们了解了基础的字符设备驱动的写法,但也注意到了它的缺点:
    • 设备号需要自己去找,自己创建(容易冲突) ;
    • 需要自己创建和驱动匹配的设备文件(否则应用层无设备可用)。
  • 在第2篇文章《驱动简说(二):字符设备驱动,自动创建设备》中,我们通过alloc自动分配设备号,以及主动注册class、device对象,解决了第1篇的两个问题。
  • 但是…… 我们还有更简单的方法,达到第2篇的目的,但不需要写第2篇的那么多代码!

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

二、系列文章

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


三、MISC框架驱动

misc 驱动框架,直译过来就是杂项设备驱动框架。使用此框架,misc框架将自动为你分配主次设备号,同时会为你在/dev目录下,以及/sys/class/misc目录下创建你的设备文件。

更重要的是,基于系统自动分配(其实只分配了一个次设备号,主设备号与所有misc共用),减少了设备号冲突,更减少了主设备号的资源浪费。同时也减少了类似class/device创建、注销的模块化代码!


四、解析:完整源码

4.1 helloworld_misc_amlogic_driver.c

  • 文件,参考位置:android9.0\common\drivers\amlogic\input\helloworld_misc_amlogic_driver.c
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/miscdevice.h> /*misc 驱动框架头文件*/


/* 实现系统调用接口:open() */
static int aml_misc_open(struct inode *inode, struct file *file)
{
	pr_info("aml_misc_open() is called.\n");
	return 0;
}


/* 实现系统调用接口:close() */
static int aml_misc_close(struct inode *inode, struct file *file)
{
	pr_info("aml_misc_close() is called.\n");
	return 0;
}


/* 实现系统调用接口:ioctl() */
static long aml_misc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
	pr_info("aml_misc_ioctl() 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_misc_dev",  /* 将创建/dev/aml_misc_dev    以及 /sys/class/misc/aml_misc_dev */
		.fops = &aml_misc_fops, 
};


/*
* 模块初始化接口
* 对比之前两篇文章的例子,可见此版本,有如下几个优点
* (1)不需去申请设备号
* (2)不需去创建和注册 struct class
* (3)不需去创建和注册 struct device
* (4)省去了一大堆,申请、注册的异常判断语句
*/
static int __init aml_misc_init(void)
{
	int ret;
	pr_info("aml_misc_init\n");

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

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

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

/*同初始化函数,退出时候,也不需执行Major/Minor的反注册 */
static void __exit aml_misc_exit(void)
{
	pr_info("aml_misc_exit\n");

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

}

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");

4.2 Makefile

  • android9.0\common\drivers\amlogic\input\Makefile
  • 添加下面语句,并将helloworld_misc_amlogic_driver.c放在同一目录下
obj-m +=  helloworld_misc_amlogic_driver.o

五、编译执行

(1)编译及部署

参考系列文章,第1篇

(2)运行

  • 串口上执行
(1)加载驱动模块
:/data # insmod  helloworld_misc_amlogic_driver.ko                             
[ 3950.099788@3]- aml_misc_init
[ 3950.100480@0]- init alloc aml_misc_dev's minor[47]
:/data # 

(2)查看设备文件
:/data # ls -l /dev/aml_misc_dev                                               
crw------- 1 root root 10,  47 2022-12-29 11:12 /dev/aml_misc_dev
:/data # ls -l /sys/class/misc/aml_mis*
lrwxrwxrwx 1 root root 0 2022-12-29 11:13 /sys/class/misc/aml_misc_dev -> ../../devices/virtual/misc/aml_misc_dev
:/data # 

效果如下图:
在这里插入图片描述

六、应用层调用

因为设备节点文件的名称变成了/dev/aml_misc_dev, 所以不能直接使用第1篇的APP程序进行测试,稍微修改一下

  • 如下如有疑问,可参考第1篇,或留言

6.1 APP源码

  • 文件:android9.0\development\hello_aml\hello_aml.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>

/*
* 使用argv[1]来传入,需要打开的设备文件的路径
* 用法: #./data/hello_aml  /dev/aml_misc_dev
*/
int main(int argc, char *argv[])
{

  int buf[4]={0};
  int fd=0;

  if(argc < 2){
    printf("Usage: hello_aml  /dev/aml_misc_dev\n");
    return 0;
  }

  //(1) 测试 open
  fd = open(argv[1], O_RDWR);
  if(fd == -1){
	printf("Failed: open %s \n", argv[1]);
	return 0;
  }

  //(2) 测试 ioctl
  ioctl(fd, 0x12, buf); 

  //(3) 测试 clsoe	
  close(fd);
  return 0;
}

6.2 命令及运行效果

Windows PowerShell
版权所有(C) Microsoft Corporation。保留所有权利。

安装最新的 PowerShell,了解新功能和改进!https://aka.ms/PSWindows1)部署
PS Z:\T972\android_x301\source\t962x3-t972-android9.0\out\target\product\x301\system\bin> adb root
adbd is already running as root
PS Z:\T972\android_x301\source\t962x3-t972-android9.0\out\target\product\x301\system\bin> adb push .\hello_aml /data/
.\hello_aml: 1 file pushed, 0 skipped. 0.8 MB/s (15988 bytes in 0.020s)2)修改权限
PS Z:\T972\android_x301\source\t962x3-t972-android9.0\out\target\product\x301\system\bin> adb shell chmod 777 /data/hello_aml

(3)查看设备文件
PS Z:\T972\android_x301\source\t962x3-t972-android9.0\out\target\product\x301\system\bin> adb shell
x301:/ # ls -l /dev/aml_mi*
crw------- 1 root root 10,  47 2022-12-29 11:31 /dev/aml_misc_dev

(4)执行APP
x301:/ # ./data/hello_aml /dev/aml_misc_dev

(5)查看打印
x301:/ # dmesg | tail
[ 5143.465058] aml_misc_open() is called.
[ 5143.465112] aml_misc_ioctl() is called. cmd = 18, arg = -1146418760
[ 5143.470051] aml_misc_close() is called.
x301:/ #

命令及效果图示:
在这里插入图片描述

七、源码下载

百看不如一试……

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

八、篇尾

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

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

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

相关文章

思考札记1

2022年12月26日 今天看了荣耀新出的80GT&#xff0c;主处理器是第一代骁龙8&#xff0c;以及一个辅助处理器&#xff0c;性能怎么样不知道&#xff0c;但是12256价格来到了 3299&#xff0c;主摄5400万像素&#xff0c;感觉偏贵&#xff0c;我是不会买的 可能这机子就是主打性能…

【杂谈】一个项目获得10倍学费收入,我在有三AI学以致用的故事

各位有三AI的读者朋友们大家好&#xff0c;作为一名在职AI算法工程师和有三AI的读者&#xff0c;今天和大家分享一下我和有三AI几年来结识和学习的经历&#xff0c;希望对大家有所帮助。结识有三AI2019年我刚工作时对AI理论基础和实践经验还非常不足&#xff0c;因此工作之余我…

质数距离 acwing

196. 质数距离 - AcWing题库 题意是给你一个区间[l,r]&#xff0c;相当于让你把这个区间里面所有的质数提出来&#xff0c;然后找到相邻质数距离最近和最远的第一个点在什么地方 看一下数据范围&#xff0c;不同的数据范围决定了用什么方法去做&#xff1a; 两个数据范围&…

Linux多路转接or多路复用模型

目录 一、功能 二、应用场景 三、多路转接模型的实现 1.select模型 1.1操作流程 1.2相关接口 1.3示例 1.4常见使用方式 1.5优缺点 2.poll模型 2.1操作流程 2.2相关接口 2.3示例 2.4优缺点 3.epoll模型 3.1操作流程 3.2相关接口 3.3常见使用方式 3.4epoll的事…

这一年,熬过许多夜,也有些许收获 | 2022年终总结

弹指一挥间&#xff0c;时间如白驹过隙。光阴似箭&#xff0c;日月如梭&#xff0c;时间如闪电&#xff0c;转瞬即逝。回望来时路&#xff0c;不觉潸然泪下… 一说到年终总结&#xff0c;好像都离不开这样煽情的开场白。但不可否认的是&#xff0c;时间确实过得很快&#xff0…

操作指南|通过Snapshot进行投票

Snapshot是一个去中心化的治理平台&#xff0c;包括Moonbeam社区在内的许多Web3社区都使用此平台进行民意投票。民意投票是一种非正式的链下治理流程&#xff0c;允许社区在链上投票之前就某件事发表意见。通过Snapshot进行的民意投票&#xff0c;以及在Moonbeam治理论坛上的讨…

canopen6.0-PDO发送

1、发送PDO 2、发送PDO参数说明 发送PDO标识符:180+NODEID 传输类型 0xff为跟随定时器发送 进制时间:防止某一个报文长时间占用总线设定的时间 envent timer:单位为ms,传输类型设置0xff,定时发送时间 3、发送PDO映射参数说明 PDO映射数目:PDO传输变量数量 7100 01 10h含义…

南卡和漫步者蓝牙耳机哪个好?国产蓝牙耳机南卡和漫步者360度对比评测

现如今&#xff0c;随着蓝牙技术的发展&#xff0c;越来越多的蓝牙耳机出现在我们的日常生活当中&#xff0c;国产蓝牙耳机也不遑多让&#xff0c;在制作上也更为精湛。现在的国产蓝牙耳机品牌有很多&#xff0c;但相较于一些新兴的国产品牌&#xff0c;人们更信赖一些国货老牌…

C#---第十九课:时间DateTime相关的应用 Convert.ToDateTime ParseExact TryParseExact

文章目录1.将字符串转换为标准的DateTime格式2.DateTime数据的相关应用3.ParseExact的应用4.TryParseExact的应用1.将字符串转换为标准的DateTime格式 DateTime 格式是标准的格式&#xff0c;通过这个格式可以方便转换为其他格式、日期的增减、日期的比较等 using System.Diagn…

RK3568平台开发系列讲解(设备驱动篇)等待队列

🚀返回专栏总目录 文章目录 一、等待队列头二、等待队列项三、添加/删除队列四、等待唤醒五、等待事件沉淀、分享、成长,让自己和他人都能有所收获!😄 📢当我们进程去访问设备的时候,经常需要等待有特定事件发生以后再继续往下运行,这个时候就需要在驱动里面实现当条…

以“微”知著,用友ISV生态的力量与担当

由规模化、集约化、智能化带来的影响&#xff0c;不仅可以让养殖户获得更大的养殖密度、更规范的养殖流程、更专业的管理运营&#xff0c;而且能够带动行业发生深远的变革! 养猪也少不了数智化 常言道&#xff1a;民以食为天&#xff0c;猪粮安天下。一头猪就是一个小银行&…

获取微信小程序码传递的参数 / 微信开发者工具模拟扫描小程序码调试

本文主要介绍如何在微信开发者工具中&#xff0c;模拟微信扫描小程序码打开小程序的场景&#xff0c;进行调试。 二维码调试可以看这篇文章&#xff1a;微信开发者工具模拟扫描二维码调试 添加编译模式 添加一个咱们自定义的编译模式 输入模式名称 主要是方便后面的查找 设…

【观察】Oracle NetSuite+德勤中国税务Digital T-Suite:做中国企业“智慧税务”新助手...

伴随着新技术的快速发展&#xff0c;智慧税务成为国家技术力量驱动、治理能力升级背景下的一次全新税务实践。也正因此&#xff0c;继2015年国家税务总局在《“互联网税务”行动计划》中首次提出智慧税务建设目标后&#xff0c;2021年国家再次印发《关于进一步深化税收征管改革…

双非本科到大厂,贫困家庭到深圳买房,我的逆袭之路

20岁的你是否在拼命努力的奋斗呢&#xff1f; 人这一生&#xff0c;其实大大小小有很多的节点&#xff0c;每个年纪该干每个年纪的事情&#xff0c;一步一步的朝前走下去&#xff0c;应该是大部分人目前的现状。 最近一年来&#xff0c;这个号新增了很多的读者&#xff0c;大…

SpringSecurity(二十三)--OAuth2:使用JWT和加密签名(上)对称密钥加密

一、前言 最近阳了所以一直都在休整&#xff0c;大家一定要注意身体&#xff0c;能不阳就不阳&#xff0c;如果阳康后还是一直咳嗽&#xff0c;最好是能去医院看看&#xff0c;这绝对不是专家口中所说的新冠感冒那么简单&#xff0c;也绝对不是什么80%的无症状&#xff0c;大家…

计算机网络——路由信息协议RIP的基本工作原理

&#x1f49f;&#x1f49f;前言 ​ 友友们大家好&#xff0c;我是你们的小王同学&#x1f617;&#x1f617; 今天给大家打来的是 计算机网络——路由信息协议RIP的基本工作原理 希望能给大家带来有用的知识 觉得小王写的不错的话麻烦动动小手 点赞&#x1f44d; 收藏⭐ 评论&…

(四)devops持续集成开发——jenkins的全局工具配置之maven环境安装及配置

前言 本节内容我们主要介绍jenkins中如何集成自定义的maven环境及流水化组件maven插件的安装&#xff0c;这样我们就可以发布流水化的maven项目工程。 正文 上传并安装maven①上传maven安装包 ②解压maven安装包 unzip apache-maven-3.8.3-bin.zip ③配置maven依赖包环境变量…

Attention:何为注意力机制?

本文来自公众号“AI大道理” 人类利用有限的注意力资源从大量信息中快速筛选出高价值信息&#xff0c;这是人类在长期进化中形成的一种生存机制&#xff0c;人类视觉注意力机制极大地提高了视觉信息处理的效率与准确性。 attention从注意力模型的命名方式看&#xff0c;借鉴了…

带你认识不一样的人工智能

人工智能简称AI&#xff0c;它是研究、模拟、延伸和扩展人类智能的理论、方法、技术和应用系统的新兴技术。人工智能是计算机科学的一个领域&#xff0c;正在向机器传递智能&#xff0c;通过模拟人的某些思维过程和智能行为&#xff0c;让机器像人类一样工作、反应和决策。自人…

学习C语言笔记:初始C语言

学习内容&#xff1a; 1.运算符——&#xff1b; 2.函数——main()、printf()&#xff1b; 3.编写一个简单的C程序&#xff1b; 4.创建整型变量&#xff0c;为其赋值并在屏幕上显示其值&#xff1b; 5.换行字符&#xff1b; 6.如何在程序中写注释&#xff0c;创建包含多个函数的…