目录
设备节点介绍:
(1)在linux中一切皆是文件,对上层程序来说设备驱动程序不过就是设备文件,在我们向内核注册好驱动程序后,需要创建对应的设备节点,然后上层应用程序通过读写设备节点的方式去操作硬件;
(2)设备节点本质上就是文件,不是普通类型的文件,是字符设备文件、块设备文件、网络设备文件等特殊文件,但是都是用统一的open、read等函数去操作;
(3)设备节点在"/dev/"目录下。
手动创建设备节点:
(1)在驱动程序注册成功后,可以用mknod命令可以手动创建设备节点;
(2)比如:mknod /dev/com1 c 237 1
,创建主设备号是237次设备号是1的设备节点/dev/com1;
补充:必须想办法知道驱动程序注册时候的主次设备号;
设备节点文件创建
自动创建设备节点文件,不需要手动操作,方便快捷。
创建和删除类
自动创建设备节点是在驱动程序的入口函数完成。自动创建需要创建类,具体接口如下:
struct class *class_create (struct module *owner, const char *name)
参数一共两个:owner 表示是属于这个模块。Name表示class的名字。
卸载驱动程序,需要删除掉类,类删除函数class_destroy,接口函数如下所示:
void class_destroy(struct class *cls);
创建设备
创建好类以后需要创建一个设备,才可以创建设备节点。Device_create是在类下创建设备,device_create函数原型如下:
struct device *device_create(struct class *class,struct device *parent,dev_t devt,void *drvdata,const char *fmt, ...)
class表示在那个类下创建设备,参数parent是父设备,可以设置NULL。
Devt是设备号。Drvdata是设备是可能会使用一些数据。
Fmt是设备名字,如果设置fmt=xxx,就会生成/dev/xxx的设备文件。
删除创建的设备,使用如下接口:
void device_destroy(struct class *class, dev_t devt)
class是删除的设备所处的类,devt是设备号。
代码:
demo.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/io.h>
#include <linux/cdev.h>
#include <linux/ioctl.h>
#include <linux/device.h>
#include <linux/uaccess.h>
#include<linux/slab.h>
#include"myled.h"
#define CNAME "myled"
int minor=0;//次设备号从0开始
#if 0
unsigned int major = 0;//动态申请
#else
unsigned int major = 500;//静态指定设备号
#endif
char kbuf[128]={};//定义数组用于存放和用户之间拷贝的数据
gpio_t *vir_led1;
gpio_t *vir_led2;
gpio_t *vir_led3;
unsigned int * vir_rcc;
struct cdev *cdev;
struct class *cls;
struct device *dev;
const int count=3;//指定设备节点的个数为3
//定义互斥体
struct mutex mut