日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux USB 驱动开发(二)—— USB 驱动几个重要数据结构

發(fā)布時間:2023/12/9 linux 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux USB 驱动开发(二)—— USB 驱动几个重要数据结构 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前面我們學(xué)習(xí)了USB 驅(qū)動的一個描述符,下面來學(xué)習(xí) USB 驅(qū)動的幾個重要數(shù)據(jù)結(jié)構(gòu)


一、struct usb_interface??接口函數(shù)

[cpp]?view plaincopy
  • struct?usb_interface??
  • {??
  • ???????????
  • ?????????struct?usb_host_interface?*altsetting;??
  • ??
  • ?????????struct?usb_host_interface?*cur_altsetting;????????
  • ?????????unsigned?num_altsetting;??????????
  • ??
  • ?????????int?minor;????????????????????????
  • ?????????enum?usb_interface_condition?condition;???????????
  • ?????????unsigned?is_active:1;?????????????
  • ?????????unsigned?needs_remote_wakeup:1;???
  • ??
  • ?????????struct?device?dev;????????????????
  • ?????????struct?device?*usb_dev;???????????
  • ?????????int?pm_usage_cnt;?????????????????
  • };??

  • ? ? struct usb_interface中的struct usb_host_interface *cur_altsetting成員,表示當(dāng)前正在使用的設(shè)置

    1、struct usb_host_interface?

    [cpp]?view plaincopy
  • struct?usb_host_interface???
  • {??
  • ?????????struct?usb_interface_descriptor?desc;//usb描述符,主要有四種usb描述符,設(shè)備描述符,配置描述符,接口描述符和端點描述符,協(xié)議里規(guī)定一個usb設(shè)備是必須支持這四大描述符的。??
  • ?????????????????????????????????//usb描述符放在usb設(shè)備的eeprom里邊??
  • ?????????/*?array?of?desc.bNumEndpoint?endpoints?associated?with?this?
  • ??????????*?interface?setting.?these?will?be?in?no?particular?order.?
  • ??????????*/??
  • ?????????struct?usb_host_endpoint?*endpoint;//這個設(shè)置所使用的端點??
  • ??
  • ?????????char?*string;???????????/*?iInterface?string,?if?present?*/??
  • ?????????unsigned?char?*extra;???/*?Extra?descriptors?*/關(guān)于額外描述符??
  • ?????????int?extralen;??
  • };??
  • ? ? ? ?具體到接口描述符,它當(dāng)然就是描述接口本身的信息的。一個接口可以有多個設(shè)置,使用不同的設(shè)置,描述接口的信息會有些不同,所以接口描述符并沒有放在struct usb_interface結(jié)構(gòu)里,而是放在表示接口設(shè)置的struct usb_host_interface結(jié)構(gòu)里。


    二、struct usb_host_endpoint ?端點函數(shù)

    [cpp]?view plaincopy
  • struct?usb_host_endpoint???
  • {??
  • ?????????struct?usb_endpoint_descriptor?desc;??
  • ?????????struct?list_head????????????????urb_list;//端點要處理的urb隊列.urb是usb通信的主角,設(shè)備中的每個端點都可以處理一個urb隊列.要想和你的usb通信,就得創(chuàng)建一個urb,并且為它賦好值,??
  • ???????????????????????????????????//交給咱們的usb?core,它會找到合適的host?controller,從而進行具體的數(shù)據(jù)傳輸??
  • ?????????void????????????????????????????*hcpriv;//這是提供給HCD(host?controller?driver)用的??
  • ?????????struct?ep_device????????????????*ep_dev;????????/*?For?sysfs?info?*/??
  • ??
  • ?????????unsigned?char?*extra;???/*?Extra?descriptors?*/??
  • ?????????int?extralen;??
  • };??

  • 三、struct usb_device 設(shè)備函數(shù)

    [cpp]?view plaincopy
  • struct?usb_device?{??
  • ????int?devnum;?????????//devnum只是usb設(shè)備在一條usb總線上的編號.一條usb_bus_type類型的總線上最多可以連上128個設(shè)備??
  • ????char?devpath?[16];???/*?Use?in?messages:?/port/port/...*/??//對于root?hub.會將dev->devpath[0]=’0’??
  • ????enum?usb_device_state???state;??//設(shè)備的狀態(tài)Attached,Powered,Default,Address,Configured,Suspended;??
  • ???????????????????????????????//Attached表示設(shè)備已經(jīng)連接到usb接口上了,是hub檢測到設(shè)備時的初始狀態(tài)。那么這里所謂的USB_STATE_NOTATTACHED就是表示設(shè)備并沒有Attached。??
  • ???????????????????????????????//Address狀態(tài)表示主機分配了一個唯一的地址給設(shè)備,此時設(shè)備可以使用缺省管道響應(yīng)主機的請求??
  • ???????????????????????????????//Configured狀態(tài)表示設(shè)備已經(jīng)被主機配置過了,也就是協(xié)議里說的處理了一個帶有非0值的SetConfiguration()請求,此時主機可以使用設(shè)備提供的所有功能??
  • ???????????????????????????????//Suspended掛起狀態(tài),為了省電,設(shè)備在指定的時間內(nèi),3ms吧,如果沒有發(fā)生總線傳輸,就要進入掛起狀態(tài)。此時,usb設(shè)備要自己維護包括地址、配置在內(nèi)的信息???????????????
  • ??
  • ????enum?usb_device_speed???speed;??/*?high/full/low?(or?error)?*/??
  • ??????
  • ????struct?usb_tt???*tt;????????????//如果一個高速設(shè)備里有這么一個TT,那么就可以連接低速/全速設(shè)備,如不然,那低速/全速設(shè)備沒法用,只能連接到OHCI/UHCI那邊出來的hub口里。??
  • ????int?????????????ttport;?????????//如果一個高速設(shè)備里有這么一個TT,那么就可以連接低速/全速設(shè)備,如不然,那低速/全速設(shè)備沒法用,只能連接到OHCI/UHCI那邊出來的hub口里。??
  • ??????
  • ????unsigned?int?toggle[2];?????????/*?one?bit?for?each?endpoint?????//他實際上就是一個位圖.IN方向的是toggle[0].OUT方向的是toggle[1].其實,這個數(shù)組中的每一位表示ep的toggle值?
  • ?????????????????????????????????????????????*?([0]?=?IN,?[1]?=?OUT)?*/它里面的每一位表示的就是每個端點當(dāng)前發(fā)送或接收的數(shù)據(jù)包是DATA0還是DATA1??
  • ??????
  • ????struct?usb_device?*parent;??????/*?our?hub,?unless?we're?the?root?*/??
  • ??????????????????????????????//USB設(shè)備是從Root?Hub開始,一個一個往外面連的,比如Root?Hub有4個口,每個口連一個USB設(shè)備,比如其中有一個是Hub,那么這個Hub有可以繼續(xù)有多個口,于是一級一級的往下連,??
  • ???????????????????????????????//最終連成了一棵樹。??
  • ????struct?usb_bus?*bus;????????????/*?Bus?we're?part?of?*/設(shè)備所在的總線??
  • ????struct?usb_host_endpoint?ep0;???//端點0的特殊地位決定了她必將受到特殊的待遇,在struct?usb_device對象產(chǎn)生的時候它就要初始化??
  • ??????
  • ????struct?device?dev;??????????????/*?Generic?device?interface?*/嵌入到struct?usb_device結(jié)構(gòu)里的struct?device結(jié)構(gòu)??
  • ??????
  • ????struct?usb_device_descriptor?descriptor;/*?Descriptor?*/設(shè)備描述符,此結(jié)構(gòu)體的bMaxPacketSize0?filed保存了端點0的maximum?packet?size??
  • ????struct?usb_host_config?*config;?//設(shè)備擁有的所有配置??
  • ??????
  • ????struct?usb_host_config?*actconfig;//設(shè)備正在使用的配置??
  • ????struct?usb_host_endpoint?*ep_in[16];//ep_in[16],359行,ep_out[16],除了端點0,一個設(shè)備即使在高速模式下也最多只能再有15個IN端點和15個OUT端點,端點0太特殊了,??
  • ????struct?usb_host_endpoint?*ep_out[16];//對應(yīng)的管道是Message管道,又能進又能出特能屈能伸的那種,所以這里的ep_in和ep_out數(shù)組都有16個值??
  • ??????
  • ????char?**rawdescriptors;??????????/*?Raw?descriptors?for?each?config?*/??
  • ??????
  • ????unsigned?short?bus_mA;??????????/*?Current?available?from?the?bus?*/這個值是在host?controller的驅(qū)動程序中設(shè)置的,通常來講,計算機的usb端口可以提供500mA的電流??
  • ????u8?portnum;?????????????????????//不管是root?hub還是一般的hub,你的USB設(shè)備總歸要插在一個hub的端口上才能用,portnum就是那個端口號。??
  • ????u8?level;???????????????????????//層次,也可以說是級別,表征usb設(shè)備樹的級連關(guān)系。Root?Hub的level當(dāng)然就是0,其下面一層就是level?1,再下面一層就是level?2,依此類推??
  • ??????
  • ????unsigned?discon_suspended:1;????/*?Disconnected?while?suspended?*/??
  • ????unsigned?have_langid:1;?????????/*?whether?string_langid?is?valid?*/??
  • ????int?string_langid;??????????????/*?language?ID?for?strings?*/??
  • ??????
  • ????/*?static?strings?from?the?device?*/??
  • ????char?*product;??????????????????/*?iProduct?string,?if?present?*/??
  • ????char?*manufacturer;?????????????/*?iManufacturer?string,?if?present?*/??
  • ????char?*serial;???????????????????/*?iSerialNumber?string,?if?present?*/??
  • ????????????????????????????????????//分別用來保存產(chǎn)品、廠商和序列號對應(yīng)的字符串描述符信息??
  • ????struct?list_head?filelist;??
  • #ifdef?CONFIG_USB_DEVICE_CLASS??
  • ????struct?device?*usb_classdev;??
  • #endif??
  • #ifdef?CONFIG_USB_DEVICEFS??
  • ????struct?dentry?*usbfs_dentry;????/*?usbfs?dentry?entry?for?the?device?*/??
  • #endif??
  • ????/*?
  • ????*?Child?devices?-?these?can?be?either?new?devices?
  • ????*?(if?this?is?a?hub?device),?or?different?instances?
  • ????*?of?this?same?device.?
  • ????*?
  • ????*?Each?instance?needs?its?own?set?of?data?structures.?
  • ????*/??
  • ??????
  • ????int?maxchild;???????????????????/*?Number?of?ports?if?hub?*/??
  • ????struct?usb_device?*children[USB_MAXCHILDREN];??
  • ??????
  • ????int?pm_usage_cnt;???????????????/*?usage?counter?for?autosuspend?*/??
  • ????u32?quirks;?????????????????????//quirk就是用來判斷這些有毛病的產(chǎn)品啥毛病的??
  • ??????
  • #ifdef?CONFIG_PM??
  • ????struct?delayed_work?autosuspend;?/*?for?delayed?autosuspends?*/??
  • ????struct?mutex?pm_mutex;??????????/*?protects?PM?operations?*/??
  • ??????
  • ????unsigned?long?last_busy;????????/*?time?of?last?use?*/??
  • ????int?autosuspend_delay;??????????/*?in?jiffies?*/??
  • ??????
  • ????unsigned?auto_pm:1;?????????????/*?autosuspend/resume?in?progress?*/??
  • ????unsigned?do_remote_wakeup:1;????/*?remote?wakeup?should?be?enabled?*/??
  • ????unsigned?autosuspend_disabled:1;?/*?autosuspend?and?autoresume?*/??
  • ????unsigned?autoresume_disabled:1;??/*??disabled?by?the?user?*/??
  • #endif??
  • };??

  • 四、struct usb_host_config 配置函數(shù)

    [cpp]?view plaincopy
  • struct?usb_host_config?{??
  • ????struct?usb_config_descriptor????desc;??
  • ??????
  • ????char?*string;?????????????
  • ??????????????
  • ????struct?usb_interface?*interface[USB_MAXINTERFACES];????????????//配置所包含的接口,這個數(shù)組的順序未必是按照配置里接口號的順序??
  • ??????
  • ?????????????
  • ????struct?usb_interface_cache?*intf_cache[USB_MAXINTERFACES];????????//usb接口的緩存??
  • ??????
  • ????unsigned?char?*extra;?????
  • ????int?extralen;??
  • }; ?
  • 總結(jié)

    以上是生活随笔為你收集整理的Linux USB 驱动开发(二)—— USB 驱动几个重要数据结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。