Day 6 USB 可插拔

1 什么是可插拔?

热插拔(hot-plugging或Hot Swap)即带电插拔,热插拔功能就是允许用户在不关闭系统,不切断电源的情况下取出和更换损坏的硬盘、电源或板卡等部件,从而提高了系统对灾难的及时恢复能力、扩展性和灵活性等,例如一些面向高端应用的磁盘镜像系统都可以提供磁盘的热插拔功能。具体用学术的说法就是:热替换(Hot replacement)、热添加(hot expansion)和热升级(hot upgrade)

以上来百度百科

2 可插拔的好处?

对用户来说,可插拔的最大好处就是,安装外设再也不用重启电脑了,,,,
对系统来说,实现了动态扩充,动态增加功能的好处

3 可插拔架构实现的关键

  1. 设备检测机制
  2. 状态可控
  3. 设备自我解释

不好理解是不,举个栗子
北影旁边有个看门大爷,负责管理后台演出人员,每天8点,大爷都会点一点人数,把姓名,特长,座位记到一个小本子上,然后给一个小板凳,让他们坐着,等导演召唤

导演需要人时,大爷就翻一翻本子,说:A,53号那个,过来,导演叫你呢

大爷年老眼花,所以日子一长,就出问题了
有一天,大爷没注意到一个人走了,然后导演找不到人演戏,就罢工不干了
有一天,后台溜进来一个新人,大爷看到他,他也没凳子坐,就一直捣乱;直到第二天大爷重新点人数时,才发现他,给了一个凳子,安抚好
有一天,后台两人打架,一把火把后台烧了。。。

(这就是原来的电脑不可插拔机制,硬件损坏蓝屏,必须重启安装驱动,硬件冲突蓝屏)

怎么解决呢?

导演找了两个年轻人,一个保安来辅助大爷,一个看前门,一个看后门;一个年轻人看管前门,另外一个看管后门,保安负责看场子
大爷再也不用在早8点一个一个点名了,只需要坐在座位上记录就好了
每当有人从前门进来时,年轻人都会问一遍基本信息,然后安排一个座位,然后大声喊:大爷,新来了一个人,叫XXX,演爱情剧的,我安排到2号座位了啊
大爷就记下了
每当有人要从后门离场时,另外一个人,就会把座位收了,然后大声喊:大爷,那个XXX的,有事走了,我把2号座位收了啊
大爷然后找到本子的那一页,画一个叉号
半小时后,保安说,8号的那个SB,闹事了,本来谈好的300工资,非要800,我把他赶出去了
大爷说,好,然后找到8号的那页,又画了一个叉号

管理有序,来了再多人也不会乱

关键点在于

  1. 改进了流程,从每天检查一次,改为随时检查更新记录,进一个检查一个
    从而杜绝了,有记录找不到人的情况(DM/DP设备检测机制)
  2. 增加了两个看门人,保证了能及时监测到人员进出,根据人数及时调整记录(动态更新机制)
  3. 增加了保安,降低了闹事,砸场子的可能(限制设备最大电流,最大带宽)

从技术层面来说

一个设备的关键信息有

  1. 设备文字性信息(演员叫什么,家在哪里,毕业哪个学校)
  2. 设备功能和资源要求(演员能演什么)
  3. 设备系统地址(座位号)
  4. 设备数据协议和行为规范(导演与演员的语言交流)

操作系统在开机自检后,将硬件信息保存到注册表中,然后提供一个设备查询接口供驱动软件来使用。也就是说系统在开机后,就已经记录了当前系统中所有设备的文字性描述信息,功能和基本资源需求,设备地址!并且这个更新记录过程只发生在开机阶段,所以要添加设备,就只有重启系统了

如果我们把这个查找过程推迟一步呢?
那就变成了:只有当设备插入,拔出时,系统才会更新这个设备记录表,匹配对应的设备驱动

这样就把记录更新触发条件从<上电启动>变成了<设备插拔>,从而实现了热插拔效果

所以,从本质上来说,热插拔就是延迟管理,事件触发的技术

这种延迟绑定技术,在计算机技术中大量存在,比较典型的例子是动态链接技术,将函数,变量地址绑定过程,从编译阶段延迟到了运行阶段,进行达到了解耦,动态升级,共用基础设备的效果

稍微讲一下动态链接的过程吧
在程序运行之前,系统先调用Dynamic Link Loader,递归下降找到程序中用到的所有dll库,然后加载到内存中,如果内存中已经有了dll,则忽略;完成这一步后,loader把dll的内存地址记录下来,然后释放控制权,接着构建程序运行环境,比如初始化堆栈,内存,分配变量空间啥的,然后开始运行程序;当程序遇到未绑定的变量或者函数地址时,会跳转到PLT,然后PLT跳转到GOT,GOT里面默认就是Loader的入口地址,所以Loader再次接管控制权,到dll中的符号表中,找对应的符号,找到后,则用这个新地址更新PLT和GOT,接下来就是被调用的函数接管控制权;
当第二次调用时,因为GOT,PLT表里面已经包含了有效地址,所以就无需loader介入,直接查表,跳转就好了

