7、杂项设备驱动

字符设备: IO传输过程中以字符为单位,没有缓冲,比如:i2c spi

块设备: IO 传输过程中以块为单位。和存储有关的,TF卡 硬盘

网络设备:以socket 套接字来访问;

杂项设备是字符设备的一种,自动生成设备节点,降低了开发难度

cat /proc/misc 可以查看杂项设备

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

杂项设备描述

杂项设备使用结构体 miscdevice进行描述,定义在: include/linux/miscdevice.h

cpp 复制代码
Struct miscdevice{

    Int minor;
    Const char *name;
    Const struct file_operations *fops;
    Struct list_head list;
    Struct device *parent;
    Struct device *this_device;
    Const struct attribute_grop **groups;
    Const char *nodename;
    Umode_t mode;

}

相关函数

注册杂项设备:

extern int misc_register(struct miscdevice *misc);

注销杂项设备:

extern int misc_deregister(struct miscdevice *misc);

例程:

cpp 复制代码
#include <linux/module.h>
#include <linux/init.h>
 
#include <linux/fs.h>
#include <linux/modulepram.h>
#include <linux/kdev_t.h>
 
#include <linux/miscdevice.h>

#include <linux/asm-generic/uaccess.h>  
 
 
static int major;
static int minor; 
 
 
module_param(major,int,S_IRUGO);
MODULE_PARAM_DESC(major,"e.g:major=1");
 
module_param(minor,int,S_IRUGO);
MODULE_PARAM_DESC(minor,"e.g:minor=1");
 
 
static struct cdev cdev_test;
 
struct class *class;
struct device *device;
 
 
 
static  int misc_test_open(struct inode *node, struct file *file)
{
     printk("misc_test_open \n");
     return 0;
}
 
static int misc_test_release(struct inode *node, struct file *file)
{
 
     printk("misc_test_release \n");
     return 0;
 
}
 
static ssize_t misc_test_read (struct file *file, char __user *buf, size_t size, loff_t *off)
{
    char kbuf[64]="123456hello";
    
    copy_to_user(buf,kbuf,strlen(kbuf));
 
     printk("misc_test_read \n");
 
 
}  
 
static ssize_t misc_test_write (struct file *file, const char __user *buf, size_t size, loff_t *off)
{
 
     char kbuf[64];
     copy_from_user(kbuf,buf,size);
     printk("write buf[%s]\n",kbuf);
     printk("misc_test_write\n");
 
 
 
 
}
 
 
struct file_operations misc_test_ops={
 
    .owner=THIS_MODULE,
    .open=misc_test_open,
    .release=misc_test_release,
    .read=misc_test_read,
    .write=misc_test_write,
    .ioctl=misc_test_ioctl
};
 
 
struct miscdevice misc_dev={
    .minor= MISC_DYNAMIC_MINOR,
    .name=test,
    .fops=&misc_test_ops
};





static int misc_init(void)
{
    
    int ret;
    ret =  misc_register(&misc_dev);
    if(ret <0 )
        printk(" misc_register err\n");
    
    printk("cdv init\n");
    return 0;
}
 
static void misc_exit(void)
{
 
     misc_deregister(&misc_dev);
 
    printk("cdv exit\n");
    return 0;
}
 
 
module_init(misc_init);
module_exit(misc_exit);
 
MODULE_LICENSE("GPL");
MODULE_AUTHOR("SONG");
MODULE_VERSION("v1.0");
相关推荐
pipip.30 分钟前
UDP————套接字socket
linux·网络·c++·网络协议·udp
朱包林3 小时前
day45-nginx复杂跳转与https
linux·运维·服务器·网络·云计算
孙克旭_3 小时前
day045-nginx跳转功能补充与https
linux·运维·nginx·https
孞㐑¥5 小时前
Linux之Socket 编程 UDP
linux·服务器·c++·经验分享·笔记·网络协议·udp
M4K08 小时前
Linux百度网盘优化三板斧
linux
好奇的菜鸟9 小时前
如何在 Ubuntu 24.04 (Noble) 上使用阿里源
linux·运维·ubuntu
bcbobo21cn9 小时前
初步了解Linux etc/profile文件
linux·运维·服务器·shell·profile
望获linux9 小时前
【实时Linux实战系列】CPU 隔离与屏蔽技术
java·linux·运维·服务器·操作系统·开源软件·嵌入式软件
0wioiw010 小时前
C#基础(项目结构和编译运行)
linux·运维·服务器
2401_8735878211 小时前
Linux常见指令以及权限理解
linux·运维·服务器