V1.0 / 指南 / 中文

TXW81x 视频方案开发指南

泰芯半导体LOGO 2022版本透明底

责任与版权

责任限制

由于产品版本升级或者其他原因,本文档会不定期更新。除非另行约定,泰芯半导体有限公司对本文档所有内容不提供任何担保或授权。

客户应在遵守法律、法规和安全要求的前提下进行产品设计,并做充分验证。泰芯半导体有限公司对应用帮助或客户产品设计不承担任何义务。客户应对其使用泰芯半导体有限公司的产品和应用自行负责。

在适用法律允许的范围内,泰芯半导体有限公司在任何情况下,都不对因使用本文档相关内容及本文档描述的产品而产生的损失和损害进行超过购买支付价款的赔偿(除在涉及人身伤害的情况中根据适用的法律规定的损害赔偿外)。

版权申明

泰芯半导体有限公司保留随时修改本文档中任何信息的权利,无需提前通知且不承担任何责任。

未经泰芯半导体有限公司书面同意,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。除非获得相关权利人的许可,否则,任何人不能以任何形式对前述软件进行复制、分发、修改、摘录、反编译、反汇编、解密、反向工程、出租、转让、分许可等侵犯本文档描述的享有版权的软件版权的行为,但是适用法禁止此类限制的除外。

修订记录

日期

版本

描 述

修订人

2023-11-10

V1.0

初始版本

TX

1. 概述

本文主要描述视频开发流程。

本文档主要适用于以下工程师:

  • 技术支持工程师
  • 方案软件开发工程师

本文档适用的产品范围:

型号

封装

包装

TXW81x

2. 硬件开发板

为了快速入门和方案评估,我们提供各种应用场景的开发板。

2.1. 音视频开发板

2.1.1. 音视频开发板接口介绍

底板(3)

图2.1.1.1 音视频开发板主视图

特殊说明

模式启动按键:此按键可以一键拯救系统,在芯片上电即跑死,cklink烧写和其他升级都失效的情况下使用。

3. 视频开发配置流程

3.1. 视频方案相关配置

方案配置主要看project_config.h配置,以下配置都是基于sdk的图传协议。

1699609178355

  1. USB_EN 启动USB摄像头
  2. DVP_EN 启动DVP摄像头
  3. VPP_EN 为DVP的下层接口模块,方便后面增加mipi接口
  4. PRC_EN 为PRC功能,用于将摄像头(如SPI摄像头,或者固定的yuv数据图像)输入的yuv数据自动传输到JPEG中
  5. JPG_EN 启动JPG的功能,两个JPG均能使用
  6. LCD_EN 启动LCD控制器
  7. SCALE_EN SCALE功能打开,SCALE包含1、2、3个模块,请细读scale说明
  8. SDH_EN、FS_EN是sd卡与文件系统初始化
  9. NEW_FRAME 用于支持数据流处理功能,默认打开
  10. OPENDML_EN 在需要录像的时候,需要启动(仅仅支持sdk的录像格式,其他格式需要自己实现)

4. DVP摄像头

4.1. DVP摄像头相关参数配置

采用VGA摄像头的时候, IMAGE_W与IMAGE_H配置为VGA。对应宏定义#define CMOS_AUTO_LOAD 1打开(位于project_config.h),可以自动选择所有支持的摄像头,如果不使用自动选择,只希望支持某一款摄像头,则将对应摄像头的宏打开,例如:#define DEV_SENSOR_GC0308 1(位于project_config.h),支持的摄像头以及宏定义在csi.h,如图:

图片包含 表格

描述已自动生成

720p摄像头处理形式分两种:

  1. 外接isp芯片
  2. 自带isp功能摄像头

如果所需支持摄像头为无isp功能摄像头,则需外接isp芯片,目前已适合两款isp芯片,XC7016和XC7011。当然,如果芯片直接支持isp功能,能正常输出已处理好的YUV数据,则可直接接到本主控上。在配置上IMAGE_W与IMAGE_H配置为720P。

4.2. DVP摄像头添加

