驱动开发
hello world
文章目录
- 驱动开发
- 前言
- 一、代码添加
- 二、编译
- 三、 验证
- 总结
前言
最简单的hello world 驱动
一、代码添加
在AU_LINUX_ANDROID_LA.VENDOR.1.0\kernel_platform\msm-kernel\drivers\misc\目录下新建hello_world文件夹
并创建hello_world.c
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>static int hello_init(void)
{ printk(KERN_ERR"Hello! This is the helloworld module!\n");return 0;
} static void hello_exit(void)
{printk(KERN_ERR"Module exit! Bye Bye!\n");return;
}module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
hello_world文件夹下新建Makefile
obj-m += hello_world.o
修改misc目录下的Makefile
AU_LINUX_ANDROID_LA.VENDOR.1.0\kernel_platform\msm-kernel\drivers\misc\Makefile
+obj-m += hello_world/
注:obj-m最好是以宏控的方式控制,当然也可以以obj-y的方式编译进内核,后续详细介绍
二、编译
以骁龙8 gen1 plus平台为例
在AU_LINUX_ANDROID_LA.VENDOR.1.0目录下执行:
xxxx@u99:~/AU_LINUX_ANDROID_LA.VENDOR.1.0$bash kernel_platform/qcom/proprietary/prebuilt_HY11/vendorsetup.shxxxx@u99:~/AU_LINUX_ANDROID_LA.VENDOR.1.0$cd kernel_platform/xxxx@u99:~/AU_LINUX_ANDROID_LA.VENDOR.1.0/kernel_platform$BUILD_CONFIG=./common/build.config.msm.waipio ./build/all-variants.sh "./build/build.sh"
如上编译完成后AU_LINUX_ANDROID_LA.VENDOR.1.0\kernel_platform\out\msm-waipio-waipio-consolidate\dist\目录下会生成hello_world.ko;push到设备中验证即可。
三、 验证
C:\Users\Admin>adb push AU_LINUX_ANDROID_LA.VENDOR.1.0\kernel_platform\out\msm-waipio-waipio-consolidate\dist\hello_world.ko /vendor/lib/modules/
\\192.168.0.56\home1\luhuan\zhanghong\SM8475\AU_LINUX_ANDR...world.ko: 1 file pushed. 3.0 MB/s (136104 bytes in 0.043s)C:\Users\Admin>adb shell
taro:/ # insmod ve
vendor/ vendor_dlkm/
taro:/ # insmod vendor/lib
lib/ lib64/
taro:/ # insmod vendor/lib/modules/he
heap_mem_ext_v01.ko hello_world.ko
taro:/ # insmod vendor/lib/modules/hello_world.ko
taro:/ # dmesg |grep hello
[ 167.180876] Hello! This is the helloworld module!
taro:/ #
taro:/ #
taro:/ # lsmod |grep hello
hello_world 16384 0
taro:/ # rmmod hello_world
taro:/ # dmesg |grep Bye
[ 193.670479] Module exit! Bye Bye!
taro:/ #
总结
module init 优先级
#define pure_initcall(fn) __define_initcall(fn, 0) #define core_initcall(fn) __define_initcall(fn, 1)
#define core_initcall_sync(fn) __define_initcall(fn, 1s)
#define postcore_initcall(fn) __define_initcall(fn, 2)
#define postcore_initcall_sync(fn) __define_initcall(fn, 2s)
#define arch_initcall(fn) __define_initcall(fn, 3)
#define arch_initcall_sync(fn) __define_initcall(fn, 3s)
#define subsys_initcall(fn) __define_initcall(fn, 4)
#define subsys_initcall_sync(fn) __define_initcall(fn, 4s)
#define fs_initcall(fn) __define_initcall(fn, 5)
#define fs_initcall_sync(fn) __define_initcall(fn, 5s)
#define rootfs_initcall(fn) __define_initcall(fn, rootfs)
#define device_initcall(fn) __define_initcall(fn, 6)
#define device_initcall_sync(fn) __define_initcall(fn, 6s)
#define late_initcall(fn) __define_initcall(fn, 7)
#define late_initcall_sync(fn) __define_initcall(fn, 7s) #define __initcall(fn) device_initcall(fn)