宇宙总线的大道理和硬法则

万变法门,USB总线以战说法

宇宙总线的

大道理和硬法则

25d16564f09a28291b5500cbddbc5061.png

ce552ec4e8f07f2b538a607a258e3fd0.png

38e286b89d8322e209e598da5161d3bb.png

这个世界充满着差异,很多看似简单的事情也无法统一成一样,比如生活用电,有220V和110V之差,车的方向盘有左侧右侧之差……因此,要设计一种面向全世界的产品,就要考虑这些差异,比如一款电器可能要配两种电源适配器。

但有了USB后,这个问题有了新解法,只要支持USB充电就可以了。因为此,今天的很多电器都向USB靠拢,没电时用USB充电,传递数据时用USB通信……已经支持USB的继续支持,不支持USB的想办法加入支持。于是乎,从墙上的电源插座,到车站的椅子扶手,都可以看到USB接口。夸张一点说,这个世界充满差异,但凡是有人类生活的地方就有USB。

bdcbf765297064ba8ee239180145b288.png

84cd685921f73684620580ed06494ebb.png

软件定义硬件

9caf98b2ece9804ebfc3f41f5e804ef5.png

USB总线的历史始于1990年代,它是怎么用不到30年的时间,火遍全球,成为名副其实的宇宙(universal)总线的呢?

简单回答,就六个字:软件定义硬件

深一点回答,可以用四个字:玄而又玄。玄就是抽象。硬件方面,抽象为标准接口:USB-A,USB-C等等。软件方面,抽象为描述符(descriptor)。描述符是什么,说白了就是数据结构。描述符的种类可以无限增加,每个描述符里的内容可以由程序定义,所以USB总线万能

10b6b2959f1ae145fd01d6b6d4bc7874.png

d0f28431bbe87975dc5c48a869638abf.png

USB背后的设计哲学

42507e6586dd5c258546066794c27086.png

这么好的东西,就没有任何缺点嘛?

当然也有,那就是软件也不好写,容易出bug。因此,很长一段时间里,我是看不起USB总线的,因为它有时不工作,重新插拔一下又工作了。如果它总是工作,或者总是不工作,那是符合工程师思维的。它有时工作,有时不工作,就觉得它不上路。

当我亲手开发了几款USB设备后,我的看法改变了。因为“有时工作,有时不工作”的问题,都是软件没有写好,是程序员的错,不是USB总线本身的问题。当然USB总线设计时就选择了“依赖软件”的哲学,或许也要承担一点责任吧。

进一步来说,USB总线的一个设计哲学就是把硬件做的简单,复杂的事情交给软件去做。因此,我在兰舍群里曾说过:“USB的硬件很简单,软件栈很复杂,这是USB背后的设计哲学。

或许是因为USB的软件太复杂了。在我的微信聊天记录中,大约每隔几个月就有一次关于USB故障的讨论。这些故障看似硬件问题,其实十有八九都是软件没有写好。

dc82d082219196ae03b9cf6a18d67c44.png

2333370dd965ae32cb3c55433cf8ae30.png

USB的软件有多复杂

f2699738bc5f927b58c2532540931717.png

USB的软件有多复杂呢?首先分为主机端和设备端,两端的写法和套路是有很大差别的。

单说主机端,USB的驱动分为控制器驱动(UHCI、EHCI,XHCI),集线器驱动,端口驱动,功能驱动等等。驱动的写法和行为是和操作系统相关的,Windows和Linux生性不一样,USB方面的代码也是差别很大的。因为此,同样一个USB设备,插在Linux系统上工作,但是插在Windows系统上可能不工作。因为Windows系统的一些逻辑比较苛刻,我在《当说半句话的键盘遇到挑剔的Windows》文章里写过一个真实的案例。

经常出问题的是USB总线的握手过程,也就是设备插到主机上后的“设备识别过程”。在这个过程中,主机会像面试新员工那样问设备很多问题:“你是什么类型?”、“你能干什么?”、“你支持什么版本?”、“你有几个通信端点?”等等。

064a3d47c2a308792f3b878929cb93df.png

在这个通信过程中,主机端常常很苛刻,设备如果回答错了,那肯定不行。有时回答慢了,也可能被抛弃:“它说话太慢,不和它聊了

cbfbe621481e32db9811defaad9a5252.png

无论如何,USB技术是伟大的。因为硬件简单,所以USB技术的出现让很多本来很贵的设备变得很便宜,这对于科技的推广是有大贡献的。

当然,如果所有的USB开发者都能深刻理解USB总线的设计哲学和关键法则,那么就可以让USB设备不仅价格便宜,还可以做到非常可靠。因此,我特意把我多年的思考和经验汇总到一起,设计为一门课程,取名为《万变法门,USB总线以战说法》(课程详情请点击此处查看)。课程将在今年5-6月以线上直播方式进行,每周六晚上一讲。虽然是在线直播,但每个学员都配备了一套具有两类USB接口(主机和设备)GDK3开发板,以及一套挥码枪调试器,可以亲手开发和调试USB的各种代码。希望深刻理解USB总线的同行,欢迎一起上调试器,看活代码,领悟宇宙第一总线的大道理和硬法则。

1

END

1

【盛格塾】

正心诚意,格物致知

人文情怀审视软件,以软件技术改变人生

57511557bcd868741aa242eebbceff6f.png

格友公众号

d9cc80ad61c231eef1fe3855e82fde09.png

盛格塾小程序

扫描上方二维码或在微信中搜索“盛格塾”小程序

可以阅读更多文章和有声读物

往期推荐

庐山研习班上介绍的25个LINUX工具

格蠹科技在线课程《编程玩数学》5月即将开讲

难倒小伙伴的链接错,奇怪的未定义引用

闪存烧写失败和调试第一心法

  • 18
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值