再次回到热插拔的话题

总结起来,就是

  1. 改变了触发设备更新的条件,每次插拔都会更新,相当于两次完整的重启过程(一次注册更新,一次注销更新)
  2. 延时了设备数据获取的阶段,每次检测到设备插入时,都必须重新获取所有设备信息,从而保证设备状态的可控性

当然,在硬件层面,也要做很多额外的工作,比如增加电源缓冲,提高数据传输速率,增加ESD保护

4 USB协议中,插入USB设备后,PC为什么会要求USB设备重启?

熟悉USB协议的朋友,都会知道PC在检测到设备插入时,都会要求USB设备重启,为什么这样要求呢?

热插拔带来的另外一个问题:怎么维护设备的操作状态,并保证设备始终处于可控状态

可控是指设备具有确定性,在特定环境下,对特定的输入,设备要做出完全一致的,可重复的特定输出

原来的设备状态信息,由操作系统内部来维护,比如上电后,会请求外设复位,然后进行初始化,从而进入确定的状态,等待系统命令。

但对于可插拔设备呢,在插入后,设备默认地址为0,同时系统会要求设备进行复位,从而让设备清除旧状态信息,进入确定的可控状态。

so bad,还是没引入状态机的理论

每日推荐

  1. [QP量子架构]http://www.state-machine.com/index.html
    状态机编程的经典书籍

2015-12-12

-----分割线-----
注意事项

  1. 本订阅号(微信搜 McuProgramming )主要发布一些嵌入式相关的知识和技巧,涉及到软件,硬件,射频,协议栈等;如果您有感兴趣的领域,请通过回复订阅号告诉我

  2. 本订阅号主要是简单文字为主,内含少量代码段,但绝不会发布大量的代码。
    因为根据自己的体会,在手机微信端看代码的体验非常糟糕,一方面屏幕比较小,显示效果不好;另一方面,玩手机时,精力不会集中,更不会有大量时间。
    cedar-renjun.github.io 个人博客会发一些技术细节的东西,感兴趣的,可以深入研究这里的博文

  3. 微信的编辑功能比较弱,不能贴链接,代码啥的,,,所有文章均发表在个人博客,可以通过点击原文来查看,原文有代码语法高亮,显示图片,带链接等效果

STM32 硬件设计

最近画了一些板子,原本的MCU是用STM32F446RET6,样板打出来后,发现物料不好买,问了一些代理商,因为这个片子比较新,所以都没有货,只好换405系列的

不过,ST的软硬件兼容性做的不错,软件基本不用动,硬件修改几个电源管脚就OK

在此记录一下

1 STM32F446和STM32F405/7的区别

405是168MHz的M4内核芯片,407相对于407增加了以太网和相机接口,405和407的FLASH有两种:512/1024K

而446是新推出的片子,可以说是407的缩水版,把主频提高到了180M,但没有以太网接口,相机接口,FLASH的size也有相应的缩写,最大512K,所以从长远来看,446的价格会相对便宜一些;从ST官网来看,大概比405便宜1个美金的样子

官方给出的摘要

STM32F446 – 180 MHz/225 DMIPS, up to 512 Kbytes of Flash with dual Quad SPI and SDRAM interfaces
STM32F407/417 – 168 MHz CPU/210 DMIPS, up to 1 Mbyteof Flash adding Ethernet MAC and camera interface
STM32F405/415 – 168 MHz CPU/210 DMIPS, up to 1 Mbyte of Flash with advanced connectivity and encryption

详细的对比信息,点击这里
http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1577

软件方面,完全兼容

2 F4系列硬件兼容性

对于F4系列LQFP64封装来说,只有446和11系列的CAP管脚布局和其它F4芯片不同,需要特别注意,如下所示

F4管脚区别

主要是CAP管脚的问题,405/7带有两个CAP脚(31,47),446只带一个CAP(30)

硬件手册要求:

  1. CAP脚必须接电容到地平面
  2. 一个CAP的芯片,直接接一个4.7uF电容
  3. 两个CAP的芯片,每个管脚接一个2.2uF的电容
  4. VSS必须要接地

为了兼容所有F4的硬件,建议这样设计

兼容设计

在需要使用446芯片时:

  1. 把31,47管脚的电容换成0欧电阻
  2. 把30管脚接4.7uF电容

在需要使用其它F4时:

  1. 把31,47管脚的电容换成2.2uF电容
  2. 30脚悬空

3 去耦电容

计算公式:10uF+Nx100nF
N是VDD管脚的个数,有多少个VDD,就有多少个100nF
电容尽量靠近MCU,布线时,记得先过电容,然后才是芯片的管脚,不然就没有效果了

4 电源部分

这部分没什么说的,3.3V接到VDD,VDDA就好。
特别注意:VDDA是必须要接的,不要因为你没有用ADC,就不接这个管脚。因为STM32的PLL时钟电路,是由VDDA模拟部分供电的,没有供电,就没有系统时钟信号,后果自己想

5 复位电路

常见的错误:在STM32外部增加一个阻容复位电路,上拉至VDD。
STM32内部已经有复位电路和上拉电路,所以完全没有必要额外的添加上拉电阻,只需要添加一个100nF的电容接地,目的是滤除外部的干扰信号,防止偶然触发MCU复位

