串口文件传输协议

所有数据以小端模式传输,字符串为UTF8编码

报文格式定义
命令 长度 数据 校验
uint8 uint8 uint16 uint8[] uint16
0xAA 见命令定义 后面数据段的长度0~65535 数据内容,字节数组 标准modbusCRC16校验
基础命令定义
命令名称 命令值 数据内容 数据长度 响应命令 响应内容 响应长度 备注
握手 0x01 0xAA 0xBB 0xCC 0xDD 固定长度4 0x81 0xAA 0xBB 0xCC 0xDD 固定长度4
时间同步 0x10 unix时间戳(uint32) 固定长度4 0x90 成功返回1,失败返回0(uint8) 固定长度1 此命令一般由主机每秒发一次,可以回复,也可以不回复
文件命令定义
命令名称 命令值 数据内容 数据长度 响应命令 响应内容 响应长度 备注
打开文件 0x02 完整的文件路径,字符串形式 字符串长度 0x82 文件描述符,sint32,<0表示打开失败 固定长度4 以读写方式打开文件,文件不存在则返回-1
读取文件 0x03 文件描述符(sint32)+读取位置(uint32)+读取数据最大长度(uint16) 固定长度10 0x83 实际数据长度(uint16)+数据内容 2+数据长度
创建文件 0x04 完整的文件路径,字符串形式 字符串长度 0x84 文件描述符,sint32,<0表示创建失败 固定长度4 文件存在则以读方式直接打开,不存在则创建
写入文件 0x05 文件描述符(sint32)+写入数据长度(uint16)+写入数据 6+数据长度 0x85 实际写入数据长度(uint16) 固定长度2 以追加方式写入
删除文件 0x06 完整的文件路径,字符串形式 字符串长度 0x86 uint8,1代表成功,0代表失败 固定长度1
关闭文件 0x07 文件描述符(sint32) 固定长度4 0x87 uint8,1代表成功,0代表失败 固定长度1
获取文件信息 0x08 完整的文件路径,字符串形式 字符串长度 0x88 文件是否可用(uint8)+文件大小(uint32)+创建时间戳(uint32)+修改时间戳(uint32) 固定长度13 如果文件不可用,则其他信息无效
控制命令定义
命令名称 命令值 数据内容 数据长度 响应命令 响应内容 响应长度 备注
通道触发指令 0x11 通道(uint8)+触发序号(uint32),每位代表一个通道 固定长度1 0x91 返回(uint8),成功相应通道置1,失败为置0 固定长度1 此命令必须回复,执行失败则主机会重发
反馈事件上报 0x12 事件个数(uint8)+[触发序号(uint32)+反馈通道(uint8)+反馈时间(uint32)] 1+事件个数*5 0x92 成功返回1,失败返回0(uint8) 固定长度1 此命令必须回复,执行失败需要重发
云台控制 0x13 待定 待定 0x93 待定 待定 此命令必须回复,执行失败需要重发

linux nfs

服务端:
安装
sudo apt-get install nfs-kernel-server # 安装 NFS服务器端
sudo apt-get install nfs-common # 安装 NFS客户端

修改
sudo vim /etc/exports
如下:
/media/server_disk/nfs *(rw,sync,no_root_squash,no_subtree_check)

客户端:
mount -t nfs 192.168.8.200:/media/server_disk/nfs /mnt/nfs

由于ubuntu上mount -tcifs 必须使用sudo,挂载后目录属于root,其他用户无写入权限
可以挂载指定用户来解决:
sudo mount -t cifs //192.168.8.200/OfficeServer ./OfficeServer -o username=leon,password=123456,uid=1000,gid=1000

HI3516EV300 开启串口1和串口2

参考:https://blog.csdn.net/sbddbfm/article/details/100883650
SDK默认只打开了uart0,但我实际上要用三个串口。
ls /dev/ttyAMA*可以看到:
/dev/ttyAMA0 /dev/ttyAMA1
看实际只有ttyAMA0可以用,也就是上电默认的终端
使用echo测试:
~ # echo 123 > /dev/ttyAMA0
123

