Linux 內核usb_bulk_msg 接口


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 函數不能被從中斷上下文調用, 或者持有一個自旋鎖. 還有, 這個函數不 能被任何其他函數取消, 因此當使用它時小心; 確認你的驅動的去連接知道足夠多來等待 調用結束, 在允許它自己被從內存中卸載之前.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM