衡阳派盒市场营销有限公司

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

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

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

看一下USB的識(shí)別和加載過(guò)程

嵌入式悅翔園 ? 來(lái)源:嵌入式悅翔園 ? 2023-05-10 11:54 ? 次閱讀

一、前言

不知道大家在學(xué)習(xí)Linux的時(shí)候有沒(méi)有過(guò)這樣的疑問(wèn),為什么我們通過(guò)同一個(gè)接口接入的不同USB設(shè)備,我們的電腦都可以識(shí)別到呢?為什么Linux電腦不會(huì)把鼠標(biāo)識(shí)別成鍵盤呢?帶著這些疑問(wèn)我們一起來(lái)看一下USB的識(shí)別和加載過(guò)程。

二、USB設(shè)備的識(shí)別過(guò)程

當(dāng)我們插入一個(gè)USB設(shè)備時(shí),Linux內(nèi)核會(huì)自動(dòng)檢測(cè)并加載相應(yīng)的驅(qū)動(dòng)程序,使設(shè)備能夠正常工作。下面我們將深入探討USB設(shè)備在Linux系統(tǒng)中的識(shí)別和加載過(guò)程。

2.1 USB控制器檢測(cè)設(shè)備插入

USB控制器是一個(gè)硬件設(shè)備,用于控制USB總線上的設(shè)備。當(dāng)你插入一個(gè)USB設(shè)備時(shí),USB控制器會(huì)檢測(cè)到電壓變化并發(fā)出一個(gè)中斷信號(hào)。這個(gè)中斷信號(hào)被送到處理器上的USB控制器中斷線上,告訴Linux內(nèi)核有新的USB設(shè)備插入。

2.2 內(nèi)核檢測(cè)并加載驅(qū)動(dòng)程序

當(dāng)內(nèi)核接收到USB控制器發(fā)出的中斷信號(hào)時(shí),它會(huì)調(diào)用USB子系統(tǒng)中的usbcore模塊,該模塊負(fù)責(zé)檢測(cè)新的USB設(shè)備并加載相應(yīng)的驅(qū)動(dòng)程序。usbcore模塊首先會(huì)檢測(cè)設(shè)備的描述符,這個(gè)描述符包括設(shè)備的廠商ID、產(chǎn)品ID、類別碼等信息

如果已經(jīng)存在一個(gè)匹配的驅(qū)動(dòng)程序,那么usbcore模塊就會(huì)加載這個(gè)驅(qū)動(dòng)程序。如果沒(méi)有匹配的驅(qū)動(dòng)程序,則會(huì)嘗試加載一個(gè)通用的驅(qū)動(dòng)程序,這個(gè)驅(qū)動(dòng)程序能夠支持大多數(shù)USB設(shè)備。

2.3 驅(qū)動(dòng)程序向USB子系統(tǒng)注冊(cè)

一旦正確的驅(qū)動(dòng)程序被加載,它會(huì)向USB子系統(tǒng)注冊(cè)并告訴它自己可以處理哪些設(shè)備。這一步通常包括向內(nèi)核注冊(cè)USB設(shè)備的類別(如存儲(chǔ)設(shè)備、輸入設(shè)備等)。

這個(gè)過(guò)程包括了向內(nèi)核注冊(cè)一個(gè)新的USB設(shè)備驅(qū)動(dòng)程序,并在該驅(qū)動(dòng)程序中指定設(shè)備的廠商ID、產(chǎn)品ID等信息。一旦驅(qū)動(dòng)程序被成功注冊(cè),USB子系統(tǒng)就可以將設(shè)備與正確的驅(qū)動(dòng)程序進(jìn)行匹配。

2.4 USB子系統(tǒng)創(chuàng)建設(shè)備節(jié)點(diǎn)

USB子系統(tǒng)接下來(lái)會(huì)為設(shè)備創(chuàng)建一個(gè)設(shè)備節(jié)點(diǎn)。設(shè)備節(jié)點(diǎn)是一個(gè)特殊的文件,在/dev目錄下,它允許用戶空間程序與設(shè)備通信。設(shè)備節(jié)點(diǎn)的名稱通常是由內(nèi)核根據(jù)設(shè)備的廠商ID、產(chǎn)品ID和序列號(hào)等信息動(dòng)態(tài)生成的。

