海思SDK編譯實踐 -- hi3716cv200es1
---------------------------------------------------------------------------------------------------------------------------------------------------
(2013.08.04 tonyfield 本文在海思SDK 原始碼包的 install_notes(chs).txt 基礎上按自己實際編譯遇到問題增補,增補部分做了顏色標記)
環境:E1230 v2 / Ubuntu12.04 _amd64
----------------------------------------------------------------------------------------------------------------------------------------------------
釋出包使用說明
在使用SDK之前,請務必仔細閱讀此文件。
=========================================
編譯SDK
=========================================
1. linux伺服器需求
---Linux發行版 推薦ubuntu 10及以上版本
---glibc 推薦2.11.1版本
---GNU Make 推薦3.8.1及以上版本
---shell: 必須為bash
修改linux伺服器預設sh為bash的方法
rm -f /bin/sh
ln -s /bin/bash /bin/sh
---正確配置並啟動ssh samba nfs服務
$ sudo apt-get install openssh-server ------- 安裝 ssh
$ sudo service ssh start ------- 啟動 ssh
$ sudo apt-get install samba ------- 安裝 samba
$ sudo service samba start ------- 啟動 samba
$ sudo apt-get install nfs-kernel-server ------- 安裝 nfs
$ sudo service portmap start ------- 由於NFS要依靠portmap服務才能通訊的,如果客戶機要連到這臺NFS Server上的話,最好在客戶機上也安裝一下服務,同時啟動一下protmap
然後檢查以上三個服務是否已經啟動
$ service --status-all
2.1 安裝交叉編譯工具鏈
sudo ./server_install
【注意事項】---使用root許可權或者sudo許可權執行
---執行完成後,強烈建議重啟linux伺服器或者重新登入伺服器
---安裝交叉編譯工具鏈會覆蓋之前安裝過的同名編譯器
---交叉編譯工具鏈安裝後對所有使用該伺服器的使用者有效
2.3 安裝編譯過程中使用到的其他工具
make tools_install
該操作會生成編譯過程中使用到的其他工具
》》如果報告編譯錯誤,報告最前面的錯誤是 “cannot find -lz”,表示你需要安裝 zlibc,-ld 的意思就是 load zlib,用下面命令完成
$ sudo apt-get install zlib1g-dev (安裝zlibc 對著個問題沒有用)
》》如果報以下錯誤:
make[4]: Entering directory ......./HiSTBV100-SRC/tools/linux/utils/mkbootargs'
gcc -lz -o mkbootargs mkbootargs.c
/tmp/ccptjGr6.o: In function `main':
mkbootargs.c:(.text+0xdc1): undefined reference to `crc32'
這是由於命令 “gcc -lz -o mkbootargs mkbootargs.c” 從右向左執行,所以還沒連結到zlib時就編譯 .c檔案,檔案內找不到crc32的定義
修改../HiSTBV100-SRC/tools/linux/utils/mkbootargs/makefile,將
$(CC) -lz -o $(TARGET) mkbootargs.c
改為
$(CC) -o $(TARGET) mkbootargs.c -lz
就好了
》》如果報以下錯誤:
undefined reference to `stdscr'
可以通過安裝ncurses庫解決
sudo apt-get install libncurses5-dev
至此,交叉編譯生成工具鏈
重啟動系統後進行下面步驟 (之後尚無增補內容)
3.1 選擇配置檔案
configs目錄下提供了針對demo板的預設配置檔案
cp configs/xxxx.cfg ./cfg.mak
3.2 檢視和修改SDK配置
make menuconfig
如果修改了配置選項,在退出menuconfig選單時會提示"Do you wish to save your new SDK configuration?"
選擇Yes所有修改會儲存在./cfg.mak檔案中;選擇No放棄修改。
4. 編譯
支援一鍵式編譯和分步編譯
4.1 一鍵式編譯
make build
4.2 分步驟編譯
make prepare 準備編譯檔案 編譯其他目標前必須執行該命令
make hiboot_install 編譯boot 生成fastboot-burn.bin
make linux_install 編譯linux 生成hi_kernel.bin
make rootfs_install 編譯rootfs 生成基本的rootfs目錄 包括基本目錄結構、busybox、C庫、utils、基本啟動指令碼等
make common_install 編譯common 生成common的庫和驅動
make msp_install 編譯msp 生成msp各個模組的庫和驅動
make component_install 編譯component 生成component的庫和驅動
make rootbox_install 編譯rootbox 生成用於製作根檔案系統映象的資料夾rootbox
make fs 編譯fs 生成用於燒寫flash的根檔案系統映象 rootbox_xxx.jffs2/rootbox_xxx.yaffs/rootbox_xxx.cramfs
make sample 編譯sample 生成各個sample的可執行程式 位於sample的各個子目錄下
【注意事項】
---使用者可以根據自己的需要修改rootbox.mk,決定rootbox中放置的內容
---make msp_install M=xxx 可以單獨編譯某個模組 如make msp_install M=demux
---make component_install M=xxx 可以單獨編譯某個元件
---分步驟編譯時,編譯所有目標前必須先make prepare 準備好編譯內容
---分步驟編譯時,編譯common msp component之前必須先make linux_install
---更詳細的編譯命令 請參考make help
4.3 單獨編譯核心
如果使用者需要修改核心預設配置,可以使用以下方法單獨編譯核心映象
1> 解壓縮SDK中的核心:
cd source/kenel/
tar -xf linux-2.6.35.tar.bz2
2> 選擇配置檔案:
假設使用的配置檔名稱為hixxxx_yyy_defconfig
cp ./linux-2.6.35.config/hixxxx/hixxxx_yyy_defconfig ./linux-2.6.35/arch/arm/configs
cd ./linux-2.6.35
make ARCH=arm CROSS_COMPILE=arm-hisiv200-linux- hixxxx_yyy_defconfig
3> 開啟核心配置選單:
cp arch/arm/configs/hixxxx_yyy_defconfig .config
make ARCH=arm CROSS_COMPILE=arm-hisiv200-linux- menuconfig
4> 編譯核心:
make ARCH=arm CROSS_COMPILE=arm-hisiv200-linux- uImage -j 128
注意: 不要用 zImage, 否則核心無法啟動。
5. 編譯後的映象檔案為: arch/arm/boot/uImage
=========================================
燒寫映象
=========================================
單板上沒有燒寫boot或者boot已經損壞時,必須使用HiTool工具燒寫;boot可用時,可以選擇使用HiTool工具燒寫或者使用命令列燒寫。
1. HiTool工具燒寫
HiTool工具安裝檔案位置 tools/windows/HiTool
使用方法參考《HiTool工具快速入門視訊.exe》
2. Boot命令列燒寫
單板啟動時,按著鍵盤CTRL+C可以進入到boot的命令列模式
fastboot#
輸入help 可以檢視boot命令列下支援的所有命令
輸入help xxx 可以檢視xxx命令的詳細幫助資訊
boot命令列下支援通過tab鍵補全命令
2.1 配置網路引數
setenv serverip xxx.xxx.xxx.xxx
setenv ipaddr xxx.xxx.xxx.xxx
setenv gatewayip xxx.xxx.xxx.xxx
setenv ethaddr 00:xx:xx:xx:xx:xx
setenv netmask 255.255.xxx.0
配置完成後用ping xxx.xxx.xxx.xxx 測試單板與ftp伺服器之間的連通性。
2.2.分割槽地址
假設flash上分割槽分配如下:
分割槽名稱 偏移 大小
boot: 0x00000000 0x0080000
bootargs: 0x00080000 0x0100000
kernel: 0x00100000 0x0400000
rootfs: 0x00500000 0x6000000
【注意事項】
---偏移是相對flash的首地址的偏移
---flash可以為spi/nand/emmc,使用者需要根據單板配置合理安排分割槽
2.3.燒寫命令
假設記憶體起始地址為0x0,為boot預留0x1000000,0x1000000以後的空間可以用於映象下載
nand flash:
命令:
獲取幫助:help nand
擦除:nand erase startpos length
讀取:nand read ddroffset start length
寫入:nand write ddroffset start length
下載boot:
mw.b 1000000 ff 80000 //將0x1000000寫為0xff,寫0x80000
tftp 1000000 fastboot-burn.bin //將fastboot-burn.bin下載到0x1000000
nand erase 0 100000 //擦寫flash上0x0起始的0x100000空間
nand write 1000000 0 80000 //把0x1000000起始長度為0x80000的內容(fastboot-burn.bin)寫入nand flash 0x0起始的位置
慎重一點,最好先確認下載到記憶體成功,然後再擦除flash
下載linux:
mw.b 1000000 ff 400000
tftp 1000000 hi_kernel.bin
nand erase 100000 400000
nand write 1000000 100000 400000
下載檔案系統(使用yaffs):
mw.b 1000000 ff 6000000
tftp 1000000 rootfs.yaffs
nand erase 500000 6000000
nand write.yaffs 1000000 500000 $(filesize) //把0x1000000起始長度為$(filesize)的內容(rootfs.yaffs)寫入nand flash 0x500000位置,
boot會自動識別$(filesize)為rootfs.yaffs的大小。
【注意事項】
---nand flash上使用yaffs/cramfs/squashfs檔案系統
spi flash:
命令:
獲取幫助:help sf
探測:sf probe 0
擦除:sf erase startpos length
讀取:sf read ddroffset start length
寫入:sf write ddroffset start length
下載uboot:
sf probe 0 //探測一下是否存在spi flash
mw.b 1000000 ff 80000 //將0x1000000寫為0xff,寫0x80000
tftp 1000000 fastboot-burn.bin //將fastboot-burn.bin下載到0x1000000
sf erase 0 80000 //擦寫flash上0x0起始的0x80000空間
sf write 1000000 0 80000 //把0x1000000起始長度為0x80000的內容(fastboot-burn.bin)寫入nand flash 0x0起始的位置
慎重一點,最好先確認下載到記憶體成功,然後再擦除flash
下載linux:
sf probe 0
mw.b 1000000 ff 400000
tftp 1000000 hi_kernel.bin
sf erase 100000 400000
sf write 1000000 100000 400000
下載檔案系統:
sf probe 0
mw.b 1000000 ff b00000
tftp 1000000 rootfs.jffs2
sf erase 500000 b00000
sf write 1000000 500000 b00000
【注意事項】
---spi flash上使用jffs2/cramfs/squashfs檔案系統
hi3716cv200es tst單板的燒寫:
下載uboot:
sf probe 0
mw.b 1000000 ff c0000
tftp 1000000 fastboot-burn.bin
sf erase 0 c0000
sf write 1000000 0 c0000
下載linux:
mw.b 1000000 ff 600000
tftp 1000000 hi_kernel.bin
nand erase 0 600000
nand write 1000000 0 600000
下載檔案系統:
mw.b 1000000 ff 3C00000
tftp 1000000 rootfs_4k24b.yaffs
nand erase 600000 3C00000
nand write.yaffs 1000000 600000 $(filesize)
eMMC flash:
命令:
獲取幫助:help mmc
讀取:mmc read 0 ddroffset startblock blockcount
寫入:mmc write 0 ddroffset startblock blockcount
【注意事項】
---eMMC flash讀寫操作的單位是塊,塊大小為512Bytes
---eMMC flash上使用ext3檔案系統
---eMMC flash上燒寫映象使用命令列操作過於複雜,推薦使用HiTool工具燒寫
=========================================
設定系統啟動引數
=========================================
必須正確設定bootargs引數或者燒寫bootargs映象才能保證系統正常啟動
1. bootargs變數介紹
以下面bootargs為例說明各個變數的含義
'mem=1G console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=yaffs2 mtdparts=hi_sfc:1M(boot);hinand:6M(kernel),96M(rootfs),1M(baseparam),1M(logo),-(others) mmz=ddr,0,0,300M'
各變數含義如下
mem
整個DDR被劃分為兩部分:系統記憶體和mmz。mem表示整個DDR大小,mmz表示mmz區域大小。
使用者需要根據單板配置及記憶體佔用情況合理配置mem和mmz大小。
mmz:
格式ddr,0,0,size size表示整個DDR中預留給MMZ使用的空間大小。例如mmz=ddr,0,0,300M表示在整個mem中預留300M供MMZ使用,其餘分配給系統記憶體使用
console:
控制檯引數。console=ttyAMA0,115200表示使用串列埠0作為控制檯裝置 波特率為115200
root:
表示根檔案系統所在的裝置分割槽 例如/dev/mtdblock2表示/dev/mtdblock2為根檔案系統 對應mtdparts中的rootfs分割槽
【注意事項】
mtdparts中的分割槽從0開始編號。如果單板上有spiflash,即使spi flash上沒有劃分分割槽,spi flash也會對應/dev/mtdblock0
rootfstype:
根檔案系統型別 此處為yaffs
mtdparts:
flash上的分區劃分 格式 mtdparts=flashtype:size(name),size(name),...,-(others);flashtype:size(name),size(name),...,-(others);...
2. 啟動引數的設定
假設bootargs的內容為'mem=1G console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=yaffs2 mtdparts=hi_sfc:1M(boot);hinand:6M(kernel),96M(rootfs),1M(baseparam),1M(logo),-(others) mmz=ddr,0,0,300M'
設定啟動引數的命令如下
setenv bootargs 'mem=1G console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=yaffs2 mtdparts=hi_sfc:1M(boot);hinand:6M(kernel),96M(rootfs),1M(baseparam),1M(logo),-(others) mmz=ddr,0,0,300M'
setenv bootcmd 'nand read 1000000 0 600000;bootm 1000000' //bootcmd命令載入核心到0x1000000,然後跳轉到0x1000000執行
saveenv
啟動引數例子:
---hi3716cv200es tst單板:spi flash 4M nand Flash 4G ddr 2G
boot在spi flash, kernel和檔案系統在nand flash:
setenv bootcmd 'nand read 1000000 0 600000;bootm 1000000'
setenv bootargs 'mem=1G console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=yaffs2 mtdparts=hi_sfc:1M(boot);hinand:6M(kernel),96M(rootfs),1M(baseparam),1M(logo),-(others) mmz=ddr,0,0,300M'
---hi3716cv200es tst單板:eMMC 4G ddr 2G
set bootcmd 'mmc read 0 0x1000000 0x800 0x3000;bootm 0x1000000'
setenv bootargs 'mem=1G console=ttyAMA0,115200 root=/dev/mmcblk0p5 rootfstype=ext3 rootwait mmz=ddr,0,0,300M mtdparts=hi_emmc:1M(boot),6M(kernel),1M(baseparam),1M(logo) emmcparts=96M(rootfs),-(others)'
3. 重啟系統
在boot命令列下執行reset或按單板復位鍵,系統復位重啟引導進入HiLinux,顯示如下字樣表示啟動成功
Welcome to HiLinux.
#
=========================================
掛載NFS除錯程式
=========================================
啟動HiLinux後 使用下面命令配置網路並掛載NFS進行程式除錯
1. 配置單板網路
ifconfig eth0 hw ether 00:xx:xx:xx:xx:xx; 設定eth0的MAC地址 網路中MAC地址要唯一
ifconfig eth0 xxx.xxx.xxx.xxx netmask 255.255.xxx.0; 設定eth0的ip地址和子網掩碼
route add default gw xxx.xxx.xxx.x; 設定網路預設路由 跨網路訪問時必須設定
2. 掛載NFS
假設SDK程式碼根目錄在交叉編譯伺服器上的路徑為/xxx/sdk_root,下面命令可以將sdk_root通過NFS掛載在單板根檔案系統的/mnt目錄下
mount -t nfs -o nolock -o tcp xxx.xxx.xxx.xxx:/xxx/sdk_root /mnt
請確保單板與伺服器之間網路連通,並且伺服器上的NFS服務已經正確配置
3. 增加動態庫檔案搜尋路徑 /mnt/pub/libs/share
export LD_LIBRARY_PATH="/mnt/pub/libs/share:$LD_LIBRARY_PATH"
4. 替換模組ko
cd /mnt/pub/kmod/
rmmod xxx.ko
insmod xxx.ko
5. 執行sample
cd /mnt/sample/xxx
./sample_xxx
=========================================
掛載U盤
=========================================
啟動HiLinux後,假設將U盤對應的裝置檔案/dev/sda掛載在/usb目錄下
1. 載入ko
insmod ehci-hcd.ko
insmod ohci-hcd.ko
如果要支援NTFS還要載入ufsd.ko
insmod ufsd.ko
2. 掛載U盤
使用FAT32
mount -t vfat /dev/sda /usb
使用NTFS
mount -t ufsd /dev/sda /usb
=========================================
開機畫面和瞬播
=========================================
請參考《開機畫面 開發指南》
=========================================
HiLoader
=========================================
請參考《HiLoader 開發指南》
<<< hi3716cdmo2b_hi3716cv200es1_android_cfg.mak : 缺標頭檔案
???????《 ------- hi_wlan_sta.h: No such file or directory 》
<<< hi3716cv200estst2avera_android_cfg.mak 缺 reg 檔案
make[1]: *** No rule to make target ....j/HiSTBLinuxV100R002C00SPC011/source/boot/sysreg/his40tst2a_hi3716cv200es0_ddr3_2gbyte_8bitx4_4layers_ECO2.reg',
<<<< his40tst2a_hi3716cv200es0_eco2_cfg.mak : 缺 reg 檔案