~ # echo 123 > /dev/ttyAMA1
can not create file:/dev/ttyAMA1

首先看内核配置文件arch/arm/boot/dts/hi3516ev300.dtsi:
uart0: uart@12040000 {
compatible = “arm,pl011”, “arm,primecell”;
reg = <0x12040000 0x1000>;
interrupts = <0 7 4>;
clocks = <&clock HI3516EV300_UART0_CLK>;
clock-names = “apb_pclk”;
status = “disabled”;
};

uart1: uart@12041000 {
compatible = “arm,pl011”, “arm,primecell”;
reg = <0x12041000 0x1000>;
interrupts = <0 8 4>;
clocks = <&clock HI3516EV300_UART1_CLK>;
clock-names = “apb_pclk”;
status = “disabled”;
};

uart2: uart@12042000 {
compatible = “arm,pl011”, “arm,primecell”;
reg = <0x12042000 0x1000>;
interrupts = <0 9 4>;
clocks = <&clock HI3516EV300_UART2_CLK>;
clock-names = “apb_pclk”;
status = “disabled”;
};
可见是有个串口的,但都是disable的状态,其实起作用的是另一个文件: arch/arm/boot/dts/hi3516ev300-demb.dts:
&uart0 {
status = “okay”;
};
所以再copy两份就可以了,在下面添加:
&uart1 {
status = “okay”;
};
&uart2 {
status = “okay”;
};
重新编译内核,下载到目标板,启动后ls /dev/ttyAMA*可以看到:
/dev/ttyAMA0 /dev/ttyAMA1 /dev/ttyAMA2
echo测试都可以成功,但与实际串口相连的设备没有收到数据,查资料得知,还得配置引脚复用寄存器。

使用hisi工具btools,具体使用方法可参考另一文章:

我的板子串口发送接在E1脚
查文档如下:

默认值为0x1E00,应该修改为0x1E04
使用himd.l读取寄存器的值:
~ # himd.l 0x120C0014
*** Board tools : ver0.0.1_20121120 ***
[debug]: {source/utils/cmdshell.c:168}cmdstr:himd.l
====dump memory 0x120C0014====
0000: 00001e00 00001d00 00001400 00001d00
0010: 00000000 00000000 00000000 00000000
0020: 00000000 00000000 00000000 00000000
0030: 00000000 00000000 00000000 00000000
0040: 00000000 00000000 00000000 00000000
0050: 00000000 00000000 00000000 00000000
0060: 00000000 00000000 00000000 00000000
0070: 00000000 00000000 00000000 00000000
0080: 00000000 00000000 00000000 00000000
0090: 00000000 00000000 00000000 00000000
00a0: 00000000 00000000 00000000 00000000
00b0: 00000000 00000000 00000000 00000000
00c0: 00000000 00000000 00000000 00000000
00d0: 00000000 00000000 00000000 00000000
00e0: 00000000 00000000 00000000 00000000
00f0: 00000000 00000000 00000000 00000000
[END]
寄存器的值还是默认值,修改它:
~ # himm 0x120C0014 0x00001e04
*** Board tools : ver0.0.1_20121120 ***
[debug]: {source/utils/cmdshell.c:168}cmdstr:himm
0x120C0014: 0x00001E00 –> 0x00001E04
[END]

再次echo测试:
~ # echo 123 > /dev/ttyAMA2
不成功,为什么呢?收发接反了!!!再次尝试,乱码,波特率不对,初始波特率是9600

UART1&UART2引脚复用寄存器
信号 UART1_TXD UART1_RXD UART2_TXD UART2_RXD
引脚 F17 F16 E1 D2
寄存器地址 0x100C000C 0x100C0010 0x120C0014 0x120C0010
寄存器初始值 0x1000 0x1000 0x1E00 0x1E00
寄存器设定值 0x1002 0x1002 0x1E04 0x1E04

hisi btools

1、编译
进入Hi3516EV200_SDK_V1.0.0.2/osdrv/tools/board/reg-tools-1.0.0
修改Makefile中的目标芯片的目标编译器,我的是3516EV300,对应编译器是himix200
ifndef CHIP
CHIP = hi3516ev300
endif

