我编译了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