linux使用open无法打开驱动解决方式

您所在的位置:网站首页 open打开文件后返回 linux使用open无法打开驱动解决方式

linux使用open无法打开驱动解决方式

2024-02-24 15:17| 来源: 网络整理| 查看: 265

  最近测试自己写的字符设备驱动例子(这里以test.ko为实例), 用户层多次调用open("/dev/test",O_RDWR)返回值为-1,根据返回状态捕获到错误(“No such device or address”),偶尔打开字符设备驱动也无法访问驱动函数(比如ioctl函数返回值是-1) 。后来改用动态分配设备号,代码内动态创建设备描述文件(/dev/test)后每次都可以成功open,并且可以成功调用驱动实现的ioctl、read以及write等函数。

  根据此方式编写一个简单的字符设备驱动以及用户层打开实例,以供参考:

//测试驱动实例 #include #include #include #include #include #define DevName "test" #define ClassName "class_test" struct class *mem_class; struct Pci_dev *test_devices; struct cdev _cdev; dev_t dev; static int Test_open(struct inode *inode,struct file *filp) { return 0; } static int Test_release(struct inode *inode,struct file *filp) { return 0; } //这里只添加了open、release函数,如果需要用到ioctl函数在file_operations描述项里添加即可 static struct file_operations test_fops = { .owner = THIS_MODULE, //.ioctl = Test_ioctl, .open = Test_open, .release = Test_release, }; static int Test_init_module(void)//驱动入口函数 { //动态分配设备号 int result = alloc_chrdev_region(&dev, 0, 2, DevName); if (result < 0) { printk("Err:failed in alloc_chrdev_region!\n"); return result; } //创建class实例 mem_class = class_create(THIS_MODULE,ClassName);// /dev/ create devfile if (IS_ERR(mem_class)) { printk("Err:failed in creating class!\n"); } //动态创建设备描述文件 /dev/test device_create(mem_class,NULL,dev,NULL,DevName); cdev_init(&_cdev,&test_fops); _cdev.owner = THIS_MODULE; _cdev.ops = &test_fops;//Create Dev and file_operations Connected result = cdev_add(&_cdev,dev,1); return result; } static void Test_exit_module(void)//驱动退出函数 { if (0 != mem_class) { device_destroy(mem_class,dev); class_destroy(mem_class); mem_class = 0; } cdev_del(&_cdev); } module_init(Test_init_module); module_exit(Test_exit_module); MODULE_AUTHOR(DevName); MODULE_LICENSE("GPL");

  用户层:

首先 sudo chmod 777(或666)/dev/test 修改文件访问权限, int fd; fd=open("/dev/test",O_RDWR);//打开驱动

  返回值: 这里写图片描述

  到这里字符设备驱动可以正常访问了,之后可以根据驱动需要的功能增加相应的函数!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3