请参考已有摄像头的配置文件sensor_xxx.c,先添加摄像头的配置文件,并记录对的数据结构体_Semsor_Adpt_与_Sensor_Ident。

_Sensor_Ident包含当前摄像头的读写命令,命令与数据操作长度,ID地址与ID值,在sensorCheckId中使用此配置信息去判断,当前插入的摄像头是否吻合此配置。

_Sensor_Adpt_包含的重要信息有pixelw,pixelh,hsyn,vsyn,init,mclk。pixelw与pixelh为当前图像配置的输入分辨率。hsyn与vsyn为当前摄像头的配置中,hsync与vsync的有效电平是高电平还是低电平。mclk为当前配置摄像头被插入时,系统给此摄像头提供的mclk频率。init为当前摄像头的初始化配置信息,默认配置输出为yuyv。

配置摄像头的配置文件sensor_xxx.c配置好后,请在csi.h中加入对应的声明,并在devSensorInitTable与devSensorOPTable添加对应摄像头的信息。

4.3. VPP功能说明

VPP模块其实是从80x中的DVP模块中抽离出来,并再进行更多功能优化的独立模块。此模块方便后面外设增加除DVP以外,如MIPI接口等外设时,可用作通用接口。

4.3.1. VPP已有功能优化

  1. linebuf空间优化,相对于80x的固定32行linebuf,81x的linebuf数量可配置为16行以上,最高32行,在效率影响不大的情况下,可尽量减少linebuf的配置,更有效地节省空间。
  2. 裁剪功能去除,80x是有输入裁剪功能,即摄像头配置为VGA,但DVP的接收分辨率可减少提取。81x此功能去消,并增加缩放功能到scale1中,scale1数据可直达jpeg,并不占用sram空间。scale1的注意事项请查看scale章节。
  3. RGB格式支持取消,目前使用上基本以yuv422为主,80x支持的RGB到jpg通路取消,只支持接收yuv422与raw数据,并且只有yuv422格式能到mjpeg。
  4. 数据流输出源增加,相对于80x的DVP只能输出到memory和mjpeg两个方向外,81x可以输出到屏端,SCALE1和SCALE3端。scale1为图像到mjpeg前的图像伸缩功能模块。scaler3为图像到lcd前的图像伸缩功能模块。具体请查看scale章节。VPP只负责采集数据,通过输出端的使能来自动获取对应的数据。

4.3.2. VPP新增加功能

  1. VPP在保留配置图像size的基础上,增加了双路VPP buf1的可选模式,buf0模式为常开状态,buf1模式可选择打开关闭,buf1相对buf0,增加了图像缩小功能,缩小为固定的1/2或者1/3,如需使用qvga,建议使用此功能,不使用scaler进行缩小是因为大比例缩小,需要linebuf更多,在空间使用角度上考虑,并不值得。
  2. 水印功能。水印功能增加,添加了两种模式的水印操作方式,一为画图模式,即直接定义水印的长宽,根据bit的情况进行显示,可用于图标上显示。二为列表模式,列表模式是在画图的基础上,增加了index寄存器,最大16个index,用于时间水印方面的操作,软件只需将对应的显示素材准备好,在VPP完成中断时去修改index的指向,即可方便地修改对应的时间水印。素材需4byte对齐,并且存放到sram上,否则可能存在提取速度不够的可能性。
  3. 相框功能。相对于水印的颜色单调,相框功能可让图像显示出色彩丰富的图框,并且数据经过简单的压缩,且增加了透明色功能,可用于儿童相机或者色彩要求高的图标需求。其压缩的方式和透明色的标识,与屏端的osd压缩共用同一套系统,逻辑请查看“推屏类.ppt”中关于osd压缩功能的介绍。
  4. 移动监测功能。移动监测功能是将图像划分为多个大小相等的区域,并设置一个监测的阀值,通过监测到是否有足够多的区域超过所设置的阀值,进行中断提醒。
  5. 增加了拍照模式,为了方便大比例的图像放大,如VGA到8K,增加了拍照模式功能,此功能一旦打开,VPP会将图像数据从Linebuf自动拷贝到psram,让psram能自动组成一张yuv原图,后期再经过scale1进行拉伸处理,有效地提高图像处理速度。

