驱动开发
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.sh
xxxx@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到设备中验证即可。
三、 验证
文章来源:https://www.toymoban.com/news/detail-417289.html
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 优先级文章来源地址https://www.toymoban.com/news/detail-417289.html
#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)
到了这里,关于android平台驱动开发(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!