您的位置:首页 > 其它

简单字符设备驱动示例

2016-11-14 16:55 316 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  字符设备 驱动 示例