[原创] ARM在线升级FPGA程序方法

lzwml   2014-10-31 11:45 楼主
ARMIO模拟SPI总线烧FPGA配置芯片EPCS4完成软件升级,在TQ2440上测试(附件提供部分代码,不提供启动文件和Nand相关代码)。
升级步骤:
1、 一块已经用下载器烧录FPGA程序的EPCS4ARM连接,ARM读出EPCS4所有扇区”数据保存到NandFlash中,然后拷贝到电脑备份
2、 另一块待烧录的FPGAARM连接,将刚读出的数据烧写进去。
读取的数据是最终执行的二进制Bin文件,因为Altera开发环境所生成的jicpof与最终EPCS4内的内容不一样(除非找到生成Bin的方法)。之所以读取“所有扇区”数据是因为不知道实际Bin文件大小,干脆全部读出EPCS4存储空间是512KBIO模拟SPI时序的方式速度有限,读/512KB各需要40S,用SPI总线速度会快不少。该方法已经在2FPGA里运行没问题,证明Bin文件并没有在烧写过程中绑定FPGA芯片序列号。
演示:
启动后按“5”进入EPCS4测试代码。
1.jpg
按“N”将Bin文件从Nand拷贝到SDRAM0x30200000,长度512KB
2.jpg
按“W”将0x30200000的数据烧录到EPCS4中,写入后计算写入前数据校验码得0x00000039,然后再读出EPCS4中“所有”数据,计算读出内容的校验码也是0x00000039,比较校验移植返回“Success!!!”,否则返回“Check sum Error!!!”。
3.jpg
硬件连接:
升级过程中FPGA需要掉电,或者将FPGAEPCSxx连接的引脚断开,否则3个设备连接到共用信号线无法通信。
EPCS4驱动编写、移植注意事项:
1、 演示代码驱动部分EPCS4.cEPCSxx.h采用的是IO模拟SPI总线协议,不能直接使用,需要看的是各函数实现的逻辑,照搬到WinCE上。该代码可以直接兼容EPCS4EPCS16EPCS64。对于EPCS1EPCS128只要修改页面大小、扇区大小相关宏。EPCS1EPCS128不支持epcs_read_silicon_id具体查看EPCSxx芯片手册)。
2、 Mainboot.c文件只需要看3个函数:epcs4_write_file()epcs4_read_file()check_sum()其中读写函数必须根据具体芯片容量而定,可以通过读取芯片ID而获得芯片类型,动态修改烧写代码容量。
3、 SPI时序CLK脉冲宽度“能宽不能窄”,芯片手册建议脉冲跨度大于20nS,演示代码中IO模拟SPI速率很低,脉冲宽度3uS,所以未加任何延时。据说2440SPI总线速率能达到20MB,所以有必要适当添加延时,或配置脉冲宽度,
4、 Read Status命令可以再任何时候发送,返回0表示处于空闲状态(具体状态意义查看芯片手册),发送Read Status以外的命令必须确定芯片处于空闲状态,否则命令被抛弃。
5、 “每次”发送写、擦除命令前必须发送写使能命令
6、 发送“连续”读、写字节命令最大长度只能在一个Page范围之内,读写到Page末地址若还有数据请求,多余的部分被芯片抛弃。
7、 不允许在一个CS周期内发送两个命令
正确的命令是:CS拉低——发送命令1——CS拉高;CS拉低——发送命令2——CS拉高;
不允许:CS拉低——发送命令1——发送命令2——CS拉高;
建议移植代码测试步骤
1、读取芯片ID号(silicon IDDevice Identification
2、如果读取错误的话用示波表查看时序,保证CLK脉冲周期大于40ns,以及MOSI发送的内容正确(Read silicon ID——0xABRead silicon ID——0x 9F)。
3、读取扇区内容。
4、擦除、写入(写入前必须先擦除)所有扇区,并读出写入数据。
5、读取EPCSxx数据在NandFlash里建立bin文件,最后烧写到EPCSxx能运行
6、与节点管理器添加更新FPGA通信协议
本帖最后由 lzwml 于 2014-10-31 13:40 编辑
  • 流程图.png

    代码.rar (2014-10-31 11:43 上传)

    8.74 KB, 下载次数: 106

    ARM烧写EPCS4关键代码

回复评论 (21)

搞的不错!
生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙 =================================== 做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
点赞  2014-10-31 12:50
这个岂不是可以复制别人的东西?毫无安全性可言啊
training
点赞  2014-11-1 21:56
引用: 白丁 发表于 2014-11-1 21:56 这个岂不是可以复制别人的东西?毫无安全性可言啊
也就仅限于复制,不是破译。 除非是复制一个很成熟,电路板焊接完就能运行的产品(一般是纯数字电路产品),不然复制完没有任何价值 本帖最后由 lzwml 于 2014-11-3 15:22 编辑
点赞  2014-11-2 17:30
引用: lzwml 发表于 2014-11-2 17:30
也就仅限于复制,不是破译。
除非是复制一个很成熟,电路板焊接完就能运行的产品(一般是纯数字电路产品 ...

按说这个都应该有加解密的啊,像MCU一样 ,没想到是这个样,就是裸奔啊

training
点赞  2014-11-2 18:25
研究一下,不错,有加密会更好一点
点赞  2015-1-29 10:03
谢谢大神分享
点赞  2015-3-4 10:18
升级的文件不是自己的吗?为什么要去读呢?
点赞  2015-3-27 11:39
引用: asyou 发表于 2015-3-27 11:39
升级的文件不是自己的吗?为什么要去读呢?

那个开发工具能输出pro,jic等文件格式,能不能输出Bin文件格式我不懂,我不是搞FPGA的,同事给我所有他能生成的格式文件,没有哪个文件格式与从SPI读出的相同,自己生成的升级文件(可能有压缩)与芯片内部实际内容不同
点赞  2015-4-24 14:27
这个技术才是厉害,谢谢分享!
点赞  2015-9-16 07:48
值得收藏
点赞  2015-9-16 08:10
这个技术真牛,我也是正需要,谢谢大牛
点赞  2015-9-17 10:21

一个字:牛
点赞  2015-9-23 12:12
谢谢,我也想这样升级,想不到楼主已经实现了,这样我就不用去验证我的想法了 altera的软件可以把生成的pof文件转成bin文件的。 问几个问题: 1、lz这样的做法在实际产品中用过没,使用效果如何? 2、我现在担心的是bin文件写到配置flash的哪个地址?是否是连续写的? 3、fpga可否配置flash的数据加载地址 4、MCU、flash、FPGA三者的spi总线可以直接连在一起吗?MCU的spi在不升级时配置成浮空、开漏输出? 谢谢 本帖最后由 xtaens-nana 于 2015-12-27 12:26 编辑
点赞  2015-12-27 11:44
不错支持一下
点赞  2015-12-27 12:13
引用: xtaens-nana 发表于 2015-12-27 11:44
谢谢,我也想这样升级,想不到楼主已经实现了,这样我就不用去验证我的想法了

altera的软件可以把生成的 ...

1. 这个只是产品经理的想法(最终没有在实际产品使用,呵呵!白忙活)我当初调试时就用两块同型号的电路板做测试,一块有程序,另一块没有,升级成功,当时fpga是断电的导线连接在spi上,spi上存在flash和mcu
2. 我的bin文件时直接从flash的“首地址一直往下写”,直到bin文件完毕。但首先是你要确定你的那个真的是“bin文件”,检测方法就是从一块已经用“烧写器”下载的FPGA里读取代码,然后与你的bin文件比较
3. 我没弄过fpga,什么加载地址的不清楚
4. spi是点对点连接,同一时刻只能存在两个设备,至于不用的设备引脚配置成什么我没有把握(应该是悬空),“当时我做的时候是将FPGA的电源关掉”。你可以查看FPGA的datasheet,看看此时fpga的引脚状态
点赞  2015-12-28 09:48
引用: lzwml 发表于 2015-12-28 09:48
1. 这个只是产品经理的想法(最终没有在实际产品使用,呵呵!白忙活)我当初调试时就用两块同型号的电路 ...

谢谢啊

我下次试试这个方法
点赞  2016-1-3 12:31
感谢楼主资源分享
点赞  2016-1-5 09:22
谢谢大神分享
点赞  2016-4-16 14:11
下面的内容是我做这个设计时的思路 初衷 产品发布出去有可能需要在用户现场升级,FPGA程序烧录采用的是厂家提供的配套烧录器,现场环境设备外壳封死,无法连接烧录器,即使能打开用户也无法接受拆机,所以需要提供一种能代替烧录器的方案。 本需求用了4天内完成,2天看资料芯片手册、1天写测试、1天最终实践,开发还算挺快,主要是方案选择正确没走弯路。 本产品的主要难点在于: 1)用什么接口像EPCS4烧录 2)烧录的内容是什么格式 3)烧录内容有没有加密 产品简易连接图 烧录时 系统初期烧录器想EPCS4写入程序,发布时不烧录器不连接 arm --xxx---| | | | | EPCS4 ---烧录器 | | fpga--xxx---| 运行时 fpga通过spi总线从EPCS4载入程序,运行 arm --xxx---| | | | | EPCS4 | | fpga--spi---| 在线升级 fpga断开与EPCS4的连接,arm通过spi总线像EPCS4写入新程序 arm --spi---| | | | | EPCS4 | | fpga--xxx---| ================================================================ 方案1:解析pof文件 fpga的集成开发援交生成的下载文件格式之一是pof文件,解析此文件的文件格式,转换成最终存储于EPCS4里的内容,也就是bin文件 风险: pof加密格式我能否找得到? 需要做的工作: 1)读EPCS4 2)写EPCS4 3)EPCS4用什么接口 4)pof文件格式是什么,Altera公司是否对他开源? 方案2:Altera开发环境生成bin文件 其实Altera能生成bin文件格式,猜测该格式是无加密的,应该是pof文件的解压结果,bin明显比pof大得多。 风险: 生成的bin文件在用烧录器烧录的过程中“会不会被烧录器加密”,烧录进EPCS4的内容是其他的? 需要做的工作: 1)读EPCS4 2)写EPCS4 3)EPCS4用什么接口 4)比较从EPCS4读取的bin内容与Altera生成的bin内容是否一致 5)无论4)结果如何都将Altera生成的bin用ARM烧录到EPCS4,是否能运行 方案3:移花接木 了解EPCS4的通信方式,从产品的EPCS4里读取数据,再将内容写到另一台“干净”的EPCS4芯片,测试产品能否运行。这方法与用PE恢复计算机密码原理一样,PE启动盘的恢复密码功能就是备份一个无密码系统下的“密码文件”覆盖要恢复的系统的源文件。 风险: EPCS4里有没有某特别的存储空间,该空间存储FPGA的序列号,该bin文件包含FPGA的序列号加密内容,移花接木只能烧回到原来的FPGA所在的EPCS4电路板,而不能是其他电路板 需要做的工作 1)读EPCS4 2)写EPCS4 3)EPCS4用什么接口 分析3个方案,方案3工作最简单,即使失败也不影响我抓向其他方案,因为方案3的3个必备工作即使换到其他方案也是需要做的。 ================================================================ 实施方案3的时候顺便测试方案2,果不其然,Altera生成的bin文件格式与最终EPCS4读取的内容不一致,这与我的风险分析一样。 本帖最后由 lzwml 于 2017-2-8 16:31 编辑
点赞  2017-2-8 16:25
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复