android驱动开发从零到一

article/2025/10/25 16:30:41

目录

  • 安卓驱动开发过程
    • 机器介绍
    • 步骤
  • step1:下载android11源码
    • 一、谷歌的源码下载:
    • 二、rk3568提供的源码下载:
  • step2:编译android源码(make命令)
    • 1.编译的几个选项
    • 2.开始编译
  • step3:编写驱动文件
  • step4:开始构建镜像(build.sh)
    • 两种驱动编译方式
      • 1.驱动编译到内核介绍:
      • 2.驱动编译成内核模块介绍:
    • m1.驱动编译到内核实战
      • s1.drivers文件夹内创建自己的驱动文件夹并写入驱动文件。
      • s2.构建镜像时的各模块的设置
      • s3. 根据设置,确定编译构建内核的步骤
      • s4:构建内核镜像
      • s5小结:
    • m2.驱动编译成内核模块实战
      • s1.先建立一个文件夹放置驱动c文件和Makefile
      • s2.生成Makefile所需的.config文件
      • s3.编译ko文件(make命令)
      • s4.把ko文件传至开发板
      • s5.加载驱动(insmod命令)
  • step5:烧写镜像至开发板
  • step6:查看驱动是否运行成功

安卓驱动开发过程

机器介绍

本人是在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/16nucdvOIcBgCWMw7_aCyUQ?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 helloworldbool "hellworld support"default yhelphelloworld 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

在这里插入图片描述


http://chatgpt.dhexx.cn/article/oCpuJyjs.shtml

相关文章

移动应用开发——安卓仓储管理系统

移动应用开发系统 仓储管理系统 安卓java语言编写 安卓课设项目-仓储管理系统 需求分析 1.1项目背景。&#xff08;5分&#xff09; 随着计算机的应用普及&#xff0c;目前大多数企业的仓库管理数据资料已开始采用计算机数据系统管理&#xff0c;但数据还是采用先纸张记录、再…

这是一份全面详细的Android 车载系统开发入门指南

目前的就业形势越来越严峻&#xff0c;很多大中小厂因为业务停滞不前都选择“精简人员”&#xff0c;节约成本。对于Android开发来说&#xff0c;市场的冷静&#xff0c;明显可以感知到企业招聘门槛的提高。就未来发展来说&#xff0c;选择一个正处于时代风口的细分领域深耕最佳…

收藏这份Android Framework开发入门指南,带你步入Android系统开发的殿堂

最近发现Android应用开发者都对Framework有着浓厚的兴趣&#xff0c;而且很多非移动开发的也在咨询Framework相关的技术。 针对广大对Android系统充满着好奇&#xff0c;或迫切需要掌握底层原理但苦于自学难度太大的伙伴&#xff0c;这里为大家分享一份《Android Framework高级…

Android开发

一、Android 1、安卓&#xff08;Android&#xff09;是一种基于Linux内核&#xff08;不包含GNU组件&#xff09;的自由及开放源代码的操作系统。 2、主要使用于移动设备&#xff0c;如智能手机和平板电脑&#xff0c;由美国Google公司和开放手机联盟领导及开发。 3、Android…

《应用系统开发》安卓期末结课作业

目录 一、引言... 3 1.1 设计目的... 3 1.2 项目背景... 3 二、需求分析... 3 2.1 用户需求... 3 2.2 功能要求... 4 2.项目概况... 4 三、系统设计... 4 3.1功能分析... 4 3.2 程序层次图... 4 四、功能实现... 5 4.1 注册登录模块... 5 4.2 会话模块... 9 4.3 …

【Android开发】考试系统

【Android开发】考试系统 文章目录 【Android开发】考试系统 一、开发环境需求二、系统功能设计三、运行结果1. 欢迎界面2. 主界面3. 答题界面 四、主要代码1. WelcomeActivity.java2. activity_classics.xml以上是主要代码&#xff0c;完整文件可点击链接下载 一、开发环境需求…

安卓进阶之android系统架构

安卓进阶之android架构 安卓进阶躲不开阅读源码和深入了解安卓的底层&#xff0c;这是一篇入门级别的文章&#xff0c;可以对安卓架构有个大体的认识。 AOSP与Android系统架构 首先要理解andriod和AOSP的关系&#xff0c;我们日常开发的安卓跟市面上的安卓不是一个意思&…

android开发流程

Step1:安装开发环境 下载安卓studio安装包&#xff0c;安装安卓的开发环境后&#xff0c;配置AVD和测试设备&#xff0c;并通过HelloWorld测试整个平台的各项功能。 Step2:开发阶段 XML文件完成用户界面的组件定义和布局。 Java源程序代码主要实现用户界面的交互功能和数台…

