我正在尝试开发Linux设备驱动程序,并且作为我的第一次尝试,我正在尝试开发具有以下文件选项的字符设备驱动程序,
struct file_operations fops{
.open=open_fun,
.release=release_fun,
.write=write_fun,
.read=read_fun,
};
当我使用insmod
加载驱动程序时,我看到/proc/devices
列出了char设备下的驱动程序,但我在/dev
中找不到它。谷歌搜索建议使用mknod
在/dev
中创建一个deivce,并将其与驱动程序的主要和次要关联。但是,尝试这样做会导致“权限被拒绝”错误,即使以超级用户身份完成也是如此。
加载内核模块时,如何使设备显示在/dev
中?我尝试了注册设备的较旧版本(register_chrdev
)和较新版本(cdev_init & cdev_add
),但没有一个可以正常工作。
谢谢,
米尔
答案 0 :(得分:4)
包含头文件 linux / device.h 和 linux / kdev_t.h
static struct class c_dev;
在驱动程序的__init功能中添加以下API
其中x - 加载驱动程序时在/ sys / class /中显示的名称。
其中d - 在/ dev。
下创建的设备文件其中dev是在使用 alloc_chrdev_region API期间初始化的第一个设备编号的变量,用于动态分配驱动程序的主编号
如需进一步参考,请浏览http://opensourceforu.com/2011/04/character-device-files-creation-operations/
链接答案 1 :(得分:3)
您可能需要create some udev rules告诉系统您需要创建哪些设备节点。
答案 2 :(得分:3)
通过在控制台运行以下命令创建节点后,我可以在/dev
内看到条目。
sudo mknod -m 0666 / dev / msio c 22 0
用户不是root用户,所以我不得不使用sudo。我的条目名称是msio
,一个字符设备,主要和次要编号分别为22,0。
如果可以以编程方式实现,我会告诉您。
答案 3 :(得分:2)
CONFIG_DEVTMPFS非常好,如果你可以在你的发行版中使用它。您可以在启动时为您启动内核自动挂载(CONFIG_DEVTMPFS_MOUNT)或手动挂载(挂载-t devtmpfs none / dev)。
答案 4 :(得分:1)
有两种方法可以在/dev
中创建设备文件
mknod
手动创建设备文件$ mknod -m <permission> <name> <device_type> <major> <minor>
chmod
进行更改。dev_t dev=0;
static struct class *devicefileClass;
deviceFileClass=class_create(THIS_MODULE,"device_name");
device_create( deviceFileClass , NULL , dev ,"device_name")
注意 class_create,device_create函数调用应该在您的__init
函数中。
并包含<linux/device.h>,<linux/kdev_t>
。
答案 5 :(得分:0)
首先你必须使用: sudo mknod / dev / devicename c 81 0
它在/ dev中创建设备文件,但您必须赋予它读/写权限。这样做,
sudo chmod 777 / dev / devicename
完成!!!