亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? linux下usb.c源代碼分析.txt

?? Linux下usb.c源代碼分析 在Linux系統中有一個名為“The USB Core”子系統
?? TXT
?? 第 1 頁 / 共 2 頁
字號:
Linux下的USB子系統 
在Linux系統中有一個名為“The USB Core”子系統,它有特殊的API支持USB設備和控制器。它的作用是通過定義一組數據結構,宏和函數來抽象所有硬件或設備依賴的部分。 

USB內核包含所有USB設備和控制器的最外層的驅動。這些函數可以被劃分到上層或下層API。下圖所示的就是針對于USB設備驅動和另外一個主機控制器的API。下層集成在USB設備驅動層,因為主機控制器驅動的開發已經完成。 


USB Core API Layers 







USB設備驅動程序結構 
USB設備驅動在子系統中注冊和注銷。一個驅動程序必須注冊2個入口點和它的名字。對于特殊的USB設備(它不適合在其它子系統中注冊)一個驅動程序可以注冊一對文件操作和一個次設備號。在這種情況下指定的次設備號和隨后的15個數字被分配給驅動程序。這樣就可以使一個驅動程序支持16個相似的USB設備。所有USB設備的主設備號是180。 
數據結構: 
所有USB相關函數或數據結構都遵循同樣的命名規則而且都是以usb_開始。 


name:模塊名字 
probe:prob函數的入口 
disconnect:disconnect函數的入口 
driver_list:子系統初始化時為{NULL,NULL} 
fops:驅動程序文件操作的鏈表 
minor:分配給這個設備的次設備號(其值是16的倍數) 
serialize: 
ioctl: 
id_table: 

結構入口 
USB驅動程序結構添加兩個入口到普通的設備驅動: 
void *probe(struct usb_device *dev, unsigned int interface, const struct usb_device_id *id_table);在有新的設備接入到總線上時就會調用這個入口函數。然后,驅動程序要為新設備創建一個內部數據結構。 

dev聲明了特定的設備正文,它的內容指向所有USB描述符。interface聲明了特定的接口號。如果一個USB驅動程序想把自己與一個具體設備和接口綁定在一起,它就必須返回一個指針。這個指針通常指向設備驅動程序的正文結構。 

探查是通過檢查vendor和產品的定義或分類以及子集的定義來實現的。如果它們匹配則接口號就與驅動程序支持的比較。因為設備的特性多不相同所以當探查完成后分類是基于有必要解析一些USB描述符。 

Probe函數: 


void disconnect(struct usb_device *dev, void *drv_context);當設備與這個函數斷開時就調用這個函數。 
dev聲明了特定的設備正文而且driver_context返回一個指針指向當前注冊的probe函數的driver_context。返回后從USB結構的disconnect函數釋放了所有與設備有關的數據結構。所以,特別是usb設備不能再使用usb_device結構 

disconnect函數: 

結構函數 
int usb_register(struct usb_driver *drv); 
這個函數用來在子系統中注冊一個新的USB設備。drv指向一個已完全初始化的usb_driver結構。成功返回0,否則返回一個錯誤值。 

void usb_deregister(struct usb_driver *drv); 
這個函數用來注銷一個已在子系統中注冊的USB設備。 

void usb_driver_claim_interface(struct usb_driver *driver, struct usb_interface *iface, void *drv_context); 
在探查過程中USB設備驅動程序在設備上聲明多于一個接口時就使用這個函數。driver指向一個完全初始化的usb_driver結構。iface指向usb_config_descriptor中的usb_interface結構,usb_config_descriptor在usb_device(在probe函數中給出)結構中可訪問。drv_context指向設備驅動程序的正文結構。 

int usb_interface_claimed(struct usb_interface *iface); 
如果另一設備驅動已聲明特定的接口則這個函數是用來檢查的。如果接口沒有被其它的驅動程序聲明就返回0。 

void usb_driver_release_interface(struct usb_driver *driver, struct usb_interface *iface); 
如果一個驅動程序要釋放以前聲明的接口就要調用這個函數。在disconnect函數中你不一定非要釋放在probe函數中聲明的接口。 

const struct usb_device_id *usb_match_id( struct usb_device *dev, struct usb_interface *interface, const struct usb_device_id *id); 

配置USB設備 
API包括一系列的函數用來選擇或查詢描述符,配置和選擇設備設定。所有的標準操作都通過控制設備傳輸來完成。 

描述符數據結構 
Linux USB子系統通過在子系統特定結構中擴展或嵌入標準USB描述符來描述層次結構。這個結構幫助存儲指向選擇配置和接口的指針。 
這些結構的原理直到它們對于后來的API有必要調用時才詳細解釋。 

struct usb_device{ 
... 
struct usb_config_descriptor *actconfig;/* the active configuration */ 
... 
struct usb_device_descriptor descriptor;/* Descriptor */ 
struct usb_config_descriptor *config; /* All of the configs */ 
} 

usb_device結構是所有USB特定描述符的根。有時為了配置設備或適當地啟動傳輸請求有必要在驅動程序中解析描述符。 

