编译驱动到内核:内核驱动源码创建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和3。 方法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
|
|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )
GMT+8, 2024-11-16 17:56
Powered by Discuz! X3.4
© 2001-2013 Comsenz Inc.