1. 程式人生 > >高通平臺android開發總結 MSM平臺上的AMSS

高通平臺android開發總結 MSM平臺上的AMSS

1、高通平臺android開發總結

1.1 搭建高通平臺環境開發環境

在高通開發板上燒錄檔案系統

建立高通平臺開發環境

高通平臺,android和 modem 編譯流程分析

高通平臺 7620 啟動流程分析

qcril 流程分析,設定sim卡鎖

python scons 語法學習

Python 語言之 scons 工具流程分析:

1.2 搭建高通平臺環境開發環境

高通android智慧平臺概述

選擇合適的原始碼以及工具

建立 Android 開發環境(部分略)

建立 modem 開發環境

1.2.1 高通android智慧平臺概述

高通 7230 android 智慧手機解決方案的軟體包括兩個部分

1. 以linux 作業系統為基礎的 android 系統

2. 以 L4,REX為基礎的 Modem 部分

在高通7系列的架構中,一個IC內部整合有兩個ARM處理器,一個ARM9(或者arm11),專門負責處理通訊協議,射頻以及GPIO等,軟體架構採用AMSS, 另外一個是ARM11,用來處理多媒體,上層應用,以及其他的一些任務,執行的系統是 android 系統,這兩個處理器之間通過共享記憶體的硬體方式來進行通訊。

1.2.1.1 什麼是L4,REX,BREW,AMSS以及相互之間的關係

L4是一組計算機程式,是最初由Jochen Liedtke設計的微核心構架的作業系統核心,現在已經形成一個微核心家族。L4這個微核心系統由於其出色的效能和很小的體積而開始被計算機工業所認知,被移植到了許多不同的硬體構架上。高通的 L4 提供了作業系統最基本的操作,是買別人的

早期的作業系統絕大多數是 Monolithic Kernel, 意思是整個作業系統 - 包括Scheduling (排程), File system (檔案系統),Networking (網路),Device
driver
 (裝置驅動程式), Memory management (儲存管理),Paging

(儲存頁面管理) - 都在核心中完成.一直到現在廣泛應用的作業系統,如UNIX,Linux,和Windows還大都是monolithic kernel作業系統.但隨著作業系統變得越來越複雜(現代作業系統的核心有一兩百萬行C程式是很常見的事情),把所有這些功能都放在核心中使設計難度迅速增加.

微核心是一個與Monolithic Kernel相反的設計理念.它的目的是使核心縮到最小,把所有可能的功能模組移出核心.理想情況下,核心中僅留下Address Space Support(地址空間支援),IPC
(Inter-Process Communication,程序間通訊),和Scheduling(排程),其他功能模組做為使用者程序執行。

REX 是在 L4 之上封裝的服務,是一個搶佔式,多工的RTOS,所有的任務都以task的形式存在,REX提供包括任務建立,同步,互斥,計時器,中斷控制等功能的API,這裡的task實際上就是我們的執行緒,每個 task對應著一個執行緒。REX維護一個task list(雙向連結串列),始終執行高優先順序的task。products裡面所有的服務包括3g協議棧等都是以task的形式跑在rex之上的

而Brew的話是執行的環境,跟Java 有點兒類似,相當於是一個虛擬機器。

AMSS――高階的移動使用者軟體(Advanced Mobile Subscriber Software)技術,是一種新的軟體架構,是對原來軟體架構 DMSS 的升級。 AMSS原始碼實際上是QC BREW(Binary Runtime Environment For Wireless)平臺的的底層部分,去掉了為應用程式提供介面的AEE(application execution environment)部分,高通在Dual Proc晶片上的其他平臺基本上都是採用的這樣的架構。

參考文件:

微核心作業系統及L4概述

MSM平臺上的AMSS

1.2.2 選擇合適的原始碼以及工具

要編譯出可供燒寫使用的映象檔案需要三部分程式碼:

1) 獲取經過高通打補丁的 android 原始碼

2) 獲取高通針對不同處理器的 vendor 原始碼

3) 獲取 modem 原始碼

1.2.2.1 獲取經過高通打補丁的android 原始碼

網址:

https://www.codeaurora.org/wiki/QAEP#Branch_Releases

https://www.codeaurora.org/xwiki/bin/QAEP/eclair

https://www.codeaurora.org/xwiki/bin/QAEP/eclair_caramel

https://www.codeaurora.org/xwiki/bin/QAEP/froyo_almond

目前使用的 android 分支:

Android 2.1 版本 eclair