6 调试接口

对于调试接口来说,建议采用SWD接口,只需要引出DIO和CLK两个pin就可以调试。
对于一般应用来说,足够了。但对于可靠性设计来说,有两个细节要处理

  1. 要不要引出RESET管脚?
    因为STM32允许通过软件的方式禁用JTAG/SWD接口,所以,某些产品级别的代码会在上电后,关闭调试接口,禁止FLASH读,从而防止固件被盗取。
    但是,如果MCU在上电后,立刻关闭JTAG/SWD接口,就会致使再也无法通过调试器来访问MCU,就是所谓的芯片锁死。
    为了防止出现这样的事故,建议引出来RESET接口,从而可以让调试器控制RESET线,让MCU进入调试状态,避免锁死
  2. 要不要加上拉/下拉电阻?
    很多开发板或者其它的网上原理图,都会在外部添加一个10K的上拉或者下拉电阻,其实这是完全没有必要的。因为STM32内部已经集成了上拉/下拉电阻。
    如下所示
    PA13 — JTMS/SWDIO — Internal pull-up
    PA14 — TCK/SWCLK — Internal pull-down

参考资料

  1. AN4488 Getting started with STM32F4xxxx MCU hardware development

Day 5 USB 软件?硬件?

上篇提到了USB协议出现之前的社会背景,人们希望PC外围设备的特点是

  1. 外设的接口都一样
  2. 安装新设备后,不要再重启电脑才能使用
  3. 速率更快
  4. 通信线材足够简单
  5. 要兼容旧驱动,软件

简单来说,就是在一个新的接口内包容所有的旧设备接口

软硬件不分家,随着技术的发展,工程师会把一些软件功能,用硬件实现,硬件加速器就是非常典型的例子;同时呢,对于需要更高灵活度的任务,硬件无法完美处理的,工程师会在软件层面来实现这些东西

原来的PC接口是:硬件复杂,软件简单
现在人们希望是:硬件简单,软件复杂
用户只想要简单的使用就好,用户不想关心技术,你们工程师搞定就好
从而导致设计重心偏向软件方向

更深层次的讲,导致这种变化的因素是:消费市场供应方的增加,供大于求,导致消费者话语权的增加,迫使厂商为了迎合消费者不得不推出新的技术方案,从而反向的推动技术发展

Repeat 核心思想:硬件简单,软件复杂

解决的方案就是增加两个层

  1. 往下增加一个层,最底层的硬件接口层(USB接口)
  2. 往上提高一个层,软件适配层(Warper)

标准的底层硬件接口层用于传输通信数据流,然后发送到上层Warper接口,Warper接口负责理解数据的含义,并分发到对应的上层驱动,从而保持原有驱动不变

这么说,可能不好理解,举个栗子

到政府办事的时候,经常要跑很多科室,盖很多章,这些科室有专门的职责;后来有一天,政府推出了一个网站,说,你们不用来回跑了,直接在网上提交材料就好,全程网上处理;对于我们来说,只需要登陆一个电脑网站就能办所有事

N个科室--进化-->网上虚拟科室

但办事流程还和原来的一样,我们依然很熟悉,不需要任何转换学习成本

科室从硬件实体,变成了虚拟的一个图标

USB的角色也是类似,将传统的硬件串口,硬件打印机接口等等,通通变成软件接口

或者理解为:肉体消失了,但灵魂从未消散

硬件下降一个层次,软件提高一个层次

当然,在增加层次的过程中,有几个关键技术细节要处理

  1. 如何实现热插拔?
  2. 为什么采用一个主机的总线架构?
  3. 如何提高传输速率?
  4. 如何兼容旧驱动架构?

明天聊一下:热插拔机理

PS:里面涉及到状态机和数据管理权下放的问题

每日推荐

  1. 状态机(FSM/HSM)
    如果一个嵌入式软件工程师,连状态机都没听过,说明他的Level连入门都没达到,请反思;
    更多资料,请自行搜索”有限状态机”,”层次状态机”

2015-12-11

-----分割线-----
注意事项

  1. 本订阅号(微信搜 McuProgramming )主要发布一些嵌入式相关的知识和技巧,涉及到软件,硬件,射频,协议栈等;如果您有感兴趣的领域,请通过回复订阅号告诉我

  2. 本订阅号主要是简单文字为主,内含少量代码段,但绝不会发布大量的代码。
    因为根据自己的体会,在手机微信端看代码的体验非常糟糕,一方面屏幕比较小,显示效果不好;另一方面,玩手机时,精力不会集中,更不会有大量时间。
    cedar-renjun.github.io 个人博客会发一些技术细节的东西,感兴趣的,可以深入研究这里的博文

  3. 微信的编辑功能比较弱,不能贴链接,代码啥的,,,所有文章均发表在个人博客,可以通过点击原文来查看,原文有代码语法高亮,显示图片,带链接等效果

示波器眼图

1 眼图是什么?

