如果有如下所述的三个I2C设备,并且在设备驱动程序init()函数中,则调用以下调用register_chrdev(89,“i2c”,& i2cfops)。注意,名称是“i2c”而不是“i2c-0”/“i2c-1”/“i2c-2”。如何在i2cdriver_open或i2cdriver_ioctl函数中驱动器知道次要编号或调用该函数的I2C设备?
请参阅下面的详细信息。
crw-r--r-- 1 0 0 89, 0 Jun 12 09:15 /dev/i2c-0
crw-r--r-- 1 0 0 89, 1 Jun 12 09:15 /dev/i2c-1
crw-r--r-- 1 0 0 89, 2 Jun 12 09:15 /dev/i2c-2
应用:
int main(void)
{
int fd;
fd = open("/dev/i2c-0");
(void) ioctl(fd, ...);
return 0;
}
驱动:
static struct file_operations i2cfops;
int i2cdriver_open(struct inode * inodePtr, struct file * filePtr);
int i2cdriver_ioctl(struct inode * inodePtr, struct file * filePtr, unsigned int ui, unsigned long ul);
int driver_init(void)
{
i2cfops.open = &i2cdriver_open;
i2cfops.ioctl = &i2cdriver_ioctl;
(void) register_chrdev(89, "i2c", &i2cfops);
return 0;
}
int i2cdriver_open(struct inode * inodePtr, struct file * filePtr)
{
/*In here, how to know the minor number or for which I2C device this function has been invoked?*/
}
int i2cdriver_ioctl(struct inode * inodePtr, struct file * filePtr, unsigned int ui, unsigned long ul)
{
/*In here, how to know the minor number or for which I2C device this function has been invoked?*/
}
答案 0 :(得分:2)
总的来说,每当您发布有关Linux内核/驱动程序开发的问题时,请始终包含您正在使用的内核版本。它可以更容易地为您提供实际适用于您的内核的答案。
这应该能够检索您的次要号码:
/* Add this header if you don't already have it included */
#include <linux/kdev_t.h>
/* Add this macro function wherever you need the minor number */
unsigned int minor_num = MINOR(inodePtr -> i_rdev);
答案 1 :(得分:0)
当使用相同的设备驱动程序创建多个设备节点时,您拥有的多个设备具有相同的主编号,但具有不同的次编号。
要检索被调用的特定设备,您只需要知道在文件open()函数中被调用的设备的次要数字即可。
#include <kdev_t.h>
unsigned int minor_num;
static int file_open(struct inode *inode, struct file *file){
/*The line below is to be written in your open function*/
minor_num = MINOR(inode->i_rdev);
printk(KERN_INFO "Device file opened\n");
return 0;
}
这将为您提供设备号,您可以使用它来执行任何特定于设备的任务。