如何在Android系统上单编ko?

文章目录

  • 一、先了解编译驱动需要什么?
  • 二、配置makefile
    • 1、在Android系统编译LOG上找到编译器信息(一般都会打印出来)
    • 2、基于源MK构造 可独立运行的makefile
    • 3)进入docker,在此makefile目录下敲make
    • 4)最后根据项目不同 动态调整!
  • 三、源MK

一、先了解编译驱动需要什么?

1、完整编译kernel的环境,驱动编译需要依赖kernel的生成物;
2、编译器及编译选项;
3、将所需环境变量配置在当前mk里;
注意只适用于ko模块编译

二、配置makefile

1、在Android系统编译LOG上找到编译器信息(一般都会打印出来)

如下
[2025-03-06T15:17:09.378Z] make -C /home/code/android/kernel/5.15_14 ARCH=arm CROSS_COMPILE=/home/code/android/prebuilts/mtk_toolchain/gcc-arm-linux-gnu-5.5.0-ubuntu/x86_64/bin/arm-linux-gnueabi- LOADADDR=0x20008000 NM=/home/code/android/kernel/build-master/prebuilts/clang/host/linux-x86/clang-r487747c/bin/llvm-nm AR=/home/code/android/kernel/build-master/prebuilts/clang/host/linux-x86/clang-r487747c/bin/llvm-ar LD=/home/code/android/kernel/build-master/prebuilts/clang/host/linux-x86/clang-r487747c/bin/ld.lld OBJDUMP=/home/code/android/kernel/build-master/prebuilts/clang/host/linux-x86/clang-r487747c/bin/llvm-objdump OBJCOPY=/home/code/android/kernel/build-master/prebuilts/clang/host/linux-x86/clang-r487747c/bin/llvm-objcopy LLVM=1 LLVM_IAS=1 CC=/home/code/android/kernel/build-master/prebuilts/clang/host/linux-x86/clang-r487747c/bin/clang O=/home/code/android/out/target/product/mt9633/obj/KERNEL_OBJ/5.15_14 BUILD_NUMBER= mtk_dtv_platform=mt5873 olddefconfig
[2025-03-06T15:17:09.378Z] make[2]: Entering directory ‘/home/code/android/kernel/5.15_14’
[2025-03-06T15:17:09.378Z] make[3]: Entering directory ‘/home/code/android/out/target/product/mt9633/obj/KERNEL_OBJ/5.15_14’

2、基于源MK构造 可独立运行的makefile

ccflags-y += -DANDROID_PLATFORM
KDIR ?= /home/builder/code/android/out/target/product/mt9633/obj/KERNEL_OBJ/5.15_14
ARCH ?= arm
CROSS_COMPILE ?= /home/code/android/prebuilts/mtk_toolchain/gcc-arm-linux-gnu-5.5.0-ubuntu/x86_64/bin/arm-linux-gnueabi-
OTHER_PARAMS ?= LOADADDR=0x20008000 NM=/home/code/android/kernel/build-master/prebuilts/clang/host/linux-x86/clang-r487747c/bin/llvm-nm AR=/home/code/android/kernel/build-master/prebuilts/clang/host/linux-x86/clang-r487747c/bin/llvm-ar LD=/home/code/android/kernel/build-master/prebuilts/clang/host/linux-x86/clang-r487747c/bin/ld.lld OBJDUMP=/home/code/android/kernel/build-master/prebuilts/clang/host/linux-x86/clang-r487747c/bin/llvm-objdump OBJCOPY=/home/code/android/kernel/build-master/prebuilts/clang/host/linux-x86/clang-r487747c/bin/llvm-objcopy LLVM=1 LLVM_IAS=1 CC=/home/code/android/kernel/build-master/prebuilts/clang/host/linux-x86/clang-r487747c/bin/clang

