HI3516EV300编译环境搭建(二)

整体编译

(1)编译整个osdrv目录:
注意:默认不发布内核源码包,只发布补丁文件。内核源码包需自行从开源社区上下载。

1、从linux开源社区下载v4.9.37版本的内核:
1)进入网站:www.kernel.org
2)选择HTTP协议资源的https://www.kernel.org/pub/选项,进入子页面
3)选择linux/菜单项,进入子页面
4)选择kernel/菜单项,进入子页面
5)选择v4.x/菜单项,进入子页面
6)下载linux-4.9.37.tar.gz(或linux-4.9.37.tar.xz)

2、打补丁
1)将下载的 linux-4.9.37.tar.gz 存放到 osdrv的opensource/kernel目录中
2)在linux服务器中进入 osdrv 的根目录,执行如下命令:
cd opensource/kernel
tar -zxf linux-4.9.37.tar.gz
mv linux-4.9.37 linux-4.9.y
cd linux-4.9.y
patch -p1 < ../linux-4.9.37.patch cd ../ tar -czf linux-4.9.y.tgz linux-4.9.y cd ../../ 注意: 若下载的内核格式为linux-4.9.37.tar.xz, 第一步先用: xz -d linux-4.9.37.tar.xz 命令将linux-4.9.37.tar.xz解压为linux-4.9.37.tar。 第二步再用: tar -xvf linux-4.9.37.tar 解压linux-4.9.37.tar。 注意:由于Makefile中文件系统编译依赖组件较多,不能保证单独编译的文件系统可用,建议采用make all编译; 但可单独编译uboot,kernel; 可以传如下参数: a, BOOT_MEDIA:spi(default) or emmc b, CHIP:hi3516ev200(default) or hi3516ev300 or hi3518ev300 c, 如果客户想要更换可以使用TARGET_XLSM=*.xlsm来指定所需要的u-boot表格文件 (2)清除整个osdrv目录的编译文件: make OSDRV_CROSS=arm-himix200-linux clean (3)彻底清除整个osdrv目录的编译文件,除清除编译文件外,还删除已编译好的镜像: make OSDRV_CROSS=arm-himix200-linux distclean

HI3516EV300编译环境搭建(一)

官方readme
1.osdrv 顶层 Makefile 使用说明
本目录下的编译脚本支持 arm-himix100-linux工具链对应uclibc库。具体命令如下(以hi3516ev200举例)

(1)编译整个osdrv目录:
注意:默认不发布内核源码包,只发布补丁文件。内核源码包需自行从开源社区上下载。
从linux开源社区下载v4.9.37版本的内核:
1)进入网站:www.kernel.org
2)选择HTTP协议资源的https://www.kernel.org/pub/选项,进入子页面
3)选择linux/菜单项,进入子页面
4)选择kernel/菜单项,进入子页面
5)选择v4.x/菜单项,进入子页面
6)下载linux-4.9.37.tar.gz (或者linux-4.9.37.tar.xz)到osdrv/opensource/kernel目录下

make all

注意:由于Makefile中文件系统编译依赖组件较多,不能保证单独编译的文件系统可用,建议采用make all编译;
但可单独编译uboot,kernel;

可以传如下参数:
a, BOOT_MEDIA:spi(default) or emmc
b, CHIP:hi3516ev200(default) or hi3516ev300 or hi3518ev300
c, 如果客户想要更换可以使用TARGET_XLSM=*.xlsm来指定所需要的u-boot表格文件

(2)清除整个osdrv目录的编译文件:

make OSDRV_CROSS=arm-himix100-linux clean
(3)彻底清除整个osdrv目录的编译文件,除清除编译文件外,还删除已编译好的镜像:

make OSDRV_CROSS=arm-himix100-linux distclean

(4)单独编译kernel:
注意:单独编译内核之前请先阅读osdrv/opensource/kernel下的readme_cn.txt说明。

待进入内核源代码目录后,执行以下操作

cp arch/arm/configs/hi3516ev200_full_defconfig .config
(emmc启动时执行如下操作:cp arch/arm/configs/hi3516ev200_emmc_defconfig .config)
make ARCH=arm CROSS_COMPILE=arm-himix100-linux- menuconfig
make ARCH=arm CROSS_COMPILE=arm-himix100-linux- uImage

(5)单独编译模块:
待进入内核源代码目录后,执行以下操作

cp arch/arm/configs/hi3516ev200_full_defconfig .config
(emmc启动时执行如下操作:cp arch/arm/configs/hi3516ev200_emmc_defconfig .config)
make ARCH=arm CROSS_COMPILE=arm-himix100-linux- menuconfig
make ARCH=arm CROSS_COMPILE=arm-himix100-linux- modules

