0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux設(shè)備與驅(qū)動(dòng)之間的聯(lián)系描述

嵌入式小生 ? 來(lái)源:嵌入式小生 ? 2023-01-16 09:23 ? 次閱讀

一、導(dǎo)讀

linux設(shè)備驅(qū)動(dòng)模型中,總線(xiàn)是一個(gè)抽象的概念,是一類(lèi)特殊的設(shè)備。在設(shè)備模型的實(shí)現(xiàn)中,內(nèi)核規(guī)定了系統(tǒng)中的每個(gè)設(shè)備都需要連接到一個(gè)總線(xiàn)上,這個(gè)總線(xiàn)可以是一個(gè)內(nèi)部的Bus、虛擬的Bus或者Platform 總線(xiàn)。在內(nèi)核中通過(guò)struct but_type結(jié)構(gòu)來(lái)描述總線(xiàn),定義在include/linux/device.h中。

本文首先描述與總線(xiàn)相關(guān)的數(shù)據(jù)結(jié)構(gòu),重點(diǎn)描述struct bus_type結(jié)構(gòu)體內(nèi)部各個(gè)元素的含義以及內(nèi)部之間的聯(lián)系。接著會(huì)描述linux設(shè)備驅(qū)動(dòng)模型初始化過(guò)程中關(guān)于總線(xiàn)的初始化流程,這部分由buses_init()完成,最后會(huì)描述對(duì)總線(xiàn)的幾個(gè)操作接口函數(shù)。

本文所有源碼分析基于linux內(nèi)核版本:4.1.15。

一、導(dǎo)讀

二、與總線(xiàn)相關(guān)的數(shù)據(jù)結(jié)構(gòu)

(2-1)struct bus_type

(2-2)struct subsys_private

三、總線(xiàn)的初始化

四、總線(xiàn)的操作接口

(4-1)總線(xiàn)的注冊(cè)

(4-2)總線(xiàn)的注銷(xiāo)

(4-3)device和device_driver的添加

(4-4)driver的probe

二、與總線(xiàn)相關(guān)的數(shù)據(jù)結(jié)構(gòu)

(2-1)struct bus_type

總線(xiàn)是處理器和更多設(shè)備之間的通道,對(duì)于linux的設(shè)備模型,所有的設(shè)備都通過(guò)總線(xiàn)連接在一起??偩€(xiàn)之間可以互相連接,例如:USB控制器通常是一個(gè)PCI設(shè)備,設(shè)備模型表示總線(xiàn)和它們控制的設(shè)備之間的實(shí)際連接??偩€(xiàn)由struct bus_type結(jié)構(gòu)表示,該結(jié)構(gòu)包含了總線(xiàn)名稱(chēng)、默認(rèn)屬性、總線(xiàn)的方法、PM操作和驅(qū)動(dòng)核心的私有數(shù)據(jù)。sturct bus_type定義如下:

structbus_type{
constchar*name;
constchar*dev_name;
structdevice*dev_root;
structdevice_attribute*dev_attrs;/*usedev_groupsinstead*/
conststructattribute_group**bus_groups;
conststructattribute_group**dev_groups;
conststructattribute_group**drv_groups;

int(*match)(structdevice*dev,structdevice_driver*drv);
int(*uevent)(structdevice*dev,structkobj_uevent_env*env);
int(*probe)(structdevice*dev);
int(*remove)(structdevice*dev);
void(*shutdown)(structdevice*dev);

int(*online)(structdevice*dev);
int(*offline)(structdevice*dev);

int(*suspend)(structdevice*dev,pm_message_tstate);
int(*resume)(structdevice*dev);

conststructdev_pm_ops*pm;

conststructiommu_ops*iommu_ops;

structsubsys_private*p;
structlock_class_keylock_key;
};

name :總線(xiàn)的名稱(chēng)。

dev_name : 用于子系統(tǒng)枚舉設(shè)備等,例如("foo%u", dev->id)。

dev_root : 表示要用于父設(shè)備的默認(rèn)設(shè)備。

dev_attrs: 設(shè)備屬性組。

bus_groups: bus屬性組。

dev_groups: dev屬性組。

drv_groups: drv屬性組。

match: 是一個(gè)需要由具體bus驅(qū)動(dòng)實(shí)現(xiàn)的回調(diào)函數(shù),當(dāng)屬于該bus的所有device和驅(qū)動(dòng)添加到內(nèi)核時(shí),內(nèi)核都會(huì)調(diào)用該接口函數(shù)。

