您的位置:首页 > 运维架构 > Linux

linux杂项设备介绍

2017-08-24 11:10 99 查看
杂项设备驱动的相关介绍:

1.标准的字符设备过于浪费主设备号 为linux自有255个

2.杂项设备是以标注字符设备驱动的一种包装

3.杂项设备的主设备为10,其中的区别是此设备号,自己设定

杂项设备驱动的大概步骤

1.创建一个模块程序架构

2.注册一个杂项设备文件 misc_register

3.填充 file_operations

注意由于:杂项设备文件是对字符设备文件的一种包装 因此不需要 cdev class 

          设备文件节点的相关操作

相关的结构体以及函数

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;

}; //如果设置为MISC_DYNAMIC_MINOR则表示系统自动分配未使用的minor

1.注册一个杂项设备文件

 int misc_register(struct miscdevice * misc);

2.销毁一个杂项设备文件

 int misc_deregister(struct miscdevice *misc);

 

杂项设备相关的实例代码

#include <linux/init.h>  

#include <linux/module.h>  

#include <linux/fs.h>  

#include <linux/miscdevice.h> 

MODULE_LICENSE("Dual BSD/GPL");

#define Driver_name "misc_led"

static ssize_t misc_driver_write(struct file *file, 

        const char __user *buf,size_t count, loff_t *ppos)

{

}

static long misc_driver_ioctl(struct file *file, 

                      unsigned int cmd, unsigned long arg)

{

}

static int misc_driver_open(struct inode *inode, 

                                       struct file *file)

{

}

static int misc_driver_close(struct inode *inode,

                                    struct file *file)

{

}

struct file_operations misc_fops =

{
.owner
= THIS_MODULE,
.llseek
= misc_driver_llseek,
.write
= misc_driver_write,
.unlocked_ioctl
= misc_driver_ioctl,
.open = misc_driver_open,
.release
= misc_driver_close,

}

struct miscdevice misc_driver ={

   .minor  =   MISC_DYNAMIC_MINOR,  

   .fops    =   &misc_fops,  

   .name   =   Driver_name,  

   .nodename = Driver_name,  

};

static int misc_driver_init(void)

{
misc_register(&misc_driver);
return 0;

}

static void misc_driver_exit(void)

{

   misc_deregister(&misc_driver);

}

module_init(misc_driver_init);

module_exit(misc_driver_exit);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息