.可以像這樣來訪問所有可用的配置描述符: 
for (i = 0; i < dev->descriptor.bNumConfigurations; i++) { 
struct usb_config_descriptor *cfg = &dev->config[i]; 
... 
} 

.像這樣訪問所有可用的特定配置的接口描述符: 
for (j = 0; j < cfg->bNumInterfaces; j++) { 
struct usb_interface *ifp = &cfg->interface[j]; 
... 
} 
用dev?actconfig指針開始解析激活的配置。 

.訪問所有特定接口的可選的設置: 
for (k = 0; k < ifp->num_altsetting; k++) { 
struct usb_interface_descriptor *as = &ifp->altsetting[k]; 
... 
} 
可選的設定可以通過*as = &ifp->altsetting[ifp->act_altsetting]來訪問 

.訪問所有特定可選的設定端點描述符: 
for(l = 0; l < as->bNumEndpoints; l++) { 
struct usb_endpoint_descriptor *ep=&as->endpoint[k]; 
... 
} 


標準設備請求 
有一組函數用來查詢或設置特殊配置或改變設置。這些常用的函數啟動標準設備請求(控制指定設備的傳輸): 

.int usb_set_configuration(struct usb_device *dev, int configuration); 
用這個函數激活特定配置。 
0<=configurationdescriptor.bNumConfigurations。 
設備與總線相連后0是缺省值。 

.int usb_set_interface(struct usb_device *dev, int interface, int alternate); 
這個函數激活指定接口的設置。 
0<=interface 0<=alternate 
.int usb_get_device_descriptor(struct usb_device *dev); 
這個函數從指定的設備中重讀全部的描述符樹。當一個設備連接到總線上或一個USB描述符發生改變就自動調用這個函數。 

.int usb_get_descriptor(struct usb_device *dev,unsigned char desctype,unsigned char descindex, void *buf, int size); 
單個的USB描述符可以從設備中作為原始數據讀入。這個函數可被用來解析擴展的或指定的描述符。 

.int usb_get_string(struct usb_device *dev,unsigned short langid,unsigned char index, void *buf, int size); 
如果一設備,配置或接口描述符涉及到一串索引值,則這個函數可被用來遍歷描述符。依照規范USB strings被作為Unicode來編碼。如果成功就返回0,否則返回錯誤代碼。 

.int usb_string(struct usb_device *dev, int index, char *buf, size_t size); 
這個函數通過把Unicode串轉換成ASCII串來簡化usb_get_string。 


.int usb_get_status(struct usb_device *dev, int type, int target, void *data); 

.int usb_clear_halt(struct usb_device *dev, int pipe); 
如果一個端點被停止,就調用這個函數來清除STALL。STALL表明一個函數不能發送或接收數據,或者是不支持控制管道請求。endpoint定義了一個管道。 

.int usb_get_protocol(struct usb_device *dev, int ifnum); 

.int usb_set_protocol(struct usb_device *dev, int protocol, int ifnum); 

.int usb_get_report(struct usb_device *dev, unsigned char type, unsigned char id, int ifnum, void *buf, int size); 

.int usb_set_idle(struct usb_device *dev, int ifnum, int duration, int report_id); 

