最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解linux usb host驅動編寫入門

 更新時間:2018年04月13日 09:47:00   作者:https://blog.csdn.net/feixiaoxing/article/details/79834031  
本篇文章主要介紹了詳解linux usb host驅動編寫入門,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

usb協(xié)議是一個復雜的協(xié)議,目前涉及到的版本就有usb1.0, usb2.0, usb3.0。大家如果打開kernel usb host目錄,就會發(fā)現(xiàn)下面包含了ohci,uhci,ehci,xhci,whci等多種形式的控制器驅動。那么,對于我們這些不是很了解usb的開發(fā)人員,如何了解usb的代碼結構呢?

1、代碼分布

drivers/usb目錄下面,host目錄包括了host驅動代碼,core目錄包含了主要的api接口代碼,而其他目錄則主要是device驅動代碼。

2、device驅動怎么看

device驅動大多數(shù)和上層協(xié)議有關,不涉及到具體的寄存器讀寫。示例代碼可以參考usb-skeleton.c

3、host驅動怎么看

a,不妨以s3c2410的host作為范例進行分析,首先找到Makefile,

obj-$(CONFIG_USB_OHCI_HCD_S3C2410) += ohci-s3c2410.o 

b,再查看一下Kconfig,

config USB_OHCI_HCD_S3C2410 
    tristate "OHCI support for Samsung S3C24xx/S3C64xx SoC series" 
    depends on USB_OHCI_HCD && (ARCH_S3C24XX || ARCH_S3C64XX) 
    default y 
    ---help--- 
     Enables support for the on-chip OHCI controller on 
     S3C24xx/S3C64xx chips. 

c,通過Makefile和Kconfig發(fā)現(xiàn),s3c2410依賴于USB_OHCI_HCD_S3C2410 和 USB_OHCI_HCD,那USB_OHCI_HCD呢?

config USB_OHCI_HCD 
  tristate "OHCI HCD (USB 1.1) support" 
  depends on HAS_DMA && HAS_IOMEM 
  ---help--- 
   The Open Host Controller Interface (OHCI) is a standard for accessing 
   USB 1.1 host controller hardware. It does more in hardware than Intel's 
   UHCI specification. If your USB host controller follows the OHCI spec, 
   say Y. On most non-x86 systems, and on x86 hardware that's not using a 
   USB controller from Intel or VIA, this is appropriate. If your host 
   controller doesn't use PCI, this is probably appropriate. For a PCI 
   based system where you're not sure, the "lspci -v" entry will list the 
   right "prog-if" for your USB controller(s): EHCI, OHCI, or UHCI. 
 
   To compile this driver as a module, choose M here: the 
   module will be called ohci-hcd. 

d,USB_OHCI_HCD只依賴于DMA和IOMEM。繼續(xù)回到Makefile,判斷USB_OHCI_HCD會編譯哪些文件

obj-$(CONFIG_USB_OHCI_HCD) += ohci-hcd.o 

e,看到這里,我們明白要打開s3c2410的host功能,只需要編譯ohci-hcd.c和ohci-s3c2410.c兩個文件就好了

f,通過觀察,發(fā)現(xiàn)ohci-hcd.c和ohci-s3c2410.c的代碼都很少,這原因是什么?下面這段代碼來自于ohci-hcd.c。

static const char  hcd_name [] = "ohci_hcd"; 
 
#define STATECHANGE_DELAY  msecs_to_jiffies(300) 
#define IO_WATCHDOG_DELAY  msecs_to_jiffies(275) 
#define IO_WATCHDOG_OFF   0xffffff00 
 
#include "ohci.h" 
#include "pci-quirks.h" 
 
static void ohci_dump(struct ohci_hcd *ohci); 
static void ohci_stop(struct usb_hcd *hcd); 
static void io_watchdog_func(struct timer_list *t); 
 
#include "ohci-hub.c" 
#include "ohci-dbg.c" 
#include "ohci-mem.c" 
#include "ohci-q.c" 

g,通過觀察ohci-hcd.c文件,發(fā)現(xiàn)其實它其實已經包括了很多其他的ohci文件。那么寄存器又是怎么操作的呢?下面這段代碼來自于ohci.h文件。

static inline unsigned int _ohci_readl (const struct ohci_hcd *ohci, 
          __hc32 __iomem * regs) 
{ 
#ifdef CONFIG_USB_OHCI_BIG_ENDIAN_MMIO 
  return big_endian_mmio(ohci) ? 
    readl_be (regs) : 
    readl (regs); 
#else 
  return readl (regs); 
#endif 
} 
 
static inline void _ohci_writel (const struct ohci_hcd *ohci, 
         const unsigned int val, __hc32 __iomem *regs) 
{ 
#ifdef CONFIG_USB_OHCI_BIG_ENDIAN_MMIO 
  big_endian_mmio(ohci) ? 
    writel_be (val, regs) : 
    writel (val, regs); 
#else 
    writel (val, regs); 
#endif 
} 
 
#define ohci_readl(o,r)   _ohci_readl(o,r) 
#define ohci_writel(o,v,r) _ohci_writel(o,v,r) 

