技术标签: linux-内核篇 linux-驱动篇 linux-子系统
【USB gadget是什么?】
Linux-USB Gadget 驱动框架(以下简称 Gadget)实现了USB 协议定义的设备端的软件功能。相对于 Linux USB 主机端(Host)驱动而言, Gadget 驱动出现较晚,它出现在2.4.23 以后。Gadget 框架提出了一套标准 API, 在底层, USB 设备控制器(USB Device Controller, UDC)驱动则实现这一套 API, 不同的 UDC (通常是 SOC 的一部分)需要不同的驱动,甚至基于同样的 UDC 的不同板子也需要进行代码修改。这一层我们可以称之为平台相关层。基于 API, Gadget 驱动实现了一套硬件无关的功能,这基本上可以对应到 USB 协议里的各种 USB Class,也有比如 USB Gadget Generic Serial 驱动,没有对应的 Class。当然,Gadget 驱动还是受限于底层提供的功能的。比如某些 Class 需要 USB Isochronous 端点,这时我们就不能支持该 Class。普通的 Gadget 驱动只实现一个功能(比如, u 盘,usb 网卡)。复合设备可以支持多个功能,后面将仔细研究一下复合设备的实现。像智能手机, PDA这样的设备,硬件支持较丰富的端点、DMA Buffer, 给软件提了支持复合功能的基础。有两点值得注意,第一是 usb gaget 驱动框架不象 usb 主机端有 usb core 的概念,usb 主机可能支持成百类型的外设,把通用功能抽象出来很有意义。
Usb device 端则通常没有这个需求,一些通用功能抽象在一些 Helper 函数里就可以了。
第二是 usb 2.0 里提出了 OTG 的概念,可以在同一接口上支持 host 以及 device 功能。
OTG 是一个比较复杂的规范。
【控制器驱动】
常见的 usb device 有 U 盘, usb 鼠标、键盘,usb 蓝牙模块,usb 读卡器,等等。这些设备比较简单,通常不会运行Linux。运行Linux Gadget 的通常是一些集成 CPU 以及很多外设接口的 SOC (System-on-Chip),其中 CPU 通常为 32 bit 的 CPU, 并且 udc 也是该 SOC 的一部分(顺带还有 DMA 通道,FIFO)。Linux 标准内核里支持各主流 SOC 的 udc 驱动,make menuconfig 一下可以看到具体列表,其中值得一提的是 dummy_hcd, 它是一个软件模拟的 udc, 在开发新的 gadget 驱动时很有帮助。控制器驱动处理很少的 USB 控制请求(主要由硬件负责的部分)。其它所有的控制请求,比如返回描述符,设置当前配置,由 Gadget Driver 完成。控制器驱动一个主要责任就是负责管理各个端点的 I/O 队列,在 Gadget Driver 的 buffer 和硬件buffer 之间传输数据(通常是通过 DMA)。我们前面提过,上层 Gadget 驱动能够实现什么功能要依赖底层提供的硬件条件。比如一个复合设备需要至少 5 个端点,这些硬件特性通过一组 gadget_is_*()函数实现。
【Gadget框架结构】
kernel/drivers/usb/gadget,这个目录是android下usbgadget的主要目录。
Gadget功能组织单元:主要文件android.c,usb gadget功能的统领文件,负责组织usb 复合设备的功能,与上层应用提供交互的接口,面向市场需求的产品规划部门。
复合设备逻辑处理单元(复合设备管理单元):主要文件:composite.c,这个文件类似于一个项目管理组,负责各个单元的接口对接,资源整理。针对拥有多个usb功能的复合设备,这部分负责将支持
Linux I2C device driver
训练数据tfrecords产生的问题:INFO:tensorflow:Error reported to Coordinator: <class 'tensorflow.python.framework.errors_impl.InvalidArgumentError'>, All bounding box coordinates must be in [0.0, 1.0]: 1...
这是真正的动手解决自己的疑惑,我把打过100ask_24x0补丁的U-boot-1.1.6的源码进行了反汇编,生成了u-boot.dis文件,然后结合这个文件对start.S的代码中relocate部分进行了分析,这一部分是我一直没搞懂的,憋在心里特别难受,今天反汇编之后一切都豁然开朗了。首先下面是u-boot-1.1.6代码中start.S文件的部分内容:.globl _start_s...
C语言实现1到100的和,0-100中的奇数和与0-100中的偶数和#includeint main(void)//主函数{ int n,sum=0;//初始化变量for(n=1;n<=100;n++)//用for循环实现累加 sum=sum+n;printf("sum is %d\n",sum);//显示累加之后的和 return 0;}用for循环实现1-100内偶数的和#inclu..._c语言一到一百奇数偶数和
本系列文章目录(一)基础k8s yaml脚本发布(二)helm+shell脚本优化大量冗余配置发布(三)jenkins用户审核的流水化方式部署(四)service mesh(istio)服务网格化发布(五)istio对项目进行金丝雀部署(待完成)在有了上一篇采用rancher2+kubernetes+skywalking部署springcloud项目(四[istio服务网格化版本])的实战后,对istio有了一个初步简单的认识。这一次我决定来把spring-boot-cloud项目中的svca_k8s部署skywalking
????摘要今天博主将给大家分享–Salesforce(0):使用Apex Scheduler进行计划作业。欢迎关注收藏!????首先Apex计划程序说明和最佳实践Salesforce计划在指定时间执行该类。根据服务可用性,实际执行可能会延迟。如果您计划从触发器安排课程,请格外小心。您必须能够保证触发器不会添加超出限制的计划班级。尤其要考虑API批量更新,导入向导,通过用户界面进行的批量记..._salesforce apex schedual 等待
力扣078.子集class Solution {private: vector<vector<int>> result; vector<int> path; void backtracking(vector<int>& nums, int startIndex) { result.push_back(path); for (int i = startIndex; i < nums.si_手撕回溯
一、介绍我们在使用MapReduce框架进行开发时,总会使用到Configuration类的一个实例对象去初始化一个人任务,然后进行任务提交,而在整个任务执行过程中,客户点实例化的Configuration的对象,将作为整个任务过程中参数版本,任务执行过程中所需要的所有参数都是从客户端实例化的Configuration对象中进行获取。下面详细介绍一下Configuration的参数过程。二
项目图: 1.需求功能1)罗列出全国所有的省/市/县2)可以查看全国任意城市的天气信息3)可以自由切换城市,查看其它城市的天气4)可以手动更新天气和后台自动更天气2.需要的技术UI界面,网络请求,数据库操作,后台服务等2.1原型图3.数据准备1)天气接口信息a.使用阿里的付费版接口,0.01元调用10000次b.和风天气,免费用h..._开发天气app第一行代码
AbstractAutowireCapableBeanFactory抽象类AbstractAutowireCapableBeanFactory继承了AbstractBeanFactory类,以及实现了AutowireCapableBeanFactory的接口。类结构字段// bean的生成策略,默认CGLIBprivate InstantiationStrategy instantiationStrategy = new CglibSubclassingInst..._abstractautowirecapablebeanfactory.invokecustominitmethod
package com.example.spring.util;import java.security.Key;import java.util.Map;import javax.crypto.spec.SecretKeySpec;import javax.xml.bind.DatatypeConverter;import org.slf4j.Logger;import org..._jwt token (apikey)
根据在实际项目中的实践经验,我把常用的性能测试方法分为七大类:后端性能测试(Back-end Performance Test)、前端性能测试(Front-end Performance Test )、代码级性能测试(Code-level Performance Test)、压力测试(Load/Stress Test)、配置测试(Confguration Test)、并发测试 (Concurren...