新聞中心
在現(xiàn)代計(jì)算機(jī)系統(tǒng)中,USB(Universal Serial Bus)設(shè)備已經(jīng)成為了必不可少的部分。USB設(shè)備能夠向計(jì)算機(jī)系統(tǒng)提供大量的外圍設(shè)備,包括存儲(chǔ)設(shè)備、網(wǎng)絡(luò)設(shè)備、聲卡等等。而這些設(shè)備的驅(qū)動(dòng)都由計(jì)算機(jī)系統(tǒng)來承擔(dān)。在Linux系統(tǒng)中,USB設(shè)備的驅(qū)動(dòng)由USB驅(qū)動(dòng)程序來實(shí)現(xiàn),本文將。

公司主營業(yè)務(wù):成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出新洲免費(fèi)做網(wǎng)站回饋大家。
一、USB的基本概念
USB是一種新型的串行總線,它是一種供應(yīng)商和設(shè)備之間的通信協(xié)議。USB通過在設(shè)備和主機(jī)之間的連接線上傳遞電信號(hào)來進(jìn)行通信。與傳統(tǒng)的串口(RS-232)相比,USB具有更快的傳輸速率、更簡(jiǎn)單的物理連接方式和更可靠的數(shù)據(jù)傳輸。USB總線可以支持多達(dá)127個(gè)設(shè)備在一個(gè)USB主機(jī)上運(yùn)行。
二、Linux USB系統(tǒng)架構(gòu)
Linux USB的總體架構(gòu)是在Linux內(nèi)核中實(shí)現(xiàn)了一個(gè)USB子系統(tǒng),用于處理USB設(shè)備的連接和驅(qū)動(dòng)。USB子系統(tǒng)包括USB核心層、USB設(shè)備層和USB設(shè)備驅(qū)動(dòng)層三個(gè)組件。
USB核心層包括了USB總線驅(qū)動(dòng)和USB核心模塊。USB總線驅(qū)動(dòng)對(duì)USB總線進(jìn)行枚舉、配置和管理;USB核心模塊用于實(shí)現(xiàn)USB設(shè)備的注冊(cè)、設(shè)備驅(qū)動(dòng)的注冊(cè)等。
USB設(shè)備層由USB設(shè)備驅(qū)動(dòng)模塊和USB驅(qū)動(dòng)模塊組成。USB設(shè)備驅(qū)動(dòng)模塊用于向系統(tǒng)中提供設(shè)備特定的控制,例如USB設(shè)備的端點(diǎn)描述符、設(shè)備功能、USB設(shè)備協(xié)議等。USB驅(qū)動(dòng)模塊則用于管理USB設(shè)備的IO請(qǐng)求,包括讀、寫、控制、同步波動(dòng)等操作。
USB設(shè)備驅(qū)動(dòng)層包括了不同類型的USB設(shè)備驅(qū)動(dòng),當(dāng)系統(tǒng)檢測(cè)到一個(gè)特定類型的USB設(shè)備時(shí),會(huì)自動(dòng)加載相應(yīng)的設(shè)備驅(qū)動(dòng)程序,從而使得這個(gè)設(shè)備可以正常地工作。
三、USB驅(qū)動(dòng)程序
USB設(shè)備驅(qū)動(dòng)程序是USB子系統(tǒng)的核心組件,它用于將USB設(shè)備與Linux內(nèi)核相連接。USB設(shè)備驅(qū)動(dòng)程序可以分為三種類型:HCD驅(qū)動(dòng)、USB主機(jī)控制驅(qū)動(dòng)和USB設(shè)備驅(qū)動(dòng)。
HCD(Host Controller Driver)驅(qū)動(dòng)是用于控制USB主機(jī)控制器和USB總線的驅(qū)動(dòng)程序。HCD驅(qū)動(dòng)程序是USB總線驅(qū)動(dòng)程序的組成部分,它的主要作用是向USB總線產(chǎn)生唯一的信號(hào)用于控制USB設(shè)備間的通訊。
USB主機(jī)控制驅(qū)動(dòng)用于提供直接對(duì)USB設(shè)備進(jìn)行控制的API,通常由系統(tǒng)中的第三方設(shè)備驅(qū)動(dòng)提供支持。USB主機(jī)控制驅(qū)動(dòng)是USB設(shè)備的入口,它允許在USB總線上添加、刪除和更新USB設(shè)備。
USB設(shè)備驅(qū)動(dòng)程序是用于連接Linux內(nèi)核和USB設(shè)備的驅(qū)動(dòng)程序。有許多種類型的USB設(shè)備,它們各有不同的屬性和特點(diǎn)。因此USB設(shè)備驅(qū)動(dòng)程序必須是特定于某個(gè)USB設(shè)備的。當(dāng)Linux內(nèi)核探測(cè)到某個(gè)USB設(shè)備時(shí),它會(huì)自動(dòng)調(diào)用相對(duì)應(yīng)的驅(qū)動(dòng)程序,從而實(shí)現(xiàn)對(duì)設(shè)備的控制和管理。
四、USB驅(qū)動(dòng)程序的注冊(cè)
在Linux中,USB驅(qū)動(dòng)程序是通過USB設(shè)備驅(qū)動(dòng)模塊來實(shí)現(xiàn)的。USB驅(qū)動(dòng)程序可以注冊(cè)到USB子系統(tǒng)的設(shè)備驅(qū)動(dòng)列表中,當(dāng)Linux內(nèi)核檢測(cè)到一個(gè)USB設(shè)備時(shí),它將自動(dòng)調(diào)用相應(yīng)的USB驅(qū)動(dòng)程序。
注冊(cè)USB驅(qū)動(dòng)程序的一般流程包括以下幾個(gè)步驟:
1. 定義USB驅(qū)動(dòng)程序結(jié)構(gòu)體
struct u_driver {
const char *name;
…
};
2. 初始化USB驅(qū)動(dòng)程序
static struct u_driver my_driver = {
.name = “my-driver”,
…
}
3. 注冊(cè)USB驅(qū)動(dòng)程序
static int __init my_driver_init()
{
return u_register_driver(&my_driver);
}
四、USB設(shè)備的操作
在Linux中,USB設(shè)備的操作通常通過USB設(shè)備驅(qū)動(dòng)程序進(jìn)行。USB設(shè)備驅(qū)動(dòng)程序是特定于某個(gè)USB設(shè)備的,因此需要對(duì)每個(gè)不同的USB設(shè)備編寫不同的驅(qū)動(dòng)程序。
USB設(shè)備驅(qū)動(dòng)程序的功能包括為USB設(shè)備分配內(nèi)存、初始化USB設(shè)備、讀/寫數(shù)據(jù)傳輸、中斷處理等。下面是一些常用的USB設(shè)備驅(qū)動(dòng)程序的函數(shù):
1. probe函數(shù):用于識(shí)別USB設(shè)備,若識(shí)別成功則返回0,否則返回錯(cuò)誤碼。
static int u_device_probe(struct u_interface *interface, const struct u_device_id *id)
{
…
return 0;
}
2. disconnect函數(shù):用于移除USB設(shè)備。
static void u_device_disconnect(struct u_interface *interface)
{
…
}
3. ioctl函數(shù):用于控制USB設(shè)備的一些參數(shù),例如設(shè)備狀態(tài)、電源狀態(tài)、波特率等。
static int u_device_ioctl(struct u_interface *interface, unsigned int code, void *buf)
{
…
return 0;
}
4. write函數(shù):用于向USB設(shè)備寫入數(shù)據(jù)。
static ssize_t u_device_write(struct file *file, const char __user *buf, size_t count, loff_t *offset)
{
…
return count;
}
5. read函數(shù):用于從USB設(shè)備讀取數(shù)據(jù)。
static ssize_t u_device_read(struct file *file, char __user *buf, size_t count, loff_t *offset)
{
…
return count;
}
五、
本文介紹了Linux USB驅(qū)動(dòng)的實(shí)現(xiàn)原理,包括USB的基本概念、Linux USB系統(tǒng)架構(gòu)、USB驅(qū)動(dòng)程序和USB設(shè)備的操作。,可以幫助我們更好地了解Linux操作系統(tǒng)的原理和機(jī)制。
相關(guān)問題拓展閱讀:
- 如何在Linux開發(fā)工具中啟動(dòng)USB驅(qū)動(dòng)程序
- 請(qǐng)問Linux內(nèi)核里,USB鍵盤和鼠標(biāo)的驅(qū)動(dòng)都是哪些文件?
如何在Linux開發(fā)工具中啟動(dòng)USB驅(qū)動(dòng)程序
USB驅(qū)動(dòng)程序支持在原生Linux提供了。
方法要求啟用驅(qū)動(dòng),但是,取決于你所使用的分布和內(nèi)核版本。
哪個(gè)發(fā)行版支持USBFS?
已知提供USBFS支持:
Ubuntu 9.04或以上,
Ubuntu 9.10的內(nèi)核2.6.31-19服務(wù)器,
CentOS的4.8,
CentOS的5.4,
一般情況下,任何分布用內(nèi)核版本 = 2.6.32
方法1:USBFS支持
如果你的發(fā)行版提供了USBFS支持,那么下面的命令將工作斗弊模:
mount -t ufs none /proc/bus/u -o devmode=0666
為了使這種更改永久,確保下面一行是在/ etc / fstab文件中:
none /proc/bus/u ufs defaults,devmode=
這將自動(dòng)安裝在系統(tǒng)啟動(dòng)。
一旦 /etc/fstab添加已經(jīng)做完,一個(gè)簡(jiǎn)單的命令應(yīng)該掛載USBFS文件系統(tǒng):
mount /proc/bus/u
無論是FTDI / XTAG和XTAG-2的調(diào)試適配器空緩現(xiàn)在應(yīng)該工作。
方法2:沒有USBFS支持
為了確保在任何一個(gè)FTDI / XTAG或XTAG-2調(diào)試適配器插入時(shí)的權(quán)限是在設(shè)備上是正確的,您需要配置“udev”來識(shí)別這個(gè)設(shè)備。
創(chuàng)建一個(gè)文件“/etc/udev/rules.d/99-xmos.rules”,其內(nèi)容如下:
SUBSYSTEM!=”u|u_device”, GOTO=”xmos_rules_end”
ACTION!=”add”, GOTO=”xmos_rules_end”
# 20b1:f7d1 for xmos xtag2
ATTRS{idVendor}==”20b1″, ATTRS{idProduct}==”f7d1″, MODE=”0666″, SYMLINK+=”xtag2-%n”
# 20b1:f7d3 for xmos startkit
ATTRS{idVendor}==”20b1″, ATTRS{idProduct}==”f7d3″, MODE=”0666″, SYMLINK+=”startkit-%n”
# 0403:6010 for XC-1 with FTDI dual-uart chip
ATTRS{idVendor}==”0403″, ATTRS{idProduct}==”6010″, MODE=”0666″, SYMLINK+=”xc1-%n”
LABEL=”xmos_rules_end”
注意:本ATTRS,MODE和SYMLINK節(jié)必須全部在同一行,因?yàn)槊總€(gè)規(guī)卜清則只能在一行上。
現(xiàn)在告訴udev進(jìn)行重新加載,以確保文件添加新的規(guī)則:
service udev reload
還必須拔下并重新插上USB線,讓udev的識(shí)別設(shè)備的新規(guī)則。或者觸發(fā)重新插上的udev類型為“udevadm觸發(fā)”或“udevtrigger”命令,取決于在你的Linux分布上udev的版本。
FTDI / XTAG其他注意事項(xiàng)
FTDI的庫需要USB設(shè)備的文件都可以從/ proc /bus/ USB,不支持的/dev/bus/u作為文件的位置。
但是,如果你的發(fā)行版不支持USBFS(以上方法1),但確實(shí)有一個(gè)的/proc/bus/u空目錄,你可以使用下面的綁定mount命令的解決方法:
mount –bind /dev/bus/u /proc/bus/u
如果你的發(fā)行版不支持USBFS,也沒有一個(gè)的/proc/bus/u目錄(這是較新的內(nèi)核的情況下,大約從2.6.32開始),然后聯(lián)系XMOS的rthe設(shè)備庫的非官方補(bǔ)丁的版本; 發(fā)送XMOS的支持標(biāo)簽,其中包括“Linux的FTDI庫請(qǐng)求”的主題。
請(qǐng)問Linux內(nèi)核里,USB鍵盤和鼠標(biāo)的驅(qū)動(dòng)都是哪些文件?
USB鼠標(biāo)薯扮驅(qū)動(dòng)數(shù)隱灶在內(nèi)核位置:kernel2.6.35.11/driver/hid/uhid/umouse.c
USB鍵盤驅(qū)動(dòng)在內(nèi)核位置:攜扒kernel2.6.35.11/driver/hid/uhid/ukbd.c
uhid和umouse.c都在/usr/src/linux/drivers/hid/uhid目錄下
USB 總線引出兩個(gè)重要的鏈表!
一個(gè) USB 總線引出兩個(gè)重要的鏈表,一個(gè)為
USB 設(shè)備鏈表,一個(gè)為 USB 驅(qū)動(dòng)鏈表。設(shè)備鏈表包含各種系統(tǒng)中的USB 設(shè)備以及這些設(shè)備的所有接口,驅(qū)動(dòng)鏈表包含 USB 設(shè)備驅(qū)動(dòng)程序(u
device driver)和 USB 驅(qū)動(dòng)程序(u driver)。
USB 設(shè)備驅(qū)動(dòng)程序(u device driver)和 USB 驅(qū)動(dòng)程序(u driver)的區(qū)別是什么?
USB 設(shè)備驅(qū)動(dòng)程序包含 USB 設(shè)備的一些通用特性,將與所有 USB 設(shè)備相匹配。在 USB core 定義了:struct u_device_driver u_generic_driver。u_generic_driver 是 USB 子系統(tǒng)中唯一的一個(gè)設(shè)備驅(qū)動(dòng)程序?qū)ο?。?USB 驅(qū)動(dòng)程序則是與接口相匹配,接口是一個(gè)完成特定功能的端點(diǎn)的。
設(shè)備是如何添加到設(shè)備鏈表上去的?
在設(shè)備插入 USB 控制器之后,USB core 即會(huì)將設(shè)備在系統(tǒng)中注冊(cè),添加到 USB 設(shè)備鏈表上去。
USB 設(shè)備驅(qū)動(dòng)程序(u device driver)是如何添加到驅(qū)動(dòng)鏈表上去的?
在系統(tǒng)啟動(dòng)注冊(cè) USB core 時(shí),USB 設(shè)備驅(qū)動(dòng)程序即將被注冊(cè),也就添加到驅(qū)動(dòng)鏈表上去了。
接口是如何添加到設(shè)備鏈表上去的?
在 USB 設(shè)備驅(qū)動(dòng)程序和 USB 設(shè)備的匹配之后,USB core 會(huì)對(duì)設(shè)備進(jìn)行配置,分析設(shè)備的結(jié)構(gòu)之后會(huì)將設(shè)備所有接口都添加到設(shè)備鏈表上去。比如鼠標(biāo)設(shè)備中有一個(gè)接口,USB core 對(duì)鼠標(biāo)設(shè)備配置后,會(huì)將這個(gè)接口添加到設(shè)備鏈表上去。
USB 驅(qū)動(dòng)程序(u driver)是如何添加到驅(qū)動(dòng)鏈表上去的?
在每個(gè) USB 驅(qū)動(dòng)程序的被注冊(cè)時(shí),USB 驅(qū)動(dòng)程序即會(huì)添加到驅(qū)動(dòng)鏈表上去。
比如鼠標(biāo)驅(qū)動(dòng)程序,u_mouse_init 函數(shù)將通過 u_register(&u_mouse_driver)
將鼠標(biāo)驅(qū)動(dòng)程序注冊(cè)到 USB core 中,然后就添加到驅(qū)動(dòng)鏈表中去了。其中 u_mouse_driver 是描述鼠標(biāo)驅(qū)動(dòng)程序的結(jié)構(gòu)體。
已配置狀態(tài)(configured status)之后話
當(dāng)鼠標(biāo)的設(shè)備、接口都添加到設(shè)備鏈表,并且鼠標(biāo)驅(qū)動(dòng)程序也添加到驅(qū)動(dòng)鏈表上去了,
系統(tǒng)就進(jìn)入一種叫做已配置(configured)的狀態(tài)。
要達(dá)到已配置狀態(tài),將經(jīng)歷復(fù)雜的過程,USB core 為 USB
設(shè)備奉獻(xiàn)著無怨無悔。在這個(gè)過程中,系統(tǒng)將會(huì)建立起該晌族設(shè)備的的設(shè)備、配置、接口、設(shè)置、端點(diǎn)的描述信息,它們分別被
u_device、u_configuration、u_interface、u_host_interface、
u_host_endpoint 結(jié)構(gòu)體描述。
設(shè)備達(dá)到已配置狀態(tài)后,首先當(dāng)然就要進(jìn)行 USB 驅(qū)動(dòng)程序和相應(yīng)接口的配對(duì),對(duì)于鼠標(biāo)設(shè)備來說則是鼠標(biāo)驅(qū)動(dòng)程序和鼠標(biāo)中的接口的配對(duì)。USB core 會(huì)調(diào)用u_bus 總線的u_device_match
函數(shù),通過比較設(shè)備中的接口信息陸謹(jǐn)芹和 USB 驅(qū)動(dòng)程序中的 id_table,來初步?jīng)Q定該 USB 驅(qū)動(dòng)程序是不是跟相應(yīng)接口相匹配。通過這一道關(guān)卡后,USB core 會(huì)認(rèn)為這個(gè)設(shè)備應(yīng)該由這個(gè)驅(qū)動(dòng)程序負(fù)責(zé)。
然而,僅僅這一步是不夠的,接著,將會(huì)調(diào)用 USB 驅(qū)動(dòng)程序中的 probe 函數(shù)對(duì)相應(yīng)接口進(jìn)行進(jìn)一步檢查。如果該驅(qū)動(dòng)程序確實(shí)適合設(shè)備接口,對(duì)設(shè)備做一些初始化工作,分配 urb 準(zhǔn)備數(shù)據(jù)傳輸。
當(dāng) 鼠標(biāo)設(shè)備在用戶空間打開時(shí),
將提交 probe 函數(shù)構(gòu)建的 urb 請(qǐng)求塊,urb 將開始為傳送數(shù)據(jù)而忙碌了。urb 請(qǐng)求塊就像一個(gè)裝東西的“袋子”,USB
驅(qū)動(dòng)程序把“空袋子”提交給 USB core,然后再交給主控制器,主控制器把數(shù)據(jù)放入這個(gè)“袋子”后再將裝滿數(shù)據(jù)的“袋子”通過 USB core
交還給
USB 驅(qū)動(dòng)程序,這樣一次數(shù)據(jù)傳早畢輸就完成了。
lspci可以看你的u情況攜談,lod 查查加載的模塊,應(yīng)該是u什么什么的,
驅(qū)動(dòng)應(yīng)該是在/lib/modules/內(nèi)核版本/kernel/drives/u下,
當(dāng)然另外辯悉碰還要mousedev模塊吧。
我只是提供個(gè)思路,也沒有試過安裝
linux u驅(qū)動(dòng)的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux u驅(qū)動(dòng),深入探究Linux USB驅(qū)動(dòng)的實(shí)現(xiàn)原理,如何在Linux開發(fā)工具中啟動(dòng)USB驅(qū)動(dòng)程序,請(qǐng)問Linux內(nèi)核里,USB鍵盤和鼠標(biāo)的驅(qū)動(dòng)都是哪些文件?的信息別忘了在本站進(jìn)行查找喔。
成都網(wǎng)站設(shè)計(jì)制作選創(chuàng)新互聯(lián),專業(yè)網(wǎng)站建設(shè)公司。
成都創(chuàng)新互聯(lián)10余年專注成都高端網(wǎng)站建設(shè)定制開發(fā)服務(wù),為客戶提供專業(yè)的成都網(wǎng)站制作,成都網(wǎng)頁設(shè)計(jì),成都網(wǎng)站設(shè)計(jì)服務(wù);成都創(chuàng)新互聯(lián)服務(wù)內(nèi)容包含成都網(wǎng)站建設(shè),小程序開發(fā),營銷網(wǎng)站建設(shè),網(wǎng)站改版,服務(wù)器托管租用等互聯(lián)網(wǎng)服務(wù)。
本文標(biāo)題:深入探究Linux USB驅(qū)動(dòng)的實(shí)現(xiàn)原理 (linux u驅(qū)動(dòng))
文章源于:http://www.dlmjj.cn/article/dhepgop.html


咨詢
建站咨詢
