天天看點

Ubuntu 上 hi3531 交叉編譯環境 arm-hisiv100nptl-linux 搭建過程 Ubuntu12.04嵌入式交叉編譯環境arm-linu-gcc搭建過程,圖解

安裝sdk

1、hi3531 sdk包位置

    在"hi3531_v100r001***/01.software/board"目錄下,您可以看到一個 hi3531_sdk_vx.x.x.x.tgz 的檔案,

該檔案就是hi3531的軟體開發包。

2、解壓縮sdk包

    在linux伺服器上(或者一台裝有linux的pc上,主流的linux發行版本均可以),使用指令:tar -zxf hi3531_sdk_vx.x.x.x.tgz ,

解壓縮該檔案,可以得到一個hi3531_sdk_vx.x.x.x目錄。

3、展開sdk包内容

    傳回hi3531_sdk_vx.x.x.x目錄,運作./sdk.unpack(請用root或sudo權限執行)将會展開sdk包打包壓縮存放的内容,請按照提示完成操

作。

如果您需要通過windows作業系統中轉拷貝sdk包,請先運作./sdk.cleanup,收起sdk包的内容,拷貝到新的目錄後再展開。

4、在linux伺服器上安裝交叉編譯器

    1)安裝uclibc交叉編譯器(注意,需要有sudo權限或者root權限):

       進入hi3531_sdk_vx.x.x.x/osdrv/toolchain/arm-hisiv100-linux目錄,運作chmod +x cross.install,然後運作./cross.install

即可。

    2) 安裝glibc交叉編譯器(注意,需要有sudo權限或者root權限):

       進入hi3531_sdk_vx.x.x.x/osdrv/toolchain/arm-hisiv200-linux目錄,運作chmod +x cross.install,然後運作./cross.install

    3) 執行source /etc/profile, 安裝交叉編譯器的腳本配置的環境變量就可以生效了,或者請重新登陸也可。

在終端上輸入指令  arm-linux 再按tab鍵,可以看到下圖,說明環境變量設定成功了

ls@ubuntu:/slq/nfs/mpp$ arm-hisiv100nptl-linux-

arm-hisiv100nptl-linux-addr2line  arm-hisiv100nptl-linux-gprof

arm-hisiv100nptl-linux-ar         arm-hisiv100nptl-linux-ld

arm-hisiv100nptl-linux-as         arm-hisiv100nptl-linux-nm

arm-hisiv100nptl-linux-c++        arm-hisiv100nptl-linux-objcopy

arm-hisiv100nptl-linux-c++filt    arm-hisiv100nptl-linux-objdump

arm-hisiv100nptl-linux-cpp        arm-hisiv100nptl-linux-ranlib

arm-hisiv100nptl-linux-g++        arm-hisiv100nptl-linux-readelf

arm-hisiv100nptl-linux-gcc        arm-hisiv100nptl-linux-size

arm-hisiv100nptl-linux-gcc-4.4.1  arm-hisiv100nptl-linux-strings

arm-hisiv100nptl-linux-gccbug     arm-hisiv100nptl-linux-strip

arm-hisiv100nptl-linux-gcov      

驗證,編譯一個hello.c檔案

#include <stdio.h>

int main()

{

        printf("hello world!\n");

}

使用指令:arm-hisiv100nptl-linux-gcc hello.c -o hello 看是否編譯成功

 root@ubuntu:/slq/test# ls

hello  hello.c

  可見成功生成了二進制檔案。   

5、編譯osdrv

1.osdrv使用說明

本目錄設計思路為一套源代碼支援兩種工具鍊編譯,是以需要通過編譯參數指定不同的工具鍊。其中arm-hisiv100nptl-linux是uclibc工具鍊,arm-hisiv200-linux是glibc工具鍊。具體指令如下

(1)編譯整個osdrv目錄:

make osdrv_cross=arm-hisiv100nptl-linux all

或者

make osdrv_cross=arm-hisiv200-linux all

(2)清除整個osdrv目錄的編譯檔案:

make osdrv_cross=arm-hisiv100nptl-linux clean

make osdrv_cross=arm-hisiv200-linux clean

(3)徹底清除整個osdrv目錄的編譯檔案,除清除編譯檔案外,還删除已編譯好的鏡像:

