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

卸载结果如下:
卸载驱动结果

posted @ 2024-06-02 19:01  其实我只是懒  阅读(32)  评论(0)    收藏  举报