linux使用open无法打开驱动解决方式
linux-dash
A beautiful web dashboard for Linux
项目地址:https://gitcode.com/gh_mirrors/li/linux-dash
免费下载资源
·
最近测试自己写的字符设备驱动例子(这里以test.ko为实例), 用户层多次调用open("/dev/test",O_RDWR)返回值为-1,根据返回状态捕获到错误(“No such device or address”),偶尔打开字符设备驱动也无法访问驱动函数(比如ioctl函数返回值是-1) 。后来改用动态分配设备号,代码内动态创建设备描述文件(/dev/test)后每次都可以成功open,并且可以成功调用驱动实现的ioctl、read以及write等函数。
根据此方式编写一个简单的字符设备驱动以及用户层打开实例,以供参考:
//测试驱动实例
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/module.h>
#include <linux/device.h>
#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);//打开驱动
返回值:
到这里字符设备驱动可以正常访问了,之后可以根据驱动需要的功能增加相应的函数!
GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e
added ecosystem file for PM2 4 年前
5def40a3
Add host customization support for the NodeJS version 4 年前
更多推荐
已为社区贡献4条内容
所有评论(0)