Hi3716C平台SDK安装以及研究
(2011-01-18 13:20:36)
转载▼
分类:嵌入式Linux
标签:
hi3716
linux
gc800
作者:Sam (甄峰) sam_code@https://www.doczj.com/doc/e617236344.html,
因为之前使用过Hi3110平台,觉得海思SDK安装不是特别合乎自己的习惯,所以这次对其安装做研究并修改其行为。
0.Hi3716平台各芯片介绍:
Hi3716M不支持GPU 功能,Hi3716C支持GPU 功能,Hi3716H性能是Hi3716C中的一半。
GPU(Graphics Processing Unit)集成专有的3D 加速引擎,提供OpenGL
ES2.0/1.1/1.0、OpenVG1.1/1.0 标准API 接口。具有超强的运算性能:
400M pixels/s 的像素处理能力。
400M pixels/s 的纹理处理能力。
200M vertex/s 的顶点处理能力。
40M triangles/s 的几何处理能力(平均)。
1. 海思server_install行为:
海思文档中,要求首先以root权限运行server_install
server_install的行为如下:
察看SDK toolchain目录下3个交叉编译器是否存在,如果存在,则进入其中并运行安装和设置程序。
if [ -d ./source/osdrv/toolchains/gcc-3.4.3-csl-uClibc-0.9.30 ] //如果目录存在
then
cd ./source/osdrv/toolchains/gcc-3.4.3-csl-uClibc-0.9.30 //进入之
chmod 777 cross.install //修改权限
./cross.install //运行之
cd -
fi
依次运行3个交叉编译器。
2. cross.install 行为:
if [ -z "$1" ] //如果参数为空
then
echo "CROSS_COMPILER_PATH=$BIN_DIR"
if [ -n "`grep 201001201418 $TOOL_DIR/version`" ] //如果指定安装目录中version中没有特定的字符串(toolchain 版本信息),则表明此toolchain没有安装或者是旧版本。否则,即为此toolchain已经安装。
then
echo "Cross Tools has been installed yet!" >&2
exit 0 //已经安装,则退出安装
fi
mkdir -pv $TOP_DIR // 创建toolchain目录
[ $? != 0 ] && exit 1 //如果返回错误,则退出
echo "Delete exist directory..." >&2
rm $TOOL_DIR -rf //删除目录下所有东西
[ $? != 0 ] && exit 1 //错误则返回
echo "Extract cross tools ..." >&2
tar -xjf $TOOLS_PKG -C $TOP_DIR // 把toolchain解压缩到对应目录下
[ $? != 0 ] && exit 1
//将toolchain/bin目录加入/etc/profile中的PATH中。
if [ -z "`grep "$BIN_DIR" < /etc/profile`" ] ; then
echo "export path $BIN_DIR" >&2 cat >> /etc/profile << EOF
# `date`
# Hisilicon Linux, Cross-Toolchain
PATH
export
PATH="$BIN_DIR:\$PATH"
#
EOF
[ $? != 0 ] && exit 1
else
echo "skip export toolchains path" >&2 fi
exit 0
其实这最后一步,将export PATH=$PATH:..... 加入/etc/profile
就是Sam所不能接受的,Sam通常在同一台Linux上编译超过10种平台的程序,所用toolchain更是庞杂。所以不能接受这种一个人生病,大家全吃药的模式。(因为每个终端起来之前,都会运行/etc/profile)
Sam的做法是:shell保持一个纯净的PATH, LD_LIBRARY_PATH等。需要在本终端设置某toolchain的toolchain,再使用setenv来设置。
SDK的编译:
#make build
修改config file.
#make linux_clean
#make linux
二:烧入和设置:
2.1. 烧入前的准备:
重新启动后立刻按空格进入bootloader 设置状态:
hisilicon #
察看设置:
hisilicon # printenv
设置:
setenv serverip 10.0.0.39
setenv ipaddr 10.0.0.20
setenv netmask 255.255.0.0
保存:
saveenv
察看网络是否可用:
hisilicon # ping 10.0.0.39
Hisilicon ETH net controler
MAC: 9E-1C-54-AC-E0-1C
UP_PORT : phy status change : LINK=DOWN : DUPLEX=FULL : SPEED=100M
UP_PORT : phy status change : LINK=UP : DUPLEX=FULL : SPEED=100M
host 10.0.0.39 is alive
2.2: 将Kernel和rootfs保存如tftpboot
#cd pub/image
#cp hi_kernel.bin /tftpboot/
#cp hi_kernel.bin /tftpboot/
2.3:烧入Kernel:
mw.b 82000000 ff 300000 //将ddr写为0xff,写3M
tftp 82000000 hi_kernel.bin //下载kernel到ddr
nand erase 200000 300000 //擦写0x100000后面的3M flash空间
nand write 82000000 200000 300000 //把ddr中的kernel写入nand flash,写入3M的大小2.4: 烧入rootfs:
mw.b 82000000 ff a00000 //将ddr写为0xff, a000000 根据文件系统镜像大小可能需要改动,一般应该大于镜像的大小
tftp 82000000 rootbox.yaffs //下载rootbox到ddr
nand erase 500000 //后面不加长度,擦写0x500000后面的所有flash空间
nand write.yaffs 82000000 500000 xx //把ddr中的rootbox写入nand flash, xx是写入大小(必须是rootbox.yaffs的大小,一个字节也不能错),
Sam: 因为Bytes transferred = 23358720 (1646d00 hex)
nand write.yaffs 82000000 500000 1646d00
2.5:设置启动参数:
setenv bootcmd 'nand read 0x82000000 0x200000 0x300000;bootm 0x82000000'
setenv bootargs 'mem=96M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=yaffs2 mtdparts=hinand:5M(boot),60M(rootfs),-(others)'
saveenv
三. Bluetooth modules编译时遇到的问题:
使用正常手段编译了bluetooth modules.
insmod时,l2cap遇到问题,说是crc16没有提供符号。
于是Sam在:
make menuconfig
Library routines --->CRC16 functions
选中其为modules.
并首先装载之,一切OK.
四:Kernel与应用程序使用不同编译器时出的问题:
这个问题在上次其实已经解决了,但放在这里记录下来:
当时在Hi3560H上,海思提供了多个Toolchain,但在Kernel和应用程序编译时使用不同的编译器。Sam当时心中有些不安,觉得这里会是一个隐患,尤其是Bluetooth 需要使用ioctl 来在应用程序和Kernel之间交互数据。
但在察看具体代码后,觉得问题应该不大,因为几乎所有struct,都定义为
__attribute__((packed)) 。
但奇怪的是,哪怕这样,当应用程序和Kernel使用不同的编译器时,也会出现struct解析出错(有规律的错位)的情况。后来统一编译器后,问题就解决。但Sam还是有些不明白为什么__attribute__((packed)) 后还是会出问题。