android驱动开发从零到一

这篇具有很好参考价值的文章主要介绍了android驱动开发从零到一。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

安卓驱动开发过程

机器介绍

本人是在win10里安装vmware workstation16软件,然后在vmware里创建了ubuntu18.04系统的虚拟机
android驱动开发,驱动开发,android,c语言

安卓开发板用的是北京迅为的rk3568开发板
android驱动开发,驱动开发,android,c语言

步骤

step1.下载android11源码
step2.编译android源码(make命令)
step3.编写驱动文件
step4.构建镜像(build.sh) (有两种加载驱动的方式)
step5.镜像烧写至rk3568开发板

step1:下载android11源码

源码非常大,为了确保下载后编译成功,请确保硬盘有300g的空间,可以下载谷歌的源码,也可以下载rk3568提供的源码

一、谷歌的源码下载:

1.设置git

ice@ubuntu:~/Android$ sudo apt-get install git
ice@ubuntu:~/Android$ git config --global user.name "abcd"
ice@ubuntu:~/Android$ git config --global user.email "abcd@xxx.com"

2.下载“源码的下载管理工具”

ice@ubuntu:~/Android$ git clone https://gerrit-googlesource.lug.ustc.edu.cn/git-repo
ice@ubuntu:~/Android$ mkdir .repo
ice@ubuntu:~/Android$ mv git-repo .repo/repo #将“git-repo”移动到刚刚创建的“.repo”文件中,并将其名称改为“repo”
ice@ubuntu:~/Android$ cp .repo/repo/repo ./
ice@ubuntu:~/Android$ chmod u+x repo

3.开始下载

ice@ubuntu:~/Android$ ./repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-security-11.0.0_r55
ice@ubuntu:~/Android$ ./repo sync -j2

二、rk3568提供的源码下载:

本文用的rk3568开发板,使用的是供应商定制改动了一些内容的android11源代码,从百度网盘下载的
解压后的文件如图,基本和谷歌原版结构一致

链接: https://pan.baidu.com/s/16nucdvOIcBgCWMw7_aCyUQ?pwd=1dae
提取码: 1dae

android驱动开发,驱动开发,android,c语言

step2:编译android源码(make命令)

1.编译的几个选项

ice@ubuntu:~/Android$ cd rk_android11.0_sdk
ice@ubuntu:~/Android/rk_android11.0_sdk$ source build/envsetup.sh
ice@ubuntu:~/Android/rk_android11.0_sdk$ lunch

有如下选项
android驱动开发,驱动开发,android,c语言
我这里选择55
成功后提示
android驱动开发,驱动开发,android,c语言
解释一下选择问题,无论是谷歌下载的源码还是rk3568提供的源码,都一样的解释
android驱动开发,驱动开发,android,c语言

2.开始编译

ice@ubuntu:~/Android/rk_android11.0_sdk$ make -j12

这里的j12就是12个并行任务,你可以根据自己的cpu核数设定,之后就是等待编译成功
android驱动开发,驱动开发,android,c语言

step3:编写驱动文件

驱动文件是c语言,文件是helloworld.c,内容如下

#include <linux/module.h>
#include <linux/kernel.h> 
static int helloworld_init(void)        
{
	printk("helloworld_init\r\n");
	return 0;
}
static void helloworld_exit(void)    
{
	printk("helloworld_exit\r\n");
}

module_init(helloworld_init);    
module_exit(helloworld_exit);   

step4:开始构建镜像(build.sh)

想使驱动在安卓系统中运行,有两种编译方式。
1.驱动编译到内核
2.驱动编译成内核模块

两种驱动编译方式

1.驱动编译到内核介绍:

构建内核镜像时,驱动c文件放在编译好的安卓源码里,放在其本身有的驱动一起的位置,本文是~/Android/rk_android11.0_sdk/kernel/drivers
文件夹里,所有驱动一起编译并构建镜像

2.驱动编译成内核模块介绍:

这种要先构建出不含我们自己写的驱动的镜像,把镜像烧写至开发板,之后才能加载ko文件。
请直接阅读"驱动编译到内核"部分的s4:构建内核镜像后,再阅读m2.驱动编译成内核模块实战部分。
步骤是编译出我们的驱动ko文件,把此驱动ko文件拷贝至开发板,在运行中的开发板里,通过insmod命令加载驱动。