4.3.3. VPP中断

VPP中断在继承80x上的行中断,帧中断外,还增加了数据完成中断,拍照模式异常中断,拍照模式完成中断,相框异常中断,移动监测中断,水印异常中断。对应中断号请查看csi_v2.c相关代码。

4.3.4. api接口说明

请查看对应文档“视频-摄像头.ppt”中关于api部分说明。

4.4. mjpeg编码参数配置

1699609497845

TXW81x总共有两路mjpeg,mjpeg0/mjpeg1。两路mjpeg均可编码,数据源可来自vpp0,vpp1,prc,scale1。mjpeg1有解码功能,解码后经过scale2伸缩后,数据可到memory,用于推屏。

mjpeg的总size配置为JPG_NODE*(JPG_BUF_LEN+JPG_TAIL_RESERVER),宏定义参考project_config.h文件,JPG_BUF_LEN不能过小,这个是决定mjpeg的中断频率,JPG_BUF_LEN越大(根据剩余内存空间配置),一张完整图的中断越少,效率以及出错情况越少,JPG_NODE是节点数,mjpeg中断会从JPG_NODE的节点池获取节点,如果节点不够,那么当前编码的图片会由于内存不足丢掉,JPG_TAIL_RESERVER是用于自定义参数,如果不需要,设置为0,JPG_HEAD_RESERVER是头保留,也是自定义,不需要可以设置为0,在官方sdk中是默认0,会在sdk本身图传协议上使用,空间由可存放在sram或者psram,当前均采用空间申请的方式进行处理。

1699609665898

图片的压缩情况,请参考函数jpg_quality_tidy,此函数在中断中调用,用于通过当前图片的大小来控制图像质量的调整方向,可理解为此函数为jpg图片大小的控制范围。但此函数只是期望值,并不是一定能控制到距离实际太大的范围,如将720P的图片压缩大小控制在20K以内,这种是无法压缩出来这种大小的,压缩的大小与当前使用的量化表与微调值相关,量化表请参考quality_tab,目前提供了6张量化表,客户有需要,可自行修改。微调是指在此量化表外,还能进行依据当前使用量化表进行数据16个等级的微调,等级8为量化表不变,1~7质量向上优化,9~F质量向下调整。

请查看对应文档“视频-摄像头.ppt”中关于mjpeg api部分说明。

4.5. DVP图片的获取流程

DVP图片获取接口如图:(jpgdef.h),代码可以查看AT_save_photo.c(拍照)和AT_save_avi.c(录制视频),这个流程是数据流的流程,将大部分硬件配置都配置好(video_app.c),如果采用sdk默认的配置,可以直接通过这个流程获取到对应图片。

以上截图的宏只是为了兼容旧版本的宏名称接口,实际后续使用stream_frame.c的函数就可以了,以下针对函数名去解释接口,并且结合代码分析:

  1. 首先获取图片帧get_f=recv_real_data(stream*s)获取的是struct data_structure结构的get_f,里面包含图片的数据、长度以及时间戳参数。
  2. void *data_priv = get_stream_real_data(get_f),这里获取的是实际内容,如果是图片,这里就是图片的所有数据(因为内存原因,这里图片以节点形式保存,比较特殊,如果是音频,则就是整个音频buf的起始地址)。
  3. len = get_stream_real_data_len(get_f),获取get_f的长度,如果是图片,就是图片长度,如果是音频,就是音频buf的长度。
  4. node_len = stream_data_custom_cmd_func(get_f,CUSTOM_GET_NODE_LEN,NULL),整个是获取图片一个节点的大小(这个命令是获取图片特有),因为图片以链表形式保存,所以要知道节点最大的大小。
  5. buf = stream_data_custom_cmd_func(f,CUSTOM_GET_NODE_BUF,d),这个获取的是节点的buf,就是图片实际内容,遍历的时候,就是将所有buf读取出来就是图片,注意这的f不是struct data_structure的结构,这个是jpeg的产生图片特定的结构体struct stream_jpeg_data_s中的data(一个私有结构),最后获取到buf,然后通过node_len读取图片内容。

  1. stream_data_custom_cmd_func(get_f,CUSTOM_DEL_NODE,d),注意d是一个结构体struct stream_jpeg_data_s,这个结合代码看才行。
  2. free_data(get_f)就是删除get_f,将空间还原。

