Hi3556v200踩坑笔记(3)

Hi3556v200踩坑笔记(3)

学习资料

  1. Hi35XX海思芯片基础使用
  2. 海思3559
  3. Hisi海思
  4. 海思板卡端访问服务器的文件(一)

硬件简介

模块 型号
Sensor imx485
LCD OLP039XGG04-01
EMMC FORESEE_eMMC_NCEMASLD

常用命令

使用命令

关注MPP《HiMPP V4.0 媒体处理软件开发参考》13章 Proc 调试信息说明

进入LiteOS

1
virt-tty a7

摄像头

1
2
3
4
cat proc/umap/mipi_rx
cat /proc/umap/vi
cat /proc/umap/vpss
cat /proc/umap/venc

LCD

1
2
3
4
#i2c_write <i2c_num> <device_addr> <reg_addr> <value>
i2c_write 0x02 0xA9 0x01 0x3d
#i2c_read <i2c_num> <device_addr> <reg_addr> <end_reg_addr> <reg_width> <data_width> <reg_step>
i2c_read 0x02 0xA9 0xCE 0xCE 0x1 0x1

显示绿色棋盘格

1
2
3
4
5
6
7
8
9
#Linux
himm 0x1144D300 0x0A000000
himd.l 0x1144D300
himm 0x1144D304 0x1
himm 0x112700A0 0x0
himm 0x112700B4 0x1
#color bar
himm 0x1144D000 0xc0000011
himm 0x1144D000 0x80000011

屏幕亮度

1
2
i2c_read 0x02 0xA9 0xCE 0xCE 0x1 0x1 #读取PWM 默认0x64 0x00 最亮
i2c_write 0x02 0xA9 0xCE 0x00
1
2
3
4
//lin
HI_S32 HI_HAL_SCREEN_SetLuma(HI_HAL_SCREEN_IDX_E enScreenIndex, HI_U32 u32Luma);//亮度 0最亮 255最暗 海思开机时会设置为0
HI_S32 HI_HAL_SCREEN_SetContrast(HI_HAL_SCREEN_IDX_E enScreenIndex, HI_U32 u32Contrast)//对比度 0-255

wifi

1
2
3
4
#查看wifi配置信息
cat $(find . -name hostapd.conf)
#查看网卡信息
ifconfig

GPIO

https://blog.csdn.net/qq_21794157/article/details/122494056

以I2C_SDA W15为例,配置为GPIO4_3

引脚复用寄存器如图 《Hi3556V200_PINOUT_CN》

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#W15 SDA GPIO4_3
himm 0x114f0078 0x400 #恢复初始
himm 0x114f0078 0x600 #设置引脚复用寄存器 500为上拉 600为下拉
echo 35 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio35/direction
echo 0 > /sys/class/gpio/gpio35/value #低电平
echo 1 > /sys/class/gpio/gpio35/value #高电平
#U15 SCL GPIO4_2
himm 0x114f0074 0x400 #恢复初始
himm 0x114f0074 0x600 #设置引脚复用寄存器 500为上拉 600为下拉
echo 34 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio34/direction
echo 0 > /sys/class/gpio/gpio34/value #低电平
echo 1 > /sys/class/gpio/gpio34/value #高电平
#M19 AD_Key GPIO10_4
himm 0x111f0034 0x400 #恢复初始 431
himm 0x111f0034 0x601 #设置引脚复用寄存器 下拉
echo 84 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio84/direction
cat /sys/class/gpio/gpio84/value
#himm 0x111f0034 0x430

PQTools

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#usb 连接  192.168.2.10 这个ip是自己配置的
app/komod/usb2net_load.sh;ifconfig usb0 192.168.2.10 netmask 255.255.255.0;route add default gw 192.168.2.1

#WIFI 连接192.168.0.1
cp -rf /app/bin/libs/libmpi.so /lib/
cp -rf /app/bin/libs/libsecurec.so /lib/

ifconfig lo up;
wget --spider -q "http://192.168.2.10/cgi-bin/hisnet/setpqdebug.cgi?&-pqdebug=1"
wget --spider -q "http://192.168.2.10/cgi-bin/hisnet/setpqdebug.cgi?&-pqdebug=0"

