input 層簡單分析

2021-06-28 00:38:10 字數 4271 閱讀 5070

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_connect

evdev = kzalloc(sizeof(struct evdev), gfp_kernel); // 分配乙個input_handle

// 設定

evdev->handle.dev = dev; // 指向左邊的input_dev

evdev->handle.name = evdev->name;

evdev->handle.handler = handler; // 指向右邊的input_handler

evdev->handle.private = evdev;

// 註冊

error = input_register_handle(&evdev->handle);

怎麼讀按鍵?

--------------------------

.......

evdev_read

// 無資料並且是非阻塞方式開啟,則立刻返回

if (client->head == client->tail && evdev->exist && (file->f_flags & o_nonblock))

return -eagain;

// 否則休眠

retval = wait_event_interruptible(evdev->wait,

client->head != client->tail || !evdev->exist);

誰來喚醒?

evdev_event

wake_up_interruptible(&evdev->wait);

evdev_event被誰呼叫?

在裝置的中斷服務程式裡,確定事件是什麼,然後呼叫相應的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子系統應用層(一)

一 input子系統架構 linux系統提供了input子系統,按鍵 觸控螢幕 鍵盤 滑鼠等輸入都可以利用input介面函式來實現裝置驅動,下面是input子系統架構 input驅動程式的主裝置號是13 次裝置號的分布如下 joystick遊戲杆 0 16 mouse滑鼠 32 62 mice滑鼠 ...

簡單遮罩層

效果 1 heml頁面的原始碼 點選我我是彈出的遮罩層 關閉2.css檔案 con shade 遮罩層 greybackground closebtn 3.js function 當瀏覽器視窗大小改變時 window resize function 當拉動滾動條時,彈出層跟著移動 window sc...