添加usb function <一>

1、usb描述信息

struct usb_interface_descriptor
{__u8  bLength;__u8  bDescriptorType;__u8  bInterfaceNumber;__u8  bAlternateSetting;__u8  bNumEndpoints;__u8  bInterfaceClass;__u8  bInterfaceSubClass;__u8  bInterfaceProtocol;__u8  iInterface;
}/* 
接口描述信息
重要的几个字段
bLength:一般填USB_DT_INTERFACE_SIZE
bInterfaceNumber: 一般填USB_DT_INTERFACE
bNumEndpoints:根据自己的需求填需要的端点数量
bInterfaceClass:接口类型,根据自己需求选择一个,如果不知道可以填USB_CLASS_VENDOR_SPEC
以上4个字段为必填。
*/

2、端点描述

struct usb_endpoint_descriptor {__u8  bLength;__u8  bDescriptorType;__u8  bEndpointAddress;__u8  bmAttributes;__le16 wMaxPacketSize;__u8  bInterval;__u8  bRefresh;__u8  bSynchAddress;
} 
/*
bLength:一般填USB_DT_ENDPOINT_SIZE
bDescriptorType:一般填USB_DT_ENDPOINT
bEndpointAddress:可填USB_DIR_IN或USB_DIR_OUT
bmAttributes:可填USB_ENDPOINT_XFER_ISOC,USB_ENDPOINT_XFER_BULK,USB_ENDPOINT_XFER_INT
*/

3、注册USB function

在init函数中调用usb_function_register注册功能。
在struct usb_function_driver中必须实现alloc_inst和alloc_func回调函数。
在alloc_inst中,需要返回struct usb_function_instance指针,需要填充
free_func_inst回调函数,该函数在功能被移除时调用。所以可以将所有的资源
回收过程在此函数中实现。
并且可以把一些需要在功能被创建时实现的功能在此处实现。
在函数返回前需要调用config_group_init_type_name对group进行初始化。
这个可以实现给功能添加其它功能的目的。
调用config_group_init_type_name后就可以将struct usb_function_instance指针返回。

alloc_func回调函数返回struct usb_function指针,在struct usb_function指针返回前
需要填充name, bind,set_alt,get_alt,disable,setup,free_func。
name是这个功能的名字,在通过configfs创建功能时会用到。
bind是核心功能,用于分配ep端点,协商速率等待,此函数是在中断被调用的,所有在中断不能做的,当然也不能在此实现。
set_alt在该回调中主要是配置速率,开启端点。

4、数据交互

数据是通过在bind时协商的端点进行传输。
先调用usb_ep_alloc_request 分配request,

struct usb_request {void			*buf;unsigned		length;dma_addr_t		dma;struct scatterlist	*sg;unsigned		num_sgs;unsigned		num_mapped_sgs;unsigned		stream_id:16;unsigned		is_last:1;unsigned		no_interrupt:1;unsigned		zero:1;unsigned		short_not_ok:1;unsigned		dma_mapped:1;void			(*complete)(struct usb_ep *ep,struct usb_request *req);void			*context;struct list_head	list;unsigned		frame_number;int			status;unsigned		actual;
}
/* 
我们只需要填充buf, length, complete, context
buf:需要传输或作为接收缓冲区
length: buf的长度,
complete是一个回调函数,在发送或接收完成时调用。
context:上下文,在complete回调函数中可以使用。
actual:接收收到的数据大小。	填充好上面4个字段后调用usb_ep_queue发起传输
*/

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

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

相关文章

工业物联网网关

在数字化浪潮席卷全球的今天,工业物联网(IIoT)作为连接物理世界与数字世界的桥梁,正在逐渐改变传统工业的面貌。而作为IIoT的核心枢纽,工业物联网网关发挥着至关重要的作用。今天,我们就来深入了解一下工业…

使用webpack5+TypeScript+npm发布组件库

一、前言 作为一只前端攻城狮,没有一个属于自己的组件库,那岂不是狮子没有了牙齿,士兵没有了武器,姑娘没有了大宝SOD蜜,你没有了我.... 言归正传,下面将给大家介绍如何通过webpack5编译一个TS组件发布到NPM…

【c 语言】声明了一个指针,会给指针分配内存吗?

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:C语言 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步&…

租用境外服务器,越南服务器的优势有哪些

自从中国加入世界贸易组织之后,国内经济增加速度非常快,同时越来越多的人选择去东南亚国家发展,因为当地的中国人很多,所以中国企业在当地面临着更小的文化差异。东南亚地区也是最新的经济体,互联网正处于蓬勃发展的阶…

Git 实用技巧1——从 Git 中停止追踪「被追踪的文件」 | 修改远程仓库地址

1. 从 Git 中停止追踪「被追踪的文件」 若误将 .idea, .vscode 中的本地配置文件添加到 git 中,会导致每次编译时,IDE 会提示 git 修改。为了减少/消除提示,需要将该文件取消追踪,但不能将其从本地删除,以取消对 work…

http、https、json编程