ifndef OSDRV_CROSS
OSDRV_CROSS ?= arm-himix200-linux
endif
保存直接make即可在bin文件夹下生成btools文件和几个软件连接
2、拷贝
把生成的btools文件拷贝到目标板,我放在sbin目录下了
3、软连接
以下是手工生成,太笨了,搞完才发现,可以自动
~ # ln -s /sbin/btools /sbin/himc
~ # ln -s /sbin/btools /sbin/himd
~ # ln -s /sbin/btools /sbin/himd.l
~ # ln -s /sbin/btools /sbin/himm
~ # ln -s /sbin/btools /sbin/hivd
~ # ln -s /sbin/btools /sbin/himdb
~ # ln -s /sbin/btools /sbin/hiddrs
~ # ln -s /sbin/btools /sbin/i2c_read
~ # ln -s /sbin/btools /sbin/i2c_write
~ # ln -s /sbin/btools /sbin/ssp_read
~ # ln -s /sbin/btools /sbin/ssp_write
自动生成命令:
进入/sbin目录,执行:btools -i
4、使用
himc : memory clear
himd : memory display (8bit)
himd.l : memory display (32bit)
himm : memory modify
hivd : video dump
himdb : video dump
hiddrs : ddr statistic
i2c_read : i2c device read
i2c_write : i2c device read
ssp_read : ssp device read
ssp_write : ssp device read

以下是修改E1引脚的复用功能为UART2_TXD
himd.l 0x120C0014
*** Board tools : ver0.0.1_20121120 ***
[debug]: {source/utils/cmdshell.c:168}cmdstr:himd.l
====dump memory 0x120C0014====
0000: 00001e00 00001d00 00001400 00001d00
0010: 00000000 00000000 00000000 00000000
0020: 00000000 00000000 00000000 00000000
0030: 00000000 00000000 00000000 00000000
0040: 00000000 00000000 00000000 00000000
0050: 00000000 00000000 00000000 00000000
0060: 00000000 00000000 00000000 00000000
0070: 00000000 00000000 00000000 00000000
0080: 00000000 00000000 00000000 00000000
0090: 00000000 00000000 00000000 00000000
00a0: 00000000 00000000 00000000 00000000
00b0: 00000000 00000000 00000000 00000000
00c0: 00000000 00000000 00000000 00000000
00d0: 00000000 00000000 00000000 00000000
00e0: 00000000 00000000 00000000 00000000
00f0: 00000000 00000000 00000000 00000000
[END]

himm 0x120C0014 0x00001e04
*** Board tools : ver0.0.1_20121120 ***
[debug]: {source/utils/cmdshell.c:168}cmdstr:himm
0x120C0014: 0x00001E00 –> 0x00001E04
[END]

HI3516EV300编译环境搭建(三)

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

待进入boot源代码目录后,执行以下操作
make ARCH=arm CROSS_COMPILE=arm-himix100-linux- hi3516ev300_defconfig
(emmc启动时执行如下操作:make ARCH=arm CROSS_COMPILE=arm-himix200-linux- hi3516ev300_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-himix200-linux- u-boot-z.bin

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

HI3516EV300编译环境搭建(四)

单独编译内核

本文档简要说明将内核的补丁打到v4.9.37的linux kernel上。

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。 进入内核根目录 编译: 步骤 1. 手动拷贝.config 文件: cp arch/arm/configs/hi3516ev300_xxx_defconfig .config 步骤 2. 用户通过“make menuconfig” 进行内核配置: make ARCH=arm CROSS_COMPILE=arm-himix200-linux- menuconfig 步骤 3. 选择需要的模块。 步骤 4. 选择完毕后,保存并退出。 步骤 5. 编译内核,生成uImage镜像 make ARCH=arm CROSS_COMPILE=arm-himix200-linux- uImage -j20 此命令可能需要几分钟时间,编译完成,生成文件:arch/arm/boot/uImage,此文件可以烧写到目标板内核分区加载执行

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