(6)单独编译uboot:
注意:发布包默认按照DMEB板的配置发布,如果客户单板和DEMB板不一致,需要根据客户自己的单板环境修改uboot表格才能使用,否则可能导致uboot无法启动或者其他问题。

待进入boot源代码目录后,执行以下操作
make ARCH=arm CROSS_COMPILE=arm-himix100-linux- hi3516ev200_defconfig
(emmc启动时执行如下操作:make ARCH=arm CROSS_COMPILE=arm-himix100-linux- hi3516ev200_emmc_defconfig)

make ARCH=arm CROSS_COMPILE=arm-himix100-linux- -j 20

make -C ../../../tools/pc/hi_gzip

cp ../../../tools/pc/hi_gzip/bin/gzip arch/arm/cpu/armv7/hi3516ev200/hw_compressed/ -rf

Windowns下进入到osdrv/tools/pc/uboot_tools/目录下打开对应单板的Excel文件,在main标签中点击”Generate reg bin file”按钮,生成reg_info.bin即为对应平台的表格文件。
从osdrv/tools/pc/uboot_tools目录拷贝reg_info.bin到boot源代码目录,重命名为.reg
cp ../../../tools/pc/uboot_tools/reg_info.bin .reg

make ARCH=arm CROSS_COMPILE=arm-himix100-linux- u-boot-z.bin

opensource/uboot/u-boot-2016.11下生成的u-boot-hi3516ev200.bin即为可用的u-boot镜像

(7)制作文件系统镜像:
在osdrv/pub/中有已经编译好的文件系统,因此无需再重复编译文件系统,只需要根据单板上flash的规格型号制作文件系统镜像即可。

SPI NOR Flash使用jffs2格式的镜像,制作jffs2镜像时,需要用到SPI NOR Flash的块大小。这些信息会在uboot启动时
会打印出来。建议使用时先直接运行mkfs.jffs2工具,根据打印信息填写相关参数。
下面以块大小为64KB为例:
osdrv/pub/bin/pc/mkfs.jffs2 -d osdrv/pub/rootfs_uclibc -l -e 0x10000 -o osdrv/pub/rootfs_uclibc_64k.jffs2

Nand Flash使用yaffs2格式的镜像,制作yaffs2镜像时,需要用到nand flash的pagesize和ecc。这些信息会在uboot启动时会打
印出来。建议使用时先直接运行mkyaffs2image工具,根据打印信息填写相关参数。
下面以并口NAND的2KB pagesize、4bit ecc为例:
osdrv/pub/bin/pc/mkyaffs2image610 osdrv/pub/rootfs_uclibc osdrv/pub/rootfs_uclibc_2k_4bit.yaffs2 1 2

Nand Flash使用UBI文件系统,在osdrv/tools/pc/ubi_sh下提供mkubiimg.sh工具用于制作UBI文件系统,需要用到Nand
Flash的pagesize、blocksize和UBIFS分区的大小。
以2KB pagesize, 128KB blocksize和UBI文件系统分区大小32MB为例:

mkubiimg.sh hi3516ev200 2k 128k osdrv/pub/rootfs 32M osdrv/pub/bin/pc

osdrv/pub/rootfs是根文件系统文件夹目录
osdrv/pub/bin/pc是制作UBI文件系统镜像的工具目录
生成的rootfs_hi3516ev200_2k_128k_32M.ubifs,就是最终用于烧写的UBI文件系统镜像。

2. 镜像存放目录说明
编译完的image,rootfs等存放在osdrv/pub目录下
pub
├─ bin