在实际系统中,完全消除码间串扰是十分困难的,而码间串扰对误码率的影响目前尚无法找到数学上便于处理的统计规律,还不能进行准确计算。为了衡量基带传输系统的性能优劣,在实验室中,通常用示波器观察接收信号波形的方法来分析码间串扰和噪声对系统性能的影响,这就是眼图分析法。眼图是一系列数字信号在示波器上累积而显示的图形,它包含了丰富的信息,从眼图上可以观察出码间串扰和噪声的影响,体现了数字信号整体的特征,从而估计系统优劣程度,因而眼图分析是高速互连系统信号完整性分析的核心。另外也可以用此图形对接收滤波器的特性加以调整,以减小码间串扰,改善系统的传输性能

2 眼图的关键参数是什么?

如眼高、眼宽、眼幅度、眼交叉比、“1”电平,“0”电平,消光比,Q 因子,平均功率等

详情请参考百度百科

3 基本原理

对于含有Clock线的通信链路来说,直接用Clock的跳变沿做触发信号,然后显示Data波形,接着用余晖的方式多次叠加波形,就可以得到眼图效果

4 我的示波器能显示眼图吗?

任何实时显示示波器,都能显示眼图
Tek有个FAQ,可以解释这个问题

IS IT POSSIBLE TO DISPLAY AN EYE PATTERN ON MY OSCILLOSCOPE?

Any real-time scope can display an eye with varying degrees of clarity. The faster the scope is able to re-trigger, the clearer the eye.

To display an eye, first adjust the settings so that you are able to see one period and center it in the display. We are using a signal at a data rate of 200MHz (1 UI = 5nsec), so we will set our timebase to 1nsec/div.

Fig1
Figure 1: Your data signal

Fig2
Figure 2: One period of your data signal

Now adjust the position or horizontal delay so that the period being viewed is not the edge being triggered. It is usually best to center on the third or fifth UI after the trigger. In this case the third UI starts on 15nsec, so the center of the UI will be 15nsec + ½ of a UI = 17.5nsec.

Fig3
Figure 3: Adjust the horizontal position or delay to the third or fifth UI

Now go into the display menu and turn on variable persistence to see both the positive and negative transitions of the period at a given unit interval.

Fig4
Figure 4: Final eye diagram using persistence mode

In addition, you can use FastAcq mode or WaveformDB mode to create a color graded display of your eye.

Fig5
Figure 5: Eye diagram using FastAcq mode

5 参考资料

  1. Understanding Data Eye Diagram Methodology for Analyzing High Speed Digital Signals
  2. Eye Pattern Wiki
  3. 百度百科

Day4 USB的历史因素


回顾一下,昨天的故事

你到政府部分办事,首先需要找到办事窗口,然后告诉TA你是谁,能办什么事,来办什么事,然后把你的手机号,邮箱告诉TA

接着,办事人员给你一个登记号,然后说,记下了,稍后我会派专员联系你

然后,你就回家了,等着电话,10分钟后,电话来了,对话如下

办事专员:我是XX号客服,你是不是YY,登记号是ZZ

你 :是的
办事专员:巴拉巴拉
你 :巴拉巴拉

最后,通话结束

上面的事情,细化一下,完全可以套用到USB通讯过程

  1. 你到政府部分办事,首先需要找到办事窗口(插入USB设备)
  2. 然后窗口接待人员问了你一些基本信息,姓名,性别(USB主机主动获取设备描述符)
  3. 帮你取了个号(设置USB设备地址),突然把你名字忘了,哎,那谁,XYZ号,你叫啥名儿?办什么事?你只好又重复一遍(USB主机主动获取设备描述符,配置描述符,接口描述符,端点描述符)
  4. 办事人员,最后问你家在哪,电话号码多少(USB主机记录接口描述符,端点描述符)
  5. 接着,TA说,好,记下了(注册USB设备到系统),稍后我会派专员联系你(匹配USB驱动),你可以回家了,保持电话畅通(等待端口事件)
  6. 然后,你就回家了,等着电话,10分钟后,电话来了(发生数据交互)
    对话如下
  7. 办事专员:我是XX号客服,你是不是YY,登记号是ZZ(确定USB设备地址,端口地址)
  8. 你 :是的
    办事专员:巴拉巴拉
    你 :巴拉巴拉
    (PC与USB设备发生数据交换)
  9. 最后,通话结束(结束通信)

PS:上面的有一些术语,看不懂没关系,暂时忽略。重点关注整个交互流程

技术的产生和发展,都是跟当时社会的整体环境相适应的;这一点在IT技术上尤其明显

先了解USB 技术的历史背景,然后再想想USB解决了什么问题,就能理解USB架构为什么这样设计了

我一直认为:技术架构,从任何部分来看,都是很简单的
真正的困难在于,技术要求精确,所以会有大量细节性知识,精确描述性术语,把整体架构给掩盖住了

类似盲人摸象,这有俩洞,是啥玩意???摸了半天,发现是个鼻子,,,
再摸大象腿,最后耳朵,最后摸了一遍
然后在脑海里拼了半天,我擦,这玩意就是个大象

学技术也是类似的情况,先远观,掌握大致轮廓,然后慢慢细究,根本没有解决不了的技术问题

