AIDL Hal 开发笔记4----驱动开发

目录

  • 一、编写Linux 内核驱动
    • 1.1 编写驱动
    • 1.2 将模块编译进内核
  • 二、Native 程序测试驱动程序
  • 三、权限配置

驱动开发

一、编写Linux 内核驱动

1.1 编写驱动

Linux 驱动实际就是一个 Linux 内核模块。

首先,我们需要理解什么是内核模块?简单来说,内核模块是一段 “固定格式” 的代码,像一个“插件”一样,linux 内核可以动态的加载并执行这段代码,也可以把这段代码编译进内核,在内核启动的时候来执行这段代码。

下面我们写一个简单的 linux 驱动:在内核的drivers/char目录中添加 hello_driver.c

#include<linux/module.h>#include<linux/fs.h>#include<linux/errno.h>#include<linux/miscdevice.h>#include<linux/kernel.h>#include<linux/major.h>#include<linux/mutex.h>#include<linux/proc_fs.h>#include<linux/seq_file.h>#include<linux/stat.h>#include<linux/init.h>#include<linux/device.h>#include<linux/tty.h>#include<linux/kmod.h>#include<linux/gfp.h>/* 1. 确定主设备号 */staticintmajor=0;staticcharkernel_buf[1024];staticstructclass*hello_class;#defineMIN(a,b)(a<b?a:b)/* 3. 实现对应的open/read/write等函数,填入file_operations结构体 */staticssize_thello_drv_read(structfile*file,char__user*buf,size_tsize,loff_t*offset){interr;printk("%s %s line %d\n",__FILE__,__FUNCTION__,__LINE__);err=copy_to_user(buf,kernel_buf,MIN(1024,size));returnMIN(1024,size);}staticssize_thello_drv_write(structfile*file,constchar__user*buf,size_tsize,loff_t*offset){interr;printk("%s %s line %d\n",__FILE__,__FUNCTION__,__LINE__);err=copy_from_user(kernel_buf,buf,MIN(1024,size));returnMIN(1024,size);}staticinthello_drv_open(structinode*node,structfile*file){printk("%s %s line %d\n",__FILE__,__FUNCTION__,__LINE__);return0;}staticinthello_drv_close(structinode*node,structfile*file){printk("%s %s line %d\n",__FILE__,__FUNCTION__,__LINE__);return0;}/* 2. 定义自己的file_operations结构体 */staticstructfile_operationshello_drv={.owner=THIS_MODULE,.open=hello_drv_open,.read=hello_drv_read,.write=hello_drv_write,.release=hello_drv_close,};/* 4. 把file_operations结构体告诉内核:注册驱动程序 *//* 5. 谁来注册驱动程序啊?得有一个入口函数:安装驱动程序时,就会去调用这个入口函数 */staticint__inithello_init(void){interr;printk("%s %s line %d\n",__FILE__,__FUNCTION__,__LINE__);major=register_chrdev(0,"hello",&hello_drv);/* /dev/hello *///提供设备信息,自动创建设备节点。// /dev/hellohello_class=class_create(THIS_MODULE,"hello_class");err=PTR_ERR(hello_class);if(IS_ERR(hello_class)){printk("%s %s line %d\n",__FILE__,__FUNCTION__,__LINE__);unregister_chrdev(major,"hello");return-1;}device_create(hello_class,NULL,MKDEV(major,0),NULL,"hello");/* /dev/hello *///到这里我们就可以通过 /dev/hello 文件来访问我们的驱动程序了。return0;}/* 6. 有入口函数就应该有出口函数:卸载驱动程序时,就会去调用这个出口函数 */staticvoid__exithello_exit(void){printk("%s %s line %d\n",__FILE__,__FUNCTION__,__LINE__);device_destroy(hello_class,MKDEV(major,0));class_destroy(hello_class);unregister_chrdev(major,"hello");}/* 7. 其他完善:提供设备信息,自动创建设备节点 */module_init(hello_init);module_exit(hello_exit);MODULE_LICENSE("GPL");

1.2 将模块编译进内核

接下来我们修改 /drivers/char/Kconfig 文件,使得我们的 hello_driver 模块,能出现在内核的编译选项中。

在 /drivers/char 中的 Kconfig 文件中添加:

config HELLO_DRIVER_MODULE bool"hello driver module support"defaulty

然后在 /drivers/char 下的 Makefile 文件中添加:

obj-$(CONFIG_HELLO_DRIVER_MODULE)+=hello_driver.o

当在 make menuconfig 编译菜单中选中了 hello module support,CONFIG_HELLO_MODULE的值是 y,没有选中值是 m(我们定义的默认值是 y):

  • obj-y += hello_driver.o 的意思是将 hello_driver.o 编译进内核
  • obj-m += hello_driver.o 的意思是文件 hello_driver.o 作为"模块"进行编译,不会编译到内核,但是会生成一个独立的 “hello_driver.ko” 文件,可以使用insmod命令将模块加载到内核中

