jz2440 輸入子系統分析

2021-10-06 12:48:46 字數 4230 閱讀 6512

編寫輸入子系統

彙總點這

之前我們自己寫驅動程式時,一般是這5個步驟

確定主裝置號(可以讓系統自動取)、

file_operations結構體、

open、read、write等函式、

register_chrdev函式註冊驅動、

unregister_chrdev解除安裝驅動。

但是在測試程式中,我們總以自己的方式開啟裝置檔案,如fd = open("/dev/***", o_rdwr);,但事實上應用程式千種多樣,並沒有約定俗成說是怎麼方式開啟裝置的,比如lcd驅動可能就是scanf()來獲取的。

問題就來了,怎麼讓驅動程式通用起來。

其實應用程式怎麼用驅動程式並不用我們考慮,事實上我們只要把自己的驅動程式融入核心裡,讓核心去用即可,這樣可以使我們的程式更通用。

其實核心已經把驅動分離分層了,包括「軟體層」和「硬體層」。

軟體層input_register_handler向上註冊handler,這個handler包括open、read、write等函式。

硬體層input_register_device向上註冊dev,包括硬體的引數。

input.c裡包含了輸入子系統的函式,在input_init函式裡有乙個register_chrdev函式並註冊了結構體input_fops

static int __init input_init(void)

但是input_fops這個函式裡只有input_open_file這個函式。

static const struct file_operations input_fops =

;

進入input_open_file這個函式,我們發現這個函式裡其實就是呼叫了new_fops裡面的open函式,而new_fops是從乙個handler獲取的,而handler又是從input_table獲取的。

static int input_open_file(struct inode *inode, struct file *file)

err = new_fops->open

(inode, file)

;...

}

input_table裡面的handler是**來的呢?其實就是input_register_handler裡面做的事

int input_register_handler(struct input_handler *handler)

list_add_tail

(&handler->node, &input_handler_list)

; list_for_each_entry

(dev, &input_dev_list, node)

input_attach_handler

(dev, handler)

; input_wakeup_procfs_readers()

; return 0;

}

其實這個函式大概做了三件事:

handler放進input_table陣列

handler放進鍊錶

呼叫input_attach_handler,與硬體層進行匹配,看是否支援

input.c裡還有乙個函式,input_register_device函式就是註冊硬體層的函式

int input_register_device(struct input_dev *dev)

這個函式也做了兩件事:

dev放進鍊錶

呼叫input_attach_handler軟體層handler進行匹配,看是否支援

input_attach_handler這個函式裡

先呼叫input_match_device進行handler->id_tabledev的匹配,匹配成功會進行connect

handler->id_table這個自然是軟體層的,而dev便是硬體層的。

static int input_attach_handler(struct input_dev *dev, struct input_handler *handler)

怎麼連線呢,其實不同的handler都是不一樣的,有空回來詳細記錄。

核心已經做好軟體層面了,不同的硬體裝置對應的硬體層的**都不一樣,就需要我們來編寫了。

分配乙個input_dev結構體

設定(能產生哪類事件、能產生這類操作裡的哪些事件)

註冊硬體相關的操作

static int buttons_init(void)

return 0;

}

中斷函式

int buttons_irq(int irq, void *dev_id)

else

return 0;

}

可以用hexdump /dev/event1命令來除錯,意思是以16進製制的資料來顯示/dev/event1

這裡呼叫的是evdev_read函式,裡面的evdev_event_to_user函式

資料報出的結構便是struct input_event_compat compat_event;

struct input_event_compat

;

這個結構表示的是:

32位的sec32位的usec16位的type16位的code32位的value

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

加入可重複事件後

set_bit(ev_rep, buttons_dev->evbit);
按鍵按下鬆開發現,螢幕不停輸出對應的字母,我原意是按住按鍵才不停輸出啊,原來是事件的值搞錯了,鬆開是0,按下是1,我搞反了。

input_event(buttons_dev, ev_key, pindesc->key_val, 0);

input輸入子系統分析

1.檢視input子系統支援哪些裝置 cat proc bus input devices 2.應用程式如何使用 fd mouse open dev input event0 o rdwr event1表示滑鼠事件,input下的裝置檔案主裝置號都為13,如下圖所示 根據開啟裝置的主裝置號為13,知...

JZ2440 系統時鐘

jz2440 系統時鐘。時鐘控制邏輯給整個晶元提供了三種時鐘。fclk 用於cpu核心 hclk 用於ahb匯流排上裝置,比如cpu核,儲存控制器,中斷控制器,lcd控制器,dma控制器,和usb主機模組,主要用於高效能模組 pclk 用於apb匯流排上裝置,比如watchdog,iis,i2c,p...

input輸入子系統分析1

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