OK,回到USB的历史

几年前,电脑上有RJ45网口,DB9串口,视频输出口,打印机并口,还有光盘啥的,反正电脑上有各种形状的接口

后来消费者一看,妈蛋,这玩意不行啊,包里一堆线,不好插,体积也大,要搞死了
PC大厂一看,擦,这是个机会啊,我先推出小接口的电脑,就能搞死对手

然后,问题就来了

  1. 微软说了,你们随便搞,反正我要原来的电脑软件还要能用,驱动还能用,不然搞死你们
  2. 消费者说了,电脑上别有各种形状的接口,要简单,要速度快,不然买别家电脑去
  3. 工厂说了,线材制作要简单,线越少越好,不要良品率低,自己看着办

一帮IT大神,微微一笑,小case

硬件不够,软件来凑

然后就把这个问题轻轻松松搞定了

怎么解决的?明天继续

每日推荐

任何计算机问题,都能通过增加一个层来解决

CSAPP上看的,忘了谁说的了,反正是个牛逼的人物

CSAPP - Computer Systems: A Programmer Perspective

这是本神书,1300多页,CSAPP的介绍请百度或者google,据说看完的都成为大神了

国内有俩研究生,看完这本书的某几个章节,然后写了一本书《程序员的自我修养-编译,链接,库》

哦,我现在还没看完,,,

英文原版(299元)非常通俗易懂,千万不要买中译本,翻译的太垃圾,,,

2015-12-9

-----分割线-----
注意事项

  1. 本订阅号(微信搜 McuProgramming )主要发布一些嵌入式相关的知识和技巧,涉及到软件,硬件,射频,协议栈等;如果您有感兴趣的领域,请通过回复订阅号告诉我

  2. 本订阅号主要是简单文字为主,内含少量代码段,但绝不会发布大量的代码。
    因为根据自己的体会,在手机微信端看代码的体验非常糟糕,一方面屏幕比较小,显示效果不好;另一方面,玩手机时,精力不会集中,更不会有大量时间。
    cedar-renjun.github.io 个人博客会发一些技术细节的东西,感兴趣的,可以深入研究这里的博文

  3. 微信的编辑功能比较弱,不能贴链接,代码啥的,,,所有文章均发表在个人博客,可以通过点击原文来查看,原文有代码语法高亮,显示图片,带链接等效果

Day3 USB的通俗解释

做个小游戏,仔细回想一下两年前做的项目,看能否记得所有细节

估计90%的人只记得功能性层面的东西,比如项目是干嘛的,解决什么问题的,至于编程语言层面的细节,早已经忘的一干二净

所以,我不会一上来就给你一大堆各种专业术语,然后陷入USB技术细节
这么做的结果是,你听不懂,也记不牢,半个月后,脑袋里面,一片空白,毛都不剩

我们学习一个新事物,只有先有感性认识,有了大致轮廓,然后类比其它事物,比较之后,才会在大脑中建立起系统整体架构

这是由大脑的运行机制来决定的,大脑不会记忆太多细节,越高层,处理的越事情越抽象

公司也是同样的机制,高层管理者只关心企业战略,不会考虑程序员的代码风格是否规范,合理

ok,先看下面一则小故事

很简单,还记得上篇的提示么,多想想现实社会的办事流程

你到政府部分办事,首先需要找到办事窗口,然后告诉TA你是谁,能办什么事,来办什么事,然后把你的手机号,邮箱告诉TA

接着,办事人员给你一个登记号,然后说,记下了,稍后我会派专员联系你

然后,你就回家了,等着电话,10分钟后,电话来了,对话如下

办事专员:我是XX号客服,你是不是YY,登记号是ZZ
你 :是的
办事专员:巴拉巴拉
你 :巴拉巴拉

最后,通话结束

思考几个问题:

  1. 政府为什么要设立统一的接待入口?
  2. 办事人员怎么联系你?
  3. 如果这时来了另外一个人来办事,政府需不需要另外增加一个办事窗口?

OK,咱们明天继续

每日推荐

  1. 嵌入式通信软件设计
    斯瑞德哈(T.Sridhar) 写的,协议栈的核心就是状态机,更大的说,计算机的核心就是状态机,想要深入研究协议栈实现机制的同学,可以买一本这书翻翻,很薄的一本书,干货儿不少。建议这本书配合着USB协议栈源码或者LwIP源码一起看

PS:买计算机书籍,记得选这种红皮的,或者这种CSAPP黑皮的

2015-12-8

-----分割线-----
注意事项

  1. 本订阅号主要发布一些嵌入式相关的知识和技巧,涉及到软件,硬件,射频,协议栈等;如果您有感兴趣的领域,请通过回复订阅号告诉我

  2. 本订阅号主要是简单文字为主,内含少量代码段,但绝不会发布大量的代码。
    因为根据自己的体会,在手机微信端看代码的体验非常糟糕,一方面屏幕比较小,显示效果不好;另一方面,玩手机时,精力不会集中,更不会有大量时间。
    cedar-renjun.github.io 个人博客会发一些技术细节的东西,感兴趣的,可以深入研究这里的博文

  3. 所有文章发表在个人博客,可以通过点击原文来查看,原文有代码语法高亮,显示图片,带链接等效果

