Я пытаюсь правильно зарегистрировать прерывание в ядре для пользовательского интерфейса.Обработка прерывания в символьном устройстве
Удивительно, но я не нашел много примеров в ядре для этого.
обработчик прерываний
static irqreturn_t irq_handler(int irq, void *dev_id)
{
struct el_irq_dev *el_irq = &el_irq_devices[0];
printk("irq in\n");
spin_lock(&el->my_lock,flags);
clear_interrupt()
some_buffer[buf_wr] = ch;
el_irq->buf_wr++;
if (el_irqbuf_wr >= 16)
el_irqbuf_wr = 0;
spin_unlock(&el->my_lock,flags);
wake_up_interruptible(&el->pollw);
return IRQ_HANDLED;
}
IOCTL для ожидания на прерываниях
static long el_device_ioctl(struct file *filp,
unsigned int ioctl_num,
unsigned long ioctl_param)
{
struct el_irq_dev *el_irq = &el_irq_devices[0];
switch (ioctl_num) {
case IOCTL_WAIT_IRQ: <<<---- using ioctl (no poll) to wait on interrupt
wait_event_interruptible(el_irq->pollw, &el_irq->buf_wr != &el_irq->buf_rd) ;
spin_lock(&el_irq->my_lock);
if (el_irq->buf_wr != &el_irq->buf_rd)
{
my_value=some_buffer[el_irq->buf_rd];
el_irq->buf_rd++;
if (el_irq->buf_rd >= 16)
el_irq->buf_rd = 0;
}
spin_unlock(&el_irq->my_lock);
copy_to_user(ioctl_param,&my_value,sizeof(my_value));
default:
break;
}
return 0;
}
Мой вопрос:
- Должны ли мы поставить ясно прерываний (clear_interrupt ()) в fpga в прерывании до или после wake_up? Можем ли мы провести событие прерывания в обработчике пользовательского пространства (IOCTL_WAIT_IRQ) вместо того, чтобы очистить прерывание в обработчике прерываний ?
- Как вы можете видеть в коде, я использую циклический буфер, чтобы обрабатывать случаи, когда обработчик пользовательского пространства пропускает прерывания. Это действительно необходимо или мы можем предположить, что нет промахов? Иными словами, разве reasnoble предположить, что никогда не должны быть пропущены прерывания? так что вызов ioctl никогда не должен видеть более одного прерывания ожидания? Если да - возможно, мне не нужен буферный механизм между обработчиком прерываний и обработчиком ioctl.
Спасибо, Ран
Зачем вам все, что в первую очередь? – 0andriy
У нас есть пространство памяти fpga, и вместо этого вместо этого выполняем большинство драйверов в пользовательском пространстве и просто передаем прерывание в пространство пользователей из ядра – ransh
Какая память? Общее назначение? Почему бы не использовать DMA в драйвере ядра для него? – 0andriy