usb_bulk_msg 創建一個 USB 塊 urb 並且發送它到特定的設備, 接着在返回到調用者之 前等待完成. 它定義為:
int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, void *data, int len, int *actual_length,
int timeout);
這個函數的參數是:
struct usb_device *usb_dev 發送塊消息去的 USB 設備的指針
unsigned int pipe
這個塊消息要發送到的 USB 設備的特定端點. 這個值被創建, 使用一個對 usb_sndbulkpipe 或者 usb_rcvbulkpipe 的調用.
void *data
如果這是一個 OUT 端點, 指向要發送到設備的數據的指針. 如果是一個 IN 端點, 這是一個在被從設備讀出后數據應當被放置的地方的指針.
int len
被 data 參數指向的緩沖的長度 int *actual_length
指向函數放置真實字節數的指針, 這些字節要么被發送到設備要么從設備中獲取, 根據端點方向.
int timeout
時間量, 以嘀噠計, 應當在超時前等待的. 如果這個值是 0, 函數永遠等待消息完 成.
如果函數成功, 返回值是 0; 否則, 一個負錯誤值被返回. 這錯誤號匹配之前在"urb 結構 "一節中描述的錯誤號. 如果成功, actual_length 參數包含被傳送或從消息中獲取的字 節數.
下面是一個使用這個函數調用的例子:
/* 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;
這個例子展示了一個簡單的從一個 IN 端點的塊讀. 如果讀取成功, 數據接着被拷貝到用 戶空間. 這個典型地是在 USB 驅動的讀函數中完成.
usb_bulk_msg 函數不能被從中斷上下文調用, 或者持有一個自旋鎖. 還有, 這個函數不 能被任何其他函數取消, 因此當使用它時小心; 確認你的驅動的去連接知道足夠多來等待 調用結束, 在允許它自己被從內存中卸載之前.