USB 参考资料

注意

  1. 本订阅号主要发布一些嵌入式相关的知识和技巧,涉及到软件,硬件,射频,协议栈等;如果您有感兴趣的领域,请通过回复订阅号告诉我

  2. 本订阅号主要是简单文字为主,内含少量代码段,但绝不会发布大量的代码。
    因为根据自己的体会,在手机微信端看代码的体验非常糟糕,一方面屏幕比较小,显示效果不好;另一方面,玩手机时,精力不会集中,更不会有大量时间。
    cedar-renjun.github.io 个人博客会发一些技术细节的东西,感兴趣的,可以深入研究这里的博文

0x00 一点废话

在列USB参考资料之前,先聊一点废话

从09年大二时,就买了一本《USB应用程序开发》,很不幸,当时没看懂,对我来讲,完全是天书,各种传输层次,太复杂了,脑容量不够,于是就放下了,现在那本书还在书柜里躺着,罪过,罪过

后面一直折腾单片机,从51,到AVR,到STM32,到TI的LM3S9B96,飞思卡尔的KL系列,东芝的片子,接触了很多MCU

越来越有种感觉:天下大同

计算机,公司,管理理论,行业,社会,自然界,表面是不相干的领域,但深入一层,发现背后的机理,完全相同

嵌入式是人来开发的,人离不开社会,所以社会的层次和架构,甚至哲学思想,会同样映射到嵌入式系统中,构建一个虚拟的数字社会

对此,推荐一本书《计算机的心智(操作系统之哲学原理)》,这本书对整个架构,社会映射机制解释的很好,可以说是彻底改变了我的计算机思想层次

有时候,遇到解决不了,想不通的计算机问题,不妨观察一下现实社会,人是怎么解决类似问题的

请记住上面的话

0x01 USB相关资料

学习USB过程中,看了不少资料,在此列出来,希望能帮到各位

  1. USB2.0协议
    在学习USB前,请先翻翻USB原版协议,不要求能看懂,先了解框架,有个大致印象就好。回头再深入研究细节
  2. USB in a NutShel
    用非常通俗易懂的语言来教你怎么看USB协议,描述了整个架构,非常清晰
  3. 电脑圈圈
    我主要看上面两个资料,电脑圈圈的,据说不错,在此推荐一下
  4. STM32 手册 USB章节
    详细的读几遍
  5. ST USB Device代码
    个人建议直接看源码,也不多,架构挺简单;不要被网上一大堆分析源码的文章迷惑,,,那是他们的事后总结,如果你希望通过看那些文章入门,注定是半吊子工程师,洗洗睡吧

暂时就列这么多,学USB基础架构足够了,明天聊USB协议框架

PS:还记得那句话么
有时候,遇到解决不了,想不通的计算机问题,不妨观察一下现实社会,人是怎么解决类似问题的

USB就是为了简化设备接口而设计的,学架构时,搞不懂时,就多想想公司架构是怎么设计的,国家部门是怎么设计的

2015-12-7

USB 固件升级

最近做了一个USB工具,像U盘拷贝一样,升级STM32固件

手册链接如下所示

有朋友说amobbs下载不了文件,这里传一份吧

https://github.com/cedar-renjun/cedar-renjun.github.io/tree/master/assets/2015/12/3/USB_MSD_Bootloader.hex.zip
https://github.com/cedar-renjun/cedar-renjun.github.io/tree/master/assets/2015/12/3/USB_MSD_Updater_User_Manual.pdf
https://github.com/cedar-renjun/cedar-renjun.github.io/tree/master/assets/2015/12/3/USB_MSD_Bootloader_Usage.pdf

USB 重枚举

基本思路:拉低DP信号,保持一定时间,然后释放

在STM32上的用法为:

  1. 关闭USB电源
  2. 配置DP脚,拉低
  3. 延时一段时间,释放DP脚
  4. 重新配置USB

usb suspended

Q: USB设备进入暂停模式的条件是?
A: 总线上,3ms空闲状态,即让设备进入暂停模式

Q: USB设备如何退出暂停模式?
A: USB任意的总线活动,都会让USB设备退出休眠状态,但一般情况来说,虽然USB
Device会产生唤醒中断,但软件层面硬件检查DP,DM的电平值,从而确定是干扰还是HOST唤醒事件

Q: 退出暂停模式后,需要重新进行配置么?
A: 不需要,因为在暂停时,已经保存了内部状态,比如端点信息和地址信息;在恢复时,只需要恢复时钟和对应外设功能就好

USB 插入动作

  1. USB 设备插入
  2. HUB 通过检测DP/DM电平变化,识别出USB插入动作
  3. HUB 等待100ms左右,等待设备供电稳定和初始化完成
  4. HUB 请求 Device复位,Device进入默认状态,此时最大可用电流为100ma
  5. HUB 分配唯一地址给Device
  6. HUB 发送设备请求命令,获取Device属性和功能
  7. HUB 根据实际情况,返回配置信息,配置Device,Device完成配置
  8. Device处于可用状态,开始正常传输数据
  9. Device设备拔出,HUB回收地址,更新逻辑树结构,通知HOST

