android驱动开发从零到一

本文详细介绍了在Ubuntu虚拟机环境下,如何进行安卓11驱动开发,包括下载谷歌或rk3568源码,编译源码,编写驱动文件,构建内核镜像,烧写至rk3568开发板,并检查驱动运行状态。内容涵盖make命令、内核模块编译、驱动加载到内核或作为模块,以及ko文件的传输和加载。
摘要由CSDN通过智能技术生成

安卓驱动开发过程

机器介绍

本人是在win10里安装vmware workstation16软件,然后在vmware里创建了ubuntu18.04系统的虚拟机
在这里插入图片描述

安卓开发板用的是北京迅为的rk3568开发板
在这里插入图片描述

步骤

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/17YcCoMyvgi_mi8Cqtq16mg?pwd=1dae
提取码: 1dae

在这里插入图片描述

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

有如下选项
在这里插入图片描述
我这里选择55
成功后提示
在这里插入图片描述
解释一下选择问题,无论是谷歌下载的源码还是rk3568提供的源码,都一样的解释
在这里插入图片描述

2.开始编译

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

这里的j12就是12个并行任务,你可以根据自己的cpu核数设定,之后就是等待编译成功
在这里插入图片描述

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
在这里插入图片描述

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"


在这里插入图片描述
至此,构建内核镜像的所有设置,都在各级的Kconfig中写好了,下面使Kconfig生效。
进入kernel文件夹,制作总的config文件

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
出现了以上的图说明我们Kconfig设置成功了。
此时,会在kernel文件夹下生成一个汇总的.config隐藏文件
如图所示:
在这里插入图片描述
文件的内容如下:
在这里插入图片描述
这里 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文件

即:
在这里插入图片描述
helloworld是在drivers/char文件夹下的,需要在char文件夹的Makefile中加入编译helloworld模块的操作步骤

obj-$(CONFIG_helloworld)        += helloworld/

在这里插入图片描述
至此Makefile是设置完成了。

s4:构建内核镜像

很简单,进入android源码文件夹,根据自己的需求制作所需的镜像。
最终构建镜像时,设置一下屏幕文件的参数,文件在以下文件夹中
在这里插入图片描述
rk3568 的屏幕文件是
在这里插入图片描述
在这里插入图片描述

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

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

开始build 构建镜像

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

内核镜像位置:
在这里插入图片描述

build.sh后面的参数含义
在这里插入图片描述

s5小结:

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

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

生成的内核镜像路径在以下路径中
在这里插入图片描述
其他镜像的构建,请使用不同的参数,生成的img镜像也在别的路径中

buntu:~/Android/rk_android11.0_sdk/rockdev/Image-rk3568_r$

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

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

在这里插入图片描述
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文件

成功后弹出以下界面:
在这里插入图片描述
退出此界面后,我们看看是否生成了我们需要的.config文件
在这里插入图片描述
生成了,下面开始编译ko文件

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

在这里插入图片描述

s4.把ko文件传至开发板

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

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

我是在开发板里新建了一个文件夹:
在这里插入图片描述
把驱动ko文件传至此文件夹,这个过程有点曲折,步骤如下:

1.我先是把helloworld2.ko文件放到了win10的任意文件夹内,我的是z:盘里了
2.通过adb push命令把文件传送至开发板的安卓系统里
在这里插入图片描述

传好的结果如下图
在这里插入图片描述

s5.加载驱动(insmod命令)

首先要进入root权限,运行 su 命令
在这里插入图片描述
其次进入ko文件所在文件夹,运行insmodrmmod命令加载和卸载驱动
在这里插入图片描述

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

在这里插入图片描述

