USB熱拔插事件

2021-08-25 22:12:08 字數 2579 閱讀 5399

usb

(universal serial bus

)通用序列匯流排

的縮寫,是乙個

外部匯流排

標準,用於規範主機與

外圍裝置

的連線以及通訊,目前使用較多的版本有

usb1.1

、usb2.0

、usb3.0

等。usb

介面常用在諸如

usb序列裝置驅動

(3g/4g

上網絡卡、藍芽裝置、串列埠裝置)、

usb大容量磁碟驅動(

u盤、行動硬碟)、

usb主機控制器驅動(嵌入式

otg,

dwc_otg

)、usb

鍵盤滑鼠等,這一些的usb功能支援可以通過核心配置來實現,核心會管理這些

usb裝置的資訊(

lsusb

命令可以檢視usb裝置的情況)。上層應用開發則可以通過監聽核心

socket

來獲取裝置的熱拔插資訊,進而利用此資訊來確定相關的掛載操作或者其他的一些上層應用的業務邏輯。

為了加深對

usb的理解,我們且看看

usb2.0 host

邏輯框圖,以達到對

usb裝置與主機對接介面及協議有乙個比較全面的理解。可以看出最右邊的

phy0

、phy1

是用來實現與外部裝置進行物理連線的,然後通過

serial inte***ce

與usb

控制單元相連線,

usb控制單元裡面又分為

ehci host controller

和ohci host controller

以實現usb2.0

、usb1.1

的相容,

ehci host controller

和ohci host controller

則通過ahb bus

(在pc

機則是pci

匯流排)匯流排與

memory

和cpu

相連。整個過程看起來並不是十分複雜,但是實際應用中有大量的控制暫存器需要配置來實現與不同的外圍裝置進行相連,但是這一切的繁雜工作核心已經幫我們實現了。

熱插拔(

hot-plugging

或hot swap

)即帶電插拔,它的誕生提高了系統與外圍裝置的互動能力。那麼我們如何獲取

usb的熱拔插事件呢,這裡可以通過與核心建立

socket

連線,然後對

socket

進行監聽來獲取

usb拔插資訊,接著對監聽的資訊進行處理,對於大容量儲存裝置則決定裝置的掛載目錄(

mount /dev/sdb /usb

)或者裝置解除安裝(

umount -l /usb

)、對於諸如

3g/4g

等上網絡卡裝置,則可以通過監聽拔插資訊來決定撥號上網或者接聽**等。下面通過例子說明如何通過核心

socket

獲取裝置熱拔插資訊的。

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static int createhotplugsock(void)

setsockopt(hotplug_sock, sol_socket, so_rcvbufforce, &buffersize, sizeof(buffersize));

retval = bind(hotplug_sock,(struct sockaddr *)&snl,sizeof(struct sockaddr_nl));

if(0 > retval)

return hotplug_sock;

}int main(int argc, char* argv)

; char *str;

sockfd = createhotplugsock();

while(1)

buf[sum] = 0;

//輸出熱拔插socket監聽的資訊

fprintf(stderr,"buf=[%s]\n\n", buf);

usleep(100*1000);

} }

下面是樣例**socket監聽滑鼠裝置拔插的部分列印資訊

正如linux

下一切都是檔案的哲學理念一樣,現在的外圍裝置則一切以

usb為標準看齊,在應用程式開發過程中,經常需要對這些

usb外圍裝置的熱拔插事件進行監聽處理來實現上層軟體的業務邏輯,核心

socket

很好解決了這個問題,通過它可以很方便地與這些

usb文章參考:

Linux 下監控USB裝置拔插事件

使用udev的規則來實現 自2.6 核心開始,就可以使用udev 協助管理系統中各裝置名稱。例如,磁碟裝置排序 網絡卡裝置排序等。udev能動態地在 dev目錄裡產生自定義的 標識性強的裝置檔案或裝置鏈結。udev依賴核心中的sysfs的支援。自2.6 核心開始,引入了sysfs 檔案系統。sysf...

Linux核心熱拔插機制

在linux2.6.30.4的核心中,註冊驅動時呼叫device create,解除安裝驅動時呼叫 device destory函式最終都將導致kobject uevent env函式被呼叫,該函式用於 通知使用者空間裝置傳送了動態變化 新增 device create struct class c...

centos linux熱拔插scsi硬碟

自己配置虛擬機器,需要新增一塊虛擬硬碟存放資料。虛擬機器在更新軟體,不想停機。學習了下熱拔插硬碟的知識點 1.在虛擬機器中建立虛擬磁碟並新增。2.檢視目前的磁碟資訊 cat proc scsi scsi 我返回的結果如下 attached devices host scsi1 channel 00 ...