Linux驱动:字符设备驱动基础框架

一.字符设备驱动基础框架:

#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/init.h>
#include <linux/module.h>


#define CHRDEVBASE_MAJOR 200//主设备号
#define CHRDEVBASE_NAME "chrdevbase"//设备名称

static int chrdevbase_open(struct inode *inode, struct file *filp)
{
	printk("chrdevbase open!\r\n");
	return 0;
}

static ssize_t chrdevbase_read(struct file *filp, char __user *buf, size_t cnt, loff_t *offt)
{	
	printk("chrdevbase read!\r\n");
	return 0;
}

static ssize_t chrdevbase_write(struct file *filp, const char __user *buf, size_t cnt, loff_t *offt)
{
	printk("chrdevbase write!\r\n");
	return 0;
}

static int chrdevbase_release(struct inode *inode, struct file *filp)
{
	printk("chrdevbase release!\r\n");
	return 0;
}

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 ret=0;
    int retvalue = 0;

    printk("chrdevbase_init\r\n");

    /*向内核注册字符设备*/
    retvalue = register_chrdev(CHRDEVBASE_MAJOR, CHRDEVBASE_NAME, &chrdevbase_fops);
    if(retvalue < 0)
    {
        printk("register chrdevbase error!\r\n");
        /*注册失败,自行处理*/
    }

    return ret;
}

/*出口函数*/
static void __exit chrdevbase_exit(void)
{
    /*注销字符设备*/
    unregister_chrdev(CHRDEVBASE_MAJOR,CHRDEVBASE_NAME);

    printk("chrdevvase_exit\r\n");
}

/*驱动的注册与卸载*/
module_init(chrdevbase_init);
module_exit(chrdevbase_exit);

/*添加license和作者信息*/
MODULE_LICENSE("GPL");
MODULE_AUTHOR("LeeJiEun");
MODULE_INFO(intree,"Y");//可以避免终端打印一些不需要的信息

/*编译完成之后在当前目录下生成一个.ko文件,将其拷贝到nfs挂载的根文件系统中存放驱动模块的地方
sudo cp chrdevbase.ko /home/leejieun/linux/nfs/rootfs/lib/modules/5.4.31/ -f*/

二.应用程序:

#include "stdio.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "stdlib.h"
#include "string.h"

int main(int argc, char *argv[])
{
    int fd;
    char *filename;//设备节点文件名,当加载完驱动模块之后,需要使用以下命令来在/dev下面创建一个设备节点
    //mknod /dev/chrdevbase c 200 0

    if(argc != 2)
    {
        printf("args error!\r\n");
        return -1;
    }

    filename = argv[1];
    
    fd = open(filename, O_RDWR);
    if(fd==-1)
    {
        perror("open error");
        return -1;
    }

    close(fd);
    if(fd==-1)
    {
        perror("close error");
        return -1;
    }
    return 0;
}

最终效果:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GuiStar_李什么恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值