Linux驱动开发笔记(四):设备驱动介绍、熟悉杂项设备驱动和ubuntu开发杂项设备Demo
前言
驱动的开发需要先熟悉基本概念类型,本篇讲解linux杂项设备基础,还是基于虚拟机ubuntu去制作驱动,只需要虚拟机就可以尝试编写注册杂项设备的基本流程。
- 字符设备:IO的传输过程是以字符为单位的,没有缓冲,比如I2C(SDA、SCL),SPI(MISO、MOSI、SCLK、CS)。
- 块设备:IO的传输过程是以块为单位的,跟存储相关的都属于块设备,比如tf卡,sd卡。
- 网络设备:IO的传输以socket套接字来访问的。
- 杂项设备是属于字符设备,可以自动生成设备节点,设备节点位于/dev/目录下,是设备名称,如/dev/ttyS9等。
- 主设备号相同,统一为10,次设备号不同,主设备相同可以节省内核资源。
 通过下列指令,可以查看系统杂项设备
cat /proc/misc
  在虚拟机上测试,查看杂项:
  
- 设备号分为主设备号和次设备号,主设备号是唯一的,次设备号不一定唯一。
 通过下列指令,可以查看系统主设备号:
cat /proc/devices
  
ubuntu来说,自带的/usr/src下的就是内核的头文件。
cd /usr/src/linux-headers-4.18.0-15
vi include/linux/miscdevice.h
  定位到之前ubuntu自带的内核头文件下:
  
  
查看到杂项设备的结构体:
struct miscdevice  {
        int minor;  // 次设备号
        const char *name;  // 设备节点名称(如/dev/ttyS8,则ttyS是名称)
        const struct file_operations *fops; // 文件操作集(非常重要)
        struct list_head list; 
        struct device *parent;
        struct device *this_device;
        const struct attribute_group **groups; 
        const char *nodename; 
        umode_t mode;
};
(注意:没打注释的,一般不管)
cd /usr/src/linux-headers-4.18.0-15
vi include/linux/fs.h
  搜索到(vi则直接使用“/”):
  
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 (*read_iter) (struct kiocb *, struct iov_iter *);
        ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);
        int (*iterate) (struct file *, struct dir_context *);
        int (*iterate_shared) (struct file *, struct dir_context *);
        __poll_t (*poll) (struct file *, struct poll_table_struct *);
        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 *);
        unsigned long mmap_supported_flags;
        int (*open) (struct inode *, struct file *);
        int (*flush) (struct file *, fl_owner_t id);
        int (*release) (struct inode *, struct file *);
        int (*fsync) (struct file *, loff_t, loff_t, int datasync);
        int (*fasync) (int, struct file *, int);
        int (*lock)  
                    
                     
                    
                 
                    
                