Rk3066無法進入系統及升級保留程序刷機方法,momo8實測


默認的rk3066升級工具是量產工具,不能保留已經安裝的程序,momo8默認設置甚至會刪除內置存儲數據(可以編輯升級config避免),修改系統文件一不小心不能進入系統又忘記備份的話,量產工具意味着一切重來。momo8現在的系統還不是很穩定,由於tf卡不夠用一直使用的內置存儲,在刷機過程中受夠了數據備份的苦頭,上午由於修改系統文件又忘了備份新安裝程序,到處找解決方法,在經歷重大損失后終於找到了方法。

   

需要的軟件:

1.刷機精靈: 下載http://www.shuame.com/ 

2.RK3066擦除工具 下載 http://www.yuandaocn.com/download.aspx?cid=7 或者http://kuai.xunlei.com/d/CRDPEIDHHSSW 

3.官方rom包,MOMO8(IPS)-4.1.1固件20120920http://www.ployer.cn/prshow.asp?id=131&p=zc 

4.老熊RK29固件修改工具 rk3066通用 http://pan.baidu.com/share/link?shareid=63747&uk=3373127877 或者http://bbs.imp3.net/thread-10480891-1-1.html 

   

開工:

1.解壓縮老熊RK29固件修改工具,把官方rom包加壓出來的update.img復制到老熊RK29固件修改\rk29打包解包工具ultra2.1目錄里,運行 rk29打包解包工具ultra2.1目錄下"固件解包.bat",解包出來的文件存放在該目錄下面"temp\image"下面。

   

2.注意rk29打包解包工具ultra2.1\temp目錄里面的parameter,這個文件存放的是各個映像包的偏移地址,

   

   

   

用記事本等打開,

   

   

mtdparts=rk29xxnand:后面則是各分區值

格式為: 分區大小@偏移大小(分區鏡像)

比如其中:0x00004000@0x00004000(kernel)

這里kerenl的偏移值則是 0x00004000

又如:0x00008000@0x00010000(recovery)

這里recovery的偏移值則是 0x00010000

再如:0x00100000@0x0031A000(system)

這里system的偏移值則是0x0031A000 

注意!該偏移值為刷入固件的偏移值,偏移值填寫錯誤可能將導致系統其他分區被覆蓋而引起死機。

   

這個是momo8 rom中system分區的偏移地址是0x0031A000 ,上面下載的RK3066擦除工具默認system偏移地址是 0x0021A000 ,這個地址每個機型可能不一樣,需要根據parameter 的內容修改,其它kernel.img、recovery.img等的偏移地址也可以從parameter 找到備用。

   

3.安裝並運行刷機精靈,如果機子已經開啟usb調試的話,刷機精靈可以連接平板;沒開usb調試的話,直接用RK3066擦除工具的切換功能就行了。已一般情況來說已經開啟usb調試 ,刷機精靈-使用工具-點擊"進入fastboot模式",平板自動重啟並進入刷機模式,不用拆機或恢復出廠設置再手動進入刷機(當初沒經驗,系統文件修改錯誤無法進入系統,恢復出廠還是不行就忘了這個方法了,白拆機了)。

   

   

4.解壓縮RK3066擦除工具,運行目錄RKDevelopTool_v1.35里面的RKAndroidTool

   

   

特別注意這里的地址欄里面的各個img偏移地址是否與解壓出來parameter里面是否一致,以momo8為例,kerenl、recovery、misc與默認地址一致,但是system不一致,對不一致的雙擊該地址欄,修改為上面解壓出來 parameter里面的地址,比如momo8的第7欄system地址修改為0x0031A000,點擊路徑之后的空白欄,選擇實際解壓出來的各個分區img,選擇好后,勾選要刷入的img,特別注意的是,如果選擇刷入misc的話,所有用戶數據以及內置sd卡都會被格式化,血的教訓啊,本來想保存用戶數據,結果連內置sd卡也被格式化了。一般只需要刷入system就行了,否則直接用量產工具不是更方便?

選擇好后,點擊執行,刷入很快,完畢后會自動重啟,之前安裝的程序包括root都會保留,每次刷機、升級不用鈦備份備份恢復了。

   

來自 <http://bbs.imp3.net/thread-10790799-1-1.html>

   

   

   

   

   

   

   

   

   

   

   

   

   

RKAndroidTool工具的各項image詳解(RK2918版本)

   

