九鼎RK3399笔记二:编译驱动模块并加载
将驱动在外部编译为模块
一、在内核源码附近新建文件夹hello
1、在hello文件夹新建hello.c
#include <linux/init.h>
#include <linux/module.h>
static int hello_init(void)
{
printk("hello world 1019\n");
return 0;
}
static void hello_exit(void)
{
printk("bye bye\n");
return;
}
module_init(hello_init);//模块入口
module_exit(hello_exit);//模块出口
MODULE_LICENSE("GPL");
2、在hello文件夹新建Makefile
# -m 的意思是把我们的驱动编译成模块,后面接文件名.o
obj-m += hello.o
# 这里填写板子里运行的内核的源码目录,该内核源码必须是编译通过的
KDIR:=/test/doc/x3399/x3399_linux_new/kernel/
# 获取当前目录
PWD?=$(shell pwd)
#make 会进入内核源码的路径,然后把当前路径下的代码编译成模块
#make 指令前面必须按tab,不能用4个空格代替
all:
make -C $(KDIR) M=$(PWD) modules
二、新建脚本并编译
1、在hello文件夹新建build.sh
ARCH值取决于板子,CROSS_COMPILE值取的是和编译kernel一样的编译链
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make
2、编译
不能执行./build.sh就改文件权限:chmod 777 -R hello
./build.sh
执行完之后,hello文件夹下应该生成hello.ko
三、TFTP发送到板子并加载
1、板子网线连接PC,输入ifconfig查看板子IP,和我们电脑假如不在一个网段,PC为192.168.1.100,那么更改板子IP:
ifconfig eth0 192.168.1.10 netmask 255.255.255.0
参考:https://blog.csdn.net/u013171226/article/details/120987572
2、板子ping 192.168.1.100,能成功才能传输文件。打开tftpd32软件,选择hello.ko所在目录,
从服务器获得文件:
tftp –g –r filename ipaddr(主机的ip)
上传文件到服务器:
tftp –p –l filename ipaddr(开发板的ip)
tftp -g -r hello.ko 192.168.1.100
就把hello.ko传到开发板文件系统中了。
3、加载模块
insmod hello.ko
卸载模块
rmmod hello
可以看到打印
将驱动和内核一起编译
一、在/drivers/char/路径建立一个hello文件夹
hello文件夹中新建Makefile、Kconfig、helloworld.c(helloworld.c和外部编译一样,无需修改)
Makefile:
obj-$(CONFIG_HELLO)+=helloworld.o
Kconfig:
config HELLO
tristate "hello world"
help
hello
二、修改hello文件夹上一级的Makefile和Kconfig
/drivers/char/Makefile:
+obj-y +=hello/
/drivers/char/Kconfig:
+source "drivers/char/hello/Kconfig"
三、make menuconfig
在内核根目录 make menuconfig,选择将模块编译进内核(*)
四、重新编译内核
make
编译成功后,烧写进开发板,启动信息里可以看到模块加载打印的信息