設(shè)備節(jié)點(diǎn)的創(chuàng)建是通過(guò)udev守護(hù)進(jìn)程實(shí)現(xiàn)的,這個(gè)守護(hù)進(jìn)程會(huì)監(jiān)視系統(tǒng)中的設(shè)備插拔事件,并自動(dòng)創(chuàng)建或刪除相應(yīng)的設(shè)備節(jié)點(diǎn)。創(chuàng)建設(shè)備節(jié)點(diǎn)之后,內(nèi)核就可以將設(shè)備的訪問(wèn)權(quán)限分配給用戶空間程序。

2.5 驅(qū)動(dòng)程序初始化設(shè)備

驅(qū)動(dòng)程序被通知有新的設(shè)備插入后,它會(huì)對(duì)設(shè)備進(jìn)行初始化。初始化可能包括設(shè)置設(shè)備的傳輸速率、分配內(nèi)存緩沖區(qū)等。設(shè)備初始化完成后,驅(qū)動(dòng)程序會(huì)向USB子系統(tǒng)報(bào)告設(shè)備已準(zhǔn)備好。

2.6 用戶空間程序打開(kāi)設(shè)備:

最后,用戶空間程序可以打開(kāi)設(shè)備節(jié)點(diǎn)并與設(shè)備通信。設(shè)備節(jié)點(diǎn)的權(quán)限通常被設(shè)置為只允許root用戶或在相關(guān)組中的用戶訪問(wèn)。用戶空間程序可以使用系統(tǒng)調(diào)用(如read和write)向設(shè)備發(fā)送命令和接收數(shù)據(jù)。

通過(guò)這個(gè)過(guò)程,Linux系統(tǒng)可以自動(dòng)識(shí)別設(shè)備并加載相應(yīng)的驅(qū)動(dòng)程序,使設(shè)備可以正常工作。這也是為什么當(dāng)我們插入一個(gè)USB設(shè)備時(shí),我們不需要手動(dòng)安裝任何驅(qū)動(dòng)程序或執(zhí)行任何其他操作就可以直接開(kāi)始使用設(shè)備。

當(dāng)你插入一個(gè)USB設(shè)備時(shí),Linux系統(tǒng)會(huì)自動(dòng)執(zhí)行上述步驟,從而自動(dòng)識(shí)別設(shè)備并加載相應(yīng)的驅(qū)動(dòng)程序,使設(shè)備可以正常工作。下面我們從代碼的層面來(lái)分析一下該過(guò)程。

三、代碼實(shí)現(xiàn)講解

下面我通過(guò)一些示例代碼,講解一下USB設(shè)備在Linux系統(tǒng)中的識(shí)別和加載過(guò)程。這些示例代碼只是講解一下原理,實(shí)際代碼將會(huì)更加復(fù)雜。

3.1 檢測(cè)設(shè)備插入

當(dāng)USB設(shè)備插入到系統(tǒng)中時(shí),會(huì)產(chǎn)生一個(gè)中斷信號(hào),這個(gè)信號(hào)會(huì)被處理器上的USB控制器中斷線捕獲,并由內(nèi)核的USB子系統(tǒng)處理。下面是一個(gè)示例代碼,演示如何檢測(cè)USB設(shè)備的插入和拔出事件:

#include
#include

intmain(){
libusb_device**devs;
libusb_context*ctx=NULL;

intr=libusb_init(&ctx);
if(r

這段代碼使用了libusb庫(kù),這是一個(gè)C語(yǔ)言庫(kù),用于訪問(wèn)USB設(shè)備。它提供了一個(gè)用于初始化USB子系統(tǒng)和掃描USB總線的API,以及用于訪問(wèn)USB設(shè)備的API。

3.2 加載驅(qū)動(dòng)程序

一旦檢測(cè)到設(shè)備插入,USB子系統(tǒng)會(huì)嘗試加載一個(gè)適當(dāng)?shù)尿?qū)動(dòng)程序。下面是一個(gè)示例驅(qū)動(dòng)程序代碼,它負(fù)責(zé)支持USB存儲(chǔ)設(shè)備(例如U盤):

#include
#include

staticstructusb_device_idstorage_devices[]={
{USB_DEVICE(0xabcd,0x1234)},
{USB_DEVICE(0xffff,0xffff)},
{}
};
MODULE_DEVICE_TABLE(usb,storage_devices);

staticintstorage_probe(structusb_interface*interface,conststructusb_device_id*id){
//初始化設(shè)備并注冊(cè)
return0;
}

staticvoidstorage_disconnect(structusb_interface*interface){
//釋放設(shè)備
}

staticstructusb_driverstorage_driver={
.name="usb-storage",
.probe=storage_probe,
.disconnect=storage_disconnect,
.id_table=storage_devices,
};

module_usb_driver(storage_driver);