/********************************************************************************************

 * authorconowen@大鍾                                                                                                                          

 * E-mailconowen@hotmail.com                                                                                                             

 * http://blog.csdn.net/conowen                                                                                                              

 * 注:本文為原創,僅作為學習交流使用,轉載請標明作者及出處。      

 ********************************************************************************************/

..\rockdev\表示RKAndroidTool所在目錄的上一層目錄下的rockdev文件夾。

工具預設目錄為..\rockdev\,若掃描有Paremeter ,則載入,讀出分區表信息,關於Paremeter ,參看第2點。

工具的"偏移"(offset)表示分區的起始地址,也參看第2點。

   

   

1Loader.bin (100K左右)

系統啟動必須的引導文件

RK29xxLoader(L)_V2.08.bin

2Paremeter 分區信息表(50K左右)

打開rockdev目錄下的Paremeter 文件,內容如下

   

   

[java] 

view plain

copy

  • FIRMWARE_VER:0.2.3  
  • MACHINE_MODEL:rk29sdk  
  • MACHINE_ID:007  
  • MANUFACTURER:RK29SDK  
  • MAGIC: 0x5041524B  
  • ATAG: 0x60000800  
  • MACHINE: 2929  
  • CHECK_MASK: 0x80  
  • KERNEL_IMG: 0x60408000  
  • #COMBINATION_KEY: 0,6,A,1,0  
  • CMDLINE: console=ttyS1,115200n8n androidboot.console=ttyS1 init=/init initrd=0x62000000,0x800000   
  • mtdparts=rk29xxnand:0x00002000@0x00002000(misc),0x00004000@0x00004000(kernel),0x00008000@0x00008000(boot),  
  • 0x00008000@0x00010000(recovery),0x00078000@0x00018000(backup),0x0003a000@0x00090000(cache),  
  • 0x00100000@0x000ca000(userdata),0x00002000@0x001ca000(kpanic),0x00080000@0x001cc000(system),-@0x0024c000(user)  

    misc

    kernel——內核鏡像

    boot——系統引導

    recovery

    backup

    cache——緩存區

    userdata——用戶rom

    kpanic

    system——系統程序

    user———用戶儲存區

       

    前面是關於機器固件版本,機器型號,機器制造廠商的信息,當然也可以改成自己所喜歡的。

    下面的

    [java] 

    view plain

    copy

  • mtdparts=rk29xxnand  

    則表示機器nand flash的分區信息。

    [java] 

    view plain

    copy

  • 0x00002000@0x00002000(misc)  

    右邊的0x00002000表示起始地址,左邊的0x00002000表示misc分區的容量大小。至於為什么要從0x00002000開始,因為分區表Paremeter 也要占有flash的容量,Paremeter 是從0x00000000開始的。左右兩邊數值相加,就等於下一個分區的起始地址,如此類推。如到了recovery分區。

    [java] 

    view plain

    copy

  • 0x00008000@0x00010000(recovery)  

    起始地址為0x00010000recovery分區大小為0x00008000,所以下一個backu分區的起始地址為0x00018000

       

    另外,關於用戶區userdata,也就是rom區。常說的擴容就是擴展此分區。

    [java] 

    view plain

    copy

  • 0x00100000@0x000ca000(userdata),  

    先來算算此分區的大小。

    0x00100000為十六進制,折算成十進制為1048576,因為瑞芯微rockchip采用的是0.5K為單位。折算結果為

    1048576*0.5K=524288K

    524288K/1024=512M

    也就是說rom區容量為512M

    假若要擴展此分區,則往后的各個偏移量都要相加推移。

    到了最后一個user分區,

    [java] 

    view plain

    copy

  • -@0x0024c000(user)  

    左邊的"-"表示user分區占有剩余的nand flash所有容量。也就是常常存放一些用戶的數據如電影、音樂之類的。不同於rom區的存放安裝軟件。

       

    3Misc.img1K左右)

    cpu加電之后,啟動bootloader,(即是RK29xxLoader(L)_V2.08.bin),就會讀取MISC分區第一塊的內容, 決定進入recovery模式還是升級基帶Baseband ProcessorBP)或做其它事情。而更改Misc內容的操作為按下某個按鍵或者用戶設置系統。

    4kernel.img6M左右

    內核鏡像,經過編譯得出zImage,即為Kernel.img。或者SDK包直接附帶。

    5boot.img8M左右

    系統bootload啟動之后,進入正常啟動模式,就會讀取boot.img進去系統正常模式。

    boot.img包括了kernel.img鏡像和一個根文件系統(rootfs

    6recovery.img12M左右

    系統bootload啟動之后,通過讀取Misc分區的內容,確認如果是進入Recovery模式的話,進去讀取Recovery.img

    recovery.img包括了一個kernel.img與一個根文件系統(rootfs),kernel鏡像與boot,img的完全一樣。

       

    7system.img100+M左右)

    包括了系統必要的app,詳細參考

    http://blog.csdn.net/conowen/article/details/7251057

       

    8、擦除IDB

    表示清空分區表,就是低級格式化nand flash。這樣的話,要重新刷入parameter分區。

       

    附:Recovery 根文件系統目錄結構

       

    $ tree

    .

    ├── advanced_meta_init.rc

    ├── data

    ├── default.prop

    ├── dev

    ├── etc

    ├── init

    ├── init.factory.rc

    ├── init.goldfish.rc

    ├── init.quacomm.rc

    ├── init.rc

    ├── meta_init.rc

    ├── proc

    ├── res

       ├── images

          ├── icon_error.png

          ├── icon_installing.png

          ├── indeterminate1.png

          ├── indeterminate2.png

          ├── indeterminate3.png

          ├── indeterminate4.png

          ├── indeterminate5.png

          ├── indeterminate6.png

          ├── progress_empty.png

          └── progress_fill.png

       └── keys

    ├── sbin

       ├── adbd

       ├── advanced_meta_init

       ├── meta_init

       ├── meta_tst

       └── recovery

    ├── sys

    ├── system

    └── tmp

       

    來自 <http://blog.csdn.net/conowen/article/details/7251886>

       

       

       

    第一步:系統引導bootloader,即RK29xxLoaderXXX.bin文件

           加電后,CPU將先執行 bootloader程序,然后bootloader首先會讀寄存器地址base + APP_DATA1的內容, 根據這個地址的值決定是否進入recovery模式或者其它模式。bootloader還會讀取MISC分區第一塊的內容, 決定進入recovery模式還是升級基帶Baseband ProcessorBP)或做其它事情

    而上述寄存器與分區的值是有按鍵觸發或者軟件觸發的。

    a)       開機按reset+返回鍵,系統進入recovery模式,加載recovery.imgrecovery.img包含內核,基本的文件系統,用於工程模式的燒寫

    b)       開機按Power,正常啟動系統,加載boot.imgboot.img包含內核,基本文件系統,用於正常啟動機器(以下只分析正常啟動的情況)

       

    第二步: 啟動內核kernel

    1)       源碼:kernel/*

    2)       說明:kernelbootloader加載

    第三步:    文件系統(rootfs)及應用初始化(init

    1)       源碼:system/core/init/*

    2)       配置文件:system/rootdir/init.rc

    3)       說明:init是一個由內核啟動的用戶級進程,它按照init.rc中的設置執行:啟動服務(這里的服務指linux底層服務,如adbd提供adb支持,vold提供SD卡掛載等),執行命令和按其中的配置語句執行相應功能

    第四步:   重要的后台程序zygote

    1)       源碼:frameworks/base/cmds/app_main.cpp

    2)       說明:zygote是一個在init.rc中被指定啟動的服務,該服務對應的命令是/system/bin/app_process

    a)       建立Java Runtime,建立虛擬機

    b)       建立Socket接收ActivityManangerService的請求,用於Fork應用程序

    c)       啟動SystemServer

    第五步: 系統服務system server

    1)       源碼:frameworks/base/services/java/com/android/server/SystemServer.java

    2)       說明:被zygote啟動,通過System Manager管理android的服務(這里的服務指frameworks/base/services下的服務,如衛星定位服務,剪切板服務等)

    第六步:桌面launcher

    1)       源碼:ActivityManagerService.java為入口,packages/apps/launcher*實現

    2)        明:系統啟動成功后SystemServer使用xxx.systemReady()通知各個服務,系統已經就緒,桌面程序Home就是在 ActivityManagerService.systemReady()通知的過程中建立的,最終調用 ()launcher

    第七步:   解鎖

    1)       源碼:

    frameworks/policies/base/phone/com/android/internal/policy/impl/*lock*

    2)        明:系統啟動成功后SystemServer調用wm.systemReady()通知WindowManagerService,進而調用 PhoneWindowManager,最終通過LockPatternKeyguardView顯示解鎖界面,跟蹤代碼可以看到解鎖界面並不是一個 Activity,這是只是向特定層上繪圖,其代碼了存放在特殊的位置

    第八步:   開機自啟動的第三方應用程序

    1)       源碼:

    frameworks/base/services/java/com/android/server/am/ActivityManagerService.java

    2)        明:系統啟動成功后SystemServer調用ActivityManagerNative.getDefault().systemReady()通知ActivityManager啟動成功,ActivityManager會通過置變量mBooting,通知它的另一線程,該線程會發送廣播android.intent.action.BOOT_COMPLETED以告知已注冊的第三方程序在開機時自動啟動。

    第九步: 總結

    綜上所述,系統層次關於啟動最核心的部分是zygote(app_process)system serverzygote它負責最基本的虛擬機的建立,以支持各個應用程序的啟動,而systemserver用於管理android后台服務,啟動步驟及順序。

    10. 參考

    http://blog.csdn.net/basonjiang_sz/category/648399.aspx

       

       

    來自 <http://blog.csdn.net/conowen/article/details/7252490>

       

       

       

       

    Recovery簡介

    Android利用Recovery模式,進行恢復出廠設置,OTA升級,patch升級及firmware升級。

    升級一般通過運行升級包中的META-INF/com/google/android/update-script腳本來執行自定義升級,腳本中是一組recovery系統能識別的UI控制,文件系統操作命令,例如write_raw_image(寫FLASH分區),copy_dir(復制目錄)。該包一般被下載至SDCARDCACHE分區下。如果對該包內容感興趣,可以從http://forum.xda-developers.com/showthread.php?t=442480下載JF升級包來看看。

    升級中還涉及到包的數字簽名,簽名方式和普通JAR文件簽名差不錯。公鑰會被硬編譯入recovery,編譯時生成在:out/target/product/XX/obj/PACKAGING/ota_keys_inc_intermediates/keys.inc

    G1中的三種啟動模式

    MAGIC KEY:

  • camera + powerbootloader模式,ADP里則可以使用fastboot模式
  • home + powerrecovery模式
  • 正常啟動

    Bootloader正常啟動,又有三種方式,按照BCBBootloader Control Block, 下節介紹)中的command分類:

  • command == 'boot-recovery' 啟動recovery.imgrecovery模式
  • command == 'update-radio/hboot' 更新firmwarebootloader)
  • 其他 啟動boot.img

    Recovery涉及到的其他系統及文件

  • CACHE分區文件

    Recovery 工具通過NAND cache分區上的三個文件和主系統打交道。主系統(包括恢復出廠設置和OTA升級)可以寫入recovery所需的命令,讀出recovery過程中的LOGintent

  • /cache/recovery/command recovery命令,由主系統寫入。所有命令如下:
  • --send_intent=anystring - write the text out to recovery.intent
  • --update_package=root:path - verify install an OTA package file
  • --wipe_data - erase user data (and cache), then reboot
  • --wipe_cache - wipe cache (but not user data), then reboot
  • /cache/recovery/logrecovery過程日志,由主系統讀出
  • /cache/recovery/intentrecovery輸出的intent
  • MISC分區內容
    Bootloader Control Block (BCB) 存放recovery bootloader message。結構如下:
    struct bootloader_message {
    char command[32];
    char recovery[1024];
    };
  • command可以有以下兩個值
    "boot-recovery"
    :標示recovery正在進行,或指示bootloader應該進入recovery mode
    "update-hboot/radio"
    :指示bootloader更新firmware
  • recovery內容
    "recovery\n
    <recovery command>\n
    <recovery command>"
    其中recovery commandCACHE:/recovery/command命令

       

    兩種Recovery Case

  • FACTORY RESET(恢復出廠設置)
  • 用戶選擇"恢復出廠設置"
  • 設置系統將"--wipe_data"命令寫入/cache/recovery/command
  • 系統重啟,並進入recover模式(/sbin/recovery
  • get_args() "boot-recovery""--wipe_data"寫入BCB
  • erase_root() 格式化(擦除)DATA分區
  • erase_root() 格式化(擦除)CACHE分區
  • finish_recovery() 擦除BCB
  • 重啟系統
  • OTA INSTALLOTA升級)
  • 升級系統下載 OTA包到/cache/some-filename.zip
  • 升級系統寫入recovery命令"--update_package=CACHE:some-filename.zip"
  • 重啟,並進入recovery模式
  • get_args() "boot-recovery" "--update_package=..." 寫入BCB
  • install_package() 作升級
  • finish_recovery() 擦除 BCB
  • ** 如果安裝包失敗 ** prompt_and_wait() 等待用戶操作,選擇ALT+SALT+W 升級或恢復出廠設置
  • main() 調用 maybe_install_firmware_update()
  • 如果包里有hboot/radiofirmware則繼續,否則返回
  • "boot-recovery" "--wipe_cache" 寫入BCB
  • firmware image寫入cache分區
  • "update-radio/hboot" "--wipe_cache" 寫入BCB
  • 重啟系統
  • bootloader自身更新firmware
  • bootloader "boot-recovery" 寫入BCB
  • erase_root() 擦除CACHE分區
  • 清除 BCB
  • main() 調用 reboot() 重啟系統

       

    Recovery模式流程

       

    /init init.rc /sbin/recovery

    main():recovery.c

  • ui_init():ui.c UI initialize
  • gr_init():minui/graphics.c set tty0 to graphic mode, open fb0]
  • ev_init():minui/events.c [open /dev/input/event*]
  • res_create_surface:minui/resource.c [create surfaces for all bitmaps used later, include icons, bmps]
  • create 2 threads: progress/input_thread [create progress show and input event handler thread]
  • get_args():recovery.c
  • get_bootloader_message():bootloader.c [read mtdblock0(misc partition) 2nd page for commandline]
  • check if nand misc partition has boot message. If yes, fill argc/argv.
  • If no, get arguments from /cache/recovery/command, and fill argc/argv.
  • set_bootloader_message():bootloader.c [set bootloader message back to mtdblock0]
  • Parser argv[] filled above
  • register_update_commands():commands.c [ register all commands with name and hook function ]
  • registerCommand():commands.c
  • Register command with name, hook, type, cookie.
  • Commands, e.g: assert, delete, copy_dir, symlink, write_raw_image.
  • registerFunction():commands.c
  • Register function with name, hook, cookie.
  • Function, e.g: get_mark, matches, getprop, file_contains
  • install_package():
  • translate_root_path():roots.c [ "SYSTEM:lib" and turns it into a string like "/system/lib", translate the updater.zip path ]
  • mzOpenZipArchive():zip.c [ open updater.zip file (uncompass) ]
  • handle_update_package():install.c
  • verify_jar_signature():verifier.c [ verify signature with keys.inc key; verify manifest and zip package archive ]
  • verifySignature() [ verify the signature file: CERT.sf/rsa. ]
  • digestEntry():verifier.c [ get SHA-1 digest of CERT.sf file ]
  • RSA_verify(public key:keys.inc, signature:CERT.rsa, CERT.sf's digest):libc/rsa.c [ Verify a 2048 bit RSA PKCS1.5 signature against an expected SHA-1 hash. Use public key to decrypt the CERT.rsa to get original SHA digest, then compare to digest of CERT.sf ]
  • verifyManifest() [ Get manifest SHA1-Digest from CERT.sf. Then do digest to MANIFEST.MF. Compare them ]
  • verifyArchive() [ verify all the files in update.zip with digest listed in MANIFEST.MF ]
  • find_update_script():install.c [ find META-INF/com/google/android/update-script updater script ]
  • handle_update_script():install.c [ read cmds from script file, and do parser, exec ]
  • parseAmendScript():amend.c [ call yyparse() to parse to command ]
  • exeCommandList():install.c
  • exeCommand():execute.c [ call command hook function ]
  • erase DATA/CACHE partition
  • prompt_and_wait():recovery.c [ wait for user input: 1) reboot 2) update.zip 3) wipe data ]
  • ui_key_xxx get ALT+x keys
  • 1) do nothing
  • 2) install_package('SDCARD:update.zip')
  • 3) erase_root() format_root_device() DATA/CACHE
  • may_install_firmware_update():firmware.c [ remember_firmware_update() is called by write_hboot/radio_image command, it stores the bootloader image to CACHE partition, and write update-hboot/radio command to MISC partition for bootloader message to let bootloader update itself after reboot ]
  • set_bootloader_message()
  • write_update_for_bootloader():bootloader.c [ write firmware image into CACHE partition with update_header, busyimage and failimage ]
  • finish_recovery():recovery.c [ clear the recovery command and prepare to boot a (hopefully working) system, copy our log file to cache as well (for the system to read), and record any intent we were asked to communicate back to the system. ]
  • reboot()

    Recovery模式流程圖

    以下流程圖繪制了系統從啟動加載bootloader后的行為流程。

       

       

       

       

    來自 <http://blog.csdn.net/conowen/article/details/7253503>

       

       

       

       

       

       

       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM