gpt4 book ai didi

c - 在 Linux 中调试一个简单的字符驱动程序在 device_create() 上失败

转载 作者:IT王子 更新时间:2023-10-29 00:31:34 24 4
gpt4 key购买 nike

我写了一个简单的 char 驱动程序,现在想使用类在 udev 中自动注册它。我的代码包括加载驱动程序时调用的 init 函数和驱动程序加载其设备时调用的 probe 函数(当然还有它们的反等价 exit 删除)。问题:添加新设备后,我的 probe 函数在执行 device_create 命令时失败。现在我想知道为什么:

我怎样才能获得有关此命令失败原因的更多信息(除此之外)?缺少任何参数(例如我的 fooClass 全局声明是否存在问题,我是否应该将其移至 probe 函数,这在我看来没有意义,但在许多示例中显示)?或任何其他监督错误?

按照我的代码,我删除了大部分返回验证(如 IS_ERR())并清理函数以提高可读性。这两个变量是全局定义的:

static int foo_majNbr;
static struct class *fooClass;

初始化函数:

static int __init foo_init(void)
{
int rv;
dev_t devNbr;

/* Registering driver */
rv = pci_register_driver(&foo_driver);
/* ----> see answer below for correct order <---- */

/* Create device class */
fooClass = class_create(THIS_MODULE, CLASS_NAME);

/* Allocate device number, just one device for the moment */
rv = alloc_chrdev_region(&devNbr, 0, 1, DEVICE_NAME);
foo_majNbr = MAJOR(devNbr);

...
}

探测函数:

static int __devinit foo_probe(struct pci_dev *dev,
const struct pci_device_id *devId)
{
struct foo_dev *foo_dev = 0;
int rv = 0;

/* Allocate memory in Kernel (for parameters) */
foo_dev = kzalloc(sizeof(*foo_dev), GFP_KERNEL);
foo_dev->pci_dev = dev;
pci_set_drvdata(dev, foo_dev);

foo_dev->devNbr = MKDEV(foo_majNbr, 1);

/* Add class to device */
foo_dev->dev = device_create(fooClass, NULL, foo_dev->devNbr,
foo_dev, DEVICE_NAME);
if (IS_ERR(foo_dev->dev)) {
/* ----> INDICATES FAILURE HERE <---- */
}

/* Add char device */
cdev_init(&foo_dev->cdev, &foo_fops);
rv = cdev_add(&foo_dev->cdev, foo_dev->devNbr, 1);

/* Enabling device */
rv = pci_enable_device(dev);

...
}

最佳答案

你至少应该打印错误号才能知道原因。

pr_err("%s:%d error code %d\n", __func__, __LINE__, PTR_ERR(foo_dev->dev));
  • PTR_ERR():将无效指针转换为错误代码
  • ERR_PTR():将错误代码转换为无效指针
  • IS_ERR():检查指针是否无效并包含错误代码
  • IS_ERR_OR_NULL():和上面一样,加上它检查指针是否为NULL

在文件中Linux/include/uapi/asm-generic/errno-base.h您可以找到最常见的错误。如果此错误代码对您没有帮助,您可以转到 source code of device_create()找出您的错误产生的位置并了解原因。

也许在调用它之前打印 device_create() 的参数。

我知道,这不是那种神奇地解决您问题的答案:),但它是一种继续进行并找出原因的方法。

关于c - 在 Linux 中调试一个简单的字符驱动程序在 device_create() 上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25608168/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com