【问题标题】:Linux kernel insmod failed with error Invalid parametersLinux 内核 insmod 失败并出现错误 Invalid parameters
【发布时间】:2021-03-20 13:02:02
【问题描述】:

我有一个简单的内核模块,想定义一个 IRQ。如果我在代码中调用以下函数,则无法插入模块:

   result = request_irq(12,     
                        test_irq,  
                        0,   
                        "testgpio", 
                        NULL); 

这是来自 insmod 的错误:

insmod: ERROR: could not insert module gpioc.ko: Invalid parameters

硬件是具有 2 GB 和 Ubuntu 64 位的 RPI 4。

static irqreturn_t test_irq(int irq, void *data)
{
    /*interrupt-handling*/

    return IRQ_HANDLED;
}

@我试过这个来获取 irq 号但没有成功:

  struct gpio_desc *gpio = NULL;
   gpio = gpiod_get(NULL, "SPI_CE0_N", GPIOD_OUT_HIGH);
    if (NULL == gpio){
      printk(KERN_INFO "GPIO_TEST: invalid GPIO16\n");
      return -ENODEV;
   }

   int n = gpiod_to_irq(gpio);
    if (n <= 0){
      printk(KERN_INFO "GPIO_TEST: invalid IRQ\n");
      return -ENODEV;
   }

不清楚使用函数“gpiod_get”。这里尤其是第一个参数!

有人知道工作示例在哪里吗?

【问题讨论】:

  • 如何插入模块?命令行?
  • sudo insmod gpioc.ko
  • 内核日志中是否有任何消息:“dmesg”命令的结果?
  • GPIO_TEST:中断请求结果为:-22
  • 可以分享一下 /proc/interrupts 的内容吗?

标签: linux ubuntu-20.04


【解决方案1】:

根据 cmets,显然您从 request_irq() 收到 EINVAL 错误。请求的 IRQ 可能不正确。对于 GPIO,您可能需要使用 gpio_to_irq() 函数来获取与给定 GPIO 关联的 IRQ。

GPIO documentation 文档提供了 GPIO 编号的引脚。后者被传递给 gpio_to_irq() 以获取 IRQ。

【讨论】:

  • Tnx,如何获取 gpiod_to_irq 的参数。我阅读了文档,但这对我来说并不清楚。试过:gpio = gpiod_get(NULL, "SPI_CE0_N", GPIOD_OUT_HIGH);
  • 我更新了答案以从引脚获取 IRQ。
  • 如果您认为您的意思是“通过 libgpiod 使用标准内核接口的 C/C++ GPIO”但找不到代码。问题仅在于在内核模式下使用 gpiolib 而不是在用户领域。
  • 它在 Linux 内核中。看这个例子(法语但例子程序是英语):blaess.fr/christophe/2014/01/22/… 另一个例子:blaess.fr/christophe/2017/06/06/…
  • 对不起,代码使用的是GPIO而不是GPIOLib。关键是gpiolib使用了设备树。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 2021-09-10
  • 1970-01-01
  • 2018-02-24
  • 2012-09-24
相关资源
最近更新 更多