uevent:也是一個(gè)由具體的bus驅(qū)動(dòng)實(shí)現(xiàn)的回到函數(shù),當(dāng)屬于該bus的設(shè)備,觸發(fā)添加、移除或者其他動(dòng)作時(shí),bus模塊核心就會(huì)調(diào)用該接口,這樣可以讓bus的驅(qū)動(dòng)能夠修改環(huán)境變量。

probe、 remove:這兩個(gè)也是回調(diào)函數(shù),當(dāng)有新的設(shè)備或者驅(qū)動(dòng)添加到這個(gè)bus時(shí),內(nèi)核則會(huì)首先調(diào)用這個(gè)bus的probe,然后再調(diào)用具體驅(qū)動(dòng)程序的probe去初始化匹配設(shè)備;當(dāng)有設(shè)備從這個(gè)bus上移除的時(shí)候則會(huì)調(diào)用remove,所以這個(gè)兩個(gè)回調(diào)函數(shù)非常重要。

shutdown:在需要shutdown的時(shí)候調(diào)用該回調(diào)函數(shù),以讓設(shè)備停止工作。該函數(shù)與電源管理相關(guān)。

online:當(dāng)設(shè)備再脫機(jī)后重新聯(lián)機(jī)時(shí)調(diào)用該函數(shù)。該函數(shù)與電源管理相關(guān)。

offline:當(dāng)讓設(shè)備脫機(jī)以便進(jìn)行熱插拔時(shí)調(diào)用該函數(shù)。

suspend:當(dāng)總線(xiàn)上的設(shè)備想要進(jìn)入睡眠模式時(shí)調(diào)用。

resume:讓這個(gè)bus上的一個(gè)設(shè)備退出睡眠模式時(shí)調(diào)用該函數(shù)。

pm:是與之對(duì)應(yīng)的bus的電源管理操作,會(huì)去回調(diào)執(zhí)行特定驅(qū)動(dòng)程序的pm的ops。

iommu_ops:該總線(xiàn)的IOMMU特定操作,用于將IOMMU驅(qū)動(dòng)程序?qū)崿F(xiàn)附加到總線(xiàn)上,并允許驅(qū)動(dòng)程序進(jìn)行總線(xiàn)上特殊的設(shè)定操作。

p: 一個(gè)struct subsys_private類(lèi)型的指針,是驅(qū)動(dòng)核心的私有數(shù)據(jù),只有驅(qū)動(dòng)核心可以使用,

lock_key: 該參數(shù)供鎖驗(yàn)證器使用。

(2-2)struct subsys_private

在bus_type和class結(jié)構(gòu)中都有一個(gè)指向struct subsys_private的指針,用于保存bus_type和class結(jié)構(gòu)的驅(qū)動(dòng)程序核心部分的私有數(shù)據(jù)。從命名上似乎不容易理解struct subsys_private,由于bus_type和clsss結(jié)構(gòu)中都有一個(gè)struct subsys_private指針,所以可以將subsys_private理解成bus_type和class的上層,包含了bus和class。

struct subsys_private結(jié)構(gòu)定義如下(/drivers/base/base.h):

structsubsys_private{
structksetsubsys;
structkset*devices_kset;
structlist_headinterfaces;
structmutexmutex;

structkset*drivers_kset;
structklistklist_devices;
structklistklist_drivers;
structblocking_notifier_headbus_notifier;
unsignedintdrivers_autoprobe:1;
structbus_type*bus;

structksetglue_dirs;
structclass*class;
};

subsys:用于描述本subsystem的kset,用于代表其自身。

devices_kset: 表示subsystem的device目錄。

interfaces: interfaces是一個(gè)list_head類(lèi)型數(shù)據(jù),用于保存與之相關(guān)的interface。在內(nèi)核中interface用于抽象bus下所有關(guān)聯(lián)設(shè)備的一些特殊的功能。

mutex: mutex類(lèi)型鎖,用于保護(hù)設(shè)備和interface鏈表。

drivers_kset: 表示subsystem中驅(qū)動(dòng)相關(guān)鏈表。

klist_devices: 設(shè)備鏈表,用于保存本bus下所有的device的指針,以方便查找。

klist_drivers: 驅(qū)動(dòng)鏈表,用于保存本bus下所有的device_driver的指針,以方便查找。

bus_notifier: bus_notifier是一個(gè)總線(xiàn)通知列表,用于監(jiān)測(cè)bus上發(fā)生的任何事情。