m1.驱动编译到内核实战

s1.drivers文件夹内创建自己的驱动文件夹并写入驱动文件。

我是放在了drivers的字符设备下,即char文件夹下

ice@ubuntu:~/Android/rk_android11.0_sdk/kernel/drivers$ mkdir char/helloworld

写入驱动c文件 helloworld.c
android驱动开发,驱动开发,android,c语言

s2.构建镜像时的各模块的设置

构建内核镜像时,需要编译的模块,是从~/Android/rk_android11.0_sdk/kernel/Kconfig这个设置文件读取的,而这个Kconfig文件又汇总了,kernel内其他模块的Kconfig文件
所以,对于我们的hellworld驱动,也要加入Kconfig文件

ice@ubuntu:~/Android/rk_android11.0_sdk/kernel/drivers$ cd char/helloworld
ice@ubuntu:~/Android/rk_android11.0_sdk/kernel/drivers/char/helloworld$ touch Kconfig

helloworld文件夹的Kconfig文件中写入如下内容

config helloworld
        bool "hellworld support"
        default y
        help
                helloworld Kconfig

因为helloworld文件夹,在drivers/char文件夹内,要在char文件夹的Kconfig中引入helloworld文件夹的Kconfig文件

ice@ubuntu:~/Android/rk_android11.0_sdk/kernel/drivers/char$ vi Kconfig 

文件内加入一行:

source "drivers/char/helloworld/Kconfig"


android驱动开发,驱动开发,android,c语言
至此,构建内核镜像的所有设置,都在各级的Kconfig中写好了,下面使Kconfig生效。
进入kernel文件夹,制作总的config文件

ice@ubuntu:~/Android/rk_android11.0_sdk/kernel$ make menuconfig

android驱动开发,驱动开发,android,c语言
android驱动开发,驱动开发,android,c语言
android驱动开发,驱动开发,android,c语言
出现了以上的图说明我们Kconfig设置成功了。
此时,会在kernel文件夹下生成一个汇总的.config隐藏文件
如图所示:
android驱动开发,驱动开发,android,c语言
文件的内容如下:
android驱动开发,驱动开发,android,c语言
这里 CONFIG_helloworld=y 是我们hellowold文件夹里的Kconfig里 default y设置出来的

s3. 根据设置,确定编译构建内核的步骤

构建内核镜像时,设置是记录在各级Kconfig文件,根据这些设置对应的编译步骤是记录在各级的Makefile中的。

helloworld文件夹中插入Makefile

ice@ubuntu:~/Android/rk_android11.0_sdk/kernel/drivers/char/helloworld$ vi Makefile 

Makefile插入如下代码

obj-$(CONFIG_helloworld)        += helloworld.o # 此CONFIG_helloworld变量是来自于上一步中新生成的那个在kernel文件夹下的.config文件

即:
android驱动开发,驱动开发,android,c语言
helloworld是在drivers/char文件夹下的,需要在char文件夹的Makefile中加入编译helloworld模块的操作步骤

obj-$(CONFIG_helloworld)        += helloworld/

android驱动开发,驱动开发,android,c语言
至此Makefile是设置完成了。

s4:构建内核镜像

很简单,进入android源码文件夹,根据自己的需求制作所需的镜像。
最终构建镜像时,设置一下屏幕文件的参数,文件在以下文件夹中
android驱动开发,驱动开发,android,c语言
rk3568 的屏幕文件是
android驱动开发,驱动开发,android,c语言
android驱动开发,驱动开发,android,c语言

我需要的是内核镜像,因为驱动是在内核镜像里的,当驱动更新时,需要把内核镜像更新。

安卓系统里不同的镜像的功能介绍参考一个短视频(10min):https://www.bilibili.com/video/BV1pv4y1K71W?p=2

开始build 构建镜像

ice@ubuntu:~/Android/rk_android11.0_sdk$ ./build.sh -CKA

内核镜像位置:
android驱动开发,驱动开发,android,c语言

build.sh后面的参数含义
android驱动开发,驱动开发,android,c语言

s5小结:

