1. 程式人生 > >linux使用open無法開啟驅動解決方式

linux使用open無法開啟驅動解決方式

最近測試自己寫的字元裝置驅動例子(這裡以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);//開啟驅動

返回值:
這裡寫圖片描述

  到這裡字元裝置驅動可以正常訪問了,之後可以根據驅動需要的功能增加相應的函式!