cp -rf /app/bin/libs/libmpi.so /lib/
cp -rf /app/bin/libs/libsecurec.so /lib/
ifconfig lo up;
wget --spider -q "http://192.168.0.1/cgi-bin/hisnet/setpqdebug.cgi?&-pqdebug=1"

#rtsp地址
rtsp://IP:554/livestream/1
rtsp://192.168.0.1:554/livestream/1

开发环境

SDK安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#海思包安装命令
sudo apt-get install -y build-essential
sudo apt-get install u-boot-tools
sudo apt-get install zlib1g-dev liblzo2-dev uuid-dev pkg-config
sudo apt-get install make libc6 lib32z1 lib32stdc++6 zlib1g-dev libncurses5-dev ncurses-term libncursesw5-dev g++ u-boot-tools texinfo texlive gawk curl upx pngquant
sudo apt-get install make libc6:i386 lib32z1 lib32stdc++6 zlib1g-dev libncurses5-dev ncurses-term libncursesw5-dev g++ u-boot-tools:i386 texinfo texlive gawk libssl-dev openssl bc
#海思手册没有的包安装命令
sudo apt-get install bison flex dos2unix aptitude libpcap-dev gperf libuuid1:i386 u-boot-tools libpam0g-dev lib32z1-dev
sudo aptitude install libtool
##工具链安装命令 安装完重启!!!
su
source ./arm-himix100-linux.install
#bash环境变量
sudo gedit /etc/profile
export PATH="/opt/hisi-linux/x86-arm/arm-himix100-linux/bin:$PATH"
export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/lib/x86_64-linuxgnu/pkgconfig"
#其他
sudo chmod -R 777 ./
chown -R user:user ./
chown -R pc:pc ./

Linux开发系统还需要nfs和ssh便于调试

编译内核

1
2
3
4
#裁剪Linux内核
cp ./arch/arm/configs/hi3559v200_amp_defconfig .config #如果make all过,跳过该步
make ARCH=arm CROSS_COMPILE=arm-himix100-linux- menuconfig
make ARCH=arm CROSS_COMPILE=arm-himix100-linux- uImage -j 20

开启NFS 内核配置

首先make all,然后进入内核目录修改。

1
2
make ARCH=arm CROSS_COMPILE=arm-himix100-linux- menuconfig
make ARCH=arm CROSS_COMPILE=arm-himix100-linux- uImage -j 20

使用

1
cat /proc/filesystems

查看是否有nfs,有则配置成功

OpenSSH配置

相关资料

  1. openssh移植及使用
  2. 移植openssh到arm-linux
  3. HI3516DV300笔记(三)安装SSH和SFTP
  4. 全志A33 SSH移植配置(已成功)

命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#下载 编译 
wget https://mirrors.tuna.tsinghua.edu.cn/pub/OpenBSD/OpenSSH/portable/openssh-6.1p1.tar.gz --no-check-certificate
wget https://jaist.dl.sourceforge.net/project/libpng/zlib/1.2.8/zlib-1.2.8.tar.gz --no-check-certificate
wget https://archive.fastgit.org/openssl/openssl/archive/refs/tags/OpenSSL_1_0_1t.tar.gz --no-check-certificate

tar -zxvf zlib-1.2.11.tar.gz;
tar -zxvf OpenSSL_1_0_1t.tar.gz;
tar -zxvf openssh-6.1p1.tar.gz;

cd ./openssl-OpenSSL_1_0_1t
./Configure --prefix=$PWD/_install os/compiler:arm-himix100-linux-gcc
make -j20
make install

cd ..
cd ./zlib-1.2.11
export CC=/opt/hisi-linux/x86-arm/arm-himix100-linux/bin/arm-himix100-linux-gcc
./configure --prefix=$PWD/_install --static
make -j20
make install