我们先在helloworld文件夹下,创建了3个文件:
android驱动开发,驱动开发,android,c语言
接着我们把char文件加下的Kconfig文件和Makefile文件做了修改,使得helloworld能加入编译过程
android驱动开发,驱动开发,android,c语言
最后我们是先使用make menuconfig 命令使所有Kconfig设置生效并生成.config文件
android驱动开发,驱动开发,android,c语言
然后我们就开始构建镜像了

ice@ubuntu:~/Android/rk_android11.0_sdk$ ./build.sh -CKA # 此命令是内核镜像构建

生成的内核镜像路径在以下路径中
android驱动开发,驱动开发,android,c语言
其他镜像的构建,请使用不同的参数,生成的img镜像也在别的路径中

android驱动开发,驱动开发,android,c语言

m2.驱动编译成内核模块实战

s1.先建立一个文件夹放置驱动c文件和Makefile

android驱动开发,驱动开发,android,c语言
helloworld2.c:

#include <linux/module.h>
#include <linux/kernel.h> 
static int helloworld_init(void)        
{
	printk("helloworld2_init\r\n");
	return 0;
}
static void helloworld_exit(void)    
{
	printk("helloworld2_exit\r\n");
}

module_init(helloworld_init);    
module_exit(helloworld_exit);  

Makefile:


obj-m += helloworld2.o
KDIR :=/home/ice/Android/rk_android11.0_sdk/kernel/  # 用的是安卓11源码的内核
PWD ?= $(shell pwd)
all:
	make -C $(KDIR) M=$(PWD) ARCH=arm64 $(KDIR).config modules  # 注意此处多了ARCH参数和 ".config"文件参数


.PHONY:clean
clean:
	make -C $(KDIR) M=$(PWD) clean

s2.生成Makefile所需的.config文件

进入kernel文件夹,制作总的config文件

ice@ubuntu:~/Android/rk_android11.0_sdk/kernel$ make menuconfig  # 此命令会在此文件夹下生成.config文件

成功后弹出以下界面:
android驱动开发,驱动开发,android,c语言
退出此界面后,我们看看是否生成了我们需要的.config文件
android驱动开发,驱动开发,android,c语言
生成了,下面开始编译ko文件

s3.编译ko文件(make命令)

android驱动开发,驱动开发,android,c语言

s4.把ko文件传至开发板

此处请先确保开发板的安卓镜像已经烧写成功,否则需要阅读step5:烧写镜像至开发板部分

电脑usb连接 rk3568开发板,用MobaXterm客户端,通过com串口访问开发板控制台。

我是在开发板里新建了一个文件夹:
android驱动开发,驱动开发,android,c语言
把驱动ko文件传至此文件夹,这个过程有点曲折,步骤如下:

1.我先是把helloworld2.ko文件放到了win10的任意文件夹内,我的是z:盘里了
2.通过adb push命令把文件传送至开发板的安卓系统里
android驱动开发,驱动开发,android,c语言

传好的结果如下图
android驱动开发,驱动开发,android,c语言

s5.加载驱动(insmod命令)

首先要进入root权限,运行 su 命令
android驱动开发,驱动开发,android,c语言
其次进入ko文件所在文件夹,运行insmodrmmod命令加载和卸载驱动
android驱动开发,驱动开发,android,c语言

step5:烧写镜像至开发板

烧写过程完全参照bilibili教程 (9min):

链接:
https://www.bilibili.com/video/BV1pv4y1K71W?p=4

烧写工具下载链接:

链接: https://pan.baidu.com/s/1m2H_s12ifb3EDIyoPG0hhQ?pwd=gdjh
提取码: gdjh

step6:查看驱动是否运行成功

电脑usb连接 rk3568开发板,用MobaXterm客户端,通过com串口访问开发板控制台,通过dmesg命令查看开发板启动时,我们的驱动是否运行成功。

这个过程参考视频链接 (4min):
https://www.bilibili.com/video/BV1744y1u779/?p=11

android驱动开发,驱动开发,android,c语言文章来源地址https://www.toymoban.com/news/detail-782425.html

