0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心
发布

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux USB设备驱动模型查看

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:嵌入式Linux系统开 2023-07-17 17:38 次阅读

1. BUS/DEV/DRV 模型

图片

"USB接口"是逻辑上的 USB 设备,编写的 usb_driver 驱动程序,支持的是"USB 接口":

图片

  • USB控制器或 Hub 识别出 USB 设备后,会创建、注册 usb_device
  • usb_device 被"driversusbcoregeneric.c" 驱动认领后,会选择、设置某个配置
  • 这个配置下面的接口,都会分配、设置、注册一个 usb_interface
  • 左边的 usb_driver 和右边的 usb_interface 如果匹配,则调用 usb_driver.probe

2. 接口函数

在 USB 设备驱动程序中,能使用的 USB 函数都在这个头文件里:includelinuxusb.h

2.1pipe

使用这些接口函数的主要目的是传输数据,传输数据的对象是 USB 设备里的某个 endpoint,这被称为 pipe:

/* Create various pipes... */#defineusb_sndctrlpipe(dev, endpoint) ((PIPE_CONTROL < <30) | __create_pipe(dev, endpoint))#defineusb_rcvctrlpipe(dev, endpoint) ((PIPE_CONTROL < <30) | __create_pipe(dev, endpoint) | USB_DIR_IN)#defineusb_sndisocpipe(dev, endpoint) ((PIPE_ISOCHRONOUS < <30) | __create_pipe(dev, endpoint))#defineusb_rcvisocpipe(dev, endpoint) ((PIPE_ISOCHRONOUS < <30) | __create_pipe(dev, endpoint) | USB_DIR_IN)#defineusb_sndbulkpipe(dev, endpoint) ((PIPE_BULK < <30) | __create_pipe(dev, endpoint))#defineusb_rcvbulkpipe(dev, endpoint) ((PIPE_BULK < <30) | __create_pipe(dev, endpoint) | USB_DIR_IN)#defineusb_sndintpipe(dev, endpoint) ((PIPE_INTERRUPT < <30) | __create_pipe(dev, endpoint))#defineusb_rcvintpipe(dev, endpoint) ((PIPE_INTERRUPT < <30) | __create_pipe(dev, endpoint) | USB_DIR_IN)

2.2 同步传输函数

对于控制传输、批量传输、中断传输,有 3 个同步函数可以用来直接发起传输。这些函数内部会创建、填充、提交一个 URB("usb request block"),并等待它完成或超时。

函数原型如下:

intusb_control_msg(structusb_device *dev, unsignedintpipe, __u8 request, __u8 requesttype, __u16value, __u16 index,void*data, __u16 size,inttimeout);intusb_bulk_msg(structusb_device *usb_dev, unsignedintpipe,void*data,intlen,int*actual_length,inttimeout);intusb_interrupt_msg(structusb_device *usb_dev, unsignedintpipe,void*data,intlen,int*actual_length,inttimeout);

2.3 异步传输函数

使用 URB 进行传输时,它是异步方式:需要先分配、构造、提交一个 URB("usb request block"),当传输完成后,它的回调函数被调用。

关键就在于需要填充 URB:

  • dev:跟谁传输数据
  • pipe:跟哪个 pipe 传输数据
  • buffer:里面存有要发送的数据,或者用来接收要读取的数据
  • 数据长度
  • 回调函数

2.3.1 分配和释放 URB

函数原型如下:

structurb *usb_alloc_urb(intiso_packets, gfp_t mem_flags);voidusb_free_urb(structurb *urb);

2.3.2 分配/释放DMABuffer

发起 USB 传输时,数据保存在 buffer 里。这个 buffer 可以是一般的 buffer,也可以是 DMA Buffer。

对于一般的 buffer,在提交 URB 时会临时分配一个 DMA Buffer:

  • 发送数据时:函数内部会先从一般 buffer 中把数据复制到 DMA Buffer,在提交给 USB 控制器
  • 读取数据时:USB 控制器先把数据传到 DMA Buffer,函数内部在把 DMA Buffer 的数据复制到一般 buffer
  • 中间增加了一次数据的拷贝,效率低

我们可以直接使用 DMA Buffer,函数原型如下:

void*usb_alloc_coherent(struct usb_device *dev,size_tsize,gfp_tmem_flags,dma_addr_t*dma);voidusb_free_coherent(struct usb_device *dev,size_tsize,void*addr,dma_addr_tdma);

2.3.3 填充 URB

对于控制传输、批量传输、中断传输,分别有如下函数:

staticinlinevoidusb_fill_control_urb(struct urb *urb, struct usb_device *dev,unsignedintpipe,unsignedchar*setup_packet,void*transfer_buffer,intbuffer_length,usb_complete_tcomplete_fn,void*context);staticinlinevoidusb_fill_bulk_urb(struct urb *urb, struct usb_device *dev,unsignedintpipe,void*transfer_buffer,intbuffer_length,usb_complete_tcomplete_fn,void*context);staticinlinevoidusb_fill_int_urb(struct urb *urb, struct usb_device *dev,unsignedintpipe,void*transfer_buffer,intbuffer_length,usb_complete_tcomplete_fn,void*context,intinterval);

如果 URB 使用 DMA Buffer,那么还需要设置一个 flag 表明这点:

