Linux USB Gadget 裝置列舉

2022-08-31 22:15:31 字數 2540 閱讀 8285

linux usb gadget--裝置列舉

**自:

前面介紹了linux usb gadget的軟體結構與各軟體層的整合過程。經過各種註冊函式,gadget功能驅動層,usb裝置層與udc底層結合在了一起形成了乙個完整的usb裝置。而這個裝置已經準備好了接受主機的列舉。在介紹usb裝置列舉之前。先熟悉一下各層通訊所用的資料結構,在usb主機端編寫usb裝置驅動程式,最重要的結構就是urb了,我們只需要將各種urb提交給usb核心,核心就會自動給我們的資料傳送到指定的裝置。而對於裝置端也有這樣乙個類似的重要的資料結構。這個資料結構就是urt--usb_request。每乙個端點都有乙個urt鍊錶,上面掛著各種urt。在底層的udc的中斷處理程式中,針對不同的端點呼叫不同的處理函式,總之是處理端點上的urt鍊錶,處理完乙個urt就呼叫預先設定好的**函式。這就是裝置端資料處理的流程。下面分析一下usb_request結構:

struct usb_request else if (dev->req_pending) else if (dev->req_pending) else else if ((ep->bendpointaddress & usb_dir_in) != 0

&& (!(ep_csr&s3c2410_udc_ocsr1_pktrdy))

&& s3c2410_udc_write_fifo(ep, req)) else if ((ep_csr & s3c2410_udc_ocsr1_pktrdy)

&& fifo_count

&& s3c2410_udc_read_fifo(ep, req)) else else if ((ep->bendpointaddress & usb_dir_in) != 0

&& (!(ep_csr&s3c2410_udc_ocsr1_pktrdy))

&& s3c2410_udc_write_fifo(ep, req)) else if ((ep_csr & s3c2410_udc_ocsr1_pktrdy)

&& fifo_count

&& s3c2410_udc_read_fifo(ep, req)) {

req = null;

/* pio or dma irq handler advances the queue. */

if (likely (req != 0)) //對於控制傳輸這時req為0所以一下**不執行,這裡likely說明req不為0的情況居多,這是針對普通端點來說的

list_add_tail(&req->queue, &ep->queue);

local_irq_restore(flags);

dprintk(debug_verbose, "%s ok\n", __func__);

return 0;

函式返回到了composite_setup中,再把**貼上來:

if (value >= 0) {

req->length = value;

req->zero = value < w_length;

value = usb_ep_queue(gadget->ep0, req, gfp_atomic);

if (value < 0) {

dbg(cdev, "ep_queue --> %d\n", value);

req->status = 0;

composite_setup_complete(gadget->ep0, req);

if (value >= 0) {

req->length = value;

req->zero = value < w_length;

value = usb_ep_queue(gadget->ep0, req, gfp_atomic);

if (value < 0) {

dbg(cdev, "ep_queue --> %d\n", value);

req->status = 0;

composite_setup_complete(gadget->ep0, req);

現在執行到了if (value < 0) { 這裡對於上面的分析value是0所以下面的**不執行。composite_setup函式也就返回了。返回到了 s3c2410_udc_handle_ep0_idle。因為沒有出錯, s3c2410_udc_handle_ep0_idle函式也返回了。返回到了s3c2410_udc_handle_ep0中,這時dev->ep0state還是ep0_idle狀態。所以s3c2410_udc_handle_ep0也返回了。最後中斷返回完成了這個控制傳輸。至於控制傳輸的狀態階段是由硬體來完成的。當我們向fifo中寫入了全部的資料,就可以設定ep0_csr暫存器的data_end為1,硬體將自動完成狀態階段。還有一點,控制傳輸的urt**函式非常簡單,只列印一些除錯資訊,當最後一次呼叫s3c2410_udc_read_fifo時,s3c2410_udc_read_fifo會在函式裡面呼叫urt的**函式。

以上分析了usb裝置列舉過程中的第二步:get_descriptor階段的控制傳輸。其他的步驟大同小異,都是主機端發起,然後usb裝置通過中端來處理。依次經過文中最前面提到的六步,usb主機就識別咱們的裝置了 。

android layout weight設定解讀

參考文章 android layout weight的真實含義是 一旦view設定了該屬性 假設有效的情況下 那麼該 view的寬度等於原有寬度 android layout width 加上其在剩餘空間中的佔比!設螢幕寬度為l,在兩個view的寬度都為match parent的情況下,原有寬度為l...

Android RecyclerView設定空布局

1 自定義乙個emptyrecyclerview繼承recyclerview 2 採用adapterdataobserver觀察者模式來監聽資料的變化,如果有資料就隱藏空布局,反之,則顯示。view memptyview private adapterdataobserver emptyobserv...

Capacity Scheduler 佇列設定

先附乙個官網位址 capacity scheduler是yarn中預設的資源排程器。資源分配相關引數 1 capacity 佇列的資源容量 百分比 當系統非常繁忙時,應保證每個佇列的容量得到滿足,而如果每個佇列應用程式較少,可將剩餘資源共享給其他佇列。注意,所有佇列的容量之和應小於100。2 max...