drivers_autoprobe:用于控制該bus下的drivers或者device是否具有自動(dòng)probe屬性。

bus:是一個(gè)指向與之關(guān)聯(lián)的struct bus_type類(lèi)型的指針。用于保存上層的bus。

glue_dirs:表示glue目錄,用于放在父設(shè)備之間,以避免名稱(chēng)空間出現(xiàn)沖突。

class:是一個(gè)指向與之關(guān)聯(lián)的struct class類(lèi)型的指針。用于保存上層的class。

三、總線(xiàn)的初始化

總線(xiàn)屬于linux驅(qū)動(dòng)模型的一部分,所以在內(nèi)核啟動(dòng)過(guò)程中,在driver_init()函數(shù)中會(huì)調(diào)用buses_init(),完成總線(xiàn)相關(guān)的初始化操作:

0b3084c2-9535-11ed-bfe3-dac502259ad0.png在buses_init()的操作邏輯中,完成了以下幾件事情:

(1)動(dòng)態(tài)創(chuàng)建bus內(nèi)核kset,并指定其事件操作函數(shù),然后添加到sysfs中。

(2)動(dòng)態(tài)創(chuàng)建system內(nèi)核kset,并指定其父級(jí)kset為devices_kset->kobj,然后添加到sysfs中。

四、總線(xiàn)的操作接口

本小節(jié)描述linux內(nèi)核中對(duì)總線(xiàn)的操作API接口:

//添加設(shè)備到總線(xiàn)
externintbus_add_device(structdevice*dev);
//為新的設(shè)備探測(cè)驅(qū)動(dòng)
externvoidbus_probe_device(structdevice*dev);
//從總線(xiàn)中將設(shè)備移除
externvoidbus_remove_device(structdevice*dev);

//添加一個(gè)驅(qū)動(dòng)到總線(xiàn)
externintbus_add_driver(structdevice_driver*drv);
//從總線(xiàn)將移除驅(qū)動(dòng)
externvoidbus_remove_driver(structdevice_driver*drv);

//將驅(qū)動(dòng)程序從該驅(qū)動(dòng)控制的所有設(shè)備中分離
externvoiddriver_detach(structdevice_driver*drv);
//嘗試將設(shè)備和驅(qū)動(dòng)程序綁定在一起
externintdriver_probe_device(structdevice_driver*drv,structdevice*dev);
//注冊(cè)一個(gè)驅(qū)動(dòng)核心總線(xiàn)子系統(tǒng)
externint__must_checkbus_register(structbus_type*bus);

//注銷(xiāo)驅(qū)動(dòng)核心總線(xiàn)子系統(tǒng)
externvoidbus_unregister(structbus_type*bus);

/*注冊(cè)總線(xiàn)通知器。總線(xiàn)通知器,用于獲取當(dāng)設(shè)備添加/移除或者驅(qū)動(dòng)程序與
設(shè)備綁定/解綁定時(shí)的通知。*/
externintbus_register_notifier(structbus_type*bus,
structnotifier_block*nb);

//注銷(xiāo)總線(xiàn)通知器
externintbus_unregister_notifier(structbus_type*bus,
structnotifier_block*nb);

(4-1)總線(xiàn)的注冊(cè)

調(diào)用bus_register執(zhí)行具體總線(xiàn)的注冊(cè)操作,該函數(shù)實(shí)現(xiàn)在/drivers/base/bus.c中,具體執(zhí)行邏輯如下:

(1)調(diào)用kzalloc()為struct subsys_private創(chuàng)建內(nèi)存,設(shè)置priv->bus的值為想要注冊(cè)的總線(xiàn)類(lèi)型,然后將bus->p賦值為priv。

(2)初始化總線(xiàn)通知器。

(3)為priv->subsys.kobj重新設(shè)置名稱(chēng),即總線(xiàn)的名稱(chēng)。

(4)初始化priv->subsys.kobj的kset和ktype字段。

(5)調(diào)用kset_register將private->subsys.kobj注冊(cè)到內(nèi)核中。

(6)調(diào)用bus_create_file向sysfs文件系統(tǒng)中的bus目錄下添加一個(gè)uevnet attribute:0b5a5afe-9535-11ed-bfe3-dac502259ad0.png

(7)調(diào)用kset_create_and_add()向內(nèi)核分別添加devices和drivers kset,這樣便可以在sysfs中查看了:0b783f88-9535-11ed-bfe3-dac502259ad0.png