cd ..
cd ./openssh-6.1p1
#主要--prefix= 后面跟的路径是在板端的绝对路径
export OPENSSHINSTALLPATH=/
#export OPENSSHINSTALLPATH=/mnt/openssh
./configure --host=arm-himix100-linux --prefix=$OPENSSHINSTALLPATH --with-zlib=$PWD/../zlib-1.2.11/_install --with-ssl-dir=$PWD/../openssl-OpenSSL_1_0_1t/_install --with-libs --disable-etc-default-login --disable-strip CC=arm-himix100-linux-gcc AR=arm-himix100-linux-ar
make -j20

#打包
#install & pack

#cd ./openssh_build

export TOPPATH=$PWD/../openssh_build
export ROOTPATH=$TOPPATH/rootfs
mkdir $ROOTPATH
mkdir -p $ROOTPATH/bin
mkdir -p $ROOTPATH/sbin
mkdir -p $ROOTPATH/usr/local/openssh
mkdir -p $ROOTPATH/usr/local/libexec
mkdir -p $ROOTPATH/usr/local/etc
mkdir -p $ROOTPATH/usr/local/openssh/etc
mkdir -p $ROOTPATH/usr/local/openssh/bin

cp scp sftp ssh ssh-add ssh-agent ssh-keygen ssh-keyscan $ROOTPATH/usr/local/openssh/bin
cp sshd_config ssh_config $ROOTPATH/usr/local/openssh/etc
cp sshd $ROOTPATH/sbin
cp sftp-server ssh-keysign $ROOTPATH/usr/local/libexec
cd $ROOTPATH/bin
ln -s /usr/local/openssh/bin/scp
ln -s /usr/local/openssh/bin/sftp
ln -s /usr/local/openssh/bin/ssh
ln -s /usr/local/openssh/bin/ssh-add
ln -s /usr/local/openssh/bin/ssh-agent
ln -s /usr/local/openssh/bin/ssh-keygen
ln -s /usr/local/openssh/bin/ssh-keyscan

cd $ROOTPATH
cp $TOPPATH/sshd_config $ROOTPATH/usr/local/openssh/etc
cp $TOPPATH/openssh_install.sh $ROOTPATH
tar -zcvf $TOPPATH/../openssh_build.tar.gz .

###########
# 板端执行
###########
#board openssh_install.sh
tar -zxvf /openssh_build.tar.gz
#mkdir -p /var/run/sshd
#mkdir -p /var/empty
export OPENSSHPATH=/
export MNTPATH=/

#export OPENSSHPATH=/mnt/openssh
#export MNTPATH=/mnt
export SSHKEYGRNPATH=$OPENSSHPATH/usr/local/openssh/bin
mkdir $OPENSSHPATH/etc
cd $OPENSSHPATH/usr/local/etc
$SSHKEYGRNPATH/ssh-keygen -t rsa -f ssh_host_rsa_key -N ""
$SSHKEYGRNPATH/ssh-keygen -t dsa -f ssh_host_dsa_key -N ""
$SSHKEYGRNPATH/ssh-keygen -t ecdsa -f ssh_host_ecdsa_key -N ""
$SSHKEYGRNPATH/ssh-keygen -t dsa -f ssh_host_ed25519_key -N ""
cp $OPENSSHPATH/usr/local/openssh/etc/sshd_config $OPENSSHPATH/etc
cp $OPENSSHPATH/usr/local/openssh/etc/ssh_config $OPENSSHPATH/etc
cp $OPENSSHPATH/usr/local/openssh/etc/ssh_config $OPENSSHPATH/etc
mkdir -p /usr/local/etc
cp $OPENSSHPATH/usr/local/openssh/etc/ssh_config /usr/local/etc
mkdir -p /var/run/sshd
mkdir -p /var/empty
cd /var
chown root.root empty -R
#board start ssh
/sbin/sshd
/mnt/openssh/sbin/sshd

此时文件目录为

压缩包文件结果如下

找到sshd_config修改如下:

1
2
3
4
5
6
7
8
9
10
11
HostKey /usr/local/etc/ssh_host_rsa_key
HostKey /usr/local/etc/ssh_host_dsa_key
HostKey /usr/local/etc/ssh_host_ecdsa_key
PermitRootLogin yes
PasswordAuthentication yes
PermitEmptyPasswords yes

Subsystem sftp internal-sftp

#避免Privilege separation user sshd does not exist
UsePrivilegeSeparation no

