最近测试自己写的字符设备驱动例子(这里以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 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