服务器之家:专注于服务器技术及软件下载分享
分类导航

Linux|Centos|Ubuntu|系统进程|Fedora|注册表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服务器之家 - 服务器系统 - Linux - 详解linux usb host驱动编写入门

详解linux usb host驱动编写入门

2022-03-07 16:50feixiaoxing Linux

本篇文章主要介绍了详解linux usb host驱动编写入门,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

usb协议是一个复杂的协议,目前涉及到的版本就有usb1.0, usb2.0, usb3.0。大家如果打开kernel usb host目录,就会发现下面包含了ohci,uhci,ehci,xhci,whci等多种形式的控制器驱动。那么,对于我们这些不是很了解usb的开发人员,如何了解usb的代码结构呢?

1、代码分布

drivers/usb目录下面,host目录包括了host驱动代码,core目录包含了主要的api接口代码,而其他目录则主要是device驱动代码。

2、device驱动怎么看

device驱动大多数和上层协议有关,不涉及到具体的寄存器读写。示例代码可以参考usb-skeleton.c

3、host驱动怎么看

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

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

b,再查看一下Kconfig,

?
1
2
3
4
5
6
7
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发现,s3c2410依赖于USB_OHCI_HCD_S3C2410 和 USB_OHCI_HCD,那USB_OHCI_HCD呢?

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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。继续回到Makefile,判断USB_OHCI_HCD会编译哪些文件

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

e,看到这里,我们明白要打开s3c2410的host功能,只需要编译ohci-hcd.c和ohci-s3c2410.c两个文件就好了

f,通过观察,发现ohci-hcd.c和ohci-s3c2410.c的代码都很少,这原因是什么?下面这段代码来自于ohci-hcd.c。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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文件,发现其实它其实已经包括了很多其他的ohci文件。那么寄存器又是怎么操作的呢?下面这段代码来自于ohci.h文件。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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,看到这里,你应该发现大部分底层操作其实也都是ohci帮助一起完成的。每个host driver其实就是注册了一下,告知了mem地址在哪。下面这段代码就是ohci-s3c2410.c中probe函数的代码。

?
1
2
3
4
5
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协议手册,更重要的学会用catc协议分析仪真正地去了解usb是如何发包和收包的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/feixiaoxing/article/details/79834031

延伸 · 阅读

精彩推荐
  • Linux手把手教您在 Linux 上使用 GPG 加解密文件

    手把手教您在 Linux 上使用 GPG 加解密文件

    在本教程中,我将告诉你如何用 GPG 加密和解密文件。这是一个简单的教程,你可以在你的 Linux 系统上尝试所有的练习。这将帮助你练习 GPG 命令,并在你...

    Linux中国6962021-12-15
  • LinuxLinux上设置用户通过SFTP访问目录的权限的方法

    Linux上设置用户通过SFTP访问目录的权限的方法

    这篇文章主要介绍了Linux上设置用户通过SFTP访问目录的权限的方法,SFTP可以理解为使用SSH协议进行FTP传输的协议,因而同时要对OpenSSH进行相关设置,需要的朋...

    OSChina10022019-06-19
  • Linux确保Linux系统安全的前提条件 漏洞防护

    确保Linux系统安全的前提条件 漏洞防护

    Linux 作为开放式的操作系统受到很多程序员的喜爱,很多高级程序员都喜欢编写Linux操作系统的相关软件。这使得Linux操作系统有着丰富的软件支持,还有无...

    Linux之家2642020-04-11
  • Linux详解Linux系统下PXE服务器的部署过程

    详解Linux系统下PXE服务器的部署过程

    这篇文章主要介绍了Linux系统下PXE服务器的部署过程,包括对PXE的API架构作了一个基本的简介,需要的朋友可以参考下...

    运维之道9812019-07-04
  • Linuxlinux中rmdir命令使用详解(删除空目录)

    linux中rmdir命令使用详解(删除空目录)

    今天学习一下linux中命令: rmdir命令。rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的 ...

    linux命令大全5372019-11-19
  • LinuxLinux lnmp下无法使用mail发邮件的两种解决方法

    Linux lnmp下无法使用mail发邮件的两种解决方法

    在配置了lnmp环境后,出现了mail函数不能发送邮件的问题,其实有两种方法,一是使用sendmail组件,而是使用postfix。下面为大家一一介绍下 ...

    Linux之家4042019-09-17
  • LinuxLinux常用的日志文件和常用命令

    Linux常用的日志文件和常用命令

    成功地管理任何系统的关键之一,是要知道系统中正在发生什么事。 Linux 中提供了异常日志,并且日志的细节是可配置的。Linux 日志都以明文形式存储,所...

    Linux教程网2632020-04-18
  • LinuxLinux中环境变量配置的步骤详解

    Linux中环境变量配置的步骤详解

    Linux中环境变量包括系统级和用户级,系统级的环境变量是每个登录到系统的用户都要读取的系统变量,而用户级的环境变量则是该用户使用系统时加载的...

    Myths7882022-02-10