修改Antminer矿板的EEPROM 运行BeagleBone官方镜像
最近淘了几块ARM Cortex A8板子,应该属于淘汰下来的Antminer的矿机控制板,这个板子是基于开源BeagleBone Black板子的修改版本,PCB Layout基本一致,但阉割了部分组件。
板子外观
板子实物如下。看焊点,DC插座和UART串口排针应该是后期手工焊上去的。散热片是我自己后加的,不过这个处理器发热量不大其实不需要,靠PCB被动散热就可以,只是我觉得加了散热片比较好看。

对比官方板子
Antminer矿板和BeagleBone Black官方板子的区别如下:
- 官方版本的处理器是TI的AM3358,矿板是AM3352,他们属于同一个处理器系列(AM335x Sitara™ Processors),这两个处理器的区别不大,都是单核32位的Cortex A8,选用的速度都是1GHz,主要的区别是AM3352没有3D图形加速,不过我们用在headless场景下基本不影响。

- 官方版本和矿板的内存都是512MB DDR3L,用了美光的芯片
- 官方版本有板载4GB的eMMC,矿板去掉了
- 矿板去掉了Micro HDMI输出插座和相关电路
- 矿板去掉了USB Host、USB Client插座和相关电路
- 矿板的所有微动按钮去掉了:电源、复位、boot来源选择
上电测试
从Beaglebone官方下载了镜像用Rufus烧录到Micro SD卡,看看能不能跑起来,UART串口的电压是3.3V TTL,找了个对应的USB转串口模块,板子端接上GND、TX、RX,接上电脑,波特率是115200。

DC 5V电源上电后led灯亮了,但是完全没有输出,换刷了几个系统尝试,直到某一个老系统上终于给出有意义的报错信息:Incorrect magic number (0xffffffff) in EEPROM

EEPROM问题排查分析
阅读Beaglebone官方文档,以及网上搜集了一些资料,发现板载有个4KB的EEPROM,镜像里的u-boot启动过程中会校验EEPROM上的信息。阅读最新的u-boot源码,也找到了一段相关的代码,如果EEPROM里的信息不正确,u-boot无法判断板子型号,会把内存芯片当作预设的DDR2-266MHz来初始化,而不是Beaglebone Black上的DDR3-400MHz(Double Data Rate所以资料传输速率是800MHz,和官网描述一致),协议和时序都不对,导致板子运行不起来,上电后完全没有输出估计就是这个原因。

板子使用的EEPROM芯片的是Microchip的24LC32AT-I/OT,采用SOT-23-5pin封装,这个芯片看焊点也是后期手工焊上去的,看来是矿板系统本身不需要EEPROM,但商家补焊了一颗EEPROM上去,在板子背面的U7位置,为了方便后期跑官方镜像:

由于后焊的EEPROM数据是空的,按照官方给的文档,需要补充EEPROM里的数据,格式如下:

写入EEPROM数据
在网上找到了一个无需校验EEPROM能让板子跑起来进入u-boot console的第三方镜像 ,刷完后上电启动板子,成功进入。
根据官方文档EEPROM是在I2C 0 bus上,至于地址我们需要看电路选择,不过根据24LC32A的手册说明,SOT-23的5pin封装没有提供A0-A2脚位来选择地址,直接视为000,所以设备地址就是固定1010000,对应的十六进制是0x50,所以我们需要bus 0上的0x50地址上操作EEPROM。

在u-boot console里选择用i2c bus 0,然后probe一下,看到0x50地址有效,符合预期,然后开始使用i2c mw来写入,按照官方的EEPROM数据格式来写,serial number就用本周周数和1234,注意由于数据地址需要2字节来表达,所以地址参数要加个.2,不提供的话预设是.1(=1字节)。
i2c dev 0
i2c probe
# 0xAA5533EE
i2c mw 0x50 0x00.2 0xAA
i2c mw 0x50 0x01.2 0x55
i2c mw 0x50 0x02.2 0x33
i2c mw 0x50 0x03.2 0xEE
# A335BNLT
i2c mw 0x50 0x04.2 0x41
i2c mw 0x50 0x05.2 0x33
i2c mw 0x50 0x06.2 0x33
i2c mw 0x50 0x07.2 0x35
i2c mw 0x50 0x08.2 0x42
i2c mw 0x50 0x09.2 0x4E
i2c mw 0x50 0x0A.2 0x4C
i2c mw 0x50 0x0B.2 0x54
# 00C0
i2c mw 0x50 0x0C.2 0x30
i2c mw 0x50 0x0D.2 0x30
i2c mw 0x50 0x0E.2 0x43
i2c mw 0x50 0x0F.2 0x30
# 3425BBBK1234
i2c mw 0x50 0x10.2 0x33
i2c mw 0x50 0x11.2 0x34
i2c mw 0x50 0x12.2 0x32
i2c mw 0x50 0x13.2 0x35
i2c mw 0x50 0x14.2 0x42
i2c mw 0x50 0x15.2 0x42
i2c mw 0x50 0x16.2 0x42
i2c mw 0x50 0x17.2 0x4B
i2c mw 0x50 0x18.2 0x31
i2c mw 0x50 0x19.2 0x32
i2c mw 0x50 0x1A.2 0x33
i2c mw 0x50 0x1B.2 0x34
写完后,读出来看看,已经生效了。

成功启动官方镜像
重新烧录官方镜像,采用2020-04-06的Debian 10.3版本,成功启动了。如果用比这个新的版本,kernel会运行不起来,u-boot交接给kernel后卡在Starting kernel …,或者是kernel启动过程中抛异常,回头再研究原因。从u-boot启动日志看到现在能正常识别板子型号了:

扩容系统分区
系统预设账号是debian和temppwd,进入系统后用uname查看kernel版本是4.19.94。另外镜像只有4G,需要手动扩容用满Micro SD卡,由于系统自带没有growpart或者parted,只能用fdisk来管理分区,先扩容分区,然后再扩容ext4文件系统,现在可以用满Micro SD卡了!

# 由于fdisk不能直接扩容分区,需要删掉分区再建立
# 注意新分区的起始扇区需要设置和原来的保持一致,这样原分区的数据才能复用,我这里是8192
# 最后一步询问是否要删除signature,需要选择No,保留原来分区里的ext4 signature信息
sudo fdisk /dev/mmcblk0
sudo resize2fs /dev/mmcblk0p1
SSH远程登录
另外系统自带SSH服务器,连一根网线上网,就可以实现远程SSH登录。系统自带avahi-daemon,通过mDNS让局域网的其他机器发现他,所以如果是在同一个广播域内(multicast能打通的域),SSH登录的目标主机直接填beaglebone就可以(板子系统预设的hostname),不需要知道板子的IP。