urb- >transfer_dma = DMA address of buffer;// usb_alloc_coherent的输出参数urb- >transfer_flags |= URB_NO_TRANSFER_DMA_MAP;

2.3.4 提交 URB

构造好 URB 后,需要提交到 USB 系统里,才能启动传输。

intusb_submit_urb(structurb *urb, gfp_t mem_flags);

2.3.5 取消 URB

已经提交的 URB,可以取消它,有 2 个函数:

  • usb_kill_urb:这是一个同步函数,它会等待 URB 结束
  • usb_unlink_urb:这是一个异步函数,它不会等待 URB 结束,USB 控制器驱动会调用它的回调函数
voidusb_kill_urb(structurb *urb);intusb_unlink_urb(structurb *urb);
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • usb
    usb
    +关注

    关注

    60

    文章

    7732

    浏览量

    261752
  • 驱动
    +关注

    关注

    12

    文章

    1769

    浏览量

    84794
  • 鼠标
    +关注

    关注

    6

    文章

    586

    浏览量

    39496
收藏 人收藏

    评论

    相关推荐

    嵌入式Linux下的USB设备驱动技术

    嵌入式 Linux下的 USB 设备 驱动技术 Linux以其稳定、高效、易定制、硬件支持广泛、源代码开放等特点,已在嵌入式领域迅速崛起,被国际上
    发表于05-08 08:30 1747次阅读
    嵌入式<b class='flag-5'>Linux</b>下的<b class='flag-5'>USB</b><b class='flag-5'>设备</b><b class='flag-5'>驱动</b>技术

    嵌入式Linux下的USB设备驱动

    USB里的 设备 模型 Linux里一个很重要的概念是 设备 模型。对于
    发表于12-07 10:29

    详解linux设备驱动模型架构

    LDD3中说:“ Linux内核需要一个对系统结构的一般性描述。”这个描述就是 linux 设备 驱动 模型(下面简称为LDDM)。LDDM不是独立
    发表于07-25 07:25

    基于LinuxUSB设备驱动方法有什么优点?

    设备、串口 设备、网络 设备设备 驱动程序及各种 USBdevice控制器芯片的
    发表于11-07 08:31

    基于USB设备Linux网络驱动程序开发

    介绍 Linux的体系结构及其网络子系统,并结合 USB 设备Linux下的访问机制,给出了一种 USB网络
    发表于08-11 11:23 20次下载

    Linux环境下USB的原理、驱动和配置

    本文对 Linux环境下 USB的原理、 驱动和配置进行详细介绍。随着生活水平的提高,人们对 USB 设备的使用也越来越多,鉴于
    发表于01-16 16:57 33次下载

    嵌入式LinuxUSB驱动设计

    本文主要介绍了 Linux平台的 USB 设备 驱动开发的一般步骤方法和技巧,通过详细介绍 USB的相关概念和
    发表于06-08 17:15 49次下载
    嵌入式<b class='flag-5'>Linux</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b>设计

    Linux设备驱动模型摘抄

    Linux2.6 内核提供了新的 设备 模型,目的是为了对计算机上的所有 设备进行统一地表示和操作,包括 设备本身和
    发表于03-19 15:15 39次下载

    Linux设备驱动开发详解》第20章、USB主机与设备驱动

    Linux 设备 驱动开发详解》第20章、 USB主机与 设备 驱动
    发表于10-27 11:04 8次下载
    《<b class='flag-5'>Linux</b><b class='flag-5'>设备</b><b class='flag-5'>驱动</b>开发详解》第20章、<b class='flag-5'>USB</b>主机与<b class='flag-5'>设备</b><b class='flag-5'>驱动</b>

    Linux设备驱动模型摘抄

    Linux 设备 驱动模型摘抄
    发表于10-31 09:00 8次下载
    <b class='flag-5'>Linux</b><b class='flag-5'>设备</b><b class='flag-5'>驱动</b>的<b class='flag-5'>模型</b>摘抄

    Linux下的硬件驱动USB设备(上)

    和使用他们,也越来越成为困扰我们的一大问题。本文分两部分着力从 Linux系统下 设备 驱动的架构,去阐述怎样去使用和配置以及怎样编制 USB 设备
    发表于04-02 14:35 302次阅读

    Linux下的硬件驱动USB设备(下)

    RESERVED FOR FUTURE USE INCLUDE FILES--> 前言在上篇《 Linux下的硬件 驱动-- USB 设备(上)( 驱动
    发表于04-02 14:37 369次阅读

    如何使用Linux内核实现USB驱动程序框架

    Linux内核提供了完整的 USB 驱动程序框架。 USB总线采用树形结构,在一条总线上只能有唯一的主机 设备
    发表于11-06 17:59 19次下载
    如何使用<b class='flag-5'>Linux</b>内核实现<b class='flag-5'>USB</b><b class='flag-5'>驱动</b>程序框架

    Linux总线、设备驱动模型的探究

    Linux总线、 设备驱动 模型的探究
    发表于02-14 12:01 7次下载

    基于ARM的USB无线网卡Linux设备驱动设计

    德赢Vwin官网 网站提供《基于ARM的 USB无线网卡 Linux 设备 驱动设计.pdf》资料免费下载
    发表于10-12 11:25 2次下载
    基于ARM的<b class='flag-5'>USB</b>无线网卡<b class='flag-5'>Linux</b><b class='flag-5'>设备</b><b class='flag-5'>驱动</b>设计