-- android 架構解析及驅動 鍵盤篇
一、使用者空間
adroid 2.1 架構解析 7 鍵盤
以上鏈結,詳細介紹了android使用者空間按鍵的操作,最終通過不斷輪詢所有裝置,直到讀取有pollin事件產生的裝置狀態:if(mfds[i].revents & pollin) ,
[1] =
}; struct
platform_device
s3c_device_keypad = ;
export_symbol(s3c_device_keypad);
static struct platform_device
*smdk6410_devices __initdata =
static void __init smdk6410_machine_init(void)
int platform_add_devices(struct platform_device **devs, int num)
}return ret;
} 2.驅動註冊與登出
module_init(s3c_keypad_init);
module_exit(s3c_keypad_exit);
static int __init s3c_keypad_init(void)
static void __exit s3c_keypad_exit(void)
platform_driver結構體:
static struct platform_driver
s3c_keypad_driver = ,
}; 3.裝置探測
static int __init s3c_keypad_probe(struct platform_device *pdev)
size = (res->end - res->start) + 1;
keypad_mem = request_mem_region(res->start, size, pdev->name);
if (keypad_mem == null)
key_base = ioremap(res->start, size); //io空間對映
if (key_base == null)
keypad_clock = clk_get(&pdev->dev, "keypad");
//獲取keypad對應的時鐘
if (is_err(keypad_clock))
clk_enable(keypad_clock); //使能keypad模組的時鐘
s3c_keypad_data = kzalloc(sizeof(struct s3c_keypad), gfp_kernel);
input_dev = input_allocate_device(); //申請乙個input_dev裝置
input_dev_name = (char *)kmalloc(sizeof("s3c-keypad-rev***x"), gfp_kernel); //這裡就是使用者空間提到的鍵值配置表
if (!s3c_keypad_data || !input_dev)
platform_set_drvdata(pdev, s3c_keypad_data);
for (i=0; i
if(!extra)
dprintk(": input device name: %s.//n", input_dev_name);
s3c_keypad_data->dev = input_dev;
s3c_keypad_data->extra = extra;
gpio_key = extra->gpio_key;
/* create and register the input driver */
set_bit(ev_key, input_dev->evbit);
set_bit(ev_rep, input_dev->evbit);
s3c_keypad_data->nr_rows = keypad_rows;
s3c_keypad_data->no_cols = keypad_columns;
for(key = 0; key < 32; key++)
for (i=0; igpio_key_num; i++ )
input_dev->name = device_name;
input_dev->phys = "s3c-keypad/input0";
input_dev->id.bustype = bus_host;
input_dev->id.vendor = 0x0001;
input_dev->id.product = 0x0001;
input_dev->id.version = 0x0001;
input_dev->keycode = keypad_keycode;
/* init_timer(&keypad_timer); */
keypad_timer.function = keypad_timer_handler;
keypad_timer.data = (unsigned long)s3c_keypad_data;
for (i=0; igpio_key_num; i++, gpio_key+=1)
} ret = input_register_device(input_dev); //向輸入子系統註冊此裝置
if (ret)
return 0;
out:
input_free_device(input_dev);
kfree(s3c_keypad_data);
err_irq:
free_irq(keypad_irq->start, input_dev);
free_irq(keypad_irq->end, input_dev);
gpio_key = extra->gpio_key;
for (i=0; igpio_key_num; i++, gpio_key+=1)
free_irq(gpio_key->eint, s3c_keypad_data);
err_alloc:
clk_disable(keypad_clock);
clk_put(keypad_clock);
err_clk:
iounmap(key_base);
err_map:
release_resource(keypad_mem);
kfree(keypad_mem);
err_req:
return ret;
}4.按鍵出發中斷,中斷處理與資料上傳
static irqreturn_t gpio_int_handler(int irq, void *dev_id)
} if (gpio_key != null)
else
}return irq_handled;
}資料上傳input_report_key-》input_event-》input_handle_event-》input_pass_event-》handle->handler->event(對應函式:evdev_event)-》資料暫存event(input_event結構體),以供使用者空間讀寫操作。
5.input事件在傳輸過程中的一些函式
void input_event(struct input_dev *dev,unsigned int type, unsigned int code, int value)}
static void input_handle_event(struct input_dev *dev,unsigned int type, unsigned int code, int value)
disposition = input_pass_to_handlers;
}break;
...}
static voidinput_start_autorepeat(struct input_dev *dev, int code)
} static void input_repeat_key(unsigned long data)
if (dev->rep[rep_period])
mod_timer(&dev->timer, jiffies +
msecs_to_jiffies(dev->rep[rep_period]));
} spin_unlock_irqrestore(&dev->event_lock, flags);
} 以上驅動是input方式完成的,不清楚的可查閱linux input輸入子裝置。
mesa解析2 顯示卡驅動軟體架構
最底層是radeon drm winsys,功能 通過libdrm,和核心drm互動 申請視訊記憶體bo,視訊記憶體map到記憶體,查詢bo是否忙 正在被顯示卡使用 pipe screen,介面類,功能 查詢顯示卡特性引數。另外,註冊了資源建構函式。資源指視訊記憶體資源,如bo,texture r6...
misc裝置驅動模型及例項解析
1 misc裝置驅動模型 本節我們來看一下misc裝置驅動模型的有關內容,首先是看看它的裝置結構體,定義在include linux miscdevice.h中 cpp view plain copy struct miscdevice 結構體中的部分成員我們是一目了然的,主要是來看看有疑惑的幾點 ...
misc裝置驅動模型及例項解析
1 misc裝置驅動模型 本節我們來看一下misc裝置驅動模型的有關內容,首先是看看它的裝置結構體,定義在include linux miscdevice.h中 cpp view plain copy struct miscdevice 結構體中的部分成員我們是一目了然的,主要是來看看有疑惑的幾點 ...