前往: 導覽, 搜尋

PX30 Android 8.1.2 Manual

目錄

android開發平台的搭建

Android系統編譯整套源碼包對PC機硬件要求很高,請直接安裝Linux操作系統,充分發揮PC機的性能,不要企圖通過虛擬機順利開發。我們這裡以ubuntu14.04 64位系統機器為例講解,如果您是新手,建議與我們版本保持一致。

使用U盤安裝ubuntu

使用U盤安裝ubuntu系統簡單快捷,強烈推薦使用此方法安裝。

安裝工具:

安裝方法:

第一步:下載好ubuntu的ISO文件,和lili usb creater這個軟件並安裝。

第二步:插入usb,並打開usb creater 這個軟件,根據軟件提示設置,在步驟1中選擇安裝盤,找到識別出的U盤;在步驟2中找到下載的ubuntu映像文件;步驟3默認,步驟4中選中隱藏優盤上創建的文件,使用FAT32格式化U盤;最後在步驟5中點擊閃電圖標開始安裝,直到提示優盤已安裝完成為止。

USB-MemoryToUbuntu.png

第三步:重啟電腦,開機時,看清屏幕下方的提示,進入BIOS設置菜單,選擇U盤啟動。一般台式機是按DEL鍵,筆記本有些是按F2,有些按F10進入。設置完成後保存退出。

第四步:再次重啟系統,這時已經可以看到ubuntu的安裝界面了,選擇中文,繼續;

第五步:選擇 install (您也可以選擇live mode 可以體驗下系統),繼續;

第六步:也選擇中文,點擊繼續:再繼續;

第七步:配置網絡,可以安裝時升級,也可以不升級,等安裝完系統後再手動升級;

第八步:第一個選項是把以前的系統升級到ubuntu14.04,如果你只要單系統的可以選擇第一項,第二項是升級到ubuntu14.04並把其他的資料刪除掉,第三項是我們用的最多的,比較靈活,選something else,繼續,在這裡我分出了兩個區給ubuntu,一個 / 和 一個 /home ,分區可以新建,可以對它格式化,具體根據需要選擇;

第九步:這是設置區域,選擇上海就行了;

第十步:選擇鍵盤布局。選中國;

第十一步:選擇用戶名和密碼,到此配置完畢,點擊繼續直接安裝,喝一會兒咖啡,待安裝完畢,重啟之後,就可以看到美麗的ubuntu世界了。

設置XP為開機默認啟動

ubuntu安裝後每次開機都是默認進入ubuntu系統的,對於以windows為主的朋友,每次開機都要守在畫面切換到XP啟動,可見十分麻煩,通過下面,你可以設置讓你的XP系統為第一啟動。

修改/boot/grub/grub.cfg文件,可以看到最末尾有如下語句:


menuentry "Microsoft Windows XP Professional (on /dev/sda1)" {

insmod part_msdos

insmod ntfs

set root='(hd0,msdos1)'

search --no-floppy --fs-uuid --set 0E48A65048A6367D

drivemap -s (hd0) ${root}

chainloader +1

}
### END /etc/grub.d/30_os-prober ###

仔細閱讀該文件,發現有不少menuentry,這些正是對應了開機啟動時的選擇項,將上面語句放在第一個menuentry的前面,這樣Windows XP就為默認的啟動系統了。修改後的部分代碼如下:


### BEGIN /etc/grub.d/05_debian_theme ###

set menu_color_normal=white/black

set menu_color_highlight=black/light-gray

### END /etc/grub.d/05_debian_theme ###

### BEGIN /etc/grub.d/30_os-prober ###

menuentry "Microsoft Windows XP Professional (on /dev/sda1)" {

insmod part_msdos

insmod ntfs

set root='(hd0,msdos1)'

search --no-floppy --fs-uuid --set 0E48A65048A6367D

drivemap -s (hd0) ${root}

chainloader +1

}

### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/10_linux ###

menuentry 'Ubuntu, with Linux 2.6.35-30-generic' --class ubuntu --class gnu-linux --class gnu --class os {

recordfail

insmod part_msdos

insmod ext2

set root='(hd0,msdos9)'

search --no-floppy --fs-uuid --set 4833f619-6388-4dd3-acd7-6fa3eacb9a15

linux /boot/vmlinuz-2.6.35-30-generic root=UUID=4833f619-6388-4dd3-acd7-6fa3eacb9a15 ro quiet splash

initrd /boot/initrd.img-2.6.35-30-generic

}

ubuntu下安裝源碼比較工具

ubuntu下源碼比較工具很多,比較常見的是meld工具,使用如下指令安裝:

sudo apt-get install meld

安裝完成後,可以在應用程序->編程中打開。

ubuntu下安裝串口終端minicom

使用如下指令安裝:

sudo apt-get install minicom

安裝完成後,需要設置minicom。如果直接使用串口,通常設置為ttyS0,如果使用USB轉串口,通常設置為ttyUSB0。輸入如下指令:

sudo minicom -s

選擇Serial port setup,選擇A,輸入正確的串口終端,選擇E,輸入115200 8N1,選擇F和G,都設置為No,不使用流控,再回車,選擇Save setup as dfl。注意,只有root用戶才有權限保存參數。筆記本用戶通常使用的USB轉串口延長線,目前市面上大多都是pl2303方案,插上USB轉串口延長線後,輸入如下命令查詢驅動是否正常加載:

lsmod |grep pl2303

正常加載時會提示如下信息:

lqm\@lqm:~$ lsmod |grep pl2303

pl2303 11756 1

usbserial 33100 3 pl2303

再使用如下命令查詢系統的一些信息:

dmesg | tail -f

正常情況下會出現如下提示:


lqm\@lqm:~$ dmesg |tail -f

[ 383.093851] ERROR! H2M_MAILBOX still hold by MCU. command fail

[ 383.148849] ---> RTMPFreeTxRxRingMemory

[ 383.148903] <--- RTMPFreeTxRxRingMemory

[ 383.180580] RTUSB disconnect successfully

[ 387.762330] usb 2-4: USB disconnect, address 3

[ 387.762566] pl2303 ttyUSB0: pl2303 converter now disconnected from ttyUSB0

[ 387.762601] pl2303 2-4:1.0: device disconnected

[ 392.164589] usb 2-4: new full speed USB device using ohci_hcd and address 5

[ 392.379898] pl2303 2-4:1.0: pl2303 converter detected

[ 392.412998] usb 2-4: pl2303 converter now attached to ttyUSB0

表示串口設備名稱為ttyUSB0。有時會提示如下錯誤:


lqm\@lqm:~$ dmesg | tail -f

[ 408.910351] 0x1300 = 00073200

[ 413.945752] ===>rt_ioctl_giwscan. 8(8) BSS returned, data->length = 1177

[ 419.047006] ===>rt_ioctl_giwscan. 7(7) BSS returned, data->length = 1067

[ 419.047302] ==>rt_ioctl_siwfreq::SIOCSIWFREQ[cmd=0x8b04] (Channel=1)

[ 419.392535] wlan0: no IPv6 routers present

[ 433.902136] ===>rt_ioctl_giwscan. 6(6) BSS returned, data->length = 960

[ 473.902907] ===>rt_ioctl_giwscan. 8(8) BSS returned, data->length = 1271

[ 533.900777] ===>rt_ioctl_giwscan. 8(8) BSS returned, data->length = 1200

[ 613.904091] ===>rt_ioctl_giwscan. 9(9) BSS returned, data->length = 1435

[ 713.904199] ===>rt_ioctl_giwscan. 8(8) BSS returned, data->length = 1263

一般情況下重插撥一次USB轉串口線即可。

ubuntu下安裝串口終端picocom

picocom 是一款linux下的串口調試工具,它比minicom精巧的多,在使用minicom調試時,有時我們會手動清除之前的調試信息,這時minicom再次接收串口調試數據時,不會再從頂端顯示打印信息,而是從最末一行,程序員看起來會很彆扭。而picocom並不會出現這種BUG。使用如下指令安裝picocom:

sudo apt-get install picocom

安裝完成後,執行如下指令打開picocom:

sudo picocom -b 115200 /dev/ttyUSB0

這裡115200表示波特率,/dev/ttyUSB0表示PC機上的調試串口的設備節點,用戶根據實際情況進行調整。

Android開發工具

SDK

谷歌公司開發的Android Studio提供用於為各類 Android 設備開發應用的最快速的工具。利用世界一流的代碼編輯、調試、性能工具、一套靈活的構建系統以及一套即時構建/部署系統,您可以專注於構建獨特的高品質應用。

網上下載最新的SDK,下載地址為:[1]。用戶可根據自身的PC機系統選擇對應的安裝包。用戶可根據自身的PC機系統選擇對應的安裝包,如下圖所示:

Androidstudio.png

adb工具

安裝adb工具

在光盤中找到fastboot_adb.rar文件,解壓出來,將fastboot文件夾下面的adb.exe、AdbWinApi.dll、AdbWinUsbApi.dll以及fastboot.exe四個文件拷貝到C:\Windows\System32目錄,如果是64位系統,需要同時拷貝到C:\Windows\SysWOW64目錄,adb和fastboot即安裝成功。

查看設備的連接狀態

開發板上電,進入 setting,選擇" developer options",勾選" USB debugging"進入WINDOWS下的CMD命令行,輸入如下命令驗證開發板是否連接:

adb devices

顯示下面內容表示成功連接:

Adb-device.png

進入adb shell

使用如下命令進入開發板終端:

adb shell

如下圖所示:

Adb-shell.png

輸入exit退回DOS操作界面。注意,有時候,執行adb devices命令時,會提示error: more than one device and emulator,很有可能是播放了USB設備造成的。這時已經無法再通過adb傳輸數據,解決的辦法很簡單,如果是使用windows,直接在進程中幹掉adb.exe,再啟動adb即可。

串口工具secureCRT

安裝secureCRT工具,在計算機設備管理器中找到COM口號,點擊"快速連接",如下圖:

SecureCRT.png

協議選擇serial(我的設備是COM2),其他選項按照下圖所示選擇,右側三個流控制選項不能勾選!

SecureCRT-set.png

接下來用USB轉串口線接到開發板的調試串口與PC即可看到調試串口打印的log信息。

Usb-serial-log.png

安裝android源碼包

安裝android源碼依賴包

說明:本文檔所有開發全部基於ubuntu14.04 64位系統,後續不再聲明。

使用如下命令安裝所需的軟件包(安裝前使用sudo apt-get update 獲得一下最近的軟件包的列表):

sudo apt-get install git-core gnupg flex bison gperf libsdl-dev libwxgtk2.8-dev build-essential zip curl libncurses5-dev zlib1g-dev genromfs u-boot-tools libxml2-utils texinfo mercurial subversion whois

px30 android8編譯需要jdk8,軟件包可以從sun官網下載,也可以使用網盤提供的壓縮包(網盤資料DVD_X30/tools/JDK/)java-8-openjdk-amd64.tar.bz2文件,將此文件下載後複製到PC Ubuntu系統下,解壓到/usr/lib/jvm/目錄下:

sudo tar xjf java-8-openjdk-amd64.tar.bz2 -C /usr/lib/jvm

注意:這樣安裝了jdk8後不會覆蓋PC Ubuntu系統原來使用的jdk,當px30 android8編譯需要使用時鍵入命令:

export PATH=/usr/lib/jvm/java-8-openjdk-amd64/bin:$PATH

另,Android8編譯時為了操作方便,統一使用編譯腳本mk.sh(編譯腳本一般放在整套SDK源碼的根目錄,命名為mk.sh或mk)來編譯,以上命令可以在編譯腳本看到。

安裝交叉編譯工具鏈

我們已經將交叉編譯工具鏈集成到源碼包中,無需再手動安裝。交叉編譯工具鏈路徑:

prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/
prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/

注意:如果需要詳細獲取具體使用哪種交叉編譯器,可以進入文件kernel/Makefile文件,搜索關鍵詞CROSS_COMPILE,在arm64的那項可發現。

安裝64位系統必要的一些補丁包

apt-get install lsb-core libc6-dev-i386 g++-multilib lib32z1-dev lib32ncurses5-dev

指定GCC交叉編譯器

註:本節是其他代碼編譯需要準備的環境,不適用PX30 Android8環境,僅供參考。

在ubuntu系統上安裝最新的GCC交叉編譯器時,版本已經超過4.4了,使用如下指令可查詢GCC的版本:

gcc --version

可能出現的界面如下:


terry\@ubuntu-server:~$ gcc --version

gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

Copyright © 2011 Free Software Foundation, Inc.

terry\@ubuntu-server:~$

上面顯示4.6.3版本,默認我們給出的包,在4.6.3上編譯會提示一些錯誤,都是新的GCC引出的錯誤,網上都有解決辦法,如果不想修改這些錯誤,可將GCC版本降至4.4即可。解決辦法 :

sudo apt-get install gcc-4.4 g++-4.4 g++-4.4-multilib

裝完後,開始降級gcc ,這不會影響系統,僅僅是改個鏈接而已,不喜歡的話改回來即可。

cd /usr/bin

sudo mv gcc gcc.bk

sudo ln -s gcc-4.4 gcc

sudo mv g++ g++.bk

sudo ln -s g++-4.4 g++

安裝android源碼包

PX30 Android8源碼包獲取方式有:從網盤獲取,從gitlab獲取。

方法1:從網盤獲取

從網盤DVD_X30/source/目錄下獲取Android8.1的源碼包px30_oreo.tar.bz2,將其複製到本地PC Ubuntu系統用戶目錄下,解壓:

tar xjf px30_oreo.tar.bz2

壓縮包解壓完成後在px30_oreo目錄下只有一個目錄.git,需要下面的操作才可以獲取源碼:

cd px30_oreo
git checkout .

稍等片刻待此指令執行完成後即可獲取源碼。

如果需要更新源碼,首先確定是否包含http://gitlab.com/9tripod/px30_oreo.git這一項:

$ git config --list

