LINUX.ORG.RU

Не работает модуль ядра для обработки прерывания


0

1

Ниже привожу код. Пытался сделать обработчик нажатия клавиатуры. На деле после установки командой sudo insmod int.ko ничего не происходит. Лишь появился warnings: http://img.flashtux.org/upload/img132df7a5abx605cd48f.png

Что я делаю не так?

//int.c
#include <linux/kernel.h>    
#include <linux/module.h>    
#include <linux/workqueue.h> 
#include <linux/sched.h>
#include <linux/interrupt.h> 
#include <asm/io.h>

#define MY_WORK_QUEUE_NAME "WQsched.c"

static struct workqueue_struct *my_workqueue;

static void
got_char (struct work_struct *work)
{
    //unsigned char status = inb (0x64);
    unsigned char scancode = inb (0x60);
    printk ("Scan Code %x %s.\n",
            (int)*((char *)scancode) & 0x7F,
            *((char *)scancode) & 0x80 ? "Released" : "Pressed");
}

irqreturn_t
irq_handler (void)
{
    static int initialised = 0;

    static struct work_struct task;

    if (initialised == 0) {
        INIT_WORK (&task, got_char);
        initialised = 1;
    } else {
        PREPARE_WORK (&task, got_char);
    }

    queue_work (my_workqueue, &task);

    return IRQ_HANDLED;
}

static int
init_interrupt (void)
{
    my_workqueue = create_workqueue (MY_WORK_QUEUE_NAME);

    free_irq(1, NULL);

    return request_irq (1,
            (irq_handler_t)irq_handler,
            IRQF_SHARED,
            "test_keyboard_irq_handler",
            (void *)(irq_handler));
}

static void
cleanup_interrupt (void)
{
    free_irq (1, NULL);
}

module_init (init_interrupt);
module_exit (cleanup_interrupt);

MODULE_LICENSE  ("GPL");
#Makefile
obj-m += int.o
all:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

Обработчик прерывания клавиатуры уже есть, он его обрабатывает, а твой просто не вызываетсяю

tailgunner ★★★★★
()
Ответ на: комментарий от Ignotus

Думаю. что никак. Что за странная блажь - отбирать прерывание у работающего драйвера? Если пишешь лабу, делай это в виртуалке - собери ядро без поддержки клавиатуры, и на IRQ никто не будет претендовать.

tailgunner ★★★★★
()
Ответ на: комментарий от Ignotus

Для старых ядер 2006-того года ведь работало

Почему 2006?

> * Copyright (C) 2001 by Peter Jay Salzman

И вполне вероятно, что сейчас free_irq тупо фейлит (как и следует).

tailgunner ★★★★★
()
Ответ на: комментарий от Ignotus

LKMPG всегда был малополезен. Впрочем, если тебя интересует, почему именно пример не работает, и на каких именно ядрах он перестал работать, ты можешь это выяснить.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

99% его хендлер вызывается, просто автор топика - ИДИОТ:

- выложил скриншот непонятно чего, нормальных (текстовых) логов ядра

- ТС не понял, что ядро ругается на free_irq (95% из-за того, что он передал заместо «печеньки» NULL).

- и т.д.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.