1. 정의된 구조체는 input_dev
를 상속합니다Struct bma150_data {
Structi2c _ client * bma150 _ client;
Struct bma150 _ platform _ data * platform _ data;
Intirq;
Atomic_t delay;;
Unsigned char mode;;
Structinput _ dev * input;
Struct BMA 150 ACC 값 :
Struct mutex value_mutex;;
Struct mutex mode_mutex;;
Structdelayed _ workwork;
Structwork _ structirq _ work;
}
2. input_dev 에 이름과 버스 유형을 지정합니다. input 이벤트 유형에 대해서는 다음 코드를 참조할 수 있습니다
EV_MSC 유형 참조 아래
Set_bit(EV_MSC, dev-gt;; Evbit);
Set_bit(MSC_RAW, dev-gt;; Mscbit);
EV_ABS 유형 참조 아래
Input-gt;; Evbit [0] = bit (ev _ ABS);
Input-gt;; Absbit [0] = bit (ABS _ x) | bit (ABS _ y) | bit (ABS _ z);
Input_set_capability 실제 호출도 __set_bit,
입니다Input_set_abs_params 호출은 실제로 set_bit 이며 매개변수 (dev, axis, min, max, fuzz, flat) fuzz 에 필터 효과가 있습니다
3. input_register_device(dev) 를 통해 input 디바이스 등록
Static int bma150 _ input _ init (struct bma150 _ data * bma150)
{
Structinput _ dev * dev;
Interr;
Dev = input _ allocate _ device ();
If (! Dev)
Return -ENOMEM;;
Dev-gt;; Name = SENSOR_NAME;;
Dev-gt;; Id.bustype = BUS_I2C;;
Input_set_capability(dEV, ev
_ABS, ABS _ misc);
Input_set_abs_params(dev, ABS_X, ABSMIN_2G, ABSMAX_2G, 0,0);
Input_set_abs_params(dev, ABS_Y, ABSMIN_2G, ABSMAX_2G, 0,0);
Input_set_abs_params(dev, ABS_Z, ABSMIN_2G, ABSMAX_2G, 0,0);
Input_set_drvdata(dev, bma150);
Err = input _ register _ device (dev);
If (err lt;; 0) {
Input _ free _ device (dev);
Return err;;
}
Bma 150-gt; Input = dev;;
Return 0;;
}
입력 번호
를 지정할 수 있다고 합니다Dev-gt;; Phys = "BMA 150/input 0";
Dev-gt;; Id.bustype = BUS_HOST;;
4. 인터럽트 함수 또는 작업 대기열에서 input_event 에스컬레이션 이벤트 호출
Static inline void input _ report _ ABS (struct input _ dev * dev, unsigned int code, int value)
{
Input_event(dev, EV_ABS, 코드, 값);
}
Input_event 함수 설명, input 호출 input_handle_event
다양한 이벤트 유형에 대한 처리는 주로 input_handle_event 함수에 반영됩니다
Static void input _ handle _ event (structinput _ dev * dev,
Unsigned int type, unsigned int code, int value)
{
Intdisposition = input _ ignore _ event; //이벤트 무시
스위치 (유형) {
Case ev _ syn:
스위치 (코드) {
Casesyn _ config:
Disposition = input _ pass _ to _ all; //디바이스 및 handle 에 전달 처리
브레크;
Casesyn _ report:
If (! Dev-gt;; S
Ync) {
Dev-gt;; Sync = true;;
Disposition = input _ pass _ to _ handlers; //동기화 이벤트를 처리하기 위해 handle 에 전달
}
브레크;
Casesyn _ mt _ report:
Dev-gt;; Sync = false;;
Disposition = input _ pass _ to _ handlers; //핸드에게 멀티 터치 처리 전달
브레크;
}
브레크;
Case ev _ key:
If (if (is_event_supported(code (코드, dev-gt;; 키 비트, 키 _ 최대) amp; Amp;;
! ! Test _ bit (코드, dev-gt;; 키)! = 값) {
If (값! = 2) {
_ _ change _ bit (코드, dev-gt;; 키);
If (값)
Input_start_autorepeat(dev, code);
Else
Input _ stop _ autorepeat (dev);
}
Disposition = input _ pass _ to _ handlers;
}
브레크;
Case ev _ SW://헤드폰 이벤트
If (if (is_event_supported(code (코드, dev-gt;; Swbit, SW_MAX) amp;; Amp;;
! ! Test _ bit (코드, dev-gt;; Sw)! = 값) {
_ _ change _ bit (코드, dev-gt;; Sw);
Disposition = input _ pass _ to _ handlers;
}
브레크;
Case ev _ ABS:
If (if (is_event_supported(code (코드, dev-gt;; Absbit, ABS_MAX))
Disposition = input _ handle _ ABS _ event (dev, 코드, amp;; Value); //여기서 호출된 input_handle_abs_event 는 마지막 값과 이번 값이 같은 이벤트를 필터링합니다
브레크;
Case ev _ rel:
If (is_event_su
P ported (코드, dev-gt;; Relbit, REL_MAX) amp;; Amp;; 값)
Disposition = input _ pass _ to _ handlers;
브레크;
Case ev _ MSC:
If (if (is_event_supported(code (코드, dev-gt;; Mscbit, MSC_MAX))
Disposition = input _ pass _ to _ all;
브레크;
Case ev _ led:
If (if (is_event_supported(code (코드, dev-gt;; Ledbit, LED_MAX) amp;; Amp;;
! ! Test _ bit (코드, dev-gt;; Led)! = 값) {
_ _ change _ bit (코드, dev-gt;; Led);
Disposition = input _ pass _ to _ all;
}
브레크;
Case ev _ snd:
If (if (is_event_supported(code (코드, dev-gt;; Sndbit, SND_MAX)) {
If (! ! Test _ bit (코드, dev-gt;; Snd)! =! ! 값)
_ _ change _ bit (코드, dev-gt;; Snd);
Disposition = input _ pass _ to _ all;
}
브레크;
Case ev _ rep:
If (code lt;; = rep _ maxamp; Amp;; Valuegt; = 0 amp;; Amp;; Dev-gt;; Rep [코드]! = 값) {
Dev-gt;; Rep [코드] = 값;
Disposition = input _ pass _ to _ all;
}
브레크;
Case ev _ ff:
If (valuegt; = 0)
Disposition = input _ pass _ to _ all;
브레크;
Case ev _ PWR:
Disposition = input _ pass _ to _ all;
브레크;
}
If (disposition! = input _ ignore _ eventamp; Amp;; 타입! = EV_SYN)
#111#