下图是一个伪代码,显示使用流程,细节处理可以参考AT_save_photo.c文件的拍照功能:

2fe7581d3945fa07820de9b245d9404

4.6. DVP数据流说明

DVP → JPG数据流的生成步骤与基本思想如下:

  1. JPG数据buf以节点的形式分配好
  2. DVP采集足够的行数据
  3. JPG提取压缩
  4. 当JPG压缩出来数据量到达所配置的数据buf长度或者图片获取结束,生成out_buf_full或者done中断(详情请看jpg模块api函数说明)
  5. 中断里记录好节点的情况并分配下次jpg数据所存放的节点位置
  6. 若done中断完成,重组jpg图片

其中,jpg数据buf节点分配,请查看jpg_room_init函数,这里特说明,frame根节点2个,即jpg_frame[2],分别被jpg_p(中断)与usr_p(应用)指针指向,用于表示对应frame的使用是在中断还是在应用。除了jpg_frame的两个根节点外,还有free_tab一个根节点,用于管理由free_table_init中生成的众多空间子节点。每个空间子节点都会绑定自己专属的空间,图片数据存放则存放到此众多空间中,整帧图片数据并不连续,但能根据jpg_frame的应用节点查找到图片数据排布并进行数据重组。

4.7. DVP重要打印说明

    • 打印信息“sip reset DVP”,DVP采集出错,请检查摄像头是否插好,或者配置表中信息是否与IMAGE_W、IMAGE_H一致,如果IMAGE_W与IMAGE_H配置为720P,配置表配置为VGA,则会出现此打印,因为采集数据上出问题。还有一种情况,配置表中的hsync和vsync的有效电平配置出错,即配置表中hsync和vsync的有效电平与_Semsor_Adpt_里面的配置不匹配,这样也会造成采样出错的情况。
    • 打印信息“fh”和“fv”,DVP处理速度跟不上采集速度,“fh”表示在数据没处理完的情况下,上次采集的buf已改写了一半。“fv”表示在数据没处理完的情况下,上次采集的buf已被改写。出现这种问题有可能是DVP的CLK分配过高,CPU处理不过来,或者DVP中断中处理的事情过多,影响到处理效率。
    • 打印“jpg done len err”,这种情况有两种可能性,一是CPU处理不过来,即JPG的压缩率不高,图像太大,CPU在多次中断才响应一次。第二种情况是,软件buf空间不足,节点不够(参考数据流说明)。针对第一种情况,处理方式为提高代码的运行速率(xip的运行速度,请查看《TXW81x TXProgrammer工具使用文档》)、提升节点的空间大小或者降低图像的质量。第二种情况处理方式为提升代码运行速率,降低图像质量或者在空间允许的情况下,增加节点的数量。
    • 打印“?”,这种情况为JPG出现异常了,代码会复位DVP和JPG,如持续打印这个,请检查是否图片空间过小,但图像生成太大,无法满足整张图片的存放。

5. SPI摄像头

5.1. SPI摄像头配置

  1. SPI摄像头配置表跟DVP摄像头一样,配置流程也跟DVP相似,但SPI摄像头没有像DVP一样的mclk功能引脚,所以会使用PWM充当摄像头的时钟源xclk。
  2. cs引脚与vsync引脚,此两引脚无需接上,代码硬件是通过vsync与hsync的时钟间隔(检查clk停止时间),来进行帧同步与行同步。
  3. 摄像头的支持,我们是充当SPI从机,spi_clk要求是在有数据的情况下才出spi_clk,不支持spi_clk持续输出的配置方式。
  4. vsync与hsync支持头数据裁剪功能,用于排除非图像数据,头数据的多少请在配置好摄像头的情况下,捉取摄像头输出的信号,根据信号情况,配置头裁减大小。
  5. 内容接收,采用乒乓buf机制,即同时配置两个接收buf,满一buf数据后起一次中断。
  6. SPI模块支持SPI摄像头均采用ioctl进行配置,配置功能如下,代码请查看spi_sensor.c:

1699667762229

1699667850137

  1. 在读取数据的配置中,请注意SPI_WIRE_SINGLE_MODE的模式配置,这配置与摄像头输出情况相关,如若配置错,会出现数据错位,图像异常的情况。

1699668030322

5.2. PRC功能联合SPI摄像头

上一小节中提到,SPI摄像头是经过乒乓BUF机制提取数据,每提取满一buf数据,则会响应一次中断,此时只需我们开启PRC功能,则能将SPI摄像头输入的yuv数据格式yuyvyuyv重新排列为yyyyuuvv。这样重排的意义有两个,一为可很高效地提取y数据到同一个位置,方便我们去做一些图像运算,如定高,二维码,条型码等。二为可让数据能以统一的格式输入到jpg,这样子则可让mjpeg很好地提取PRC的数据,并进行SPI摄像头的图像压缩。下图代码为将prc配置成跟SPI摄像头单buf数据一样的行数据,即16行的配置,在SPI接收完后再启动prc数据重排序。

1699668688679

1699668680413

注:

  1. PRC跟VPP一样,只需自身启动即可,其他输出模块如需提取PRC作为输入源,则修改输出模块的输入源来源即可,无需配置PRC的输出方向。
  2. PRC与jpeg的同步问题,因为PRC只是数据重排,无法知晓当时是否为首行,mjpeg在启动之前,PRC如果正在提取非首行的数据,则会出现图像错行的情况,请做好PRC与mjpeg的同步问题,即在启动mjpeg时,明确当前PRC是正处理帧间隔的时间下,这样同步才能保证图像无异常。

6. SCALE模块

SCALE模块分三种,分为scale1,scale2,scale3。功能说明如下。

6.1. scale1

scale1是用于将VPP图像数据进行伸缩功能,并传输到mjpeg中进行图像压缩。放大接口使用:

scale_from_vpp_to_jpg:在放大2K以下,均可用此接口进行放大缩小,并同步修改photo_msg.out0_h 与photo_msg.out0_w的scale输出size,让mjpeg配置成所需的size。

1699670452559

同步需要将jpeg的输入源修改为scale。

1699670546346(1)

1699670558859

注:缩小倍数如果过大,则需要增加VPP所需要的Linebuf,否则scale1会报错。所以在缩小倍数过大时,可使用VPP的buf1功能,可缩小1/2和1/3。

在放大超过2K的情况下,使用VPP的拍照模式,VPP的拍照模式会将图像以yuv420的格式存放到psram中,scale1再调用接口scale_from_soft_to_jpg则可以将图像拉伸到最大8K的size。

6.2. scale2

scale2是用于mjpeg解码后屏显的模块,此模块是mjpeg解码后,直接经过scale2伸缩后以yuv420的格式存放到memory,屏此时即可使用video输出到屏上,达到显示的目的。

jpg_decode_scale_config:scale2显示初始化

jpg_decode_to_lcd :需解码的图像地址,解码前的分辨率与伸缩后的分辨率

6.3. scale3

scale3是用于VPP进行图像伸缩后进行推屏显示。scale3输入源可分为VPP与缓存输入模式,输出源分为直接到屏端或者到memory(sram/psram)。

初始化配置到屏端的,请查看scale_to_lcd_config,用宏SCALE_DIRECT_TO_LCD来决定是否直接输出到屏还是输出到memory,这个初始化配置为输入源是VPP的情况。

输入源为缓存,即将原有的yuv420数据拉伸到不同分辨率的yuv420分辨率,使用接口scale_to_lcd_config_soft进行初始化,目前是配置为拉伸为满屏的操作。

7. LCDC屏显说明

