mulit chrdev driver

本文详细介绍了一个基于Linux内核的字符设备驱动开发实例。通过创建两个字符设备,使用cdev结构体进行设备注册,并实现了设备的open、release、read等操作。此实例展示了如何在Linux环境下开发和注册字符设备,以及如何实现基本的文件操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <asm/uaccess.h>

#define NAME "demo"
dev_t from;
int baseminor = 0 , count = 2;

struct mutil_dev{
    struct cdev dev;
    char string[64];
}dev1,dev2;   

int demo_open(struct inode *inode, struct file *file)
{
    //inode->cdev 
    //cdev -----> struct mutil_dev?--->
    //container_of
    struct mutil_dev *my_dev = container_of(inode->i_cdev,struct mutil_dev,dev);
    file->private_data = my_dev;
    
    printk("%s,%d\n",__func__,__LINE__);
    return 0;
}
int demo_release(struct inode *inode, struct file *file)
{
    printk("%s,%d\n",__func__,__LINE__);
    return 0;
}
ssize_t demo_read(struct file *file, char __user *user, size_t size, loff_t *loff)
{
    struct  mutil_dev *read_dev = file->private_data;

    if(copy_to_user(user,read_dev->string,sizeof(read_dev->string))){
        printk("%s,%d\n",__func__,__LINE__);
        return -EINVAL;
    }
    printk("%s,%d\n",__func__,__LINE__);
    return size;
}

ssize_t demo_write(struct file *file, const char __user *user, size_t size, loff_t *loff)
{
    printk("%s,%d\n",__func__,__LINE__);
    return size;
}

struct file_operations f_ops = {
    .owner = THIS_MODULE,//struct module
    .open = demo_open,
    .release = demo_release,
    .read = demo_read,
};

void mutil_dev_config(struct mutil_dev *dev ,dev_t from , int count)
{
    cdev_init(&dev->dev,&f_ops);
    cdev_add(&dev->dev,from,count);
}

static int __init demo_init(void)
{
    int ret;
    int major = 0,minor = 0;
    ret = alloc_chrdev_region(&from,baseminor,count,NAME);
    if(ret){
        printk("%s,%dalloc_chrdev_region\n",__func__,__LINE__);
        return -EINVAL;
    }
    
    major = MAJOR(from);
    minor = MINOR(from);
    
    strcpy(dev1.string , "from dev1");
    strcpy(dev2.string , "from dev2");
    
    mutil_dev_config(&dev1,MKDEV(major ,minor),1);//250 0
    mutil_dev_config(&dev2,MKDEV(major ,minor+1),1);//250 1
    printk("%s,%d\n",__func__,__LINE__);
    return 0;
}
static void  __exit demo_exit(void)
{
    cdev_del(&dev1.dev);
    cdev_del(&dev2.dev);
    unregister_chrdev_region(from,count);
    printk("%s,%d\n",__func__,__LINE__);
}

module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值