模拟字符设备驱动编程以及相关运行

根据字符设备驱动的模型
1.驱动初始化
2.实现设备操作
3. 驱动注销

这里写图片描述

示例代码如下:

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

/*静态分配cdev*/
struct cdev mdev;
dev_t devno;

int dev1_regs[5];
int dev2_regs[5];

loff_t mem_lseek(struct file *filp, loff_t offset, int whence)
{
    loff_t new_pos = 0;
    switch(whence){
        case SEEK_SET:
            new_pos = 0+offset;
            break;
        case SEEK_CUR:
            new_pos = filp->f_pos +offset;
            break;
        case SEEK_END:
            new_pos = 5*sizeof(int)+offset;
            break;
    }
    filp->f_pos = new_pos;
    return new_pos;
}
ssize_t mem_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)
{
    //将设备基地址取出
    int *reg_base = filp->private_data; 
    //从设备中取出数据
    copy_to_user(buf,reg_base+(*ppos),size);
    //读写指针偏移
    filp->f_pos += size;    
    return size;
}
ssize_t mem_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos)
{
    //将设备基地址取出
    int *reg_base = filp->private_data; 
    //往设备中写入数据
    copy_from_user(reg_base+(*ppos),buf,size);
    //读写指针偏移
    filp->f_pos += size;    
    return size;
}
int mem_open(struct inode *node, struct file *filp)
{
    //取出次设备号
    int num = MINOR(node->i_rdev);
    if(num == 0){
        filp->private_data = dev1_regs;
    }
    if(num == 1){
        filp->private_data = dev2_regs;
    }
    return 0;
}
int mem_close(struct inode *node, struct file *filp)
{
    return 0;
}

const struct file_operations memfops =
{
    .llseek = mem_lseek,
    .read = mem_read,
    .write = mem_write,
    .open = mem_open,
    .release = mem_close,
};

int memdev_init()
{
    /*初始化cdev*/
    cdev_init(&mdev, &memfops);
    /*分配设备号*/
    alloc_chrdev_region(&devno,0,2,"memdev");
    /*注册cdev*/
    cdev_add(&mdev,devno,2);
    return 0;
}

void memdev_exit()
{
    //驱动注销
    cdev_del(&mdev);
    //注销设备号
    unregister_chrdev_region(devno,2);
}

module_init(memdev_init);
module_exit(memdev_exit);

编译 make
复制 copy到rootfs目录下
启动内核
安装驱动 insmod memdev.ko
cat主设备号 cat /proc/devices
创建字符设备文件 mknod /dev/memdev0 c 252 0
执行相关的写应用程序 ./write_mem
执行相关的读应用程序 ./read_mem
——————————————————
2018.01.08
23:18

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值