核心 乙個中斷如何對應多個控制代碼

2021-06-07 06:22:10 字數 3313 閱讀 2200

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暫存器設定成返回位址 跳轉到中斷向量位址執行,從而跳轉到相應的中斷程式中執行 執行中斷處理函式內容 恢復被遮蔽的中斷遮蔽位 返回到被中斷...