misc设备

一、步骤:

1.定义miscdevice结构体:

struct miscdevice misc;

2.初始化miscdevice结构体

misc.minor = MISC_DYNAMIC_MINOR;//动态分配
misc.name = "xxxx";   //设备名
misc.fops = &myfops;  //操作方法集(myfops要预先准备好)
struct file_operations myfops = {
    .owner = THIS_MODULE,
    .open = myopen,
    .release = myrelease,
    .read = myread,
    .write = mywrite,
} 

3.注册

/*
* 功能: 注册
* 输入参数: struct miscdevice
* 输出参数:
* 返回值: 成功:0    失败:负数
* 注意:这个注册函数会自动创建设备文件,不用我们管,misc设备的主设备号恒为10,它靠次设备号区分不同的misc
*/
int misc_register(struct miscdevice * misc)

4.释放

/*
* 功能: 注销
* 输入参数: struct miscdevice
* 输出参数:
* 返回值: none
* 注意:
*/
void misc_deregister(struct miscdevice *misc)

二、向上提供接口:

1.open:

/*
* 功能: 给运用层的接口---打开
* 输入参数: @struct inode  --inod节点
* 输入参数: @struct file   --file指针
* 输出参数:
* 返回值: 成功:0    失败:负数
* 注意:
*/
int myopen(struct inode *, struct file *) 
{
    //1.使用计数
    //2.识别子设备(将私有的设备结构体赋值给pfile->pravite_data)
    //3.必要的设备初始化
}

2.close:

/*
* 功能: 给运用层的接口---关闭
* 输入参数: @struct inode  --inod节点
* 输入参数: @struct file   --file指针
* 输出参数:
* 返回值: 成功:0    失败:负数
* 注意:
*/
int myrelease(struct inode *, struct file *)

3.read:

/*
* 功能: 给运用层的接口---读
* 输入参数: @struct file   --file指针
* 输入参数: @__user        --运用层传进来的bufer
* 输入参数: @size          --大小
* 输入参数: @loff_t        --偏移
* 输出参数:
* 返回值: 成功:实际能读到的字节数    失败:负数
* 注意:
*/
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *)

4.write:

/*
* 功能: 给运用层的接口---读
* 输入参数: @struct file   --file指针
* 输入参数: @__user        --运用层传进来的bufer
* 输入参数: @size          --大小
* 输入参数: @loff_t        --偏移
* 输出参数:
* 返回值: 成功:实际写入的字节数    失败:负数
* 注意:
*/
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *)
posted @ 2017-02-04 10:33  云鹤比天  阅读(176)  评论(0)    收藏  举报