ssh通过密钥无密码访问服务器时,尽管密钥配好了,端口服务启动都正常,但是还是ssh还是不能访问。最后发现,是密钥文件的权限问题,一般来说:
对.ssh目录设置700权限
对id_rsa,authorized_keys文件设置600权限
对id_rsa.pub,known_hosts文件设置644权限
所以,权限设置不对的话ssh登陆不上Linux系统

HI3556V200上手

SDK架构

  1. HI3556

​ OS:提供基本的操作系统及基础的外围器件驱动。
MPP:提供媒体采集、处理、编解码功能。
Middleware:基于业务的接口抽象层。
​ Reference:具体的业务实现

  1. HI3516

烧写方式

HI3516DV300额外支持网口烧写;Hi3556只支持串口,USB烧写,两种方式都支持裸烧,实际开发时,采用USB烧写。

USB烧写时,第一次需要做以下步骤:

  1. 合并注册表59V200_win10_usb.reg
  2. 安装HiUSBBurn\InstallDriver.exe

正式烧写步骤

  1. 开发板断电
  2. HiTool工具点击烧写,注意HiTool工具中不是按分区烧写而是**烧写emmc**
  3. 按住Update键后,开发板上电
  4. 控制台出现烧写进度条,按键可以松手

软件开发

文档

  1. MPP 《HiMPP V4.0 媒体处理软件开发参考》
  2. Middleware 《HiMAPI V1.0 媒体处理开发参考》
  3. Middleware 《Camera 中间件 开发参考》
  4. Reference 《HiMobileCam V1.0 参考设计开发指南》
  5. Reference 《HiMobileCam 场景自适应 使用指南》

开发方式

SDK安装

参考《HiMobileCam SDK安装使用说明》,注意有一些软件包文档未说明,实际需要安装

build 目录提供 SDK 的全局编译配置,包括各组件的相对路径和基本配置。

  • configs 目录提供了通过 menuconfig 配置后生成的配置文件。
  • Kconfig 为 SDK menuconfig 的入口配置文件。
  • Makefile 为 SDK 的编译文件,用于编译安装 SDK 工程。
  • osdrv 目录主要提供底层系统原始包,包括 Bootloader、 OS、 Rootfs,关键Driver,工具等。
  • amp 目录提供媒体模块驱动和库 mpp、 操作系统适配组件 osal、芯片及板级驱动drv、双系统核间通信组件 hisyslink。
  • middleware 目录提供了视频录制,文件管理,回放、 GUI, 流传输等典型产品业务组件及组件 sample;同时还提供了对基础音视频功能和数据流封装模块(ndk)。
  • reference 目录在 osdrv、 amp 和 middleware 基础上,提供产品层通用组件、 典型产品形态参考设计, 详细内容可以参见《HiMobileCam V1.0 参考设计开发指南》。
  • pqtool 目录用于存放图像调优工具,供用户在 PC 端进行图像效果调优,该工具的
    实现依赖于 osdrv 和 mpp 。
Reference开发

3516:SDK提供到MPP 个人开发方式为提取lib库,cmake编译,可执行文件通过ssh上传至板端,使用gdb-gdbserver调试程序

3556:MPP之上有Middleware和Reference层,提供进一步的封装和抽象,重点关注《HiMobileCam V1.0 参考设计开发指南》,采取在sdk/reference修改,sdk根目录make reference编译程序,通过Hitook usb烧写程序至板端。

功能实现

  1. 按键功能

    Reference 《HiMobileCam V1.0 参考设计开发指南》

    • 3.2.1 按键
    • 2.6.3 keymng
  2. 电池管理

    《HiMobileCam V1.0 参考设计开发指南》

    • 2.6.4 gaugemng
  3. 菜单

    Middleware《HiGV 开发指南》

    Middleware《HiGV API参考》

    Reference 《HiMobileCam V1.0 参考设计开发指南》

    • 4.8 UI
  4. 多语言适配

    Reference 《HiMobileCam V1.0 参考设计开发指南》

    • 4.8.7.2 多语言适配

改动

  1. hi3556v200_xa\osdrv\opensource\uboot\u-boot-2016.11\common\autoboot.c static int __abortboot(int bootdelay)

