前言
很高兴有机会参加百问网DongshanPI-D1s开发板教程共创活动。今年玩过一段时间全志D1的开发板,丰富的文档和Tina Linux让我印象深刻。D1s 是全志针对智能解码市场推出的高性价比 AIoT 芯片。它使用 64bit RISC-V 架构的阿里平头哥 C906 处理器,内置了64M DDR2,能从多种存储介质(包括SD/EMMC,SPI Nor/NAND Flash)中启动。
一、D1芯片启动相关资料和流程梳理
1.1 Boot ROM(芯片出厂内置启动程序)
根据数据手册里2.2.1节的描述,Boot ROM支持从SD卡、eMMC、SPI Nor/NAND Flash介质启动,也支持从USB或者TF卡的出厂升级,最后还支持GPIO引脚和eFuse选择启动介质。
1.2 BOOT-SEL pin(启动介质选择引脚)
根据数据手册里Table 4-3 GPIO Multiplex Function 段落可以查到,配置启动介质选择的引脚为PC4和PC5。然后在Figure 7-1 F133 Pin Map段落可以找到这两个引脚对应F133芯片封装的引脚(如下图)
1.3 BROM系统大概介绍
根据参考手册的3.4 BROM System段落的介绍,BROM可以分成两个部分,FEL(全志免砖工具,后面的教程会讲到如何使用)和启动模块两部分。启动模块会先查询BOOT_MODE寄存器(0x03006210),然后根据启动寄存器判断是由GPIO pin还是eFuse boot select来决定启动介质选择顺序(一般是使用GPIO pin,配置灵活,eFuse常规只能写一次)。然后根据参考手册的Table 3-5 GPIO Boot Select Configuration段落,可以了解到PC4和PC5是如何选择启动介质选择顺序的。
按表中的信息,理论上来说我们只需要PC4和PC5任意一个是高电平,就能保证SD卡优先启动,再查找其他介质,并不需要关注PC4和PC5的高低电平顺序。
1.4 BROM 启动流程解析
根据手册的Figure 3-6 BROM Process段落,可以看到BROM的启动过程。CPU启动后会先根据CPU Hotplug标志位判断是否进入Hotplug Process,这里我们先不看Hotplug Process(目前暂时用不到,我也不了解)。然后会检测FEL按钮是否按下,如按下则进入FEL,未按下就开始尝试从启动介质里启动,若按启动顺序的介质中找到Boot0程序,则加载Boot0并运行。假如所有的存储介质都没找到Boot0,则转入FEL的出厂升级模式。
二、开发板的启动配置电路
2.1 根据上面查到的信息,我们可以找到开发板上的PC5和PC4引脚,用万用表可以测出PC5为3.3V高电平,PC4为0V低电平。满足了PC4和PC5任意一个引脚为高电平的条件,是可以优先从SD卡启动的。按常规设计判断,下图PC5空焊盘左边的电阻和PC4空焊盘右边的电阻是这两个引脚的配置电阻,理论上移动(需要和厂家确认)这两个电阻可以修改PC4和PC5的电平。
开发板截图
三、编译TF卡固件后烧录测试
3.1 编译TF卡固件(接下来在别的教程里会有),烧录测试。经测试不能通过TF卡启动(更换其他牌子的TF卡也不行,可以判断不是TF卡兼容性问题)。
四、错误分析
4.1 根据目前的状况,以及前面的内容,可以判断开发板已正确配置,但是无法从TF卡启动。和百问网活动负责人沟通后,得到信息为当前开发板的BL702与TF卡功能冲突,需要拆掉BL702芯片。但是BL702芯片除了jtag调试功能外,还是uart0串口的板载转发芯片。如果拆掉BL702,就需要外接USB转串口模块,这并不优雅。
4.2 根据百问网提供的原理图(如下图),可以知道,SD卡信号与jtag信号是复用了SD_D1(TMS),SD_D0(TDI),SD_CMD(TDO), SD_D2(TCK) 这些引脚。现在我们在插电状态下,用万用表检查一下这几个引脚。
检测结果:SD_D1(TMS), SD_CMD(TDO), SD_D2(TCK) 的电压为3.3V,正常。
SD_D0(TDI)的电压为0.01V,不正常
根据百问网提供的原理图(如上图),可以知道,以上的四根信号线都通过47K电阻接到3.3V上拉。jtag部分的原理图未放出,先不考虑jtag的内容。
目前根据SD_D0(TDI)的电压为0.01V,可以判断得出结论,BL702的TDI引脚在未进入调试状态时,被配置为开漏输出模式,内部NMOS打开,所以SD_D0(TDI)信号线的电压被拉低至0.01V。这种情况下,SD_D0的信号是不可能正常的,SD卡也不可能正常工作。
根据搜索到的一些JTAG规范和以往我设计FPGA和单片机开发板的经验,个人觉得百问网在JTAG部分和SD卡部分电路设计是没问题的,问题的原因应该是BL702的cklink固件,在处于非调试状态时,未能重新配置TDI的io引脚,长期开启io内部的NMOS导致的。和sipeed沟通后,对方暂时没有调整固件的想法。希望平头哥官方和sipeed能重视该问题,并在以后的固件里调整。
4.3 定位可调整线路范围并修改硬件
这时候我们可以通过万用表滴滴滴的方法,找到BL702的TDI引脚以及这个引脚所接到的外围电阻,最终确定BL702的TDI引脚是通过R34这个22R的电阻接到D1s芯片的SD_D0引脚。先拆除这个电阻测试一下。
4.4 摘除电阻后,按下开发板的复位按钮,发现已经可以顺利从TF卡启动了,也正常进入TF卡上的Tina Linux系统。摘除R34,BL702的TDI引脚连接电阻后,不能使用jtag调试功能,请自行考虑后果。JTAG功能和TF卡功能在同一时间内只能用一个,而Linux必须长期使用TF卡,所以我选择的是保留板载BL702的串口转发功能,去掉JTAG调试功能。
总结
通过本次学习全志D1芯片的启动流程学习,学到了相关的知识,也在保留板载串口功能的情况下,顺利修复了开发板的TF卡启动功能。