精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

USB設備在Linux系統中的識別和加載過程

嵌入式悅翔園 ? 來源:嵌入式悅翔園 ? 2023-05-10 11:53 ? 次閱讀

一、前言

不知道大家在學習Linux的時候有沒有過這樣的疑問,為什么我們通過同一個接口接入的不同USB設備,我們的電腦都可以識別到呢?為什么Linux電腦不會把鼠標識別成鍵盤呢?帶著這些疑問我們一起來看一下USB的識別和加載過程。

二、USB設備的識別過程

當我們插入一個USB設備時,Linux內核會自動檢測并加載相應的驅動程序,使設備能夠正常工作。下面我們將深入探討USB設備在Linux系統中的識別和加載過程。

2.1 USB控制器檢測設備插入

USB控制器是一個硬件設備,用于控制USB總線上的設備。當你插入一個USB設備時,USB控制器會檢測到電壓變化并發出一個中斷信號。這個中斷信號被送到處理器上的USB控制器中斷線上,告訴Linux內核有新的USB設備插入。

2.2 內核檢測并加載驅動程序

當內核接收到USB控制器發出的中斷信號時,它會調用USB子系統中的usbcore模塊,該模塊負責檢測新的USB設備并加載相應的驅動程序。usbcore模塊首先會檢測設備的描述符,這個描述符包括設備的廠商ID、產品ID、類別碼等信息

如果已經存在一個匹配的驅動程序,那么usbcore模塊就會加載這個驅動程序。如果沒有匹配的驅動程序,則會嘗試加載一個通用的驅動程序,這個驅動程序能夠支持大多數USB設備。

2.3 驅動程序向USB子系統注冊

一旦正確的驅動程序被加載,它會向USB子系統注冊并告訴它自己可以處理哪些設備。這一步通常包括向內核注冊USB設備的類別(如存儲設備、輸入設備等)。

這個過程包括了向內核注冊一個新的USB設備驅動程序,并在該驅動程序中指定設備的廠商ID、產品ID等信息。一旦驅動程序被成功注冊,USB子系統就可以將設備與正確的驅動程序進行匹配。

2.4 USB子系統創建設備節點

USB子系統接下來會為設備創建一個設備節點。設備節點是一個特殊的文件,在/dev目錄下,它允許用戶空間程序與設備通信。設備節點的名稱通常是由內核根據設備的廠商ID、產品ID和序列號等信息動態生成的。

設備節點的創建是通過udev守護進程實現的,這個守護進程會監視系統中的設備插拔事件,并自動創建或刪除相應的設備節點。創建設備節點之后,內核就可以將設備的訪問權限分配給用戶空間程序。

2.5 驅動程序初始化設備

驅動程序被通知有新的設備插入后,它會對設備進行初始化。初始化可能包括設置設備的傳輸速率、分配內存緩沖區等。設備初始化完成后,驅動程序會向USB子系統報告設備已準備好。

2.6 用戶空間程序打開設備:

最后,用戶空間程序可以打開設備節點并與設備通信。設備節點的權限通常被設置為只允許root用戶或在相關組中的用戶訪問。用戶空間程序可以使用系統調用(如read和write)向設備發送命令和接收數據。

通過這個過程,Linux系統可以自動識別設備并加載相應的驅動程序,使設備可以正常工作。這也是為什么當我們插入一個USB設備時,我們不需要手動安裝任何驅動程序或執行任何其他操作就可以直接開始使用設備。

當你插入一個USB設備時,Linux系統會自動執行上述步驟,從而自動識別設備并加載相應的驅動程序,使設備可以正常工作。下面我們從代碼的層面來分析一下該過程。

三、代碼實現講解

下面我通過一些示例代碼,講解一下USB設備在Linux系統中的識別和加載過程。這些示例代碼只是講解一下原理,實際代碼將會更加復雜。

3.1 檢測設備插入

當USB設備插入到系統中時,會產生一個中斷信號,這個信號會被處理器上的USB控制器中斷線捕獲,并由內核的USB子系統處理。下面是一個示例代碼,演示如何檢測USB設備的插入和拔出事件:

#include
#include

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

