linux驱动
1、目录介绍
2、最简单的Linux驱动结构
(1)头文件
必须包含#include <linux/module.h>、#include <linux/init.h>
(2)驱动加载函数
static int helloworld_init(void){
printk("helloworld!\n");
return 0;
}
module_init(helloworld_init);
(3)驱动卸载函数
static int helloworld_exit(void){
printk("helloworld bye!\n");
}
module_exit(helloworld_exit);
(4)许可证声明
MODULE_LICENSE("DPL");
MODULE_AUTHOR("lzr");
MODULE_VERSION("V1.0");
3、编译驱动文件(放哪都行)
obj-m+=helloworld.o
KDIR:=/home/disk/liziru/rk3399/kernel/linux_mydriver
PWD?=$(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order
obj-m+=helloworld.o
表示把目标文件helloworld.o作为模块进行编译。obj就是object的缩写,-m表示编译成模块
KDIR:=/home/disk/liziru/rk3399/kernel/linux_mydriver
使用绝对路径的方式指定内核源码的路径(即rk3399/kernel)
PWD?=$(shell pwd)
获取Makefile文件所在的路径
all:
make -C $(KDIR) M=$(PWD) modules
进到KDIR目录,使用PWD路径下源码和Makefile文件编译驱动模块
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order
清除编译文件
4、添加临时编译变量(每次开终端都要加)
//设置交叉编译链以及编译架构
export CROSS_COMPILE=/home/disk/liziru/rk3399/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
export ARCH=arm64
5、如果不想添加临时变量,可将变量写死
rk3399/kernel/Makefile
ARCH ?= $(SUBARCH)
ifeq ($(ARCH),arm64)
ifneq ($(wildcard $(srctree)/../prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu),)
CROSS_COMPILE ?= $(srctree)/../prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
endif
ifneq ($(wildcard $(srctree)/../prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9),)
CROSS_COMPILE ?= $(srctree)/../prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android