USB傳輸 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产凹凸成av人导航| 国产精品一区二区在线观看不卡| 成人动漫精品一区二区| 3atv在线一区二区三区| 另类成人小视频在线| 欧美蜜桃一区二区三区| 麻豆精品新av中文字幕| 欧美一二三区精品| 免费在线观看日韩欧美| 亚洲三级久久久| 成人黄页毛片网站| 国产女同性恋一区二区| 粉嫩久久99精品久久久久久夜| 久久人人97超碰com| 国产精品一区一区| 中文字幕在线播放不卡一区| 9色porny自拍视频一区二区| 亚洲欧美日韩一区| 欧美色图激情小说| 美女免费视频一区二区| 2023国产精华国产精品| 成人在线视频首页| 亚洲狼人国产精品| 51精品久久久久久久蜜臀| 免费观看30秒视频久久| 日韩一级精品视频在线观看| 久久99热这里只有精品| 中文字幕 久热精品 视频在线| 成人app在线观看| 亚洲乱码国产乱码精品精小说| 91国偷自产一区二区三区观看 | 欧美色精品在线视频| 亚洲免费av高清| 91麻豆视频网站| 青青草97国产精品免费观看无弹窗版| 日韩一卡二卡三卡| 国产一区二区三区在线观看免费 | 亚洲不卡一区二区三区| 欧美一三区三区四区免费在线看| 青青国产91久久久久久| 中文字幕第一区二区| 精品视频全国免费看| 久久精品国产精品亚洲精品| 国产精品久久久久久久岛一牛影视 | 久久久久国产成人精品亚洲午夜 | 欧美日韩国产综合草草| 国内精品久久久久影院一蜜桃| 国产精品久久久久一区二区三区| 欧美主播一区二区三区| 国产成人在线色| 午夜不卡在线视频| 中文字幕精品一区二区精品绿巨人 | 欧美三级电影在线看| 不卡的电视剧免费网站有什么| 综合分类小说区另类春色亚洲小说欧美| 欧美一级生活片| 在线视频综合导航| 精品亚洲成a人| 亚洲成a人片在线观看中文| 国产午夜亚洲精品不卡| 制服丝袜一区二区三区| 在线观看日韩精品| 国产精品影视网| 亚洲精品亚洲人成人网在线播放| 欧美一区二区私人影院日本| 99久久久精品免费观看国产蜜| 日本aⅴ亚洲精品中文乱码| 亚洲女性喷水在线观看一区| 久久久精品蜜桃| 欧美一区二区三区小说| 91在线你懂得| 国产91露脸合集magnet | 国产精品美女久久久久久久久久久 | 91在线国产福利| 精品在线观看免费| 奇米色777欧美一区二区| 亚洲三级视频在线观看| 国产日韩欧美精品在线| 欧美电影免费观看高清完整版在线观看 | 亚洲天天做日日做天天谢日日欢| 欧美日韩精品免费观看视频| 99国产精品久久久久久久久久| 国产黄色精品网站| 加勒比av一区二区| 久久精品国产精品亚洲综合| 日韩va亚洲va欧美va久久| 一区二区三区免费| 成人欧美一区二区三区在线播放| 国产日韩综合av| 欧美精品v国产精品v日韩精品| 欧洲精品在线观看| 欧美系列日韩一区| 欧美日韩你懂得| 欧美日韩精品综合在线| 欧美福利电影网| 91精品国产aⅴ一区二区| 日韩欧美在线1卡| 国产不卡视频一区二区三区| av不卡在线播放| 91麻豆国产福利在线观看| 国产91丝袜在线播放| 99在线精品一区二区三区| aaa欧美日韩| 成人免费电影视频| 欧美亚洲国产bt| 91精品蜜臀在线一区尤物| 久久综合五月天婷婷伊人| 欧美国产乱子伦 | zzijzzij亚洲日本少妇熟睡| 成人不卡免费av| 91色在线porny| 成人白浆超碰人人人人| 高清av一区二区| 九九九精品视频| 波多野结衣一区二区三区| 一本色道久久综合亚洲精品按摩| 宅男噜噜噜66一区二区66| 91精品麻豆日日躁夜夜躁| 欧美大片在线观看一区二区| 国产午夜精品久久久久久久| 国产精品久久久久7777按摩| 亚洲色图都市小说| 亚洲超丰满肉感bbw| 久草热8精品视频在线观看| 久久精品国产亚洲aⅴ| 精品一区二区三区免费观看 | 日韩国产欧美在线播放| 精品一区二区在线视频| 成人app在线| 欧美妇女性影城| 国产欧美一区二区三区在线老狼| 亚洲日本一区二区三区| 樱花草国产18久久久久| 日韩电影在线一区| 丁香六月综合激情| 欧美在线看片a免费观看| wwwwww.欧美系列| 一区二区在线观看免费视频播放| 奇米一区二区三区av| caoporm超碰国产精品| 欧美区在线观看| 国产精品乱人伦| 亚洲成av人影院| 99久久99久久精品国产片果冻| 色综合久久久久久久| 久久综合色播五月| 亚洲欧美日韩久久| 免费观看30秒视频久久| 色综合久久天天综合网| 欧美精品一区二区三区在线播放| 亚洲人成电影网站色mp4| 久久精品国产一区二区三区免费看| 色综合中文字幕国产 | 老汉av免费一区二区三区| www.亚洲激情.com| 精品国产99国产精品| 日韩影视精彩在线| 欧美日韩一区二区三区四区五区| 亚洲视频狠狠干| 成人app软件下载大全免费| 久久久久久99久久久精品网站| 捆绑变态av一区二区三区| 欧美一区二区视频在线观看 | 美女一区二区三区在线观看| 欧美日韩美少妇| 午夜精品福利一区二区三区蜜桃| 91福利视频网站| 亚洲一二三四在线| 欧美日韩一区高清| 亚洲第一福利视频在线| 欧美日韩在线精品一区二区三区激情| 亚洲日本va在线观看| 91久久国产最好的精华液| 一区二区三区精品久久久| 欧美色视频在线观看| 国产一区二区女| 久久婷婷色综合| 成人99免费视频| 亚洲精选视频免费看| 欧美亚洲愉拍一区二区| 日韩黄色一级片| 久久伊人中文字幕| 国产·精品毛片| 亚洲蜜臀av乱码久久精品蜜桃| 欧美视频日韩视频在线观看| 日韩av在线免费观看不卡| 精品乱码亚洲一区二区不卡| 黄页网站大全一区二区| 欧美激情综合网| 在线观看亚洲成人| 日本网站在线观看一区二区三区| 精品国产一区二区精华| 成人免费毛片嘿嘿连载视频| 亚洲欧美激情小说另类| 91精品蜜臀在线一区尤物| 国产激情一区二区三区四区| 亚洲欧美激情小说另类| 91精品久久久久久久91蜜桃 | 自拍视频在线观看一区二区| 欧美性极品少妇|