linux usb 驱动之创urb的创建和销毁

struct urb 结构在驱动中必须不被静态创建, 或者在另一个结构中, 因为这可能破坏
USB 核心给 urb 使用的引用计数方法. 它必须使用对 usb_alloc_urb 函数的调用而被创
建. 这个函数有这个原型:
struct urb *usb_alloc_urb(int iso_packets, int mem_flags);
第一个参数, iso_packet, 是这个 urb 应当包含的同步报文的数目. 如果你不想创建一
个同步 urb, 这个变量应当被设置为 0. 第 2 个参数, mem_flags, 是和传递给 kmalloc
函数调用来从内核分配内存的相同的标志类型(见"flags 参数"一节, 第 8 章, 关于这些
标志的细节). 如果这个函数在分配足够内存给这个 urb 成功, 一个指向 urb 的指针被
返回给调用者. 如果返回值是 NULL, 某个错误在 USB 核心中发生了, 并且驱动需要正确
地清理.
在创建了一个 urb 之后, 它必须被正确初始化在它可被 USB 核心使用之前. 如何初始化
不同类型 urb 见下一节
为了告诉 USB 核心驱动用完这个 urb, 驱动必须调用 usb_free_urb 函数. 这个函数只
有一个参数:
void usb_free_urb(struct urb *urb);
参数是一个指向你要释放的 struct urb 的指针. 在这个函数被调用之后, urb 结构消失,
驱动不能再存取它.

中断 urb

函数 usb_fill_int_urb 是一个帮忙函数, 来正确初始化一个 urb 来发送给 USB 设备的
一个中断端点:

void usb_fill_int_urb(struct urb *urb, struct usb_device *dev,
unsigned int pipe, void *transfer_buffer,
int buffer_length, usb_complete_t complete,
void *context, int interval);
这个函数包含许多参数:
struct urb *urb
指向要被初始化的 urb 的指针.
struct usb_device *dev
这个 urb 要发送到的 USB 设备.
unsigned int pipe
这个 urb 要被发送到的 USB 设备的特定端点. 这个值被创建, 使用前面提过的
usb_sndintpipe 或者 usb_rcvintpipe 函数.
void *transfer_buffer
指向缓冲的指针, 从那里外出的数据被获取或者进入数据被接受. 注意这不能是一
个静态的缓冲并且必须使用 kmalloc 调用来创建.
int buffer_length
缓冲的长度, 被 transfer_buffer 指针指向.
usb_complete_t complete
指针, 指向当这个 urb 完成时被调用的完成处理者.
void *context
指向数据块的指针, 它被添加到这个 urb 结构为以后被完成处理者函数获取.
int interval
这个 urb 应当被调度的间隔. 见之前的 struct urb 结构的描述, 来找到这个值
的正确单位.

  块 urb

块 urb 被初始化非常象中断 urb. 做这个的函数是 usb_fill_bulk_urb, 它看来如此:
void usb_fill_bulk_urb(struct urb *urb, struct usb_device *dev,unsigned int pipe, void *transfer_buffer,
int buffer_length, usb_complete_t complete,
void *context);

这个函数参数和 usb_fill_int_urb 函数的都相同. 但是, 没有 interval 参数因为
bulk urb 没有间隔值. 请注意这个 unsiged int pipe 变量必须被初始化用对
usb_sndbulkpipe 或者 usb_rcvbulkpipe 函数的调用.
usb_fill_int_urb 函数不设置 urb 中的 transfer_flags 变量, 因此任何对这个成员的
修改不得不由这个驱动自己完成.

控制 urb

控制 urb 被初始化几乎和 块 urb 相同的方式, 使用对函数 usb_fill_control_urb 的
调用:
void usb_fill_control_urb(struct urb *urb, struct usb_device *dev,
unsigned int pipe, unsigned char *setup_packet,
void *transfer_buffer, int buffer_length,
usb_complete_t complete, void *context);
函数参数和 usb_fill_bulk_urb 函数都相同, 除了有个新参数, unsigned char
*setup_packet, 它必须指向要发送给端点的 setup 报文数据. 还有, unsigned int
pipe 变量必须被初始化, 使用对 usb_sndctrlpipe 或者 usb_rcvictrlpipe 函数的调用.
usb_fill_control_urb 函数不设置 transfer_flags 变量在 urb 中, 因此任何对这个成
员的修改必须游驱动自己完成. 大部分驱动不使用这个函数, 因为使用在"USB 传送不用
urb"一节中介绍的同步 API 调用更简单.