│   ├─ board_uclibc ——————————————– himix100编译出的单板用工具
│   │   ├── ethtool
│   │   ├── flashcp
│   │   ├── flash_erase
│   │   ├── flash_otp_dump
│   │   ├── flash_otp_info
│   │   ├── gdb-arm-himix100-linux
│   │   ├── mtd_debug
│   │   ├── mtdinfo
│   │   ├── nanddump
│   │   ├── nandtest
│   │   ├── nandwrite
│   │   ├── sumtool
│   │   ├── ubiattach
│   │   ├── ubicrc32
│   │   ├── ubidetach
│   │   ├── ubiformat
│   │   ├── ubimkvol
│   │   ├── ubinfo
│   │   ├── ubinize
│   │   ├── ubirename
│   │   ├── ubirmvol
│   │   ├── ubirsvol
│   │   └── ubiupdatevol
│   └─ pc
│   ├── lzma
│   ├── mkfs.cramfs
│   ├── mkfs.jffs2
│   ├── mkfs.ubifs
│   ├── mkimage
│   ├── mksquashfs
│   └── ubinize
├─image_uclibc ————————————————- himix100编译出的镜像文件
│ ├── uImage_hi3516ev200 —————————————– kernel镜像
│ ├── u-boot-hi3516ev200.bin ————————————- u-boot镜像
│ ├── rootfs_hi3516ev200_64k.jffs2 ——————————- 64K jffs2 文件系统镜像
│ ├── rootfs_hi3516ev200_128k.jffs2 —————————— 128K jffs2 文件系统镜像
│ ├── rootfs_hi3516ev200_256k.jffs2 —————————— 256K jffs2 文件系统镜像
│ ├── rootfs_hi3516ev200_2k_4bit.yaffs2 ————————– yaffs2 文件系统镜像
│ ├── rootfs_hi3516ev200_2k_24bit.yaffs2 ————————- yaffs2 文件系统镜像
│ ├── rootfs_hi3516ev200_4k_4bit.yaffs2 ————————– yaffs2 文件系统镜像
│ ├── rootfs_hi3516ev200_4k_24bit.yaffs2 ————————- yaffs2 文件系统镜像
│   ├── rootfs_hi3516ev200_2k_128k_32M.ubifs———————— 2k 128k UBI 文件系统镜像
│   └── rootfs_hi3516ev200_4k_256k_50M.ubifs———————— 4k 256k UBI 文件系统镜像

├─ rootfs.ubiimg ———————————————– UBIFS根文件系统
├─ rootfs_uclibc.tgz ——————————————- himix100编译出的rootfs文件系统

3.osdrv目录结构说明:
osdrv
├─Makefile —————————— osdrv目录编译脚本
├─tools ——————————— 存放各种工具的目录
│ ├─board —————————— 各种单板上使用工具
│ │ ├─ethtools ———————– ethtools工具
│ │ ├─reg-tools-1.0.0 —————– 寄存器读写工具
│ │ ├─udev-167 ———————— udev工具集
│ │ ├─mtd-utils ———————– flash裸读写工具集
│ │ ├─gdb —————————– gdb工具
│ │ └─e2fsprogs ———————– mkfs工具集
│ └─pc ———————————- 各种pc上使用工具
│ ├─jffs2_tool———————– jffs2文件系统制作工具
│ ├─cramfs_tool ——————— cramfs文件系统制作工具
│ ├─squashfs4.3 ——————— squashfs文件系统制作工具
│ ├─nand_production —————– nand量产工具
│ ├─lzma_tool ———————– lzma压缩工具
│ ├─zlib —————————- zlib工具
│ ├─mkyaffs2image — —————- yaffs2文件系统制作工具
│ └─uboot_tools ———————-uboot镜像制作工具、xls文件及ddr初始化脚本、reg_info.bin制作工具
├─pub ———————————– 存放各种镜像的目录
│ ├─image_uclibc ———————— 基于himix100工具链编译,可供FLASH烧写的映像文件,包括uboot、内核、文件系统
│ ├─bin ——————————– 各种未放入根文件系统的工具
│ │ ├─pc —————————— 在pc上执行的工具
│ │ ├─board_uclibc ——————— 基于himix100工具链编译,在单板上执行的工具
│ └─rootfs_uclibc.tgz ——————- 基于himix100工具链编译的根文件系统
├─opensource—————————– 存放各种开源源码目录
│ ├─busybox —————————- 存放busybox源代码的目录
│ ├─uboot —————————— 存放uboot及安全boot源代码的目录
│ └─kernel —————————– 存放kernel源代码的目录
└─rootfs_scripts ————————- 存放根文件系统制作脚本的目录

4.注意事项
(1)在windows下复制源码包时,linux下的可执行文件可能变为非可执行文件,导致无法编译使用;u-boot或内核下编译后,会有很多符号链接文件,在windows下复制这些源码包, 会使源码包变的巨大,因为linux下的符号链接文件变为windows下实实在在的文件,因此源码包膨胀。因此使用时请注意不要在windows下复制源代码包。
(2)使用某一工具链编译后,如果需要更换工具链,请先将原工具链编译文件清除,然后再更换工具链编译。
(3)编译板端软件
a.此芯片具有浮点运算单元和neon。文件系统中的库是采用软浮点和neon编译而成,因此请用户注意,所有此芯片板端代码编译时需要在Makefile里面添加选项-mcpu=cortex-a7、-mfloat-abi=softfp和-mfpu=neon-vfpv4。
如:
对于A7:
CFLAGS += -mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -fno-aggressive-loop-optimizations
CXXFlAGS +=-mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -fno-aggressive-loop-optimizations
其中CXXFlAGS中的XX根据用户Makefile中所使用宏的具体名称来确定,e.g:CPPFLAGS。

