杂项设备驱动框架

7、杂项设备驱动框架

Linux三大设备驱动

字符设备: IO的传输过程是以字符为单位的,没有缓冲。比如I2C、SPI都是字符设备

块设备: IO传输过程是以块为单位的。跟存储相关的,都属于块设备,例如tf卡、emmc

网络设备: 与前两个不一样,是以socket套接字来访问的。

杂项设备

1、杂项设备是字符设备的一种。可以自动生成设备节点

​ 在系统里有很多杂项设备, 可以下面的命令来查看

 cat /proc/misc

在这里插入图片描述

2、杂项设备除了比字符设备代码简单,还有别的区别吗?

杂项设备的主设备号是相同的,均为10次设备号是不同的。主设备号相同就可以节省内核资源

3、主设备号和次设备号是什么?

​ 设备号包含主设备号和次设备号,主设备号在Linux系统里面是唯一的,次设备号不一定唯一。

设备号是计算机识别设备的一种方式主设备相同就被视为同一类设备

​ 主设备号可以比作电话号码的区号。比如北京的区号是010

​ 次设备可以比作电话号码

查看主设备号

cat /proc/devices

在这里插入图片描述

4、杂项设备的描述

定义在内核源码 :include/linux/miscdevice.h

#define MISC_DYNAMIC_MINOR  255  //自动获取杂项设备次设备号struct miscdevice  {int minor;		//次设备号const char *name;	//设备节点的名字  /dev/xxxconst struct file_operations *fops;  //文件操作集struct list_head list;struct device *parent;struct device *this_device;const char *nodename;mode_t mode;
};
extern int misc_register(struct miscdevice * misc);     //注册杂项设备
extern int misc_deregister(struct miscdevice *misc);    //注销杂项设备
//定义在include/linux/fs.h中struct file_operations {                                                               struct module *owner;loff_t (*llseek) (struct file *, loff_t, int);ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);int (*readdir) (struct file *, void *, filldir_t);unsigned int (*poll) (struct file *, struct poll_table_struct *);
/* remove by cym 20130408 support for MT660.ko */
#if 0
//#ifdef CONFIG_SMM6260_MODEM
#if 1// liang, Pixtree also need to use ioctl interface...int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
#endif
#endif
/* end remove */long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);long (*compat_ioctl) (struct file *, unsigned int, unsigned long);int (*mmap) (struct file *, struct vm_area_struct *);int (*open) (struct inode *, struct file *);int (*flush) (struct file *, fl_owner_t id);int (*release) (struct inode *, struct file *);int (*fsync) (struct file *, int datasync);int (*aio_fsync) (struct kiocb *, int datasync);int (*fasync) (int, struct file *, int);int (*lock) (struct file *, int, struct file_lock *);ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);int (*check_flags)(int);int (*flock) (struct file *, int, struct file_lock *);ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);int (*setlease)(struct file *, long, struct file_lock **);long (*fallocate)(struct file *file, int mode, loff_t offset,loff_t len);
/* add by cym 20130408 support for MT6260 and Pixtree */
#if defined(CONFIG_SMM6260_MODEM) || defined(CONFIG_USE_GPIO_AS_I2C)int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
#endif
/* end add */
};

注册杂项设备

#include 	
extern int misc_register(struct miscdevice * misc);     //注册杂项设备

注销杂项设备

#include 
extern int misc_deregister(struct miscdevice *misc);    //注销杂项设备
成功返回0 
5、注册杂项设备的流程
(1) 填充miscdevice这个结构体
(2) 填充file_operations这个结构体
(3)注册杂项设备并生成设备节点
6 、 编写一个杂项设备
#include 
#include 
#include 
#include //第二步填充file_operations结构体struct file_operations misc_fops = {.owner = THIS_MODULE			//	当前用户拥有		
};
//第一步填充miscdevice结构体
struct miscdevice miscdev = {.minor = MISC_DYNAMIC_MINOR,  	//自动获取次设备号.name = "hello_misc",  			//杂项设备名称.fops = &misc_fops				//文件操作集
};
static int misc_init(void)
{int ret;//第三步 注册杂项设备并生成设备节点ret = misc_register(&miscdev);if (0 > ret){	printk("misc register is error!\n");return -1;}printk("misc register is success!\n");return 0;
}
static void misc_exit(void)
{misc_deregister(&miscdev);  //卸载printk("byb byb\n");  // 这里打印函数需要用printk 因为printf是C库函数
}module_init(misc_init);  		//入口
module_exit(misc_exit);			//出口
MODULE_LICENSE("GPL");			//协议声明

makefile

obj-m += misc.o   #编译成模块
# 内核路径
KDIR := /home/now/kernel3.0/iTop4412_Kernel_3.0#获取当前路径
PWD = $(shell pwd)all:make -C $(KDIR) M=$(PWD) modules

编译成模块 然后make 将生成的ko文件拷贝到开发板

YUAN@root:/mnt/mydriver# insmod misc.ko 
[  215.220983] misc register is success!
YUAN@root:/mnt/mydriver# ls /dev/hello_misc 
/dev/hello_misc
YUAN@root:/mnt/mydriver# rmmod misc
[  236.524079] byb byb
YUAN@root:/mnt/mydriver# 

思维导图

在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部