make osdrv_cross=arm-hisiv100nptl-linux distclean

make osdrv_cross=arm-hisiv200-linux distclean

(4)單獨編譯kernel:

待進入核心源代碼目錄後,執行以下操作

cp arch/arm/configs/godnet_defconfig .config

make arch=arm cross_compile=arm-hisiv100nptl-linux- menuconfig

make arch=arm cross_compile=arm-hisiv100nptl-linux- uimage

make arch=arm cross_compile=arm-hisiv200-linux- menuconfig

make arch=arm cross_compile=arm-hisiv200-linux- uimage

(5)單獨編譯uboot:

待進入boot源代碼目錄後,執行以下操作

make arch=arm cross_compile=arm-hisiv100nptl-linux- godnet_config

make arch=arm cross_compile=arm-hisiv100nptl-linux-

make arch=arm cross_compile=arm-hisiv200-linux- godnet_config

make arch=arm cross_compile=arm-hisiv200-linux-

(6)制作檔案系統鏡像:

在osdrv/pub/中有已經編譯好的檔案系統,是以無需再重複編譯檔案系統,隻需要根據單闆上flash的規格型号制作檔案系統鏡像即可。

spi flash使用jffs2格式的鏡像,制作jffs2鏡像時,需要用到spi flash的塊大小。這些資訊會在uboot啟動時會列印出來。建議使用時先直接運作mkfs.jffs2工具,根據列印資訊填寫相關參數。下面以塊大小為64kb為例:

osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_uclibc -l -e 0x40000 -o osdrv/pub/rootfs_uclibc_256k.jffs2

osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_uclibc -l -e 0x10000 -o osdrv/pub/rootfs_uclibc_64k.jffs2

sudo osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_uclibc -l -e 0x10000 --pad=0x9a0000 -o osdrv/pub/rootfs_uclibc_64k.jffs2

sudo osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_uclibc_slq -l -e 0x10000 --pad=0x9a0000 -o osdrv/pub/rootfs_uclibc_64k_slq.jffs2

sudo osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_custom_slq -l -e 0x10000 --pad=0x100000 -o osdrv/pub/rootfs_custom_64k_slq.jffs2

osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_glibc -l -e 0x40000 -o osdrv/pub/rootfs_glibc_256k.jffs2

nand flash使用yaffs2格式的鏡像,制作yaffs2鏡像時,需要用到nand flash的pagesize和ecc。這些資訊會在uboot啟動時會列印出來。建議使用時先直接運作mkyaffs2image工具,根據列印資訊填寫相關參數。下面以2kb pagesize、1bit ecc為例:

osdrv/pub/bin/pc/mkyaffs2image osdrv/pub/rootfs_uclibc osdrv/pub/rootfs_uclibc_2k_1bit.yaffs2 1 1

osdrv/pub/bin/pc/mkyaffs2image osdrv/pub/rootfs_glibc osdrv/pub/rootfs_glibc_2k_1bit.yaffs2 1 1

(7)單獨編譯pcie mcc驅動子產品:

首先,先準備好編譯子產品時需要連接配接到的核心源代碼目錄:

cd ./kernel/

tar -xvf linux-3.0.y.tgz

解壓核心源代碼之後,需要根據具體的晶片類型,先編譯核心(以hi3531為例),以生成相應的頭檔案

cd ./linux-3.0.y

核心源代碼準備完畢,可以進入pcie mcc驅動子產品的源代碼目錄,編譯驅動:

cd ../../drv/pcie_mcc

如果是編譯主片的ko,直接使用make指令

make

如果是編譯從片的ko檔案,請帶上參數target=slave

make target=slave

(說明:預設情況下編譯驅動的工具鍊是arm-hisiv100nptl-linux-,如需更改請帶上參數 cross_compile=arm-hisiv200-linux-)

2. 鏡像存放目錄說明

編譯完的image,rootfs等存放在osdrv/pub目錄下

pub

│  rootfs_uclibc.tgz ------------------------------------------ hisiv100nptl編譯出的rootfs檔案系統

│  rootfs_glibc.tgz ------------------------------------------- hisiv200編譯出的rootfs檔案系統

├─image_glibc ------------------------------------------------ hisiv200編譯出的鏡像檔案

│      uimage ------------------------------------------------- kernel鏡像