[[File:File:Gitlab.png]

如果不存在,請執行以下指令添加:

git remote add gitlab http://gitlab.com/9tripod/px30_oreo.git

添加後再次執行git config --list即可看到以上內容,然後更新:

git pull gitlab

方法2:從gitlab獲取代碼

進入普通用戶某目錄下,鍵入指令:

git clone http://gitlab.com/9tripod/px30_oreo.git

等待下載完成後,可在當前目錄下獲取px30_oreo,進入目錄即可獲取源碼。

如果因為網絡問題總是中斷,可從網盤下載初始包(見上面方法1),同樣獲取到源碼,然後更新(注意更新源操作同方法1,添加同樣使用git remote add):

git pull gitlab

說明:源碼包名稱可能會因發布日期等有所不同,具體以網盤中實際名稱為準。

編譯android源碼包

說明:編譯映像時一定要使用普通權限編譯。編譯生成的鏡像統一放在out/release目錄下,包括MiniLoaderAll.bin、uboot.img、trust.img、resource.img、kernel.img、boot.img、misc.img, recovery.img、system.img、vendor.img、oem.img、update-android.img

編譯uboot

在android源碼目錄下執行如下命令編譯uboot,編譯完成後映像文件會釋放到out/release目錄:MiniLoaderAll.bin、uboot.img、trust.img

./mk -u

編譯android內核

在android源碼目錄下執行如下命令編譯android內核,編譯完成後映像文件kernel.img、resource.img會釋放到out/release目錄。

./mk -k

編譯android文件系統

在android源碼目錄下執行如下命令編譯android映像文件,編譯完成後映像文件會釋放到out/release目錄。

./mk -s

編譯完文件系統,在out/release目錄下會生成如下文件:

  • MiniLoaderAll.bin、uboot.img、trust.img: uboot映像文件
  • Kernel.img:內核映像
  • Resource.img:資源映像,內含開機圖片和內核的設備樹信息。
  • Boot.img: Android的初始文件映像,負責初始化並加載system分區。
  • System.img:android的system分區映像,ext4文件格式系統。
  • Recovery.img:急救模式映像。
  • Misc.img:分區映像,負責啟動模式切換和急救模式的參數傳遞。
  • oem.img:用於給廠家使用,存放廠家的APP或數據。只讀
  • update-android.img:整個升級文件的單一映像,包括了uboot,內核,文件系統等。

查看編譯幫助

執行如下指令可查詢mk腳本使用方法:

./mk -h

"-u"表示編譯uboot

"-k"表示編譯內核

"-s"表示編譯Android文件系統

"-U"表示所有的鏡像編譯完成後執行打包程序(生成update-android.img鏡像)

"-j="表示多線程編譯(比如-j=20)

"-a"表示所有的都執行。注意,"-a"等同於"./mk.sh -u -k -s -U"

燒寫android映像文件

Windows系統映像燒寫

RKTool驅動安裝

解壓RKTools.rar,工具路徑:SDK\RKTools\windows\Release_DriverAssitant,打開"DriverInstall.exe",點擊"驅動安裝",提示安裝驅動成功即可。

Rktools-driver.png

Rktool-driver-ok.png

注意事項:\ 1.目前支持的操作系統包括:XP,Win7_32,Win7_64,Win8_32,Win8_64。\ 2.XP系統在驅動安裝完後,若還提示"發現新設備", 安裝驅動時選擇"自動安裝"。\ 3.若之前已經安裝過老版本驅動,請先點擊"驅動卸載"後再進行"驅動安裝"。

燒錄方法一:單個升級固件update-android.img

生成統一固件update-android.img

我們已經在mk腳本中集成了生成統一固件的方法,把所有的鏡像編譯完成後執行-U即可打包,釋放到out/release目錄。

燒錄固件update-android.img

打開源碼包目錄下的RKTools\windows\AndroidTool\AndroidTool_Release_v2.58\AndroidTool.exe,選擇"升級固件"選項卡,點擊"固件",在彈出窗口中選擇已經生成的update.img 文件,如下圖所示。

Px30-tool1.png

Px30-tool2.png

工具配置好後,連接開發板(如下圖):

Px30-tool3.png

按下RECOVERY鍵,然後插上microUSB線與12V DC電源線,燒錄工具界面會提示發現一個LOADER設備,然後點擊升級,即可開始升級過程(註:如果提示發現一個ADB設備,點擊切換按鈕切換成LOADER設備即可)。

Px30-tool4.png

Px30-tool5.png

上圖為升級完成截圖。

燒錄方法二:多設備升級固件update.img

該工具適合用戶批量刷機,可以同時給多台開發板刷機。

從代碼目錄下獲取文件RKTools\windows\FactoryTool_v1.63.zip,將其解壓,打開"FactoryTool.exe",點擊"固件"選擇update-android.img,勾選"升級",點擊"啟動",如下圖所示:

步驟1:點擊固件,選擇update-android.img;

步驟2:點擊啟動(選擇升級按鈕);

步驟3:連接開發板USB、DC電源,按下recovery鍵,對應USB口發現設備,並實現自動升級;然後重複步驟3即可同時升級第二台、第三台設備,升級成功或者失敗的設備會在兩邊的列表中列出,移除成功或者失敗的設備後可以繼續連接需要升級的設備。

FactoryTool.png

Linux系統燒寫映像

生成固件update.img

我們已經在mk腳本中集成了生成統一固件的方法,在編譯android文件系統時(./mk -s),會自動生成update.img,並釋放到out/release目錄。

燒錄固件update-android.img

工具路徑:RKTools\linux\Linux_Upgrade_Tool_v1.2

在升級之前將update.img拷貝到upgrade_tool相同目錄下,運行upgrade_tool(需要sudo)

work\@ubuntu:~/3288/Linux_Upgrade_Tool_v1.2/cp rockdev/update.img .
work\@ubuntu:~/3288/Linux_Upgrade_Tool_v1.2$ sudo ./upgrade_tool

執行結果如下圖,發現設備列表,輸入要升級的DevNo(設備號)選擇設備DevNo.png

選擇設備後彈出工具使用菜單如下圖,左側是功能描述,右側是命令語法,升級相關操作都在upgrade command列表下,忘記命令語法可以輸入H進行查看,清屏輸入CS,退出按Q。

DevNo1.png

  • CD命令:選擇設備,當執行的命令有包含設備重啟操作時,需重新選擇設備,當改變操作設備時需重新選擇
  • SD命令:msc切換到rockusb升級模式。 當切換執行成功後, 需要重新選擇設備
  • UF命令:升級完整update.img固件,當執行成功後需要重新選擇設備
  • UL命令:升級loader功能,當執行成功後需要重新選擇設備
  • DI命令:下載單獨image鏡像到指定扇區,例如升級kernel.img或者system.img都可以直接使用此功能.例如下載kernel.img: DI -k kernel.img parameter //如果之前通過DI下載過parameter,則再下載kernel.img時就可以不用指定最後的parameter參數
  • DB命令:下載boot,在maskrom狀態下,可以通過此功能, 讓maskrom設備進行Rockusb協議通訊
  • EF命令:擦除整個nandflash
  • LF命令:低格保留塊後面區域,只有在loader模式下使用

執行uf update.img開始更新固件,下圖為更新完成截圖。

Rockusb>uf update.img

DevNo2.png

備註:也可通過配置config.ini文件配置升級映像文件,只需輸入UF即可升級,請用戶自行嘗試。

使用upgrade_tool指令燒寫映像

上一節我們介紹了通過upgrade_tool燒寫統一固件update.img的方法,熟悉三星平台的開發者會發現,這種方法並不是很高效,真正操作起來,它遠沒有fastboot工具來的迅速。其實,upgrade_tool工具同樣支持類似於fastboot的燒寫方式。

為了燒寫方便,在mk腳本中,默認在編譯系統時,已經將燒寫工具upgrade_tool拷貝到out/release目錄了。

第一步:打開串口終端,並打開minicom,用於適時監控串口調試信息;

第二步:按住RECOVERY鍵,連接USB OTG線和電源線,這時uboot打印信息將會提示已經進入USB下載模式。如果接通電源後沒來得及按住RECOVERY鍵,在按住RECOVERY鍵的同時,再按下復位鍵即可。注意,使用

第二步:打開第二個串口終端,進入out/release目錄;

第三步:在out/release目錄下敲擊如下指令,燒寫相應的映像。


sudo upgrade_tool di --k kernel.img(烧写内核)

sudo upgrade_tool di --s system.img(烧写文件系统)

sudo upgrade_tool di resource resource.img(烧写资源文件)

sudo upgrade_tool di --r recovery.img(烧写急救文件)

sudo upgrade_tool ul RK3288UbootLoader_V2.30.10.bin(烧写bootloader)

sudo upgrade_tool uf update.img(烧写统一固件)

使用Rkflashkit燒寫映像

rkflashkit 有圖形界面,後加了命令行支持,更是好用。


work\@ubuntu:~/rktool$ sudo apt-get install build-essential fakeroot

work\@ubuntu:~/rktool$ git clone https://github.com/linuxerwang/rkflashkit

work\@ubuntu:~/rktool$ cd rkflashkit

work\@ubuntu:~/rktool$ ./waf debian

work\@ubuntu:~/rktool$ sudo apt-get install python-gtk2

work\@ubuntu:~/rktool$ sudo dpkg -i rkflashkit_0.1.4_all.deb

注意:rkflashkit_0.1.4_all.deb會因版本更新,版本數字可能會有所變化,如果執行失敗,執行ls命令查看下即可。

work\@ubuntu:~/rktool/$ sudo rkflashkit

如下是圖形界面,在Devices下選擇設備,選擇要燒寫的分區和對應的映像文件,點擊Flash image即可。

Rkflashkit.png

該工具也支持命令行,使用help命令查看使用方法

work\@ubuntu:~/rktool/rkflashkit$ rkflashkit --help

Usage: <cmd> [args] [<cmd> [args]...]

part List partition

flash @<PARTITION> <IMAGE FILE> Flash partition with image file

cmp @<PARTITION> <IMAGE FILE> Compare partition with image file

backup @<PARTITION> <IMAGE FILE> Backup partition to image file

erase @<PARTITION> Erase partition

reboot Reboot device

For example, flash device with boot.img and kernel.img, then reboot:

sudo rkflashkit flash \@boot boot.img \@kernel.img kernel.img reboot

work\@ubuntu:~/rktool/rkflashkit$

使用TF卡升級固件

功能說明

註:此功能等待後續驗證,暫未實現,以下是其他平台的參考。

SD Card Boot功能是主控在上電時,優先從SD卡上查找啟動代碼,然後加載引導,從而實現特定功能。目前SD Card Boot已經實現兩個功能:SD卡升級和SD卡運行。

SD卡升級功能,將SD卡啟動代碼寫到SD卡的保留區,然後將固件拷貝到SD卡可見分區上,主控從SD卡啟動時,SD卡啟動代碼和升級代碼將固件升級到本地主存儲中,並支持PCBA測試和Demo文件的拷貝。可以完全做到脫離PC機進行固件升級,提高生產效率。

SD卡運行功能,將固件升級到SD卡保留區中,把SD卡當作主存儲使用。主控從SD 卡啟動時,固件已經存放在SD卡上,有沒有本地主存儲都可以正常工作。目前主要應用是板卡廠做PCBA測試,而不會破壞flash數據。

軟件說明

工具目錄有如下文件:

SD Fireware Tool.png

SD_Firmware_Tool.exe:制卡工具

Config.ini:配置文件

SDBoot.bin:SDRK2926、RK2928、RK3166和RK3188使用SDBoot.bin支持SD卡升級和啟動功能;RK3288使用RK3288Loader_uboot_V2.16.bin及以後版本。

製作前軟件配置

編輯config.ini配置文件以下項目設置為TRUE

  • #當值為TRUE時,新卡格式適用3288項目
  • USE_FW_LOADER=TRUE

工具界面如下:

SD Fireware Tool-interface.png

製作

注意:製作啟動卡會格式化SD卡,用戶需要注意備份重要數據,防止誤刪。

第一步,選擇對應的可移動磁盤設備;

第二步,選擇功能模式:固件升級、PCBA測試、SD啟動;

  • 默認會勾選"固件升級",即只升級固件。
  • 如果在升級固件前需要做 "PCBA 測試",則同時勾選"固件升級"、"PCBA測試"。
  • 如果不升級固件,只需要測試PCBA,則單選"PCBA測試",不選擇"固件升級"。
  • "SD啟動"會把固件燒寫到SD中,所有分區都分配在SD卡上,運行時不會修改內部存儲的數據(相當於SD卡做主存儲設備)。

注意:SD卡運行模式,對kernel的編譯有要求,需要把kernel的SD卡驅動配置去掉,不參與編譯。

SD-runMode.png

修改為:

SD-runMode-change.png

第三步,選擇對應平台的update.img固件;

第四步(可選),如果需要拷貝demo文件到用戶盤根目錄,點擊選擇Demo按鈕,選擇需要拷貝的文件目錄。選擇的目錄下所有文件會拷貝到SD根目錄下的Demo目錄中,在SD引導固件升級後,Demo目錄下的文件會拷貝到樣機用戶盤的根目錄下。

第五步,點擊開始創建即可。


android內核驅動

G-sensor驅動

路徑:kernel/drivers/input/sensors/accel/lis3dh.c

hardware/rockchip/sensor/st

文件:lis3dh.c及st目錄

電容觸摸屏驅動

路徑:kernel/drivers/input/touchscreen/

源碼:gslX680.c

液晶屏驅動

路徑:kernel/drivers/gpu/drm/panel/

源碼:panel-simple.c

註:顯示驅動基於drm框架,不止這些文件,基本位於kernel/drivers/gpu/drm目錄下

按鍵驅動

路徑:kernel/drivers/input/keyboard

源碼:rk_keys.c adc-keys.c

WIFI/BT模塊驅動

路徑:kernel/drivers/net/wireless/rockchip_wlan

源碼:該目錄下所有源碼文件

攝像頭驅動

路徑:hardware/rockchip/camera/SiliconImage/isi/drv

源碼:該目錄下

proc文件系統

啟動環境變量查詢

使用如下指令查詢啟動環境變量配置:

cat /proc/cmdline

會有如下類似打印信息:

storagemedia=emmc androidboot.mode=emmc androidboot.oem_unlocked=0 earlyprintk=uart8250,mmio32,0xff160000 swiotlb=1 console=ttyFIQ0 androidboot.baseband=N/A androidboot.veritymode=enforcing androidboot.hardware=rk30board androidboot.console=ttyFIQ0 init=/init kpti=0

CPU信息查詢

使用如下指令查詢CPU信息:

cat /proc/cpuinfo

會有如下類似打印信息:

px30:/ # cat /proc/cpuinfo

processor : 0

BogoMIPS : 48.00

Features : fp asimd evtstrm aes pmull sha1 sha2 crc32

CPU implementer : 0x41

CPU architecture: 8

CPU variant : 0x0

CPU part : 0xd04

CPU revision : 2

processor : 1

BogoMIPS : 48.00

Features : fp asimd evtstrm aes pmull sha1 sha2 crc32

CPU implementer : 0x41

CPU architecture: 8

CPU variant : 0x0

CPU part : 0xd04

CPU revision : 2

processor : 2

BogoMIPS : 48.00

Features : fp asimd evtstrm aes pmull sha1 sha2 crc32

CPU implementer : 0x41

CPU architecture: 8

CPU variant : 0x0

CPU part : 0xd04

CPU revision : 2

processor : 3

BogoMIPS : 48.00

Features : fp asimd evtstrm aes pmull sha1 sha2 crc32

CPU implementer : 0x41

CPU architecture: 8

CPU variant : 0x0

CPU part : 0xd04

CPU revision : 2

Serial : edb5c6db7629d0f1

內存信息查詢

使用如下指令查詢內存使用信息:

cat /proc/meminfo

會有如下類似打印信息:


px30:/ # cat /proc/meminfo

MemTotal: 977612 kB

MemFree: 37360 kB

MemAvailable: 568044 kB

Buffers: 3152 kB

Cached: 566344 kB

SwapCached: 0 kB

Active: 285836 kB

Inactive: 498400 kB

Active(anon): 107816 kB

Inactive(anon): 135952 kB

Active(file): 178020 kB

Inactive(file): 362448 kB

Unevictable: 256 kB

Mlocked: 256 kB

SwapTotal: 488268 kB

SwapFree: 488256 kB

Dirty: 432 kB

Writeback: 0 kB

AnonPages: 215068 kB

Mapped: 405048 kB

Shmem: 29056 kB

Slab: 64960 kB

SReclaimable: 26980 kB

SUnreclaim: 37980 kB

KernelStack: 12512 kB

PageTables: 20084 kB

NFS_Unstable: 0 kB

Bounce: 0 kB

WritebackTmp: 0 kB

CommitLimit: 977072 kB

Committed_AS: 53788924 kB

VmallocTotal: 258867136 kB

VmallocUsed: 0 kB

VmallocChunk: 0 kB

CmaTotal: 16384 kB

CmaFree: 15060 kB

磁盤分區信息查詢

使用如下命令查詢磁盤分區信息:

cat /proc/partitions

會有如下類似打印信息:


px30:/ # cat /proc/partitions

major minor #blocks name

1 0 8192 ram0

1 1 8192 ram1

1 2 8192 ram2

1 3 8192 ram3

1 4 8192 ram4

1 5 8192 ram5

1 6 8192 ram6

1 7 8192 ram7

1 8 8192 ram8

1 9 8192 ram9

1 10 8192 ram10

1 11 8192 ram11

1 12 8192 ram12

1 13 8192 ram13

1 14 8192 ram14

1 15 8192 ram15

254 0 488272 zram0

179 0 7634944 mmcblk2

179 1 4096 mmcblk2p1

179 2 4096 mmcblk2p2

179 3 4096 mmcblk2p3

179 4 16384 mmcblk2p4

179 5 32768 mmcblk2p5

179 6 32768 mmcblk2p6

179 7 65536 mmcblk2p7

179 8 114688 mmcblk2p8

179 9 4096 mmcblk2p9

179 10 393216 mmcblk2p10

179 11 1572864 mmcblk2p11

179 12 16384 mmcblk2p12

179 13 393216 mmcblk2p13

179 14 131072 mmcblk2p14

179 15 512 mmcblk2p15

179 16 4840943 mmcblk2p16

179 96 512 mmcblk2rpmb

179 64 4096 mmcblk2boot1

179 32 4096 mmcblk2boot0

內核版本查詢

使用如下命令查詢內核版本:

cat /proc/version

會有如下類似打印信息:


px30:/ # cat /proc/version

Linux version 4.4.138 (lxb\@9tripod-server) (gcc version 6.3.1 20170404 (Linaro GCC 6.3-2017.05) ) #9 SMP PREEMPT Wed Feb 20 20:21:04 CST 2019

=== 网络设备查询 ===

使用如下命令查询网络设备信息:

 cat /proc/net/dev

会有如下类似打印信息:
<pre>

px30:/ # cat /proc/net/dev

Inter-| Receive | Transmit

face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed

sit0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

lo: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

wlan0: 0 0 0 0 0 0 0 0 168 2 0 0 0 0 0 0

eth0: 68045 1003 0 0 0 0 0 0 29109 272 0 0 0 0 0 0

查看內核啟動信息

使用如下命令查詢內核啟動信息:

cat /proc/kmsg

android開發項目實戰

實戰1:如何修改init.rc文件

永久修改

在system/core/rootdir目錄下找到init.rc文件,修改後執行./mk --s,將會生成新的system.img文件,重新燒寫system.img即可更新init.rc。注意,在編譯時,首先需要先將out目錄下的init.rc刪除後再編譯,否則可能不會生效。

臨時修改

默認init.rc在ramdisk.img中,ramdisk.img又被打包到boot.img中,因此,如果我們需要臨時修改boot.img,首先需要解壓boot.img,再手動修改我們需要修改的內容,再打包即可。為此,我們特別編寫了解壓和壓縮的腳本文件。

在android根目錄下,新建腳本文件ramdisk.sh,編輯內容如下:


#!/bin/bash

# create: liuqiming

# date: 2016-11-22

# mail: liuqiming\@9tripod.com

echo "Modify boot.img"

echo "1.unzip boot.img"

echo "2.Create boot.img"

echo "3.delete cache files"

echo "4.exit"
  1. 準備工作,環境變量的聲明

SOURCE_DIR=$(cd `dirname $0` ; pwd)

TOOLS_DIR=${SOURCE_DIR}/tools

TARGET_DIR=${SOURCE_DIR}/out/release

OUT=${SOURCE_DIR}/out/target/product/rk3288

PATH=${SOURCE_DIR}/out/host/linux-x86/bin:$PATH;
  1. 讀取要執行的操作索引
read -p "Choose:" CHOOSE
  1. 解壓boot.img

if [ "1" = ${CHOOSE} ];then

echo "unzip boot.img"

cd $TARGET_DIR
  1. 第一步:新建ramdisk目錄
[ -e "ramdisk" ] ||{ echo "mkdir ramdisk"; mkdir ramdisk;}
  1. 第二步:判斷是否存在boot.img文件
[ -f "$TARGET_DIR/boot.img" ] || { echo "error! can't find boot.img!"; rm -rf ramdisk;exit; }
cd ramdisk
  1. 第三步:拷貝boot.img
cp ../boot.img .
  1. 第四步:解壓boot.img文件,得到boot.img-ramdisk.gz文件

[ -f "/bin/split_bootimg.pl" ] || { cp $TOOLS_DIR/split_bootimg.pl /bin; }

split_bootimg.pl boot.img

rm -f boot.img
  1. 第五步:解壓boot.img-ramdisk.gz文件

gzip -dc boot.img-ramdisk.gz | cpio -i

echo "\^_\^ unzip boot.img finished!"

rm -f boot.img-ramdisk.gz

rm -f boot.img-second.gz

rm -f boot.img-kernel

exit
  1. 打包boot.img
elif [ "2" = ${CHOOSE} ];then
echo "create boot.img with kernel..."
  1. 第一步:判斷是否存在ramdisk目錄
[ -e "$TARGET_DIR/ramdisk" ] || { echo "can't find [ramdisk],please unzip boot.img first!"; exit; }
  1. 第二步:去除默認的root.img文件
rm -f $TARGET_DIR/boot.img
cd $TARGET_DIR
  1. 第三步:將當前目錄所有文件打包到boot.img

[ -d $TARGET_DIR/ramdisk ] && \

mkbootfs $TARGET_DIR/ramdisk | minigzip > $TARGET_DIR/ramdisk.img && \

truncate -s "%4" $OUT/ramdisk.img && \

mkbootimg --kernel ${OUT}/kernel --ramdisk ${OUT}/ramdisk.img --second $TARGET_DIR/resource.img --output $TARGET_DIR/boot.img

rm -rf ramdisk

exit
  1. 清除殘餘文件

elif [ "3" = ${CHOOSE} ];then

cd ${TARGET_DIR}

rm -rf ramdisk

echo "\^_\^ delete cache files ok!"
  1. 退出腳本

elif [ "4" = ${CHOOSE} ];then

exit

fi

執行./ramdisk.sh,輸入1,回車,將會自動解壓out/release目錄下的boot.img,並存放到out/release/ramdisk目錄。

執行./ramdisk.sh,輸入2,回車,將會自動將out/release/ramdisk目錄下的文件打包成boot.img。

實戰2:如何修改開機動畫

默認android啟動時,會有android的英文字母不斷高亮滾動顯示,構成了一幅美麗的開機動畫。其實這個開機動畫是可以定製的,有興趣的讀者可以自行嘗試。

瑞芯微官方提供的uboot會讀取kernel根目錄下的logo.bmp和logo_kernel.bmp兩個文件,分別用於做uboot和內核的開機LOGO,uboot和內核的LOGO顯示全部是由uboot完成的。其中logo.bmp用作uboot的開機LOGO,logo_kernel.bmp用作內核的開機LOGO。值得注意的是,如果我們要將uboot和內核顯示的LOGO設置得相同,並不能簡單的複製,因為他們的圖片格式是有區別的。logo.bmp支持8b的bmp格式圖片,而logo_kernel.bmp只支持壓縮後的8b的bmp格式圖片,因此logo_kernel.bmp實際上要比logo.bmp的尺寸要小得多。而且在實際顯示時,很明顯的看到顯示內核LOGO時,如果顏色比較豐富,就會失真。為了只顯示一幅圖片,我們直接將kernel目錄下的logo_kernel.bmp刪除即可。

如果我們需要換uboot的開機LOGO,找一張分辨率不是太大的圖片,轉換成BMP格式,然後使用WINDOWS的圖庫編輯功能,轉換成8b模式,保存並替換kernel目錄下的logo.bmp即可。注意,如果LOGO的分辨率設置得過大,也可能導致無法顯示。如果需要全屏開機LOGO,默認的uboot代碼就不適用了,需要重新移植。

同上,找一張分辨率不是太大的圖片,轉換成BMP格式,在WINDOWS的圖片編輯軟件下轉換成8b模式後,還需要藉助於linux下強大的gimp工具,將圖片壓縮,內核LOGO才能顯示出來。默認瑞芯微提供的這套方案,內核LOGO分辨率不夠大,而且會明顯失真,無法顯示真彩圖片,如果開發的工程師一定要顯示完美的內核LOGO,建議使用linux下標準的開機LOGO方案。

配置使用MIPI屏

在kernel/arch/arm64/boot/dts/rockchip目錄下存放了多個已經調試好的液晶屏的配置文件,7寸RGB屏的配置文件為lcd_1024x600_rgb.dtsi,7寸MIPI屏的配置文件為lcd_1024x600_mipi.dtsi。在kernel/arch/arm64/boot/dts/rockchip/x30_evb.dts中選擇配置使用的液晶模組即可,如需要使用7寸MIPI屏,示例代碼如下:

#include "lcd_1024x600_mipi.dtsi" //7ch mipi panel
//#include "lcd_1024x600_rgb.dtsi" // 7ch rgb panel