一. 简介
本文来编写 LED灯驱动模块加载与卸载的代码。
二. LED灯驱动模块加载与卸载代码框架
1. 创建工程
我的驱动代码存放目录: ubuntu系统 /home/wangtian/zhengdian_Linux/Linux_Drivers 目录下。
进入 /home/wangtian/zhengdian_Linux/Linux_Drivers 目录,创建 2_led文件夹:
wangtian@wangtian-virtual-machine:~/zhengdian_Linux/Linux_Drivers$ mkdir 1_led
进入 2_led目录下,创建 led.c 文件,此文件就是 led 的驱动文件:
wangtian@wangtian-virtual-machine:~/zhengdian_Linux/Linux_Drivers/2_led$ touch led.c
2. 编写LED驱动框架代码
(1) 将 1_chrdevbase工程中 Makefile文件拷贝到 2_led目录下。并更改 Makefile文件。
拷贝 Makefile文件:
wangtian@wangtian-virtual-machine:~/zhengdian_Linux/Linux_Drivers/2_led$ cp ../1_chrdevbase/Makefile ./
更改 Makefile,将 Makefile文件中的编译目标名进行更改。
将以下代码进行更改:
obj-m := chrdevbase.o
更改为:
obj-m := led.o
(2)拷贝 .vscode及其以下文件
注意:.vscode及其以下文件中设置了(NXP官方提供的) Linux内核源码路径。因为驱动可能会调用到 Linux内核中的函数!!!
将前面字符设备驱动实验 1_chrdevbase工程代码中 .vscode 及其以下文件,拷贝到该工程下:
wangtian@wangtian-virtual-machine:~/zhengdian_Linux/Linux_Drivers/2_led$ cp -rf ../1_chrdevbase/.vscode/ ./
拷贝完成后,可以在工程下看到如下文件:
(2)编写 LED驱动模块的加载 / 卸载框架
Led 驱动代码需要添加的头文件,可以参考 字符设备驱动实验 1_chrdevbase工程代码。
LED灯驱动模块加载/卸载代码如下(led.c文件中):
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
//Led驱动模块入口函数
static int __init led_init(void)
{
printk("led_init!\r\n");
return 0;
}
//Led驱动模块出口函数
static void __exit led_exit(void)
{
printk("led_exit!\r\n");
}
module_init(led_init); //入口
module_exit(led_exit); //出口
MODULE_LICENSE("GPL"); //模块 licence
MODULE_AUTHOR("lingxuewu"); //模块作者
(3)如何确定 .vscode及其以下文件成功设置好了 指向 Linux内核源码(NXP官方提供的)?
vscode已经打开了 2_led工程,鼠标放在 某个函数名上,同时按下 "Ctrl" 键,确定是否可以跳转到 函数的定义处,即 我指定的Linux内核源码处(NXP官方提供的)。
如果可以跳转到 我指定的 Linux内核源码处,则说明 .vscode 下所设置的 Linux内核源码路径是有效的,否则,就需要检查所设置的是否正确。