Hi3516A linux kernel 編譯步驟詳細說明
阿新 • • 發佈:2019-02-04
1.osdrv 頂層 Makefile 使用說明
本目錄下的編譯指令碼支援選用下文提到的兩種工具鏈中的任何一種進行編譯,因此編譯時需要帶上一個編譯引數以指定對應的工具鏈 -- arm-hisiv300-linux 和 arm-hisiv400-linux。其中,arm-hisiv300-linux工具鏈對應uclibc庫,arm-hisiv400-linux工具鏈對應glibc庫。具體命令如下
(1)編譯整個osdrv目錄:
make OSDRV_CROSS=arm-hisiv300-linux all
或者
make OSDRV_CROSS=arm-hisiv400-linux all
/* 如果單板使用spi介面nand flash作為儲存介質,請在編譯整個目錄時傳入如下FLASH_TYPE引數 */
make OSDRV_CROSS=arm-hisiv300-linux all FLASH_TYPE=spinand
或者
make OSDRV_CROSS=arm-hisiv400-linux all FLASH_TYPE=spinand
(2)清除整個osdrv目錄的編譯檔案:
make OSDRV_CROSS=arm-hisiv300-linux clean
或者
make OSDRV_CROSS=arm-hisiv400-linux clean
(3)徹底清除整個osdrv目錄的編譯檔案,除清除編譯檔案外,還刪除已編譯好的映象:
make OSDRV_CROSS=arm-hisiv300-linux distclean
或者
make OSDRV_CROSS=arm-hisiv400-linux distclean
(4)單獨編譯kernel:
待進入核心原始碼目錄後,執行以下操作
cp arch/arm/configs/hi3516a_full_defconfig .config
make ARCH=arm CROSS_COMPILE=arm-hisiv300-linux- menuconfig
make ARCH=arm CROSS_COMPILE=arm-hisiv300-linux- uImage
或者
cp arch/arm/configs/hi3516a_full_defconfig .config
make ARCH=arm CROSS_COMPILE=arm-hisiv400-linux- menuconfig
make ARCH=arm CROSS_COMPILE=arm-hisiv400-linux- uImage
(5)單獨編譯模組:
待進入核心原始碼目錄後,執行以下操作
cp arch/arm/configs/hi3516a_full_defconfig .config
make ARCH=arm CROSS_COMPILE=arm-hisiv300-linux- menuconfig
make ARCH=arm CROSS_COMPILE=arm-hisiv300-linux- modules
或者
cp arch/arm/configs/hi3516a_full_defconfig .config
make ARCH=arm CROSS_COMPILE=arm-hisiv400-linux- menuconfig
make ARCH=arm CROSS_COMPILE=arm-hisiv400-linux- modules
(6)單獨編譯uboot:
待進入boot原始碼目錄後,執行以下操作
make ARCH=arm CROSS_COMPILE=arm-hisiv300-linux- hi3516a_config
make ARCH=arm CROSS_COMPILE=arm-hisiv300-linux-
將生成的u-boot.bin 複製到osdrv/tools/pc/uboot_tools/目錄下
執行./mkboot.sh reg_info.bin u-boot-ok.bin
生成的u-boot-ok.bin即為可用的u-boot映象
或者
make ARCH=arm CROSS_COMPILE=arm-hisiv400-linux- hi3516a_config
make ARCH=arm CROSS_COMPILE=arm-hisiv400-linux-
將生成的u-boot.bin 複製到osdrv/tools/pc_tools/uboot_tools/目錄下
執行./mkboot.sh reg_info.bin u-boot-ok.bin
生成的u-boot-ok.bin即為可用的u-boot映象
(7)製作檔案系統映象:
在osdrv/pub/中有已經編譯好的檔案系統,因此無需再重複編譯檔案系統,只需要根據單板上flash的規格型號製作檔案系統映象即可。
spi flash使用jffs2格式的映象,製作jffs2映象時,需要用到spi flash的塊大小。這些資訊會在uboot啟動時會打印出來。建議使用時先直接執行mkfs.jffs2工具,根據列印資訊填寫相關引數。下面以塊大小為256KB為例:
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_glibc -l -e 0x40000 -o osdrv/pub/rootfs_glibc_256k.jffs2
nand flash使用yaffs2格式的映象,製作yaffs2映象時,需要用到nand flash的pagesize和ecc。這些資訊會在uboot啟動時會打印出來。建議使用時先直接執行mkyaffs2image工具,根據列印資訊填寫相關引數。下面以2KB pagesize、4bit ecc為例:
osdrv/pub/bin/pc/mkyaffs2image610 osdrv/pub/rootfs_uclibc osdrv/pub/rootfs_uclibc_2k_4bit.yaffs2 1 2
或者
osdrv/pub/bin/pc/mkyaffs2image610 osdrv/pub/rootfs_glibc osdrv/pub/rootfs_glibc_2k_4bit.yaffs2 1 2
2. 映象存放目錄說明
編譯完的image,rootfs等存放在osdrv/pub目錄下
pub
│ rootfs_uclibc.tgz ------------------------------------------ hisiv300編譯出的rootfs檔案系統
│ rootfs_glibc.tgz ------------------------------------------- hisiv400編譯出的rootfs檔案系統
│
├─image_glibc ------------------------------------------------- hisiv400編譯出的映象檔案
│ uImage_hi3516a ----------------------------------------- kernel映象
│ u-boot-hi3516a.bin ------------------------------------- u-boot映象
│ rootfs_hi3516a_64k.jffs2 ------------------------------- 64K jffs2 檔案系統映象
│ rootfs_hi3516a_128k.jffs2 ------------------------------ 128K jffs2 檔案系統映象
│ rootfs_hi3516a_256k.jffs2 ------------------------------ 256K jffs2 檔案系統映象
│ rootfs_hi3516a_2k_4bit.yaffs2 -------------------------- yaffs2 檔案系統映象
│
├─image_uclibc ------------------------------------------------ hisiv300編譯出的映象檔案
│ uImage_hi3516a ----------------------------------------- kernel映象
│ u-boot-hi3516a.bin ------------------------------------- u-boot映象(其中xxx表示AXI匯流排頻率)
│ rootfs_hi3516a_64k.jffs2 ------------------------------- 64K jffs2 檔案系統映象
│ rootfs_hi3516a_128k.jffs2 ------------------------------ 128K jffs2 檔案系統映象
│ rootfs_hi3516a_256k.jffs2 ------------------------------ 256K jffs2 檔案系統映象
│ rootfs_hi3516a_2k_4bit.yaffs2 -------------------------- yaffs2 檔案系統映象
│
└─bin
├─pc
│ mkfs.jffs2
│ mkimage
│ mkfs.cramfs
│ mkyaffs2image
│ mksquashfs
│ lzma
│
├─board_glibc -------------------------------------------- hisiv400編譯出的單板用工具
│ ├─hifat ---------------------------------------------- hifat 工具
│ │ ├─shared
│ │ │ himount
│ │ ├─static
│ │ │ libhimount_api.a
│ │ │ himount
│ │ ├─static
│ │ │ hifat-1.0-glibc.tgz
│ │ ├─himount_api.h
│ │ ├─how_to_use_[chs].txt
│ │ └─how_to_use_[en].txt
│ ethtool
│ flash_erase
│ flash_otp_dump
│ flash_otp_info
│ sumtool
│ mtd_debug
│ flashcp
│ nandtest
│ nanddump
│ nandwrite
│ gdb-arm-hisiv400-linux
│
└─board_uclibc ------------------------------------------- hisiv300編譯出的單板用工具
├─hifat -------------------------------------------- hifat 工具
│ ├─shared
│ │ himount
│ ├─static
│ │ libhimount_api.a
│ │ himount
│ ├─static
│ │ hifat-1.0-uclibc.tgz
│ ├─himount_api.h
│ ├─how_to_use_[chs].txt
│ └─how_to_use_[en].txt
ethtool
flash_erase
flash_otp_dump
flash_otp_info
sumtool
mtd_debug
flashcp
nandtest
nanddump
nandwrite
gdb-arm-hisiv400-linux
3.osdrv目錄結構說明:
osdrv
├─Makefile -------------------------------------- osdrv目錄編譯指令碼
├─tools ----------------------------------------- 存放各種工具的目錄
│ ├─board -------------------------------------- 各種單板上使用工具
│ │ ├─reg-tools-1.0.0 ------------------------- 暫存器讀寫工具
│ │ ├─hifat --- ------------------------------- FAT檔案系統製作工具
│ │ ├─udev-164 -------------------------------- udev工具集
│ │ ├─mkdosfs --------------------------------- mkdosfs工具
│ │ ├─mtd-utils ------------------------------- flash裸讀寫工具集
│ │ ├─gdb ------------------------------------- gdb工具
│ │ ├─ethtools -------------------------------- ethtools工具
│ │ └─e2fsprogs ------------------------------- mkfs工具集
│ └─pc ----------------------------------------- 各種pc上使用工具
│ ├─jffs2_tool------------------------------ jffs2檔案系統製作工具
│ ├─cramfs_tool ---------------------------- cramfs檔案系統製作工具
│ ├─squashfs4.2 ---------------------------- squashfs檔案系統製作工具
│ ├─mkimage_tool --------------------------- uImage製作工具
│ ├─nand_production ------------------------ nand量產工具
│ ├─lzma_tool ------------------------------ lzma壓縮工具
│ ├─mkyaffs2image -- ----------------------- yaffs2檔案系統製作工具
│ └─uboot_tools ---------------------------- uboot映象製作工具、xls檔案及ddr初始化指令碼、Fastboot工具
├─pub ------------------------------------------- 存放各種映象的目錄
│ ├─image_uclibc ------------------------------- 基於hisiv300工具鏈編譯,可供FLASH燒寫的映像檔案,包括uboot、核心、檔案系統
│ ├─image_glibc -------------------------------- 基於hisiv400工具鏈編譯,可供FLASH燒寫的映像檔案,包括uboot、核心、檔案系統
│ ├─bin ---------------------------------------- 各種未放入根檔案系統的工具
│ │ ├─pc -------------------------------------- 在pc上執行的工具
│ │ ├─board_uclibc ---------------------------- 基於hisiv300工具鏈編譯,在單板上執行的工具
│ │ └─board_glibc ----------------------------- 基於hisiv400工具鏈編譯,在單板上執行的工具
│ ├─rootfs_uclibc.tgz -------------------------- 基於hisiv300工具鏈編譯的根檔案系統
│ └─rootfs_glibc.tgz --------------------------- 基於hisiv400工具鏈編譯的根檔案系統
├─opensource------------------------------------- 存放各種開源原始碼目錄
│ ├─toolchain ---------------------------------- 存放工具鏈的目錄
│ ├─busybox ------------------------------------ 存放busybox原始碼的目錄
│ ├─uboot -------------------------------------- 存放uboot原始碼的目錄
│ └─kernel ------------------------------------- 存放kernel原始碼的目錄
└─rootfs_scripts -------------------------------- 存放根檔案系統製作指令碼的目錄
4.注意事項
(1)使用某一工具鏈編譯後,如果需要更換工具鏈,請先將原工具鏈編譯檔案清除,然後再更換工具鏈編譯。
(2)在windows下複製原始碼包時,linux下的可執行檔案可能變為非可執行檔案,導致無法編譯使用;u-boot或核心下編譯後,會有很多符號連結檔案,在windows下複製這些原始碼包, 會使原始碼包變的巨大,因為linux下的符號連結檔案變為windows下實實在在的檔案,因此原始碼包膨脹。因此使用時請注意不要在windows下複製原始碼包。
(3)Hi3516A具有浮點運算單元和neon。檔案系統中的庫是採用軟浮點和neon編譯而成,因此請使用者注意,所有Hi3516A板端程式碼編譯時需要在Makefile裡面新增以下命令:
CFLAGS += -mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4
CXXFlAGS +=-mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4
其中CXXFlAGS中的XX根據使用者Makefile中所使用巨集的具體名稱來確定,e.g:CPPFLAGS。
本目錄下的編譯指令碼支援選用下文提到的兩種工具鏈中的任何一種進行編譯,因此編譯時需要帶上一個編譯引數以指定對應的工具鏈 -- arm-hisiv300-linux 和 arm-hisiv400-linux。其中,arm-hisiv300-linux工具鏈對應uclibc庫,arm-hisiv400-linux工具鏈對應glibc庫。具體命令如下
(1)編譯整個osdrv目錄:
make OSDRV_CROSS=arm-hisiv300-linux all
或者
make OSDRV_CROSS=arm-hisiv400-linux all
/* 如果單板使用spi介面nand flash作為儲存介質,請在編譯整個目錄時傳入如下FLASH_TYPE引數 */
make OSDRV_CROSS=arm-hisiv300-linux all FLASH_TYPE=spinand
或者
make OSDRV_CROSS=arm-hisiv400-linux all FLASH_TYPE=spinand
(2)清除整個osdrv目錄的編譯檔案:
make OSDRV_CROSS=arm-hisiv300-linux clean
或者
make OSDRV_CROSS=arm-hisiv400-linux clean
(3)徹底清除整個osdrv目錄的編譯檔案,除清除編譯檔案外,還刪除已編譯好的映象:
make OSDRV_CROSS=arm-hisiv300-linux distclean
或者
make OSDRV_CROSS=arm-hisiv400-linux distclean
(4)單獨編譯kernel:
待進入核心原始碼目錄後,執行以下操作
cp arch/arm/configs/hi3516a_full_defconfig .config
make ARCH=arm CROSS_COMPILE=arm-hisiv300-linux- menuconfig
make ARCH=arm CROSS_COMPILE=arm-hisiv300-linux- uImage
或者
cp arch/arm/configs/hi3516a_full_defconfig .config
make ARCH=arm CROSS_COMPILE=arm-hisiv400-linux- menuconfig
make ARCH=arm CROSS_COMPILE=arm-hisiv400-linux- uImage
(5)單獨編譯模組:
待進入核心原始碼目錄後,執行以下操作
cp arch/arm/configs/hi3516a_full_defconfig .config
make ARCH=arm CROSS_COMPILE=arm-hisiv300-linux- menuconfig
make ARCH=arm CROSS_COMPILE=arm-hisiv300-linux- modules
或者
cp arch/arm/configs/hi3516a_full_defconfig .config
make ARCH=arm CROSS_COMPILE=arm-hisiv400-linux- menuconfig
make ARCH=arm CROSS_COMPILE=arm-hisiv400-linux- modules
(6)單獨編譯uboot:
待進入boot原始碼目錄後,執行以下操作
make ARCH=arm CROSS_COMPILE=arm-hisiv300-linux- hi3516a_config
make ARCH=arm CROSS_COMPILE=arm-hisiv300-linux-
將生成的u-boot.bin 複製到osdrv/tools/pc/uboot_tools/目錄下
執行./mkboot.sh reg_info.bin u-boot-ok.bin
生成的u-boot-ok.bin即為可用的u-boot映象
或者
make ARCH=arm CROSS_COMPILE=arm-hisiv400-linux- hi3516a_config
make ARCH=arm CROSS_COMPILE=arm-hisiv400-linux-
將生成的u-boot.bin 複製到osdrv/tools/pc_tools/uboot_tools/目錄下
執行./mkboot.sh reg_info.bin u-boot-ok.bin
生成的u-boot-ok.bin即為可用的u-boot映象
(7)製作檔案系統映象:
在osdrv/pub/中有已經編譯好的檔案系統,因此無需再重複編譯檔案系統,只需要根據單板上flash的規格型號製作檔案系統映象即可。
spi flash使用jffs2格式的映象,製作jffs2映象時,需要用到spi flash的塊大小。這些資訊會在uboot啟動時會打印出來。建議使用時先直接執行mkfs.jffs2工具,根據列印資訊填寫相關引數。下面以塊大小為256KB為例:
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_glibc -l -e 0x40000 -o osdrv/pub/rootfs_glibc_256k.jffs2
nand flash使用yaffs2格式的映象,製作yaffs2映象時,需要用到nand flash的pagesize和ecc。這些資訊會在uboot啟動時會打印出來。建議使用時先直接執行mkyaffs2image工具,根據列印資訊填寫相關引數。下面以2KB pagesize、4bit ecc為例:
osdrv/pub/bin/pc/mkyaffs2image610 osdrv/pub/rootfs_uclibc osdrv/pub/rootfs_uclibc_2k_4bit.yaffs2 1 2
或者
osdrv/pub/bin/pc/mkyaffs2image610 osdrv/pub/rootfs_glibc osdrv/pub/rootfs_glibc_2k_4bit.yaffs2 1 2
2. 映象存放目錄說明
編譯完的image,rootfs等存放在osdrv/pub目錄下
pub
│ rootfs_uclibc.tgz ------------------------------------------ hisiv300編譯出的rootfs檔案系統
│ rootfs_glibc.tgz ------------------------------------------- hisiv400編譯出的rootfs檔案系統
│
├─image_glibc ------------------------------------------------- hisiv400編譯出的映象檔案
│ uImage_hi3516a ----------------------------------------- kernel映象
│ u-boot-hi3516a.bin ------------------------------------- u-boot映象
│ rootfs_hi3516a_64k.jffs2 ------------------------------- 64K jffs2 檔案系統映象
│ rootfs_hi3516a_128k.jffs2 ------------------------------ 128K jffs2 檔案系統映象
│ rootfs_hi3516a_256k.jffs2 ------------------------------ 256K jffs2 檔案系統映象
│ rootfs_hi3516a_2k_4bit.yaffs2 -------------------------- yaffs2 檔案系統映象
│
├─image_uclibc ------------------------------------------------ hisiv300編譯出的映象檔案
│ uImage_hi3516a ----------------------------------------- kernel映象
│ u-boot-hi3516a.bin ------------------------------------- u-boot映象(其中xxx表示AXI匯流排頻率)
│ rootfs_hi3516a_64k.jffs2 ------------------------------- 64K jffs2 檔案系統映象
│ rootfs_hi3516a_128k.jffs2 ------------------------------ 128K jffs2 檔案系統映象
│ rootfs_hi3516a_256k.jffs2 ------------------------------ 256K jffs2 檔案系統映象
│ rootfs_hi3516a_2k_4bit.yaffs2 -------------------------- yaffs2 檔案系統映象
│
└─bin
├─pc
│ mkfs.jffs2
│ mkimage
│ mkfs.cramfs
│ mkyaffs2image
│ mksquashfs
│ lzma
│
├─board_glibc -------------------------------------------- hisiv400編譯出的單板用工具
│ ├─hifat ---------------------------------------------- hifat 工具
│ │ ├─shared
│ │ │ himount
│ │ ├─static
│ │ │ libhimount_api.a
│ │ │ himount
│ │ ├─static
│ │ │ hifat-1.0-glibc.tgz
│ │ ├─himount_api.h
│ │ ├─how_to_use_[chs].txt
│ │ └─how_to_use_[en].txt
│ ethtool
│ flash_erase
│ flash_otp_dump
│ flash_otp_info
│ sumtool
│ mtd_debug
│ flashcp
│ nandtest
│ nanddump
│ nandwrite
│ gdb-arm-hisiv400-linux
│
└─board_uclibc ------------------------------------------- hisiv300編譯出的單板用工具
├─hifat -------------------------------------------- hifat 工具
│ ├─shared
│ │ himount
│ ├─static
│ │ libhimount_api.a
│ │ himount
│ ├─static
│ │ hifat-1.0-uclibc.tgz
│ ├─himount_api.h
│ ├─how_to_use_[chs].txt
│ └─how_to_use_[en].txt
ethtool
flash_erase
flash_otp_dump
flash_otp_info
sumtool
mtd_debug
flashcp
nandtest
nanddump
nandwrite
gdb-arm-hisiv400-linux
3.osdrv目錄結構說明:
osdrv
├─Makefile -------------------------------------- osdrv目錄編譯指令碼
├─tools ----------------------------------------- 存放各種工具的目錄
│ ├─board -------------------------------------- 各種單板上使用工具
│ │ ├─reg-tools-1.0.0 ------------------------- 暫存器讀寫工具
│ │ ├─hifat --- ------------------------------- FAT檔案系統製作工具
│ │ ├─udev-164 -------------------------------- udev工具集
│ │ ├─mkdosfs --------------------------------- mkdosfs工具
│ │ ├─mtd-utils ------------------------------- flash裸讀寫工具集
│ │ ├─gdb ------------------------------------- gdb工具
│ │ ├─ethtools -------------------------------- ethtools工具
│ │ └─e2fsprogs ------------------------------- mkfs工具集
│ └─pc ----------------------------------------- 各種pc上使用工具
│ ├─jffs2_tool------------------------------ jffs2檔案系統製作工具
│ ├─cramfs_tool ---------------------------- cramfs檔案系統製作工具
│ ├─squashfs4.2 ---------------------------- squashfs檔案系統製作工具
│ ├─mkimage_tool --------------------------- uImage製作工具
│ ├─nand_production ------------------------ nand量產工具
│ ├─lzma_tool ------------------------------ lzma壓縮工具
│ ├─mkyaffs2image -- ----------------------- yaffs2檔案系統製作工具
│ └─uboot_tools ---------------------------- uboot映象製作工具、xls檔案及ddr初始化指令碼、Fastboot工具
├─pub ------------------------------------------- 存放各種映象的目錄
│ ├─image_uclibc ------------------------------- 基於hisiv300工具鏈編譯,可供FLASH燒寫的映像檔案,包括uboot、核心、檔案系統
│ ├─image_glibc -------------------------------- 基於hisiv400工具鏈編譯,可供FLASH燒寫的映像檔案,包括uboot、核心、檔案系統
│ ├─bin ---------------------------------------- 各種未放入根檔案系統的工具
│ │ ├─pc -------------------------------------- 在pc上執行的工具
│ │ ├─board_uclibc ---------------------------- 基於hisiv300工具鏈編譯,在單板上執行的工具
│ │ └─board_glibc ----------------------------- 基於hisiv400工具鏈編譯,在單板上執行的工具
│ ├─rootfs_uclibc.tgz -------------------------- 基於hisiv300工具鏈編譯的根檔案系統
│ └─rootfs_glibc.tgz --------------------------- 基於hisiv400工具鏈編譯的根檔案系統
├─opensource------------------------------------- 存放各種開源原始碼目錄
│ ├─toolchain ---------------------------------- 存放工具鏈的目錄
│ ├─busybox ------------------------------------ 存放busybox原始碼的目錄
│ ├─uboot -------------------------------------- 存放uboot原始碼的目錄
│ └─kernel ------------------------------------- 存放kernel原始碼的目錄
└─rootfs_scripts -------------------------------- 存放根檔案系統製作指令碼的目錄
4.注意事項
(1)使用某一工具鏈編譯後,如果需要更換工具鏈,請先將原工具鏈編譯檔案清除,然後再更換工具鏈編譯。
(2)在windows下複製原始碼包時,linux下的可執行檔案可能變為非可執行檔案,導致無法編譯使用;u-boot或核心下編譯後,會有很多符號連結檔案,在windows下複製這些原始碼包, 會使原始碼包變的巨大,因為linux下的符號連結檔案變為windows下實實在在的檔案,因此原始碼包膨脹。因此使用時請注意不要在windows下複製原始碼包。
(3)Hi3516A具有浮點運算單元和neon。檔案系統中的庫是採用軟浮點和neon編譯而成,因此請使用者注意,所有Hi3516A板端程式碼編譯時需要在Makefile裡面新增以下命令:
CFLAGS += -mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4
CXXFlAGS +=-mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4
其中CXXFlAGS中的XX根據使用者Makefile中所使用巨集的具體名稱來確定,e.g:CPPFLAGS。