這段代碼演示了一個(gè)簡(jiǎn)單的驅(qū)動(dòng)程序,它可以處理USB存儲(chǔ)設(shè)備的插入和拔出事件。在加載驅(qū)動(dòng)程序時(shí),內(nèi)核將搜索已加載的驅(qū)動(dòng)程序列表,以查找與設(shè)備匹配的驅(qū)動(dòng)程序。

如果找到了匹配的驅(qū)動(dòng)程序,內(nèi)核將使用該驅(qū)動(dòng)程序來(lái)管理該設(shè)備。如果沒(méi)有找到匹配的驅(qū)動(dòng)程序,內(nèi)核將不會(huì)加載任何驅(qū)動(dòng)程序。

3.3 設(shè)備注冊(cè)

一旦找到了與設(shè)備匹配的驅(qū)動(dòng)程序,驅(qū)動(dòng)程序?qū)⒈患虞d并啟動(dòng),它將嘗試對(duì)設(shè)備進(jìn)行初始化,并將其注冊(cè)到內(nèi)核。下面是一個(gè)示例代碼,演示如何初始化USB存儲(chǔ)設(shè)備并將其注冊(cè)到內(nèi)核:

staticintstorage_probe(structusb_interface*interface,conststructusb_device_id*id){
structusb_device*dev=interface_to_usbdev(interface);

//獲取設(shè)備描述符
structusb_device_descriptordesc;
intr=usb_get_descriptor(dev,USB_DT_DEVICE,0,&desc,sizeof(desc));
if(r

上面這段示例代碼使用了內(nèi)核的usb_get_descriptor()函數(shù)來(lái)獲取設(shè)備描述符,并使用printk()函數(shù)將設(shè)備信息記錄到內(nèi)核日志中。

當(dāng)驅(qū)動(dòng)程序?qū)⒄{(diào)用設(shè)備初始化函數(shù)并將其注冊(cè)到內(nèi)核,但是由于設(shè)備初始化和注冊(cè)的過(guò)程因設(shè)備而異,因此這里省略了這部分代碼。

3.4 設(shè)備訪問(wèn)

一旦設(shè)備已經(jīng)被注冊(cè)到內(nèi)核,用戶空間程序就可以通過(guò)設(shè)備節(jié)點(diǎn)來(lái)訪問(wèn)設(shè)備。在Linux系統(tǒng)中,設(shè)備節(jié)點(diǎn)是一種特殊的文件,可以通過(guò)標(biāo)準(zhǔn)文件I/O函數(shù)來(lái)訪問(wèn)。下面是一個(gè)示例代碼,演示如何打開(kāi)并讀取USB存儲(chǔ)設(shè)備:

#include
#include
#include

intmain(){
//打開(kāi)設(shè)備節(jié)點(diǎn)
intfd=open("/dev/sdb",O_RDONLY);
if(fd

這段代碼使用了標(biāo)準(zhǔn)的文件I/O函數(shù)來(lái)訪問(wèn)設(shè)備節(jié)點(diǎn)。在這個(gè)例子中,設(shè)備節(jié)點(diǎn)的路徑是/dev/sdb,這是一個(gè)典型的USB存儲(chǔ)設(shè)備節(jié)點(diǎn)。接下來(lái),程序?qū)⒃O(shè)備節(jié)點(diǎn)作為文件打開(kāi),并使用read()函數(shù)從設(shè)備中讀取數(shù)據(jù)。一旦完成數(shù)據(jù)的讀取,程序?qū)㈥P(guān)閉設(shè)備節(jié)點(diǎn)并退出。

四、結(jié)語(yǔ)

Linux系統(tǒng)識(shí)別USB設(shè)備的過(guò)程可以分為四個(gè)步驟:設(shè)備連接、驅(qū)動(dòng)匹配、設(shè)備注冊(cè)和設(shè)備訪問(wèn)。當(dāng)用戶將USB設(shè)備插入計(jì)算機(jī)時(shí),內(nèi)核將通過(guò)USB總線來(lái)檢測(cè)設(shè)備的插入事件,并嘗試查找與設(shè)備匹配的驅(qū)動(dòng)程序。一旦找到了匹配的驅(qū)動(dòng)程序,驅(qū)動(dòng)程序?qū)⒈患虞d并啟動(dòng),它將嘗試對(duì)設(shè)備進(jìn)行初始化,并將其注冊(cè)到內(nèi)核。一旦設(shè)備已經(jīng)被注冊(cè)到內(nèi)核,用戶空間程序就可以通過(guò)設(shè)備節(jié)點(diǎn)來(lái)訪問(wèn)設(shè)備。

在Linux系統(tǒng)中,驅(qū)動(dòng)程序是非常重要的組成部分,它們負(fù)責(zé)管理和控制系統(tǒng)中的各種設(shè)備。對(duì)于USB設(shè)備而言,內(nèi)核提供了一個(gè)通用的USB驅(qū)動(dòng)框架,它可以自動(dòng)檢測(cè)和加載驅(qū)動(dòng)程序,并為用戶提供了一個(gè)簡(jiǎn)單而強(qiáng)大的USB設(shè)備訪問(wèn)接口。通過(guò)深入理解USB驅(qū)動(dòng)程序的工作原理,我們可以更好地理解Linux系統(tǒng)中設(shè)備管理的內(nèi)部機(jī)制,這對(duì)于開(kāi)發(fā)和調(diào)試設(shè)備驅(qū)動(dòng)程序非常有幫助。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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)投訴
  • USB控制器
    +關(guān)注

    關(guān)注

    1

    文章

    35

    瀏覽量

    11934
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11345

    瀏覽量

    210391
  • Linux系統(tǒng)
    +關(guān)注

    關(guān)注

    4

    文章

    595

    瀏覽量

    27510
  • USB設(shè)備
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    16381