h,看到這里,你應該發(fā)現(xiàn)大部分底層操作其實也都是ohci幫助一起完成的。每個host driver其實就是注冊了一下,告知了mem地址在哪。下面這段代碼就是ohci-s3c2410.c中probe函數(shù)的代碼。

hcd->regs = devm_ioremap_resource(&dev->dev, &dev->resource[0]); 
if (IS_ERR(hcd->regs)) { 
  retval = PTR_ERR(hcd->regs); 
  goto err_put; 
} 

4、usb驅動怎么學

如果從代碼結構來說,上面這段分析算是入門了。但是,如果要深入了解usb host&device驅動,那么除了這些代碼邏輯,那么還要熟讀usb協(xié)議手冊,更重要的學會用catc協(xié)議分析儀真正地去了解usb是如何發(fā)包和收包的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 解決Linux中Systemd服務環(huán)境變量缺失的問題

    解決Linux中Systemd服務環(huán)境變量缺失的問題

    在Linux系統(tǒng)運維中,我們可能會遇到在使用systemd管理的服務時無法獲取系統(tǒng)環(huán)境變量,尤其是PATH變量,這確實是一個常見的挑戰(zhàn),因為systemd啟動的服務通常不會加載用戶的環(huán)境變量,下面,我們將一起探討解決這一問題的幾種方法,需要的朋友可以參考下
    2024-01-01
  • centOS7.4 安裝 mysql 5.7.26的教程詳解

    centOS7.4 安裝 mysql 5.7.26的教程詳解

    CentOS中默認安裝有MariaDB,這個是MySQL的分支,但為了需要,還是要在系統(tǒng)中安裝MySQL,而且安裝完成之后可以直接覆蓋掉MariaDB。這篇文章主要介紹了centOS7.4 安裝 mysql 5.7.26,需要的朋友可以參考下
    2019-06-06
  • linux vim撤銷回退操作方式

    linux vim撤銷回退操作方式

    在Linux的vim編輯器中,撤銷(Undo)和回退(Redo)操作可以通過不同的方式實現(xiàn),撤銷單個更改或連續(xù)更改,可以使用u鍵或:undo命令,連續(xù)撤銷可以使用U命令,而.命令可以重復上一個編輯動作
    2025-02-02
  • Linux下Squid配置詳解 Squid代理服務器配置

    Linux下Squid配置詳解 Squid代理服務器配置

    本文介紹Linux下非常著名、常用的Squid代理服務器的使用,并著重講述如何使用其提供的訪問控制策略,來保證代理服務器的合法使用。
    2009-10-10
  • Linux持續(xù)集成自動化安裝Maven的方法

    Linux持續(xù)集成自動化安裝Maven的方法

    今天小編就為大家分享一篇關于Linux持續(xù)集成自動化安裝Maven的方法,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Logrotate實現(xiàn)Catalina.out日志每倆小時切割示例

    Logrotate實現(xiàn)Catalina.out日志每倆小時切割示例

    Logrotate是一個日志文件管理工具,它是Linux默認自帶的一個日志切割工具。本篇文章主要介紹了Logrotate實現(xiàn)Catalina.out日志每倆小時切割示例,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助
    2019-02-02
  • 將寶塔面板linux版裝在/www以外的目錄的方法

    將寶塔面板linux版裝在/www以外的目錄的方法

    很多云VPS系統(tǒng)盤,也就是根目錄(系統(tǒng)盤)都是10個G,寶塔安裝完整環(huán)境基本5個G沒有了,用了不到幾個月,隨著日志文件等亂七八糟的東西增加,面板就提示根目錄低于1個G,隨后mysql就莫名其妙掛掉,這里就為大家分享一下將面板安裝到別的目錄的方法
    2018-05-05
  • LINUX重啟MYSQL的命令詳解

    LINUX重啟MYSQL的命令詳解

    下面小編就為大家?guī)硪黄狶INUX重啟MYSQL的命令詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • Linux中FTP服務器搭建與安全配置方式

    Linux中FTP服務器搭建與安全配置方式

    這篇文章主要介紹了Linux中FTP服務器搭建與安全配置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Linux中screen命令及使用方法

    Linux中screen命令及使用方法

    Screen是一款由GNU計劃開發(fā)的用于命令行終端切換的自由軟件。這篇文章主要介紹了Linux中的screen命令及使用方法,需要的朋友可以參考下
    2020-02-02

最新評論

资源县| 轮台县| 聂拉木县| 苗栗市| 乌审旗| 南部县| 灌云县| 紫金县| 大化| 金华市| 永吉县| 图们市| 扬中市| 乌拉特中旗| 闽清县| 余干县| 浮山县| 新疆| 民县| 泸西县| 高雄市| 大厂| 城口县| 汪清县| 南投市| 苍山县| 儋州市| 道孚县| 鄂伦春自治旗| 乐平市| 丰台区| 酉阳| 白朗县| 石泉县| 三明市| 永靖县| 革吉县| 新干县| 故城县| 嘉义县| 郎溪县|