如何在Android中编译驱动模块 .ko

简介

调试驱动比较简单快捷的方式,是将驱动程序编译成模块,方便快速迭代修改/debug,但是编译如果每次都要make bootimages, 会非常影响开发速度,所以需要有一个相对快捷的方法来直接编译出模块。

Linux方式

Makefile文件写法

obj-m = spi_mcu.o

KDIR := /lib/modules/`uname -r`/build

PWD := $(shell pwd)

all:
	$(MAKE) -C $(KDIR) M=$(PWD) modules

install:all
	$(MAKE) -C $(KDIR) M=$(PWD) modules_install

clean:
	$(MAKE) -C $(KDIR) M=$(PWD) clean

C文件写法

#include <linux/init.h>
#include <linux/module.h>

static int spi_mcu_init(void)
{
    return 0;
}

static void spi_mcu_exit(void)
{
}

module_init(spi_mcu_init);
module_exit(spi_mcu_exit);

命令行直接make

$ make
make -C /lib/modules/`uname -r`/build M=spi_mcu modules
make[1]: Entering directory `/usr/src/linux-headers-4.4.0-142-generic'
  Building modules, stage 2.
  MODPOST 1 modules
make[1]: Leaving directory `/usr/src/linux-headers-4.4.0-142-generic'
$ file spi_mcu.ko 
spi_mcu.ko: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), BuildID[sha1]=d9a1f37ba99e329384a87b9cb699ed8c1388cc7e, not stripped

生成的是一个X86-64的驱动,适合在pc上安装,不是在Android/ARM设备上安装,下面我们看下arm的方式。

Android方式

obj-m = spi_mcu.o

KDIR := ${OUT}/obj/KERNEL_OBJ/

PWD := $(shell pwd)

all:
	$(MAKE) -C $(KDIR) M=$(PWD) ARCH=arm64 $(KDIR).config modules

install:all
	$(MAKE) -C $(KDIR) M=$(PWD) modules_install

clean:
	$(MAKE) -C $(KDIR) M=$(PWD) clean

将Makefile稍加修改即可,编译得到64位的驱动模块

$ file spi_mcu.ko 
spi_mcu.ko: ELF 64-bit LSB relocatable, ARM aarch64, version 1 (SYSV), BuildID[sha1]=26d68644cfba0bcf91b3af970c8b7b11c4048029, not stripped

问题

编译提示以下问题,google准备弃用GPL的gcc,采用BSD授权的clang/LLVM,要试一下编译的ko是否可以正常工作。

Android GCC has been deprecated in favor of Clang, and will be removed from
Android in 2020-01 as per the deprecation plan in:
https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86/+/master/GCC_4_9_DEPRECATION.md

结果

在板子上可以正确insmod,debug阶段这样比较快速,集成到系统里面可以直接放入到kernel当中编译

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值