一、步骤:
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:
int myopen(struct inode *, struct file *)
{
}
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 *)