整体编译Ko文件添加方式
1. 添加模块驱动流程
1.1 添加驱动源文件
进入到module_driver目录下,在devices/目录下添加要添加的外设模块文件夹,这里以test为例子
在test文件夹下添加test.c文件与对应Makefile文件
在其Makefile中编写如下内容:
模块名称不要和生成依赖的名称一致,obj-m则表示将设备编译成模块,若不想编译成模块则obj-y
include $(DRIVERS_DIR)/tools/common_module.mk #包含编译模块所用到的工具
MODULE_NAME := tests #模块名称
module-y += test.o #生成模块所依赖的文件
KBUILD_EXTRA_SYMBOLS := $(DRIVERS_DIR)/drivers/utils/Module.symvers
obj-m := $(MODULE_NAME).o #编译生成模块
$(MODULE_NAME)-y = $(module-y)
在test.c文件中编写如下内容:
#include <linux/module.h> //模块加载对应头文件
static int __init test_init(void) //模块加载调用的函数
{
printk(KERN_ERR "test module init\n");
return 0;
}
static void __exit test_exit(void) //模块卸载调用函数
{
printk(KERN_ERR "test module exit\n");
}
module_init(test_init); //模块加载函数
module_exit(test_exit); //模块卸载函数
MODULE_DESCRIPTION("test"); //模块描述
MODULE_LICENSE("GPL"); //模块所用协议
1.2 添加编译文件
进入到module_driver下的package/devices/other目录,创建test文件夹和其下目录Config.in和test.mk:
在test.mk中编写如下内容:
package_name = tests #模块包名称
package_depends = #模块依赖包名称,若赋值则优先编译
package_module_src = devices/test #需要编译的文件目录,该目录下包含编译模块的makefile文件
package_finalize_hook = test_finalize_hook #定义在模块编译之前的操作
package_make_hook = #定义模块的编译方式
package_init_hook = #定义在模块编译之前的操作
package_clean_hook = #定义用来清理文件
test_init_file = output/test.sh #初始化将要执行的脚本文件
define test_finalize_hook
$(Q)cp devices/test/tests.ko output/
$(Q)echo -n 'insmod tests.ko ' > $(test_init_file)
$(Q)echo >> $(test_init_file)
endef
同时,在other.mk文件中添加对于编译规则,通过Iconfig设置的宏决定是否加入编译:
package-$(MD_TEST) += package/devices/other/test/test.mk
2. 添加Iconfig菜单说明
在module_driver/package/devices/other/test/Config.in文件中编写菜单,并在Iconfig中选择将其编译进工程:
config MD_TEST //模块宏的名称
bool "test module" //模块描述
default n //默认选项,不选择,需要在IConfing中勾选
并在上一级Config.in中添加索引,将该宏添加进来:
source /package/devices/other/test/Config.in
在Iconfig中将宏选中并保存
3. 查看运行效果
当执行完上述添加流程,就可以开始编译模块了
cd linux/build //进入到你的linux目录下的build目录
make x2000_darwin_v20_debug_nand_defconfig //编译刚才保存的defconfig文件
make
之后若只改动module_driver目录下的内容时候,则只需要按照下面流程操作
make app_module_driver //编译module_driver
make buildroot //编译文件系统
当我们编译module_driver时,可以发现生成了tests.ko文件,说明模块编译成功:
烧录进开发板,打开串口,输入lsmod命令,看到tests,说明模块加载成功:
# lsmod
Module Size Used by Tainted: G
x2000_icodec_sound_card 2405 0
tests 744 0