LINUX.ORG.RU

Сообщения Ignotus

 

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

Ниже привожу код. Пытался сделать обработчик нажатия клавиатуры. На деле после установки командой 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
Ignotus ()

RSS подписка на новые темы