屏数据源来源于video与osd,video有两路,由photo0与photo1组成,可独立配置。osd有一层,格式支持256色,rgb565,rgb888。

7.1. osd推屏

请查看lvgl_run代码中

if(disp_updata == 1){

。。。。。

}

disp_updata = 0;

此部分如不使用lvgl,可进行移植,osd空间为osd_menu565_buf,代码会对此空间进行压缩,以乒乓buf的形式传送到osd_encode_buf与osd_encode_buf1,再由屏端通过此两buf进行刷屏。客户无需关注压缩与刷屏逻辑,只需针对osd_menu565_buf进行修改即可。

注:osd存在压缩功能与透明色功能,会从色表中取出两个色彩进行功能确定,函数为:

int32 lcdc_set_osd_enc_head(struct lcdc_device *p_lcdc, uint32 head, uint32 head_tran)

head :压缩头数据,配置后会将此数据当成压缩数据的起始数据

head_tran :源数据中如存在压缩头,则由head转换成head_tran

如配置压缩头为0xffff,则

源色彩数据:8080 8080 8080 8080 8080 8080 8080 8080

压缩后数据:ffff 0008 8080

int32 lcdc_set_osd_enc_diap(struct lcdc_device *p_lcdc, uint32 diap, uint32 diap_tran)

diap :透明色数据

diap_tran :遇到透明色后转换成其他数据,如需透明色,则diap_tran跟diap一样即可。

7.2. video推屏

video由photo0\photo1组成,可分别配置对应的video显示的位置,亦可选择是否使能对应的photo,目前photo0用于通用DVP推送video显示,photo1用于解码后video显示。

photo0\photo1可配置任一放在高优先级

video可由scale3直接推送到屏,但此模式下无法旋转,并且帧率需与DVP相同。常用做法为直接读取memory后推屏,memory数据为yuv420格式。

7.3. jpeg推屏

jpg图像作为常用的图像格式,用作示推屏显示接口,请使用

void jpg_decode_to_lcd(uint32 photo,uint32 jpg_w,uint32 jpg_h,uint32 video_w,uint32 video_h)

Photo :jpg图片源数据

jpg_w、jpg_h :jpg图片的长宽

video_w、video_h :解码video大小

注:此接口需提前准备好解码数据存放空间,代码中已使用video_decode_mem,video_decode_mem1,video_decode_mem2三指针做好空间处理,只需提前做好指针空间预指向即可,可参考代码void lv_page_select(uint8_t page)中page == 0与page == 1代码

7.4. 源数据推屏

如已准备好yuv420源数据,可直接通过接口void lcd_user_frame(uint32 frame_addr)进行推屏,此函数内部只做video_decode_mem,video_decode_mem1,video_decode_mem2三指针做好空间处理。

7.5. 屏配置

typedef struct _lcd_desc_s{

。。。。

}lcddev_t;

例:

1698736878602

元素说明:

name :屏名字

lcd_bus_type :屏接口(rgb,8080,6800)

color_mode :屏输出模式(rgb565,rgb666,rgb888)

scan_mode :屏旋转

te_mode :mcu屏是否存在te IO

colrarray :输出色彩顺序

pclk :dotclk频率,从主频240M分频

screen_w、screen_h :屏宽高

video_w、video_h :video数据源长宽

video_x、video_y :video的开始坐标

osd_w、osd_h :osd数据源长宽

osd_x、osd_y :osd的开始坐标

init_table :屏配置表

pclk_inv :dotclk反向

de_en :DE io功能使能

vs_en :vsync io功能使能

hs_en :hsync io功能使能

de_inv :de io反向

vs_inv :vsync io反向

hs_inv :hsync io反向

vlw、vbp、vfp、hlw、hbp、hfp配置需读取屏配置表,相关的无效行,无效列,有效区域与可视区域。

1698736069046

7.6. 旋转问题

