新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM在線升級FPGA程序方法(逆向工程)

        ARM在線升級FPGA程序方法(逆向工程)

        作者: 時間:2016-11-21 來源:網絡 收藏
        為什么寫該文
        公司有款產品采用FPGA做處理器,需要遠程升級—— 不使用燒寫器,通過網絡對其升級。領導提議既然程序是存儲在外部存儲器上的,那么能否通過EPCS4與ARM SPI 總線通信連接刷新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、一塊已經用下載器燒錄FPGA程序的EPCS4與ARM連接,ARM讀出EPCS4“所有扇區”數據保存到NandFlash中,然后拷貝到電腦備份。
        2、另一塊待燒錄的FPGA與ARM連接,將剛讀出的數據燒寫進去。
        讀取的數據是最終執行的二進制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、演示代碼驅動部分EPCS4.c、EPCSxx.h采用的是IO模擬SPI總線協議,不能直接使用,需要看的是各函數實現的邏輯,照搬到WinCE上。該代碼可以直接兼容EPCS4、EPCS16、EPCS64。對于EPCS1、EPCS128只要修改頁面大小、扇區大小相關宏。EPCS1、EPCS128不支持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 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通信協議



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 沙田区| 甘孜| 北安市| 尚义县| 兴国县| 德安县| 常宁市| 纳雍县| 土默特右旗| 勃利县| 安阳市| 仙桃市| 城口县| 南岸区| 隆子县| 织金县| 西充县| 八宿县| 武胜县| 繁昌县| 准格尔旗| 阿鲁科尔沁旗| 荣成市| 灵璧县| 六枝特区| 北海市| 齐齐哈尔市| 台南市| 鄱阳县| 钟山县| 盘山县| 荥经县| 天津市| 布拖县| 曲阳县| 凉城县| 龙口市| 鱼台县| 沅陵县| 鄯善县| 阳曲县|