(8)初始化priv指針中的mutex、klist_devices和klist_drivers等變量。

(9)調(diào)用add_probe_files函數(shù),在bus下添加bus_attr_drivers_probe和bus_attr_drivers_autoprobe兩個(gè)attribute:0b9f2b3e-9535-11ed-bfe3-dac502259ad0.png

(10)調(diào)用bus_add_groups添加bus_groups屬性組。

(4-2)總線(xiàn)的注銷(xiāo)

調(diào)用bus_unregister執(zhí)行具體總線(xiàn)的注銷(xiāo)操作,該函數(shù)同樣實(shí)現(xiàn)在/drivers/base/bus.c中:

voidbus_unregister(structbus_type*bus)
{
pr_debug("bus:'%s':unregistering
",bus->name);
if(bus->dev_root)
device_unregister(bus->dev_root);
bus_remove_groups(bus,bus->bus_groups);
remove_probe_files(bus);
kset_unregister(bus->p->drivers_kset);
kset_unregister(bus->p->devices_kset);
bus_remove_file(bus,&bus_attr_uevent);
kset_unregister(&bus->p->subsys);
}

(4-3)device和device_driver的添加

linux內(nèi)核的驅(qū)動(dòng)模型中,提供了device_register()和driver_register()兩個(gè)接口,供各個(gè)驅(qū)動(dòng)模塊使用。從linux內(nèi)核多個(gè)子系統(tǒng)的源碼中可以發(fā)現(xiàn),對(duì)于各種驅(qū)動(dòng)程序的注冊(cè)最終都會(huì)調(diào)用到driver_register()。然而這兩個(gè)接口函數(shù)的核心邏輯中,是通過(guò)調(diào)用總線(xiàn)的bus_add_device()和bus_add_driver()實(shí)現(xiàn)的:在driver_register()中調(diào)用driver_find()在給定的總線(xiàn)中查找給定名稱(chēng)的驅(qū)動(dòng),如果驅(qū)動(dòng)已經(jīng)存在則返回-EBUSY;如果驅(qū)動(dòng)在總線(xiàn)中不存在,則調(diào)用bus_add_driver()注冊(cè)驅(qū)動(dòng)。在device_register()中則首先調(diào)用device_initialize初始化設(shè)備(本質(zhì)上是對(duì)sturct device結(jié)構(gòu)賦值),然后調(diào)用device_add向linux內(nèi)核驅(qū)動(dòng)模型注冊(cè)設(shè)備。

device_register()和driver_register()兩個(gè)接口都在/drivers/base/bus.c文件中實(shí)現(xiàn)。下文來(lái)具體看看這兩個(gè)接口的執(zhí)行邏輯:

1、bus_add_device的執(zhí)行邏輯:

(1)從dev->bus中取得bus_type*類(lèi)型的指針bus,如果獲取bus不成功,則函數(shù)直接返回;如果bus獲取成功,則會(huì)繼續(xù)后續(xù)的第(2)步操作。

(2)調(diào)用device_add_attrs接口,將由bus->dev_attrs指針定義的默認(rèn)attribute添加到內(nèi)核中,這個(gè)操作會(huì)體現(xiàn)在sysfs文件系統(tǒng)中的/sys/devices/xxx/xxx_device/目錄中。

(3)調(diào)用device_add_groups將bus_dev_groups添加到內(nèi)核中。

(4)調(diào)用sysfs_create_link將該設(shè)備在sysfs中的目錄,鏈接到該bus的devices目錄下

(5)接著依然調(diào)用sysfs_create_link,在該設(shè)備的sysfs目錄中,創(chuàng)建一個(gè)指向該設(shè)備所在bus目錄的鏈接,命名為subsystem。

(6)前面幾個(gè)操作實(shí)則是向sysfs文件系統(tǒng)注冊(cè)關(guān)于設(shè)備的信息,向用戶(hù)空間拋出接口。最后步驟則是調(diào)用klist_add_tail()將該設(shè)備指針保存到bus->p->klist_devices中。

2、bus_add_driver的執(zhí)行邏輯:

(1)首先調(diào)用bus_get從驅(qū)動(dòng)程序中獲取到該驅(qū)動(dòng)程序所屬的bus_type指針。如果該指針為零(即獲取失?。﹦t返回-EINVAL;反之則繼續(xù)執(zhí)行后續(xù)操作。

(2)為該驅(qū)動(dòng)的struct driver_private指針(priv)分配空間,并初始化其中的priv->klist_devices、priv->driver、priv->kobj.kset等變量,同時(shí)將priv保存到device_driver的p中。

(3)調(diào)用kobject_init_and_add,并傳入該驅(qū)動(dòng)的名稱(chēng)作為參數(shù),向sysfs中注冊(cè)driver的kobject。該操作體現(xiàn)在sysfs文件中的/sys/bus/xxx/drivers/目錄下。

(4)調(diào)用klist_add_tail將驅(qū)動(dòng)添加到總線(xiàn)的klist_drivers鏈表中,如果該驅(qū)動(dòng)的drivers_autoprobe為真,還將調(diào)用driver_attach嘗試將驅(qū)動(dòng)綁定到設(shè)備。

(5)調(diào)用module_add_driver()將驅(qū)動(dòng)添加到drv->owner中,咱不過(guò)多分析。

(6)調(diào)用driver_create_file,在sysfs文件系統(tǒng)中的driver目錄下,創(chuàng)建uevent attribute。

(7)調(diào)用driver_add_groups將bus->drv_groups屬性組添加到驅(qū)動(dòng)中。

(4-4)driver的probe

當(dāng)一個(gè)driver在進(jìn)行probe的時(shí)候,大部分邏輯都會(huì)依賴(lài)總線(xiàn)的具體實(shí)現(xiàn),核心操作是bus_probe_device()和driver_attach()兩個(gè)接口,這兩個(gè)接口都是在drivers/base/base.h中聲明,在drivers/base/bus.c中實(shí)現(xiàn)。

bus_probe_device()實(shí)現(xiàn)如下:

0bb5ac4c-9535-11ed-bfe3-dac502259ad0.png

driver_attach()實(shí)現(xiàn)如下:

0be8011a-9535-11ed-bfe3-dac502259ad0.png

從上圖可知,driver_attach中會(huì)調(diào)用bus_for_each_dev遍歷設(shè)備,該函數(shù)用于遍歷drv->bus的設(shè)備列表,并為每個(gè)設(shè)備調(diào)用__driver_attach(),并將drv傳遞給__driver_attach,故而可以明確知道對(duì)每個(gè)設(shè)備執(zhí)行的操作則是__driver_attach(),該函數(shù)定義在/drivers/base/dd.c文件中,具體的執(zhí)行邏輯如下:

(1)使用driver_match_device()判斷驅(qū)動(dòng)和設(shè)備是否匹配(本質(zhì)上是判斷是否指定了drv->bus->match,如果指定了則執(zhí)行與之對(duì)應(yīng)的函數(shù),否則返回1),如果驅(qū)動(dòng)和設(shè)備已經(jīng)匹配了則直接返回;否則,則繼續(xù)執(zhí)行后續(xù)的操作。

(2)調(diào)用driver_probe_device()嘗試將驅(qū)動(dòng)和設(shè)備綁定在一起。

總體上,bus_probe_device()和driver_attach()這兩個(gè)接口的操作流程類(lèi)似,即:搜索所在的總線(xiàn),比對(duì)是否有同名的device_driver(或device),如果有并且該設(shè)備沒(méi)有綁定Driver(注:這一點(diǎn)很重要,則可以使同一個(gè)Driver驅(qū)動(dòng)相同名稱(chēng)的多個(gè)設(shè)備)則調(diào)用device_driver的probe接口。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19038

    瀏覽量

    228471
  • USB控制器
    +關(guān)注

    關(guān)注

    1

    文章

    35

    瀏覽量

    11847
  • PCI
    PCI
    +關(guān)注

    關(guān)注

    4

    文章

    657

    瀏覽量

    130061
  • platform
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    17382
  • Linux驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    0

    文章

    43

    瀏覽量

    9933

原文標(biāo)題:Linux設(shè)備與驅(qū)動(dòng)的“鵲橋” | Bus

文章出處:【微信號(hào):嵌入式小生,微信公眾號(hào):嵌入式小生】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    淺談Linux發(fā)行版之間聯(lián)系和區(qū)別

    前言:現(xiàn)如今Linux的發(fā)行版本多之又多,其大家族可謂是“枝繁葉茂,子孫滿(mǎn)堂”。那么它們各版本之間有著怎樣的聯(lián)系和區(qū)別呢?Linux發(fā)行版之間
    發(fā)表于 07-08 08:25

    嵌入式Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)

    嵌入式Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā) Linux 設(shè)備驅(qū)動(dòng)的基本概念
    發(fā)表于 09-10 13:10 ?82次下載
    嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)

    嵌入式Linux字符設(shè)備驅(qū)動(dòng)的設(shè)計(jì)與應(yīng)用

    描述了基于嵌入式Linux的字符設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)方法和實(shí)現(xiàn)過(guò)程。以電機(jī)、數(shù)碼管、串口和mini鍵盤(pán)的驅(qū)動(dòng)設(shè)計(jì)為例,詳細(xì)闡述了嵌入式
    發(fā)表于 02-23 15:45 ?24次下載

    嵌入式Linux字符設(shè)備驅(qū)動(dòng)的設(shè)計(jì)與應(yīng)用

    描述了基于嵌入式Linux的字符設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)方法和實(shí)現(xiàn)過(guò)程。以電機(jī)、數(shù)碼管、串口和mini鍵盤(pán)的驅(qū)動(dòng)設(shè)計(jì)為例,詳細(xì)闡述了嵌入式
    發(fā)表于 07-14 17:31 ?31次下載

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第23章、Linux設(shè)備驅(qū)動(dòng)的移植

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第23章、Linux設(shè)備驅(qū)動(dòng)的移植
    發(fā)表于 10-27 10:58 ?9次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)詳解》第23章、<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>的移植

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第17章、Linux音頻設(shè)備驅(qū)動(dòng)

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第17章、Linux音頻設(shè)備驅(qū)動(dòng)
    發(fā)表于 10-27 11:14 ?17次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)詳解》第17章、<b class='flag-5'>Linux</b>音頻<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第16章、Linux網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第16章、Linux網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)
    發(fā)表于 10-27 11:17 ?5次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)詳解》第16章、<b class='flag-5'>Linux</b>網(wǎng)絡(luò)<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第14章、Linux終端設(shè)備驅(qū)動(dòng)

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第14章、Linux終端設(shè)備驅(qū)動(dòng)
    發(fā)表于 10-27 11:22 ?8次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)詳解》第14章、<b class='flag-5'>Linux</b>終端<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第13章、Linux設(shè)備驅(qū)動(dòng)

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第13章、Linux設(shè)備驅(qū)動(dòng)
    發(fā)表于 10-27 11:24 ?18次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)詳解》第13章、<b class='flag-5'>Linux</b>塊<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第9章、Linux設(shè)備驅(qū)動(dòng)中的異步通知與異步IO

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第9章、Linux設(shè)備驅(qū)動(dòng)中的異步通知與異步IO
    發(fā)表于 10-27 11:33 ?0次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)詳解》第9章、<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>中的異步通知與異步IO

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第8章、Linux設(shè)備驅(qū)動(dòng)中的阻塞與非阻塞IO

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第8章、Linux設(shè)備驅(qū)動(dòng)中的阻塞與非阻塞IO
    發(fā)表于 10-27 11:35 ?9次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)詳解》第8章、<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>中的阻塞與非阻塞IO

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第7章、Linux設(shè)備驅(qū)動(dòng)中的并發(fā)控制

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第7章、Linux設(shè)備驅(qū)動(dòng)中的并發(fā)控制
    發(fā)表于 10-27 11:37 ?10次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)詳解》第7章、<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>中的并發(fā)控制

    嵌入式Linux設(shè)備驅(qū)動(dòng)原理原來(lái)是這樣編寫(xiě)的!

    系統(tǒng)調(diào)用是操作系統(tǒng)內(nèi)核和應(yīng)用程序之間的接口,設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核和機(jī)器硬件之間的接口。Linux設(shè)
    發(fā)表于 04-28 15:15 ?1938次閱讀

    Linux設(shè)備驅(qū)動(dòng)程序分類(lèi)有哪些

    Linux設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)與硬件設(shè)備之間的橋梁,負(fù)責(zé)實(shí)現(xiàn)硬件設(shè)備與操作系統(tǒng)
    的頭像 發(fā)表于 08-30 15:11 ?321次閱讀

    linux系統(tǒng)的設(shè)備驅(qū)動(dòng)一般分幾類(lèi)

    Linux系統(tǒng)的設(shè)備驅(qū)動(dòng)是操作系統(tǒng)與硬件設(shè)備之間的橋梁,負(fù)責(zé)實(shí)現(xiàn)操作系統(tǒng)與硬件設(shè)備
    的頭像 發(fā)表于 08-30 15:13 ?287次閱讀