Android 架構解析及驅動 鍵盤篇

2021-05-23 04:35:01 字數 4364 閱讀 9591

--  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 結構體中的部分成員我們是一目了然的,主要是來看看有疑惑的幾點 ...