M7630AABBQMLZA1150 msm7630 eclair            M7630AABBQMLZA1150.xml 2010年02月01日

M7630AABBQMLZA1200 msm7630 eclair        M7630AABBQMLZA1200.xml 2010年03月30日

M7630AABBQMLZA2010 msm7630 éclair            M7630AABBQMLZA2010.xml July 02, 2010

M7630AABBQMLZA1240 msm7630 eclair_caramel  M7630AABBQMLZA1240.xml 2010年05月31日

M7630AABBQMLZA1250 msm7630 eclair_caramel  M7630AABBQMLZA1250.xml 2010年06月15日

M7630AABBQMLZA1280 msm7630 eclair_caramel  M7630AABBQMLZA1280.xml 2010年08月03日 

M76XXTSNCJNLYA5340 msm7627 eclair_chocolate M76XXTSNCJNLYA5340.xml 2010年06月04

Android 2.2 版本 froyo

M7630AABBQMLZA2020 msm7630  froyo           M7630AABBQMLZA2020.xml 2010年09月01

M76XXTSNCJNLYA6050 msm7627  froyo_almond   M76XXTSNCJNLYA6050.xml 2010年10月29日

以下命令獲取程式碼:

https://www.codeaurora.org/xwiki/bin/QAEP/froyo_almond

ac_root=/home/shared/qualcomm

ac_root=/mnt/shared/qualcomm/

ac_date=20101105

ac_branch=froyo_almond

build_id=M76XXTSNCJNLYA6050

ac_xml=M76XXTSNCJNLYA6050.xml

mkdir -pv $ac_root/$ac_branch-$build_id-$ac_date

cd $ac_root/$ac_branch-$build_id-$ac_date

repo init -u git://codeaurora.org/platform/manifest.git -b $ac_branch -m  $ac_xml

nohup repo sync&

1.2.2.2 獲取高通針對不同處理器的vendor原始碼

根據選擇的 Android 原始碼分支不同, vendor 程式碼的選擇也是不一樣的,BUILD ID 必須一致

M7630AABBQMLZA1150 對應 HY11-VR881-5.zip

M7630AABBQMLZA1250 對應 HY11-VR881-11.zip

M7630AABBQMLZA2020 對應 HY11-N1627-3.zip   AMSS 7X30 LINUX RELEASE 2.0.20

M76XXTSNCJNLYA6050 對應 HY11-N1188-6.zip   AMSS 7X27 LINUX REL 6.0.50

vendor 程式碼通過有效的高通帳號登入 HYPERLINK "https://support.cdmatech.com/login/" https://support.cdmatech.com/login/ 網站獲取

1.2.2.3 獲取 modem 原始碼

根據硬體配置情況,選擇不同的 BUILD ID, 然後根據 BUILD ID 選擇相近的原始碼

modem 程式碼通過有效的高通帳號登入 HYPERLINK "https://support.cdmatech.com/login/" https://support.cdmatech.com/login/ 網站獲取

BUILD ID 是一組字母的組合,如:AAABQOLYM

以下分別對各個欄位進行說明:

第三個字母 A 表示 LPDDR2    #USES_LPDDR2=yes

第三個字母 B 表示 LPDDR1

第六個字母 M 表示 Multimode

第六個字母 C 表示 CDMA

第六個字母 D 表示 JCDMA      #相對於C多了:USES_UMTS=yes USES_DSHDR_JCDMA_APIS=yes

第六個字母 O 表示 UMTS only #相對於C多了:USES_UMTS=yes USES_SUPPORT_UMTS_GPS_PROTOCOLS=yes

                              #相對於C少了:USES_CDMA=yes USES_HDR=yes USES_REL_C=yes USES_CDMA2000=yes

                              #USES_EXPORT_MCCMEID=yes USES_SUPPORT_CDMA_GPS_PROTOCOLS=yes

第7,8個字母為 AZ  表示 NADN boot

第7,8個字母為 LY  表示 eMMC boot  #相對於AZ多了選項: USES_SDCC_BOOT=yes USES_HSU_MS_FD_BOOT=yes

最後一個字母為 M   表示  modem

最後一個字母為 A   表示  app

以上為 7x30 平臺的一些規律,具體參考文件,7227 參考相應的 release note:

<<80-VR192-1_E_AMSS_Linux_Software_Users_Manual.pdf>>

第1個字母

第2個字母  F: 基於ffa參考設計 S: 基於surf的參考設計

第3個字母

第4個字母

第5個字母  K /J

K 相對於 J 多了以下選項

USES_HSU_CHG_BOOT=yes

