- 博客(77)
- 收藏
- 关注
原创 Linux ECM子网掩码常见问题排查
ECM (Ethernet Networking Control Model 以太网控制模型) 用于在设备和主机之间传输以太网数据包。在操作系统看来,CDC ECM设备就是一个虚拟以太网卡,包含标准网卡需要的MAC地址和IP地址。CDC ECM设备通常是一个以太网卡,用于连接LAN或者是WLAN。当客户主机发起ECM拨号的请求时,模块相当于一个路由器,模块内部会调用相应的服务实现WWAN拨号。在拨号成功后,模块内部会启动DHCP server等功能。
2025-03-14 17:22:16
852
原创 CMUX使用指导以及问题排查
首先安装VSPD工具解压后点击vspd.exe安装,一直下一步就可以,安装完成后把Cracked文件夹内的文件覆盖安装目录,免注册激活。安装注册完成之后,打开VSPD,在红框内添加配对的虚拟串口,点击添加端口,一对虚拟串口就添加完成了。打开设备管理器,能看到添加的虚拟串口,那么虚拟串口就已经添加成功了。
2025-03-14 16:24:33
915
原创 USB Hub 驱动和 Gadget 驱动的联系与区别
Gadget 驱动是 USB 设备(Peripheral)端的软件框架,用于将设备(如手机、开发板)配置为 USB 从机,模拟特定的 USB 功能(如 U 盘、网卡、串口等)。在 USB 系统中扮演完全不同的角色,它们分别属于 USB 主机(Host)和设备(Peripheral)两端的驱动模型。处理低速(Low-Speed)、全速(Full-Speed)、高速(High-Speed)等不同速度设备的兼容性。所有支持 USB 主机功能的设备(如 PC、笔记本电脑、嵌入式主机控制器)都需要 Hub 驱动。
2025-03-13 17:44:10
454
原创 USB、DWC3与Gadget关系解析
USB是通信协议标准。DWC3是实现 USB 协议的硬件控制器。Gadget是基于 Linux 的软件框架,通过驱动 DWC3 等硬件控制器,实现设备模式的 USB 功能。三者关系可概括为:Gadget 框架(软件)→ 控制 →DWC3 控制器(硬件)→ 遵循 →USB 协议(标准)。
2025-03-13 17:18:04
861
原创 USB设备的检测与枚举
在这里对速度的检测是双向的,比如高速的hub需要检测所挂上来的设备是高速、全速还是低速,高速的设备需要检测所连上的hub是USB2.0的还是1.x的,如果是前者,就进行一系列动作切到高速模式工作,如果是后者,就以全速模式工作。在hub端,虽然下达了复位信号,并一直驱动着SE0,但USB2.0的高速接收器一直在检测Chirp K信号,如果没有Chirp K信号看到,就继续复位操作,直到复位结束,之后就在全速模式下操作。这里的KJ序列是连续的,中间不能间断,而且每个K或J的持续时间在40us~60us之间。
2025-03-13 15:23:08
968
原创 USB的演进迭代
USB3.1Gen1就是原来USB3.0的马甲,换一个名称而已,推出USB3.1的主要更新就是增加USB3.1 Gen2,可以实现10Gbps的带宽。USB系统是属于分层的星状拓扑结构,主机控制器中心。USB随着传输速率提高,逐步向Type-C接口统一,而Type-C也逐渐演进出独立的标准,包括传输,显示,PD供电规范,Type-C接口也给设备供电带来了更多的可能性…简单来说,USB总线的工作模式类似于一个轮训系统,一切通信都由主控制器控制,在主控制器与USB功能器件之间进行,USB功能器件之间不能通信。
2025-03-13 14:58:41
575
原创 USB3.0接入检测与分析
数据只需要朝一个方向传输就可以了,简化了等待引起的时间消耗,电路连接上作为Host的TX与Device的RX连接,Host的RX与Device的TX相连。在将USB设备插入USB3.0的Hub,主机通过TX端发起RX Detect,在没有设备接入时,主机发射端检测到的负载和有设备接入时的负载是不一样的,这样在有无设备接入时的RC时间常数就会不同,发送端通过改变TXP/TXN的共模电压,然后检测线路上共模电压充电时的信号上升时间(充电速率)就可以判别是否存在终端设备。
2025-03-13 14:51:41
370
原创 USB2.0插入检测原理
这样设计的目的让USB设备接入USB端口时,USB的电源和地先于数据信号连接,从而避免在动态插入时由电源的不稳定,电流对数据线、信号线的影响。当USB设备检测到来自Hub的三对KJ后,它在500us内切换到高速模式,使能内部D+和D-对GND的45ohm电阻,断开设备侧D+的1.5K上拉电阻。与低速模式一样,在全速模式下,数据传输采用电压传输模式。• 数据信号是通过改变电压来传输的,具体来说,逻辑0可能是低电压(通常接近0V),而逻辑1可能是高电压(通常接近USB规定的电压值)。
2025-03-13 14:41:55
913
原创 USB驱动配置调试
说明:USB OTG标准在完全兼容USB2.0标准(EHCI)的基础上,增添了电源管理(节省功耗)功能,它允许设备即可作为主机,也可作为外设操作(两用OTG)。USB设备本身与USB总线通过usb_driver连接,而USB设备本身的驱动(读写、控制)则需要通过其USB设备本身所属类设备驱动来完成。当设备检测到USB_ID信号为高时,表示该设备作为Slave(外设,device,也称B设备)当设备检测到USB_ID信号为低时,表示该设备应作为Host(主机,也称A设备)。
2025-03-13 12:26:19
521
原创 Android USB驱动源码说明
比如包括主控制器(PC、服务器等等上的),外围控制器(在带有Linux固件的设备中,像打印机或手机),以及像以太网适配器这样的硬件外围设备。USB是一个主/从协议,作为host(比如PC)可以控制多达127个从设备,USB硬件是非对称,这便于设置,不能将连接到“host端”的连接器连接到设备端。USB host的核心代码,包括usbfs(USB文件系统)文件和HUB类驱动(hub_wq)。由usb目录下Makefile中CONFIG_USB_SUPPORT选项指定,此选项添加了对USB的核心支持。
2025-03-13 12:04:50
466
原创 USB基础---设备、配置、接口、端点和字符串描述符
在USB系统中每一个端点都有唯一的地址,这是由设备地址和端点号给出的。一个USB端点只能在一个方向上承载数据,从主机到设备(输出端点)或者从设备到主机(输入端点),因此端点可以看作是一个单向的管道,端点0通常为控制端点,用于设备初始化参数等。USB描述符信息存储在USB设备中,在枚举过程中,USB主机会向USB设备发送GetDescriptor请求,USB设备在收到这个请求之后,会将USB描述符信息返回给USB主机,USB主机分析返回来的数据,判断出该设备是哪一种USB设备,建立相应的数据链路通道。
2025-03-13 11:46:33
812
原创 GobiNet 驱动移植调试
执行 sudo modprobe option,使用 lsusb 和 ls /dev/ttyUSB*命令,查看是否加载成功。一般会加载出/dev/ttyUSB0、/dev/ttyUSB1、/dev/ttyUSB2、/dev/ttyUSB3之类的端口,端口顺序与章节2的顺序相同。Gobinet驱动一般是基于平台提供的源码基础上修改而来的,一般包含makefile、GobiUSBnet.c、QMI.c、QMI.h、QMIDevice.c、QMIDevice.h以及Structs.h文件。
2025-03-13 09:49:01
962
原创 高通SDX55:拨号问题和网卡配置问题排查
在拨号的时候,要确保所装的驱动是否正确,特别是Android系统下的拨号,假如使用的是Gobinet驱动,需要重新编译驱动。在Windows下安装驱动,一般需要适配对应的VID/PID,对应的GTUSBMODE模式,然后输出对应的Windows驱动。如果拨号异常,抓取的log可以直观的看到PDU是否发起,APN携带的信息是否正确,PDU是否被拒,以及是否被主动释放等信息。驻网成功之后,需根据当前的GTUSBMODE模式确认拨号方式,例如ECM拨号、Rndis拨号、Rmnet拨号等等。3.1 选择拨号方式。
2025-03-12 17:54:40
241
原创 内推-广和通
Hi,我是刘澄澄 Willa Liu,我在广和通帮你内推~ 您可登录链接:[fibocom.zhiye.com] 进行投递, 投递之前填写我的推荐码:ISVRVB 我就可以帮您内推哦~
2025-02-12 11:56:33
84
转载 STL
C++ STL详解 转载自:http://www.cnblogs.com/shiyangxt/archive/2008/09/11/1289493.html 一、STL简介STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R ...
2019-05-17 19:44:28
294
原创 BinarySearchTree
二叉搜索树的性质:1、每一个节点都有一个作为搜索依据的关键码(key),所有节点的关键码都不同。2、左子树上所有关键码(key)都小于根节点的关键码(key)。3、右子树上所有关键码(key)都大于根节点的关键码(key)。4、左右子树都是二叉搜索树。查找高度次,LogN构造函数拷贝构造赋值运算符重载析构函数插入(bool):树为空,直接插到根节点;树不为空,定义一个parent记录cur的父亲,...
2018-04-19 11:57:12
605
原创 RBTree
红黑树保证最长路径不超过最短路径的2倍,因而近似平衡1、每个节点,不是红色就是黑色2、根节点是黑色3、如果一个节点是红色的,则他的两个子节点是黑色的(没有连续的红节点)4、每条路径上黑色节点数量相等5、每个叶子节点都是黑的(这里的叶子节点指的是空节点)当新插入节点是红色的,其父亲也是红色的,那么就知道了祖父是黑色的,所以叔叔的颜色比较重要第一种:cur为红,p为红,g为黑,u存在且为红,则将p,u...
2018-04-18 10:26:39
1037
原创 AVLTree
左单旋:思路:1、创建节点subR和subRL2、parent的右指向subRL3、判断subRL是否存在 若存在,subRL的父亲就是parent 若不存在,也不影响4、subR的左指向parent 那么subR的父亲就是parent的父亲了5、给parent的父亲创建一个节点ppNode parent的父亲也就是ppNode,也就是subR6、如果ppN...
2018-04-12 14:53:48
1539
原创 resize和reserve的区别
1、resize(n):调整容器的长度大小,使其能容纳n个元素。如果n小于容器当前的size,则删除多出来的元素,否则,添加采用值初始化的元素。reserve(n,t):多一个参数t,将所有新添加的元素初始化为t。2、reserve(n):预分配n个元素的存储空间。 capacity:容量(容器当前拥有的元素个数) size:长度(容器在必须分配新存储空间之前可以存储的元素总数...
2018-03-26 20:48:48
3033
原创 一个数组实现两个栈
看到题目,首先要考虑什么是数组,什么是栈,两者的特性都是怎样的,其次再考虑如何实现题目要求。通常会想到:方法一:栈1从数组的开头开始,栈2从数组的末尾开始,这样比较节省空间,当栈1和栈2的栈顶相遇时,我们就进行扩容。方法二:既然方法一可以从两边开始,那么我们也可以从中间开始向两边延伸,但这样有可能就会造成空间浪费,比如某一个栈分配了大量的空间,可是实际其只有一两个数据。方法三:在讨论中,有的同学建...
2018-03-07 11:18:19
465
原创 实现一个栈,实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)
在这里选取两个栈来实现,一个用于存放数据,栈名为S1;另一个用于存放最小值,栈名为S2。入栈:如果此时S2里无元素,则直接将元素插入S1栈顶;如果S2内有元素,则将要插入的元素与S2栈顶的元素作比较,要插入的元素如果小于或等于S2栈顶元素,则两个栈都插入该元素;反之,只插入到S1栈顶。出栈:如果S1和S2栈顶元素相等,则都出栈,反之出S1。最小值:S2栈顶是最小值,出栈S2栈顶即可.#includ...
2018-03-05 15:06:40
594
原创 关于类型萃取
简单理解:类型萃取是使用模板技术来萃取类型的某些特性,这里的萃取类型包括自定义类型和内置类型,用以判断该类型是否含有某些特性,从而在泛型算法中来对该类型进行特殊的处理,以提高效率等。类型萃取主要涉及函数派送机制,影响其机制的两个原因就是模板的编译机制和模板函数的重载。(简单理解,后续跟进)...
2018-03-05 13:36:08
469
原创 为什么模板不支持分离编译?
我们一般在使用模板时,大都包括头文件(.h),实现文件(.cpp),测试文件(test.cpp),模板写在实现文件中,在测试文件中进行测试调用,模板不支持分离编译大都报错是链接错误,程序包括预处理、编译、汇编、链接,此处的错误提示在于链接。之所以有这个问题还在于模板的两次编译:第一:实例化之前,是为了检查语法错误;第二:是为了在替换了类型之后,再次检查语法错误。而模板代码的实现体在一个文件里,实例...
2018-03-05 11:46:56
322
原创 计算器简单分析
例如给出一个计算公式:2-3*4+5 其中2、3、4、5属于操作数;-、*、+属于操作符。考虑到操作符的优先级,当我们读取这个公式时,需要将其重新写成计算机可以读取的形式,如234*-5+(遇见一个操作符号,就将符号前面紧挨着的两个元素进行运算)如图: 如果是直接针对2-3*4+5,在这里需要两个栈s1和s2,遇见操作数则将其入栈s1,遇到操作符则将其入
2017-12-19 14:36:53
584
原创 多态的对象模型
一、多态 定义:多态是同一个实体同时具有多种形式,它是面向对象程序设计的一个重要特征,c++的多态性体现在编译和运行时,编译时多态是静态多态,在编译时可以确定编译对象的形式;运行时是动态多态,运行时可以确定具体引用的对象。实现多态有:虚函数、抽象类、模板、覆盖。 作用:把不同的子类对象都当做父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的程序
2017-12-07 12:33:30
273
原创 菱形继承与虚继承
一、菱形继承 定义:菱形继承就是多个类继承一个公共类,而这些派生类又同时被一个子类继承。如我们所想的几何菱形那样,如下图:A为父类,B,C为派生类,同时继承父类A,然后D又继承B和C,这样就构成一个菱形继承。 代码展示: 这里已经可以看出,当D里面的对象d调用fun()函数时,fun()函数下方已经出现红色波浪线,这是因
2017-12-06 13:09:34
435
原创 Iterator迭代器
一、迭代器是是什么? 迭代器是一种检查容器内元素并遍历元素的数据类型。每种容器类型都定义了自己的迭代器类型,如vector: vector:: iterator iter;定义了一个名为iter的变量,它的数据类型是由vector定义的iterator类型。 使用迭代器(iterator)读取容器(vector)中的每一个元素:
2017-12-04 22:57:45
302
原创 vector和list
一、vector定义:vector是表示可以更改大小的数组的序列容器。 就像数组一样,vector使用相邻的存储位置来存储元素,也就是说,它们的元素也可以使用“偏移量”来访问它的元素,就像数组一样有效。但与数组不同的是,它们的大小可以动态变化,其存储由容器自动处理。 在内部,vector使用一个动态分配的数组来存储它们的元素。当插入新元素时,这个数组可能需要
2017-12-04 20:04:46
2085
原创 C和C++在结构体和类方面的不同
这里将C和C++写的顺序表的部分代码列出来作以对比:本质是一样的,C写一个显示的形参,C++不用,C++把顺序表的信息数据传给PushBack函数了,只不过是编译器在做,把数据传给了隐含的this指针。表层:面向过程,数据和方法是分离的。面向对象,数据和方法是封装在一起的。
2017-11-09 16:04:59
345
原创 虚函数表
虚表只存的地址class Base{public:virtual void func1(){}virtual void func2(){}private:int a;};void Test1(){Base b1;//虚函数表指针_vfptr,虚函数的重写,完成多态,指向虚函数的一张表,其实是个数组,指针数组,存的虚函数的地址cout }
2017-11-07 12:31:26
457
原创 纯虚函数
纯虚函数定义:在成员函数的形参后面写上=0,包含纯虚函数的类是抽象类,抽象类不能实例化出对象,纯虚函数在派生类重新定义之后,派生类才能实例化出对象。class Person{public:virtual void Display() = 0;//纯虚函数protected:string _name;};class Student :public Person
2017-11-07 10:12:03
540
原创 虚函数与多态需要注意的地方
1、派生类重写基类的虚函数实现多态,要求函数名、参数列表、返回值完全相同(协变除外)这里的协变在上一篇博客提到过2、基类中定义了虚函数,在派生类中该函数始终保持虚函数的特性。3、只有类的成员函数才能定义为虚函数。4、静态成员函数不能定义为虚函数。5、如果在类外定义虚函数,只能在声明函数时加virtual,类外定义函数时不能加virtual。6、构造函数不能为虚函数,虽然可以将o
2017-11-06 14:53:09
471
原创 虚函数与多态
是否构成多态的条件:1、父类的指针或引用2、虚函数的重写是否构成虚函数的条件:1、有virtual2、函数完全相同(协变:返回值可以不同,但返回值是父子关系的引用或指针)#include using namespace std;//基类class Person{public:virtual void BuyTickets(){cout }
2017-11-06 12:58:04
628
原创 String类的写时拷贝
1、Copy-On-Write的工作原理是什么?答:是引用计数2、String类在什么情况下才共享内存?答:这意思就是你用我的,才会出现共享。在使用别的类的数据时,只有两种情况,第一种就是以别的类构造自己,这个会触发拷贝构造函数;第二种就是以别的类赋值,这个会触发赋值运算符的重载。注意:不要看见“=”就以为是赋值,人家可能是调用了拷贝构造,尤其是前面带了类名的。还有要注意不要看见后
2017-10-27 22:20:20
491
原创 剖析new/delete、new[]/delete[]到底做了些什么事情
要知道new/delete和new[]/delete[],首先要知道operator new和operator delete,他们都是C++中的库函数。void * operator new(size_t);void * operator delete(void*);给一句:Class *pA = new A(10);new做的工作是:1、调用operator new标
2017-10-26 11:04:17
363
原创 new/delete和malloc/free的关系与区别
new/deletemalloc/free是运算符(只能重载,不能定义)库函数(名字随便起)能调用构造函数和析构函数只能申请内存空间抛异常不抛异常,会返回NULL分配内存设计,分配算法,查找,避免内存碎片,导致效率太低,因此程序员喜欢自己写new/delete,或者创建一
2017-10-26 11:03:42
630
原创 深拷贝和浅拷贝的区别
深浅拷贝的区别: 浅拷贝是将原始对象中的数据型字段拷贝到新对象中去,将引用型字段的“引用”复制到新对象中去,不把“引用的对象”复制进去,所以原始对象和新对象引用同一对象,新对象中的引用型字段发生变化会导致原始对象中的对应字段也发生变化。 深拷贝是在引用方面不同,深拷贝就是创建一个新的和原始字段的内容相同的字段,是两个一样大的数据段,所以两者的引用是不同的,之后的新对象中的引用型
2017-10-24 21:27:45
29900
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人