W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵
有時(shí)一個(gè) USB 驅(qū)動必須經(jīng)過所有的步驟創(chuàng)建一個(gè) struct urb, 初始化它, 再等待 urb 完成函數(shù)運(yùn)行, 只是要發(fā)送或者接受一些簡單的 USB 數(shù)據(jù). 有 2 個(gè)函數(shù)用來提供一個(gè)簡單的接口.
usb_bulk_msg 創(chuàng)建一個(gè) USB 塊 urb 并且發(fā)送它到特定的設(shè)備, 接著在返回到調(diào)用者之前等待完成. 它定義為:
int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe,
void *data, int len, int *actual_length,
int timeout);
這個(gè)函數(shù)的參數(shù)是:
struct usb_device *usb_dev
發(fā)送塊消息去的 USB 設(shè)備的指針
unsigned int pipe
這個(gè)塊消息要發(fā)送到的 USB 設(shè)備的特定端點(diǎn). 這個(gè)值被創(chuàng)建, 使用一個(gè)對 usb_sndbulkpipe 或者usb_rcvbulkpipe 的調(diào)用.
void *data
如果這是一個(gè) OUT 端點(diǎn), 指向要發(fā)送到設(shè)備的數(shù)據(jù)的指針. 如果是一個(gè) IN 端點(diǎn), 這是一個(gè)在被從設(shè)備讀出后數(shù)據(jù)應(yīng)當(dāng)被放置的地方的指針.
int len
被 data 參數(shù)指向的緩沖的長度
int *actual_length
指向函數(shù)放置真實(shí)字節(jié)數(shù)的指針, 這些字節(jié)要么被發(fā)送到設(shè)備要么從設(shè)備中獲取, 根據(jù)端點(diǎn)方向.
int timeout
時(shí)間量, 以嘀噠計(jì), 應(yīng)當(dāng)在超時(shí)前等待的. 如果這個(gè)值是 0, 函數(shù)永遠(yuǎn)等待消息完成.
如果函數(shù)成功, 返回值是 0; 否則, 一個(gè)負(fù)錯誤值被返回. 這錯誤號匹配之前在"urb結(jié)構(gòu)"一節(jié)中描述的錯誤號. 如果成功, actual_length 參數(shù)包含被傳送或從消息中獲取的字節(jié)數(shù).
下面是一個(gè)使用這個(gè)函數(shù)調(diào)用的例子:
/* do a blocking bulk read to get data from the device */
retval = usb_bulk_msg(dev->udev,
usb_rcvbulkpipe(dev->udev, dev->bulk_in_endpointAddr),
dev->bulk_in_buffer,
min(dev->bulk_in_size, count),
&count, HZ*10);
/* if the read was successful, copy the data to user space */
if (!retval) {
if (copy_to_user(buffer, dev->bulk_in_buffer, count))
retval = -EFAULT;
else
retval = count;
}
這個(gè)例子展示了一個(gè)簡單的從一個(gè) IN 端點(diǎn)的塊讀. 如果讀取成功, 數(shù)據(jù)接著被拷貝到用戶空間. 這個(gè)典型地是在 USB 驅(qū)動的讀函數(shù)中完成.
usb_bulk_msg 函數(shù)不能被從中斷上下文調(diào)用, 或者持有一個(gè)自旋鎖. 還有, 這個(gè)函數(shù)不能被任何其他函數(shù)取消, 因此當(dāng)使用它時(shí)小心; 確認(rèn)你的驅(qū)動的去連接知道足夠多來等待調(diào)用結(jié)束, 在允許它自己被從內(nèi)存中卸載之前.
usb_control_msg 函數(shù)就像 usb_bulk_msg 函數(shù), 除了它允許一個(gè)驅(qū)動發(fā)送和結(jié)束 USB 控制信息:
int usb_control_msg(struct usb_device dev, unsigned int pipe, u8 request, u8 requesttype, u16 value, u16 index, void data, __u16 size, int timeout);
這個(gè)函數(shù)的參數(shù)幾乎和 usb_bulk_msg 的相同, 有幾個(gè)這樣的不同:
struct usb_device *dev
指向發(fā)送控制消息去的 USB 設(shè)備的指針.
unsigned int pipe
控制消息要發(fā)送到的 USB 設(shè)備的特定端點(diǎn). 這個(gè)值在 usb_sndctrlpipe 或者 usb_rcvctrlpipe 函數(shù)中被創(chuàng)建.
__u8 request
這個(gè)控制消息的 USB 請求值.
__u8 requesttype
這個(gè)控制消息的 USB 請求類型.
__u16 value
這個(gè)控制消息的 USB 消息值.
__u16 index
這個(gè)控制消息的 USB 消息索引值.
void *data
如果是一個(gè) OUT 端點(diǎn), 是一個(gè)指向要發(fā)送到設(shè)備的數(shù)據(jù)的指針. 如果是一個(gè) IN 端點(diǎn), 是一個(gè)在被從設(shè)備讀取后數(shù)據(jù)被放置的地方的指針.
__u16 size
被 data 參數(shù)指向的緩沖的大小.
int timeout
時(shí)間量, 以嘀噠計(jì), 應(yīng)當(dāng)在超時(shí)前等待的. 如果這個(gè)值是 0, 這個(gè)函數(shù)將等待消息結(jié)束.
如果函數(shù)是成功的, 它返回被傳送到或從這個(gè)設(shè)備的字節(jié)數(shù). 如果它不成功, 它返回一個(gè)負(fù)錯誤碼.
參數(shù) request, requesttype, value, 和 index 都直接映射到 USB 規(guī)范給一個(gè) USB 控制消息如何被定義. 對于更多的關(guān)于這些參數(shù)的有效值的信息和它們?nèi)绾伪皇褂? 見 USB 規(guī)范的第 9 章.
象 usb_bulk_msg 函數(shù), 函數(shù) usb_control_msg 不能被從中斷上下文或者持有自旋鎖中被調(diào)用. 還有, 這個(gè)函數(shù)不能被任何其他函數(shù)取消, 所以當(dāng)使用它時(shí)要小心; 確認(rèn)你的驅(qū)動的 disconnect 函數(shù)了解足夠多, 在允許它自己被從內(nèi)存卸載之前完成等待調(diào)用.
USB 核心中的幾個(gè)幫忙函數(shù)可用來從所有的 USB 設(shè)備中存取標(biāo)準(zhǔn)信息. 這些函數(shù)不能從中斷上下文或者持有自旋鎖時(shí)調(diào)用.
函數(shù) usb_get_descriptor 獲取指定的 USB 描述符從特定的設(shè)備. 這個(gè)函數(shù)被定義為:
int usb_get_descriptor(struct usb_device *dev, unsigned char type, unsigned char index, void *buf, int size);
這個(gè)函數(shù)可被一個(gè) USB 驅(qū)動用來從 struct usb_device 結(jié)構(gòu)中, 獲取任何還沒有在 struct usb_device 和 struct usb_interface 結(jié)構(gòu)中出現(xiàn)的設(shè)備描述符, 例如聲音描述符或者其他類的特定消息. 這個(gè)函數(shù)的參數(shù)是:
struct usb_device *usb_dev
指向應(yīng)當(dāng)從中獲取描述符的 USB 設(shè)備的指針
unsigned char type
描述符類型. 這個(gè)類型在 USB 規(guī)范中描述, 并且是下列類型之一:
USB_DT_DEVICEUSB_DT_CONFIGUSB_DT_STRINGUSB_DT_INTERFACEUSB_DT_ENDPOINTUSB_DT_DEVICE_QUALIFIERUSB_DT_OTHER_SPEED_CONFIGUSB_DT_INTERFACE_POWERUSB_DT_OTGUSB_DT_DEBUGUSB_DT_INTERFACE_ASSOCIATIONUSB_DT_CS_DEVICEUSB_DT_CS_CONFIGUSB_DT_CS_STRINGUSB_DT_CS_INTERFACEUSB_DT_CS_ENDPOINT
unsigned char index
應(yīng)當(dāng)從設(shè)備獲取的描述符的數(shù)目.
void *buf
你拷貝描述符到的緩沖的指針.
int size
由 buf 變量指向的內(nèi)存的大小.
如果這個(gè)函數(shù)成功, 它返回從設(shè)備讀取的字節(jié)數(shù), 否則, 它返回由它所調(diào)用的底層函數(shù) usb_control_msg 所返回的一個(gè)負(fù)錯誤值.
usb_get_descripter 調(diào)用的一項(xiàng)最普遍的用法是從 USB 設(shè)備獲取一個(gè)字符串. 因?yàn)檫@個(gè)是非常普遍, 有一個(gè)幫忙函數(shù)稱為 usb_get_string:
int usb_get_string(struct usb_device *dev, unsigned short langid, unsigned char index, void *buf, int size);
如果成功, 這個(gè)函數(shù)返回設(shè)備收到的給這個(gè)字符串的字節(jié)數(shù). 否則, 它返回一個(gè)由這個(gè)函數(shù)調(diào)用的底層函數(shù) usb_control_msg 返回的負(fù)錯誤值.
如果這個(gè)函數(shù)成功, 它返回一個(gè)以 UTF-16LE 格式編碼的字符串(Unicode, 16位每字符, 小端字節(jié)序)在 buf 參數(shù)指向的緩沖中. 因?yàn)檫@個(gè)格式不是非常有用, 有另一個(gè)函數(shù), 稱為 usb_string, 它返回一個(gè)從一個(gè) USB 設(shè)備讀來的字符串, 并且已經(jīng)轉(zhuǎn)換為一個(gè) ISO 8859-1 格式字符串. 這個(gè)字符集是一個(gè) 8 位的 UICODE 的子集, 并且是最普遍的英文和其他西歐字符串格式. 因?yàn)檫@是 USB 設(shè)備的字符串的典型格式, 建議 usb_string 函數(shù)來替代 usb_get_string 函數(shù).
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: