# 教程总述
**对于高速电路设计一直比较感兴趣,想自己做一个XX派,但苦于资料太少了。** 过去6个月在摸索中完成了全志H6开发板。相信肯定也会有其他小伙伴有类似的想法,因此就有了这样一个《从零入门ARM高速电路设计》教程。
**本教程,将给出一个可行的学习路径**,分享我自己在做的过程中的一些经验(看别人似乎挺容易的,但自己操作起来怎么那么难,eg. BGA焊接),以及设计过程中的一些考量。
考虑到高速电路设计本身就是一个复杂的领域,包含原理图设计,PCB设计,焊接和调试,软硬件联调等步骤,涉及了硬件工程师,PCB工程师,嵌入式软件工程师等岗位,很难由一个教程就将知识完全涵盖。**对于网络上面讲得比较好的内容,我会给出资源地址,推荐大家去读原文。对于缺乏的内容,我会补充自己的知识和经验。**
我作为高速电路设计的初学者,肯定有知识和经验上面的不足,要是有错误或者资料的补充,欢迎在评论区指出和补充。**大家可以一起完善这个教程。**
项目主页:[https://oshwhub.com/logicworld/h6_board](https://oshwhub.com/logicworld/h6_board)
# 软硬件联调
## 再见Orange-正常进入Ubuntu
上一章结束的时候,我们已经通过了DragonHD DDR内存测试。**这一节我们就正式要启动Linux/Ubuntu系统来玩玩了。**
早些时候我已经买了OrangePi 3 LTS的板子,已经按照[OrangePi使用指南](http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-3-LTS.html)中的<2.4节>把Ubuntu刷到了TF卡中,并且已经在OrangePi板子上面玩了一下。**因此,非常简单,我直接将TF卡插到了我自己的板子上面,试图启动Linux。** 在启动之前,我们需要把调试串口接到电脑上面,以便可以通过串口看到系统的启动状态,以及可能的问题。
**非常顺利的,我们看到了从串口刷出来的一行一样的UBoot启动日志**,可调电源上面的电流在0.2A-0.3A之间跳动,再次证明了最小系统的是正常的。但是,最后卡在Starting Kernel...,过了10-20秒之后系统自动重启了。
![1679586880522_初次启动内核_1.jpg](//image.lceda.cn/pullimage/EVEmy1dxlx5VKNCUY5tLqLnj9vW4pCgsI1mOBXjq.jpeg)
**反复几次之后,都是如此,也没有输出更多的log信息。** 我怀疑过各种东西,比如:系统使用的DDR内存的频率是否超过了板子稳定能跑的888MHZ,或者,我的硬件设计和OrangePi的存在一定不兼容,因此配置不对,直接导致内核出错了,又或者,焊接有问题内核启动过程中使用了一些引脚,这些引脚虚焊或连锡了,还是这个主控芯片本身有什么问题?也在网上找类似现象的信息,大概的方案是打开Linux内核更底层的调试信息,看看是否有更进行一步的信息。
这个时候,有一个公开发售的板子的好处就出现了,**我把TF卡插到OrangePi的板子上面看看它启动时输出的log是什么样子的,确认一下正常的log是什么样子的**,从而确认我的板子输出的log哪里有不正常的地方。猛然发现它也会在starting kernel的地方重启。一下子回过神来,为了调试时防止烧板子,我在可调电源里面设置了最大电流0.5A,而Linux启动时可能需要更大的电流,我把最大电流调到2A。果然,OrangePi的板子可以正常进入Linux系统了。
**我把TF卡插回自己的板子上面,再次启动,此时顺利通过了starting kernel**,内核log开始往外输出,电流显示也已经超过了0.5A。稍等片刻,内核启动完成,从命令行里面,我们看到了完整的Ubuntu系统,4核2GB的内存。
![1679588686608_htop_1.jpg](//image.lceda.cn/pullimage/JGyt3UIH60vNt7IPCqqZUNk6iLJAEBxD3BfQWJ7f.jpeg)
**光一个命令行,可玩性差了一些,因为我刷的是Ubuntu桌面版本,赶紧看看桌面系统吧**。我用的是便携式屏幕接HDMI,用视频采集卡应该也是可以的。
![1677352026760_进入桌面_1.jpg](//image.lceda.cn/pullimage/M47Ft351Jv3lU61LvyVhS1L8ia49BkDSGiRQVAWD.jpeg)
至此,H6开发板的核心功能已经完成验证。**回望过去翻过的一座座大山,走过的一座座迷宫,此时此刻终于可以松一口气了,我们已经走出来了,不枉过去5个月时间的努力。**
接下来就是验证其余外设是否正常工作了,验证过程主要参考了[OrangePi使用指南](http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-3-LTS.html)。
## WIFI测试-比想象中的顺利
**当我进入Ubuntu系统的时候,就发现Wifi已经连接上了**(因为,在玩OrangePi板子时,曾经连过Wifi)。此时Wifi信号很弱,因为,还没有插上2.4G天线。插上天线后,信号就满格了。然后,插上USB鼠标和键盘,打开百度,测试一下。
![1679590037557_百度_1.jpg](//image.lceda.cn/pullimage/ctFhBQZ3NnK5jdoPJhxAJPB8QuZ55zSvtsXR2igu.jpeg)
再来跑个分:
![1679590332712_网速_1.jpg](//image.lceda.cn/pullimage/0DtCQa86Oox7Z89XCWTpEdmNVnIlkm102LPnciiW.jpeg)
由于测速网的视频元素太多了,因此,H6开发板打开这个网站非常卡,CPU占用率直接接近100%。**同时主控芯片也烫得手无法持续触摸,因此,我加了一个散热片。** 另一个命令行上的参考测速如下:
![speedtest.png](//image.lceda.cn/pullimage/B0IJ5QX6U7WExqzmGifOqWNDMC1hNx5Kto8d7jGK.png)
AP6212的理论最高速度72.2Mbps,实测速度30Mbps,基本也算差不多吧。
另外,疑似AP6212没有检测拥挤信道的功能,如果,它使用了一个拥挤的信道,那么速度会明显下降。重新连一次Wifi又会恢复正常。
![speedtest_1.png](//image.lceda.cn/pullimage/KjTddVaXNJMcsa61Nka6A8fS1VOouXFNB9p3W1uR.png)
## 音频测试-音质还可以
板子有两个音频播放源,一个是HDMI音频,另一个是板子上面的音频接口。**从我的耳朵来听,两者的音频质量和手机并没有什么差别,比我想象中的要好很多。** 我想象中的音质是MCU上面播放音乐的感觉,有很多杂音。不过,转念一想H6是用来做电视盒子的,音质不好,谁买呢?
![音乐播放.png](//image.lceda.cn/pullimage/vXuJ9YctyYJTjD18gegnpVuhmI053Q6HUgZUSn2U.png)
如果,你也想听听的话,看[项目主页](https://oshwhub.com/logicworld/h6_board)最后的音乐播放Demo,可以大概感受一下。
## GPIO测试-兼容OrangePi还是省事不少
**原理图设计时,GPIO就完全兼容了OrangePi**,因此,可以直接使用OrangePi修改过的[wiringOP](https://github.com/orangepi-xunlong/wiringOP)操作硬件。
![gpio.png](//image.lceda.cn/pullimage/wzg3TYzL9iS6uA2rigIKhMYgE3orUP6lohQ0QO50.png)
下图是按照OrangePi手册中提供的方法,控制PD22/PWM0输出PWM方波,然后,在示波器上面查看。
![1677344784668_pwm测试.png](//image.lceda.cn/pullimage/OKT3GTlZ062fQJOuH9CWiul7vcw48xQoifOmvLvi.png)
其他引脚的验证方式,也在OrangePi手册中有提供。
顺带提一句,我一开始以为wiringOP是调用了Linux驱动来完成GPIO/PWM的操作的,**实际上它是通过读写寄存器来完成GPIO操作的,绕过了Linux内核驱动框架。** 下面是它pwm驱动代码的一小部分,在wiringPi/OrangePi.c里面:
![pwm_源代码.png](//image.lceda.cn/pullimage/SA9qRxhXL5JydAlJtU8qvKoVa42GpjT2Nq01jzZq.png)
另外,全志H6是有完整的数据手册,上面描述了寄存器中每一个bit的用处。**对于想在寄存器级别操作硬件的小伙伴,可以看看。**
## USB电源控制、USB摄像头和USB固态硬盘
### USB电源控制
USB0是OTG USB接口,原理图中使用了SY6280AAC芯片来控制是否向USB接口的VBUS供电,从而实现该USB口既能做USB主机也可以做USB从机。
* 如果, USB0-DRVVBUS为低电平或高阻态时(开机默认情况),SY6280AAC芯片切断VBUS供电,**此时板子被当成USB从机,可以接到电脑USB上面**,比如:通过PhoenixSuit(安卓一键刷机工具)烧写系统,DragonHD(DDR内存测试工具)测试内存。
* 如果,USB0-DRVVBUS为高电平,SY6280AAC芯片给VBUS供电,**此时板子被当成USB主机,可以正常的接USB设备**,比如:鼠标键盘等;
![usb_otg_电路.png](//image.lceda.cn/pullimage/FqAOGdEnwXrjbR4vjENSGt099fku6WxxBl6pJOsZ.png)
### GPIO控制-/sys/class/gpio
USB0-DRVVBUS被接到了主控芯片H6的H20引脚。上一节,我们看到通过wiringOP工具可以操作IO口,但是,H20引脚并不在wiringOP的操作范围内。通过阅读了一下wiringOP的代码,发现除了直接操作寄存器以外,**还有一种更linux风格的方案,即操作/sys/class/gpio里面的文件完成对GPIO的控制**,具体可以看[这篇文章](https://blog.csdn.net/u012577474/article/details/103097375)。
``` bash
#!/bin/bash
# 脚本需要以sudo权限执行
cd /sys/class/gpio
echo 358 > export # 导出gpio358
# 358的计算方式是H20引脚的GPIO功能是PL6,即第11组的第6引脚。
# 其中11组和6引脚都是从0开始数。
# L是第11个(从0开始数):A,B,C,D,E,F,G,H,I,J,K,L。
# 每组为32个引脚,最终的编号是11*32+6=358。
cd /sys/class/gpio/gpio358
echo out > direction # 对外输出
echo high > direction # 输出高电平
```
此时USB OTG接口就变成了USB主机,此时插入USB设备就可以被系统给识别了。
### USB摄像头
为了试试USB的速度和稳定性,H6的计算能力,以及可能的AI/CV应用,**我尝试了一下USB摄像头(UVC接口,Linux内核自带驱动,系统可以自动识别)**。打开[guvcview](https://www.cnblogs.com/lovebay/p/13553842.html),1080P的视频,可以跑到15fps左右,CPU占用率50%左右,整体比较流畅,和我插到Windows电脑上面差不多。应该可以支持跑一些简单的AI/CV应用。
![uvc摄像头.png](//image.lceda.cn/pullimage/1xURIMjoqg0hVl3GwbqhC4zKA0RCdqx4EG88wcDD.png)
如果真想要尝试AI/CV应用的话呢,可以大致看一下H6芯片的性能。B站Up主工科男孙老师做了一个各种派的[天梯图](https://www.bilibili.com/video/BV1wj411c7T8?t=135.0),里面就有H6。[《买不起树莓派 如何快速评估国产派的性能?》](https://www.bilibili.com/video/BV1wj411c7T8)
![各种派的天梯图.png](//image.lceda.cn/pullimage/HTXueczC1p7xLS0mD1rgK2dlQw4g1755Lu0KuJJm.png)
### USB3.0固态硬盘
在[WhyCan论坛](https://whycan.com/t_9636.html)上面有人问H6的USB3.0情况,我手头只有USB固态硬盘是USB3.0的协议,因此,简单测试了一下硬盘的速度。
* H6开发板上的读写速度:
![256GB_H6_速度.png](//image.lceda.cn/pullimage/gxnFVG4Lz8nlHyoSW2MnOHbwP2RnTCHiuyockrug.png)
* Windows上面的读写速度:
![256GB_windows_速度.png](//image.lceda.cn/pullimage/NCgC1AMHrYCMXoYjp9klMjRiJKlbXLgQHStwLeoM.png)
## GPU测试-小板子上看到3D的效果还是有点激动的
一般情况下,Android对于GPU的支持会好得多,而Ubuntu对于GPU的支持并不太好。偶然在手册里面发现有一个gpu benchmark测试程序,**小板子上看到3D的效果还是有点激动的。**
如果,你想看动态的效果的话,可以看看[项目主页](https://oshwhub.com/logicworld/h6_board)最后的3D测试视频。
![1679593410791_3d_1.jpg](//image.lceda.cn/pullimage/rxBOIcBHxsmN0yfZWlFbgATw3mXk1vSSvoLKsXsh.jpeg)
## 稳定性测试-疑似电源完整性问题
**目前,从我实际的使用来看,可能出现了一些电源完整性上的小问题**,在特定场景下会触发重启。具体来说是,在刷完SD卡(或者安装完系统更新),第一次进入桌面GUI的那一刻,电流会飙到0.9A,然后,挂掉重启。只要我用OrangePi的板子把这个新刷的SD卡(安装完系统更新)进过一次系统,后面再用我的板子启动,就什么问题都没有了。猜测是第一次进入桌面GUI的那一刻,可能在初始化什么东西,导致计算功耗要求比较高,因此,供电没有跟上,触发了断电重启。
可能的问题在于去耦电容没有足够靠近主控芯片(0603封装太大了,应该用0402封装),或者电源层分割时,VDD-CPU的铺铜太窄了(应该用8mil/16mil的过孔,而不是8mil/18mil的,同时缩小铺铜到过孔的间距)。
**后来又经过反复测试,发现如果连接手机充电器,而不是可调电源的话,上面这些问题又都消失了。** 可能是可调电源电源质量不好,毕竟我那个电源也就是100+元的便宜货。但是,OrangePi是可以在可调电源上面正常跑的,因此我画的H6板子应该是对电源质量更敏感的。
**这个是我第一次在实际中遇到SI/PI的问题,是时候去翻一翻那些曾经看不懂的书了。**
**最后,使用手机充电器进行供电,板子已经连续正常运行30天,估计运行更久也不是什么问题了。**
![days_30.png](//image.lceda.cn/pullimage/xIwO2jonG92ASQWs2ElHEf3bZfIv8Trvi7GW0c1J.png)
## 更进一步
上面我是直接使用了OrangePi 3 LTS的系统,**因此跳过了诸如UBoot移植,设备树配置,Linux内核移植,rootfs制作,硬件驱动移植等工作**,初学入门自然是方便多了。若是有小伙伴对这个方向感兴趣的话,推荐看看[正点原子-Linux视频教程](https://space.bilibili.com/394620890/channel/seriesdetail?sid=2042045)和[韦东山-嵌入式Linux快速入门到精通【全新】](https://space.bilibili.com/275908810/channel/seriesdetail?sid=1714177)。
**当然,这些已经不属于电路设计的范畴,而进入了嵌入式软件/Linux开发的领域了。** 这个领域的书籍,视频,文档和教程,已经非常多了,而且基本都是公开的。**希望哪一天硬件领域,也能同软件领域一样自由和开放!**
# 江湖再见
至此,《从零入门ARM高速电路设计》的教程也接近尾声了,**非常感谢你能够看到这里!**
如果,你也想走一走这条路的话,**我非常愿意提供一些帮助,欢迎联系我!**
### 这不是一个结束,这是一个新的开始,江湖再见!!!
![1677342896283-封面_缩小.jpg](//image.lceda.cn/pullimage/oGSL6BFHZUCvXe6WrOh90gtv4IIuujW7DGJ3QSIw.jpeg)