为什么USB协议中,检测到设备插入时,要求复位

因为USB属于可插拔设备,这种特性就要求设备不具备记忆的特性,也就是有限状态机特性。
为了确保状态可控,所以就要求设备复位,从而

  1. 确保HUB检测到设备拔出时,能及时回收地址
  2. 确保USB设备在插入HUB端口时,能进入一个确定的状态,消除旧环境的影响

编写自杀式代码

0 前言

在制作TI调试器时,需要在RAM中执行代码,并擦除原有固件,然后接收调试器发来的数据文件,写入FLASH中,从而完成系统烧写和调试功能

该技术可以用作自杀式入侵代码,完成工作后,清除所有代码信息,然后重启
已经测试通过,并十分有效,简单的说一下基本思路,详细信息不便透露

1 基本步骤

  1. 调试器连接MCU
  2. 更新固件
  3. 完成系统初始化和C-Runtime初始化
  4. 映射RAM执行缓冲区,设置断点
  5. 执行RAM函数,使用DMA擦除固件信息,准备接收调试器发送的数据资料

2 特别说明

  1. 我已经在用STM32来调试CC25xx/CC23xx系列芯片,同时具备烧写功能
  2. 该技术可以和缓冲区漏洞结合起来,得到系统固件,并擦除自身,完全不留任何作案信息

跟我学蓝牙4.0之-CC26xx系列教程-00

TI的无线产品线非常丰富,从低频RFID/NFC,到Sub-1G系列,再到BLE4.0,Zigbee,Wi-Fi等各种芯片,应有尽有,足以满足您苛刻的应用场景。
可以细分为以下几个系列

  1. RF430
    13.56MHz NFC/RFID SOC 解决方案
  2. CC430
    Sub-1G 工业无线网络解决方案
  3. SimpleLink CC1x
    最新一代的Sub-1G SOC 解决方案,采用最新RF内核,功耗更低,性能更加强劲
  4. SimpleLink CC2x
    新一代2.4G 解决方案,可用于BLE4.0,Zigbee协议栈
  5. SimpleLink CC3x
    Wi-Fi SOC解决方案,双核架构,内置TCP/IP协议栈,性能最高,已通过FCC, IC, CE and TELEC认证

随着物联网的到来,SOC无线芯片已经是一个趋势,但射频开发中,还是会出现很多问题:

  1. 天线设计门槛很高,需要精通射频知识
  2. 无线协议栈学习成本过高
  3. 多种软件协议标准,应用层软件不兼容

针对上面的问题,TI推出SimpleLink系列无线芯片,在软件层面上兼容现有的无线协议,从而达到学会一种CC系列芯片,掌握全系列的无线的效果;
同时,TI提供很多天线参考设计,完完全全的交钥匙(Turn-Key)方案,用户可以直接使用这些参考设计,从而加速产品上市

1 认识TI CC26xx系列

我们的重点是来学习TI CC26xx 2.4G无线蓝牙4.0产品系列,TI将CC2x系列细分为以下三种

  1. CC2630系列
    802.15.4 MESH解决方案,用于实现Zigbee或者6LoWPAN MESH网络
  2. CC2640系列
    2.4G 蓝牙4.1系列芯片
  3. CC2650系列
    全能芯片,兼容CC2630/CC2640,能实现蓝牙4.0/Zigbee/6LoWPAN协议,从而实现一个芯片多种协议

2 开发环境和开发工具

TI CC26xx支持很多IDE开发工具,具体包括:

  1. IAR
  2. CCS
  3. MDK
  4. GCC
  5. BLE Studuio

更多工具信息,请参考wiki-开发工具页面

这么多工具,我们学习CC26xx时,该怎么选呢?
我们推荐

  1. IAR 7.4
  2. XDS110

因为TI官方协议栈,都是用IAR来管理工程的,所以安装IAR能为我们的学习避免很多潜在的问题
另外,XDS110的调试速度很快,不会像某些Jlink一样,总是丢失固件

总之一句话:我们是学习蓝牙4.0的,要选择稳定的工具,不要把精力浪费在调试工具上

下一篇,我们将介绍怎么安装IAR和TI蓝牙4.0协议栈

3 参考资料

  1. TI SimpleLink
  2. CC1x 系列
  3. CC2x 系列
  4. CC3x 系列

烧录器中的并行技术

0 前言

利用RTOS的并行技术,我们能充分的发挥宿主MCU的性能,从而最大程度的提高程序烧写速度

1 理论基础

  1. 烧写器的烧写速度瓶颈不在于传输速率
  2. CPU在DMA烧写FLASH的同时,可以在RAM中同时接收数据
  3. 一个FLASH控制器,只允许一个DMA操作

2 基本思路

  1. 采用RAM FIFO机制,假设为A,B Block
  2. 先填充A,然后启动DMA,开始烧录扇区1
  3. 填充B,等待扇区1烧录完毕,配置DMA,烧录扇区2
  4. 填充A,等待扇区2烧录完毕,然后配置DMA
  5. 重复3.4步骤,直到完成

