编译驱动到内核
内核驱动源码创建hello文件夹,添加hello.c和Makefile文件,修改父目录/kernel/drivers/Makefile文件,执行全编译操作。
修改如下:
/hello/Makefile内容如下:obj-y += hello.o
/kernel/drivers/Makefile添加如下代码:obj-y += hello
编译驱动成模块
方法1:
内核源码/drivers创建hello文件夹,添加hello.c和Makefile文件,修改父目录/kernel/drivers/Makefile文件,执行全编译操作。
修改如下:
/drivers/hello/Makefile内容如下:obj-m += hello.o
/kernel/drivers/Makefile添加如下代码:obj-y += hello
再执行./build.sh kernel脚本编译内核,即可在/drivers/hello目录下生成ko模块。
缺点:耗时太长
方法2:
内核驱动源码中创建hello文件夹,添加hello.c和Makefile文件,修改父目录/kernel/drivers/Makefile文件,修改/kernel/Makefile文件添加架构和交叉编译器,执行make modules命令。
修改如下:
/hello/Makefile内容如下:obj-m += hello.o
/kernel/drivers/Makefile添加如下代码:obj-y += hello
优点:执行make ARCH=arm64 modules命令,只会编译模块,编译时间缩短。
缺点:需要将驱动源码添加到内核当中,不便于查找修改;另外make modules命令会判断源码被配置成模块都会被编译。
方法3:
新建任意路径hello文件夹,添加hello.c和Makefile文件,/hello/Makefile文件添加架构和交叉编译器,在hello.c文件目录下执行make命令。
/hello/Makefile编写如下代码。
优点:执行make ARCH=arm64命令即可,只会单独编译hello.c驱动文件。
附录:
hello.c
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello World enter\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Hello World exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_DESCRIPTION("A Sample Hello World Module");
MODULE_ALIAS("A Sample module");
Makefile
KERNELDIR := /home/forlinx/OK3568-linux-source/kernel/
CURRENT_PATH := $(shell pwd)
obj-m := hello.o
build: kernel_modules
kernel_modules:
$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules \
ARCH=arm64 \
CROSS_COMPILE=/home/forlinx/OK3568-linux-source/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
clean:
$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean
版权声明:本文为qq_42952079原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。