│      u-boot-hi3531_930mhz.bin ------------------------------- u-boot鏡像

│      rootfs_256k.jffs2 -------------------------------------- jffs2 rootfs鏡像(對應spi-flash blocksize=256k)

│      rootfs_2k_1bit.yaffs2 ---------------------------------- yaffs2 rootfs鏡像(對應nand-flash pagesize=2k ecc=1bit)

├─image_uclibc ----------------------------------------------- hisiv100nptl編譯出的鏡像檔案

└─bin

    ├─pc

    │      mkfs.jffs2

    │      mkimage

    │      mkfs.cramfs

    │      mkyaffs2image

    │

    ├─board_glibc -------------------------------------------- hisiv200編譯出的單闆用工具以及pcie消息通訊層ko

    │      flash_eraseall

    │      mcc_usrdev_host.ko

    │      flash_erase

    │      mcc_usrdev_slv.ko

    │      hi35xx_dev_slv.ko

    │      nandwrite

    │      hi35xx_dev_host.ko

    │      mcc_drv_slv.ko

    │      mtd_debug

    │      flash_info

    │      mcc_drv_host.ko

    │      boot_device.ko

    │      pcit_dma_slv.ko

    │      sumtool

    │      mtdinfo

    │      flashcp

    │      nandtest

    │      nanddump

    │      parted_glibc

    │      pcit_dma_host.ko

    │      gdb-arm-hisiv200-linux

    └─board_uclibc ------------------------------------------- hisiv100nptl編譯出的單闆用工具以及pcie消息通訊層ko

            flash_eraseall

            mcc_usrdev_host.ko

            flash_erase

            mcc_usrdev_slv.ko

            hi35xx_dev_slv.ko

            nandwrite

            hi35xx_dev_host.ko

            mcc_drv_slv.ko

            mtd_debug

            flash_info

            parted_uclibc

            mcc_drv_host.ko

            boot_device.ko

            pcit_dma_slv.ko

            sumtool

            mtdinfo

            flashcp

            nandtest

            gdb-arm-hisiv100nptl-linux

            nanddump

            pcit_dma_host.ko

3.osdrv目錄結構說明:

osdrv

├─makefile ------------------------------ osdrv目錄編譯腳本

├─busybox ------------------------------- 存放busybox源代碼的目錄

├─tools --------------------------------- 存放各種工具的目錄

│  ├─board_tools ----------------------- 各種單闆上使用工具

│  │  ├─reg-tools-1.0.0 --------------- 寄存器讀寫工具

│  │  ├─mtd-utils --------------------- flash裸讀寫工具

│  │  ├─udev-100 ---------------------- udev工具集

│  │  ├─gdb --------------------------- gdb工具

│  │  ├─parted ------------------------ 大容量硬碟分區工具

│  │  └─e2fsprogs --------------------- mkfs工具集

│  └─pc_tools -------------------------- 各種pc上使用工具

│      ├─mkfs.cramfs ------------------- cramfs檔案系統制作工具

│      ├─mkfs.jffs2 -------------------- jffs2檔案系統制作工具

│      ├─mkimage ----------------------- uimage制作工具

│      ├─mkyaffs2image301 -------------- yaffs2檔案系統制作工具

│      ├─nand_production --------------- nand flash燒寫檔案制作工具

│      └─uboot_tools ------------------- uboot鏡像制作工具、xls檔案及ddr初始化腳本、bootrom工具

├─toolchain ----------------------------- 存放工具鍊的目錄

│  ├─arm-hisiv100nptl-linux ---------------- hisiv100nptl交叉工具鍊

│  └─arm-hisiv200-linux ---------------- hisiv200交叉工具鍊

├─pub ----------------------------------- 存放各種鏡像的目錄

│  ├─image_glibc ----------------------- 基于hisiv100nptl工具鍊編譯,可供flash燒寫的映像檔案,包括uboot、核心、檔案系統

│  ├─image_uclibc ---------------------- 基于hisiv200工具鍊編譯,可供flash燒寫的映像檔案,包括uboot、核心、檔案系統

│  ├─bin ------------------------------- 各種未放入根檔案系統的工具

│  │  ├─pc ---------------------------- 在pc上執行的工具

│  │  ├─board_glibc ------------------- 基于hisiv100nptl工具鍊編譯,在單闆上執行的工具

