带有MainLine内核的GPIO Raspberry B型

时间:2017-05-26 00:09:51

标签: module kernel driver gpio

我编译了uboot和从kernel.org下载的主线内核,以便在Raspberry B类模块上运行。我在使用GPIO接口时遇到问题。我正在编写一个模块来管理两个I / O,其中一个应该生成irq。当我调用gpio_to_irq()或任何其他与gpio相关的内核api时,调用总是失败(返回码-517或-22)。在从github RPI存储库下载的raspberry内核上运行的相同代码可以正常工作。但是,主线内核支持BCM2835,它是RPI上使用的Soc。我的approch错在哪里? gpio_api调用如何失败?如果我手动找到GPIO号码(Virq)并且我用request_irq()请求它,即使使用kernel.org的主线内核,一切正常。

主线内核版本是4.11,而github的rpi内核版本是4.9.26。这是模块的init函数:

我为此道歉。我现在会尝试更多地玩弄。 Linux版本(主线)是4.11,而rpi linux版本是4.9.26。这是模块的init函数:

static int __init hello_init(void)
{
    int result;
    int temp;

    printk(KERN_INFO "Hello world!\n");
    printk(KERN_INFO "%s\n",Version);

  /* Registering device */

    result = register_chrdev(memory_major, "Bisio", &memory_fops);
    if (result < 0) 
    {
      printk(KERN_INFO "Memory Driver: Cannot Obtain Major Number %d\n", memory_major);
      return -1;
    }

  /* Allocating memory for the buffer */

    memory_buffer = kmalloc(MEMSIZE, GFP_KERNEL); 
    if (!memory_buffer) { 
      return -ENOMEM;
  } 
  memset(memory_buffer, 0, MEMSIZE);


   result = gpio_request(23,"MyIO");
   printk(KERN_INFO "gpio_request: %d\n",result);

   result = gpio_direction_input(23);
   printk(KERN_INFO "gpio_direction_input: %d\n",result);

   result = gpio_to_irq(23);
   printk(KERN_INFO "gpio_to_irq: %d\n",result);

  return 0;    // Non-zero return means that the module couldn't be loaded.

}

我为这个模块做了一个insmod:

[109.792257]什么都没有:加载out-of-tree模块会破坏内核。

[109.820350] Hello world!

[109.829341] Driver Version 1.27 - 10/09/2015 - 10:20

[109.841344] gpio_request:-517

[109.850737] gpio_direction_input:0

[109.860187] gpio_to_irq:-22

同时,对rpi内核执行相同操作(使用相同的gcc交叉编译器版本(5.20软浮点)编译)可正常工作,这是同一init函数的输出:

[47.927565]什么都没有:加载out-of-tree模块会破坏内核。

[47.939771] Hello world!

[47.942333] Driver Version 1.27 - 10/09/2015 - 10:20

[47.947411] gpio_request:0

[47.952798] gpio_direction_input:0

[47.956314] gpio_to_irq:183

我错过了什么? 任何帮助将不胜感激。 此致

Marco Bisio

0 个答案:

没有答案