To_run_away的博客

私信 关注
to_run_away
码龄7年

欲速则不达

  • 617,664
    被访问量
  • 232
    原创文章
  • 5,361
    作者排名
  • 2,433
    粉丝数量
  • 毕业院校 咸阳师范学院
  • 目前就职 深圳市艾特网能技术有限公司
  • 于 2014-06-23 加入CSDN
获得成就
  • 博客专家认证
  • 获得596次点赞
  • 内容获得171次评论
  • 获得3,106次收藏
荣誉勋章
TA的专栏
  • 从零开始学linux驱动
    86篇
  • 从零开始学USB
    28篇
  • linux设备驱动模型
    15篇
  • 设备树
    30篇
  • Git使用教程
    22篇
  • 从零开始系列
    86篇
  • USB协议
    28篇
  • linux设备模型
    15篇
  • input子系统
    7篇
  • 嵌入式
    8篇
  • linux
    6篇
  • linux驱动
    12篇
  • C/C++
    2篇
  • arm
  • 计算机基础
    1篇
  • linux中断
    1篇
  • linxu驱动基础
    13篇
  • Makefile
    1篇
  • 工具使用
    2篇
  • linux基础
    2篇
  • 问题解决
    3篇
  • 文件系统
    4篇
  • 操作系统
    2篇
  • 设备树
    30篇
  • git使用
    22篇
To_run_away
    • 如果文章对你有用,请作者喝个咖啡。 种树的最好时间是十年前,其次是现在。
  • 最近
  • 文章
  • 资源
  • 问答
  • 课程
  • 帖子
  • 收藏
  • 关注/订阅

wsl下安装交叉编译问题解决

因为我的交叉编译工具是32位的,所以win10下的wsl没法使用使用如下命令 arm-none-linux-gnueabi-gcc -v会出现下面的告警/usr/local/arm/arm-2014.05/bin/arm-none-linux-gnueabi-gcc: line 15:/usr/local/arm/arm-2014.05/bin/arm-none-linux-gnueabi-gcc:cannotexecutebinaryfile:Execformaterro...
原创
933阅读
2评论
0点赞
发布博客于 9 月前

嵌入式linux单板上开启telnet功能

第一步,在文件系统中开启,开启这些命令。当然一般是开启的(busybox-1.28.4)Networking Utilities ---> ...... [*] telnet (8.7 kb) ...
原创
1936阅读
0评论
1点赞
发布博客于 2 年前

从零开始之驱动开发、linux驱动(七十一、电容触摸屏驱动)

一、电容式触摸屏检测原理基本原理是利用充电时间检测电容大小,从而通过检测出电容值的变化来获知触摸信号。电容屏的最上层是玻璃(不会像电阻屏那样形变),核心层部分也是由ITO材料构成的,这些导电材料在屏幕里构成了人眼看不见的静电网,静电网由多行X轴电极和多列Y轴电极构成,两个电极之间会形成电容。触摸屏工作时,X轴电极发出AC交流信号,而交流信号能穿过电容,即通过Y轴能感应出该信号,当交流电穿越时电...
原创
3543阅读
3评论
8点赞
发布博客于 2 年前

从零开始之应用发开、linux应用(三、应用调试之打印错误)

使用gdb调试,可以发现一些我们理解错误的逻辑问题,一般情况下我都是使用gdb进行调试的。但有时我们的应用程序很大,我们不知道哪里出的问题,即gdb调试不知道在哪里打断点(当然也可以单步或者自己定几个断点),这个时候就需要有别的方法来找到出错的大概位置。假设我们在程序中,对为初始化的指针赋值。或者对已经释放的内存进行了使用,很容易导致段错误。这里我以一个简单的例子为例来说明。...
原创
874阅读
0评论
1点赞
发布博客于 2 年前

从零开始之应用发开、linux应用(二、应用调试之gdb)

Linux中包含一个很强大的调试工具GDB(GNU Debuger),可以用它来调试C和C++程序。什么是GDB?GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。与Window下的IDE不同,GDB是纯命令行执行的,并没有图形界面方法。问题:既然windows下有对用户友好的图形界面的调试工具了。那么为什么我们还需要回到命令行的模式呢?如果我们是在UNIX平台...
原创
1086阅读
0评论
0点赞
发布博客于 2 年前

从零开始之应用发开、linux应用(一、应用调试之strace)

strace是个功能强大的Linux调试分析诊断工具,可用于跟踪程序执行时进程系统调用(system call)和所接收的信号,尤其是针对源码不可读或源码无法再编译的程序。 在Linux系统中,用户程序运行在一个沙箱(sandbox)里,用户进程不能直接访问计算机硬件设备。当进程需要访问硬件设备(如读取磁盘文件或接收网络数据等)时,必须由用户态模式切换至内核态模式,通过系统调用访问...
原创
1307阅读
0评论
0点赞
发布博客于 2 年前

从零开始之驱动开发、linux驱动(七十、4.19内核nfs挂载只读问题的延伸)

之前移植的3.16.57版本的内核,使用2018年7月的busybox自己构建的这个根文件系统。使用3.16.57版本的内核用nfs挂载,这个根文件系统是一个可读可写的内核。但后面为了学习设备树,移植了4.19版本的内核,发现文件系统成了只读的文件系统。开始是怀疑我pc上了nfs服务器那里设置的有问题,后面用3.16.57版本内核验证了发现是ok的。那么只能怀疑4....
原创
504阅读
0评论
0点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(六十九、内核调试篇--内核卡死分析)

内核卡死有很多种可能,驱动程序因为逻辑问题,出现死循环 共享资源出现死锁 系统跑飞等一般情况下,系统跑飞内核会打印Oops信息。有了Oops信息,我们就可以通过上一节的方法来推断出出错位置。而死锁或者驱动程序死循环并不会打印Oops信息。这个时候需要我们自己打印出来,出错位置的寄存器( r0 ~ r15等)信息来反推出出错位置。因为这个时候卡住的位置基本已经是...
原创
825阅读
0评论
0点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(六十八、内核调试篇--Oops解析)

