海思SDK驱动部分
- 格式:docx
- 大小:87.39 KB
- 文档页数:10
调试sc2232总结1、驱动调试方法:(1)首先,sc2232这款sensor厂家提供了3个配置文件config_entry.ini、sc2232_1080p25.ini、sc2232_1080p25_2lane.ini,另外两个驱动代码文件sc2232_cmos.c、sc2232_sensor_ctl.c等。
其中,sc2232_cmos.csc2232_cmos.c主要实现ISP 需要的回调函数,这些回调函数中包含了sensor 的适配算法,如注册了3a库回调函数,ae初始化参数,增益、帧率等初始化算法。
sc2232_sensor_ctl.c用于底层驱动控制,主要实现sensor的读写和初始化动作,也就是读写寄存器,主要是根据datasheet文档进行的代码开发。
(2)其次,讲讲3个配置文件,其中config_entry.ini是所有配置的入口,内容如下:首先设置UserMode参数,该参数用于选择哪一种模式,0表示mode.0;1表示mode.1;这里刚开始我都不知道,后来慢慢研究才明白的。
然后,sc2232_1080p25.ini这个文件代表的是datasheet里面的DVP并行视频端口模式,也就是CMOS模式,这种模式是12-bit并行数据。
sc2232_1080p25_2lane.ini这个文件代表的是datasheet里面的MIPI模式,也就是串行视频端口模式,只是8/10bit,1/2lane串行输出。
(lane解释:用于连接发送端和接收端的一对高速差分线,既可以是时钟lane,也可以是数据lane。
)可以使用beyondcompare对比这两个文件,只有个别参数配置不一样。
(3)stream工具的使用方法Stream工具需要上面说到的3个ini配置文件,当配置好参数之后,在stream的configs目录下建立一个sc2232目录,把ini配置文件放到目录下。
还需要复制两个自适应配置文件,分别是普通模式和wdr模式的,当然如果厂家提供有的话就不用复制其他方案的了。
Hisi3520+USBWIFI(RT3070)做路由器移植过程硬件平台:Hisi3520开发板Linux内核:linux-3.0.y说明:这是一个Hisi3520+RT3070WIFI作为路由器的移植过程!在做下面的过程中,我认为你是有个有点嵌入式开发经验的人,内核源码已经可以编译通过运行等!特别要强调,usb总线驱动一定要是好的。
下面的步骤也描述了如何利用sdk安装交叉编译器。
如需帮助,请联系孙怀亚。
第一步、下载Hi3520A_SDK_V1.0.2.0.tgz,这是海思的开发SDK,可以将第二步、解压缩海思SDK#tar -zxvf Hi3520A_SDK_V1.0.2.0.tgz修改sdk.Unpack文件#vim sdk.unpack将第一行的#!bin/sh改为#!bin/bash,如下图#./sdk.unpack解压完成后目录多出如下目录osdrv,mpp目录:进入osdrv目录#cd osdrv在osdrv目录下,有文件系统工具busybox,内核kernel,交叉编译工具toolchain,uboot 等,目录结构详细说明请看目录的readme_en.txt。
第三步、安装交叉编译器:进入toolchain目录进入arm-hisiv100-linux运行#./cross.install 安装脚本将自动帮你将交叉编译器安装到/opt目录下,同时在/etc/profile文件的最后一行加入环境变量,你可以看一下这两个地方的变动:可以看到/opt目录下多出了hisi-linux目录可以看到/etc/profile文件最后多出了如下几行:运行一下环境变量配置:#Source /etc/profile 这个将重新配置环境变量在中端中输入#arm-hisiv100-linux-gcc –v如果看到如上图信息说明你的交叉编译已经安装完毕,可以使用了!如果没有,你需查找原因,一般会解决的,如果实在不行,请联系孙怀亚。
3518E平台的搭建海思的SDK提供了ISP调试的相关工具,降低了IPC开发ISP调试的难度。
初次搭建ISP调试环境,记录一下。
SDK版本:Hi3518_MPP_V1.0.A.0硬件平台:HI3518E_OV9732工具包:PQ_TOOL (Hi3518E_V100R001C01SPC0A0\01.software\pc\PQ_TOOL)文件说明:Hi3518_ITTB_MPP2_V1.0.A.0_B030.tgz 设备端工具; PQTools_V3.7.5.zip PC端工具环境搭建步骤:(1)将Hi3518_ITTB_MPP2_V1.0.A.0_B030.tgz拷贝至nfs共享目录名,解压后运行HiIspTool.sh脚本倘若用海思自带的工具出图像并调节ISP运行:#./HiIspTool.sh -a -p ov9732_720p_line.inips一下可以看到两个进程696 adminlvj 58488 S ./ittb_stream -p ov9732_720p_line.ini699 adminlvj 19676 S ./ittb_control倘若运行自己的工程出图像了,这时只需要运行一下命令即可。
ps一下可以看到一个进程699 adminlvj 19676 S ./ittb_control(2)PC端直接解压PQTools_V3.7.5.zip,运行HiPQTools.exe,输入选择sdk版本Hi3518_MPP_V1.0.A.0 ,输入设备IP,就可以连接上摄像头倘若运行了ittb_stream,可以PC端软件上打开视频图像窗口连接成功,至此,最简单的ISP调试环境搭建就完成了。
复杂的就是后面的ISP调节过程了。
备注:运行脚本的时候可能会报错,查看相关打印信息,将错误消除。
当前产品我们用的是HI3518E+OV9732,SDK中并没有提供相关的sensor库和相关的config文件,所以运行报错了!解决:将OV9732sensor库拷贝至Hi3518_ITTB_MPP2_V1.0.A.0/libs/下,将ov9732_720p_line.ini拷贝至Hi3518_ITTB_MPP2_V1.0.A.0/configs/下附录:ov9732_720p_line.ini[plain]view plaincopyprint?1.[sensor]2.Sensor_type =ov9732 ;the type of sensor3.Mode =0 ;LINE mode,mode = 0 ,WDR mode,mode =14.DllFile =libs/libsns_ov9732.so ;LineDllFile path5.6.[vi_dev]7.Input_mod =2 ;VI_INPUT_MODE_BT656 = 08. ;VI_INPUT_MODE_BT601,9. ;VI_INPUT_MODE_DIGITAL_CAMERA10.11.Work_mod =0 ;VI_WORK_MODE_1Multiplex = 012.13. ;VI_WORK_MODE_2Multiplex,14.15. ;VI_WORK_MODE_4Multiplexbine_mode =0 ;Y/C composite or separation mode18.19. ;VI_COMBINE_COMPOSITE = 0 /*Composite mode */20.21. ;VI_COMBINE_SEPARATE, /*Separate mode */22.p_mode =0 ;Component mode (single-component or dual-component)24.25. ;VI_COMP_MODE_SINGLE = 0, /*single component mode */26.27. ;VI_COMP_MODE_DOUBLE = 1, /*double component mode */28.29.Clock_edge =1 ;Clock edge mode (sampling on the rising or falling edge)30.31. ;VI_CLK_EDGE_SINGLE_UP=0, /*rising edge */32.33. ;VI_CLK_EDGE_SINGLE_DOWN, /*falling edge */34.35.Mask_num =2 ;Component mask37.Mask_0 =0xFFC0000038.39.Mask_1 =0x040.41.Scan_mode = 1;VI_SCAN_INTERLACED = 042.43. ;VI_SCAN_PROGRESSIVE,44.45.Data_seq =2 ;data sequence (ONLY for YUV format)46.47. ;----2th component U/V sequence in bt112048.49. ; VI_INPUT_DATA_VUVU = 0,50.51. ; VI_INPUT_DATA_UVUV,52.53. ;----input sequence for yuv54.55. ; VI_INPUT_DATA_UYVY = 0,56.59. ; VI_INPUT_DATA_YUYV,60.61. ; VI_INPUT_DATA_YVYU62.63.64.65.Vsync =1 ; vertical synchronization signal66.67. ;VI_VSYNC_FIELD = 0,68.69. ;VI_VSYNC_PULSE,70.71.VsyncNeg=0 ;Polarity of the vertical synchronization signal72.73. ;VI_VSYNC_NEG_HIGH = 0,74.75. ;VI_VSYNC_NEG_LOW /*if VIU_VSYNC_E76.77.Hsync =0 ;Attribute of the horizontal synchronization signal78.81. ;VI_HSYNC_PULSE,82.83.HsyncNeg =0 ;Polarity of the horizontal synchronization signal84.85. ;VI_HSYNC_NEG_HIGH = 0,86.87. ;VI_HSYNC_NEG_LOW88.89.VsyncValid =0 ;Attribute of the valid vertical synchronization signal90.91. ;VI_VSYNC_NORM_PULSE = 0,92.93. ;VI_VSYNC_VALID_SINGAL,94.95.VsyncValidNeg =0;Polarity of the valid vertical synchronization signal96.97. ;VI_VSYNC_VALID_NEG_HIGH = 0,98.99. ;VI_VSYNC_VALID_NEG_LOW101.Timingblank_HsyncHfb =0 ;Horizontal front blanking width102.103.Timingblank_HsyncAct =1280 ;Horizontal effetive width104.105.Timingblank_HsyncHbb =0 ;Horizontal back blanking width106.107.Timingblank_VsyncVfb =0 ;Vertical front blanking height108.109.Timingblank_VsyncVact =720 ;Vertical effetive width110.111.Timingblank_VsyncVbb=0 ;Vertical back blanking height112.113.Timingblank_VsyncVbfb =0 ;Even-field vertical front blanking height(inter lace, invalid progressive)114.115.Timingblank_VsyncVbact=0 ;Even-field vertical effetive width(interlace, i nvalid progressive)116.117.Timingblank_VsyncVbbb =0 ;Even-field vertical back blanking height(inte rlace, invalid progressive)118.121.;----- only for bt656 ----------122.FixCode =0 ;BT656_FIXCODE_1 = 0,123.124. ;BT656_FIXCODE_0125.126.FieldPolar=0 ;BT656_FIELD_POLAR_STD = 0127.128. ;BT656_FIELD_POLAR_NSTD129.130.DataPath =1 ;ISP enable or bypass131.132. ;VI_PATH_BYPASS = 0,/* ISP bypass */133.134. ;VI_PATH_ISP = 1,/* ISP enable */135.136. ;VI_PATH_RAW = 2,/* Capture raw data, for debug */ 137.138.InputDataType=1 ;VI_DATA_TYPE_YUV = 0,VI_DATA_TYPE_RGB = 1, 139.142.143.[vi_chn]144.145.CapRect_X =0146.147.CapRect_Y =0148.149.CapRect_Width=1280150.151.CapRect_Height=720152.153.DestSize_Width=1280154.155.DestSize_Height=720156.157.CapSel =2 ;Frame/field select. ONLY used in interlaced mode158. ;VI_CAPSEL_TOP = 0, /* top field */159. ;VI_CAPSEL_BOTTOM, /* bottom field */160. ;VI_CAPSEL_BOTH, /* top and bottom field */162.PixFormat =19 ;163.164.165.166.SrcFrameRate=-1 ;Source frame rate. -1: not controll 167.168.FrameRate =-1 ;Target frame rate. -1: not controll169.170.171.[vpss_group]172.Vpss_DrEn =FALSE173.174.Vpss_DbEn =FALSE175.176.Vpss_IeEn =TRUE177.178.Vpss_NrEn =TRUE179.180.Vpss_HistEn =TRUE181.182.Vpss_DieMode=0 ;Define de-interlace mode183.184. ;VPSS_DIE_MODE_AUTO = 0,185.186. ;VPSS_DIE_MODE_NODIE = 1,187.188. ;VPSS_DIE_MODE_DIE = 2,189.190.[vpss_chn]191.Vpss_W =1280192.Vpss_H =720193.194.[isp_image]195.196.Isp_W =1280197.198.Isp_H =720199.200.I sp_FrameRate=30201.202.Isp_Bayer =3 ;BAYER_RGGB=0, BAYER_GRBG=1, BAYER_GBRG=2, BAYER_ BGGR=3203.205.[isp_timing]206.207.Isp_WndMode=0 ;WIND_NONE= 0,WIND_HOR= 1,WIND_VER= 2,WIND_A LL= 3,208.209.I sp_HorWndStart=0210.211.Isp_HorWndLength=1280212.213.Isp_VerWndStart=0214.215.Isp_VerWndLength=720216.217.[vb_conf]218.219.VbCnt=8220.221.222.[venc]223.224.RcMode =VENC_RC_MODE_H264CBR226.Gop =30227.228.StatTime =1229.230.ViFrmRate =30231.232.TargetFrmRate=25233.;----- only for VENC_RC_MODE_H264CBR ----------234.BitRate=4096235.FluctuateLevel=1236.;----- only for VENC_RC_MODE_H264VBR ----------237.MaxBitRate =10000238.239.MaxQp=32240.241.MinQp=24242.;----- only for VENC_RC_MODE_H264FIXQP ----------243.IQp=20244.245.PQp=23 246.247.[bind]248.249.V iDev =0 250.251.ViChn =0 252.253.VpssGrp =0 254.255.VpssChn = 0 256.257.VencGrp =0 258.259.VencChn =0 260.261.VoDev =0 262.263.VoChn =0 264.265.V iSnapChn =0266.267.VpssSnapGrp=0 268.269.V pssSnapChn=1 270.271.VencSnapGrp=1 272.273.VencSnapChn=1。
芯片sdk手册芯片SDK(Software Development Kit)是指为特定芯片或硬件平台提供的软件开发工具包,它包括了编程接口、驱动程序、库文件、示例代码等,用于帮助开发者设计和开发应用程序。
以下是对芯片SDK手册的详细介绍:一、SDK概述1. SDK是Software Development Kit的缩写,意为软件开发工具包。
2. 芯片SDK是为特定芯片或硬件平台提供的开发工具包,包含了开发该平台所需的各种软件组件。
3. 芯片SDK通常由芯片制造商提供,以帮助开发者快速开发出适用于该芯片的应用程序。
二、SDK内容1. 编程接口:SDK提供了编程接口,开发者可以通过这些接口来访问芯片的硬件功能,如传感器、控制器等。
2. 驱动程序:SDK包含了芯片的驱动程序,用于控制和管理芯片的硬件组件。
3. 库文件:SDK提供了各种库文件,这些库文件包含了常用的功能实现,如数据处理、网络通信等。
4. 示例代码:SDK提供了示例代码,用于指导开发者如何使用SDK开发应用程序。
5. 文档:SDK包含了详细的文档,描述了SDK的使用方法、接口定义、功能说明等。
三、SDK使用1. 安装SDK:开发者需要根据芯片平台下载并安装相应的SDK。
2. 学习文档:开发者应该仔细阅读SDK提供的文档,了解SDK的使用方法和功能。
3. 编写代码:开发者可以使用SDK提供的编程接口和库文件来编写应用程序代码。
4. 调试测试:开发者需要使用调试工具来测试和调试应用程序,确保其正常运行。
5. 部署应用:完成应用程序的开发和测试后,开发者可以将应用程序部署到相应的芯片平台。
四、SDK优势1. 提高开发效率:SDK提供了预编译的组件和函数,可以节省开发者的时间和精力。
2. 降低开发难度:SDK提供了详细的接口定义和示例代码,降低了开发者对硬件的了解要求。
3. 优化性能:SDK通常由芯片制造商提供,可以充分利用芯片的硬件特性,优化性能。
海思HI35XX之---音频模块使用总结
AUDIO 模块包括音频输入、音频输出、音频编码、音
频解码四个子模块。
音频输入和
输出模块通过对Hi35xx 芯片SIO 接口的控制实现音频输入输出功能。
音频编码和解码模块提供对G711、G726、ADPCM 格式的音频编解码功能,并支持录制和播放LPCM格式的原始音频文件。
音频输入输出接口SIO(Sonic Input/Output),用于和Audio Codec 对接,完成声音的录制和播放。
对每个SIO 接口的音频输入和音频输出功能,软
件分别用AI 和AO 两个模块来管理,称之为AI 设备和AO 设备,并按照SIO 序号为其编号。
例如与SIO0 接口对应的软件设备分别为AiDev0 和AoDev0。
HI3518录音和播放原理:
录音:原始音频信号以模拟信号的形式给出后,通
过Audio Codec,按一定采样率和采样精度转换为数字信号。
Audio Codec 以I2S 时序或PCM 时序的方式,将数字信号传输给SIO 接口,SIO 支持多路复用的接收模式。
Hi35xx 芯片利用DMAC 将SIO 接口中的音频数据保存到内存中,
完成录音操作。
播放:Hi35xx 芯片利用DMAC 将内存中的数据。
概述海思方案和雄迈方案是目前市场上常见的两种物联网设备方案。
本文将比较海思方案和雄迈方案在以下几个方面的差异:硬件设计、软件支持、应用领域和性能指标等。
硬件设计海思方案海思方案采用高性能处理器和低功耗芯片,确保设备的稳定性和性能。
它支持多种通信接口,如Wi-Fi、蓝牙、以太网等,可以与其他设备进行快速、可靠的通信。
海思方案的硬件设计较为简单,适用于大规模生产,并具有较低的成本。
雄迈方案雄迈方案采用先进的硬件设计,可实现更高的处理能力和更稳定的通信性能。
它具有多种外设接口,如USB、HDMI、SD卡等,方便用户进行扩展和连接。
雄迈方案在硬件设计上更加灵活,适用于个性化需求,但成本相对较高。
软件支持海思方案海思方案提供了完善的软件支持,包括开发工具、开发文档和示例代码等。
开发者可以使用海思的开发工具进行应用程序开发和调试,以及定制化开发。
海思方案支持多种操作系统,如Linux、Android等,为开发者提供了更多的选择和灵活性。
雄迈方案雄迈方案也提供了丰富的软件支持,包括开发工具、SDK和驱动程序等。
与海思方案类似,雄迈方案也支持多种操作系统,以适应不同的开发场景。
用户可以根据自己的需求选择相应的开发工具和操作系统,进行应用程序的开发和调试。
应用领域海思方案海思方案在智能家居、工业自动化、智能交通等领域得到广泛应用。
其低功耗、高性能的特点,使得海思方案在物联网设备中具有较大的竞争优势。
海思方案的硬件设计简单,适用于批量生产和规模化应用。
雄迈方案雄迈方案在视频监控、智能安防等领域具有广泛的应用。
其高性能的处理能力和稳定的通信性能,使得雄迈方案在要求较高的应用场景中表现出色。
雄迈方案的硬件设计灵活,适合个性化定制和特殊需求。
性能指标海思方案海思方案的处理能力和功耗表现良好。
具体性能指标将根据不同型号和配置而有所不同。
海思方案的主频、内存容量和接口数量等都能满足大多数物联网设备的需求。
雄迈方案雄迈方案在处理能力和通信速度方面表现出色。
概要●电压输入:3.0V~3.6V●工作环境温度:-40℃to +85℃●处理器:Hi3861(L)处理器,主频高达160MHz●存储器▪352K字节的SRAM▪288K字节的ROM▪2M字节的XIP Flash●Wi-Fi▪IEEE 802.11 b/g/n 1T1R 2.4GHz单频(ch1~ch14)▪支持HT20,72.2Mbps@MCS7▪支持WPA/WPA2 PSK,Open/WEP/ TKIP/CCMP,▪支持WPS 2.0▪支持IEEE Power Save 节能模式▪支持RF 自校准方案▪支持STA 和AP形态,作为AP 时最大支持6 个STA●功耗Ultra Deep Sleep 模式:5μ******内置Hi3861处理器▪DTIM1:**********▪DTIM3:**********内置Hi3861L处理器▪DTIM1:0.9*******▪DTIM3:**********▪DTIM10:250u A@3.3V●接入丰富的外设▪13 x GPIO▪7 x ADC 通道▪ 3 x UART,支持硬件流控制▪ 1 x SPI,1 x I2S▪ 2 x I2C▪ 1 x SDIO▪ 6 x PWM接口和尺寸▪保持与同类封装模组的引脚兼容性▪邮票孔或插针▪适用于照明应用的白色PCB油墨▪板载PCB天线,18 mm x 20 mm●丰富的配套软件▪支持LiteOS操作系统▪支持HarmonyOS操作系统▪提供Hilink云平台接入SDK●典型应用▪智能家电▪智能电工产品▪工业自动化●订货代号订货代号说明EMW3010-PZI6 板载PCB天线,Hi3861处理器EMW3010-PI6A 板载PCB天线,Hi3861L超低功耗处理器EMW3010-EZI6 外接天线IPEX座,Hi3861处理器EMW3010-PZI6-TR 板载PCB天线,Hi3861处理器,卷带包装EMW3010 Wi-Fi物联网模组内置华为海思Hi3861 Wi-Fi Soc,接入华为物联网平台专用2.4G Hz IEEE 802.11 b/g/n,超高集成度,丰富的外设版本:1.4 日期:2021-08-25 编号:DS0160CN系列订货代码例如EMW 3 01 0 -P ZI 6 A -xxx产品系列EMW = 物联网Wi-Fi模组产品类型3 = 焊接类无线模组典型目标应用和功能01 = IOT物联网应用1系列外形尺寸,增强功能0 = 2 x 9 pins 1.5间距邮票孔射频接口P = 18 mm x 20 mm,2.4GHz板载PCB天线Z = 18 mm x 20 mm,2.4GHz 外置天线IPEX接口PSRAM容量(可选)Z=不含PSRAMJ=4M字节的PSRAM温度范围6 = 工业级温度范围,-40°C~85°C可选项A = 使用超低功耗处理器Hi3861L(默认使用Hi3861)可选项TR = 卷带包装(默认使用托盘)如需了解所有相关特性清单(如包装,最小订单量等)和其他方面的信息,请联系就近MXCHIP销售点和代理商。
海思Hi35xx平台调试笔记1、进⼊板⼦debug环境 (根据⾃⼰情况)1) mount /dev/sda3 /root/disk2) minicom3) nfspc:sudo vi /etc/exports/root/disk/hi3516 *(rw,sync,no_root_squash,no_subtree_check)sudo /etc/init.d/nfs-kernel-server restartsudo /etc/init.d/rpcbind restartsudo ifconfig eth1 172.16.23.157board:ifconfig wlan1 172.16.23.158mount -t nfs -o nolock 172.16.23.157:/root/disk/hi3516 /root/hi3516注意海思sdk⾥的mpp⽬录名不要改动,改了会导致sample编译出错。
2、⾳视频数据循环采集a. 在sample_venc.c⽂件中,海思官⽅是把采集到的数据都保存到⽂件中,我们需要更改到缓存⾥,以便后⾯推送到rtsp/rtmp/hls服务端。
for (i = 0; i < s32ChnTotal; i++){if (FD_ISSET(VencFd[i], &read_fds)){/*******************************************************step 2.1 : query how many packs in one-frame stream.*******************************************************/memset(&stStream, 0, sizeof(stStream));s32Ret = HI_MPI_VENC_Query(i, &stStat);if (HI_SUCCESS != s32Ret){SAMPLE_PRT("HI_MPI_VENC_Query chn[%d] failed with %#x!\n", i, s32Ret);break;}/*******************************************************step 2.2 : malloc corresponding number of pack nodes.*******************************************************/stStream.pstPack = (VENC_PACK_S*)malloc(sizeof(VENC_PACK_S) * stStat.u32CurPacks);if (NULL == stStream.pstPack){SAMPLE_PRT("malloc stream pack failed!\n");break;}/*******************************************************step 2.3 : call mpi to get one-frame stream*******************************************************/stStream.u32PackCount = stStat.u32CurPacks;s32Ret = HI_MPI_VENC_GetStream(i, &stStream, HI_TRUE);if (HI_SUCCESS != s32Ret){free(stStream.pstPack);stStream.pstPack = NULL;SAMPLE_PRT("HI_MPI_VENC_GetStream failed with %#x!\n", \s32Ret);break;}/*******************************************************step 2.4 : save frame to file*******************************************************/HisiPutH264DataToBuffer(&stStream);/*s32Ret = SAMPLE_COMM_VENC_SaveStream(enPayLoadType[i], pFile[i], &stStream);if (HI_SUCCESS != s32Ret){free(stStream.pstPack);stStream.pstPack = NULL;SAMPLE_PRT("save stream failed!\n");break;}*//*******************************************************step 2.5 : release stream*******************************************************/s32Ret = HI_MPI_VENC_ReleaseStream(i, &stStream);if (HI_SUCCESS != s32Ret){free(stStream.pstPack);stStream.pstPack = NULL;break;}/*******************************************************step 2.6 : free pack nodes*******************************************************/free(stStream.pstPack);stStream.pstPack = NULL;}}b. HI_S32 HisiPutH264DataToBuffer(VENC_STREAM_S *pstStream)函数⽐较重要HI_S32 HisiPutH264DataToBuffer(VENC_STREAM_S *pstStream){HI_S32 i,j,x;HI_S32 len=0,off=0,len2=2,uplen=0;unsigned char *pstr;int iframe=0;for (i = 0; i < pstStream->u32PackCount; i++){len+=pstStream->pstPack[i].u32Len;}if(n<NMAX){for (i = 0; i < pstStream->u32PackCount; i++){memcpy(ringfifo[iput].buffer+off,pstStream->pstPack[i].pu8Addr,pstStream->pstPack[i].u32Len); off+=pstStream->pstPack[i].u32Len;pstr=pstStream->pstPack[i].pu8Addr;if(pstr[4]==0x67){UpdateSps(pstr+4,pstStream->pstPack[i].u32Len-4);iframe=1;}if(pstr[4]==0x68){UpdatePps(pstr+4,pstStream->pstPack[i].u32Len-4);}}ringfifo[iput].size= len;if(iframe){// printf("I");ringfifo[iput].frame_type = FRAME_TYPE_I;}else{ringfifo[iput].frame_type = FRAME_TYPE_P;// printf("P");}iput = addring(iput);// printf("(%d)",iput);// fflush(stdout);n++;}return HI_SUCCESS;}c. VENC_STREAM_S相关结构体//定义帧码流类型结构体:typedef structhiVENC_STREAM_S{VENC_PACK_S *pstPack; //帧码流包结构。
海思HI3531 4路高清SDI 1080P开发板使用手册海思HI3531 4路高清SDI 1080P开发板使用手册��、简介1) 开发板图片2) 资源情况主芯片为海思Hi3531带4片2Gbit DDR,一共1Gbyte带2个千兆网口,PHY为RTL8211EG带音频输入输出,均支持双声道立体声,AD/DA芯片为TLV320AIC31IRHBR 带4个TTL UART串口(其中包括一个调试串口)带2个SATA口,均带PM功能,可以接扩展模块,扩展为更多SATA口带1个时钟芯片DS1339带1个HDMI输出,可支持1080P@60fps 带1个VGA输出,可支持2560x1600@60fps 带2个USB输出,可以接USBHUB扩展更多USB口带4路SDI输入接口,可以支持4路1080P视频,AD芯片为GV7601 带2路CVBS输出带JTAG/PCIE/IR/GPIO/蜂鸣器等其他接口一、接线和启动拿到开发板之后,首先接好串口线(注意,不管什么接口,请在断电情况下插拔)如上图所示,J11为缺省的调试串口,带有箭头标记的为第一管脚接好串口线后打开串口调试工具超级终端或者其他调试工具都可以,下面的例子以putty为例,波特率设为115200,打开串口,然后上电 12V(内正外负)可以看到嵌入式操作系统开始启动启动完成输入ifconfig可以看到板子的IP情况如果接好网线,可以telnet到板卡,进行相关操作。
如果遇到串口不能输入的情况,请关掉软件,重新打开这个串口,或者重新插拔一下串口线二、启动示例程序板卡启动之后就是一个嵌入式linux系统,可以输入各种linux命令板子里面/nand/目录下带有各种例子,可以运行查看1)解码H264文件通过HDMI输出的例子请先接好HDMI显示器,然后运行 cd/nand./sample_vdec 0然后选0,选择frame mode就可以看到海思自带的一个例子,这个例子解码同级目录下的stream_chn0.h264,然后输出到HDMI显示器2) 解码H264文件通过VGA输出的例子请先接好VGA显示器,然后运行 cd /nand./sample_vdec 33) 视频输入直接输出到视频输出的例子请先接好VGA或者HDMI显示器 cd /nand. /sample_vio 2然后输入1 选择多画面分割模式可以看到 SDI的输入源显示在显示器上4) 其他例子请自行摸索测试三、SDK的安装与编译请通读SDK包中的 \\01.software\\board\\documents_cn 目录下的相关文档请注意,本板卡,已经烧写了uboot和内核文件系统,并且启动已经加载了海思相关驱动如果不小心擦除了uboot,可以通过海思自带的FastBoot3.1_BVT.exe烧写恢复,具体可以参看海思相关文档如果要执行SDK中的load3531脚本,请修改为4hd模式,并且去掉sil9024.ko驱动的加载详细情况,可以参考SDK中的文档,大概步骤如下1) 安装虚拟机软件推荐VirtualBox2) 在虚拟机上安装Linux系统,可以选择Ubuntu 等 3) 在Linux上安装GCC等编译器和开发相关工具4) 在Linux上解压缩Hi3531_SDK_VX.X.X.X.tgz 的压缩包 5) 在Linux上安装跨平台编译器arm-hisiv200-linux-gcc6) 编写Hello Word程序,然后通过arm-hisiv200-linux-gcc 编译,然后把编译后的程序放到Hi3531板卡上运行(配置好NFS可以加快开发进度) 7) 编译sdk中的sample,放到Hi3531板卡上运行四、系统资源简介SDI输入一共有4路 J7 ~ J10 分别接GV7601芯片J7 对应U1 对应VIU0/SIO0 J8 对应U2 对应VIU1/SIO1 J9 对应U3 对应VIU2/SIO2 J10 对应U4 对应VIU3/SIO3感谢您的阅读,祝您生活愉快。
DirectFB总结第一、DirectFB 简介1、DirectFB是一个轻量级的提供硬件图形加速,输入设备处理和抽象的图形库,它集成了支持半透明的视窗系统以及在LinuxFramebuffer驱动之上的多层显示。
它是一个用软件封装当前硬件无法支持的图形算法来完成硬件加速的层。
DirectFB是为嵌入式系统而设计。
它是以最小的资源开销来实现最高的硬件加速性能。
2、DirectFB所处结构层次如图:DirectFB依赖于Frame Buffer层。
在使用DirectFb之前,必须先对FB进行初始化。
通常Generic GFX Driver模块主要是检查是否有能被DirectFb加速的硬件,如果有,就由GFX drivers 模块对硬件进行加速。
如果没有,则直接软件操作。
下图为DirectFB的组成模块:从这五个文件可以看出,DirectFb主要由这五部分组成:Gfxdrivers:上面有所介绍,主要是对硬件进行加速。
Inputdrivers:主要是对输入设备的驱动,如(鼠标,键盘等输入设备)。
Interfaces:主要包括图片解码接口,视频解码接口,字库接口等。
Systems:系统接口,如(处理时钟,多线程处理等)。
Wm:用于窗口管理等。
第二、DirectFB 中一些主要数据类型之间的关系层(Layers)表示一块儿独立的图像缓冲区。
大多数的嵌入式设备都有多个层。
他们由硬件使用合适的alpha值来blending,然后显示。
表面(Surface)用来保存像素数据的保留内存区域。
DirectFB的Drawing和blitting操作最终都是作用于表面(surfaces)上.表面的内存可以从显存(video memory)(MMZ)得到,也可以从系统内存(system meomroy)得到,这由给定的限制决定。
主层(Primary Surface)表示特定层的frame buffer的特殊表面。
如果主表面是单缓冲的,任何作用到这个主层的操作,都会直接在屏幕上见到。
海思方案软件现如今,随着科技的飞速发展,人们在日常生活中越来越多地接触到各种智能设备。
而这些智能设备背后的重要组成部分就是芯片。
其中,海思方案软件作为一种领先的芯片方案,受到了广泛关注。
一、海思方案软件简介海思方案软件是HiSilicon(海思半导体)公司推出的一种芯片方案,该公司是华为旗下的全资子公司,致力于研发高性能、低功耗的芯片解决方案。
海思方案软件广泛应用于各种智能设备,例如手机、电视、摄像机等,其卓越性能和稳定性备受用户青睐。
海思方案软件的一个主要特点是提供了完善的软件开发包(SDK),这使得软件开发人员能够轻松地开发出高效、稳定的应用程序。
此外,海思方案软件还提供了丰富的开发工具和调试接口,可方便开发人员进行调试和优化,从而提高软件开发效率。
二、海思方案软件的应用1. 手机领域如今的智能手机功能越来越强大,而海思方案软件的出色表现使得其在手机领域得到广泛应用。
海思方案软件提供了稳定、高效的操作系统(如Android系统),使得用户可以在手机上流畅地运行各种应用程序。
同时,它还支持多种通信技术,例如4G/5G网络、Wi-Fi等,使得手机在连接网络和传输数据方面具有出色性能。
2. 电视领域电视作为家庭生活的重要娱乐工具,对于画质和音效的要求越来越高。
海思方案软件提供了先进的图像处理和解码技术,使得电视的画质更加清晰,色彩更加鲜艳。
同时,海思方案软件还支持多媒体播放,用户可以通过电视观看高清视频、收听高保真音乐,享受沉浸式的家庭娱乐体验。
3. 摄像机领域随着物联网的快速发展,摄像机的应用范围越来越广泛。
海思方案软件在摄像机领域的应用表现出了强大的实力。
它提供了高清的图像采集和处理功能,使得摄像头可以捕捉到更加清晰、细腻的图像。
此外,它还支持智能识别技术,能够对图像进行实时分析和处理,满足用户对于安全防护和智能监控的需求。
三、海思方案软件的优势1. 高性能海思方案软件通过先进的芯片设计和优化,能够提供卓越的性能。
1,1 inux驱动程序介绍1.1 linux驱动程序在系统中的角色Linux分为用户态和内核态,一般应用程序是在用户态执行,他们通过一系列的系统调用同内核态进行交互。
驱动程序是内核与硬件的接口,它把系统调用映射到具体设备对于实际硬件的特定操作上,关系如下图所用户空间 ----- ----------内栈空间通过这种方法,应用程序就可以像操作普通文件一样操作硬件设备,用户程序只需要关心这个抽象岀来的文件,而一切同硬件打交道的工作都交给了驱动程序。
1.2 linux驱动的类型linux系统将设备分为3类:字符设备、块设备、网络设备,摄像机常用的外围设备(如I2C,串口,SPI, GPIO, PWM等)均属于字符设备,tf卡驱动属于块设备,网卡相关驱动属于网络设备。
字符设备与块设备的区别:1、字符设备是面向流的,最小访问单位是字节;而块设备是面向块的,最小访问单位是512字节或2的更高次幕。
2、字符设备只能顺序按字节访问,而块设备可随机访问。
3、块设备上可容纳文件系统,访问形式上,字符设备通过设备节点访问,而块设备虽然也可通过设备节点访问,但一般是通过文件系统来访问数据的。
而网络设备没有设备节点,是因为网络设备是面向报文的,很难实现相关read、write等文件读写函数。
所以驱动的实现也与字符设备和块设备不同。
1.3 linux驱动的一些重要概念设备号把所有设备都当作文件,为了管理这些设备,系统为它们各自都编了号,而每个又分为和。
主设备号用来区分不同类型的设备,而次设备号用来区分同一类型内的多个设备(及其设备分区)。
在建立字符驱动时需要做的第一件事是获取设备号。
设备号的分配方式一般有2种,静态分配和动态分配,静态分配设备号,就是驱动程序开发者,静态地指定一个设备号。
对于一部分常用的设备,linux内核开发者已经为其分配了设备号。
这些设备号可以在内核源码documentation/devices.txt 文件中找到。
如果只有开发者自己使用这些设备驱动程序,那么其可以选择一个尚未使用的设备号。
当添加新硬件时,很可能造成设备号冲突,影响设备的使用。
为了解决手动分配设备号存在冲突的问题,内核开发者提出动态分配设备号的方法。
使用该方法驱动程序在加载的时候,通过linux内核提供的专门的函数动态获取设备号。
int alloc_chrdev_regi on( dev_t *dev, un sig ned basem inor, un sig ned count, const char *n ame)设备节点linux系统中对所有设备的访问都是基于文件的形式。
对于每一种设备,在加载驱动程序的时候都会在/dev目录下创建一个文件,这个文件就是设备节点。
对于每一个设备节点,在实际运行时,linux系统通过VFS (虚拟文件系统)来完成将文件的各种系统调用与具体的驱动程序函数之间的映射。
设备节点可以通过mknod命令在系统启动的时候手动创建,也可以通过udev自动创建。
在驱动用加入对udev的支持主要做的就是:在驱动初始化的代码里调用内核提供的API向内核注册驱动信息class_create : 创建classclass_device_create : 仓U建device驱动加载时会在/sys/class目录下生成与该模块相关的信息,同时用户空间中的udev 会自动响应device_create(…)函数,去/sysfs下寻找对应的类从而创建设备节点。
驱动初始化时,需要完成以下工作:1,通过alloc_chrdev_region() 及相关函数分配主/次设备号。
2,使用device_create() 创建/dev 和/sys 节点。
3,使用cdev_init() 和cdev_add() 将自身注册为字符驱动程序。
混杂设备考虑到有的系统包含很多简单字符设备驱动,单独为这些设备分配设备号比较浪费资源,同时工作量也很大,linux系统针对这些情况推出了一种叫混杂设备模型的驱动框架(miscellaneous )。
混杂设备主要有2个特征:1)所有的misc设备被分配同一个主设备号MISC_MAJOR(10),但是可以选择一个单独的次设备号。
如果一个字符设备驱动要驱动多个设备,那么它就不应该用misc设备来实现;2 )混杂设备驱动初始化时,只需要执行简单的一个注册函数,即可自动完成设备号分配,设备节点创建,向内核注册等工作,极大的简化了驱动初始化流程。
硬件IO操作IO端口与IO内存x86体系和ARM体系的寻址方式是有差别的:在x86下,为了能够满足CPU高速地运行,内存与CPU之间通过北桥相连并通过地址方式访问,而外设通过南桥与CPU相连并通过端口访问。
因为这两种访问方式的不同,linux分出了两种不同的访问操作:以地址方式访问硬件-- 使用IO内存操作。
以端口方式访问硬件一一使用IO端口操作。
在ARM下也实现了类似的操作,通过两条不同的总线(AHB BUS和APB BUS) 来连接不同访问速度的外设。
但是它与x86不同,无论是内存还是外设,ARM 都是通过地址访问。
在ARM下,访问寄存器就像访问内存一样一一从指定的寄存器地址获取数据,修改。
所以,ARM下一般是使用IO内存的操作。
但这并不是说IO端口的操作在ARM下不能用,它们的代码差不多,只是没有使用的必要,下面也将介绍IO 内存操作。
如何使用IO内存获得硬件的地址我们不能在linux使用实际的物理地址,要对指定的物理地址进行操作,必须要先将物理地址与虚拟地址对应,通过虚拟地址访问。
于是有了以下的物理地址映射函数:函数传入两个参数,需要访问的物理内存(寄存器)的首地址phys_addr和这段内存区域的大小size,返回与该段物理地址对应的虚拟地址。
这段地址可以多次被映射,当然,每次映射的虚拟地址也不一样。
phys = 0x200f0000; 〃1、指定物理地址virt = (unsigned Iong)ioremap(phys, 0x0c); 〃2、通过ioremap 获得对应的虚拟地址//0x0c表示只要12字节的大小GPECON = (unsigned long *)(virt + 0x40); 〃3、指定需要操作的寄存器的地址*GPECON &= ~(3 << 24); // 配置GPE12为输出端口为了实现更好的移植性,上面的程序就有缺陷了。
内核建议,尽量使用内核提供的参照硬件说明,通过对寄存器的控制实现操作硬件硬件说明文档驱动的调试Linux设备模型linux系统作为开源的下系统,支持世界上大部分的硬件,导致Linux内核看上去非常臃肿、杂乱、不易维护。
为了优化,linux系统从2.6版本开始提出了全新的设备模型(也称作Driver Model)概念。
设备模型将硬件设备归纳、分类,然后抽象出一套标准的数据结构和接口。
驱动的开发,就简化为对内核所规定的数据结构的填充和实现。
1)Linux设备模型中包含四个重要概念:Bus、Class Device、Device Driver。
Bus (总线):Bus (总线)是一类特殊的设备,它是连接处理器和其它设备之间的通道(channel )。
在设备模型中,所有的设备都通过总线相连,甚至是那些内部的虚拟平台总线(platform bus).Class (类):在Linux设备模型中,Class的概念非常类似面向对象程序设计中的Class (类),它主要是集合具有相似功能或属性的设备,这样就可以抽象出一套可以在多个设备之间共用的数据结构和接口函数。
因而从属于相同Class的设备的驱动程序,就不再需要重复定义这些公共资源,直接从Class中继承即可。
Device (设备):抽象系统中所有的硬件设备,描述它的名字、属性、从属的Bus、从属的Class等信息。
Device Driver (驱动):Linux设备模型用Driver抽象硬件设备的驱动程序,它包含设备初始化、电源管理相关的接口实现。
而Linux内核中的驱动开发,基本都围绕该抽象进行(实现所规定的接口函数)。
2)Linux设备模型的运行机制配对(Match):当总线上添加了新设备或者新驱动函数的时候,内核会调用一次或者多次这个函数。
举例,如果我现在添加了一个新的驱动函数,内核就会调用所属总线的match函数,配对总线上所有的设备,如果驱动能够处理其中一个设备,函数返回0,告诉内核配对成功。
探测(probe)当配对(match)成功后,内核就会执行device_driver中的probe回调函数,而该函数就是所有driver的入口,可以执行诸如硬件设备初始化、字符设备注册、设备文件操作ops注册等动作。
所以说,真正的驱动函数入口是在probe函数中。
卸载(remove)当该驱动函数或者驱动函数正在操作的设备被移除时,内核会调用驱动函数中的remove函数调用,进行一些设备卸载相应的操作。
platform 设备针对一些可以通过CPU直接寻址的设备(比如集成在嵌入式SOC芯片上的控制器,CPU可以直接访问其寄存器),linux内核在设备模型的基础上(device和device_driver),对这些设备进行了更进一步的圭寸装,抽象出paltform bus、platform device和platform driver,以便驱动开发人员可以方便的开发这类设备的驱动。
paltform设备对嵌入式Linux驱动开发是非常重要的,因为我们编写的大多数设备驱动,都是为了驱动plaftom设备。
Other drivers由图片可知,Platform设备在内核中的实现主要包括三个部分:Platform Bus ,基于底层bus模块,抽象岀一个虚拟的Platform bus ,用于挂载Platform 设备;Platform Device ,基于底层device 模块,抽象岀Platform Device ,用于表示Platform 设备;Platform Driver ,基于底层device_driver 模块,抽象岀Platform Driver,用于驱动Platform 设备。
Linux platform_driver 机制和传统的device_driver 机制(通过driver_register 函数进行注册)相比,最大的区别在于platform 机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序中使用这些资源时通过platform_device 提供的标准接口进行申请并使用。
这样提高了驱动和资源管理的独立性,并且拥有较好的可移植性和安全性(这些标准接口是安全的)。
platform机制的本身使用并不复杂,由两部分组成:platform_device 和platfrom_driver 。