all: modules
modules:
make -C ( K D I R ) M = (KDIR) M= (KDIR)M=(PWD) ARCH= ( A R C H ) C R O S S C O M P I L E = (ARCH) CROSS_COMPILE= (ARCH)CROSSCOMPILE=(CROSS_COMPILE) $(OTHER_PARAMS) modules
$(CROSS_COMPILE)strip --strip-debug aic8800_fdrv/aic8800_fdrv.ko
$(CROSS_COMPILE)strip --strip-unneeded aic8800_fdrv/aic8800_fdrv.ko
$(CROSS_COMPILE)strip --strip-debug aic_load_fw/aic_load_fw.ko
$(CROSS_COMPILE)strip --strip-unneeded aic_load_fw/aic_load_fw.ko

//$(CROSS_COMPILE)strip --strip-debug 裁剪ko,去掉冗余信息,由于Android系统会统一后处理,不会体现在单个模块的mk里,需要加上

3)进入docker,在此makefile目录下敲make

4)最后根据项目不同 动态调整!

三、源MK

CONFIG_AIC_LOADFW_SUPPORT := m
CONFIG_AIC8800_WLAN_SUPPORT := mobj-$(CONFIG_LOADFW_SUPPORT)    += load_fw/
obj-$(CONFIG_WLAN_SUPPORT) += fdrv/# Platform support list
CONFIG_PLATFORM_ROCKCHIP ?= n
CONFIG_PLATFORM_ALLWINNER ?= n
CONFIG_PLATFORM_AMLOGIC ?= y
CONFIG_PLATFORM_UBUNTU ?= nifeq ($(CONFIG_PLATFORM_ROCKCHIP), y)
#KDIR := /home/yaya/E/Rockchip/3229/Android7/RK3229_ANDROID7.1_v1.01_20170914/rk3229_Android7.1_v1.01_xml0914/kernel
#ARCH ?= arm
#CROSS_COMPILE ?= /home/yaya/E/Rockchip/3229/Android7/RK3229_ANDROID7.1_v1.01_20170914/rk3229_Android7.1_v1.01_xml0914/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-
KDIR  := /home/yaya/E/Rockchip/3229/Android9/rk3229_android9.0_box/kernel
ARCH ?= arm
CROSS_COMPILE ?= /home/yaya/E/Rockchip/3229/Android9/rk3229_android9.0_box/prebuilts/gcc/linux-x86/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
#KDIR  := /home/yaya/E/Rockchip/3399/rk3399-android-10/kernel
#ARCH ?= arm64
#CROSS_COMPILE ?= /home/yaya/E/Rockchip/3399/rk3399-android-10/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
ccflags-y += -DANDROID_PLATFORM
endififeq ($(CONFIG_PLATFORM_ALLWINNER), y)
KDIR  := /home/yaya/E/Allwinner/R818/R818/AndroidQ/lichee/kernel/linux-4.9
ARCH ?= arm64
CROSS_COMPILE ?= /home/yaya/E/Allwinner/R818/R818/AndroidQ/lichee/out/gcc-linaro-5.3.1-2016.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
ccflags-y += -DANDROID_PLATFORM
endififeq ($(CONFIG_PLATFORM_AMLOGIC), y)
ccflags-y += -DANDROID_PLATFORM
ARCH := arm
CROSS_COMPILE := /home/yaya/D/Workspace/CyberQuantum/JinHaoYue/amls905x3/SDK/20191101-0tt-asop/android9.0/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androidkernel-
KDIR := /home/yaya/D/Workspace/CyberQuantum/JinHaoYue/amls905x3/SDK/20191101-0tt-asop/android9.0/out/target/product/u202/obj/KERNEL_OBJ/endififeq ($(CONFIG_PLATFORM_UBUNTU), y)
KDIR  := /lib/modules/$(shell uname -r)/build
PWD   := $(shell pwd)
KVER := $(shell uname -r)
MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/
ARCH ?= x86_64
CROSS_COMPILE ?=
endifall: modules
modules:make -C $(KDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modulesinstall:mkdir -p $(MODDESTDIR)install -p -m 644 load_fw/fw.ko  $(MODDESTDIR)/install -p -m 644 fdrv/fdrv.ko  $(MODDESTDIR)//sbin/depmod -a ${KVER}uninstall:rm -rfv $(MODDESTDIR)/fw.korm -rfv $(MODDESTDIR)/fdrv.ko/sbin/depmod -a ${KVER}clean:cd aic_load_fw/;make clean;cd ..cd aic8800_fdrv/;make clean;cd ..rm -rf modules.order Module.symvers .tmp_versions/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/76203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Pandas】pandas DataFrame to_numpy

Pandas2.2 DataFrame Conversion 方法描述DataFrame.astype(dtype[, copy, errors])用于将 DataFrame 中的数据转换为指定的数据类型DataFrame.convert_dtypes([infer_objects, …])用于将 DataFrame 中的数据类型转换为更合适的类型DataFrame.infer_objects([copy])用于尝试…

2025常用的ETL 产品推荐:助力企业激活数据价值

在当今数字化时代,企业面临着海量数据的挑战与机遇,ETL(Extract, Transform, Load)工具作为数据整合与分析的关键环节,其重要性日益凸显。ETL 厂商众多,各有优势,本文将从多个维度进行分析&…

LeetCode算法题(Go语言实现)_37

题目 给你一棵以 root 为根的二叉树,二叉树中的交错路径定义如下: 选择二叉树中 任意 节点和一个方向(左或者右)。 如果前进方向为右,那么移动到当前节点的的右子节点,否则移动到它的左子节点。 改变前进方…

博途 TIA Portal之1200做从站与汇川EASY的TCP通讯

上篇我们写到了博途做主站与汇川EASY的通讯。通讯操作起来很简单,当然所谓的简单,也是相对的,如果操作成功一次,那么后面就很容易了, 如果操作不成功,就会很遭心。本篇我们将1200做从站,与汇川EASY做主站进行TCP的通讯。 1、硬件准备 1200PLC一台,带调试助手的PC机一…

Mysql(继续更新)

INnoDB 三特性 事务 外键 行级锁(开启事务时,查询后加FOR UPDATE) MySQL 使用 InnoDB,在 默认隔离级别 —— REPEATABLE READ(可重复读) 下 开启事务,执行 UPDATE 时默认会加行锁 只要事务没有提交 这条数据会锁住 …

[IOI 1994] 数字三角形 Number Triangles

题目链接 思路(上到下): ①从上往下递推: f[i][j] max(f[i-1][j] g[i][j], f[i-1][j-1]g[i][j]) ②对最后一层,遍历一下,找到最大的答案。 代码(上到下): #inclu…

基于Qt的串口通信工具

程序介绍 该程序是一个基于Qt的串口通信工具,专用于ESP8266 WiFi模块的AT指令配置与调试。主要功能包括: 1. 核心功能 串口通信:支持串口开关、参数配置(波特率、数据位、停止位、校验位)及数据收发。 AT指令操作&a…

第5篇:Linux程序访问控制FPGA端LEDR<三>

Q:如何具体设计.c程序代码访问控制FPGA端外设? A:以控制DE1-SoC开发板的LEDR为例的Linux .C程序代码。头文件fcntl.h和sys/mman.h用于使用/dev/mem文件,以及mmap和munmap内核函数;address_map_arm.h指定了DE1-SoC_Com…

【学生管理系统升级版】

学生管理系统升级版 需求分析:注册功能:登录功能:验证码规则:忘记密码: 实操:系统主页面注册功能登录功能忘记密码效果演示 需求 为学生管理系统书写一个登陆、注册、忘记密码的功能。     只有用户登录成功之后&…

CSS Grid布局:从入门到放弃再到真香

Flexbox 与 Grid 布局:基础概念与特点 Flexbox Flexbox(Flexible Box Layout),即弹性盒布局模型,主要用于创建一维布局,能够轻松实现元素在一行或一列中的排列、对齐与分布。通过display: flex属性启用 Fl…

C++怎么调用类中的函数

1. 栈上对象 调用普通成员方法 普通成员方法需要通过类的对象实例&#xff08;或指针、引用&#xff09;来调用。 示例&#xff1a; class MyClass { public:void normalMethod() {std::cout << "普通成员方法被调用" << std::endl;} };int main() {M…

go游戏后端开发31:麻将游戏的碰牌与胡牌逻辑

以下是润色后的版本&#xff1a; 1. 碰牌逻辑 1.1 触发碰牌 当一个玩家弃牌后&#xff0c;其他玩家可以选择碰牌。如果当前玩家决定碰牌&#xff0c;系统需要通知所有玩家这一操作。碰牌操作完成后&#xff0c;当前玩家需要出一张牌&#xff0c;系统同样需要通知所有玩家。 …

十分钟机器学习之--------------线性回归

线性回归&#xff08;linear regression&#xff09;是一种基于数学模型的算法&#xff0c;首先假设数据集与标签之间存在线性关系&#xff0c;然后简历线性模型求解参数。在实际生活中&#xff0c;线性回归算法因为其简单容易计算&#xff0c;在统计学经济学等领域都有广泛的应…

学透Spring Boot — 017. 处理静态文件

这是我的《学透Spring Boot》专栏的第17篇文章&#xff0c;了解更多内容请移步我的专栏&#xff1a; Postnull CSDN 学透 Spring Boot 目录 静态文件 静态文件的默认位置 通过配置文件配置路径 通过代码配置路径 静态文件的自动配置 总结 静态文件 以前的传统MVC的项目…

深入理解 JavaScript 数组查找:如何高效获取特定元素

深入理解 JavaScript 数组查找&#xff1a;如何高效获取特定元素 深入理解 JavaScript 数组查找&#xff1a;如何高效获取特定元素引言问题场景解决方案1. 使用 Array.prototype.find()2. 处理 Proxy 对象的情况3. 备选方案&#xff1a;Array.prototype.filter()4. 传统 for 循…

HTML5+CSS3小实例:纯CSS绘制七巧板

实例:纯CSS绘制七巧板 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale…

[electron]自动注册IPC的解决方案

前言 主进程和渲染进程通过IPC进行通信&#xff0c;每次需要定义名称并注册&#xff0c;很多代码都是重复书写&#xff0c;并且如果主进程和渲染进程开发人员是同一个的话&#xff0c;很多东西都可以简化。 渲染进程通过ipcRenderer.invoke与主进程通信&#xff0c;主进程通过i…

JS—防抖和节流:1分钟掌握防抖和节流

个人博客&#xff1a;haichenyi.com。感谢关注 一. 目录 一–目录二–防抖三–节流四–进阶应用五–总结 二. 防抖&#xff08;Debounce&#xff09; 防抖&#xff08;Debebounce&#xff09;和节流&#xff08;Throttle&#xff09;都是前端开发中用于优化高频事件性能的两…

测试模板1

本篇技术博文摘要 &#x1f31f; 引言 &#x1f4d8; 在这个变幻莫测、快速发展的技术时代&#xff0c;与时俱进是每个IT工程师的必修课。我是盛透侧视攻城狮&#xff0c;一名什么都会一丢丢的网络安全工程师&#xff0c;也是众多技术社区的活跃成员以及多家大厂官方认可人员&a…

Nginx配置Http响应头安全策略,未设置X-Content-Type-Options响应头【原理扫描】

文章目录 前言一、漏洞扫描问题二、漏洞描述三、解决方法3.1、Nginx配置概览3.2、注意事项 四、感谢 前言 第三方安全检测机构甩过来一篇漏洞扫描报告&#xff0c;需要我们整改。 一、漏洞扫描问题 漏洞扫描问题如下&#xff1a; 未设置X-Content-Type-Options响应头【原理扫…