最后配置内核:

kernel/linux-5.4$ make menuconfig

进入 Device Drivers 选项:

进入 Character devices


这里就可以看见我们刚才添加的选项,默认是选上的。

然后执行编译:

source build/envsetup.sh lunch xxx make

烧录后抓取 kernel日志

#dmesg用于显示开机信息adb shell dmesg|grep hello

二、Native 程序测试驱动程序

在 frameworks/base/native/ 目录下创建如下的目录结构:

hello_drv_test/├── Android.mk └── hello_drv_test.c

其中 hello_drv_test.c 的内容如下:

#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<stdio.h>#include<string.h>/* * ./hello_drv_test -w abc * ./hello_drv_test -r */intmain(intargc,char**argv){intfd;charbuf[1024];intlen;/* 1. 判断参数 */if(argc<2){printf("Usage: %s -w <string>\n",argv[0]);printf(" %s -r\n",argv[0]);return-1;}/* 2. 打开文件 */fd=open("/dev/hello",O_RDWR);if(fd==-1){printf("can not open file /dev/hello\n");return-1;}/* 3. 写文件或读文件 */if((0==strcmp(argv[1],"-w"))&&(argc==3)){len=strlen(argv[2])+1;len=len<1024?len:1024;write(fd,argv[2],len);}else{len=read(fd,buf,1024);buf[1023]='\0';printf("APP read : %s\n",buf);}close(fd);return0;}

测试程序的内容很简单,就是根据命令行参数读写 /dev/hello文件。

接着编写 Android.mk 文件:

LOCAL_PATH:=$(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS:=optional LOCAL_SRC_FILES:=\ hello_drv_test.c LOCAL_MODULE:=hello_drv_test include $(BUILD_EXECUTABLE)

编译程序并push到机器:

# 编译 cd frameworks/base/native/hello_drv_test mm cd-adb push out/target/product/ceres-b7/system/bin/hello_drv_testsystem/bin/hello_drv_test system/bin adb shell # 执行程序 cd system/bin./hello_drv_test-w"hello"./hello_drv_test-r

执行程序的结果如下所示:


三、权限配置

要把驱动集成到系统中,还需要添加一些权限相关的配置:

system/core/rootdir/ueventd.rc中添加:

/dev/hello0666root root

system/sepolicy/device.te中添加:

typehello_dev_t,dev_type;

system/sepolicy/file_contexts中添加

/dev/hello u:object_r:hello_dev_t:s0

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

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

相关文章

基于PLC的卷扬机控制系统

三、卷扬机控制系统 &#xff08;一&#xff09;卷扬机的基本结构 如图3-1所示&#xff0c;卷扬机是由一个电机通过卷筒来带动左右两个小车上下行的工业机器。在工作过程中&#xff0c;使用一个电机同时拖动两个小车&#xff0c;使左右两个小车交替运行&#xff0c;当左车&…

基于51单片机的出租车计价器

3出租车计价器硬件设计 硬件是一个电子器具能否顺利运行的重要保障&#xff0c;它是软件的物质基础和载体。本系统的硬件设计主要包含K24C02记忆存储模块&#xff0c;用于存储数据&#xff1b;DS1302时钟模块&#xff0c;为计价器计时&#xff1b;A44E霍尔传感器电路&#xff0…

收藏级指南:Agentic RAG 彻底升级传统RAG,打造能干活的AI数字同事

Agentic RAG作为传统RAG的颠覆性升级方案&#xff0c;核心是将静态的“检索-生成”流程&#xff0c;重构为智能体驱动的动态自适应工作流。传统RAG仅能完成单次问答的闭环&#xff0c;而Agentic RAG凭借推理规划、工具调用、自我修正的核心能力&#xff0c;可承接复杂任务落地。…

QML基本元素

元素可以被分为可视化元素与非可视化元素。一个可视化元素&#xff08;例如矩形框Rectangle&#xff09;有着几何形状并且可以在屏幕上显示。一个非可视化元素&#xff08;例如计时器Timer&#xff09;提供了常用的功能&#xff0c;通常用于操作可视化元素。现在我们将专注于几…

交直流可编程电源(技术资料) 直流电源是直流输出0-30V 5A TL494 线路; 交流电压...

交直流可编程电源(技术资料&#xff09; 直流电源是直流输出0-30V 5A TL494 线路&#xff1b; 交流电压是10-120HZ可变频&#xff0c;0-30V幅度可调&#xff0c;5A输出&#xff1b; 变频交流电源部分是MEGA8DDS芯片D类数字功放做的。 电路原理: 经典的TL494开关电源线路 开关电…

DevSecOps时代测试工具的进化论:从功能验证到全链路质量保障

DevSecOps时代测试工具的进化论&#xff1a;从功能验证到全链路质量保障 在数字化转型加速的今天&#xff0c;软件开发周期持续缩短&#xff0c;安全威胁日益复杂&#xff0c;传统的"开发-测试-部署"线性流程已难以应对当下挑战。随着DevSecOps理念的深入实践&#x…

收藏级!大厂后端面试全流程复盘+大模型从入门到实战学习礼包

对于计算机专业应届毕业生而言&#xff0c;每年初秋的互联网大厂校招季&#xff0c;既是机遇与挑战交织的关键窗口期&#xff0c;更是检验四年专业积淀与技术能力的“终极实战场”。作为去年成功斩获字节跳动、阿里巴巴等多家头部大厂后端开发Offer的亲历者&#xff0c;同时也是…

【Java毕设全套源码+文档】基于springboot的公务员考试管理系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

基于Arduino的物流分拣控制系统设计

摘 要 为了提高当前物流分拣系统的工作效率和分拣正确率&#xff0c;满足市场对该行业的智能化需求&#xff0c;改善快递行业的经济性&#xff0c;本项目利用机械臂作为分拣工具&#xff0c;抓取物品并送到指定位置&#xff1b;利用光电对管作为扫描识别仪器&#xff0c;检测…

本土DevOps领军者Gitee:如何重塑中国企业研发效能新范式

本土DevOps领军者Gitee&#xff1a;如何重塑中国企业研发效能新范式 在数字化转型进入深水区的当下&#xff0c;研发效能已成为决定企业竞争力的关键变量。根据IDC最新报告&#xff0c;到2025年&#xff0c;采用成熟DevOps实践的企业将比同行实现50%以上的交付速度优势。这一背…

【Java毕设全套源码+文档】基于springboot的新闻发布会管理系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

收藏!AI焦虑别慌,程序员为啥要学大模型?零基础系统入门指南

近来技术圈的“AI焦虑”持续蔓延&#xff0c;“大模型”“AI替代程序员”这类话题反复霸占热搜与技术社群&#xff0c;不少从业者陷入莫名的恐慌与迷茫。 相信很多程序员都有这样的疑问&#xff1a;在AI浪潮席卷各行各业的当下&#xff0c;到底该不该主动掌握AI大模型相关能力&…

【Java毕设源码分享】基于springboot+vue的水果在线销售系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

listmap数据变驼峰

/*** listmap数据_变驼峰** param list* return*/public static List<Map<String, Object>> convertListToCamelCase(List<Map<String, Object>> list) {List<Map<String, Object>> data new ArrayList<>();if (null list || list…

量产HLW8032串口通讯芯片的三相电参数采集系统项目资料 1主芯片采用STM32F407

量产HLW8032串口通讯芯片的三相电参数采集系统项目资料 1主芯片采用STM32F407 2嵌入式软件使用UCOS2操作系统 3通过3个独立串口实时采集三路三相电参数数据&#xff08;通过HLW8032&#xff09; 4具备TFT液晶显示接口&#xff0c;实时显示三相电参数数据 5为了采集电参数更加精…

Java后端开发学习路线,零基础入门到精通,收藏这篇就够了

此思维导图是从codeSheep那里而来 文章目录 java后端开发学习路线 编程基础 java语言 语法基础JVM并发/多线程 数据结构和算法 数据结构算法 计算机网络数据库/SQL操作系统设计模式 研发工具应用框架 后端 spring全家桶服务器软件中间件分布式/微服务 微服务发现/注册网关服务…

Maven 4 终于快来了,新特性很香!

大家好&#xff0c;我是 Guide&#xff01;在 Java 生态中&#xff0c;Maven 绝对是大家每天都要打交道的“老朋友”。 InterviewGuide 这个开源 AI 项目中&#xff0c;我使用了 Gradle。不过&#xff0c;根据大家的反馈来看还是更愿意使用 Maven 一些。 目前&#xff08;2026…

AntDesign Table sorter 为什么点击第三次取消了,还是有参数发出?可设置sortDirections解决

在 Ant Design 的 Table 组件中&#xff0c;排序默认的行为是&#xff1a;点击一次为升序&#xff08;ascend&#xff09;&#xff0c;点击二次为降序&#xff08;descend&#xff09;&#xff0c;点击三次则取消排序&#xff08;undefined&#xff09;。这个行为是由 sorter 属…

AI驱动的11款论文写作工具,提供LaTeX格式智能排版与内容优化功能。

工具对比排名 工具名称 核心优势 支持LaTeX 适用场景 aibiye AIGC率降个位数&#xff0c;兼容知网规则 是 AI痕迹强处理 aicheck 学术改写优化&#xff0c;语义保留佳 是 格式统一化 askpaper 降重降AI一体&#xff0c;20分钟快速响应 是 初稿优化 秒篇 人类特…

如何应对AI生成重复内容:精选十大工具评测及有效解决策略

核心工具对比速览 工具名称 核心功能 适用场景 处理速度 特色优势 aibiye 降AIGC率查重 学术论文优化 20分钟 适配知网/格子达/维普规则 aicheck AIGC检测 风险区域识别 实时 可视化热力图报告 askpaper 学术内容优化 论文降重 20分钟 保留专业术语 秒篇 …