Android系统开发篇(二) —— 建立Android系统开发环境之Ubuntu 20.04.4 LTS

书接上文&#xff0c;上文中我们主要介绍了虚拟机环境的搭建&#xff0c;那么接下来我们继续还是来说说Android系统开发环境的搭建&#xff0c;Ubuntu系统的安装和配置&#xff01; 上文我们说到虚拟机的新建了且已经搭载了Ubuntu 20.04.4LTS系统&#xff0c;当然你也可以选择…

干货|Android系统定制开发基础篇

一、Android源码目录结构 Android系统源码内容实在太广&#xff0c;其目录结构也实在庞大&#xff0c;每位开发者也无法做到对每一块都弄明白&#xff0c;工作中接触的也只是其中的一小部分。以下只从宏观上对系统源码的一级目录进行介绍&#xff0c;后续再慢慢完善更细致的内…

Android系统开发 ----- 系统服务开发

系列文章目录 Android系统启动 ---- 主要流程类_MrDarly的博客-CSDN博客Android系统启动Zygote关系主要的类https://blog.csdn.net/weixin_68948960/article/details/125310042 前言 Android系统开发之系统服务开发。 问题&#xff1a;用户操作无界面&#xff0c;但是需要An…

安卓开发入门基础

文章目录 一、APP的运行环境&#xff1a;二、APP的开发语言1.java2.Kotlin3.C/C4.XML 三、APP的数据库四、APP的工程结构配置模块级别的build.gradle清单文件 五、APP的界面显示和逻辑处理 一、APP的运行环境&#xff1a; 首先APP运行在Android系统之上&#xff0c;Android系统…

安卓Android开发快速入门

配合天哥视频食用更佳&#xff1a;【天哥】Android开发视频教程最新版 Android Studio开发 UI组件&#xff08;控件&#xff09; 布局管理器 LinearLayout&#xff08;线性布局&#xff09; 可嵌套 最常用属性 id 起标记布局的作用 layout_width [wrap_content根据内容选…

安卓开发—Android基础

安卓开发—Android基础 移动开发 移动开发也叫做移动互联网开发。是指以手机、PDA、UMPC等便携终端为基础&#xff0c;进行相应的开发工作&#xff0c;由于这些随身设备基本都采用无线上网的方式&#xff0c;业内也称作为无线开发。 移动应用包括早期的WM掌上助理设备&#…

为什么要自建量化交易平台?

量化交易平台概述 量化交易是指借助现代统计学和数学的方法&#xff0c;利用计算机技术来进行交易的投资方式。它从历史数据中选择经数量模型验证的大概率事件制定策略&#xff0c;通过严格执行来获得持续稳定的超额回报。它具有严格的纪律性、完备的系统性、善用套利思想、依靠…

easytrader 量化交易平台连接同花顺软件使用平安证券

参考&#xff1a;https://easytrader.readthedocs.io/zh/master/usage/#_15 https://blog.csdn.net/iycai/article/details/107592462 *** 安装&#xff1a;pip install easytrader import easytraderuser easytrader.use(ths) #其他券商专用同花顺客户端需要提前下载同花…

量化交易平台设计浅谈

“买入前10只现价创一年新高的股票&#xff0c;合计10万元平均分配&#xff0c;限价下单”&#xff0c;这是一个交易策略&#xff1b;运行该交易策略所需要的实时行情、历史行情、事件处理、风控、下单接口、回测统计等模块&#xff0c;就是交易系统平台。 从投资机构的角度考…

Lean — 优秀好用的开源量化交易平台

Lean 是 QuantConnect 开源的一款非常强大的开源量化交易平台&#xff0c;可以回测或运行Python或者C#写的策略&#xff0c;并在代码仓库中内置了上百个C#和Python的策略算法。 这个开源的算法交易引擎&#xff0c;专为让用户方便轻松地进行策略研究、回测和实时交易而构建。它…

基于聚宽量化交易平台实现量化交易策略

一、入门量化策略 JoinQuant聚宽API文档&#xff1a;https://www.joinquant.com/help/api/help?nameapi 1、策略内容 设置股票池为沪深300的所有成分股 如果当前股价小于10元/股且当前不持仓&#xff0c;则买入&#xff1b; 如果当前股价比买入时上涨了25%&#xff0c;则清仓止…

手把手搭建Python量化交易平台-1:系统架构

个人量化交易的系统架构图&#xff1a; 个人量化交易平台特点&#xff1a; 个性化&#xff1a;开源参考设计 自行个性化设计数据化&#xff1a;python数据分析可视化&#xff1a;phthon前台显示智能化&#xff1a;人工智能及机器学习自动化&#xff1a;通过自动化机制&#x…