海思笔记
第一章、海思hi3518e的底层
所使用的的cpu是海思HI3518E V200
1.1、hi3518e开发板的运行过程
通过串口转接线(不接电源线,txd接rxd,rxd接txd,地线接地线)连接上电脑,接网线。通过SecureCRT挂载到ubuntu16.0403中的/aston/rootfs。在SecureCRT的cmdline中./sample_venc进入运行模式。
设置windows的网络ip(192.168.1.20),让虚拟机linux、windows和海思开发板中设置的网络(192.168.1.10)三者保持同网段(192.168.1.1)。
关闭windows中的防火墙,打开vlc软件,在媒体中点打开网络串流,输入rtsp://192.168.1.10:554/stream_chn0.h264 在下面的选项(缓冲)选300ms。
1.2、视频的产生整个流程
sensor可以看成时光电传感器,镜头把光折射后缩小(大范围的光转小范围),光照射到sensor,sensor把光信号转成模拟电信号。模数转换出来。
图像处理ISP(image signal processing),处理曝光等等。
内置DSP进行视频编码压缩,编码和压缩是同个意思。h.264/h.265压缩算法,运算。所以hi3518e的SoC的cpu为arm+dsp。
视频流传输:网络传输、http/rtsp等。
接收端有两个处理方法:
视频存储或者视频回放。
视频存储:打包成MP4等格式存储。
视频回放:解码+播放。
mpp文件夹 视频编码
ko后缀文件,海思官方提供的驱动
extdrv外部驱动,sensor驱动
1.3、海思SDK
海思hi3518e的bsp在osdrv中的opensource文件夹中。
编译完后,uboot、kernel、jffs2的镜像在pub目录下。
在交叉编译工具链的选择:300和400。glibc库是gcc中最完整的库。uclibc是精简了glibc库。我们选择了uclibc库的arm-hisiv300-linux。安装后出现下列问题:
第一是sh脚本的链接文件有问题,本来是链接与dash的,需要换成bash。
第二是工具链是32位的,而我们的ubuntu系统是64位的,我们需要添加软件兼容包。
参考资料:
http://blog.csdn.net/ma57457/article/details/68923623
http://www.cnblogs.com/leaven/p/5084902.html
sudoaptitude install lib32zl
sudoaptitude install lib32stdc++6-4.8-dbg
安装完这个两个包后,加上先前先.bashrc添加的PATH路径,即可编译osdrv。
在编译整个osdrv的时候出现的问题有:
第一、找不到mkimage,解决方法:把mkimage复制到一个路径(在PATH环境变量中指定的位置)。
第二、是找不到zlib,解决方法:整个osdrv是提供了zlib的,只是因为已经编译了zlib没有部署它。所以要做的就是部署zlib,把osdrv/tools/pc/zlib/tmp/lib下的全部库复制到osdrv/tools/pc/jffs2_tool/tmp/lib/,
和把osdrv/tools/pc/zlib/tmp/zlib-1.2.7下的zlib.h, zconf.h复制到osdrv/tools/pc/
jffs2_tool/tmp/include/;在次编译就可以完成jffs2的根文件系统。
第三、
是因为我们使用的ubuntu的版本太高,海思的SDK中使用的mtd-utils的版本过低导致的问题。
解决方法参考这片博客中http://blog.csdn.net/mtbiao/article/details/77052659
方法2:修改操作系统头文件/usr/include/netdb.h,将此宏__USE_XOPEN2K注释,如下图(注意#ifdef与#endif是一一对应的)。这个宏不止一个。
将Makefile中的hipctools下面除了jffs2编译和复制的内容外的全部去除,这样保证了不会出现很多错误。
至此,我们就可以编译得到u-boot和kernel,jffs2的rootfs。分别名为:
这些制作完毕后,需要进行烧录。uboot作为第一个烧录需要使用下列两种方法中的一种:
第一使用烧录工具对spi flash进行烧录。
第二使用海思官方提供的烧录工具进行烧录。
我选择的分区表:
BootLoader 1M 0x0-0x00100000
kernel 3M 0x00100000-0x00400000
rootfs 12M 0x00400000-0x01000000
相关烧录命令:
前提:DDR地址为0x80000000-0x83FFFFFF
1、tftp更新并重新烧录uboot的命令序列:
mw.b 0x82000000 ff 0x100000 //擦除ddr中以0x82000000起,1M大小
tftp0x82000000 u-boot-hi3518ev200.bin //tftp下载uboot
sfprobe 0 //选择spi flash (数字是表示第几块flash)
sferase 0x0 0x100000 //擦除spi flash中以0x0起,1M大小
sfwrite 0x82000000 0x0 0x100000 // 从ddr中0x82000000烧录到flash
2、tftp更新并重新烧录kernel的命令序列:
mw.b 0x82000000 ff 0x300000
tftp0x82000000 uImage_hi3518ev200
sfprobe 0
sferase 0x100000 0x300000 //0x100000起始位置,0x300000大小
sfwrite 0x82000000 0x100000 0x300000
tftp更新并重新烧录rootfs的命令序列:
mw.b 0x82000000ff 0xc00000
tftp0x82000000 rootfs_uclibc_64k.jffs2
sf probe 0
sferase 0x400000 0xc00000
sf write0x82000000 0x400000 0xc00000
注:sf erase 0x400000 0xc00000 这句擦除flash的命令,实质是向flash中写ff。mw.b 0x820000000 ff 0xc00000是把ddr中12M空间写为ff。所以要保证flash和ddr中的擦除大小要一致,不然会在flash中校验出现错误。
设置bootcmd和bootargs:
set bootcmd ‘sfprobe 0; sf read 0x82000000 0x100000 0x300000; bootm 0x82000000’
setenvbootargs 'mem=32M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2mtdparts=hi_sfc:1M(boot),3M(kernel),12M(rootfs)'
注意:
root=/dev/mtdblock2代表我们rootfs在第三个分区
mem=32M,我们的内存是64M,而分配给kernel的只有32M,剩下的是给海思mpp(专门用于处理视频相关的)使用。
1.4、部署开发环境
1.4.1、mpp
由海思官方以.ko(模块)和lib中的静动态库。
ko的使用,在ko文件夹中有一个load3518e,执行:
./load3518e-i -sensor ar0130 -osmem 32 -total 64
传参分别指定了sensor,osmem(linux kernel)的大小,total整体的大小。
1.4.2、kernel设置网络并挂载nfs
在etc/profile中写入:
ifconfig lo 127.0.0.1
ifconfigeth0 192.168.1.10
保存。
在cmdline下输入下列命令挂载nfs服务器:
mount-t nfs -o nolock 192.168.1.141:/home/aston/rootfs/mnt
其中/home/aston/rootfs 是ubuntu中的地址
/mnt是开发板中rootfs的地址
小总结:在profile中要去添加做的是分别配置网络,安装ko模块,以及挂载nfs服务器。
再完成了这些操作后,可以重新制作一份rootfs,命令:
osdrv/pub/bin/pc/mkfs.jffs2-d osdrv/pub/rootfs_uclibc -l -e 0x10000 -o
osdrv/pub/rootfs_uclibc_64k.jffs2
命令中使用的工具是相对路径。
第二章、mmp sample
1、基本知识
1.1、sensor和图片的知识
颜色的三个关键:亮度、色度、饱和度
sensor的工作原理:
光照在成像物体被反射->镜头汇聚->sensor光电转换->ADC模数转换成rawRGB
rawRGB通过特点的算法获得RGB。
rawRGB是sensor这种硬件的特点,因为不能通过sensor获取整个RGB数值,所以通过每个像素点为下表:
R |
G |
B |
R |
G |
B |
R |
G |
B |
R |
G |
B |
R |
G |
B |
R |
G |
B |
R |
G |
B |
R |
G |
B |
R |
G |
B |
R |
G |
B |
R |
G |
B |
R |
G |
然后通过局部的计算获得一个RGB数据。
图像处理:压缩、修整、显示等这些是rawRBG进来后的事情(我认为是在rawRGB转RGB前),也就是软件处理的内容。
观看的影响: