1. 程式人生 > >linux input系列------input的初始化

linux input系列------input的初始化

static int __init input_init(void)
{
int err;
err = class_register(&input_class);
err = input_proc_init();
err = register_chrdev_region(MKDEV(INPUT_MAJOR, 0),
    INPUT_MAX_CHAR_DEVICES, "input");
return 0;
}

看第一個函式,也就是sys/class/input這個節點是咋出來的

int __class_register(struct class *cls, struct lock_class_key *key)

{
struct subsys_private *cp;  
/*struct subsys_private {
struct kset subsys; //這個=input
struct kset *devices_kset;
struct list_head interfaces;
struct mutex mutex;


struct kset *drivers_kset;
struct klist klist_devices;
struct klist klist_drivers;
struct blocking_notifier_head bus_notifier;
unsigned int drivers_autoprobe:1;
struct bus_type *bus;


struct kset glue_dirs;
struct class *class;  //cp->class = cls;
};*/
//struct subsys_private,該結構描述了匯流排與裝置和驅動的關係
//devices_kset和drivers_kset分別指向該匯流排下所有裝置和驅動的集合,
//在sysfs中,/sys/bus/xxx/下總是存在/sys/bus/xxx/devices和/sys/bus/xxx/drivers目錄。
int error;



pr_debug("device class '%s': registering\n", cls->name);


cp = kzalloc(sizeof(*cp), GFP_KERNEL);


klist_init(&cp->klist_devices, klist_class_dev_get, klist_class_dev_put);
//這個list的作用是當有訊號來讓list刪掉一個點但是當前這個點又被人在用的時候,禁止別人再來用這個點
INIT_LIST_HEAD(&cp->interfaces);
kset_init(&cp->glue_dirs);
__mutex_init(&cp->mutex, "subsys mutex", key);
error = kobject_set_name(&cp->subsys.kobj, "%s", cls->name);  //先把input放到subsys.kobj
if (error) {
kfree(cp);
return error;
}


/* set the default /sys/dev directory for devices of this class */
if (!cls->dev_kobj)
cls->dev_kobj = sysfs_dev_char_kobj; 
  
//class->dev_kobj是指向的是/sys/dev/的char 
//因為sysfs_dev_char_kobj = kobject_create_and_add("char", dev_kobj);



#if defined(CONFIG_BLOCK)
/* let the block class directory show up in the root of sysfs */
if (!sysfs_deprecated || cls != &block_class)
cp->subsys.kobj.kset = class_kset;
#else
cp->subsys.kobj.kset = class_kset;


//class_kset = kset_create_and_add("class", NULL, NULL);  
#endif
cp->subsys.kobj.ktype = &class_ktype;
cp->class = cls;
cls->p = cp;  //不知道這個p是個什麼東西


error = kset_register(&cp->subsys);


/*int kset_register(struct kset *k)
{
int err;
kset_init(k);
err = kobject_add_internal(&k->kobj); 
//這邊根據kobj的parent來把它連結到list裡,這個parent在之前的cp->subsys.kobj.kset = class_kset;
//而這個class_kset就是sys/class,這樣就在sys/class下面長了個input
if (err)
return err;
kobject_uevent(&k->kobj, KOBJ_ADD);
return 0;
}*/
ket的註冊實際上就把它巢狀的kobj註冊到核心中了,同樣也會在sysfs相應位置建立一個目錄.
但與註冊kobj不同的是, 在註冊一個kset時會呼叫函式kobject_uevent(&k->kobj, KOBJ_ADD) 
通過netlink把KOBJ_ADD事件傳送到使用者層的udev ,在udev收到核心發的這個訊息時就會執行相應的事件了.
if (error) {
kfree(cp);
return error;
}
error = add_class_attrs(class_get(cls));  
//sys/class/input其實也算一個檔案,自己也有read ,open之類的方法,把這些方法
Kobject的每一項屬性都對應在sysfs檔案系統中,kobject對應的目錄下的一個檔案.檔名稱與屬性名稱相同.建立一般屬性的介面為sysfs_create_file().
class_put(cls);
return error;

}

第二個函式

[email protected]_Z00L_63:/proc/bus/input # ls
devices
handlers

上面這些東西是怎麼長出來的

tatic int __init input_proc_init(void)
{
struct proc_dir_entry *entry;

proc_bus_input_dir = proc_mkdir("bus/input", NULL);

entry = proc_create("devices", 0, proc_bus_input_dir, &input_devices_fileops);

entry = proc_create("handlers", 0, proc_bus_input_dir,  &input_handlers_fileops);

return 0;

}

第三個函式,這裡講的很詳細了

http://blog.csdn.net/tigerjibo/article/details/6412672


相關推薦

linux input系列------input初始

static int __init input_init(void) {int err;err = class_register(&input_class);err = input_proc_init();err = register_chrdev_region(M

linux文件系統 - 初始(一)

成員函數 cat 文章 記錄 inf htm 源代碼 設備驅動模型 proxy 術語表: struct task:進程 struct mnt_namespace:命名空間 struct mount:掛載點 struct vfsmount:掛載項 struct file:文件

linux文件系統 - 初始(三)

視圖 div 目錄遷移 oca script 方式 不能 輸出 str 一、目的 內核加載完initrd文件後,為掛載磁盤文件系統做好了必要的準備工作,包括掛載了sysfs、proc文件系統,加載了磁盤驅動程序驅動程序等。接下來,內核跳轉到用戶空間的init程序,

linux文件系統 - 初始(二)

軟鏈接 復制代碼 模式 文件的 操作 pop 臨時 console mini 一、目的 本文主要講述linux3.10文件系統初始化過程的第二階段:加載initrd。 initrd是一個臨時文件系統,由bootload負責加載到內存中,裏面包含了基本的可執

Jenkins系列-Jenkins初始配置

事先 遇到 目的 系統管理 watermark 下載 輸入密碼 dmi user 初始化 訪問,如:127.0.0.1:8088/Jenkins 第一次要求輸入密碼,初始密碼在文件中查看。 執行以下命令查看 $ cat ${USER_HOME}\.jenkins\secr

Linux系統記憶體磁碟初始技術詳細解析

轉http://unix-cd.com/unixcd12/article_6520.html initrd掛載優先順序高於真實根檔案系統,它被邦定在核心上,做為核心啟動過程的一部分被載入(load)。然後,做為兩階段引導過程的第一部分,核心掛載(mount)initrd,用

Gitkraken系列-Gitkraken初始操作

  一個優秀的團隊合作離不開git,一個優秀的程式設計師也離不開git。gitkraken是我在進行軟工實踐這門課接觸到的git的UI介面的工具,它給我留下的印象就是非常好用和方便 怎麼個方便法呢?

Bootstrap原始碼分析系列初始和依賴項

在上一節中我們介紹了Bootstrap整體架構,本節我們將介紹Bootstrap框架第二部分初始化及依賴項,這部分內容位於原始碼的第8~885行,開啟原始碼這部分內容似乎也不是很難理解。但是請站在一個開發者的角度來面對這段原始碼。為什麼要這樣寫?如果沒有Bootstrap

Linux 串列埠終端初始

1. 串列埠初始化過程     start_kernel()           |----- ...           |----- setup_arch()           |----- ...           |----- build_all_zonelists()      

linux下mariadb安裝初始,字符集設定

Linux下安裝Mariadb,我是使用的centos 7.1系統,在yum源配置好的情況下yum search mariadb搜尋結果如下===============================

linux 記憶體探測和初始

1、記憶體探測     linux在被bootloader載入到記憶體後, cpu最初執行的核心程式碼是arch/x86/boot/header.S彙編檔案中的_start例程,設定好頭部header,其中包括大量的bootloader引數。接著是其中的start_

Linux環境變數和初始配置

1.環境變數在 etc/profile 檔案中, PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/samba/bin 新增或者刪除 環境變數 也可以直接使用 PATH=$PATH:/usr/local

深探spring系列-----ioc初始(1)BeanDefinition的Resource定位

    1.前言 ioc就不說了 大家都知道。不知道的童鞋可以出門右轉百度,google,簡書總有一款適合你! 說說BeanDefinition 這個是ioc非常重要一個元件,實際就是pojo物件在ioc中的抽象,通過這個BeanDefinition定義的資料結構,使io

linux動態庫的初始和清理

   a. Windows 中有 DllMain 入口函式, 而 Linux 中則沒有。    b. Linux 中有特殊函式 _init 和 _fini, 主要是分別用來初始化動態庫和關閉的時候       做一些必要的處理, 我們可以把自己認為需要的程式碼放到這兩個

Linux EMMC子系統分析-初始流程(轉載)

最近在解EMMC的一個bug,發現Linux EMMC有點小複雜,先整理個文件出來吧 用的是TI 平臺,僅分析MMC,不分析SD和SDIO mmc_init 2769 static int __init mmc_init(void

神經網路模型無法正常工作時我們應該做什麼(系列)——初始網路權重(Initialized Network Weights)

前言 當你進入深度學習領域,準備好深度神經網路,開始進行訓練時,遇到這樣一個大部分新手都會遇到的問題:你的神經網路沒法正常工作,而你不知道該如何去修正它。你去問你的老闆或者導師,他們也不知道該如何處理,因為在深度神經網路面前,他們和你一樣也是新手。

嵌入式Linux移植之記憶體初始和地址對映

Linux核心有兩個重要的巨集:PHYS_OFFSET和PAGE_OFFSET。PHYS_OFFSET是實體記憶體的起始地址,PAGE_OFFSET是Linux核心空間的虛擬起始地址(預設為0xC0000000,可通過menuconfig配置,CONFIG_PAGE_OFF

筆記 Linux檔案系統的初始

uboot結束時呼叫start_kernel(/3.1.10/init/main.c)函式啟動linux start_kernel做記憶體初始化,作業系統資料結構初始化,排程系統初始化,各種資源初始化之後會呼叫vfs_caches_init初始化檔案系統(/3.1.10/

奔跑吧linux核心-實體記憶體初始

記憶體管理是一個很複雜的系統,涉及的內容很多,下圖是一個抽象的概述 記憶體大小 在ARM linux中用dts(dts由powerPC的fdt演變過來)呈現,在ARM vexpress中,記憶體的定義是在 kernel\linux\v4.4\arc

樹莓派(4B)Linux + .Net Core嵌入式-初始環境(一)

一、樹莓派簡單介紹 二、軟&件準備 硬體:樹莓派4B主機、電源線、TF卡&TF讀卡器、PC 軟體:win32diskimager(用於燒系統到TF卡)、Xshell或Windows Termainal(用於ssh連結命令操作)、    Xftp(用於上傳檔案)、VNC(遠端桌面操作)