什么是Oops?从语言学的角度说,Oops应该是一个拟声词。当出了点小事故,或者做了比较尴尬的事之后,你可以说"Oops",翻译成中国话就叫做“哎呦”。“哎呦,对不起,对不起,我真不是故意打碎您的杯子的”。看,Oops就是这个意思。在Linux内核开发中的Oops是什么呢?其实,它和上面的解释也没什么本质的差别,只不过说话的主角变成了Linux。当某些比较致命的问题出现时,我们的Linux...
原创
635阅读
0评论
0点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(六十七、内核调试篇--printk使用)

printk的使用我们在内核,驱动调试的时候使用的非常多比如前面在调试usb驱动的时候#include <linux/init.h>#include <linux/usb/input.h>#include <linux/hid.h>static int usb_simple_probe(struct usb_interface *intf,...
原创
1131阅读
0评论
0点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(六十六、内核调试篇--printk原理)

上一节我们已经看到了console的注册,prink的基础就是console,所以本节我们主要看内核中prink的实现。/** * printk - print a kernel message * @fmt: format string * * This is printk(). It can be called from any context. We want it t...
原创
2359阅读
0评论
1点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(六十五、内核调试篇--串口驱动)

上一节我们分析了bootoader中传过来的cmdline中的命令是如何解析并执行的。同时也是对bootloader中传过来的console进行了记录。console也就是我们所说的控制台,可以是任何常见的输出设备,比如serial,比如framebuffer,比如网口。本节主要以最常见的串口为例说明。如果有搜索过内核代码,可以看到绝大多数的console都是串口设备。所...
原创
814阅读
0评论
0点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(六十四、内核调试篇--基础知识2[console的建立])

上一节我们分析的earlay的printk知识,本节主要分析一下在内核启动后的printk的知识。主要是通过下面函数实现的after_dashes = parse_args("Booting kernel", static_command_line, __start___param, __stop___param - __start___param, ...
原创
449阅读
0评论
0点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(六十三、内核调试篇--基础知识1[earlyprintk建立过程])

我们知道,内核中使用__section设置了很多的段属性,使用段属性可以很方便的对函数调用时间分层。比如我们之前常见的subsys_initcall,就要比module_init更早的执行,因为subsys_initcall在驱动中通常是bus和class,驱动程序调用执行需要class和bus已经创建才能执行驱动函数。关于这点我之前的博文已经有过分析。https://blog....
原创
417阅读
0评论
0点赞
发布博客于 2 年前

linux设备模型十四(hotplug和mdev使用)

mdev有两个主要的用途:初始化常用设备和动态更新。这两个用途都要需要内核的sysfs的支持并且需要把sysfs挂载到/sys。对于动态更新来说,你也需要开启内核的热插拔功能。以下是几个典型的代码段,从初始化脚本摘录:[0] mount -t proc proc /proc[1] mount -t sysfs sysfs /sys[2] echo /sbin/mdev &...
原创
776阅读
0评论
0点赞
发布博客于 2 年前

linux设备模型十三(mdev原理)

udev 和mdev 是两个使用uevent 机制处理热插拔问题的用户空间程序,两者的实现机理不同。udev 是基于netlink 机制的,它在系统启动时运行了一个deamon 程序udevd,通过监听内核发送的uevent 来执行相应的热拔插动作,包括创建/删除设备节点,加载/卸载驱动模块等等。mdev 是基于uevent_helper 机制的,它在系统启动时修改了内核中的uevnet_...
原创
1110阅读
0评论
0点赞
发布博客于 2 年前

linux设备模型十二(热拔插hotplug)

我们知道,一个最简单的字符设备驱动应该是下面这个形式。#include <linux/fs.h> #include <linux/init.h> /* 定义一个open函数 */static int first_drv_open(struct inode *inodep, struct file *filep){ return 0;}...
原创
1073阅读
0评论
1点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(六十二、PL330 DMA控制器驱动)

pl330 dma驱动比较复杂,最近没时间研究这个的细节。这个稳定暂留,后面补上。
原创
487阅读
0评论
0点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(六十一、PL330 DMA控制器)

一、DMA介绍首先简单介绍下什么是DMAC(Direct Memory Access Controller),DMAC 是一个自适应先进的微控制器总线体系的控制器,它由ARM公司设计并基于PrimeCell技术标准,DMAC提供了一个AXI接口用来执行DMA传输,以及两个APB接口用来控制这个操作,DMAC在安全模式技术下用一个APB接口执行TrustZone技术,其他操作则在非安全模式下执行...
原创
815阅读
0评论
1点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(六十、ARM AMBA总线介绍)

AMBA片上总线AMBA总线:AMBA总线是ARM研发的(Advanced Microcontroller Bus Architecture)提供的一种特殊的机制,可以将RISC处理器集成在其他IP芯核和外设中,它是有效连接IP核的“数字胶”,并且是ARM复用策略的重要组件。它不是芯片与外设之间的接口,而是ARM内核与芯片上其他元件进行通信的接口。2.0版本AMBA标准定义了三组总线:...
原创
710阅读
0评论
0点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(五十九、linux4.19的IIC驱动的编写和使用3)

本节不需要编写驱动,直接可以使用i2c-dev中编写号的驱动,来进行使用。也就是说这是一个完全的应用程序。程序在后面的代码仓库。这里说一下原理。正常情况下,每一个adaptor,都会在i2c_dev_init函数调用时创建一个设备在/dev/i2c-x这要求一个前提,adaptor必须在,i2c_dev_init执行之前先执行。内核的策略就是adaptor使用...
原创
487阅读
0评论
0点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(五十八、linux4.19的IIC驱动的编写和使用2)

下面说的这种方式其实和前面的很相似1.在设备树文件中,设备所在的i2c总线下面定义好设备&i2c0 { status = "okay"; eeprom@50 { compatible = "atmel,24c02"; reg = <0x50>; }; };驱动只需要增加一个of_ma...
原创
427阅读
0评论
0点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(五十七、linux4.19的IIC驱动的编写和使用1)

第一点,配置内核支持i2cDevice Drivers ---> I2C support ---> <*> I2C device interface [*] Autoselect pertinent helper modules I2C Hardware Bus s...
原创
737阅读
0评论
0点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(五十六、linux4.19的IIC驱动adaptor的注册)

