Linux Input 서브시스템 분석
입력 서브시스템은 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);
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
용감한 바로 가기 및 우분투 응용 프로그램안녕하세요 여러분, 이 기사에서는 모든 사이트에서 pwa를 생성하고 실행기 응용 프로그램으로 추가하는 방법을 설명하고 싶습니다. 일부 웹사이트는 PWA로 설치를 허용하지 않지만 유사한 애플리케이션을 원합니다. 1. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.