精华内容
下载资源
问答
  • 海思HI35xx平台串口配置方法
    万次阅读 热门讨论
    2018-10-06 15:33:38

    前言

    串行接口简称串口(通常指COM接口),是采用串行通信方式的扩展接口,其特点是通信线路简单,只要一对传输线就可以实现双向通信,从而大大降低了成本,但传送速度一般,数据传输率为115kbps~230kbps。异步串行UART(Universal Asynchronous Receiver/Transmitter),即通用异步接收/发送。UART是一款并行输入转换为串行输出的芯片(如MAX232、MAX485等),它们通常集成在主板上。UART芯片的另一功能是将TTL逻辑电平进行转换,属于硬件逻辑实现,不需要软件的干涉。UART常用的接口标准有RS-232、RS-485,其中RS-232的传送距离最大为约15米,最高速率为20kb/s;而RS-485的最大传输距离约为1219米,最大传输速率为10Mb/s。这两种接口标准的传输速率与传输速度差异这么大,主要是因对逻辑电平的规定以及信号传输抗干扰能力不一样导致的,在实际应用中根据传输距离及速度的不同需求选用即可。

    海思UART

    在海思芯片架构中,UART主要是将来自外围设备的数据进行串并转换后传入内部总线,以及将数据进行并串转换后输出到外围设备,从而实现两芯片之间的通信。Hi35XX提供了3个UART单元:

    UART0:4线UART,可用于调试、报警和云台控制。

    UART1:2线UART,可用于调试、报警。

    UART3:2线UART,可用于调试、报警。

    UART配置:

    1、支持数据位和停止位的位宽可编程。数据位可通过编程设定为5/6/7/8比特,停止位可通过过编程设定为1bit或2bit。

    2、支持奇、偶校验方式或无校验。

    3、支持速率可编程,支持9600bit/s、14400bit/s、19200bit/s、38400bit/s、57600bit/s、76800bit/s、115200bit/s、230400bit/s、460800bit/s多种波特率可选。

    海思UART启用

    海思默认只开启UART0单元作为调试功能使用,在实际应用中我们常常需要使用UART1、UART2来与外围设备对接,以实现串口通信。此时我们就需要配置启用UART1、UART2单元,这个过程分为3步:

    1. 确保硬件IO口设计及时钟频率正常
    2. 检查UART单元所使用的IO口复用关系
    3. 配置内核,将UART映射为设备文件

    硬件电路部分按要求布线连接,一般没什么问题,这里主要讲解IO口的复用关系配置及内核配置。

    上表是海思芯片IO口复用关系表,由此可知大多数IO口的默认功能都不是作为UART单元来使用,故需要配置它们的复用关系,可以采用在系统启动脚本里添加如下命令来配置IO口的复用关系:

    himm 0x120F00F8 0x1

    himm 0x120F00FC 0x1

    ……

    接下来是配置内核,以实现UART单元映射为linux下的设备文件,这里主要涉及就是海思的设备树更改,相对简单。进入SDK目录\osdrv\opensource\kernel\linux-3.18.y\arch\arm\boot\dts,找到以下设备树文件。

    修改以下内容:

    至此海思UART单元配置完成,重新编译内核,并将内核烧录运行。如果没有什么异常,在设备上的/dev/目录下会有以下3个设备文件出现,接下来软件对此设备文件进行编程操作即可。

    /dev/ttyAMA0

    /dev/ttyAMA1

    /dev/ttyAMA2

    海思UART软件操作

    与其他的linux设备操作类似,通过open、fcntl、close来实现与UART单元进行操作。在串口设备中,比较特殊的就是串口的波特率、奇偶校验、数据位以及停止位的设置了,只有将它们正确设置了才能进行串口通讯。下面是一个样例程序

    *
    *Function: HI_Serial_Open(int fd,char* ComDevice)  
    *Param: fd:file descirbe handle	 Serial Device: /dev/ttyAMA1 /dev/ttyAMA2
    *Output: Ok or Fail
    */
    
    int HI_Serial_Open(char* HiSerDevice)  
    {  
        int fd;
    		
    	fd = open(HiSerDevice, O_RDWR|O_NOCTTY|O_NDELAY);  
    	if (HI_FALSE == fd)  
    	{  
    		perror("HiSerial Can't Open Serial HiSerDevice");  
    		return(HI_FALSE);  
    	}  
    	//恢复串口为阻塞状态                                 
    	if(fcntl(fd, F_SETFL, 0) < 0)  
    	{  
    		debugpri("fcntl failed!\n");  
    		return(HI_FALSE);  
    	}       
    	else  
    	{  
    		debugpri("fcntl=%d\n",fcntl(fd, F_SETFL,0));  
    	}  
    	//测试是否为终端设备      
    	if(0 == isatty(STDIN_FILENO))  
    	{  
    		debugpri("standard input is not a terminal device\n");  
    		return(HI_FALSE);  
    	}  
    	else  
    	{  
    		debugpri("isatty success!\n");  
    	}                
    	printf("fd->open=%d\n",fd);  
    	return fd;  
    }  
    
    /*
    *Function: HI_Serial_Close(int fd) 
    *Param: fd:file descirbe handle	 
    *Output: Null
    */
    
    void HI_Serial_Close(int fd)  
    {  
    	if(fd > 0)
    		close(fd); 
    	return;	
    }  
    
    /*
    *Function: HI_Serial_Set(int fd,int speed,int flow_ctrl,int databits,int stopbits,int parity) 
    *Param1: fd: file descirbe handle	 
    *Param2: speed: select the Serial speed.115200,19200,9600...
    *Param3: flow_ctrl: if use flow control
    *Param4: databits: data bit select
    *Param5: stopbits: stopbits select	
    *Param5: parity: partiy select	
    *Output: Ok or Fail
    */
    int HI_Serial_Set(int fd,int speed,int flow_ctrl,int databits,int stopbits,int parity)  
    {
        /*******
        ********
        ********/  
    }
    
    int HI_Serial_Usage(void)
    {
        printf("Usage:\n");
        printf("\tmyhicom [-d] <HiSerialDevice> [-s] get netdeviece info [-rw] read or wite select\n");
        printf("\tmyhicom [-h] for more usage\n");
        printf("\tmyhicom [-v] the verson of the sofware\n");
    	printf("\tExample:\n\tmyhicom -d /dev/ttyAMA1 -s 115200 -w HiSerial:HelloWorld\n");
    }
    
    
    /*
    **Function: main()
    **usage: read or write com
    **parameter: help
    */
    int main ( int argc, char *argv[] )
    {
    	int cmd;
    	int len;
        //extern char *optarg;
        //extern int optind, opterr, optopt;
    	char HiSerialDev[32]="/dev/ttyAMA1";
    	char sendbuf[1024]={0};
    	char recvbuf[1024]={0};
    	int SerialSpeed = 115200;
    	
    	Hi_init_signals();
    	if(argc == 1)
    	{
    		HI_Serial_Usage();		
    		exit(0);
    	}
    	else
    	{
    		while ((cmd = getopt(argc, argv, ":d:s:rw:hv")) != -1)
    		{
    			switch (cmd)
    			{
    				case 'h':
    					HI_Serial_Usage();
    					break;
    				case 'v':
    					printf("myHicom --Verson V1.0.0\n");
    					break;
    				case 'd':
    					//printf("catch -d %s \n",optarg);
    					memset(HiSerialDev,0,sizeof(HiSerialDev));
    					sprintf(HiSerialDev,"%s",optarg);
    					printf("myHicom HiSerialDev %s\n",optarg);
    					break;
    				case 's':
    					SerialSpeed = atoi(optarg);
    					printf("myHicom speed %d\n",SerialSpeed);
    					break;
    				case 'r':					
    					 debugpri("myHicom read\n");
    					 HiSerfd = HI_Serial_Open(HiSerialDev);
    					 HI_Serial_Init(HiSerfd,SerialSpeed,0,8,1,'N');
    					 while(1)
    					 {
    						len = HI_Serial_Recv(HiSerfd, recvbuf,sizeof(recvbuf));  
    						if(len > 0)  
    						{  
    							recvbuf[len] = '\0';  
    							printf("Hiserial receive data: %s\n",recvbuf);  
    							memset(recvbuf,0,sizeof(recvbuf));
    							//break;  
    						}  
    						else  
    						{  
    							debugpri("Hiserial haven't data receive \n");  
    						}  
    						sleep(2); 						 
    					 };		
    					 break;
    				case 'w':
    					 debugpri("myHicom write %s\n",optarg);
    					 HiSerfd = HI_Serial_Open(HiSerialDev);
    					 printf("fd = %d device = %s speed = %d\n",HiSerfd,HiSerialDev,SerialSpeed);
    					 HI_Serial_Init(HiSerfd,SerialSpeed,0,8,1,'N');					 
    					 sprintf(sendbuf,"%s\n",optarg);					 
    					 HI_Serial_Send(HiSerfd, sendbuf, strlen(sendbuf)+1); 
    					 if(HiSerfd > 0)
    						 HI_Serial_Close(HiSerfd);					
    					 break;
    			    case ':':
                        printf ("option: -%c missing argument. -h for help.\n",(char)optopt);
                        break;
    			    case '?':
                        printf("Unknown option: -%c\n",(char)optopt);
                        break;
    				default:
    					exit(0);
    			}
    		}	
    	}	
    	return 0;
    }	
    

    总结

    串口通信加强了主控芯片与外围设备之间的联系,通过RS485接口可以实现远距离通信。在海思平台开发中,可以实现球机平台远程控制、红外报警等智能监控应用。本文主要是总结海思UART单元的应用于配置及提供一个简单的串口通信样例实现,样例代码点击此下载。原创不易,转载说明出处。

    样例运行效果图:

     

    更多相关内容
  • 详细总结了海思各个系列的芯片性能及接口参数,包括CPU性能、外设高速接口、编解码能力等,其中对同一系列的不同版本也有详细对比
  • 海思芯片Hi35xx系列配置对比,包括Hi3516A、Hi3516C、Hi3516D、Hi3518E等
  • 海思Hi35xx系列SDK

    2019-04-22 12:31:50
    海思Hi35xx系列SDK的百度网盘分享,包括Hi3516、Hi3518、Hi3519系列的Linux和Liteos SDK。
  • H265是2013年提出的一项新的视频编解码技术,相比h264具有压缩率高的特点,对于高清视频占用更少的带宽,十分适合移动互联网的需求,该资源是在海思平台上实现H265解码的样例源码。
  • 串口作为海思CPU与外部芯片通信的一种重要方式,可以实现云台控制、报警输入输出控制等功能,海思HI35xx平台提供了多个串口设备,它们之间可以独立使用,充分利用硬件资源,将功能发挥最大化。海思HI35xx平台串口...
  • 海思HI35xx平台h264解码实例是基于海思Hi35xx平台编写的C源码,指在说明如何利用海思提供的API进行h264视频解码的软件设计。
  • 海思低功耗 WIFI 门铃方案(Hi3518EV200+Hi1131s+MCU+LiteOS) 一、具体方案实现:  1、硬件设计电源管理是核心。  2、设备固件开发LiteOS+唤醒。  3、音视频平台+唤醒服务器。  4、APP 可免费提供源码参考...
  • HI35XX平台音视频编解码程序demo样例是基于海思平台做的,主要是演示海思凭条芯片如何进行音视频解码,给程序编写提供一些设计参考。
  • gdb用来调试程序,分析程序的重要工具,海思HIxx是华为海思芯片推出的一些列用于开发IPC、NVR、XVR、DVR的视频处理芯片,被海康、大华、宇视、长视等大型安防厂商广泛采用。在进行软件开发过程中不免出现各种个样的...
  • 建议首先阅读文档《HiSVP 开发指南.pdf》、《HiSVP API 参 考.pdf》、《HiSVP 量化库使用指南.pdf》 说明:步骤 b 中生成的 Prototxt 可以直接用,ruyi studio 会自 动进行规范化
  • Hi35xx网络摄像机开发板选型指南,Hi3518EV200, Hi3516EV100, Hi3516CV300, Hi3516D, Hi3516A, Hi3516AV200, Hi3519V101
  • TI的tlv320aic3254声卡驱动在海思平台的移植,内含驱动源代码,ioctl命令说明,tlv320aic32x4用户手册原版和部分翻译的中文版
  • 海思 Hi35xx 网络摄像机 开发板测试说明 里面包含了对海思35系列芯片对网络摄像机开发的一些步骤和说明,包括怎么通过海思连接和使用网络摄像机
  • 海思MPP测试代码,包括:视频系统初始化模块(MPP_SYS_CONF_S)、视频输入模块(VI)、视频前处理模块(VPSS)、视频编码模块(VENC)和视频输出模块(VO)
  • 华为海思开发平台,采用最新的liteos系统
  • 1../genMakefiles hi35xx 2.make 3. ./live555MediaServer
  • 海思35xx系列SDK,资源太大了,所以存入网盘,这个只是提供了网盘的共享地址,清晰知,内有本人邮箱,如遇问题可邮件沟通,欢迎下载
  • hi35xx启动FB

    2015-07-15 16:23:33
    hi3535 SDK中sample中修改而来,在运行Qt,minigui等程序之前必须先运行该程序才可以显示GUI界面,经测试,运行Qt可行。自己可以修改大小。
  • 海思HI35xx平台h265解码实例-编解码代码类资源
  • sony_imx307驱动,海思平台,hi35xx,驱动源码
  • HI35xx gdb工具

    2021-05-18 14:24:56
    可在单板上使用gdb。或者挂载nfs目录后,使用gdb的绝对路径运行gdb
  • 海思Hi35系统 soc手册: 1.Hi3520DV200 2.Hi3520DV300 3.Hi3521AV100 4.Hi3531AV100 5.Hi3520DV400 6.Hi3521DV100 7.Hi3531DV100 8.Hi3536DV100 9.Hi3536CV100
  • Hi35XX系列芯片对比.rar

    2020-09-01 09:53:41
    海思35XX系列芯片的详细性能对比,主要包括处理器性能、图像处理能力以及智能图像处理算法的对比,可根据实际项目需求来进行芯片的选择。
  • HI35xx平台MPEG解码实例源码是一个样例,演示了如何使用HIMPP提供的API进行MPEG视频解码的程序设计。
  • uboot下修改hi35xx_GPIO设置_board(GPIO设置).c
  • 语音识别的场景应用十分广泛,借助云语音技术,可以在计算资源缺乏的嵌入式应用上实现丰富的语音应用,百度云语音运行依赖curl、openssl、cppjson等开源库,这里做一个源码打包,以支持应用移植。
  • 交叉编译移植带ffmpeg的opencv到海思Hi3559AV100平台,支持对视频进行解码。

    若该文为原创文章,转载请注明原文出处
    本文章博客地址:https://blog.csdn.net/qq21497936/article/details/123696821
    各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究
    红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

    OpenCV开发专栏(点击传送门)

    上一篇:《OpenCV开发笔记(七十三):红胖子8分钟带你使用opencv+dnn+yolov3识别物体
    下一篇:持续补充中…


    前言

      移植opencv到海思平台,opencv支持对视频进行解码,需要对应的ffmpeg支持。


    Ffmpeg的移植

      Ffmpeg的移植请参考之前的文章:《FFmpeg开发笔记(十):ffmpeg在ubuntu上的交叉编译移植到海思HI35xx平台
      (PS:ffmpeg解码h264是不需要依赖libx264的,但是编码是需要依赖libx264的,在海思上使用了mpp的venc,所以无需libx264)


    OpenCV下载

      下载地址:https://github.com/opencv/opencv/releases/tag/3.4.1
      QQ群:1047134658(点击“文件”搜索“opencv”,群内与博文同步更新)


    OpenCV的移植

    步骤一:下载解压

       在这里插入图片描述

    步骤二:配置cmake

      

    export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/yang/work/ffmpeg_rootfs/lib/pkgconfig
    

      以上是目录,注意这里有坑(卡了一天):

    • 不要使用cmake-gui:要使用命令行,命令行可以识别到ffmpeg,但是cmake-gui不行
    • 系统本身是否安装了ffmpeg:默认是会先使用本地的,尽管设置了PKG_CONFIG_PATH
    • ffmpeg否依赖x264:可查看.pc文件,是否有-lx264(笔者就是编译的时候不小心编译了libx264库,所以cmake的时候都无法定义HAVA__FFMPEG,如果依赖的,记得将libx264拷贝到ffmpeg目录下也行。
    cmake -D CMAKE_BUILD_TYPE=RELEASE  \
                 -D CMAKE_INSTALL_PREFIX=/home/yang/work/opencv_rootfs \
                 -D CMAKE_C_COMPILER=aarch64-himix100-linux-gcc \
                 -D CMAKE_CXX_COMPILER=aarch64-himix100-linux-g++ \
                 -D BUILD_SHARED_LIBS=ON \
                 -D CMAKE_CXX_FLAGS=-fPIC \
                 -D CMAKE_C_FLAGS=-fPIC \
                 -D CMAKE_EXE_LINKER_FLAGS=-lpthread -ldl \
                 -D ENABLE_PIC=ON \
                 -D WITH_1394=OFF \
                 -D WITH_ARAVIS=OFF \
                 -D WITH_ARITH_DEC=ON \
                 -D WITH_ARITH_ENC=ON \
                 -D WITH_CLP=OFF \
                 -D WITH_CUBLAS=OFF \
                 -D WITH_CUDA=OFF \
                 -D WITH_CUFFT=OFF \
                 -D WITH_FFMPEG=ON \
                 -D WITH_GSTREAMER=ON \
                 -D WITH_GSTREAMER_0_10=OFF \
                 -D WITH_HALIDE=OFF \
                 -D WITH_HPX=OFF \
                 -D WITH_IMGCODEC_HDR=ON \
                 -D WITH_IMGCODEC_PXM=ON \
                 -D WITH_IMGCODEC_SUNRASTER=ON \
                 -D WITH_INF_ENGINE=OFF \
                 -D WITH_IPP=OFF \
                 -D WITH_ITT=OFF \
                 -D WITH_JASPER=ON \
                 -D WITH_JPEG=ON \
                 -D WITH_LAPACK=ON \
                 -D WITH_LIBREALSENSE=OFF \
                 -D WITH_NVCUVID=OFF \
                 -D WITH_OPENCL=OFF \
                 -D WITH_OPENCLAMDBLAS=OFF \
                 -D WITH_OPENCLAMDFFT=OFF \
                 -D WITH_OPENCL_SVM=OFF \
                 -D WITH_OPENEXR=OFF \
                 -D WITH_OPENGL=OFF \
                 -D WITH_OPENMP=OFF \
                 -D WITH_OPENNNI=OFF \
                 -D WITH_OPENNNI2=OFF \
                 -D WITH_OPENVX=OFF \
                 -D WITH_PNG=OFF \
                 -D WITH_PROTOBUF=OFF \
                 -D WITH_PTHREADS_PF=ON \
                 -D WITH_PVAPI=OFF \
                 -D WITH_QT=OFF \
                 -D WITH_QUIRC=OFF \
                 -D WITH_TBB=OFF \
                 -D WITH_TIFF=ON \
                 -D WITH_VULKAN=OFF \
                 -D WITH_WEBP=ON \
                 -D WITH_XIMEA=OFF \
                 -D BUILD_opencv_highgui=OFF \
                 ..
    

      在这里插入图片描述

    步骤三:编译

    make -j8
    

      在这里插入图片描述
      在这里插入图片描述

    步骤四:安装

    make install
    

      在这里插入图片描述


    部署到板子上

    • 方法一:拷贝进入系统目录,对应bin、include、lib
    • 方法二:单独一个目录,运行前跑脚本进入路径(笔者是Qt,将opencv打入qt的安装目录,使用qt的路径即可)。
      贴上开发本Qt的脚本(注意系统不同,平台的参数最后2个可能不同):
        在这里插入图片描述

    Qt的引入带ffmpeg的opencv配置文件

    # ffmpeg-3.4.8 sdk
    INCLUDEPATH += /home/yang/work/ffmpeg_rootfs/include \
    LIBS += -L/home/yang/work/ffmpeg_rootfs/ffmpeg-3.4.8/bin
    LIBS += -lavcodec \
            -lavdevice \
            -lavfilter \
            -lavformat \
            -lavutil \
            -lswresample \
            -lswscale
    
    INCLUDEPATH += /home/yang/work/opencv_rootfs/include \
                   /home/yang/work/opencv_rootfs/include/opencv \
                   /home/yang/work/opencv_rootfs/include/opencv2
    
    LIBS += -L/home/yang/work/opencv_rootfs/lib \
            -lopencv_calib3d \
            -lopencv_core \
            -lopencv_features2d \
            -lopencv_flann \
            -lopencv_imgcodecs \
            -lopencv_imgproc \
            -lopencv_ml \
            -lopencv_objdetect \
            -lopencv_photo \
            -lopencv_shape \
            -lopencv_stitching \
            -lopencv_superres \
            -lopencv_video \
            -lopencv_videoio \
            -lopencv_videostab
    

    板子上Qt+OpenCV播放器测试1

      将opencv部署到板子上,然后用qt的opencv播放器测试,播放慢速(判断是解码720p,mp4,h264大概11-12ms一帧,显示大概15ms一帧,刷图跟刷新的区域面积有直接关系,所以确认海思用qt动态刷新绘图能力可以说得上是有点差的)(图略)


    上一篇:《OpenCV开发笔记(七十三):红胖子8分钟带你使用opencv+dnn+yolov3识别物体
    下一篇:持续补充中…


    若该文为原创文章,转载请注明原文出处
    本文章博客地址:https://blog.csdn.net/qq21497936/article/details/123696821

    展开全文
  • sofiactl是一个开源跨平台工具和sdk,可使用原始CMS软件使用的混合JSON /二进制通信协议(默认端口34567)来控制由Sofia供电的Hi35xx DVR设备。 用法 sofiactl.pl-用户名-密码-主机192.168.0.1-端口34567-命令命令[-...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,445
精华内容 10,578
关键字:

hi35xx

友情链接: rfnefaka.zip