文章目录 1、http编程2、https编程3、json编程 1、http编程 HTTP 编程 http,归属于应用层的超文本传输协议 状态码:2xx(没问题) 3xx(重定向问题) 4xx(客户端问题) 5xx(服务端问题) 请求格式: 请求行 举例:GET /index.html HTTP/1…

docker服务无法启动

背景:断电重启经常会导致磁盘io错误,甚至出现磁盘坏块 这时可以使用xfs_repair来修复磁盘,但是修复过程可能会导致部分数据丢失 xfs_repair -f -L /dev/sdc问题一: Apr 15 19:27:15 Centos7.6 systemd[1]: Unit docker.service e…

linux安装weblogic

版本 Linux: Red Hat Enterprise Linux Server 6.9 64bit(安装了图形界面) JDK: 1.8U361 64bit weblogic: fmw_14.1.1.0.0_wls.jar 安装手顺 安装配置JDK 下载jdk压缩包 下载取得jdk-8I361-linux-x64.tar.gz将压缩包放置到linux,并解压缩到指定目录tar xvf jdk-8u201-…

【十一】MyBatis Plus 原理分析

MyBatis Plus 原理分析 摘要 Java EE开发中必不可少ORM框架,目前行业里最流行的orm框架非Mybatis莫属了,而Mybatis框架本身没有提供api实现,所以市面上推出了Mybatis plus系列框架,plus版是mybatis增强工具,用于简化My…

嵌入式系统及应用-1.1嵌入式

嵌入式系统 定义:看不见的计算机,一般不能被用户编程,它有一些专用的I/O设备,对用户的接口是应用专用的 通常将嵌入式计算机系统简称为嵌入式系统。 嵌入式系统是以应用为中心,以计算机技术为基础、软件硬件可裁剪、…

transformer上手(6)—— 微调预训练模型

1 加载数据集 以同义句判断任务为例(每次输入两个句子,判断它们是否为同义句),构建我们的第一个 Transformers 模型。我们选择蚂蚁金融语义相似度数据集 AFQMC 作为语料,它提供了官方的数据划分,训练集 / …

记录一下如何腾讯云服务器用客户端连MySQL

我一般喜欢用IDEA连数据库,别问我为啥(就喜欢用一个软件解决所有问题) 当然写SQL语句个人还是觉得sqlyog体验最佳!

【C/C++】什么是内存泄漏?如何检测内存泄漏?

一、内存泄漏概述 1.1 什么是内存泄漏 内存泄漏是在没有自动 gc 的编程语言里面,经常发生的一个问题。 自动垃圾回收(Automatic Garbage Collection,简称 GC)是一种内存管理技术,在程序运行时自动检测和回收不再使用…

MySQL8.0.36-社区版:错误日志(3)

mysql有个错误日志,是专门记录错误信息的,这个功能默认是开启的 一般都是在/var/log/mysqld.log 日志中存放 1.错误日志的位置 首先我们使用命令去查看一下,这个错误日志文件究竟在哪 进入到mysql中,使用命令 show variables…

LeetCode热题Hot100 - 合并K个升序链表

一刷~ 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 思路: 逆天了- -困难模式一次过- - 第一反应,n个列表,两两合并,n-1次遍历即可,…

Spring容器初始化之前,利用SpringBoot监听器做一些数据库方面的检查

之所以把数据库的连接、结构、最小初始化等检查项放到SpringBoot监听器而不是Spring容器的初始过程。是有原因的。 1:SpringBoot监听器是SpringBoot初始化过程中,最先被执行的那一批周期函数。 2:数据库连接测试能很快的获得结果。 3&#xf…

FME学习之旅---day24

我们付出一些成本,时间的或者其他,最终总能收获一些什么。 高级地理数据库 教程:地理数据库转换 上述教程包括 如何使用 Esri 模板地理数据库 该内容在FME学习之旅day19 已经学习过 使用地理数据库属性域:编写编码属性域 属…

机器学习实训 Day1(线性回归练习)

线性回归练习 Day1 手搓线性回归 随机初始数据 import numpy as np x np.array([56, 72, 69, 88, 102, 86, 76, 79, 94, 74]) y np.array([92, 102, 86, 110, 130, 99, 96, 102, 105, 92])from matplotlib import pyplot as plt # 内嵌显示 %matplotlib inlineplt.scatter…

古月·ROS2入门21讲——学习笔记(一)核心概念部分1-14讲

讲解视频地址:1.ROS和ROS2是什么_哔哩哔哩_bilibili 笔记分为上篇核心概念部分和下篇常用工具部分 下篇:古月ROS2入门21讲——学习笔记(二)常用工具部分15-21讲-CSDN博客 目录 第一讲:ROS/ROS2是什么 1. ROS的诞生…

Python-GEE遥感云大数据分析、管理与可视化及多领域案例实践应用

随着航空、航天、近地空间遥感平台的持续发展,遥感技术近年来取得显著进步。遥感数据的空间、时间、光谱分辨率及数据量均大幅提升,呈现出大数据特征。这为相关研究带来了新机遇,但同时也带来巨大挑战。传统的工作站和服务器已无法满足大区域…