input子系統
input子系統**位置:kernel/drivers/input/input.c
這個檔案完成input系統最原始的初始化,subsys_initcall開始子系統的初始化,並封裝export_symbol給其他驅動呼叫的介面
在input_init中,三件事:
err = class_register(&input_class);
if (err)
err = input_proc_init();
if (err)
goto fail1;
err = register_chrdev(input_major, "input", &input_fops);
if (err)
建立乙個class,proc目錄下節點,和註冊input的方法集
對開發很有用的是proc的節點,我們看下**,才能更好地利用它
static int __init input_proc_init(void)
分如下步驟:
1. "bus/input"目錄建立
2. 在"bus/input"目錄下建立proc目錄devices,它的方法集有
static const struct file_operations input_devices_fileops = ;
這裡要高度重視這些方法集,因為方法集才是建立這些節點的目的,核心很多的呼叫都是通過方法集呼叫,所以即使用sourceinsight也很難直接找到註冊位置和呼叫位置
static const struct seq_operations input_devices_seq_ops = ;
static int input_proc_devices_open(struct inode *inode, struct file *file)
open方法就完成一件事:open這個節點的檔案,這個節點又對應著一系列的呼叫,分別有start next stop show;看方法的名字也能知道,這些方法的呼叫是先start,再next,最後stop,可以通過show,用cat檢視一些資訊。明白這些,就可以理解,這些方法裡面,是一些控制代碼的鍊錶,每次呼叫device的open,都會把devices的所有控制代碼,按照start-next-next-...-stop的方式,這就實現了乙個open,能夠有多個功能。
「handlers」節點和「devieces」節點註冊方式類似,裡面關聯的是很多的中斷控制代碼
static const struct seq_operations input_handlers_seq_ops = ;
static int input_proc_handlers_open(struct inode *inode, struct file *file)
static const struct file_operations input_handlers_fileops = ;
我們實際用下這些節點
shell@android:/proc/bus/input # ls
devices
handlers
shell@android:/proc/bus/input #
shell@android:/proc/bus/input # cat devices
i: bus=0000 vendor=0001 product=0001 version=0100
n: name="headsetdet"
p: phys=
s: sysfs=/devices/platform/headsetdet.0/input/input0
u: uniq=
h: handlers=event0
b: prop=0
b: ev=3
b: key=1
i: bus=0019 vendor=0001 product=0001 version=0100
n: name="keypad"
p: phys=gpio-keys/input0
s: sysfs=/devices/platform/keypad/input/input1
u: uniq=
h: handlers=kbd event1 keychord
b: prop=0
b: ev=3
b: key=8000 100000 0 0 0
i: bus=0000 vendor=0000 product=0000 version=0000
n: name="ft5x0x_ts"
p: phys=
s: sysfs=/devices/virtual/input/input2
u: uniq=
h: handlers=cpufreq_interactive event2
b: prop=2
b: ev=9
b: abs=2658000 0
i: bus=0000 vendor=0000 product=0000 version=0000
n: name="lightsensor-level"
p: phys=
s: sysfs=/devices/virtual/input/input3
u: uniq=
h: handlers=event3
b: prop=0
b: ev=9
b: abs=100 10000000
shell@android:/proc/bus/input #
shell@android:/proc/bus/input # cat handlers
n: number=0 name=kbd
n: number=1 name=cpufreq_interactive
n: number=2 name=sysrq (filter)
n: number=3 name=evdev minor=64
n: number=4 name=keychord
shell@android:/proc/bus/input #
cpufreq_interactive就是interactive策略,增加對input及時響應的乙個控制代碼。
用request irq註冊乙個中斷
request irq函式做的工作 1 分配乙個irqaciton結構體 2 把自己的中斷程式賦值給aciton 3 把這個結構體放入irq desc irq 的aciton煉表裡 把aciton放入鍊錶之前,還需要判斷這個中斷的標誌,如果是irqf shared,表示可以多個action共享中斷線...
乙個ViewController對應多個Xib
比例係數開發的大概步驟 1.選著乙個尺寸作為開發設計的基準 2.制定其他螢幕的適配規則 3.特殊的適配給出具體的效果圖 例如攜程的比例係數 5 autosizescalex 1 autosizescaley 1 6 autosizescalex 1.171875 autosizescaley 1.1...
zynq中乙個中斷程式分析
原文 本文通過分析乙個中斷例程來了解zynq中斷執行過程 儲存處理器當前狀態,設定中斷遮蔽位和各條件標誌位 設定當前程式狀態暫存器cpsr中相應位 將lr mode暫存器設定成返回位址 跳轉到中斷向量位址執行,從而跳轉到相應的中斷程式中執行 執行中斷處理函式內容 恢復被遮蔽的中斷遮蔽位 返回到被中斷...