上一节我们看到下面这函数了。/** * i2c_add_adapter - declare i2c adapter, use dynamic bus number * @adapter: the adapter to add * Context: can sleep * * This routine is used to declare an I2C adapter whe...
原创
469阅读
0评论
0点赞
发布博客于 2 年前

设备树学习(二十三、aliases节点分析)

在设备树中有一个叫做aliases的节点:/ { #address-cells = <1>; #size-cells = <1>; aliases { csis0 = &csis0; fimc0 = &fimc0; fimc1 = &fimc1; fimc2 = &fimc2; i2c0 = &i...
原创
3506阅读
0评论
3点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(五十五、linux4.19的IIC驱动adaptor)

前面用了8节内容已经分析了2.6.35.7内核的iic驱动,可以发现,在linux中iic驱动还是稍微有些复杂的。在linux4.19内核中,其实百分之85~90还是和2.6内核的一样的。关于4.19的i2c,我大概会用两三节来进行分析,主要还是对硬件这个设备树引入后的变化分析。唯一不同的在于,linux内核引入设备树后,驱动层和硬件相关的内容都是通过设备树文件来指定。...
原创
594阅读
0评论
0点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(五十四、linux2.6下的IIC总结[8])

2.6.35.7内核的iic设备已经分析完毕了。我们这里做一下总结。首先linux下注册iic设备的方式是有五种的。这里我们对每一种的注册和顺序进行简单总结。这里我们的参考资料如下Documentation/i2c/instantiating-devices第一种方式:在mach-xxxx.c文件里面指定号设备名称,地址。static struct i2c...
原创
309阅读
0评论
0点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(五十三、linux下的IIC设备驱动cdev[7])

i2c-dev.c文件完全可以被看作是一个I2C设备驱动, 不过, 它实现的i2c_client是虚拟、 临时的, 主要是为了便于从用户空间操作I2C外设。 i2c-dev.c针对每个I2C适配器生成一个主设备号为89的设备文件, 实现了i2c_driver的成员函数以及文件操作接口, 因此i2c-dev.c的主体是“i2c_driver成员函数+字符设备驱动”。#define I2C_...
原创
243阅读
0评论
0点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(五十二、linux下的IIC设备驱动[6])

I2C设备驱动要使用i2c_driver和i2c_client数据结构并填充i2c_driver中的成员函数。 i2c_client一般被包含在设备的私有信息结构体中, 而i2c_driver则适合被定义为全局变量并初始化。这种驱动通常是相对稳定的驱动程序,通常不需要改动。下面给出内核中已被初始化的i2c_driver。static struct i2c_driver ...
原创
358阅读
0评论
0点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(五十一、linux下的IIC总线的通讯方法[5])

我们需要为特定的I2C适配器实现通信方法, 主要是实现i2c_algorithm的functionality() 函数和master_xfer() 函数。functionality() 函数非常简单, 用于返回algorithm所支持的通信协议。linux中定义了一下方法/* To determine what functionality is present */#define...
原创
347阅读
0评论
0点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(五十、linux下的IIC适配器的注册[4])

由于I2C总线控制器通常是在内存(寄存器)上的, 所以它本身也连接在platform总线上, 要通过platform_driver和platform_device的匹配来执行。 因此尽管I2C适配器给别人提供了总线, 它自己也被认为是接在platform总线上的一个客户。 Linux的总线、 设备和驱动模型实际上是一个树形结构, 每个节点虽然可能成为别人的总线控制器, 但是自己也被认为是从上一级总...
原创
318阅读
0评论
0点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(四十九、linux下的IIC核心层的接口[3])

