android平台驱动开发(一)

驱动开发

hello world


文章目录

  • 驱动开发
  • 前言
  • 一、代码添加
  • 二、编译
  • 三、 验证
  • 总结


前言

最简单的hello world 驱动


一、代码添加

在AU_LINUX_ANDROID_LA.VENDOR.1.0\kernel_platform\msm-kernel\drivers\misc\目录下新建hello_world文件夹
并创建hello_world.c

#include 
#include   
#include 
 
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到设备中验证即可。

三、 验证

android平台驱动开发(一)_第1张图片

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)  

你可能感兴趣的:(android驱动开发教程,android,linux)