【背景】之前在S3C2440开发板上学习驱动的时候,经常使用动态编译,生成模块化的驱动文件KO,然后使用insmod命令动态的把驱动安装到系统中。
现在手中有一个msm8909的板子,也想搭建一个环境实现这样的一个功能,一开始失败了,最后解决了。
【总结】其实这样的环境搭建最核心的内容就是Makefile,换句话说,其实就是要知道这个过程的编译流程。
【1】复现问题:创建一个文件夹demo,内部只有两个文件,demo.c和Makefile
Makefile文件如下:
源码如下:
【2】编译这个驱动文件,直接执行make命令即可生成ko文件
【3】然后把ko安装到系统中
提示安装失败!
【4】查阅资料发现,是因为签名问题:http://www.linuxdiyf.com/linux/17648.html
【5】做实验使用android工程整体编译生成的demo_module.ko可以正常insmod,于是跟踪android整体编译的log发现以下信息:
第一步正常,在源码目录下生成相应的ko文件:msm\android-5.1\out\target\product\L503\obj\KERNEL_OBJ\drivers\char\demo_module.ko
第二部会执行签名动作:
make[1]:正在离开目录 `/work2/msm/android-5.1/kernel'
make -C kernel O=../out/target/product/L503/obj/KERNEL_OBJ INSTALL_MOD_PATH=../../system INSTALL_MOD_STRIP=1 ARCH=arm CROSS_COMPILE=arm-eabi- modules_install
make[1]: 正在进入目录 `/work2/msm/android-5.1/kernel'
INSTALL arch/arm/mach-msm/dma_test.ko
INSTALL arch/arm/oprofile/oprofile.ko
INSTALL block/test-iosched.ko
INSTALL crypto/ansi_cprng.ko
第三步,会重新生成一个新的demo_module.ko
INSTALL drivers/char/demo_module.ko
INSTALL drivers/gud/mcDrvModule.ko
INSTALL drivers/gud/mcKernelApi.ko
【6】修改【1】中的Makefile文件如下:
再编译这个驱动文件,就回生成新的demo_module.ko
在上图的lib下面还会生成第二个demo_module.ko,path 为 lib\modules\3.10.49-g06cdc33-00225-g5696cef-dirty\extra\demo_module.ko
上图中的标记为1的ko文件,会被签名生成新的ko文件。
【7】使用新生成的ko文件即可成功动态的安装到系统当中
OK,搞定了