海思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. 準備
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. 配置
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 文件

make[1]: *** No rule to make target ...../HiSTBLinuxV100R002C00SPC011/source/boot/sysreg/his40tst2a_hi3716cv200es0_ddr3_2gbyte_8bitx4_4layers_ECO2.reg',



發佈了53 篇原創文章 · 獲贊 22 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章