ARM在线升级FPGA程序方法(逆向工程)
公司有款产品采用FPGA做处理器,需要
要实现该功能有几种方式:
1. 解析编译出的FPGA下载文件jic、pof,将解析后的内容烧录到EPCS4中。但是否这两种文件格式公开存储结构呢?芯片厂商是否对此保密?
2. 直接读取EPCS4的程序,烧录到另一块EPCS4中。但是否读取的EPCS4内容以及根据FPGA序列号做了加密呢?
权衡任务安排时间,选择第二种方案,毕竟就算第一种方案可行,也需要设计第二方案的读写操作。 可喜的是这次逆向工程就这么搞定了。
具体实现
ARM用IO模拟SPI总线烧FPGA配置芯片EPCS4完成软件升级,在TQ2440上测试,工程可以通过下面的 github连接获得。该工程与TQ2440平台定制,在其他平台未必能运行,建议只看 BitOpt.h,EPCS4.c,EPCSxx.h,mainboot.c
升级步骤:
1、
2、
读取的数据是最终执行的二进制Bin文件,因为Altera开发环境所生成的jic、pof与最终EPCS4内的内容不一样(除非找到生成Bin的方法)。之所以读取“所有扇区”数据是因为不知道实际Bin文件大小,干脆全部读出。EPCS4存储空间是512KB。IO模拟SPI时序的方式速度有限,读/写512KB各需要40S,用SPI总线速度会快不少。该方法已经在2块FPGA里运行没问题,证明Bin文件并没有在烧写过程中绑定FPGA芯片序列号。
演示:
启动后按“5”进入EPCS4测试代码。
按“N”将Bin文件从Nand拷贝到SDRAM的0x30200000,长度512KB。
按“W”将0x30200000的数据烧录到EPCS4中,写入后计算写入前数据校验码得0x00000039,然后再读出EPCS4中“所有”数据,计算读出内容的校验码也是0x00000039,比较校验移植返回“Success!!!”,否则返回“Check sum Error!!!”。
硬件连接:
升级过程中FPGA需要掉电,或者将FPGA与EPCSxx连接的引脚断开,否则3个设备连接到共用信号线无法通信。
EPCS4驱动编写、移植注意事项:
1、
2、
3、
4、
5、
6、
7、
正确的命令是:CS拉低——发送命令1——CS拉高;CS拉低——发送命令2——CS拉高;
不允许:CS拉低——发送命令1——发送命令2——CS拉高;
建议移植代码测试步骤
1、读取芯片ID号(silicon ID或Device Identification)
2、如果读取错误的话用示波表查看时序,保证CLK脉冲周期大于40ns,以及MOSI发送的内容正确(Read silicon ID——0xAB或Read silicon ID——0x 9F)。
3、读取扇区内容。
4、擦除、写入(写入前必须先擦除)所有扇区,并读出写入数据。
5、读取EPCSxx数据在NandFlash里建立bin文件,最后烧写到EPCSxx能运行
6、与节点管理器添加更新FPGA通信协议
ARM在线升级逆向工 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)