Linux Input 서브시스템 분석

android에서 정시alarm 기능은 매우 자주 사용되는데 현재 어떻게 실현되는지 분석하고자 합니다. 여기서 아래에서 위로 설명하겠습니다.
입력 서브시스템은 input 서브시스템이라고도 부른다.그 구축은 매우 유연해서 간단한 함수만 호출하면 입력 장치의 기능을 응용 프로그램에 나타낼 수 있다.
Input 서브시스템은 주로 다음과 같은 구조를 가지고 있습니다.
struct input_dev;//는 입력 장치에 대한 정보(예를 들어 지원하는 키 코드, s장치의 이름, 장치가 지원하는 이벤트)를 포함하는 입력 장치를 나타낸다.        struct input_handler;//입력 이벤트에 대한 구체적인 처리를 나타낸다.입력 장치의 기능을 위해 인터페이스를 실현하였다.입력 이벤트가handler 처리에 최종적으로 전달됩니다.        struct input_handle;struct input 연결에 사용dev 및 struct inputhandler
입력 서브시스템은 드라이브층, 입력 서브시스템 핵심층(input core)과 이벤트 처리층(event handler) 세 부분으로 구성되어 있다.키보드 버튼과 같은 입력 이벤트는 드라이버 -> 시스템 핵심 층 -> 이벤트 처리 층 -> 사용자 공간의 순서에 따라 사용자 공간에 도착하여 응용 프로그램에 전송됩니다.그 중에서 input core는 내부 원본 코드에서driver/input/input입니다.c 및 관련 헤더 파일 실현.핵심 층은 아래에 장치 구동 인터페이스를 제공하고 위에 이벤트 처리 층의 프로그래밍 인터페이스를 제공한다.입력 서브시스템은 주로 상기 세 개의 구조체와 관련된다.
linux 구동을 하는데 일반적으로 구조체로 장치를 설명한다.우리가 해야 할 일은 상응하는 구조체 공간을 신청한 다음에 관련 구조체 내 구성원을 채우는 것이다.그리고 이 구조체를 등록하기;주로 이렇게 세 걸음;
1)  struct input_dev *input_dev; 2)input_dev = input_allocate_device();//해당 구조체 공간 신청
        input_dev ->evbit[0] = 0xb;         input_dev ->keybit[0xa] = 0x400;         input_set_abs_params(input_dev, ABS_X, 0, 0x3FF, 0, 0);         input_set_abs_params(input_dev, ABS_Y, 0, 0x3FF, 0, 0);         input_set_abs_params(input_dev, ABS_PRESSURE, 0, 1, 0, 0);         input_dev ->name = s3c2410ts_name;         input_dev ->id.bustype = BUS_RS232;         input_dev ->id.vendor = 0xDEAD;         input_dev ->id.product = 0xBEEF;         input_dev ->id.version = S3C2410TSVERSION;//관련 구조체 내 구성원을 채우기;
3)input_register_device(input_dev);//등록 struct inputdev 이 구조체
그리고 코드에 등록하면 inputdev, 다음과 같은 절차를 밟았습니다.
input_register_device()                 -->input_attach_handler();                         -->input_match_device();                         -->handler->connect();
이 장치를 등록한 후, 그것과 일치하는 struct handler 구조를 찾아갑니다.찾은 후 struct handler의connect () 방법을 호출하기;
간단한 실례
#include <linux/module.h>
        #include <linux/kernel.h>
        #include <linux/init.h>
        #include <linux/fs.h>
        #include <linux/cdev.h>
        #include <linux/irqreturn.h>
        #include <asm/io.h>
        #include <asm/irq.h> 
        #include <linux/input.h>
        struct file_operations hello_fops = {
                .owner = THIS_MODULE
        };
                static struct input_dev *button_dev; /*       */ 
                static irqreturn_t button_interrupt(int irq, void *dummy) 
                /*      */ 
                { 
                        input_report_key(button_dev, BTN_0, inb(BUTTON_PORT) & 1); 
                        /*              */ 
                        input_sync(button_dev); /*     ,        */ 
                        return IRQ_HANDLED; 
                } 
                static int __init button_init(void) /*    */ 
                { 
                        int error;
                        int result;
                        dev = MKDEV (hello_major, hello_minor);
                        result = register_chrdev_region (dev, number_of_devices, "hello");
                        if (result<0) {
                        printk (KERN_WARNING "hello: can't get major number %d
", hello_major); return result; } /* dynamic allocation */ cdev_init (cdev, &hello_fops); cdev->owner = THIS_MODULE; result = cdev_add (cdev, dev, 1); if (request_irq(BUTTON_IRQ, button_interrupt, 0, "button", NULL)) /* */ { /* , */ printk(KERN_ERR "button.c: Can't allocate irq %d
", button_ irq); return -EBUSY; } button_dev = input_allocate_device(); /* */ if (!button_dev) /* */ { printk(KERN_ERR "button.c: Not enough memory
"); error = -ENOMEM; goto err_free_irq; } button_dev->evbit[0] = BIT_MASK(EV_KEY); /* */ button_dev->keybit[BIT_WORD(BTN_0)] = BIT_MASK(BTN_0); error = input_register_device(button_dev); /* */ if (error) { printk(KERN_ERR "button.c: Failed to register device
"); goto err_free_dev; } return 0; err_free_dev: /* */ input_free_device(button_dev); err_free_irq: free_irq(BUTTON_IRQ, button_interrupt); return error; } static void __exit button_exit(void) /* */ { input_unregister_device(button_dev); /* */ free_irq(BUTTON_IRQ, button_interrupt); /* */ } module_init(button_init); module_exit(button_exit);

좋은 웹페이지 즐겨찾기