Hi3516EV300 U-boot tftp使用

服务端:/etc/xinetd.d/tftp
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = leon
server = /usr/sbin/in.tftpd
server_args = -s /home/leon/Workspace/Hi3516EV200_SDK_V1.0.0.2/osdrv/pub/hi3516ev300_spi_image_glibc
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}

uboot env 如下:

arch=arm
baudrate=115200
board=hi3516ev300
board_name=hi3516ev300
bootargs=mem=64M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 rw mtdparts=hi_sfc:1M(boot),4M(kernel),11M(rootfs)
bootcmd=sf probe 0;sf read 0x42000000 0x100000 0x400000;bootm 0x42000000
bootdelay=2
cpu=armv7
ethact=eth0
ethaddr=00:01:02:11:88:91
ipaddr=192.168.8.54
serverip=192.168.8.200
soc=hi3516ev300
stderr=serial
stdin=serial
stdout=serial
vendor=hisilicon
verify=n

更新u-boot
tftp 0x42000000 u-boot-hi3516ev300.bin
sf probe 0 /*探测并初始化SPI-Nor flash*/
sf erase 0x000000 0x100000 /*擦除 1M大小*/
sf write 0x42000000 0x0 0x100000 /*从内存写入SPI-Nor Flash*/

更新内核镜像
tftp 0x42000000 uImage_hi3516ev300
sf probe 0 /*探测并初始化SPI-Nor flash*/
sf erase 0x100000 0x400000 /*擦除 4M大小*/
sf write 0x42000000 0x100000 0x400000 /*从内存写入SPI-Nor Flash*/

更新文件系统镜像
tftp 0x42000000 rootfs_hi3516ev300_64k.jffs2
sf probe 0 /*探测并初始化SPI-Nor flash*/
sf erase 0x500000 0xB00000 /*擦除 11M大小*/
sf write 0x42000000 0x500000 0x500000 /*从内存写入SPI-Nor Flash*/

整体更新:
tftp 0x42000000 hisi_flash.bin
sf probe 0 /*探测并初始化SPI-Nor flash*/
sf erase 0x000000 0x1000000 /*擦除 16M大小*/
sf write 0x42000000 0x000000 0x1000000 /*从内存写入SPI-Nor Flash*/

UDHCPC 获取IP并设置到系统

调用udhcpc可以正常获取到ip地址,但使用ifconfig eth0 命令查看不到ip地址和网关,原因是udcpc获取到ip地址,但没有设置到系统内。其实udhcp有这个功能,我们只需要一个脚本放到对应的位置,这样获取到ip后自动执行脚本即可完成设置。
脚本可以从busybox源码目录中获取,比如\busybox-1.1.2\examples\udhcp\simple.script
其内容如下:

#!/bin/sh
# udhcpc script edited by Tim Riker

RESOLV_CONF=”/etc/resolv.conf”

[ -n “$1” ] || { echo “Error: should be called from udhcpc”; exit 1; }

NETMASK=””
[ -n “$subnet” ] && NETMASK=”netmask $subnet”
BROADCAST=”broadcast +”
[ -n “$broadcast” ] && BROADCAST=”broadcast $broadcast”

case “$1” in
deconfig)
echo “Setting IP address 0.0.0.0 on $interface”
ifconfig $interface 0.0.0.0
;;

renew|bound)
echo “Setting IP address $ip on $interface”
ifconfig $interface $ip $NETMASK $BROADCAST

if [ -n “$router” ] ; then
echo “Deleting routers”
while route del default gw 0.0.0.0 dev $interface ; do
:
done

metric=0
for i in $router ; do
echo “Adding router $i”
route add default gw $i dev $interface metric $metric
: $(( metric += 1 ))
done
fi

echo “Recreating $RESOLV_CONF”
# If the file is a symlink somewhere (like /etc/resolv.conf
# pointing to /run/resolv.conf), make sure things work.
realconf=$(readlink -f “$RESOLV_CONF” 2>/dev/null || echo “$RESOLV_CONF”)
tmpfile=”$realconf-$$”
> “$tmpfile”
[ -n “$domain” ] && echo “search $domain” >> “$tmpfile”
for i in $dns ; do
echo ” Adding DNS server $i”
echo “nameserver $i” >> “$tmpfile”
done
mv “$tmpfile” “$realconf”
;;
esac

exit 0

将文件放到目标板/usr/share/udhcpc/目录下,并命名为default.script即可。

mkdir /usr/share/udhcpc/
touch /usr/share/udhcpc/default.script
chmod +x /usr/share/udhcpc/default.script
vi /usr/share/udhcpc/default.script