当前位置: 首页 > news >正文

rk3566-Android11 从驱动到 app 第一章添加驱动程序

文章目录

  • 一、添加 kernel 驱动
    • 1. 驱动编写
    • 2. 验证驱动

作者: baron

    由于一直从事驱动开发, 一直想对整体流程有个了解, 刚好看到这篇文章 AndroidQ 从app到驱动 第一章 编写Linux内核驱动程序. 于是参考这篇文章在 rk3566 上面完成了从驱动到 app 的实验验证. 文章记录用到的知识点以及遇到的问题和解决方法.

     整体框架大致分为如下 5 层.

一、添加 kernel 驱动

1. 驱动编写

    驱动部分写一个 misc 设备就行了, 提供简单的读写功能. 由于只是简单的验证功能所以没有越界处理和错误处理.

#include <linux/fs.h>
#include <linux/miscdevice.h>
#include <linux/module.h>
#include <linux/uaccess.h>#define DEVICE_NAME "hello"
static char my_data[100] = "Hello, this is my_misc_device!\n";static ssize_t my_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
{if (copy_to_user(buf, my_data, count))return -EFAULT;return count;
}static ssize_t my_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
{if (copy_from_user(my_data, buf, count))return -EFAULT;return count;
}static const struct file_operations my_fops = {.owner = THIS_MODULE,.read = my_read,.write = my_write,
};static struct miscdevice my_misc_device = {.minor = MISC_DYNAMIC_MINOR,.name = DEVICE_NAME,.fops = &my_fops,
};static int __init my_init(void)
{int ret = misc_register(&my_misc_device);if (ret) {pr_err("Failed to register misc device\n");return ret;}return 0;
}static void __exit my_exit(void)
{misc_deregister(&my_misc_device);
}module_init(my_init);
module_exit(my_exit);

对应的 makefile 部分直接将驱动编进内核.

obj-y += hello.o

修改的文件如下所示

编译下载查看成功创建节点

rk3566_rgo:/ # ls /dev/hello
/dev/hello

2. 验证驱动

编写一个简单的应用程序验证驱动是 ok 的, 创建 external/test/test.c, 应用程序的内容如下.

#include <stdio.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
#include <malloc.h>
#include <string.h>int main(int argc, char* argv[])
{char* buff = (char*)malloc(100);int fd = -1;buff[99] = '\0';if(argc < 2)return 0;fd = open("/dev/hello", O_RDWR);if(fd < 0){printf("open /dev/mycdev err\n");return -1;}if(!strcmp("write", argv[1])){write(fd, argv[2], strlen(argv[2]));printf("write %s to /dev/hello buf\n\n", argv[2]);}else if(!strcmp("read", argv[1])){read(fd, buff, 99);printf("read data form /dev/hello : %s\n\n", buff);}else {printf("please use write or read cmd\n");}close(fd);return 0;
}

添加 external/test/Android.bp内容如下, 用来编译 bin 文件.

cc_binary {name: "mytest",srcs: ["test.c"],shared_libs: ["libbase","libcutils","liblog","libutils",],
}

添加完成之后进入 external/test/运行 mmm .编译. 编译完成之后如图, 得到 my_test

将其 push 到机器的 cache/目录. 验证结果如图所示, 驱动正常运行.

相关文章:

  • 64.Spring事件监听的核心机制是什么?
  • Qt简单使用与初识
  • DBA技术栈MongoDB:简介
  • 【STM32】STM32学习笔记-I2C通信外设(34)
  • 近场与远场
  • henauOJ 1113: 计算x的n次方
  • MySQL窗口函数(MySQL Window Functions)
  • 安全运维:cmd命令大全(108个)
  • 【论文阅读】ControlNet、文章作者 github 上的 discussions
  • ChatGPT 如何解决 “Something went wrong. lf this issue persists ….” 错误
  • 驾驭车联网的力量:深入车联网网络架构
  • windows系统中,通过LOAD到入csv格式的文件到neo4j中,如何写文件路径
  • Python自动化我选DrissionPage,弃用Selenium
  • beego的模块篇 - I18n国际化
  • MFC 序列化机制
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • CentOS从零开始部署Nodejs项目
  • EventListener原理
  • gulp 教程
  • java2019面试题北京
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JS笔记四:作用域、变量(函数)提升
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • linux安装openssl、swoole等扩展的具体步骤
  • Python学习之路16-使用API
  • 阿里研究院入选中国企业智库系统影响力榜
  • 创建一个Struts2项目maven 方式
  • 利用DataURL技术在网页上显示图片
  • 前端
  • 手机端车牌号码键盘的vue组件
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 智能网联汽车信息安全
  • 数据库巡检项
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #Linux(Source Insight安装及工程建立)
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • ****Linux下Mysql的安装和配置
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .Net面试题4
  • .net知识和学习方法系列(二十一)CLR-枚举
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [Delphi]一个功能完备的国密SM4类(TSM4)[20230329更新]
  • [Firefly-Linux] RK3568修改控制台DEBUG为普通串口UART
  • [Interview]Java 面试宝典系列之 Java 多线程
  • [json]定义、读写
  • [Latex] Riemann 问题中的激波,接触间断,膨胀波的 Tikz 绘图
  • [LaTex]arXiv投稿攻略——jpg/png转pdf
  • [Linux]进程创建➕进程终止