│  │  └─board_uclibc ------------------ 基于hisiv200工具鍊編譯,在單闆上執行的工具

│  ├─rootfs_uclibc.tgz ----------------- 基于hisiv100nptl工具鍊編譯的根檔案系統

│  └─rootfs_glibc.tgz ------------------ 基于hisiv200工具鍊編譯的根檔案系統

├─drv ----------------------------------- 存放外設驅動的目錄

│  └─pcie_mcc -------------------------- pcie消息通訊層驅動

├─rootfs_scripts ------------------------ 存放根檔案系統制作腳本的目錄

├─uboot --------------------------------- 存放uboot源代碼的目錄

└─kernel -------------------------------- 存放kernel源代碼的目錄

4.注意事項

(1)使用某一工具鍊編譯後,如果需要更換工具鍊,請先将原工具鍊編譯檔案清除,然後再更換工具鍊編譯。

(2)在windows下複制源碼包時,linux下的可執行檔案可能變為非可執行檔案,導緻無法編譯使用;u-boot或核心下編譯後,會有很多符号連結檔案,在windows下複制這些源碼包, 會使源碼包變的巨大,因為linux下的符号連結檔案變為windows下實實在在的檔案,是以源碼包膨脹。是以使用時請注意不要在windows下複制源代碼包。

(3)目前網絡為自适應模式,如果要修改為固定某種速率模式,需要修改檔案kernel/linux-3.0.y/drivers/net/stmmac/stmmac_mdio.c:

關掉宏定義tnk_hw_platform_adjust,注釋掉33行;

選擇需要固定配置的速率,例如固定配置為百兆全雙工的話,打開46行宏定義phy_speed_100即可。

(4)hi3531支援硬浮點,檔案系統中釋出的庫都是硬浮點庫。是以請使用者注意,所有hi3531闆端代碼編譯時需要在makefile裡面添加以下指令:

cflags += -march=armv7-a -mcpu=cortex-a9 –mfloat-abi=softfp -mfpu=vfpv3-d16

cxxflags +=-march=armv7-a -mcpu=cortex-a9 –mfloat-abi=softfp -mfpu=vfpv3-d16

其中cxxflags中的xx根據使用者makefile中所使用宏的具體名稱來确定,e.g:cppflags。

參考:

<a target="_blank" href="http://blog.csdn.net/mybelief321/article/details/9076583">http://blog.csdn.net/mybelief321/article/details/9076583</a>

安裝環境

安裝前的絮叨

    首先簡單介紹一下,所謂的搭建交叉編譯環境,即安裝、配置交叉編譯工具鍊。在該環境下編譯出嵌入式linux系統所需的作業系統、應用程式等,然後再上傳到目标機上。

   交叉編譯工具鍊是為了編譯、連結、處理和調試跨平台體系結構的程式代碼。對于交叉開發的工具鍊來說,在檔案名稱上加了一個字首,用來差別本地的工具鍊。例如,arm-linux-表示是對arm的交叉編譯工具鍊;arm-linux-gcc表示是使用gcc的編譯器。除了體系結構相關的編譯選項以外,其使用方法與linux主機上的gcc相同,是以linux程式設計技術對于嵌入式同樣适用。不過,并不是任何一個版本拿來都能用,各種軟體包往往存在版本比對問題。例如,編譯核心時需要使用arm-linux-gcc-4.3.3版本的交叉編譯工具鍊,而使用arm-linux-gcc-3.4.1的交叉編譯工具鍊,則會導緻編譯失敗。

   那麼gcc和arm-linux-gcc的差別是什麼呢?差別就是gcc是linux下的c語言編譯器,編譯出來的程式在本地執行,而arm-linux-gcc用來在linux下跨平台的c語言編譯器,編譯出來的程式在目标機(如arm平台)上執行,嵌入式開發應使用嵌入式交叉編譯工具鍊。

安裝步驟

1、将壓縮包arm-linux-gcc-4.4.3.tar.gz存放在一個目錄下,這個目錄就是你等會解壓縮的目錄,以後這個目錄就不能随便删掉了,我的存放路徑是 /home/song/software,如下圖,記住這個路徑,等會還會用到。

