1

Я пишу ядро ​​v4l2 драйвера для ov7670 CMOS элемента прикрепленных к GPIO булавки на Raspberry Pi. Я создал три IRQ линии (Pixel, HREF и Vsync)не удается получить доступ к/Proc/прерываний после free_irq

Вот как я просил их:

ret = request_irq( PX_IRQ, 
        ov7670rpi_pixel_interrupt, 
        irq_flags, 
        "ov7670rpi_px", 
        ov7670rpi_pixel_interrupt); 

ret = request_irq( HREF_IRQ, 
        ov7670rpi_href_interrupt, 
        irq_flags, 
        "ov7670rpi_href", 
        ov7670rpi_href_interrupt); 

ret = request_irq( VSYNC_IRQ, 
        ov7670rpi_vsync_interrupt, 
        irq_flags, 
        "ov7670rpi_vsync", 
        ov7670rpi_vsync_interrupt); 

Теперь, когда идет отлично:

#cat /proc/interrupts 
      CPU0  
3:  4168 ARMCTRL BCM2708 Timer Tick 
9:   0 ARMCTRL ov7670rpipx 
10:   0 ARMCTRL ov7670rpihref 
11:   0 ARMCTRL ov7670rpivsync 
32:  68523 ARMCTRL dwc_otg, dwc_otg_pcd, dwc_otg_hcd:usb1 
52:   0 ARMCTRL BCM2708 GPIO catchall handler 
65:  543 ARMCTRL ARM Mailbox IRQ 
66:   2 ARMCTRL VCHIQ doorbell 
75:   1 ARMCTRL 
77:  3439 ARMCTRL bcm2708_sdhci (dma) 
79:   0 ARMCTRL bcm2708_i2c.0, bcm2708_i2c.1 
80:   0 ARMCTRL bcm2708_spi.0 
83:   21 ARMCTRL uart-pl011 
84:  7436 ARMCTRL mmc0 
FIQ:    usb_fiq 
Err:   0 

Выглядит хорошо.

Это, как я отключить IRQs:

/* Disable Interrupts */ 
free_irq(PX_IRQ, ov7670rpi_pixel_interrupt); 
free_irq(HREF_IRQ, ov7670rpi_href_interrupt); 
free_irq(VSYNC_IRQ, ov7670rpi_vsync_interrupt); 

Я также пробовал:

/* Disable Interrupts */ 
free_irq(PX_IRQ, NULL); 
free_irq(HREF_IRQ, NULL); 
free_irq(VSYNC_IRQ, NULL); 

Оба способа сделать так, чтобы после того, как модуль выгружается, я не могу получить доступ к /прок/прерывания. Когда я пытаюсь cat /proc/interrupts, они блокируют систему.

+0

См. [Free_irq doc] (https://www.kernel.org/doc/htmldocs/kernel-api/API-free-irq.html). Вы убедились, что 'irq' отключен до' free_irq'? ** NULL ** не будет работать. Вам нужен тот же параметр 'dev_id', что и' request_irq'. Кроме того, версия ядра может помочь людям ответить. Зная о том, как работают * GPIO и прерывания, я думаю, что у вас неправильные цифры. Вы определили 'PX_IRQ' и т. Д.? –

+0

А вот цифры могут быть проблемой. Честно говоря, я использовал их как номера заполнителей, пока не понял правильные. Полагаю, это может легко нанести ущерб системе, если я просто выберу произвольные? Да, я определил PX_IRQ и т. Д. Где обычно можно найти подходящие линии для GPIO? В этом случае BCM2708 Спасибо –

+1

Ах, это выглядит как [bcm2708_gpio.c] (https://github.com/raspberrypi/linux/blob/rpi-3.6.y/arch/arm/mach-bcm2708/bcm2708. c) Предоставляет вспомогательную функцию для этого. фактически, возможно нет. Я думаю, что просто инициализирует накопитель ... –

ответ

1

Правильный способ сделать это - использовать gpio_request() с GPIO numbers.

#define PX_GPIO 9 
#define HREF_GPIO 10 
#define VSYNC_GPIO 11 

gpio_request(PX_GPIO, "v4l_rpi_px"); 
gpio_input(PX_GPIO); 
gpio_request(HREF_GPIO, "v4l_rpi_href"); 
gpio_input(HREF_GPIO); 
gpio_request(VSYNC_GPIO, "v4l_rpi_vsync"); 
gpio_input(VSYNC_GPIO); 

/* Now, gpio_to_irq() can be used. */ 
ret = request_irq(gpio_to_irq(PX_GPIO), 
       ov7670rpi_pixel_interrupt, 
       irq_flags, 
       "ov7670rpi_px", 
       ov7670rpi_pixel_interrupt); 
/* etc. */ 

bcm2708_gpio.c обеспечивает контроллер прерываний с GPIO как подробно описано в this question. См. Также GPIO documentation.

Ваш основной контроллер прерываний ARMCTRL имеет прерывания 52, как BCM2708 GPIO Catchall обработчика. Этот IRQ равен прикованным и поддерживает IRQ на каждом gpio. Контроллер для GPIO будет указан по-разному в /proc/interrupts как GPIO.

+0

Удивительно, спасибо! Я только что нашел фрагменты этой информации, и я работаю над ее написанием.Вы знаете, нужно ли мне вызвать gpio_request (...) перед free_irq (gpio_to_irq (...))? –

+0

'gpio_request()' для * получения ресурса gpio *. Возможно, что несколько драйверов могут использовать этот вывод. Это всегда должно быть на первом месте. Это несколько не связано с «irqs». Подробнее читайте в документации GPIO. –

Смежные вопросы