到了这里,关于android驱动开发从零到一的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AIGC - Stable Diffusion 搭建【从零到一】

    解决音频内容GPU运算时遇到ffmpeg引起问题 write_py audio_spleeter.txt

    2024年02月09日
    浏览(36)
  • zookeeper单节点部署,手把手从零到一

    kafka戳这里:kafka单节点部署,手把手从零到一 事前准备: 1、一台Linux服务器或者是一台虚拟机 2、准备好JDK环境 3、安装好wget(当然也可以不用这个,只是用于下载安装包的一个工具,所以能下载好包就是没问题的) 4、需要了解vim的一些基础操作,不懂得可自行百度 1.1、

    2023年04月15日
    浏览(39)
  • 长安链---从零到一部署Chainmaker-2.0.0

    长安链部署 长安链·ChainMaker具备自主可控、灵活装配、软硬一体、开源开放的突出特点,由北京微芯研究院、清华大学、北京航空航天大学、腾讯、百度和京东等知名高校、企业共同研发。取名“长安链”,喻意“长治久安、再创辉煌、链接世界”。 长安链作为区块链开源

    2023年04月08日
    浏览(38)
  • 如何制作流程图?教你从零到一制作

    如何 制作流程图 ? 在当今快节奏、信息化的社会,流程图已经成为了一种非常重要的沟通工具。它能够帮助我们清晰地表达复杂的过程、系统和思路。那么,如何从零开始制作流程图呢?本文将为你提供一份详细的指南。 一、明确目的和内容 在开始制作流程图之前,首先

    2024年01月24日
    浏览(45)
  • 【30天python从零到一】---第七天:列表和元组

    🍎 博客主页:🌙@披星戴月的贾维斯 🍎 欢迎关注:👍点赞🍃收藏🔥留言 🍇系列专栏:🌙 Python专栏 🌙请不要相信胜利就像山坡上的蒲公英一样唾手可得,但是请相信,世界上总有一些美好值得我们全力以赴,哪怕粉身碎骨!🌙 🍉一起加油,去追寻、去成为更好的自己

    2023年04月19日
    浏览(39)
  • Vue+Electron打包桌面应用(从零到一完整教程)

    切记,整个项目的json文件不能有注释,及时没报错也不行,否则运行命令时还是有问题 参考此视频 1- 1.创建项目 1- 2. 安装依赖运行项目 1- 3.配置Electron 1- 4.修改配置文件 1) vite.config.js 2)main.js(项目根目录新增) 此为electron运行的入口文件 3)preload.js(项目根目录下新增) 4)package

    2024年02月07日
    浏览(38)
  • 入职从零到一:如何快速学习Git以适应工作环境

    本文并非面向完全的 Git 初学者,也不会详细介绍每一个 Git 命令和它的所有选项。相反,本文的目标读者是那些已经有一些基础,至少知道如何在本地仓库进行基本的版本控制操作,包括 git add , git commit 和 git log ,但是还没有在企业环境中真正使用 Git 进行过项目开发的开

    2024年02月11日
    浏览(61)
  • 从零到一的方法:学习视频剪辑与嵌套合并技巧

    随着社交媒体和数字技术的快速发展,视频制作已是常见的工作。那么如何批量嵌套合并视频呢?下面一起来看云炫AI智剪如何批量合并的方法。 嵌套合并后的视频截图查看。 批量嵌套合并的操作: 操作1、在云炫AI智剪上选择“嵌套合并”功能,切换相应的版块。 操作2、把

    2024年02月02日
    浏览(49)
  • 纯编程从零到一创建图书管理系统V1.0

    上一篇文章 答应了道友们通过ChatGpt制作图书管理系统程序,今天第一版LMS(Library Management System)他来了,完整版代码放在在文末,有基础的道友可以 点此跳转,在安装中遇到问题,可以点击此处查看解决方案 效果图 功能列表 1、搜索图书只显示符合条件的图书所在行 2、添加

    2024年01月17日
    浏览(39)
  • 从零到一,接入广告后如何让你的APP顺利实现冷启动?

    ​很多APP在上线后却面临着变现难的问题。其中一个主要原因就是缺乏有效的广告变现经验。而当这些APP开始接入广告时,又面临着如何顺利冷启动的问题。 本文将为您介绍一些关键的步骤和技巧,帮助您的APP在接入广告后成功实现冷启动。 提高用户留存率 广告变现不仅仅

    2024年02月06日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包