input 輸入子系統 基礎知識 1

2021-09-09 06:19:29 字數 3549 閱讀 3007

drivers/input/input.c:

input_init > err = register_chrdev(input_major, "input", &input_fops);

static const struct file_operations input_fops = ;

問:怎麼讀按鍵?

input_open_file

struct input_handler *handler = input_table[iminor(inode) >> 5];

new_fops = fops_get(handler->fops)  //  =>&evdev_fops

file->f_op = new_fops;

err = new_fops->open(inode, file);

input_table陣列由誰構造?

input_register_handler

註冊input_handler:

input_register_handler

// 放入陣列

input_table[handler->minor >> 5] = handler;

// 放入鍊錶

list_add_tail(&handler->node, &input_handler_list);

// 對於每個input_dev,呼叫input_attach_handler

list_for_each_entry(dev, &input_dev_list, node)

input_attach_handler(dev, handler); // 根據input_handler的id_table判斷能否支援這個input_dev

註冊輸入裝置:

input_register_device

// 放入鍊錶

list_add_tail(&dev->node, &input_dev_list);

// 對於每乙個input_handler,都呼叫input_attach_handler

list_for_each_entry(handler, &input_handler_list, node)

input_attach_handler(dev, handler); // 根據input_handler的id_table判斷能否支援這個input_dev

input_attach_handler

id = input_match_device(handler->id_table, dev);

error = handler->connect(handler, dev, id);

註冊input_dev或input_handler時,會兩兩比較左邊的input_dev和右邊的input_handler,

根據input_handler的id_table判斷這個input_handler能否支援這個input_dev,

如果能支援,則呼叫input_handler的connect函式建立"連線"

怎麼建立連線?

1. 分配乙個input_handle結構體

2. input_handle.dev = input_dev;  // 指向左邊的input_dev

input_handle.handler = input_handler;  // 指向右邊的input_handler

3. 註冊:

input_handler->h_list = &input_handle;

inpu_dev->h_list      = &input_handle;

誰來喚醒?

evdev_event

wake_up_interruptible(&evdev->wait);

evdev_event被誰呼叫?

猜:應該是硬體相關的**,input_dev那層呼叫的

在裝置的中斷服務程式裡,確定事件是什麼,然後呼叫相應的input_handler的event處理函式

gpio_keys_isr

// 上報事件

input_event(input, type, button->code, !!state);

input_sync(input);

input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)

struct input_handle *handle;

list_for_each_entry(handle, &dev->h_list, d_node)

if (handle->open)

handle->handler->event(handle, type, code, value);

怎麼寫符合輸入子系統框架的驅動程式?

1. 分配乙個input_dev結構體

2. 設定

3. 註冊

4. 硬體相關的**,比如在中斷服務程式裡上報事件

struct input_dev {

void *private;

const char *name;

const char *phys;

const char *uniq;

struct input_id id;

unsigned long evbit[nbits(ev_max)];   // 表示能產生哪類事件

unsigned long keybit[nbits(key_max)]; // 表示能產生哪些按鍵

unsigned long relbit[nbits(rel_max)]; // 表示能產生哪些相對位移事件, x,y,滾輪

unsigned long absbit[nbits(abs_max)]; // 表示能產生哪些絕對位移事件, x,y

unsigned long mscbit[nbits(msc_max)];

unsigned long ledbit[nbits(led_max)];

unsigned long sndbit[nbits(snd_max)];

unsigned long ffbit[nbits(ff_max)];

unsigned long swbit[nbits(sw_max)];

測試:1. 

hexdump /dev/event1  (open(/dev/event1), read(), )

秒        微秒    類  code    value

0000000 0bb2 0000 0e48 000c 0001 0026 0001 0000

0000010 0bb2 0000 0e54 000c 0000 0000 0000 0000

0000020 0bb2 0000 5815 000e 0001 0026 0000 0000

0000030 0bb2 0000 581f 000e 0000 0000 0000 0000

2. 如果沒有啟動qt:

cat /dev/tty1

按:s2,s3,s4

就可以得到ls

或者:exec 0

3. 如果已經啟動了qt:

可以點開記事本

然後按:s2,s3,s4

input輸入子系統分析1

input register handler struct input handler handler 1 在開始的時候讓input handler的h list指向自己,也就是乙個空的迴圈鍊錶,在後來註冊input handle的時候 讓input handle的hnode與匹配的input ha...

input輸入子系統 大致流程

1 分配乙個裝置結構體 input dev input allocate device input allocate device 函式在記憶體中為輸入裝置結構體分配乙個空間,並對其主要的成員進行了初始化 2 定義裝置所支援的動作和鍵值 set bit ev syn,input dev evbit ...

核心輸入子系統input解析

android x windows qt等眾多應用對於linux系統中鍵盤 滑鼠 觸控螢幕等輸入裝置的支援都通過 或越來越傾向於標準的input輸入子系統。因為input子系統已經完成了字元驅動的檔案操作介面,所以編寫驅動的核心工作是完成input系統留出的介面,工作量不大。但如果你想更靈活的應用它...