有一种程序员文化叫串口

在个人电脑(PC)的黄金时代里,串口是PC的标配,梯形的白色金属外缘,包围着9根金黄色的插针。

fbf7df703b2159e5010a307f4fe1f0e3.jpeg

它的大名叫Serial Port,小名就叫COM,在Windows中,COM这个关键字是保留给它用的,一个系统里可以有很多串口,从1开始编排,COM1、COM2、...

当时串口主要有两大用途,一是连接鼠标这样的小带宽设备,二是做定制化的跨设备通信,比如两台电脑之间通过串口通信,实现传递文件,内核调试,打印调试消息等。

挺长一段时间里,鼠标都是以串口方式接到PC的。当时的鼠标一般有个滚球,用久了,球上会粘一些灰尘之类的,影响滚动,这时便要把球拿出来,清理一下。

ef236851e4ee22f69f3698ba715e62ee.png

早期的一些猫(Modem)也是串口的,用它上网。

到了笔记本的时代,讲究轻薄,接口越来越少,被认为不常用的串口便被“省略”了。

有一段时间,笔记本电脑有一种名叫PCMCIA的接口,我在使用这种笔记本时,买了一个PCMCIA转串口的卡,有了这个卡后,笔记本上就有串口了。

PCMCIA的接口比较大,占用的空间太大。于是在有PCIe后,便有了Express卡形式的串口卡。

4e806b1bb8ac56d8118149a050fee844.jpeg

上图这个Express Card形式的串口卡是在的旧物箱里找到的。看到它,如同见到老朋友,我曾经使用它做内核调试,调试Windows NT内核。

近些年来,随着笔记本电脑的轻薄之风盛行和价格不断降低。很少有笔记本保留Express Card接口了。于是对于大多数笔记本电脑来说,几乎没有办法让它具有串口了。

今年上半年开发幽兰代码本时,有很多底层的开发任务需要串口帮忙,比如看固件和uboot的输出,看早期的内核等。还好,幽兰的主板上保留了一个串口插口,通过这个插口,可以把宝贵的串口消息打印出来。

7a4cd27471d46d6da33f0ab73ac8d0e0.jpeg

在开发幽兰的过程中,这些宝贵的串口消息帮我们解决了很多棘手的问题。

幽兰发布后,很多兰友也想要用串口。看到这样的需求,我很能理解,但是内部的串口用起来不方便,需要打开后盖。

今年5月,我到深圳,和幽兰的硬件工程师聊天,说到串口的问题,我询问是否可以把串口接到幽兰的SD口。因为幽兰有SD口,现在复用做内核调试。硬件工程师听了后,说是有困难,因为SD口是在扩展板上的,内置串口是在大板上的,两个板之间通过一个软线(上图中的黄色排线)连接,软线的信号已经都定义好了,改动比较困难。

讨论到这里,似乎陷入了僵局。这时不知谁说到,是不是现有的SD信号里有可以复用做串口的。

为了节约管脚,今天的SoC普遍使用复用方法,每个管脚都有很多种用途,通过寄存器配置其真正用法。

提出这个想法后,硬件工程师立刻去查关键定义,几分钟后回来了,而且带回来的是好消息,现在SD信号里就有串口。

有了这个信息后,我便计划着在幽兰上通过SD口来导出串口。

7月15日,我一大早坐高铁到合肥,创业之初,经常到合肥,但最近几年许久不去了。再去合肥,颇有点故地重游的味道。因为此,上了高铁后,我的兴致很高。借着这个好兴致,我拿出幽兰代码本,打开3588的数据手册,寻找寄存器定义。

确认了寄存器定义后,我又联系一个做硬件的老朋友,他曾经帮我画过SD卡的接头,也就是挥码枪现在使用SD接口小卡。

我们一边聊天叙旧,一边讨论我的SD接口升级方案。他同时画电路板,并且在嘉立创上下单。我下高铁时,软件设计和硬件下单都完成了。

接下来周一一上班,我便安排格蠹的小伙伴验证软件,修改刘姥姥驱动,配置寄存器,做原型开发,然后再修改uboot和内核。

  1. 1.   开发步骤
    7月15日周六,RZ在高铁上设计
    7月17日周一,志强在llaolao驱动中试验串口成功
    - 使用D0、D1脚,uart2
    - 5M波特率
    7月18日周二一早,RZ补充此设计文档
    TODOs
    1.    在llaolao驱动中试验卡在位检测
    2.    成功后,移植代码到uboot,实现上一章的《幽兰定制》功能

老的SD接口只接三根线,其它线没有接。找园区里的硬件团队帮忙手工焊了接线后,小伙伴很快就在刘姥姥中验证串口可以通。

然后花了一些时间修改uboot和内核。