原文標(biāo)題:Linux怎么識(shí)別到我插入的設(shè)備USB設(shè)備是什么設(shè)備的呢?

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    看一下射頻電路中的那些無(wú)源器件

    今天我們一起來(lái)看一下射頻電路中的那些無(wú)源器件。和數(shù)字和低頻電路類似,射頻電路也分為無(wú)源器件和有源器件
    發(fā)表于 10-08 16:03 ?908次閱讀
    <b class='flag-5'>看一下</b>射頻電路中的那些無(wú)源器件

    哪位大神幫忙看一下

    `我的keil用不了,幫我看一下,怎么解決啊`
    發(fā)表于 04-13 21:32

    請(qǐng)幫忙看一下

    請(qǐng)幫看一下這個(gè)圖有問(wèn)題嗎,改成這樣可以嗎
    發(fā)表于 12-16 19:37

    各位大神,我想為個(gè)關(guān)于USB轉(zhuǎn)TTL的問(wèn)題,大家看一下

    `我想看一下一臺(tái)電腦發(fā)送的信息能不能被另臺(tái)接收,于是用下圖所示的電路進(jìn)行連接,并用串口調(diào)試助手進(jìn)行觀察。結(jié)果是其中臺(tái)能進(jìn)行正常的接收和發(fā)送,另臺(tái)只能發(fā)送,不能接收(串口調(diào)試助手接
    發(fā)表于 11-27 20:52

    大家看一下這個(gè)是什么元件

    這是個(gè)升壓模塊里邊的,由于被商家把型號(hào)抹掉了也不知道是什么?哪個(gè)老師看一下是什么?假設(shè)上邊的角是1 左下角是2 右下角是3得出的數(shù)據(jù)我已經(jīng)寫在紙上了,字丑希望可以看懂
    發(fā)表于 11-27 23:27

    幫我看一下哪里出問(wèn)題

    仿真過(guò)程中,各個(gè)探針直顯示這些值,沒(méi)有改變過(guò),大家?guī)臀?b class='flag-5'>看一下哪里出問(wèn)題了。
    發(fā)表于 02-07 22:59

    求大神幫忙看一下這個(gè)電路

    求大神幫忙看一下這個(gè)電路不是很理解他的工作過(guò)程
    發(fā)表于 05-19 15:46

    USB顯微鏡,不想了解一下嗎?

    USB顯微鏡,不想了解一下嗎? 近日,在很多國(guó)外網(wǎng)站上都搜的到配備了USB接口的數(shù)字顯微鏡,他們打破了傳統(tǒng)顯微鏡機(jī)體笨重,操作復(fù)雜的傳統(tǒng),
    發(fā)表于 04-28 10:24 ?3557次閱讀

    看一下SMART高速計(jì)數(shù)向?qū)У膽?yīng)用

    SMART不僅支持利用指令編寫高速計(jì)數(shù)程序的功能,還提供了便捷的高速計(jì)數(shù)向?qū)Чδ埽恍枰?jiǎn)單組態(tài)就可以自動(dòng)生成程序,而且程序未進(jìn)行加密,生成后可以修改。下面一起來(lái)看一下向?qū)绾谓M態(tài)吧
    的頭像 發(fā)表于 11-20 15:30 ?3452次閱讀

    u盤usb2.0和usb3.0

    USB2.0和3.0外殼是看不出來(lái),但是我們可以拿起自己的身邊的數(shù)據(jù)線,U盤看一下,這些USB公口的塑料多數(shù)是黑色或者是白顏色,那么這就是USB2.0;
    發(fā)表于 08-30 11:32 ?2474次閱讀

    帶你了解一下什么是USB 3.1接口

    盡管USB是外部設(shè)備中最常見(jiàn)的連接,但它有很多的版本,不同的接頭和連接類型都令人困惑不解。USB 3.1是當(dāng)今最常見(jiàn)的標(biāo)準(zhǔn)之,但它究竟是什么呢?它與之前和之后的版本有什么不同?讓我們來(lái)詳細(xì)了解
    發(fā)表于 09-23 17:31 ?1.7w次閱讀

    看一下LinuxUSB驅(qū)動(dòng)的架構(gòu)(

    USB驅(qū)動(dòng)分為主機(jī)側(cè)和設(shè)備側(cè),主機(jī)側(cè)和設(shè)備側(cè)的USB控制器分別稱為主機(jī)控制器(Host Controller)和USB設(shè)備控制器(UDC)。
    發(fā)表于 08-16 17:41 ?4305次閱讀
    <b class='flag-5'>看一下</b>Linux<b class='flag-5'>下</b><b class='flag-5'>USB</b>驅(qū)動(dòng)的架構(gòu)(<b class='flag-5'>一</b>)

    看一下LinuxUSB驅(qū)動(dòng)的架構(gòu)(二)

    xhci主機(jī)的驅(qū)動(dòng)方式和ehci基本樣,在/drivers/usb/host/xhci.c中實(shí)現(xiàn)XHCI主機(jī)驅(qū)動(dòng)的工作。具體的驅(qū)動(dòng)只要簡(jiǎn)單調(diào)用xhci_init_driver()即可。
    發(fā)表于 08-16 17:50 ?2822次閱讀
    <b class='flag-5'>看一下</b>Linux<b class='flag-5'>下</b><b class='flag-5'>USB</b>驅(qū)動(dòng)的架構(gòu)(二)

    USB設(shè)備在Linux系統(tǒng)中的識(shí)別和加載過(guò)程

    不知道大家在學(xué)習(xí)Linux的時(shí)候有沒(méi)有過(guò)這樣的疑問(wèn),為什么我們通過(guò)同個(gè)接口接入的不同USB設(shè)備,我們的電腦都可以識(shí)別到呢?為什么Linux電腦不會(huì)把鼠標(biāo)識(shí)別成鍵盤呢?帶著這些疑問(wèn)我們
    的頭像 發(fā)表于 05-10 11:53 ?4727次閱讀

    在MATLAB中如何保存和加載消息

    保存和加載消息 您可以保存消息并存儲(chǔ)內(nèi)容以供以后使用。 例如從訂閱者獲取條新消息。 posedata = receive(posesub, 10 ) 然后使用MATLAB的保存函數(shù)將姿態(tài)數(shù)據(jù)保存
    的頭像 發(fā)表于 11-15 15:17 ?439次閱讀
    至尊百家乐20130201| 百家乐六亿财富| 澳门百家乐官网游戏下| 永康百家乐官网赌博| 六合投注系统| 宝博娱乐城开户| 大发888注册送28| 真人游戏大全| 威尼斯人娱乐城备用网| 百家乐游戏制作| 真人百家乐平台排行| 百家乐软件购买| 24风水| 逍遥坊百家乐官网的玩法技巧和规则 | 百家乐正负计算| 金矿百家乐的玩法技巧和规则 | 菲律宾百家乐官网娱乐网| 百家乐官网游戏发展| 迁西县| 百家乐怎么玩请指教| 联众百家乐的玩法技巧和规则| 香港百家乐赌城| 百家乐的玩法技巧和规则| 海王星百家乐的玩法技巧和规则 | 真人百家乐代理分成| 澳门百家乐棋牌游戏| 百家乐技术论坛| 百家乐2号程序| e世博百家乐攻略| 百家乐国际娱乐网| 澳门百家乐娱乐网| 博彩百家乐画谜网| 可信百家乐的玩法技巧和规则| 木棉百家乐的玩法技巧和规则| 爱婴百家乐的玩法技巧和规则 | 威尼斯人娱乐场的微博| 大发888娱乐城网站| 大发888国际娱乐net| 大发888中文官网| 516棋牌游戏补丁| 优博娱乐网|