Ubuntu 上 hi3531 交叉編譯環境 arm-hisiv100nptl-linux 搭建過程 Ubuntu12.04嵌入式交叉編譯環境arm-linu-gcc搭建過程,圖解

2、使用tar指令:tar zxvf arm-gcc-4.4.3.tar.gz将software檔案夾下的arm-linux-gcc-4.4.3.tar.gz解壓縮安裝到目前目錄下如下圖

Ubuntu 上 hi3531 交叉編譯環境 arm-hisiv100nptl-linux 搭建過程 Ubuntu12.04嵌入式交叉編譯環境arm-linu-gcc搭建過程,圖解

    通過下圖可以看到解壓成功了,并且解壓後的檔案存放在了/home/song/software/opt/friendlyarm/toolschain/4.4.3檔案夾下,如下圖所示,這個存放路徑可得記住,如下圖

Ubuntu 上 hi3531 交叉編譯環境 arm-hisiv100nptl-linux 搭建過程 Ubuntu12.04嵌入式交叉編譯環境arm-linu-gcc搭建過程,圖解

3、接下來配置系統環境變量,把交叉編譯工具鍊的路徑添加到環境變量path中去,這樣就可以在任何目錄下使用這些工具。記下上一步中的安裝路徑,使用指令:vim /etc/profile 編輯profile檔案,添加環境變量。

Ubuntu 上 hi3531 交叉編譯環境 arm-hisiv100nptl-linux 搭建過程 Ubuntu12.04嵌入式交叉編譯環境arm-linu-gcc搭建過程,圖解

   在profile中最後一行添加:  export path=$path:/home/song/software/opt/friendlyarm/toolschain/4.4.3/bin  這個路徑就是那個bin目錄所在的路徑,可能你的不一樣,按照你實際的目錄填就可以了,如下圖32行

Ubuntu 上 hi3531 交叉編譯環境 arm-hisiv100nptl-linux 搭建過程 Ubuntu12.04嵌入式交叉編譯環境arm-linu-gcc搭建過程,圖解

   編寫完儲存就好了

4、使用指令:source /etc/profile 使環境變量生效

5、在終端上輸入指令  arm-linux 再按tab鍵,可以看到下圖,說明環境變量設定成功了

Ubuntu 上 hi3531 交叉編譯環境 arm-hisiv100nptl-linux 搭建過程 Ubuntu12.04嵌入式交叉編譯環境arm-linu-gcc搭建過程,圖解

6、使用指令:arm-linux-gcc -v 會出現下面的錯誤提示:/home/song/software/opt/friendlyarm/toolschain/4.4.3/bin/arm-linux-gcc: 15: exec: /home/song/software/opt/friendlyarm/toolschain/4.4.3/bin/.arm-none-linux-gnueabi-gcc: not found

Ubuntu 上 hi3531 交叉編譯環境 arm-hisiv100nptl-linux 搭建過程 Ubuntu12.04嵌入式交叉編譯環境arm-linu-gcc搭建過程,圖解

  說是出現這種問題的原因是由于ubuntu12.04用的是64位的,解決方法就是使用指令:sudo apt-get install ia32-libs 裝一些32位的庫

Ubuntu 上 hi3531 交叉編譯環境 arm-hisiv100nptl-linux 搭建過程 Ubuntu12.04嵌入式交叉編譯環境arm-linu-gcc搭建過程,圖解

7、待安裝完32位的庫之後,再使用指令:arm-linux-gcc -v,這一次就成功了,如下圖

Ubuntu 上 hi3531 交叉編譯環境 arm-hisiv100nptl-linux 搭建過程 Ubuntu12.04嵌入式交叉編譯環境arm-linu-gcc搭建過程,圖解

8、驗證,編譯一個hello.c檔案

Ubuntu 上 hi3531 交叉編譯環境 arm-hisiv100nptl-linux 搭建過程 Ubuntu12.04嵌入式交叉編譯環境arm-linu-gcc搭建過程,圖解

  使用指令:arm-linux-gcc hello.c -o hello 看是否編譯成功

Ubuntu 上 hi3531 交叉編譯環境 arm-hisiv100nptl-linux 搭建過程 Ubuntu12.04嵌入式交叉編譯環境arm-linu-gcc搭建過程,圖解

  可見成功生成了二進制檔案。

繼續閱讀