简单字符设备驱动示例

#include <linux/init.h> //for module_init
#include <linux/module.h> //for printk
#include <asm-generic/errno-base.h>
#include <linux/fs.h>
#include <asm-generic/uaccess.h>
#include <asm/io.h>
#include <linux/cdev.h>
#include <linux/device.h>

/*定义一个cdev对象*/
struct cdev test_cdev;
struct class *test_class; //设备类
struct device *test_device; //设备文件

unsigned int major = 0;
unsigned int minor = 0;
unsigned int devno = 0;

int test_open(struct inode *inode, struct file *file)
{
printk("%s\n",__FUNCTION__);

return 0;
}

struct file_operations test_fops = {
.owner = THIS_MODULE, //属于本模块
.open = test_open,
};

static int test_init(void)
{
int ret;
int errno;

/*获取设备号*/
devno = MKDEV(major,minor);
if(major)
{
/*1.静态申请设备号*/
ret = register_chrdev_region(devno,1,"test-new-driver");
if(ret){
printk("register chrdev region failed\n");
errno = -EBUSY;
goto err;
}
}
else
{
/*动态申请设备号*/
ret = alloc_chrdev_region(&devno,0,1,"test-new-driver");
if(ret){
printk("register chrdev alloc region failed\n");
errno = -EBUSY;
goto err;
}
}

/*初始化一个cdev对象*/
cdev_init(&test_cdev,&test_fops);

/*使用(此时真正的注册进内核地址表)*/
ret = cdev_add(&test_cdev,devno,1);
if(ret){
printk("cdev add failed\n");
errno = -EBUSY;
goto err1;
}
/*动态的创建设备文件*/
test_class = class_create(THIS_MODULE,"test_module");
if(IS_ERR(test_class)){
printk("class_create failed\n");
errno = PTR_ERR(test_class);
goto err2;
}

/*5.申请创建一个设备文件*/
test_device = device_create(test_class,NULL,devno,NULL," test");
if(IS_ERR(test_device)){
printk("device create failed\n");
errno = PTR_ERR(test_device);
goto err3;
}
return 0;
err3:
class_destroy(test_class);
err2:
cdev_del(&test_cdev);
err1:
unregister_chrdev_region(devno,1);
err:
return errno;
}

static void test_exit(void)
{
device_destroy(test_class,devno);
class_destroy(test_class);
cdev_del(&test_cdev);
unregister_chrdev_region(devno,1);
printk("bye!\n");
}
module_init(test_init);
module_exit(test_exit);
MODULE_LICENSE("GPL");
========================上为驱动,下为应用=======================
#include <sys/types.h>
#include <stdio.h>

int main(int argc,char *argv[])
{
int fd;
/*打开文件*/
fd = open("/dev/ test",O_RDWR);
if(fd < 0){
perror("open");
return -1;
}
printf("\nopen success... [%d]\n",fd);
return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值