Dingoo A320 ⇒ Dingoo

修正ILI9325豎紋問題


雖然司徒曾經更換過A320掌機的顯示屏(將ILI9338更換成ILI9325顯示屏),但是司徒更換後的A320掌機並沒有出現豎紋的問題,司徒會知道這個問題是經由大陸網友(陳才)的詢問,司徒才知道有些ILI9325顯示屏存在這樣的問題,而這個問題最早是發佈在Dingux Community論壇(若有興趣的使用者可以參考這裡),這位高手有發佈修改後的DL配置檔案(ILI9325_Pinkeen_Hack.zip),該DL配置檔案會於A320掌機開機後,第一時間執行相關初始化的動作(它算是一種Bootloader程式碼),接著才會將執行權交給原生系統(ucOS),因此若要徹底修復這個問題,原生系統、Dingux系統、OpenDingux系統的相關的初始化代碼檔案都必須修改才可以,雖然這位高手相當熱心的提供修改後的DL配置檔案,但是由於年代久遠,該檔案已經沒有任何網路載點可以下載,因此,司徒經過多次與大陸網友(陳才)測試後,最終修復原生系統ILI9325顯示豎紋的問題,因此,司徒決定將這個修改方式分享給有需要的使用者。

由於A320掌機的DL檔案是一種特殊格式,因此沒有任何相關檔案可以參考,所幸國外高手Booboo曾經逆向反組譯ILI9325的DL檔案(A320_PD27_ILI9325_RLS_disassembly.zip),於是司徒參考Booboo的praw.lst檔案,找出設定ILI9325暫存器的段落位置,並且參考ILI9325原廠說明檔案,最後測試多種組合後,發現只需要修改LCD Driving Wave Control(0x02)暫存器,即可修復這個問題。

修改後的代碼如下

seg000:00001A00 10 00 BC 8F lw    $gp, 0x20+var_10($sp)
seg000:00001A04 02 00 04 24 li    $a0, 2      // 0x02 Register
seg000:00001A08 00 07 05 24 li    $a1, 0x400  // Frame Inversion
seg000:00001A0C 20 24 99 8F lw    $t9, 0x2420($gp)
seg000:00001A10 09 F8 20 03 jalr  $t9         // To ILI9325

原本使用的Inversion方式是使用Line Inversion(0x700)方式,司徒最後將它改成Frame Inversion(0x400)的方式,修改這一部份就可以解決ILI9325 Inversion(豎紋)的問題,雖然Dingux Community論壇的那位高手說明他是修改Gate Scan Control(0x60)暫存器內容才解決這樣的問題,但是司徒認為他應該是沒有將過程完全說明,因為這一部分應該只需修改LCD Driving Wave Control(0x02)暫存器即可。

因此我們只需要將0x700數值改成0x400即可,但是,司徒並沒有原始程式碼,因此只能從Binary做修改,經由上面的反組譯程式碼得知,我們僅需要將機械碼00 07 05 24修改成00 04 05 24即可,因此,透過UltraEdit開啟DL檔案並且搜尋機械碼00 07 05 24的所在位置,將內容改成00 04 05 24即可,由於機械碼可能會有多個相同重複的數值,因此,使用者可以參考前後段機械碼做比對,以免修改到錯誤的地方。

修改DL檔案後,使用者就可以透過Unbrick Tool燒錄到A320掌機,這樣就可以修復原生系統ILI9325 Inversion(豎紋)的問題,使用者如果是使用Dingux、OpenDingux系統時,可以透過修改Kernel程式碼去修復這個問題,使用者可能也想問司徒:是否這樣的方式可以直接套用到ILI9331、ILI9338的DL檔案上呢?答案是不一定可行,因為MIPS組合語言,除了可以使用LI指令之外,編譯器也可以使用MOVE指令做數值搬移的動作,因此,在還沒有確定反組譯後的程式碼前,不應該直接修改DL配置檔案,以免產生其它額外的問題。


返回上一頁