同步 urb

不幸的是, 同步 urb 没有一个象中断, 控制, 和块 urb 的初始化函数. 因此它们必须在
驱动中"手动"初始化, 在它们可被提交给 USB 核心之前. 下面是一个如何正确初始化这
类 urb 的例子. 它是从 konicawc.c 内核驱动中取得的, 它位于主内核源码树的
drivers/usb/media 目录.
urb->dev = dev;
urb->context = uvd;
urb->pipe = usb_rcvisocpipe(dev, uvd->video_endp-1);
urb->interval = 1;
urb->transfer_flags = URB_ISO_ASAP;
urb->transfer_buffer = cam->sts_buf[i];
urb->complete = konicawc_isoc_irq;
urb->number_of_packets = FRAMES_PER_DESC;
urb->transfer_buffer_length = FRAMES_PER_DESC;
for (j=0; j < FRAMES_PER_DESC; j++) {

urb->iso_frame_desc[j].offset = j;
urb->iso_frame_desc[j].length = 1;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/599110.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js逆向第9例:猿人学第2题-js混淆-动态cookie1

题目2:提取全部5页发布日热度的值,计算所有值的加和,并提交答案 (感谢蔡老板为本题提供混淆方案) 既然题目已经给出了cookie问题,那就从cookie入手,控制台找到数据请求地址 可以看到如下加密字符串m类似md5,后面跟着时间戳 m=45cc41dcdb15159ebb50564635f8e362|1704301…

偌依 项目部署及上线步骤

准备实验环境&#xff0c;准备3台机器 1.作为前端服务器&#xff0c;mysql,redis服务器--同时临时作为代码打包服务器 192.168.2.65 nginx-server 2.作为后端服务器 192.168.2.66 java-server-1 192.168.2.67 java-server-2 安装nginx/mysql #安装nginx [rootweb-nginx ~]…

智能视频监控技术在旅游业中如何发挥最大作用,助力旅游业发展

随着“南方小土豆勇闯哈尔滨”的词条霸榜热搜&#xff0c;大众旅游热情再次点燃。最近哈尔滨游客爆满的情况&#xff0c;极易发生游客迷路、景区瘫痪、交通堵塞等情况&#xff0c;当地有关部门的压力不言而喻。对于节假日或者“破天富贵”、“报复性旅游”的情况&#xff0c;景…

webrtc报文记录

tcp.port 10443 || tcp.port 6080 || udp.port 8000 https://download.csdn.net/download/dualvencsdn/88706745

如何使用ArcGIS Pro转换单个点坐标

坐标转换作为基础的功能&#xff0c;一般的GIS软件都支持&#xff0c;大多数情况下&#xff0c;我们是转换整个图层&#xff0c;如果想要转换单个坐标点&#xff0c;在ArcGIS Pro内也是支持的&#xff0c;这里为大家介绍一下转换方法&#xff0c;希望能对你有所帮助。 拾取坐标…

trino 433 开启密码验证

什么要开启密码验证 因为不加密的话&#xff0c;所有人都可以查询所配置的数据库 摘要 采用最简单的账号密码认证。 准备 trino 已经开启了https。trino 开启httpspassword.db。用户密码文件&#xff0c;一行就是一个用户名密码&#xff0c;用户密码用:隔开&#xff0c;比…

AUTOSAR系统服务篇-WdgM

文章目录 简介受监督的实体和校验点监督机制的交互监督函数存活监督(Alive Supervision)死线监督逻辑监督看门狗处理错误处理受监督实体中的错误处理硬件狗复位立即MCU复位术语功能详述监督功能的交互综述本地监督状态

【代码解析】代码解析之登录(2)

PostMapping("/login")public R<Employee> login(HttpServletRequest request, RequestBody Employee employee){//将页面提交的密码password&#xff0c;进行md5加密处理String password employee.getPassword();password DigestUtils.md5DigestAsHex(passw…

IPv6路由协议---IPv6静态路由

IPv6路由协议 路由是数据通信网络中最基本的要素。路由信息就是知道报文发送的路径信息,路由的过程就是报文转发的过程。 根据路由目的地的不同,路由可划分: 1.网段路由:目的地为网段,IPv4地址子网掩码长度小于32位或IPv6地址前缀长度小于128位。 2.主机路由:目的地为主…

Python爬虫实战技巧:如何在爬取过程中动态切换代理IP

目录 前言 第一步&#xff1a;获取代理IP列表 第二步&#xff1a;测试代理IP的可用性 第三步&#xff1a;动态切换代理IP 总结 前言 在进行爬虫开发的过程中&#xff0c;有时候需要使用代理IP来访问目标网站&#xff0c;以避免被封IP或者降低访问频率的限制。本文将介绍如…

Zabbix自定义监控内容实验(带自动报警)

实验前准备 zabbix服务端&#xff1a;192.168.188.17 zabbix客户端&#xff1a;192.168.188.11 部署zabbix服务端&#xff08;192.168.188.17&#xff09; zabbix-server 内存至少2G&#xff0c;推荐4G (1) 关闭防火墙 systemctl stop firewalld setenforce 0 (2)获取zabbix下…

第五周:深度学习知识点回顾

前言&#xff1a; 讲真&#xff0c;复习这块我是比较头大的&#xff0c;之前的线代、高数、概率论、西瓜书、樱花书、NG的系列课程、李宏毅李沐等等等等…那可是花了三年学习佳实践下来的&#xff0c;现在一想脑子里就剩下几个名词就觉得废柴一个了&#xff0c;朋友们有没有同感…

web学习笔记(九)

目录 1.初识JS(JavaScript) 1.1什么是JavaScript&#xff1f; 1.2HTML5 CSS3 javaScript三者的关系 1.3 JAVAScript的作用 1.4JAVAScript的组成部分 1.5JS注释 1.6补充知识 2.JS的引入方法 2.1行内式 2.2嵌入式&#xff08;内嵌式&#xff09; 2.3外链式 3.输入和…

Linux--系统安全及应用

1.1账号安全控制 用户账号是计算机使用者的身份凭证或标识&#xff0c;每个要访问系统资源的人&#xff0c;必须凭借其用户账号才能进入计算机。在Linux系统中&#xff0c;提供了多种机制来确保用户账号的正当、安全使用。 1.系统账号清理 在Linux系统中&#xff0c;除了用户手…

ChatGPT绘制全球植被类型分布图、生物量图、土壤概念图、处理遥感数据并绘图、病毒、植物、动物细胞结构图

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

2024年华为hcie方向有哪些?hcie 考点在哪里?

华为作为全球领先的ICT解决方案供应商&#xff0c;其认证体系在业内具有极高的权威性和认可度。其中&#xff0c;华为认证体系中的最高级别认证——HCIE&#xff0c;已经成为无数技术爱好者追求的目标。下面将探讨华为HCIE的方向及其考点&#xff0c;希望能对那些有志于获取HCI…

8. PageHelper分页插件

官方文档&#xff1a;https://github.com/pagehelper/Mybatis-PageHelper/blob/master/README_zh.md 1. 引入分页插件 在 pom.xml 中添加下面的依赖&#xff1a; <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</…

redis安装与配置

目录 1. 切换到 root 用户 2. 搜索安装包 3. 安装 redis 4. 查看 redis 是否正常存在 5. 修改ip 6. 重新启动服务器 7. 连接服务器 1. 切换到 root 用户 通过 su 命令切换到 root 用户。 2. 搜索安装包 apt search redis 这里安装的是下面的版本&#xff1a; 3. 安装 …

【MIT 6.S081】2020, 实验记录(1),Lab: Xv6 and Unix utilities

目录 实验准备TasksTask 1: Boot xv6Task 2: sleepTask 3: pingpongTask 4: primesTask 5: find 实验准备 这个 lab 用来学习尝试如何通过 system call 来实现常见的 shell 命令行程序&#xff0c;比如 ls、sleep、xargs 等。 实验官网 可以使用 docker 搭建实验环境&#x…

低代码UI构件程序设计基础实训一

步骤一 低代码在线调试工具 网址 低代码在线调试工具 步骤二 D盘建一个文件夹&#xff0c;文件夹下建两个文件夹ico和js 网上找一些图片&#xff0c;后缀.png&#xff0c;编号从0开始&#xff0c;图片另存到ico文件夹下 下载&#xff08;右键另存为&#xff09;以下四个页面…