抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

驱动概述

驱动种类:

  • 字符设备驱动(Character Device Drivers)
  • 块设备驱动(Block Device Drivers)
  • 网络设备驱动(Network Device Drivers)

驱动设计原则:

只提供功能,不提供方法

HelloWorld驱动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <linux/module.h>   // 包含模块相关函数的头文件
#include <linux/kernel.h>   // 包含内核相关函数的头文件
#include <linux/init.h>     // 包含初始化和清理函数的头文件

static int __init helloworld_init(void)
{
    printk(KERN_INFO "Hello, World!\n"); // 打印消息到内核日志 此处用printf也可
    return 0;
}

static void __exit helloworld_exit(void)
{
    printk(KERN_INFO "Goodbye, World!\n"); // 打印消息到内核日志
}

module_init(helloworld_init); // 指定驱动程序的初始化函数
module_exit(helloworld_exit); // 指定驱动程序的清理函数

MODULE_LICENSE("GPL"); // 指定模块的许可证信息
MODULE_AUTHOR("Name"); // 指定模块的作者信息
MODULE_DESCRIPTION("A simple Hello World driver"); // 指定模块的描述信息

编译驱动

将驱动由源代码.c编译为.ko需要借助makefile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
LINUX_KERNEL_PATH = /home/elf/work/linux-imx-imx_4.1.15_2.0.0_ga
CURRENT_PATH := $(shell pwd)
CROSS_COMPILE = arm-poky-linux-gnueabi-
//编译器前缀
CC = $(CROSS_COMPILE)gcc -march=armv7ve -mfpu=neon -mcpu=cortex-a7 --sysroot=/opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi
//编译器及其参数

obj-m :=hello.o

all:
    $(MAKE) -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
    $(MAKE) -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules clean
.PHONY: modules clean
//-C后加.config文件所在文件夹
//M参数后面是要编译的模块

设置环境变量后编译并拷贝驱动至开发板

. /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
make
scp hello.ko root@\192.168.0.232:/home/root

安装驱动

insmod hello.ko

卸载驱动

rmmod hello.ko

带参数的驱动

此处的参数指随驱动安装可使用命令行或配置文件传入的参数。参数可以是整形、字符型或布尔型。需做如下更改:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <linux/moduleparam.h> //包含模块参数相关函数的头文件

//定义的参数
static int my_param = 0;
static char *who = "helloworld";

module_param(my_param, int, S_IRUSR | S_IWUSR); //定义并注册一个驱动模块参数 需要填入:参数名称、参数类型、访问权限
MODULE_PARM_DESC(my_param, "An integer parameter"); //添加参数描述信息

module_param(who, charp, S_IRUSR | S_IWUSR);
MODULE_PARM_DESC(who, "An integer parameter");

...

而后就可以在驱动模块中引用这些参数

评论