閱讀830 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Ubuntu 上 hi3531 交叉編譯環境 arm-hisiv100nptl-linux 搭建過程

安裝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
或者
cp arch/arm/configs/godnet_defconfig .config
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
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
內核源代碼準備完畢,可以進入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編譯出的鏡像文件
│      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)

└─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。


參考:

https://blog.csdn.net/mybelief321/article/details/9076583

 

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

分類: Qt編程2013-06-12 08:44 2462人閱讀 評論(2) 收藏 舉報
ubuntu12.04arm-linux-gcc

安裝環境

       Linux版本:Ubuntu 12.04    內核版本:Linux 3.5.0   交叉編譯器版本:arm-linux-gcc-4.4.3 這個版本的交叉編譯器我已經上傳到了資源上,可以隨便下載,點此下載

安裝前的絮叨

    首先簡單介紹一下,所謂的搭建交叉編譯環境,即安裝、配置交叉編譯工具鏈。在該環境下編譯出嵌入式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,如下圖,記住這個路徑,等會還會用到。

   

2、使用tar命令:tar zxvf arm-gcc-4.4.3.tar.gz將software文件夾下的arm-linux-gcc-4.4.3.tar.gz解壓縮安裝到當前目錄下如下圖

    

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

   

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

      

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

   

   編寫完保存就好了

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

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

   

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

   

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

   

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

   

8、驗證,編譯一個hello.c文件

  

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

  

  可見成功生成了二進製文件。

最後更新:2017-04-03 07:57:06

  上一篇:go Java程序員也應該知道的係統知識係列之CPU
  下一篇:go hi3531的h264壓縮中修改波特率