屏显模块,只有video有旋转功能,osd无旋转功能。旋转角度为0,90,180,270四种,而180度的旋转需要注意空间分配,YUV数据偏移跟0,90,270有所不同,此外用宏LCD_SET_ROTATE_180进行控制。在video显示中,如果不需要旋转,可以配置屏端ioctl LCDC_SET_VIDEO_MODE。不旋转,无需申请旋转所需的linebuf 空间,lcdc_set_rotate_linebuf_XXX_addr,此空间跟屏宽与所需性能相关,屏越宽,需求性能越好,则这个空间需要更大,LCD_ROTATE_LINE为控制此部分的宏。

7.7. 屏驱动api

请查看文档“推屏类.ppt”,结合代码了解模块中存在的功能及其api的使用。

8. USB摄像头

8.1. USB摄像头参数配置

宏定义:UVC_BLANK_LEN是节点的大小, UVC_BLANK_NUM节点数量,在无psram的情况下, UVC_BLANK_NUM需要足够大, UVC_BLANK_NUM*UVC_BLANK_LEN起码需求1.5张图片的size大小,否则图片会被丢弃,在由psram的情况下, UVC_BLANK_NUM可以小一点,最后所有图片数据都会放在psram中,UVC_BLANK_LEN不宜过小,默认12*1024 byte,UVC_FRAME_NUM代表图片的帧,默认值为2。

图片包含 图形用户界面

描述已自动生成

在分辨率选择上,默认分辨率请修改uvc_default_dpi里的返回值,当前默认有两种UVC_VGA和UVC_720P。在传输中途若想修改摄像头的分辨率,请使用usb的ioctl功能,例如:

C:\Users\rongw\AppData\Local\Temp\1652413702(1).png

如果摄像头有接入hub,也同样可用IOCTL配置,
USB_HOST_IO_CMD_INSERT_HUB功能。

8.2. USB摄像头获取过程

(实际宏定义与DVP摄像头的一样,调用函数名称改成uvc的实现)

uvc图片获取接口如图:(jpgdef.h)

文本

描述已自动生成

  1. 首先获取图片帧f = GET_JPG_FRAME(),如果获取到代表已经获取到整一张图片,图片的组成是以节点形式连接,只要通过循环读取就能获取到整一张图。
  2. GET_JPG_LEN(f)获取一张图片的size。
  3. GET_JPG_buf(f)获取图片帧的首个节点。
  4. FREE_JPG_NODE(f)释放图片帧首个节点。
  5. GET_NODE_LEN(f)获取一个节点的长度(图片帧内所有节点长度都是一样的,所以获取到图片帧最后一个节点的时候,实际内容<= GET_NODE_LEN(f),所以处理最后一帧的时候,应该根据图片size计算最后节点的实际内容的大小)。
  6. DEL_JPG_FRAME(f)删除图片帧,同时归还所有节点,在图片帧使用完毕后,需要调用该接口去释放,否则导致图片帧丢失,后续获取不到图片帧。

伪代码:

图形用户界面, 文本, 应用程序

描述已自动生成

8.3. USB重要打印说明

    • 打印“babble error”,此打印说明信号线接触不良,系统会重新reset usb,要是持续打印babble error,则需要确定usb线是否正常。
    • 打印“disconnect................”,此打印为设备掉线打印,这种掉线有接触不良掉线或者主动排插掉线,系统会重新reset usb。
    • 打印“XXX Err”和“Enum ERR”,此类打印为设备在枚举过程中枚举失败,系统会重新reset usb。
    • 打印“uvc can not set resolution :720p”,此类打印为在不支持720P的摄像头上配置了720P输出,会默认改为VGA输出。
    • 打印“_D3_”,此类打印为摄像头的UVC图像出错,如果这部分打印过多,请确定摄像头是否正常。
    • 打印“_D1_”和“_D2_”时,表明当前的数据缓存空间不足,如果是跑无psram的方案下,持续打印这个的情况下,请确认图像是否大小超过默认size,7*12K,如果是,请修改摄像头的输出大小。如果此打印非持续出现,但也高频率出现,表明cpu处理不过来,请提高代码的运行效率(XIP的运行速率,请查看《TXW81x TXProgrammer工具使用文档》)。