### 回答1: Git是一种版本控制系统,用于记录代码的改动,协作开发,和代码管理。Git有很多功能和优势,但一开始学习可能会感到困难,因为它的术语和操作需要一些时间来理解。下面是一个简单的教程,用于介绍Git的基本概念和用法: 1.安装Git:首先你需要下载Git,并按照安装向导进行安装。在Windows系统中,你将看到有一个新的Git Bash窗口,用来输入Git命令。 2.创建仓库:如果你想要将一个项目加入Git进行版本控制,那么你首先需要在你的本地计算机上创建一个仓库。打开Git Bash窗口,输入如下命令来创建一个名为MyProject的仓库: mkdir MyProject cd MyProject git init 3.添加文件:现在,你已经有一个新的仓库,但它是空的。你可以使用命令添加项目中的文件到仓库中。 git add . 4.提交代码:当你改动了文件并想要将它们保存到Git仓库时,你需要使用提交指令。 git commit -m "这里输入你的提交信息" 5.推送至远程仓库:一旦你的本地仓库中的代码得到了提交,并想要在分支中共享它们,你可以使用如下命令将提交的代码推送至远程仓库。 git push origin master 通过以上的5个简单步骤,就可以将你的项目加入到Git中进行版本控制,管理和协作开发了。这是最简单、最清晰易懂的Git使用教程。这里面还有许多更多的高级含义,例如Git的分支,标签,拉取,合并等等,掌握这些功能,需要更进一步的学习和实践。 ### 回答2: Git是一个强大的版本控制系统,它是程序员必须掌握的技能之一。但是,学习Git可能会令人感到有些困难,因为它有其特定的术语和工作流程。下面将为大家提供一份最详细最傻瓜的Git使用教程。 一. Git的安装 首先,你需要安装Git客户端。在Windows系统上可以使用Git Bash或Git GUI, 在Mac或Linux系统上可以使用Git命令行工具。 Git官方网站提供了Git客户端的下载或者直接在命令行使用安装命令进行安装。 二. Git配置 在安装Git之后,你需要对Git进行配置。 通过运行以下两个命令,你可以设置你的用户名和电子邮件地址,这将用于你提交的每个代码的作者身份标记。 git config --global user.name "Your Name" git config --global user.email "youremail@yourdomain.com" 三. 创建和克隆仓库 在Git中,你可以使用init命令创建一个新的仓库。 mkdir mynewproject cd mynewproject git init 你也可以使用clone命令从一个现有仓库进行克隆。 git clone https://github.com/youruser/yourproject.git 四. Git基本的工作流程 在Git中,你需要使用工作区,暂存区和版本库来管理代码。 首先,你需要将代码添加到暂存区中以进行跟踪。 git add myfile.py 然后,你需要将更改提交到版本库中。 git commit -m "Added new feature to myfile.py" 在有多个开发人员协同工作的项目中,每个人都应该在开始工作之前使用pull命令获取最新的代码版本。 git pull 然后,进行开发和更改后,如果你想将更改推送到远程仓库并与团队共享,请使用push命令。 git push origin master 五. Git常用命令 在Git中,你需要掌握以下常用命令。 - git init - 初始化仓库 - git clone - 克隆一个现有仓库 - git add - 添加文件或文件夹 - git commit - 将更改提交到版本库中 - git push - 推送更改到远程仓库 - git pull - 拉取最新的代码版本 - git status - 显示当前代码的状态 - git branch - 显示所有分支 - git checkout - 切换到另一个分支 - git merge - 合并两个分支 - git diff - 显示两个版本之间的差异 六. Git的分支管理 分支是Git最重要的特性之一。在开发过程中,团队中的每个成员都应该使用自己的分支。下面是一些有用的分支管理命令。 - git branch - 列出所有分支 - git branch newbranch - 创建一个新分支 - git checkout branchname - 切换到另一个分支 - git merge branchname - 将分支的更改合并到当前分支中 - git branch -d branchname - 删除特定的分支 七. 总结 本篇文章提供了Git使用教程最详细最傻瓜的步骤和命令列表。如果你是初学者,建议先从一些简单的Git使用场景入手,然后扩展到更复杂的方法。如果你在使用Git时遇到问题,请在Stack Overflow或其他技术社区寻求帮助。总之,使用Git来管理你的代码将大大提高你的编程效率。 ### 回答3: Git 是一款非常流行的源代码管理工具,它具有分布式、速度快、支持大型项目等优点。但对于初学者来说,可能会觉得 Git 使用起来有些困难和复杂。 以下是 Git 使用教程最详细最傻瓜的步骤: 第一步:安装 Git 工具 需要在官网上下载并安装 Git 工具。macOS 和 Linux 系统已经内置了 Git,只需在终端中输入 git --version 即可查看是否已安装 Git。 第二步:创建本地仓库 首先在本地新建一个文件夹,然后通过终端进入该文件夹。在终端输入 git init,该文件夹就会成为一个本地的 Git 仓库。 第三步:添加文件 在该文件夹中添加需要版本管理的文件,然后在终端中输入 git add .,用来把文件添加到暂存区。 如果只想提交某个文件,则可以使用 git add 文件名 的形式。 第四步:提交文件 在终端中输入 git commit -m "描述信息",用来将文件提交到本地 Git 仓库中。其中描述信息是对此次提交的说明,可以写明本次提交的内容、修改的文件以及其他需要说明的信息。 第五步:创建远程仓库 在 Github 等代码托管平台中创建一个仓库,用于同步本地 Git 仓库中的代码。 然后通过 git remote add origin 远程仓库地址 的方式将本地仓库与远程仓库关联起来。 第六步:推送到远程仓库 在终端中输入 git push -u origin master 将本地仓库的代码上传到远程仓库中。这里 origin 是远程仓库的别名,master 表示上传到主分支中。 之后每次提交代码时,只需执行 git push 命令即可将修改的代码推送到远程仓库中。 以上就是 Git 使用教程最详细最傻瓜的步骤,尽管 Git 使用起来可能不是那么容易,但只要跟着这些简单的步骤操作,就能够轻松地做到版本管理。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值