7月27日,我把好消息发布到兰舍群里:可以通过SD口输出串口信息了,不用开后盖就可以。

41c90dbf5b334168048029992dcd7950.jpeg

7月21日,新的SD转接卡到格蠹了,非常小巧。

af60bf0a35c19c6a95fa633a012ad9d9.jpeg

故意选择的红色印刷电路板,醒目,好找。信号部分使用了沉金工艺,金光闪闪。

2ac85fbfd66ba232307d19e69e563cd8.jpeg

几天后,SD转接头上架了,陆续发到一些兰友和格友手里。

昨天白天,我到办公室加班,拍介绍幽兰的小视频,准备晚上的学活LINUX。

准备好讲义后,我在办公室里做直播,直播结束后,我才离开办公室。夏日炎热,又因为是周末的晚上,园区里非常安静。

bba9578cd576175bce24400ba72645c8.jpeg

忙碌一天,昨晚比较早就睡觉了。今早六点多时,我从甜美的梦乡醒来。打开手机,看到兰舍群里好多消息。其中的大多数消息都来自老朋友Ethan。

89ad5035b817c8e628f51572caaa5c39.jpeg

我爬楼翻看Ethan发的信息,意识到,昨晚他做了一次漫长的“串口之旅”,先是遇到连接问题,无法看到消息,后来取得成功。连接成功后,他不断收获惊喜,当我进入梦乡时,他还在奋战。

我翻看他发送的截图,又重复了一次他的串口之旅。经过Ethan允许,下面的很多照片都是他拍摄的。

15f4c6f6752c298b63218a7289a35291.jpeg

这是Ethan的工作台,左边是幽兰代码本。

连好线,开好串口,开机,第一行输出:“开机键被按了”




在串口窗敲 x5,然后就停在Uboot的命令行




真乖

dc0ab3ea160c5ab5ee7aeff175716772.png

Ethan进入了神奇的Uboot命令行。uboot是一个请量级的boot loader,没有UEFI那样的EFI shell,但是也有命令行。

因为uboot只在开机早期 工作,所以很多人只是知道uboot存在,但是没有看到过uboot的打印,更没进入过uboot的命令行。

ca3d97a8fd8adc6dd58892f31de29aa2.png

在uboot命令行,Ethan徜徉许久,尝试uboot的各种命令,观察中断:

9ac787d282236e2b062f9cdefb084eee.png

内核标签列表:

29a8d8859fd5419b8016626fe57028a3.png

还有很独特的充电操作。

e5ead2b21c139a0cae8243173dcf91e7.png

他结合源代码,看上面的信息输出。

1ed1dfe5db15f343e2795ff72e15afad.png

这是我一直提倡的读活代码。

在uboo的命令行逛了十几分钟后,Ethan发出boot命令,启动Linux内核。

d445ee023fe88f2073bf7c1dbad731de.png

内核启动后,他还使用串口登录幽兰。

38a4a40fdaccfa28c15ad982f0d1b111.png

用串口成功登录幽兰后,他在笔记中写下:来自SD口的串口登录。

来自SD口的串口登录,这句读起来有点拗口的话,让我凝视许久。串口登录是种说起来有点古老的登录方式,很多做过底层开发,特别是嵌入式开发的人可能都用过。

但是通过SD口的串口登录,Ethan可能是第一人。

为何如此说呢?首先SD口形式的串口非常少见。或许,格蠹的SD转接头是最早的一个。

格蠹的小伙伴比Ethan更早的使用SD转接头,但是并没有使用串口登录功能。

所以,如果格蠹的SD转接头是第一个这样的产品,那么Ethan就是第一个使用这个转接头执行串口登录操作的。

在通信技术高度发达的今天,串口对于硬件工程师来说太简单了。但对于软件工程师来说,它仍然是硬件,需要接线,需要动手操作,有时还可能接错。记得我在开发GDK3时,和国内某芯片公司的支持工程师通话,请求他们的技术援助,那位工程师在电话那端说:“就个串口,还接不对么?”我当时洗耳恭听,觉得他说的话很对。对于软件工程师来说,也要勤于动手。

更为重要的是,通过串口,既可以定位难以定位的bug,解决疑难问题,又可以像Ethan那样阅读难得一见的固件信息,欣赏软件世界里的独特风景。

(写文章很辛苦,恳请各位读者点击“在看”,也欢迎转发)

*************************************************

正心诚意,格物致知,以人文情怀审视软件,以软件技术改变人生

扫描下方二维码或者在微信中搜索“盛格塾”小程序,可以阅读更多文章和有声读物

95d49c8e7d21b95a16f92220c86fdc0a.png

也欢迎关注格友公众号

c2e87ad534860539c3da8d58ee204458.jpeg

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值