掌機 - Dingoo A320 - Dingoo - 修正ILI9325豎紋問題



雖然司徒曾經更換過A320掌機的顯示屏(將ILI9338更換成ILI9325顯示屏),但是司徒更換後的A320掌機並沒有出現豎紋的問題,司徒會知道這個問題是經由大陸網友(陳才)的詢問,司徒才知道有些ILI9325顯示屏存在這樣的問題,而這個問題最早是發佈在Dingoonity論壇(http://boards.dingoonity.org/dingoo-general/screen-'interlacing'-after-flashing-(solved-not-really!)/),這位高手有發佈修改後的DL配置檔案(ILI9325_Pinkeen_Hack.zip),該DL配置檔案會於A320掌機開機後,第一時間執行相關初始化的動作,接著才會將執行權交給原生系統,因此若要徹底修復這個問題,原生系統、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
seg000:00001A08 00 07 05 24 li    $a1, 0x400
seg000:00001A0C 20 24 99 8F lw    $t9, 0x2420($gp)
seg000:00001A10 09 F8 20 03 jalr  $t9

原本使用的Inversion方式是使用Line Inversion(0x700)方式,司徒最後將它改成Frame Inversion(0x400)的方式,修改這一部份就可以解決ILI9325豎紋的問題,不過比較奇怪的地方是,Dingoonity論壇的那位高手說他是修改Gate Scan Control(0x60)暫存器內容才解決這樣的問題,不過,司徒測試後發現好像沒有辦法修復,因此,使用者之後如果需要Patch這個問題,兩種方式都可以參考看看

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

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