视频通路

输出

PDT_INIT_MediaInit

PDT_MEDIA_VoWndStart

PDT_MEDIA_VoWndStart

HI_MAPI_DISP_Bind_VProc

1
2
s32Ret = HI_MAPI_DISP_Bind_VProc(pstDispCfg->astWndCfg[i].ModHdl, pstDispCfg->astWndCfg[i].ChnHdl,
pstDispCfg->VdispHdl, pstDispCfg->astWndCfg[i].WndHdl, HI_FALSE);
1
2
3
4
5
6
7
8
9
10
11
12
typedef struct hiPDT_MEDIA_DISP_WND_CFG_S
{
HI_BOOL bEnable;
HI_HANDLE WndHdl;
HI_PDT_MEDIA_VIDEOMOD_E enBindedMod; /** binded video module: only support vcap/vpss */
HI_HANDLE ModHdl; /**<binded module handle: vcap-pipe | vproc-vpss */
HI_HANDLE ChnHdl; /**<binded module chn handle: vcap-pipechn | vproc-vpssport */
ROTATION_E enRotate;
ASPECT_RATIO_S stAspectRatio;
HI_MAPI_DISP_WINDOW_ATTR_S stWndAttr;
HI_PDT_MEDIA_DISP_WND_CROP_CFG_S stCropCfg;
} HI_PDT_MEDIA_DISP_WND_CFG_S;

ini配置的ModHdl为vproc-vpss

裁剪

reference/dashcam/modules/statemng/src/hi_product_statemng_common.c

1
2
3
4
5
6
7
8
9
10
11
HI_S32 PDT_STATEMNG_SetCrop(HI_MESSAGE_S* pstMsg)

s32Ret = HI_PDT_MEDIA_DispWindowCrop(&stCropCfg);

s32Ret = HI_PDT_PARAM_SetCamParam(enSettingWorkMode,

pstStateMngCtx->s32PreviewCamID,

HI_PDT_PARAM_TYPE_CROP,

(HI_VOID*)&stCropCfg);

reference/dashcam/modules/media/common/hi_product_media_comm.c 函数 HI_S32 HI_PDT_MEDIA_DispWindowCrop(const HI_PDT_MEDIA_DISP_WND_CROP_CFG_S* pstCropCfg)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
HI_PDT_MEDIA_DISP_WND_CFG_S* pstDispWndCfg = &s_stMEDIACtx.pstMediaInfo->stMediaCfg.stVideoOutCfg.astDispCfg[i].astWndCfg[j];
if(!pstDispWndCfg->bEnable)
{
MLOGI("disp[%d]_wnd[%d] is not enable\n",i,j);
continue;
}

HI_HANDLE ModHdl = pstDispWndCfg->ModHdl;
HI_HANDLE ChnHdl = pstDispWndCfg->ChnHdl;


HI_MAPI_VPORT_ATTR_S stVPortAttr = {0};
s32Ret = HI_MAPI_VPROC_GetPortAttr(ModHdl, ChnHdl, &stVPortAttr);
HI_APPCOMM_CHECK_RETURN(s32Ret, HI_FAILURE);
VPSS_CROP_INFO_S stCropInfo = {0};
SIZE_S stSrcSize = {0};
stSrcSize.u32Width = stVPortAttr.u32Width;
stSrcSize.u32Height = stVPortAttr.u32Height;
PDT_MEDIA_GetWindowCropSize(pstCropCfg, pstDispWndCfg, &stSrcSize, &stCropInfo);
MLOGI("set disp[%d]_wnd[%d]_modhdl[%d]_chnhdl[%d] crop \n",i,j,ModHdl,ChnHdl);
s32Ret = HI_MPI_VPSS_SetChnCrop(ModHdl, ChnHdl, &stCropInfo);
HI_APPCOMM_CHECK_RETURN(s32Ret, HI_FAILURE);

Hi3556v200踩坑笔记(3)

https://www.shjdgwj.cn/8f30c2af84ad/

作者

GWJ

发布于

2022-12-07

更新于

2023-10-31

许可协议

评论