intr=libusb_init(&ctx);
if(r

這段代碼使用了libusb庫,這是一個C語言庫,用于訪問USB設備。它提供了一個用于初始化USB子系統和掃描USB總線的API,以及用于訪問USB設備的API。

3.2 加載驅動程序

一旦檢測到設備插入,USB子系統會嘗試加載一個適當的驅動程序。下面是一個示例驅動程序代碼,它負責支持USB存儲設備(例如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){
//初始化設備并注冊
return0;
}

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

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

module_usb_driver(storage_driver);

這段代碼演示了一個簡單的驅動程序,它可以處理USB存儲設備的插入和拔出事件。在加載驅動程序時,內核將搜索已加載的驅動程序列表,以查找與設備匹配的驅動程序。

如果找到了匹配的驅動程序,內核將使用該驅動程序來管理該設備。如果沒有找到匹配的驅動程序,內核將不會加載任何驅動程序。

3.3 設備注冊

一旦找到了與設備匹配的驅動程序,驅動程序將被加載并啟動,它將嘗試對設備進行初始化,并將其注冊到內核。下面是一個示例代碼,演示如何初始化USB存儲設備并將其注冊到內核:

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

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

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

當驅動程序將調用設備初始化函數并將其注冊到內核,但是由于設備初始化和注冊的過程因設備而異,因此這里省略了這部分代碼。

3.4 設備訪問

一旦設備已經被注冊到內核,用戶空間程序就可以通過設備節點來訪問設備。在Linux系統中,設備節點是一種特殊的文件,可以通過標準文件I/O函數來訪問。下面是一個示例代碼,演示如何打開并讀取USB存儲設備:

#include
#include
#include

intmain(){
//打開設備節點
intfd=open("/dev/sdb",O_RDONLY);
if(fd

這段代碼使用了標準的文件I/O函數來訪問設備節點。在這個例子中,設備節點的路徑是/dev/sdb,這是一個典型的USB存儲設備節點。接下來,程序將設備節點作為文件打開,并使用read()函數從設備中讀取數據。一旦完成數據的讀取,程序將關閉設備節點并退出。

四、結語

Linux系統識別USB設備的過程可以分為四個步驟:設備連接、驅動匹配、設備注冊和設備訪問。當用戶將USB設備插入計算機時,內核將通過USB總線來檢測設備的插入事件,并嘗試查找與設備匹配的驅動程序。一旦找到了匹配的驅動程序,驅動程序將被加載并啟動,它將嘗試對設備進行初始化,并將其注冊到內核。一旦設備已經被注冊到內核,用戶空間程序就可以通過設備節點來訪問設備。

在Linux系統中,驅動程序是非常重要的組成部分,它們負責管理和控制系統中的各種設備。對于USB設備而言,內核提供了一個通用的USB驅動框架,它可以自動檢測和加載驅動程序,并為用戶提供了一個簡單而強大的USB設備訪問接口。通過深入理解USB驅動程序的工作原理,我們可以更好地理解Linux系統中設備管理的內部機制,這對于開發和調試設備驅動程序非常有幫助。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 控制器
    +關注

    關注

    112

    文章

    15886

    瀏覽量

    175386
  • usb
    usb
    +關注

    關注

    60

    文章

    7773

    瀏覽量

    262392
  • Linux
    +關注

    關注

    87

    文章

    11123

    瀏覽量

    207919
  • Linux系統
    +關注

    關注

    4

    文章

    587

    瀏覽量

    27181
  • 電腦
    +關注

    關注

    15

    文章

    1660

    瀏覽量

    68187
收藏 人收藏

    評論

    相關推薦

    Linux和Windows系統啟動過程的簡單分析

    AT PPC.....bootloader特性:以命令為基礎。一旦引導啟動系統后,bootloader就不存在。Linux和Windows啟動過程中,基本的原理都差不多,都先加載一個
    發表于 08-28 11:27

    嵌入式Linux下的USB設備驅動

    ,而且所有的配置過程都由系統自動完成,無須用戶干預。1 Linux下的USB設備驅動
    發表于 12-07 10:29

    怎么讓LinuxUSB設備識別以太網68053?

    我們正在考慮使用CyPress 68053作為我們的板的USB接口。我們希望董事會在Linux作為一個以太網接口(如我們的董事會是一個USB /以太網狗)。有沒有辦法讓Linux
    發表于 12-25 15:45

    基于USB接口的移動存儲設備構建微型操作系統

    文件系統的掛載,然后執行系統的/***in/init 進程。與普通IDE、SATA 硬盤相比,USB 接口存儲設備從驅動模塊
    發表于 06-10 05:00

    PC沒有正確識別USB設備

    有人知道司機USB PC側嗎?有人用PIC32 MZ家族MPLABX運行插件引導加載程序嗎?我用HARMONY編譯了基本的應用程序引導程序,但是PC沒有正確
    發表于 09-27 15:05

    基于LinuxUSB設備驅動方法有什么優點?

    嵌入式linux系統環境以其易于移植裁減、內核小、效率高、完整、原代碼開放及性能優異等特點,嵌入式領域得到了非常廣泛的應用。LinuxUSB
    發表于 11-07 08:31

    全志H5芯片開發板香橙派PC2Linux系統下連接USB攝像頭的使用方法

    --no-banner 用于去除照片的水印c. -r 選項用于指定照片的分辨率d. -S 選項用設置于跳過前面的幀數6) 服務器版的 Linux 系統,拍完照后可以使用 scp
    發表于 11-16 11:41

    為什么要配置Linux系統嵌入式設備的串口通信?

    Linux系統嵌入式設備的串口通信一. 為什么要配置串口通信? 嵌入式開發或者物聯網開發過程中,串口輸出數據是開發
    發表于 12-16 07:24

    USB設備端驅動系統與嵌入式linux系統的實現

    嵌入式 linux 系統環境以其易于移植裁減、內核小、效率高、完整、原代碼開放及性能優異等特點,嵌入式領域得到了非常廣泛的應用。LinuxU
    發表于 10-31 16:15 ?4次下載
    <b class='flag-5'>USB</b><b class='flag-5'>設備</b>端驅動<b class='flag-5'>系統</b>與嵌入式<b class='flag-5'>linux</b><b class='flag-5'>系統</b>的實現

    win7系統無法識別USB設備的解決辦法

    使用win7系統過程中,有時會遇到電腦無法識別USB設備的問題,遇到此問題的用戶,請來看看下面的解決方案吧。
    的頭像 發表于 08-10 16:14 ?1.2w次閱讀
    win7<b class='flag-5'>系統</b>無法<b class='flag-5'>識別</b><b class='flag-5'>USB</b><b class='flag-5'>設備</b>的解決辦法

    嵌入式Linux操作系統引導加載程序BootLoarder

    BootLoarder是什么Linux操作系統分層一個嵌入式Linux系統從軟件的角度看通常可以分為四個層次:引導加載程序。包括固化
    發表于 11-01 17:05 ?8次下載
    嵌入式<b class='flag-5'>Linux</b>操作<b class='flag-5'>系統</b>引導<b class='flag-5'>加載</b>程序BootLoarder

    從軟件角度分析linux內核USB系統的熱插拔過程

    本文從軟件角度分析linux內核USB系統的熱插拔過程,以實際分析思路和過程行文,基于linux
    的頭像 發表于 01-15 09:28 ?5144次閱讀

    看一下USB識別和加載過程

    不知道大家在學習Linux的時候有沒有過這樣的疑問,為什么我們通過同一個接口接入的不同USB設備,我們的電腦都可以識別到呢?
    的頭像 發表于 05-10 11:54 ?5357次閱讀

    MATLAB如何保存和加載消息

    到MAT文件。 save ( 'posedata.mat' , 'posedata' ) 將文件加載回工作空間之前,清除posedata變量。 clear posedata 現在可以通過調用load
    的頭像 發表于 11-15 15:17 ?307次閱讀

    linux驅動程序如何加載進內核

    Linux系統,驅動程序是內核與硬件設備之間的橋梁。它們允許內核與硬件設備進行通信,從而實現
    的頭像 發表于 08-30 15:02 ?192次閱讀