3 注意事项

  1. 可以根据DMA的速率和系统总线速率,调整Block的大小和数据,从而尽可能的让DMA接近全负荷运行,从而达到理论FLASH理论烧写速率

ELF文件分析之3 - 动态链接

概述

相对于静态链接,动态链接和加载机制更加复杂,但对于系统来说,动态加载能更节省内存和其它计算资源

这里面涉及到的主要技术点为:

  1. GOT表
  2. PLT表
  3. 延迟绑定

基本过程为

  1. 调用系统加载程序
  2. 调用程序所需要的动态库,并分配程序段地址
  3. 进行初始化,构建运行时环境(Run Time)
  4. 运行程序,第一次遇到动态未定义符号时,调用动态解析函数,找到符号地址,将信息写入绑定表
  5. 第二次调用符号时,直接进入查找表,调用对应函数

所以,下面,分别介绍GOT和PLT,然后用实例来分析函数符号动态加载机制

ELF文件分析之2 - 静态链接

0 概述

有了上面两篇文章的铺垫,再看一遍ELF1.1规范,就已经简单的入门了
这篇文章,主要讲静态链接中的符号重定向过程和ELF处理机制

2 变量内存分布

我们知道,C语言的变量按作用域来分,包括:

  1. 全局作用域变量
    未加static修饰的变量,这种变量会标记为PUBLIC,并对外可见
  2. 文件作用域变量
    static修饰的变量,这种变量会标记为LOCAK,对外不可见
  3. 局部作用域变量
    block里面的变量
    什么是block呢,就是包含在{}里面的,未被static修饰的变量,这种变量会放在栈中,没有任何标记,对外不可见

也许你会问,C语言中有很多类型的变量,比如int,char,enum等,你为什么只提变量,而不提具体类型?
这是因为,变量类型仅仅对高级语言有效,机器码里面并没有数据类型,CPU只认识特定宽度的数据,然后做基本运算。
真的,在ELF里面,只有OBJECT,FUNC两种类型符号,我们来尝试一下

ELF文件分析之1 - 文件格式

0 前言

上一篇,我们知道了ELF文件是什么,以及怎么用,本篇重点介绍ELF的文档规范

1 整体结构

ELF适用于3种文件结构

  1. 重定向文件
    也就是经常见到的.o文件,用于保存代码和数据,链接器用使用这个文件来创建可执行文件或者共享文件
  2. 可执行文件
    也就是linux下面的.out文件,用于执行
  3. 共享文件
    常见的静态库.lib或者动态库.so,就是这个文件格式,就是由多个.o压缩成的,可以用于保存代码或者数据,节省编译时间

上面三种文件,再综合一下,可以分为两种

  1. 链接文件(中间态)
  2. 可执行文件(最终态)

ELF分别用两种视图来表示二者,如下所示

ELF文件分析之0 - 简介和分析工具

0 前言

几年前,在读大学时,刚接触linux的时候,就对计算机的运行原理比较感兴趣,网上找了《CSAPP》和《程序员的自我修养-链接,库》,无奈当时能力不足,
看不懂这些,后面工作了,一直从事嵌入式偏底层的工作,比较熟悉gcc和linker,刚好最近研究hacker和工程需要,就耐着性子研究了ELF文件结构,遇到问题
不少,最终也解决了,所以写到blog记录一下,免得忘记

1 概述

因为ELF涉及的东西比较多,所以分为4篇来介绍

  1. ELF简介和分析工具
    主要介绍ELF的基本知识和讲解ELF分析工具的基本用法
  2. ELF文件格式分析
    主要介绍ELF文件格式
  3. ELF静态链接
    主要分析静态链接中需要解决的问题,以及基本原理
  4. ELF动态链接
    主要分析动态链接中需要解决的问题,以及基本原理

OK, 进入正题

破解M1卡

0 概述

本文主要介绍破解M1卡所需要的工具和基本思路和注意事项,不会讲述详细的步骤
如果对此有兴趣,想深入研究,请搜索关键词nfc-tools, libnfc, mfoc

1 基本思路

  1. 尝试默认密码
  2. 尝试常用密码
  3. 逐个扇区的尝试,发现某个扇区内有默认密码,则可以根据M1加密算法漏洞来分析出其它扇区的密码
  4. 如果扇区没有默认密码,则软件破解失败;可以尝试用软件无线电来监听通讯过程,分析密码或者重放攻击

2 工具

  1. PN532或者ACR322
  2. HackRF
  3. libnfc和mfoc
  4. 树莓派或者类似的linux系统kali

3 其它

  1. 能破解公交卡么
    我尝试了下,无法破解,全部扇区加密,估计也有服务器验证机制
    回头尝试暴力破解试试

  2. SDR是什么
    经常有人问SDR是什么,这里解释下:SDR全称Software Defined Radio, 表示软件无线电,可以用软件+FPGA来模拟10M-6GHz的射频信号, 从而用软件协议来实现硬件射频芯片功能

常用的软件无线电工具有

  1. http://www.rtl-sdr.com/
  2. http://www.hackrf.net/