I2C核心中的主要函数如下:(1) 增加/删除i2c_adapterint i2c_add_adapter(struct i2c_adapter *adap);void i2c_del_adapter(struct i2c_adapter *adap);增加一个adadptor/** * i2c_add_adapter - declare i2c adapter, use...
原创
442阅读
0评论
1点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(四十八、linux下的IIC核心层的建立[2])

I2C核心(drivers/i2c/i2c-core.c) 中提供了一组不依赖于硬件平台的接口函数, 这个文件一般不需要被工程师修改, 但是理解其中的主要函数非常关键, 因为I2C总线驱动和设备驱动之间以I2C核心作为纽带。首先看一下i2c核心层的创建函数。static int __init i2c_init(void);static void __exit i2c_exit(v...
原创
430阅读
0评论
1点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(四十七、linux下的IIC框架【1】)

I2C总线仅仅使用SCL、 SDA这两根信号线就实现了设备之间的数据交互, 极大地简化了对硬件资源和PCB板布线空间的占用。 因此, I2C总线非常广泛地应用在EEPROM、 实时钟、 小型LCD等设备与CPU的接口中。如果在裸机情况下直接操作I2C,其实很简单,只要正确把握IIC的操作时序就可以了。https://blog.csdn.net/qq_16777851/article/d...
原创
716阅读
0评论
1点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(四十六、IIC协议原理)

IIC协议是一个板级异步双向的串行协议。只使用一根数据一根时钟两根线,通常频率都不会很高,通常我们使用在几百Khz,目前最高的器件能达到Mhz级别。IIC协议的缺点:数据线只有一根既要主机传输又要从机传输,所以传输速度很慢。主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。主器件同时也负责终止一次传输。主器件的每一次启动传...
原创
509阅读
0评论
0点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(四十五、DM9000网卡驱动)

这里我们肯定不是要从零开始编写网卡驱动的。因为编写网卡驱动时,需要网络基础知识,特别是网络底层的知识,目前还没学。将来我可能选择在,网络,图像视屏,或USB这个三个方向,选择一个深入钻研。这里主要对一个真实的网卡的框架进行分析,底层和物理寄存器或网络协议相关的就略过。4.19版本的内核,平台设备这边,都是用的设备树。之前开的那个设备树专栏的学习已经有了效果,下...
原创
1034阅读
0评论
2点赞
发布博客于 2 年前

Git使用学习(二十二、团队协作冲突的解决)

但凡是团队合作,就一定会出现冲突。假设项目经理张小龙在它的本地改了一个bug之后,推送到了远程库。这时项目组的小张肯定不知道项目经理的推送,更不知道项目经理张小龙改了那个位置的内容。此时假设小张也修改了这个位置,此时也向远程库推送自己的修改。此时因为出现冲突,小张推送会失败。此时小张必须先把远程库的拉取到本地,完成合并后在进行推送。我们在下面演示一下上面的情况。...
原创
437阅读
0评论
0点赞
发布博客于 2 年前

Git使用学习(二十一、远程库github操作[4]拉取)

上一节中,项目组员,小张已经把自己的本地库的内容推送到了远程库github。本节项目负责人张小龙,准备把远程库的内容拉取到他的本地。然后检查无误后把远程库合并到他的本地开发中。可以看到,拉取之前文件里面的内容是wechat 0.1 version当然,拉取(fetch)或(pull)都从远程来读文件,所以这里是不需要登录操作的。当然我们这里拉取的文件其实并不会...
原创
359阅读
0评论
1点赞
发布博客于 2 年前

Git使用学习(二十、远程库github操作[3]邀请加入团队和push)

上一节我们学习到,项目组成员,因为没有被邀请加入团队,所以不能向远程库推送自己的本地更改。这里开始我们就让项目的负责人,邀请项目组成员加入这个项目。下面给出操作步骤输入邀请人的github账号邀请创建后,可以看到,已经有了协作人的信息接下来要把邀请链接发生给,要求加入的人。当然,这个链接可以使用任何方式,Q...
原创
700阅读
0评论
0点赞
发布博客于 2 年前

Git使用学习(十九、远程库github操作[2]clone)

上一节中项目经理张小龙先生已经把自己搞的WeChat 0.1版本放到了远程仓库了。接下来WeChat项目组的成员,小张需要把远程库的0.1版本的WeChat clone到他的本地。然后进行增加功能。这里我们换一个方式。使用Windows下的git来实现,成员小张的所有操作。小张先从远程仓库中拿到这个项目的clone地址。然后执行克隆操作git clone r...
原创
188阅读
0评论
0点赞
发布博客于 2 年前

Git使用学习(十八、远程库github操作[1]creat 和 push)

什么是远程库?远程库这个叫法主要是为了和本地库做区分。远程库主要是为了集中管理一些主要的版本,以及为了方便其它开发者获取和更新这个远程库。如何使用远程库?假设一个项目由两个工程师负责,一个是项目经理,一个是项目组员。1.开始由项目经理在它本地新建了一个本地库。同时由项目经理在远程服务器上创建一个远程库。此时如下所示,两个库都是空的。2.接下...
原创
175阅读
0评论
0点赞
发布博客于 2 年前

Git使用学习(十七、Git的分支管理机制)

Git 的分支,其实本质上仅仅是指向提交对象的可变指针。 Git 的默认分支名字是 master。 在多次提交操作之后,你其实已经有一个指向最后那个提交对象的 master 分支。 它会在每次的提交操作中自动向前移动。注:Git 的 “master” 分支并不是一个特殊分支。 它就跟其它分支完全没有区别。 之所以几乎每一个仓库都有 master 分支,是因为 git init 命令默认创建它,...
原创
258阅读
0评论
0点赞
发布博客于 2 年前

Git使用学习(十六、Git的文件管理机制)

集中式版本控制工具的文件管理机制以文件变更列表的方式存储数据。这类系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累计的差异。每次的上传到服务器上文件,保存在服务器的部分都是这次和上次版本之间的差异。如果要从服务器更新到本地也是需要把原始文件的版本和每次的差异 都合并起来,组成一个版本。这样的版本我们可以看到,有点是节约服务器的存储空间,但缺点也很明显,速度慢。...
原创
933阅读
0评论
0点赞
发布博客于 2 年前

Git使用学习(十五、哈希)

哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度(哈希碰撞)不同,但是有一下几个共同点。不管输入数据量多大,对于同一个哈希算法,得到的加密结果长度固定。 哈希算法确定,输入数据确定,输出结果能够保证不变。 哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大。 哈希算法不可逆这里我用我电脑上的一个加密工具做一个演示。新建了一个txt的文件,里...
原创
260阅读
0评论
0点赞
发布博客于 2 年前

Git使用学习(十四、解决分支合并后产生的冲突)

什么时候会产生合并冲突?假如说我们目前我们有两个分支master和hot_fix,目前两个分支的内容是一样的。假设master分支修改了它的工作区的apple.txt文件,并做了提交。而hot_fix分支也修改了它的工作区的apple.txt文件,并做了提交。这里假设master分支修改的内容和hot_fix分支修改的内容不一样。这个时候,无论是master分支想...
原创
1808阅读
0评论
0点赞
发布博客于 2 年前

Git使用学习(十三、分支的简单操作)

如何查看当前所在的分支?使用git status可以查看当前所在分支,默认创建没切换过分支都是在master分支上。如何查看这个项目所有的分支?使用git branch -v如何创建分支?使用git branch 分支名下面我们创建一个hot_fix分支这里我们可以看到,新创建的分支和主分支的内容完全一样。如何切换分支?使用git ...
原创
163阅读
0评论
0点赞
发布博客于 2 年前

Git使用学习(十二、分支)

什么是分支?在版本控制过程中,使用多条线,同时推进多个任务。在git的版本库初始化好之后,默认会有一个分支,叫master分支假设我们开开发一个叫WeChat的项目。这里基本的底层的东西由团队负责人开始搭建好,做出了一个基本的底层,这个版本只支持基本的两个人之间的文字聊天功能。接下来要让这个WeChat项目,增加两个功能,一个是语音消息功能,一个...
原创
177阅读
0评论
0点赞
发布博客于 2 年前

Git使用学习(十一、文件比较操作)

git中文件的比较操作是用linux中的diff命令来完成的,其格式也是按照linux中的diff来显示的假设我们本地新建了一个文件,叫,apple.txt,里面的内容是6行的apple字符。接下来把这个文件加入到暂存区。之后修改工作区的文件。使用diff命令来对比,工作区和暂存区的文件带-的红色,表示工作区和暂存区相比,减少的内容,而带+de绿色部分,...
原创
207阅读
0评论
0点赞
发布博客于 2 年前

Git使用学习(十、文件的删除和撤销)

第一种:一个文件加入本地库中之后,删除工作目录下的这个文件,之后提交没这个文件的工作目录到本地库。第一步:创建一个文件,加入到本地库此时工作区,暂存区,本地库都有这个test.txt文件存在。第二步,删除文件,提交本次更改这次删除文件后的提交要注意一个点,就是git add这个命令对于删除了的文件的使用。可以看一下我之前的使用。直接使用gi...
原创
173阅读
0评论
0点赞
发布博客于 2 年前

Git使用学习(九、git命令参数的特点)

git的命令参数分为长参数和短参数比如我们前面的提交本地库的命令参数-m 表示后面跟的是一个提交消息记录。git commit -m "commmint message log" [pathname]这的-m是一个短参数。当然也可以使用这个的长参数,写法如下git commit --message="commmint message log" [pathna...
原创
164阅读
0评论
0点赞
发布博客于 2 年前

Git使用学习(八、hard和soft以及mixed参数对比)

开始之前,先看上一节的版本回滚的命令git reset --hard reset有回滚的意思,为什么这个命令要带--hard这个参数呢?那这个git reset 是不是还有其它参数呢,不然就一个参数,就没必要敲了。这里我们看一下git中关于reset的帮助文档。git help reset 可以看到git reset可带的参数很多,这里我们主要看下面这三个。...
原创
226阅读
0评论
0点赞
发布博客于 2 年前

Git使用学习(七、版本回滚)

git版本回滚的原理git中有一个全局变量叫HEAD,HEAD这个指针指向的版本就是当前版本。如果我们需要调出某个版本的记录,需要让HEAD指针指向这个版本,然后再从本地仓库拉取到工作区间就可以了。git进行版本回滚的方式有三种基于索引值(哈希值)的回滚 基于^符号 基于~符号这里我们主要来说一下基于索引值的回滚。这里要说一个命令,...
原创
261阅读
0评论
0点赞
发布博客于 2 年前

Git使用学习(六、查看历史记录的几种方式)

git中有个命令叫git log,可以用来查看版本的更新日志。简单是使用如下,也是上一节内容增加的三次版本提交。git log为了方便学习,我多增加几条版本更新因为一屏放不完,可以使用空格来一屏一屏的切换,也可以使用vim的命令来一行一行或者指定到哪一行的切换等。上面这种显示确实不方便查看,所以git可以使用一种漂亮显示的方式查看记录 git ...
原创
648阅读
0评论
0点赞
发布博客于 2 年前

Git使用学习(五、git的add和status命令)

git工具的所有命令都是以git开头,就像linux中的命令那样,git是主命令,后面需要跟上其它副命令。首先学习的是查看状态的命令。假设我们git init后的目录是没文件的。查看后,打印出下面三句信息第一句表明我们现在在主分支(分支后面再学习)第二句表明git还没提交过文件到本地仓库第三局表明没有可提交的信息,建议我们自己创建或者拷贝一份文件后再使用git a...
原创
883阅读
0评论
0点赞
发布博客于 2 年前

Git使用学习(四、git的初始化)

初始化本地仓库git init初始化之后,会在当前目录下创建一个.git的目录。我这边的工程里面的文件可能会随着我学习内容的变动,而git的使用暂时就一直在这个目录下(我们用Git肯定是要做大项目的^V^)。这个里面是一个虚拟网卡的驱动,暂时还在学习。里面内容可以忽略掉。只关注git本身的学习。.git目录初始化之后会放置一些文件或文件夹,这个就是g...
原创
314阅读
0评论
0点赞
发布博客于 2 年前

Git使用学习(三、git和代码托管中心)

什么是代码托管中心?我们看过上一节git基础的那图片,有一个仓库没说,这个就是远程仓库。代码托管中心的任务,就是用来维护这个远程的仓库。最著名的git的代码托管中心就是github,国内还有比如码云之类比较大的托管中心。当然公司里面也可以自己搭建服务器建立自己的托管中心。本地仓库和远程如何交互?这里要说的是,git和linux很相似的是对...
原创
386阅读
0评论
0点赞
发布博客于 2 年前

Git使用学习(二、git安装和基础)

Git的安装非常简单,这里就不贴出来了。分享几个其它博主的安装教程,不会的话参考。https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Githttps://jingyan.baidu.com/article/9f7e7ec0b17cac6f2815548d.htmlhttps://www.c...
原创
393阅读
0评论
1点赞
发布博客于 2 年前

Git使用学习(一、为什么要有版本管理)

问题?假设你在的公司要上线一个新功能,你们开发团队为实现这个新功能,写了大约5000行代码,上线没2天,就发现这个功能用户并不喜欢,你老板让你去掉这个功能,你怎么办?你说简单,直接把5000行代码去掉就行了,但是现在会出现一个问题,你的这个写了3周功能,也许你已经不记得新增加了哪5000行代码了?所以你急需要一个工具,能帮你记录每次对代码做了哪些修改,并且可以轻易的把代码回滚到历史上的某个状态...
原创
590阅读
0评论
1点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(四十四、虚拟网卡驱动)

网卡驱动的书写格式很简单1.申请一个网卡设备结构体2.设置这个结构体,硬件相关初始化3.注册这个网卡设备参考的韦东山老师的视屏,代码如下#include <linux/module.h>#include <linux/ioport.h>#include <linux/netdevice.h>#include <lin...
原创
728阅读
0评论
0点赞
发布博客于 2 年前

从零开始学USB(二十八、usb鼠标驱动驱动实例分析[3]传输)

我们分析的这个usb鼠标是一个输入类型的中断传输。既然是输入类型,必然要做好接收。而一个端点中,一次事务中,传输的的最大字节数即量是在端点描述符中定义的。/* USB_DT_ENDPOINT: Endpoint descriptor */struct usb_endpoint_descriptor { __u8 bLength; __u8 bDescriptorTyp...
原创
1864阅读
3评论
2点赞
发布博客于 2 年前

从零开始学USB(二十七、usb鼠标驱动驱动实例分析[2]管道)

端点是USB设备的唯一可识别部分,其是主机和设备之间的通信流的终点。管道,就是一个USB主机和USB设备端点之间的数据传输的通道。站在主机的角度,它的目的是设备的某个端点。而管道这算是主机和端点之间的连线。这里我们先看一下管道在usb里的定义/* * For various legacy reasons, Linux has a small cookie that'...
原创
924阅读
0评论
2点赞
发布博客于 2 年前

从零开始学USB(二十六、usb鼠标驱动驱动实例分析[1]简介)

这个驱动是在上一节的最简单的usb驱动基础上增加了输入子系统和usb包的获取和请求。首先先给出一个稍微简化了一下的usb的鼠标驱动,这里只做了鼠标的三个按键。为了方便验证,这里用鼠标的左键,右键和中间分别作为标准按键的l s enter 键。#include <linux/kernel.h>#include <linux/slab.h>#includ...
原创
2008阅读
0评论
3点赞
发布博客于 2 年前

从零开始学USB(二十五、4.19版本的内核支持usb驱动)

用的是S5PV210的SOC1.设备树支持设备树设备树默认是支持USB驱动的。如下: usbphy: usbphy@ec100000 { compatible = "samsung,s5pv210-usb2-phy"; reg = &lt;0xec100000 0x100&gt;; sa...
原创
1802阅读
0评论
1点赞
发布博客于 2 年前

设备树学习(二十九、番外篇-中断子系统之workqueue使用)

workqueue使用举例#include &lt;linux/fs.h&gt; #include &lt;linux/init.h&gt; #include &lt;linux/module.h&gt;#include &lt;linux/gpio.h&gt;#include &lt;asm/irq.h&gt;#include &lt;asm/io.h&gt;#...
原创
921阅读
0评论
1点赞
发布博客于 2 年前

设备树学习(二十八、番外篇-中断子系统之workqueue处理work[4])

本文参考了下面两位博主的文章,采用4.18版本的内核分析。http://www.wowotech.net/sort/irq_subsystemhttps://blog.csdn.net/chenying126/article/details/78786406一、前言本文主要讲述下面两部分的内容:1、将work挂入workqueue的处理过程2、如何处理挂入workqu...
原创
1449阅读
1评论
1点赞
发布博客于 2 年前

设备树学习(二十七、番外篇-中断子系统之workqueue创建[3])

一、前言前一节我们知道了可以用下面几个函数来创建workqueue。#define alloc_ordered_workqueue(fmt, flags, args...) \ alloc_workqueue(fmt, WQ_UNBOUND | __WQ_ORDERED | \ __WQ_ORDERED_EXPLICIT | (flags), 1, ##args)#de...
原创
566阅读
0评论
0点赞
发布博客于 2 年前

设备树学习(二十六、番外篇-中断子系统之CMWQ概述[2])

一、前言一种新的机制出现的原因往往是为了解决实际的问题,虽然linux kernel中已经提供了workqueue的机制,那么为何还要引入CMWQ(Concurrency Managed Workqueue)呢?也就是说:旧的workqueue机制存在什么样的问题?在新的cmwq又是如何解决这些问题的呢?它接口是如何呈现的呢(驱动工程师最关心这个了)?如何兼容旧的驱动呢?本文希望可以解开这些谜...
原创
186阅读
0评论
0点赞
发布博客于 2 年前

设备树学习(二十五、番外篇-中断子系统之workqueue[1])

本文参考蜗窝大神的中断系列教程http://www.wowotech.net/irq_subsystem/workqueue.html一、前言在许多情况下,需要异步流程执行上下文,而workqueue(wq)API是此类情况最常用的机制。当需要这样的异步执行上下文时,描述要执行哪个函数的工作项放在队列中。 独立线程用作异步执行上下文。 该队列称为workqueue,该线程称为work...
原创
377阅读
0评论
0点赞
发布博客于 2 年前

从零开始学USB(二十四、最简单的USB驱动开始)

18年底,花了2个月啃学习USB2.0协议。现在终于开始要派上用场了,开始和代码打交道了。当然,现在只是从简单的开始usb设备驱动开始,后面再慢慢的分析usb总线,usb的hub之类。先给出代码,后面再一句一句分析。#include &lt;linux/kernel.h&gt;#include &lt;linux/slab.h&gt;#include &lt;linux/m...
原创
4532阅读
0评论
5点赞
发布博客于 2 年前

linux设备模型十一(device resource management)

注:本文参考蜗窝大神的文章,采用4.18版本的内核代码来分析http://www.wowotech.net/device_model/device_resource_management.html1. 前言相信每一个写过Linux driver的工程师,都在probe函数中遇到过下面的困惑:要顺序申请多种资源(IRQ、Clock、memory、regions、ioremap、dm...
原创
965阅读
0评论
0点赞
发布博客于 2 年前

修改/tmp目录大小

sudo mount -t tmpfs -o size=100M none /tmp遇到的问题是编译内核,说tmp空间不够了。使用上面命令增加tmp空间就就够了
原创
1445阅读
0评论
1点赞
发布博客于 2 年前

设备树学习(二十四、番外篇-中断子系统之tasklet)

本文继续参考蜗窝大神的博客,使用4.19的内核进行分析,同时加入一些自己的理解和举例。http://www.wowotech.net/irq_subsystem/tasklet.html一、前言对于中断处理而言,linux将其分成了两个部分,一个叫做中断handler(top half),属于不那么紧急需要处理的事情被推迟执行,我们称之deferable task,或者叫做...
原创
559阅读
0评论
0点赞
发布博客于 2 年前

设备树学习(二十三、番外篇-中断子系统之softirq)

既然开始学了,那么还是一次把中断的所有知识都系统的学一下。刚好有蜗窝大神的博客做指引。http://www.wowotech.net/irq_subsystem/soft-irq.html一、前言对于中断处理而言,linux将其分成了两个部分,一个叫做中断handler(top half),是全程关闭中断的,另外一部分是deferable task(bottom half),属于...
原创
327阅读
0评论
0点赞
发布博客于 2 年前

设备树学习(二十二、番外篇-中断子系统之驱动申请API)

本文继续参照蜗窝大神的文档,采用4.19内核的代码学习,同时会有自己的一些举例和部分代码分析http://www.wowotech.net/sort/irq_subsystem一、前言本文主要的议题是作为一个普通的驱动工程师,在撰写自己负责的驱动的时候,如何向Linux Kernel中的中断子系统注册中断处理函数?为了理解注册中断的接口,必须了解一些中断线程化(threaded ...
原创
546阅读
0评论
0点赞
发布博客于 2 年前

设备树学习(二十一、番外篇-中断子系统之简单举例使用)

这里以一个按键程序为例进行简单说明首先是驱动程序,基本和之前3.16.57版本的一样的,唯一不同就是增加了of_match_table 的一个和设备树节点的匹配表而已#include &lt;linux/fs.h&gt; #include &lt;linux/init.h&gt; #include &lt;linux/module.h&gt;#include &lt;linux...
原创
399阅读
0评论
0点赞
发布博客于 2 年前

设备树学习(二十、番外篇-中断子系统之中断号的映射与反映射[二])

上一篇我们留了一个坑,说是通过下面这个函数获取一个中断描述符以及对应的虚拟中断号。本节就分析一下怎样获取。在这个开始之前我们先要说的是,因为中断目前分为两种分配方式,一种是通过一次性定义一个全局数组,每个virq是数组的一项的下标。另一种是内核配置了CONFIG_SPARSE_IRQ,采用动态方式分配每一个中断描述符,这样可以避免某些中断号不使用,而浪费内存空间。...
原创
495阅读
0评论
0点赞
发布博客于 2 年前

设备树学习(十九、番外篇-中断子系统之中断号的映射与反映射[一])

映射值的是通过某一个中断控制器的domain里的某一个物理号,来获取一个全局中断描述符表中的一个全局的中断号。反映射时通过一个全局的中断号,来获取到domain,进而通过domain来找到在一个中断控制器的domain里的某一个物理号。本文先分析反映射,下一篇再分析映射。接着上一篇,有两个函数还没分析。第一个是通过这个中断控制器的domain,为一个在doma...
原创
746阅读
0评论
0点赞
发布博客于 2 年前

设备树学习(十八、番外篇-中断子系统之初始化一个中断控制器)

一、前言上一篇写到,使用设备树的情况下,对所有的中断控制器进行了检索,提取到一个链表中。并对这些中断控制器中所谓的父中断控制器进行检索,并按照等级一次初始化。本文就以一种常见的中断控制器VIC的初始化为例,进行分析。void __init of_irq_init(const struct of_device_id *matches){ ...... ret = des...
原创
566阅读
0评论
0点赞
发布博客于 2 年前

设备树学习(十七、番外篇-中断子系统之内核对中断控制器的解析)

一、介绍关于中断的初始化我们从start_kernel函数开始head_common.S b start_kernel(void); .... local_irq_disable(); /* 关中断 */ .... setup_arch(&amp;command_line); pagi...
原创
549阅读
0评论
0点赞
发布博客于 2 年前

设备树学习(十六、番外篇-中断子系统之IRQ number和中断描述符)

本片继续参考蜗窝大神的文章,且用4.19版本的内核进行透彻的分析。http://www.wowotech.net/sort/irq_subsystem一、前言本文主要围绕IRQ number和中断描述符(interrupt descriptor)这两个概念描述通用中断处理过程。第二章主要描述基本概念,包括什么是IRQ number,什么是中断描述符等。第三章描述中断描述符数据结构...
原创
1067阅读
0评论
0点赞
发布博客于 2 年前

设备树学习(十五、番外篇-中断子系统之IRQ Domain介绍)

之前的文章分析过没使用设备树时,中断是如何初始化的https://blog.csdn.net/qq_16777851/article/details/82556519用一句话总结就是,启动过程,通过mach_id找到,machine_desc,之后调用machine_desc-&gt;init_irq函数来实现,中断的初始化。这种方式,因为所有的中断都是在代码中写死的,不易修改。 ...
原创
2152阅读
1评论
1点赞
发布博客于 2 年前

设备树学习(十四、引入设备树对中断的影响)

在老的内核中断是在完全由所谓的板级支持包中指定的,同时相关的寄存器地址这些也都是在代码中写死的。这种代码没法在多个SOC上通用,这个就导致大量的重复代码出现。在2.6.35.7内核中,SMDKV210单板是这样描述的MACHINE_START(SMDKV210, "SMDKV210") /* Maintainer: Kukjin Kim &lt;kgene.kim@samsung....
原创
888阅读
0评论
1点赞
发布博客于 2 年前

设备树学习(十三、有了设备树后新内核对于设备处理的不同之处)

有了设备树之后,内核对设备的处理蜗窝大神也就在它的设备树引入中说了。http://www.wowotech.net/device_model/why-dt.html 这里我把主要的几句话复制总结出来:针对重复的代码问题,如果不同的SOC使用了相同的IP block(例如I2C controller),那么这个driver的code要从各个arch/arm/mach-xxx中独立出来...
原创
807阅读
0评论
0点赞
发布博客于 2 年前

设备树学习(十二、uboot如何给内核传dtb文件)

在通过tag给内核传参时,是只需要知道内核的地址就可以了。因为uboot给内核传的参数一般是放到内存的某个地址,因为tag所占的内存比较小,所以一般都时放在内存的起始地址+0x100的位置之后直接使用,bootm + 内核所在内存的地址bootm &lt;uImage_addr&gt;在使用了设备树之后,一般我们是这样启动的bootm &lt;uImage_addr&gt;...
原创
4637阅读
1评论
0点赞
发布博客于 2 年前

设备树学习(十一、内核中设备树的操作函数)

 内核中开放出来的接口函数的声明大多在include/linux/下面,关于设备树的都是以ofxxx.h形式命名  这里介绍一下各个头文件中是关于那些的函数of_fdt.h // dtb文件的相关操作函数, 我们一般用不到, 因为dtb文件在内核中已经被转换为device_node树(它更易于使用)b. 处理device_nodeof.h ...
原创
1568阅读
0评论
0点赞
发布博客于 2 年前

设备树学习(十、在根文件系统中查看设备树)

 在设备树第七节中,我们知道了在内核启动时,是把dtb文件所在的内存块保留了下来。而这个内存块是可以在内核中查看的。查看的位置在sys文件系统中。因为dtb文件是二进制文件,所以要用hexdump命令来查看。 hexdump -C /sys/firmware/fdt 部分信息如下,和我们传给内核的dtb文件里的完全一样 当然在/sys/firmware/文件...
原创
4542阅读
1评论
2点赞
发布博客于 2 年前

设备树学习(九、platform_device和platform_driver如何让匹配)

 关于这个问题,我之前在分析2.6内核的时候是已经分析过的。https://blog.csdn.net/qq_16777851/article/details/81350037 同时在总线驱动模型章节也是从基础知识学习,到最终实现过一个简单的bus的,想要深入学习,最好看下面这个专栏。(基于4.x内核)https://blog.csdn.net/qq_16777851/colu...
原创
2494阅读
1评论
5点赞
发布博客于 2 年前

设备树学习(八、设备节点到平台设备的转换)

一、那些节点可以转换成平台设备?首先,要说明的是设备树最初是为了解决大量重复的platform_device在mach-xx目录下,但在实现的过程重,设备树体现的是一个电路板的信息,添加了bootargs,memory,clock,interrupt等非platform_device的节点,这样就不能对所有的device_node转换成platform_device。(memory,int...
原创
1885阅读
0评论
2点赞
发布博客于 2 年前

设备树学习(七、dtb到设备节点的转换)

首先我们看一下内核中对一个设备节点的表示struct device_node { const char *name; //节点的名字 const char *type; //device_type属性的值 phandle phandle; //对应该节点的phandle...
原创
2672阅读
1评论
2点赞
发布博客于 2 年前

设备树学习(六、设备树对运行时配置信息的处理)

上一节学习了在linux启动期间如何找到的最佳匹配的单板machine_desc;‘asmlinkage __visible void __init start_kernel(void) setup_arch(&amp;command_line); mdesc = setup_machine_fdt(__atags_pointer);在setup_machine_...
原创
1097阅读
0评论
0点赞
发布博客于 2 年前

设备树学习(五、设备树对平台信息的处理machine_desc)

1. 简介内核提供了一个重要的结构体struct machine_desc ,这个结构体在内核移植中起到相当重要的作用,内核通过machine_desc结构体来控制系统体系架构相关部分的初始化。machine_desc结构体的成员包含了体系架构相关部分的几个最重要的初始化函数。同时一个内核可以支持多块单本,所以一个zImage里可以包含多个machine_desc结构体。他们通常被组织成一个特...
原创
1537阅读
0评论
0点赞
发布博客于 2 年前

设备树学习(四、内核head.S对uboot传参的处理)

之前在uboot学习中分析bootm原理的,我们知道了uboot启动内核是通过传入三个参数来启动的。kernel_entry为内核zImage在内存的首地址。之前我们传的三个参数分别是:0,芯片的机器ID,uboot给内核参数tag在内存的首地址r2。 查看上面截图的代码,可以看到r2也可以是另设备树文件(dtb)在在内存的地址。 对于使用tag传参给内核,机器的I...
原创
2417阅读
2评论
5点赞
发布博客于 2 年前

设备树学习(三、设备树dtb格式和结构)

上一节我们学习了dts文件的格式,dts文件是方便我们书写和读写的格式。本节我们来学习一下经过Device Tree Compiler编译,Device Tree source file变成了Device Tree Blob(又称作flattened device tree)的格式。 首先先给出dtb文件的格式一个dtb文件分为4个段,分别是ftd_header,memory re...
原创
2879阅读
0评论
4点赞
发布博客于 2 年前

设备树学习(二、设备树dts/dtsi格式)

说明:后续的博文参考自韦东山老师的设备树视屏,老师用的是2440的开发板,我用的是s5pv210的开发板。原理一样一、前言简单的说,如果要使用Device Tree,首先用户要了解自己的硬件配置和系统运行参数,并把这些信息组织成Device Tree source file。通过DTC(Device Tree Compiler),可以将这些适合人类阅读的Device Tree sou...
原创
9349阅读
3评论
26点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(四十三、移植新的4.19版本的内核)

在kernel.org下载最新版本的内核,我下载的是linux-4.19版本的因为新的内核只支持设备树方式启动,所以打算开始学习设备树。本篇博文不分析任何设备树的东西,只做移植使用。先保证内核可以启动后再开一个专栏学习设备树。同时,19年准备回西安老家换份linux驱动相关的工作,如果看到这篇文章的西安公司有相关职位空缺,可以联系我邮箱。1152016254@qq.com...
原创
2330阅读
0评论
0点赞
发布博客于 2 年前

设备树学习(一、设备树基础)

1、设备树的引入Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称“this whole ARM thing is a fucking pain in the ass”,ARM Linux社区对此作出了回应,引入设备树。ARM Device Tree起源于OpenFirmware (OF),在过去的Linux中,arch/arm/plat-xxx和arch/...
原创
9022阅读
0评论
19点赞
发布博客于 2 年前

从零开始之驱动发开、linux驱动(四十二、移植新的4.x的内核)

最近一段时间一直在学习USB相关的知识,刚准备在之前的3.16.57移植的内核上学习写USB相关的驱动,发现这个版本的内核是一个过度的内核。3.x的内核是开始支持ARM的设备树,研究发现3.16.57的内核上,首先默认对S5PV210没支持设备树的。但是对和S5PV210共用的exyson类的USB却更改了之前的USB的驱动,导致对于S5PV210来说USB的驱动,没法用。3.8左右的...
原创
1346阅读
2评论
1点赞
发布博客于 2 年前

从零开始学USB(二十四、USB接口HID类设备(六)_物理描述符)

物理描述符也称作实体描述符。被用来描述设备的行为特性。物理描述符是一种数据结构,它提供有关激活控件或控件的人体特定部分的信息。例如,物理描述符可能指示右手拇指用于激活按钮5.应用程序可以使用此信息将功能分配给设备的控件。物理描述符完全是可选的。 它们增加了复杂性,并且对大多数设备提供的回报很少。 但是,某些设备,特别是那些具有大量相同控件的设备(例如按钮)会发现物理描述符可以帮助不同的应...
原创
1201阅读
2评论
2点赞
发布博客于 2 年前

从零开始学USB(二十三、USB接口HID类设备(五)_报表描述符总结)

在USB的枚举章节,主机获取的最后一个描述符时报表描述符。因为当时没学习HID类的报表描述符,所以当时没分析,这边刚学完HID的报表描述符,趁热打铁,学习一下。首先报表描述符的长度是,在获取HID描述符长度的时候获取的。所以才能在获取报表描述符时使用准确的获取长度。 05 01 09 02 A1 01 09 01 A1 00 05 09 19 01 29 03 15 00 ...
原创
1919阅读
0评论
2点赞
发布博客于 2 年前

从零开始学USB(二十二、USB接口HID类设备(四)_报表描述符Local类)

本地项目标签定义控件的特征。 这些项目不会转移到下一个主要项目。 如果Main项定义了多个控件,则可能会有几个类似的Local项标签。 例如,一个Input项可能有几个与之关联的Usage标签,每个控件都有一个。 Tag One-Byte Prefix (nn represents size value) Description Usage 0000 10 nn ...
原创
1123阅读
0评论
0点赞
发布博客于 2 年前