Hello驱动
第一个驱动程序
//[hello.c]
#include <linux/module.h>
#include <linux/init.h>
#include <linux/printk.h>
static int __init hello_init(void)
{
printk("hello init\n");
return 0;
}
static void __exit hello_exit(void)
{
printk("hello exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("LC_Huang");
module_init
module_init是驱动的入口,例如执行insmod挂载驱动时,驱动会运行module_init指定的函数
module_exit
module_exit是驱动程序的出口,在执行rmmod函数时,驱动会执行module_exit指定的函数
printk
在内核里面并没有printf函数,内核提供的函数是printk函数,和printf函数类似
MODULE_LICENSE
MODULE_LICENSE是指定代码遵循的开源协议
MODULE_AUTHOR
MODULE_AUTHOR指定作者信息
Makefile
KERN_DIR := /home/q123/samba/imx6ull/linux
obj-m := hello.o
build: kernel_modules
export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
kernel_modules:
$(MAKE) -C $(KERN_DIR) M=$(shell pwd) modules
clean:
$(MAKE) -C $(KERN_DIR) M=$(shell pwd) clean
KERN_DIR:指定内核的路径
ARCH:指定CPU架构
CROSS_COMPILE:指定使用的交叉编译器(具体的交叉编译器的构建流程查看前面buildroot制作的章节)
文件目录结构

编译驱动
make
编译结果

hello.ko就是编译出来的驱动文件
因为我的imx6ull启动的根文件系统挂载在我的ubuntu服务的/home/q123/nfs/rootfs目录下面,并且我imx6ull的登录用户为root用户,所以我把.ko文件复制到/home/q123/nfs/rootfs/root目录下面。
#复制文件
cp hello.ko /home/q123/nfs/rootfs/root/
加载驱动和卸载驱动
在板子上能见到如下文件:

insmod加载驱动
使用insmod命令来加载驱动,如下:
insmod hello.ko
加载结果

rmmod卸载驱动
使用rmmod命令来卸载驱动,如下:
rmmod hello.ko
卸载结果如下:


浙公网安备 33010602011771号