USES_HSU_FAST_CHARGE=yes

USES_CHARGER=yes

USES_EBI1_TURBO_FFA=yes

第6個字母  O/ N / P

O表示只支援 UMTS(WCDMA)

------------------

USES_IPHC=yes                             

USES_PDCP=yes

USES_SUPPORT_UMTS_GPS_PROTOCOLS=yes

USES_UMTS=yes

-----------------

P表示只支援 CDMA/CDMA2000

USES_CDMA=yes

USES_CDMA2000=yes

USES_REL_C=yes

USES_SUPPORT_CDMA_GPS_PROTOCOLS=yes

USES_EXPORT_MCCMEID=yes

USES_HDR=yes

-----------------

N表示既支援 UMTS(WCDMA) 且支援 CDMA/CDMA2000

第7個字母

第8個字母

surf和ffa的區別

generally speaking surf have FPGA and don't have battery.

and FFA don't have FPGA but have battery.

msm7627_surf and msm7627_ffa and msm7627_7x_surf means different hardware reference design. please check with your hardware engineer on which qualcomm hardware reference you use and then select the right build command.

4.6 Build commands

To create an AMSS build, run the command script with the build ID matching the build

configuration desired. The command scripts may be executed from the build/ms subdirectory or

from the AMSS root directory using the full path to the command script as in the following

examples:

./AMSS/products/<asic>/build/ms/MSNCJNLYM.cmd – For SURF multimode build

./AMSS/products/<asic>/build/ms/MSNCJOLYM.cmd – For SURF UMTS only build

./AMSS/products/<asic>/build/ms/MSNCJPLYM.cmd – For SURF 1X only build

./AMSS/products/<asic>/build/ms/MFNCKNLYM.cmd – For FFA multimode and for reference only

以高通的開發板子為例,看如何選擇原始碼,通過 QPST 連線高通的開發板,我們可以看到他的配置資訊如下:

高通 demo 版的配置情況:SURF-MSM7630 7X30A-AAABQMAZM-1200

從配置情況來看只有 HY11-N0216-3_1.2.00  HY11-N0216-4_1.2.20 滿足要求

HY11-N0216-3_1.2.00/AMSS/products/7x30/build/ms/AAABQMAZM.cmd

HY11-N0216-4_1.2.20/AMSS/products/7x30/build/ms/AAABQMAZM.cmd

後期我們要跟據實際情況來選擇 BUILD ID,如我們的手機的配置情況為:

LPDDR2 ,WCDMA,eMMC 啟動(NAND備選),那麼modem 的BUILD ID為:

AAABQOLYM 或者 AAABQOAZM

AAABQOLYM HY11-N0723-2_1.2.20/AMSS/products/7x30/build/ms/AAABQOLYM.cmd

AAABQOAZM HY11-N1122-1_1.2.20/AMSS/products/7x30/build/ms/AAABQOAZM.cmd (NABD boot 備選)

高通的Android第一人曉峰不建議我們第一次就用eMMC,而應該用Nand,目前只有HTC在用eMMC。高通在eMMC上面提供了參考程式碼,但是是未經過驗證。終端廠商在使用過程中,一定會有很多問題需要自己解。

補充資訊:

現在可能用到 BUILD ID 以及相應的 modem 和 vendor 原始碼。

modem程式碼:

  BUILD ID              modem 原始碼        modem映象         說明文件

M7630AABBQMAZM1200   HY11-N0216-3.zip  HK11-N0216-3.zip  HT11-N0216-3.zip

M7630AABBQMAZM1220   HY11-N0216-4.zip  HK11-N0216-4.zip  HT11-N0216-4.zip

--

M7630AABBQMLYM1200   HY11-N0723-1.zip  HK11-N0723-1.zip  HT11-N0723-1.zip

M7630AABBQMLYM1220   HY11-N0723-2.zip  HK11-N0723-2.zip  HT11-N0723-2.zip

--

M7630AAABQCAZM1220   HY11-N1122-1.zip  HK11-N1122-1.zip  HT11-N1122-1.zip

M7630AAABQCAZM1240   HY11-N1122-2.zip  HK11-N1122-2.zip  HT11-N1122-2.zip

M7630AAABQCAZM1250   HY11-N1122-3.zip  HK11-N1122-3.zip  HT11-N1122-3.zip

M7630AAABQCAZM1260   HY11-N1122-4.zip  HK11-N1122-4.zip  HT11-N1122-4.zip

M7630AAABQCAZM1280   HY11-N1122-5.zip  HK11-N1122-5.zip  HT11-N1122-5.zip

