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

2024-01-19 11:44

本文主要是介绍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/目录. 验证结果如图所示, 驱动正常运行.

这篇关于rk3566-Android11 从驱动到 app 第一章添加驱动程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/622318

相关文章

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

MFC中App,Doc,MainFrame,View各指针的互相获取

纸上得来终觉浅,为了熟悉获取方法,我建了个SDI。 首先说明这四个类的执行顺序是App->Doc->Main->View 另外添加CDialog类获得各个指针的方法。 多文档的获取有点小区别,有时间也总结一下。 //  App void CSDIApp::OnApp() {      //  App      //  Doc     CDocument *pD

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符串属性的4、函数读取 np 结点中的 propname 属性的值,并将读取到的 u32 类型的值保存在 out_value 指向的内存中,函数的返回值表示读取到的

驱动安装注册表指令

HKCR: HKEY_CLASSES_ROOT HKCU: HKEY_CURRENT_USER HKLM: HKEY_LOCAL_MACHINE HKU: HEKY_USER HER: 相对根键

UMDF驱动安装

VS2013 + WDF8.1,UMDF驱动选择User Mode Driver,不要选User Mode Driver 2.0,否则Win7安装有问题,如图 另外,在驱动安装时不要忘记WUDFUpdate_<主版本号><次版本号>.dll文件,具体文件名在INF中查找。此文件可在WDF的安装目录中找到。注意:在WDF的安装目录中会有3个WUDFUpdate_xxx.dll文件,x86,x6

ConstraintLayout布局里的一个属性app:layout_constraintDimensionRatio

ConstraintLayout 这是一个约束布局,可以尽可能的减少布局的嵌套。有一个属性特别好用,可以用来动态限制宽或者高app:layout_constraintDimensionRatio 关于app:layout_constraintDimensionRatio参数 app:layout_constraintDimensionRatio=“h,1:1” 表示高度height是动态变化

App Store最低版本要求汇总

1,自此日期起: 2024 年 4 月 29 日 自 2024 年 4 月 29 日起,上传到 App Store Connect 的 App 必须是使用 Xcode 15 为 iOS 17、iPadOS 17、Apple tvOS 17 或 watchOS 10 构建的 App。将 iOS App 提交至 App Store - Apple Developer 2,最低XCode版本 Xcod

电脑驱动分类

电脑驱动程序(驱动程序)是操作系统与硬件设备之间的桥梁,用于使操作系统能够识别并与硬件设备进行通信。以下是常见的驱动分类: 1. 设备驱动程序 显示驱动程序:控制显卡和显示器的显示功能,负责图形渲染和屏幕显示。 示例:NVIDIA、AMD 显示驱动程序。打印机驱动程序:允许操作系统与打印机通信,控制打印任务。 示例:HP、Canon 打印机驱动程序。声卡驱动程序:管理音频输入和输出,与声卡硬件

麒麟系统安装GPU驱动

1.nvidia 1.1显卡驱动 本机显卡型号:nvidia rtx 3090 1.1.1下载驱动 打开 https://www.nvidia.cn/geforce/drivers/ 也可以直接使用下面这个地址下载 https://www.nvidia.com/download/driverResults.aspx/205464/en-us/ 1.1.3安装驱动 右击,

windows10 卸载网络驱动以及重新安装

右键桌面此电脑的图标,点击管理,设备管理器—网络适配器,找到下图中的驱动(不同的系统或者显卡会导致网卡驱动名称与下图不一样,多为Realtek开头),右键选择卸载设备,然后重启电脑,系统会自动重新安装驱动 新电脑首次安装驱动: 根据主板厂家,比如华硕,进入华硕官网,点击服务支持,点击下载中心,选择型号,点击右侧驱动程序和工具软件,选择windows版本,下载相应的驱动,下载完之后在对应文件中找