linux字符设备驱动开发之经典流程

本文章参考正点原子相关教程,仅学习记录使用
在这里插入图片描述
驱动代码流程流程

//打开文件
static int chrdevbase_open(struct inode *inode, struct file *flip)

//读文件
static ssize_t chrdevbase_read(struct file *filp, char __user *buf, size_t cnt, loff_t *offt)

//写文件
static ssize_t chrdevbase_write(struct file *flip, const char __user *buf, size_t cnt, loff_t *offt)

//关闭文件
static int chrdevbase_release(struct inode *inode, struct file *filp)

//驱动函数配置函数
static struct file_operations chrdevbase_fops = {
.owner = THIS_MODULE,
.open = chrdevbase_open,
.read = chrdevbase_read,
.write = chrdevbase_write,
.release = chrdevbase_release,
};

//驱动初始化
static int __init chrdevbase_init(void)
     int register_chrdev_region(dev_t from, unsigned count, const char *name)  //     注册驱动

//卸载驱动
static void __exit chrdevbase_exit(void)
     int  unregister_chrdev(dev_t from, const char *name)

//模块初始化驱动初始化、卸载函数
module_init(chrdevbase_init);
module_exit(chrdevbase_exit);

//协议、作者
MODULE_LICENSE("GPL");
MODULE_AUTHOR("TAN");

测试函数

//上述实现用户层函数与底层寄存器建立联系,使用linux用户层提供的open,read,write,close实现驱动操作。
#include "stdio.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "stdlib.h"
#include "string.h"

static char user_data[] = {"usr data!"};

int main(int argc, char const *argv[])
{
    
    int fd , ret;
    char *filename;
    char readbuf[100],  writebuf[100];

    if(argc != 3){
        printf("Error usage!\n");
        return -1;
    }

    filename = argv[1];

    fd = open(filename, O_RDWR);
    if(fd < 0 ){
        printf ( "can`t open file %s \n.",  filename);
        return -1;
    }

    **加粗样式**if(atoi(argv[2] == 1)){ /*read data */

        ret = read(fd, readbuf, 50);
        if(ret < 0 ){
            printf("read data %s failed!\n", filename);
            return -1;
        }else{
            printf("read data: %s \n",readbuf);
        }
    }else if(atoi(argv[2] == 2)){   /*write data */
        memcpy(writebuf, user_data, sizeof(user_data));
        ret = write(fd, writebuf, 50);
        if( ret < 0 ){
            printf("write file %s failed.\n", filename);
        }
    }

    ret = close(fd);
    if(ret <  0){
        printf("close file %s failed.\n",filename);
        return -1;
    }

    return 0;

    return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值