M7630AAABQCAZM1290   HY11-N1122-6.zip  HK11-N1122-6.zip  HT11-N1122-6.zip

--

M7630AAABQMAZM1240   HY11-N1496-2.zip  HK11-N1496-2.zip  HT11-N1496-2.zip

M7630AAABQMAZM1250   HY11-N1496-3.zip  HK11-N1496-3.zip  HT11-N1496-3.zip

80-N0216-3_B_M7630AABBQMAZM1200.pdf

5.3.2.1 LPDDR1 NAND boot Multimode              AABBQMAZM.cmd

5.3.2.2 LPDDR1 eMMC boot Multimode              AABBQMLYM.cmd

5.3.2.3 LPDDR1 eMMC boot UMTS only              AABBQOLYM.cmd

5.3.2.4 LPDDR1 NAND boot JCDMA                  AABBQDAZM.cmd

5.3.2.5 LPDDR2 NAND boot Multimode              AAABQMAZM.cmd

5.3.2.6 LPDDR2 eMMC boot Multimode              AAABQMLYM.cmd

80-N0216-4_A_M7630AABBQMAZM1220.pdf

5.3.2 Build instructions and commands

5.3.2.1 LPDDR1 NAND boot Multimode              AABBQMAZM.cmd

5.3.2.2 LPDDR1 eMMC boot Multimode              AABBQMLYM.cmd

5.3.2.3 LPDDR1 eMMC boot UMTS only              AABBQOLYM.cmd

5.3.2.4 LPDDR1 NAND boot JCDMA                  AABBQDAZM.cmd

5.3.2.5 LPDDR2 NAND boot Multimode              AAABQMAZM.cmd

5.3.2.6 LPDDR2 eMMC boot Multimode              AAABQMLYM.cmd

5.3.2.7 LPDDR2 eMMC boot UMTS only              AAABQOLYM.cmd

5.3.2.8 LPDDR2 NAND boot C2K Only               AAABQCAZM.cmd

5.3.2.9 LPDDR1 eMMC boot C2K Only               AABBQCLYM.cmd

5.3.2.10 LPDDR2 NAND boot JCDMA                 AAABQDAZM.cmd

5.3.2.11 LPDDR2 NAND boot UMTS only             AAABQOAZM.cmd

80-N1665-1_B_M7630AAABQ_AZM1240.pdf

5.3.2 Build instructions and commands

5.3.2.1 LPDDR1/LPDDR2 eMMC boot Multimode      AABBQMLYM.cmd

5.3.2.2 LPDDR1/LPDDR2 eMMC boot UMTS only      AABBQOLYM.cmd

5.3.2.3 LPDDR1/LPDDR2 eMMC boot C2K only       AABBQCLYM.cmd

5.3.2.4 LPDDR2/LPDDR1 NAND boot Multimode      AAABQMAZM.cmd

5.3.2.5 LPDDR1/LPDDR2 NAND boot JCDMA          AABBQDAZM.cmd

5.3.2.6 LPDDR2/LPDDR1 NAND boot C2K only       AAABQCAZM.cmd

5.3.2.7 LPDDR2/LPDDR1 NAND boot UMTS only      AAABQOAZM.cmd

The same build ID will now work for LPDDR1 as well as LPDDR2.

從以上的釋出資訊,只有 LPDDR2 和 LPDDR1 不同的情況下可以使用同一個 build ID。

對於我們的硬體配置情況(LPDDR2 eMMC boot UMTS only) 可以使用的編譯命令檔案為:

AAABQOLYM.cmd  AABBQOLYM.cmd

選擇 modem 程式碼 M7630AAABQMAZM1250  HK11-N1496-3.zip

如果是支援 BREW 平臺,通常多下面的選項:

USES_BREW_4.0=yes

USES_BREW=yes

USES_BREW_APPMGR=yes

或者 USES_BREW_USB_HID=yes

沒有 USES_DIAG_SMD_SUPPORT=yes

專案 PD1007

OEM/Target Equipment (FeaturePhone,Smartphone,Datacard): Smartphone

Anticipated Launch Date: April 1 2011

Target market (such as China Telecom): China Open market

Current Software (such as Q6270BKPRZL1505):  froyo-M76XXTSNCJNLYA7010

Bluetooth IC/Module (vendor name and module if support BT): BTS4025

WLAN IC/Module (vendor and module if support WLAN ):WCN1312

Chipset (such as QSC6270):MSM7227-1

RF chipset (such as RGR6240):RTR6285

