linux使用open無法開啟驅動解決方式
阿新 • • 發佈:2019-01-31
最近測試自己寫的字元裝置驅動例子(這裡以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);//開啟驅動
返回值:
到這裡字元裝置驅動可以正常訪問了,之後可以根據驅動需要的功能增加相應的函式!