itop4412生成设备节点

在注册驱动成功之后,若要与应用层进行通信,则需要生成设备节点。上层应用通过调用标准的接口函数调用设备节点来实现与底层驱动之间的通信。本节将介绍生成杂项设备的设备节点的操作流程

1. 杂项设备注册函数及结构体
  • 所需头文件路径:include/linux/miscdevice.h

  • 注册和卸载函数:

        extern int misc_deregister(struct miscdevice *misc);
  • 两个函数中使用到的结构体:struct miscdevice 结构为:
struct miscdevice  {
        int minor;
        const char *name;
        const struct file_operations *fops;
        struct list_head list;
        struct device *parent;
        struct device *this_device;
        const char *nodename;
        mode_t mode;
};

常用参数说明:
minor:设备号,赋值为MISC_DYNAMIC_MINOR
name:设备名
struct file_operations :该结构体的成员函数是驱动设计的主体内容,里面的函数和linux系统给应用程序提供的系统接口一一对应,是实现与应用层通信的关键;该结构体的头文件为:include/linux/fs.h ;其中包含参数众多,这里介绍几个常用的参数:

struct file_operations {
        struct module *owner;
        ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
        ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
        int (*open) (struct inode *, struct file *);
        int (*release) (struct inode *, struct file *);
        long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);

……
};

struct module * owner:一般设置为THIS_MODULE
read函数:读函数,拷贝数据到应用程序空间,即应用层从低层读取数据
write函数:写函数,从应用程序空间拷贝数据,即应用层向底层传输数据
open函数:对应上层的open函数,打开文件
release函数:对应应用层的close()函数,打开文件操作之后一般需要关闭
unlocked_ioctl函数:这个函数功能和写函数功能稍微有点重合,但是这个函数占用的内存非常小,主要针对IO口的控制。

2.杂项设备生成设备节点实现操作
  • 在驱动注册中的probe函数中添加杂项设备注册函数:misc_register
  • 配置结构体”struct miscdevice”:
struct miscdevice led_dev = {
        .minor = MISC_DYNAMIC_MINOR,
        .name = DEVICE_NAME,
        .fops = &led_ops,
};
  • 配置结构体”struct file_operations”:
struct file_operations led_ops = {
        .owner = THIS_MODULE,
        .open = led_open,
        .release = led_release,
        .unlocked_ioctl = led_ioctl,

};
  • 创建函数led_open、led_release、led_ioctl:
/*打开文件操作*/
static int led_open(struct inode * inode,struct file * file){

        printk(KERN_EMERG "led open\n");
        return 0;
}

/*对应应用层的close()函数,关闭文件*/
static int led_release(struct inode * inode,struct file * file){

        printk(KERN_EMERG "led release\n");

        return 0;
}

/*对IO口进行控制,cmd 是控制命令,arg是控制哪个参数*/
static long led_ioctl(struct file * file,unsigned int cmd,unsigned long arg){

        printk(KERN_EMERG "cmd is%d,arg is %d\n",cmd,arg);

        return 0;
}
  • 在驱动注册中的remove函数中添加杂项设备卸载函数:misc_deregister
3. 测试驱动程序
  • 在开发板中加载测试编译好驱动程序,查看设备节点

这里写图片描述

参考

《linux设备驱动程序》
itop4412驱动实验手册

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值