PMIC chipset (such as PM7540):PM7540

WCMDA Supported Bands (900,1900,2100…. if support WCDMA):2100

CMDA Supported Bands (450,850,1900,2100… if support CDMA ):not suport

OS (Brew,BMP,Android,WM,ThinUI(no UI)…):android froyo

OS version (Android Donuts…): android froyo

1.2.2.3.1 高通 modem 原始碼編譯前的修正

從高通獲取的原始碼直接編譯會存在一些問題,以下為可能的問題以及解決方法:

1) 為相應的指令碼加上編譯選項

vim ./AMSS/products/7x30/build/ms/xxxxxx.cmd

加上: BUILD_UNIX=yes

2) 如果編譯過程出現 .pl 檔案沒有執行許可權而退出,那麼為工程下面所有的 pl 檔案加上可執行屬性,命令:

find ./ -name "*.pl" |xargs chmod  755

3) 無法找到需要的 pl 指令碼解析器

vim ./AMSS/products/7x30/tools/build/depgen.pl

修改

#!/pkg/perl/5.6.1/bin/perl -w

#!/usr/bin/perl -w

4) 如果出現錯誤: "AMSS/products/7x30/core/bsp/build/data/incpathsaaabqmlym.py", line 14

IndentationError: expected an indented block

修改檔案:./AMSS/products/7x30/core/bsp/build/scripts/genpaths.pl 內容:

#if ($line =~ /^# makefile \(from/)

為:

if ($line =~ /^# makefile /)

原因分析:

genpaths.pl 會對編譯過程的中間資訊 :

...

line=# makefile (from'incpaths.min',line 363)

line=QVPCODEC_AUDIOINC = $(QVPCODEC)/audio/inc

...

等資訊進行解析,由於我們使用的是中文系統,所以以上內容變為:

line=# makefile (從'incpaths.min',行 363)

line=QVPCODEC_AUDIOINC = $(QVPCODEC)/audio/inc

所以導致:

#if ($line =~ /^# makefile \(from/) 判斷條件為為 false

無法正確生成  incpathsaaabqmlym.py,python 在解析該檔案的時候認為存在語法錯誤。

在 modem 程式碼 M7630AABBQMAZM2020(HY11-N2280-2.zip)中開始使用 genincpaths.py 產生

./AMSS/products/7x30/core/bsp/build/data/incpathsaaabqoazm.py 檔案,所以修改檔案

amend-source-code-qualcomm-modem.sh 在指令碼中需要加入以下內容:

incpathsxxx_py=$PRODUCT_DIR/core/bsp/build/scripts/genincpaths.py

if test -f $incpathsxxx_py; then

    PERL=`which /usr/bin/perl`

    sed -i "s/(from//g" $incpathsxxx_py

fi

./AMSS/products/7x30/multimedia/audio/drivers/Adie/AdieCodecDb/src/DALAdieCodecDb.c

#DalAdieCodecDbInternal.h 改為:

#include "DALAdieCodecDbInternal.h"

5) 如果出現 make: execvp: ../../../../platform/cs/bin/cifc: Permission denied 錯誤,執行以下命令:

chmod -R 755 AMSS/platform/cs/bin/*

1.2.3 建立 Android 開發環境

(略)

curl http://android.git.kernel.org/repo >~/bin/repo

chmod a+x ~/bin/repo

export PATH=~/bin:$PATH

1) 安裝基本軟體

sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl sun-java5-jdk zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev

2) 安裝 sun-java5-jdk

ubuntu 下通過命令: sudo apt-get install sun-java5-jdk 將會安裝下面的包

sun-java5-bin sun-java5-demo sun-java5-jdk sun-java5-jre sun-java5-plugin

如果ubuntu 釋出版本中沒有 sun-java5-jdk 那麼

sudo vim /etc/apt/source.list

#for sun-java5-jdk

deb http://us.archive.ubuntu.com/ubuntu/ jaunty multiverse

deb http://us.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse

sudo apt-get update

sudo apt-get sun-java5-jdk

或者,如果 ubuntu 版中不支援 apt-get ,那麼用手動安裝:

sudo mount -t nfs  172.20.127.15:/home/shared /mnt

sudo dpkg -i /mnt/tools/debs/java-1.5.0-sun/sun-java5-*

3) 配置usb

cd /etc/udev/rules.d/

sudo vi 50-android.rules

# adb single interface device

SUBSYSTEM=="usb_device", SYSFS{idVendor}=="18d1", SYSFS{idProduct}=="d00d",

MO