rtos能直接显示usb camera apk吗

当前位置: >>
如何使用EZ-USB
AN75779如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口作者: Karnik Shah 关联项目:有 软件版本: FX3 SDK1.2.3 相关应用笔记: AN75705USB 3.0 提供的高带宽对用于将外设连接至 USB 的各个 IC 提出很高的要求。本应用笔记重点介绍了一种 USB 3.0 的流行 ? 应用:摄像头(即连接到 EZ-USB FX3?的图像传感器)将非压缩数据输送给 PC。应用笔记突出介绍了特定设计 FX3 的 特性,以便能够最大化数据吞吐量而不影响接口的灵活性。本应用笔记也提供了有关 USB 视频类别(UVC)的实施细节。 符合该类别的摄像设备能够使用内置的 PC 驱动程序和主机应用程序(如 AMCap 和 VLC 媒体播放器)进行运行。最后, 本应用笔记还指出了如何使用 FX3 中灵活的图像传感器接口连接两个图像传感器,以便实现三维(3D)图象和移动跟踪应 用。目录1. 简介 ...............................................................................2 2. USB 视频类别(UVC) .................................................3 2.1 枚举数据 .................................................................3 2.2 工作代码 .................................................................3 2.3 USB 视频类别要求 ..................................................3 3. GPIF II 图像传感器接口 .................................................9 3.1 图像传感器接口 ......................................................9 3.2 图像传感器接口的引脚映射情况 ........................... 10 3.3 乒乓 DMA 缓冲区 .................................................. 10 3.4 设计策略 ............................................................... 12 3.5 GPIF II 状态机 ...................................................... 12 3.6 使用 GPIF II Designer 实现图像传感器接口 .......... 14 4. 设置 DMA 系统 ............................................................ 23 4.1 DMA 缓冲区的相关内容 ........................................ 26 5. FX3 固件...................................................................... 27 5.1 应用线程 ............................................................... 29 5.2 初始化................................................................... 29 5.3 枚举 ...................................................................... 29 5.4 使用 I C 接口配置图像传感器 ............................... 29 5.5 启动视频流 ........................................................... 29 5.6 设置 DMA 缓冲区 .................................................. 29 5.7 在视频串流期间中处理 DMA 缓冲区 ..................... 30 5.8 帧结束时进行清理 ................................................. 30 5.9 终止视频流 ........................................................... 30 5.10 增加“调试”接口 ............................................... 3026. 硬件设置 ...................................................................... 34 6.1 硬件采购 ............................................................... 34 6.2 FX3 DVK 板设置 ................................................... 34 7. 基于 UVC 的主机应用 .................................................. 35 7.1 运行演示 ............................................................... 35 8. 故障排除 ...................................................................... 36 9. 连接两个图像传感器 .................................................... 36 9.1 使用 UVC 传输交错图像 ....................................... 37 9.2 固件修改检查表 .................................................... 38 10. 总结 ........................................................................... 39 11. 关于作者 .................................................................... 39 12.文档修订记录 ............................................................. 40 全球销售和设计支持 ........................................................ 41 产品 ................................................................................. 41 PSoC 解决方案............................................................... 41?www.cypress.com文档编号:001-92220 修订版**1 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口1. 简介USB 3.0 提供的高带宽对用于将外设连接至 USB 的各个 IC 提出很高的要求。一个流行的示例就是摄像头将非压缩数据 输送到 PC 中。在本应用笔记中,通过使用赛普拉斯的 EZ? USB FX3? 芯片可以实现转换器的功能,该转换器的一端 连接到图像传感器,另一端则通过 USB 3.0 连接至主机 PC。FX3 使用它的第二代通用可编程接口(GPIF II)来提 供图像传感器接口,并通过其超速 USB 单元连接至 PC。 FX3 固件将来自图像传感器的数据转换为符合 USB 视频类 (UVC)的格式。符合此类别的摄像设备能够使用 OS 内 置的驱动程序进行操作,使摄像头与主机应用(如 AMCap 和 VLC 媒体播放器)相互兼容。 图 1. 摄像头应用图 1 描述的是摄像头应用。左侧是一个带有超速 USB 3.0 端口的 PC ,而右侧是一个具有下面各项特性的图像传感 器:? ? ? ? ? ? ?8 位同步并行数据接口 每个像素为 16 位 YUY2 颜色空间 分辨率为 1280 x 720 个像素(720p) 30 帧每秒 帧/行有效信号均为高电平有效 正向时钟边沿极性Image SensorHost PCUSB 3.0Converter (FX3)Clock Sync Data[7:0] Control (I2C)即使应用笔记讨论了一个特定的图像传感器接口,上面所述 的是多种图像传感器接口的通用特性,即使可能有轻微差 异,如数据总线宽度和信号极性。基于 GPIF II 模块的可编 程性质,这些变化很容易作出调节适应。此外, FX3 会使 2 用其 I C 接口实现控制总线,用作配置图像传感器。 图 2 显示的是系统框图更加详细的信息。为框图的主要子 模块进行编号,这些任务由下述的各个子模块执行:图 2. 系统框图USB Host USB Bulk IN EP USB3 Video Control USB EP0 Video Data FX3 PCLK Frame Valid DMA Channel Data GPIF II Line Valid Data bus Reset# Image SensorVideo Host Application (AMCap) UVC Driver USB Host Controller Data325Firmware UVC Class DescriptorGPIO64I2C Master I2C control11. 提供正确的 USB 描述符,保证主机能够识别符合 UVC 的外围设备。有关详细信息,请参考第 2 节中的内 容。 2. 实现连接到图像传感器的并向总线连接可通过使用 FX3 GPIF II 接口实现该操作。通过使用名称为 GPIF II Designer(GPIF II 设计程序)的赛普拉斯工具,可以 在图形状态机编辑器中自定义设计波形。由于该接口是 可编程的,因此稍作更改也能将其自定义为其他图像传 感器,例如并向总线可配置为 16 位数据总线。有关详 细信息,请参考第 3 节中的内容。3. 构建一个 DMA,它会将来自 GPIF II 模块上图像传感器 的数据转移到 USB 接口模块( UIB )内。在本应用 中,必须将头数据添加到图像传单器内的视频数据中, 以符合 UVC 规格的要求。因此应配置 DMA,以允许 CPU 将所需的头数据添加到 DMA 缓冲区内。该通道 必须设计使最大带宽满足将视频从图像传感器输送到 PC 的要求。有关详细信息,请参考第 4 节中的内容。 2 4. 使用 FX3 I C 主控来控制图像传感器的总线。通过赛普 2 拉斯的标准库调用可对 I C 和 GPIO 单元进行编程,有 关内容在第 5.4 节中进行了介绍。www.cypress.com文档编号:001-92220 修订版**2 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口5. FX3固件初始化FX3的硬件模块(第5.2节),枚举成为 一个 UVC 摄像头(第 2.3.1 节),处理 UVC 特定请求 2 (第 2.3.2 节),通过 I C 接口将视频控制设置(如亮 度)传输给图像传感器(第5.4 节),将UVC头数据添 加到视频数据流 ( 第2.3.4 节)) ,将带有头数据的视频 数据提交给USB(第5.7节),以及维持GPIF II状态机 (第5.8节)。 6. 主机应用(如AMCap或VLC媒体播放器)将存取UVC驱 动程序,以通过 UVC 控制接口配置图像传感器,并通 过 UVC 流接口接收视频数据。欲了解有关基于 UVC 的 主机应用的详情,请参考第7节。 如果将摄像头插入 USB 2.0 端口,FX3 固件会使用 I2C 控 制总线将帧率从 30 FPS 下降到 15 FPS ,并将帧大小从 1280 x 720 个像素降低到 640 x 480 个像素,以匹配较低 的 USB 带宽。 PC 主机可以选用控制接口,将亮度、平 移、倾斜和缩放等调整内容传输给摄像头。一般可同时实现 平移、倾斜和缩放,并被称为 PTZ。图 3. 摄像头架构的 UVC 图Custom RequirementsIT112EU33PU2OT4EP3-IN描述符还包括了视频属性(如宽度、高度、帧率、帧大小和 位深度)以及控制属性(如亮度、曝光、增益、对比度和 PTZ)等内容。2.2 工作代码主机枚举摄像头后,UVC 驱动程序会向摄像头发出一系列 请求,以确定工作特征。该操作叫做能力请求阶段。请求阶 段先于串流阶段,其中主机应用会启动串流视频。 FX3 固 件会响应到达 USB 控制端点(EP0)的请求。 例如,假设 UVC 器件表明它支持某个 USB 描述符中的亮 度控制。在能力请求阶段,UVC 驱动程序查询器件,以发 现相关的亮度参数。 当主机发出一个请求要求更改亮度值时, UVC 驱动程序将 发 出 ‘ SET ’ ( 设 置 ) 控 制 请 求 , 用 以 更 改 亮 度 值 (SET_CUR) 同样,当主机应用需要选择输送一个受支持的视频格式 /帧 率/帧大小时,它会发出输送请求。共有两种类别的请求: PROBE 和 COMMIT。PROBE 请求用于确定 UVC 器件是 否准备好接受串流模式的切换。串流模式是图像格式、帧大 小和帧率的组合。2. USB 视频类别(UVC)要符合UVC,则需要下面两个FX3代码模块: 1. 枚举数据 2. 工作代码2.1 枚举数据应用笔记附带的代码包括名称为 cyfxuvcdscr.c 的文件 (在第 2.3.1 节中说明),该文件包含 UVC 的枚举数据。 可从 usb.org 上获取用于定义 UVC 描述符的 USB 规范。本 节介绍了高阶观点的描述符。 UVC 器件具有以下四个逻辑 元素: 1. 2. 3. 4. 输入摄像头终端(IT) 输出端(OT) 处理单元(PU) 扩展单元(EU)2.3 USB 视频类别要求本应用笔记的固件项目位于名称为 USBVideoClass 的文件 夹内。本节介绍了示例项目如何满足 UVC 的要求。UVC 要 求设备执行下列任务:这些元素在描述符中互相连接,如图 3 所示。通过将描述 符中的各终端编号连接起来,可连接上述各元素。例如,输 入(摄像头)终端描述符声明了其 ID 为 1;处理单元描述 符的输入连接的 ID 为 1 ,所以逻辑上表示他连接至输入 端。输出端描述符制定使用哪个 USB 端点, 在本情况下是 BULK-IN 端点 3。? ? ? ?使用 UVC 特定的 USB 描述符进行枚举 处理 USB 描述符所记录的 UVC 控制和输送能力的 UVC 特定 SET/GET 请求 以符合 UVC 的颜色格式进行输送视频数据 添加一个符合 UVC 的标头到每个图形载荷内可在 UVC 规范中了解这些要求的详情。 2.3.1 UVC 的 USB 描述符 cyfxuvcdscr.c 文件含有 USB 描述符的表格。字节阵列 “ CyFxUSBHSConfigDscr ” ( 高 速 ) 和 “CyFxUSBSSConfigDscr ”(超速)包含了 UVC 特定的 描述符。这些描述符执行下面各子描述符树:www.cypress.com文档编号:001-92220 修订版**3 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口?配置描述符? ?接口关联描述符 视频控制(VC)接口描述符 ? VC 接口标头描述符 o 输入(摄像头)终端描述符 o 处理单元描述符 o 扩展单元描述符 o 输出端描述符 ? VC 状态中断端点描述符UVC 规范已将这些功能分好了类,您可轻松安排实现该类 别指定的控制请求。但实现上述功能是应用特定的。通过将 相应的功能位设置为‘1’,可以在各自终端/单元描述符的 位字段“bmControls”(cyfxuvcdscr.c)中记录所支持的 控制功能。在枚举时,UVC 器件的驱动程序会轮询控制的 详细信息。通过 EP0 请求实现轮询的细节。所有相似的请 求 ( 包 括 视 频 流 请 求 ) 均 由 uvc.c 文 件 中 的 UVCAppEP0Thread_Entry 函数处理。 2.3.1.2 视频流接口 视频流接口描述符以及它的子描述符记录了各种帧格式(如 非压缩、MPEG、H.264)、帧的分辨率(宽度、高度和位 深度)以及帧率。根据所记录的值,主机应用可以选择通过 改变所支持的帧格式、帧分辨率和帧率的组合来切换串流模 式。 VS 接口的输入标头描述符指定了下面 VS 格式描述符的数 量。 VS 格式描述符包含了图像的长宽比和颜色格式,如非压缩 或压缩格式。 VS 帧描述符包含了图像的分辨率以及该分辨率的帧率。如 果摄像头支持不同的分辨率,则多个 VS 帧描述符会遵循 VS 格式描述符。 BULK-IN 视频端点描述符是一个标准的 USB 端点描述符, 它包含的有关批量端点可用于输送视频的信息。 本示例中使用单一的分辨率和帧率。其图像的特性包含在三 个描述符中,如下面三个表格所示的内容(只有相关的字节 偏移量显示)。?视频流(VS)接口描述符 ? VS 接口输入标头描述符 VS 格式描述符 o VS 帧描述符?BULK-IN 视频端点描述符配置描述符是一个标准的 USB 描述符,它定义了 USB 设 备在其子描述符中的功能。接口关联描述符用于向主机表明 该设备是否属于标准 USB 类别。此处,该描述符使用了下 面两个接口来上报符合 UVC 的设备:视频控制(VC)接口 和视频流(VS)接口。因为 UVC 器件具有两个独立的接 口,因此它是一个 USB 复合器件。 2.3.1.1 视频控制接口 VC 接口描述符及其子描述符将上报所有与控制接口有关的 能力。示例包括亮度、对比度、色调、曝光和 PTZ 等控 制。 VC 接口标头描述符是一个 UVC 特定的接口描述符,它表 明了该 VC 接口属于哪一个 VS 接口。 输入(摄像头)终端描述符、处理单元描述符、扩展单元描 述符以及输出端描述符均包含了各个位字段,这些位字段说 明了相应终端或单元所支持的特性。 摄像头终端控制着机械(或等效数字)特性,比如传输视频 流的设备的曝光和 PTZ。 处理单元控制着图像的各项属性,如正在流过它的视频的亮 度、对比度以及色调。 与标准的 USB 供应商要求相似,扩展单元可以添加供应商 指定的特性。在该设计中,扩展单元是空白的,但仍包含了 该描述符,作为自定义功能的占位符。请注意,如果利用可 改扩展单元,则标准主机应用将无法认出其特性,除非修改 主机应用使其能识别这些特性。 输出端用于描述这些单元(IT、PU、EU)和主机之间的接 口。 VC 状态中断端点描述符是一个用于中断端点的标准 USB 描述符。该端点可用于传输 UVC 特定的状态信息。该 端点的此功能属于本应用笔记范围外的内容。表 1. VS 格式描述符的值VS 格式描述符 字节偏移量 23-24 特性 长宽比 超速值 16:9 高速值 4:3表 2. VS 帧描述符的值VS 帧描述符字 节偏移量 5-8 特性 分辨率 (宽,高) 17-20 图像的最大尺 寸,单位为字节
(2 个字节/像 素) 0x51615 (30 FPS) 640x480x2 (2 个字节/ 像素) 0xA2C2A (15 FPS) 超速值
高速值 640x48021-24,或 26-29帧间隔,单位为 100 nswww.cypress.com文档编号:001-92220 修订版**4 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口请注意,多字节数值会先列出最低有效位(LSB)(低位优 先),因此,例如帧率为 0x,即 33.33 毫秒,或 30 FPS。 表 3. 探针/提交结构的值探针/提交 结构的字节 偏移量 2 3 4-7 特性 格式索引 帧索引 帧间隔,单位为 100 ns 图像的最大尺 寸,单位为字节 1 1 0x51615 (30 FPS)
(2 个字节/像 素) 超速值 1 1 0xA2C2A (15 FPS ) 640x480x2 (2 个字节/ 像素) 高速值? ? ?GET_DEF 用于读取默认值 GET_LEN 用于读取属性大小,单位为字节 GET_INFO 用于查询特定性能的状态/支持情况。针对已给的属性,UVC 规范将上述请求定义为强制或可选 的。例如,如果 SET_CUR 请求对于一种特殊性能是可选 的,则通过 GET_INFO 请求可确定它是否存在。如果摄像 头不支持性能的某个请求,在主机向摄像头发出请求时必须 通过搁置控制端点来指出这一点。 这些请求中的字节字段符合其目标性能。这些字节字段分层 次,它具有与第 2.3.1 节中所述的 UVC 特定描述符相同的 结构。第一层用以识别接口(视频控制还是视频流) 如果第一层确认该接口是视频控制,则第二层将确认终端或 者单元,并且第三层确认该终端或单元的性能。例如,如果 目标性能为亮度控制,则:18-21可以修改该设计,通过更改上述三个表格中的输入项来支持 不同的图像分辨率,比如 1080 p。 2.3.2 UVC 特定的请求 UVC 规范使用了 USB 控制端点 EP0,使之能够向 UVC 器 件进行控制和传输所请求的通信。这些请求用于发现并更改 与视频相关的控制属性。UVC 规范将这些与视屏相关的控 制内容定义为性能。通过这些性能您可以更改图像属性或输 送视频。性能(第一项内容)可以是视频控制属性(如亮 度、对比度和色调),也可以是视频串流模式的属性(如颜 色格式、帧大小和帧率)。通过 USB 配置描述符的 USB 特定部分,可以记录其性能。每个性能都带有其属性。各项 性能的属性如下所述:? ? ?第一层用于视频控制 第二层用于处理单元 第三层用于亮度控制如果第一层确认该接口为视频流,则第二层将为 PROBE (探针)或 COMMIT(提交)。这样便不存在第三层。当 主机需要 UVC 器件启动输送或更改串流模式时,主机会先 确定器件是否支持新的串流模式。要确定该项,主机会发出 一系列的 SET 和 GET 请求,并将第二层设为 PROBE。器 件可接受或拒绝对串流模式进行的更改。如果器件接受更改 请求,则主机将通过发出 SET_CUR 请求并把第二层设为 COMMIT 进行确认。图 6 显示的是主机和器件间的互动。 下面三个流程图显示的是主机与 UVC 器件间的互动情况。? ? ? ? ?最小值 最大值 最小值和最大值之间值的数量。 默认值 当前值SET 和 GET 是两类 UVC 特定请求。SET 用于更改属性的 当前值,而 GET 则用于读取属性。 下面是 UVC 特定请求的列表:? ? ? ? ?SET_CUR 是 SET 唯一请求的类型 GET_CUR 用于读取当前值 GET_MIN 用于读取支持的最小值。 GET_MAX 用于读取支持的最大值。 GET_RES 用于读取分辨率(步长值表示最小值和最大 值之间受支持的数值)www.cypress.com文档编号:001-92220 修订版**5 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口图 4. UVC 枚举以及探索流程HOST Enumerates UVC Device, reads camera properties from CONFIG descriptor.图 5. 主机应用更改了摄像头的设置App changes a Video Control property from X to YHOST prepares a list of N supported Video Control properties.HOST sends GET_CUR request for the propertyDevice sends value XHOST retrieves details for all N properties: GET_MIN, GET_MAX, GET_RES, GET_DEF, GET_CUR, GET_INFO, GET_LENHOST sends SET_CUR request for the property with value YDevice updates property to YEnd of Discovery当 UVC 插入到 USB 时,主机将枚举它,并发现摄像头支 持的属性的细节(图 4)。 在视频运行期间,摄像头的操作者可能会在主机应用所提供 的显示对话框中更改摄像头的属性(如亮度)。图 5 显示 了此种交互情况。HOST sends GET_CUR request for the propertyDevice sends value YHOST verifies change was successful进行输送前,主机应用将发出一些探针请求,用以发现可能 的串流模式。确定了默认串流模式后,UVC 驱动程序将发 出 COMMIT 请求。图 6 显示了该过程。在该端点结束, UVC 驱动程序可以从 UVC 器件输送视频。www.cypress.com文档编号:001-92220 修订版**6 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口图 6. 主机与摄像头之间进行预输送时的对话框HOST starts Discovery of supported modes (PROBE: GET_MIN, GET_MAX, GET_DEF, GET_CUR)占位符函数实现 USB 侧的控制。你必须写入代码,以实现 图像传感器特定的 PTZ。 注意:本应用笔记中所描述的所有功能均在 uvc.c 文件中 实现,除非另有提及。该文件是存储在 USBVideoClass 文 件夹中项目的一部分(该文件夹位于本应用笔记附带的源代 码 zip 文件中)。 主机应用(通过 EP0 )向处理单元发出视频控制请求,用 以控制亮度。通过 CyFxUVCApplnUSBSetupCB 函数, 可以处理所有设置请求。该函数可检测到主机是否已经发出 了 UVC 特定的请求(控制或流),然后设置一个事件标 志: “CY_FX_UVC_VIDEO_CONTROL_REQUEST_EVENT ”或 “CY_FX_UVC_VIDEO_STREAM_REQUEST_EVENT” 。此时,函数 UVCAppEP0Thread_Entry(EP0 应用线 程)会处理该标志。 亮度控制请求将触发视频控制请求的事件标志。正在等待触 发这种标志的 EP0 应用线程会对视频控制请求进行解码, 并 调 用 相 应 的 函 数 。 EP0 应 用 线 程 调 用 UVCHandleProcessingUnitRqts 函 数 用 以 处 理 亮 度 请 求。 更改 UVCHandleProcessingUnitRqts 函数,以实现处理 与单元相关的控制项(亮度、对比度、色调等)。更改 UVCHandleCameraTerminalRqts 函数,以实现摄像头终 端控制。更改 UVCHandleExtensionUnitRqts 函数,以实 现所有供应商制定的请求。要支持这些控制,您必须设置 USB 描述符中的相应位。UVC 规范包括摄像头终端、处理 单元和扩展单元 USB 描述符等详细信息。 2.3.2.2 串流传输请求 ― 探针与提交控制HOST sends PROBE: SET_CUR request in a probe/commit structure containing desired values for VS Format index, VS Frame index, and Frame Interval. UVC device checks the VS Format index, VS Frame index, and Frame interval properties to verify if possible, updates the probe/commit structure if feasibleHOST sends the PROBE:GET_CUR request to read the updated values from UVC deviceDevice sends back the updated probe/commit structureHOST compares values received for GET_CUR with the values it tried to change in SET_CURFAILPASSHOST changes the operation mode by sending COMMIT: SET_CUR with the updated probe/commit structure通过 UVCHandleVideoStreamingRqts 函数,可以处理流 相关的请求。当 UVC 驱动程序需要从 UVC 器件输送视频 时,首先要进行协商。在该阶段,驱动程序将发出一个 PROBE (探针)请求,比如: GET_MIN 、 GET_MAX 、 GET_RES 和 GET_DEF。作为响应,FX3 固件会返回一个 PROBE 结构。该结构包含了 USB 描述符的索引,包括视 频格式和视频帧、帧速率、帧的最大尺寸以及负载大小等 (即 UVC 驱动程序在每次转换中可获取的字节数量)。 对 于 USB 2.0 或 USB 3.0 的 连 接 , “ CY_FX_UVC_PROBE_CTRL ”的 switch 语句将处理流的 协商阶段(在不同的模式下所支持的视频属性也不同)。请 注意,因为在 USB 2.0 或 USB 3.0 连接中都支持同一个串 流 模 式 , 所 有 GET_MIN 、 GET_MAX 、 GET_DEF 和 GET_CUR 的报告值均相同。如果需要支持多个串流模式, 则这些值会不一样。 “CY_FX_UVC_COMMIT_CTRL”的 switch 语句处理了流 阶段的开始部分。COMMIT 控制的 SET_CUR 请求表示主 机 将 接 着 开 始 传 输 视 频 。 因 此 , COMMIT 控 制 的 SET_CUR 会控制“CY_FX_UVC_STREAM_EVENT”事件, 表示主2.3.2.1 控制请求 ― 亮度和 PTZ 控制 亮 度 和 PTZ 控 制 都 是 在 相关 项 目 中 实 现的 。 通 过定 义 uvc.h 文 件 中 的 “ UVC_PTZ_SUPPORT ” , 可 以 打 开 PTZ。这些性能可能受图像传感器的支持,也可能不受它的 支持。若不受支持,则必须设计特定硬件,以实现它们。在 任何情况下,这些性能在所控制的 USB 侧的固件实现仍然 相同。然而,图像传感器的实现会有区别。因此,只提供了www.cypress.com文档编号:001-92220 修订版**7 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口应用线程 UVCAppThread_Entry 启动 GPIF II 状态机以进 行输送视频。 2.3.3 视频数据格式:YUY2 UVC 规范只支持一个视频数据的颜色格式子集。因此,您 需要选择一个能输送符合 UVC 规范要求颜色格式的图像传 感器。本应用笔记包含了一个被称为 YUY2 的非压缩颜色 格式。大部分(而不是所有)图像传感器均支持这种格式。 YUY2 颜色格式是 YUY 颜色格式中 4:2:2 的采样版本。亮 度值 Y 是对所有像素进行采样的,而色度值 U 和 V 是仅针 对偶像素进行采样的。这会创建“宏像素”,每个宏像素描 述两个总共使用 4 字节的图像像素。请注意,所有其他字 节都是 Y 值,而 U 和 V 值仅用于表示偶像素。 Y0、U0、Y1、V0 (前两个像素) Y2、U2、Y3、V2 (接下来的两个像素) Y4、U4、Y5、V4 (接下来的两个像素) 请参考维基百科,了解有关颜色格式的详细信息。 注意:不支持 RGB 格式。尽管 UVC 规格不支持的单色图 像,但通过将单色图像数据作为 Y 值发送,并将所有 U 和 V 值都设置为 0x80 ,仍可以将一个 8 位的单色图像作为 YUY2 格式显示。 2.3.4 UVC 视频数据标头 UVC 类别非压缩视频负载需要一个 12 字节的标头数据。标 头数据描述了所传输图像数据的属性。例如,它包括一个 “新帧”位,图像传感器控制器(FX3)可以为每个帧切换 该位。FX3 代码还可以设置标头数据中的错误位,以表示 在传输当前帧的过程中发生的错误。每个 USB 传输操作都 需要 UVC 数据标头。请参考 UVC 规范,了解详细信息。 表 4 显示的是 UVC 视频标头数据的格式。表 4. UVC 视频标头数据格式字节 偏移 0 1 2-5 6-11 字段 名称 HLF BFH PTS SCR 说明 标头长度字段指定了标头的长度,单位为字 节 位字段标头表示图像数据的类型、视频流的 状态以及其他字段的存在情况 呈现时间戳显示的是本地器件时钟单元中源 时钟的时间 源时钟参考指示系统时间时钟和 USB 帧开 始(SOF)标志计数器HLF 的值经常为 12。PTS 和 SCR 字段都是可选的。固件 示例将这些字段内填充数据 0。位字段标头(BFH)保存变 化值在帧结束处。表 5 显示的是 BFH 格式(BFH 是视频标 头数据的一部分)。 表 5. 位字段标头(BFH)格式位 偏移 0 字段名称 FID 说明 帧标识符位在每个图像帧的起始边界上 进行切换,在图像帧的其余部分该位保 持不变 帧结束位指示视频结束,仅在属于图像 帧的最后一个 USB 传输操作中设置该位 存在时间戳位指示了 UVC 视频数据标头 中 PTS 字段是否存在(1 表示存在) 源时钟参考位指示了 UVC 视频数据标头 中 SCR 字段是否存在(1 表示存在) 保留,将其设置为0 静态图像位指示视频取样是否属于静态 图像 错误位表示在器件的传输过程中是否发 生错误 标头结束位,如果被设置,表示 BFH 字 段的结束1 2 3 4 5 6 7EOF PTS SCR RES STI ERR EOH图 7 显示的是如何将这些标头数据添加到本应用的视频数 据中。应针对所有 USB 批量传输操作添加 12 字节的标 头。在这里,每个 USB 传输操作共有 16 个批量数据包。 USB 3.0 的批量数据包的大小为 1024 个字节。www.cypress.com文档编号:001-92220 修订版**8 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口图 7. UVC 视频数据传输1 USB 3.0 Bulk transfer of the image with burst of 16 1024-byte packet Packet 1/16 12-byte Header 1st USB transfer Video Data Video Data - - Video Data Packet 2/16 Packet 16/162nd USB transferVideo DataVideo Data- - -Video Data- - -Nth USB transferVideo DataVideo Data12-byte Header with EOF setLast Partial Packet3. GPIF II 图像传感器接口FX3 的 GPIF II 模块是一个很灵活的状态机,可以对它进行 自定义,使之能够将FX3引脚连接至外部硬件(如图像传感 器)。要设计状态机,需要了解该接口的要求以及 FX3 的 DMA功能。图 8 显示的是 FV、LV、PCLK 和 Data 信号的时序图。图 像传感器生效 FV 信号,以表示帧的开始。然后逐行传输图 像数据。在每行的传输操作中会激活 LV 信号,因为图像传 感器会驱动 YUY2 格式的 8 位像素(该格式中每两个像素 使用了 4 个字节)。在每个 PCLK 的上升沿上字节数据都 会进入给 GPIF II 单元。 可将 FX3 GPIF II 总线配置为 8、16 或 32 位数据的总线。 本应用使用了图像传感器中的 8 位总线。如果图像传感器 提供的总线是非字节对齐的(比如 12 位总线),请使用下 一个更大的大小来填充或清除未使用的位。 3.1.1 GPIF II 接口的要求 根据时序图(图 8),GPIF II 的状态机有下面各项要求:3.1 图像传感器接口图 2 显示的是一个典型的图像传感器接口。图像传感器一 般需要收到一个来自 FX3 控制器的复位信号。 它可以通过 使用 FX3 通用输入/输出(GPIO)得到处理。 图像传感器通常使用一个 I C 接口,这样可以允许控制器对 图像传感器的参数进行读取和写入操作。图像传感器还会使 用 串 行 外 设 接 口 ( SPI ) 或 通 用 异 步 接 收 器 / 发 送 器 2 (UART)接口实现同样操作。FX3 的 I C、SPI 和 UART 2 模块都具有该功能。本应用使用 I C 来配置图像传感器。 为了传输图像,图像传感器提供下面各信号: 1. 2. 3. 4. FV:帧有效(表示帧的开始和结束) LV:行有效(表示行的开始和结束) PCLK:像素时钟(即同步接口的时钟) Data(数据):图像数据的八个数据线2? ?仅在 LV 及 FV 信号激活时,GPIF II 模块才会从数据引 脚传输数据。 图像传感器不提供流量控制。因此,该接口必须传输一 整行视频而不能间断。在该设计中,每一行都有 1280 个像素 ,每 个像素 需要 两个 字节, 所以 每行要 传输 2560 个字节。 每一帧结束时都要通知 CPU,使其更新相应标头位。?www.cypress.com文档编号:001-92220 修订版**1 Video Frame9 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口图 8.图像传感器接口时序图Active Frame FV Line 1 LV Line 2 Line R-1 Line R Vertical BlankingZoomed inActive Line LV Horizontal BlankingPCLKDATAD0 D1 D2Dc3.2 图像传感器接口的引脚映射情况表 6 显示的是 GPIF II 到图像传感器的引脚映射详情。 表 6. 并联图像传感器接口的引脚映射情况表 7. 图像传感器的其他引脚映射情况EZ-USB FX3 引脚 GPIO[8:15] DQ[8:15] GPIO/UART_RTS GPIO/UART_CTS GPIO/UART_TX GPIO/UART_RX GPIO/SPI_SCK /UART_RTS GPIO/SPI_SSN/UART_CTS GPIO/SPI_MISO/UART_TX GPIO/SPI_MOSI/UART_RX 图像传感器接口 (额外引脚)EZ-USB FX3 引脚 GPIO[28] GPIO[29] GPIO[0:7] GPIO[16] I2C_GPIO[58] I2C_GPIO[59]具有 8 位数据总线的同步并联图像传感器 接口 LV FV DQ[0:7] PCLK I2C SCL I2C SDAGPIO[46] GPIO[47] GPIO[48] GPIO[49] GPIO[53] GPIO[54] GPIO[55] GPIO[56]如果图像传感器使用的是 UART 或 SPI 接口,并使用了 16 位数据总线,那么请采用表 7 中描述的引脚映射。注意:如需完整的 EZ-USB FX3 引脚映射,请参见 EZUSB FX3 超速 USB 控制器数据手册。3.3 乒乓 DMA 缓冲区要想了解 FX3 的数据输出和输入,需要明白下面各术语: a. 插座 b. DMA 描述符 c. DMA 缓冲区 d. GPIF 线程www.cypress.com文档编号:001-92220 修订版**10 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口插座是外设硬件模块和 FX3 RAM 间的连接点。FX3 上的每 个外设硬件模块(如 USB、GPIF、UART 和 SPI)具有与 本身相连的固定插座数量。输出给外设的独立数据数量等于 该外设上的插座的数量。插座的实现包括一组寄存器,用于 指向有效的 DMA 描述符,并使能或标志与插座本身相连的 中断。 DMA 描述符是一组位于 FX3 RAM 中的寄存器。它保存了 DMA 缓冲区的地址和尺寸数据,以及指向下一个 DMA 描 述符的指针。这些指针构建成了 DMA 描述符链。 DMA 缓冲区是 RAM 的一部分,用于存储通过 FX3 器件传 输的中间数据。通过 FX3 固件,可将部分 RAM 空间作为 DMA 缓冲区使用。这些缓冲区的地址被存储为 DMA 描述 符的一部分。 GPIF 线程是 GPIF II 模块内的专用数据路径,用来将外部 数据引脚同插座连接起来。 插座可通过各个事件来互相发出信号,或者它们可通过中断 向 FX3 CPU 发出信号。这些操作是由固件配置的。例如, 将数据流从 GPIF II 模块传输给 USB 模块。GPIF 插座可以 通知 USB 插座它已经向 DMA 缓冲区填充了数据,或者 USB 插座可以通知 GPIF 插座它已经清空了该 DMA 缓冲 区。该操作被称为自动 DMA 通道。当 FX3 CPU 不用修改 数据流中的任何数据时,通常会使用自动 DMA 通道实现。 或者,GPIF 插座可以向 FX3 CPU 发送一个中断,来通知 GPIF 插座已经填充了 DMA 缓冲区。FX3 CPU 可将该信息 传输给 USB 插座。USB 插座可向 FX3 CPU 发送一个中 断,来通知 USB 插座已经清空了 DMA 缓冲区。此时, FX3 CPU 可以将此信息反馈给 GPIF 插座。该操作被称为 手动 DMA 通道。如果 FX3 CPU 需要添加、删除或修改数 据流中的数据,通常需要执行该手动 DMA 通道操作。本应用笔记中的固件示例使用了手动 DMA 通道操作,因为该固 件要求添加 UVC 视频数据标头。 生产插座是指用于将数据写入 DMA 缓冲区内的插座。消耗 插座是指读取 DMA 缓冲区内数据的插座。插座使用存储在 DMA 描述符上的 DMA 缓冲区地址、 DMA 缓冲区大小和 DMA 描述符链的值来管理数据(第 4 节)。插座填充或清 空 DMA 缓冲区后,需要一个有限的时间量(多达几微秒) 从一个 DMA 描述符转移到另一个描述符。转换过程中,插 座不能传输数据。对于没有流量控制的接口,该延迟是一个 问题。图像传感器接口便属于这类情况。 通过使用多个 GPIF 线程,可以在 GPIF II 模块中处理这问 题。 GPIF II 模块实现四个 GPIF 线程。但每次只有一个 GPIF 线程能够传输数据。GPIF II 状态机必须选择一个有效 的 GPIF 线程来传输数据。 GPIF 线程选择机制同 MUX 一样。GPIF II 状态机使用内部 控制信号或外部信号选择有效的 GPIF 线程。在这示例中, 内部控制信号控制在各 GPIF 线程之间进行切换。切换有效 的 GPIF 线程时会切换用于数据传输的有效插座,从而修改 用于数据传输的 DMA 缓冲区。GPIF 线程切换没有延迟。 在 DMA 缓冲区边界上实现对 GPIF II 状态机的切换,这样 可以屏蔽在切换到新的 DMA 描述符时,GPIF 插座所要求 的延迟。这样,当 DMA 缓冲区被填充时,GPIF II 模块可 以使用传感器中的数据。 图 9 显示的是本应用程序中使用的各个插座、DMA 描述符 和 DMA 缓冲区连接,以及数据流。使用两个 GPIF 线程填 充备用的 DMA 缓冲区。这些 GPIF 线程使用了单独的 GPIF 插座(作为生产插座使用)和 DMA 描述符链(描述 符链 1 和描述符链 2)。USB 插座(作为消耗插座使用) 使用了另一个 DMA 描述符链(描述符链 3)按正确顺序读 取数据。图 9. FX3 数据传输架构GPIF II Block Descriptor Chain 1DMA Descriptor Chain 3 Buffer 0 Buffer 2 Buffer 4 Buffer 6 Descriptor 0 Descriptor 1GPIF Socket 0 ProducerDescriptor 0 Descriptor 2 Descriptor 4 Descriptor 6 Descriptor Chain 2USB Interface Block (UIB)GPIF Thread 0Image SensorGPIF II state machine controlled switchingDescriptor 3 Descriptor 4GPIF Socket 1 ProducerDescriptor 1 Descriptor 3 Descriptor 5 Descriptor 7Buffer 1 Buffer 3 Buffer 5 Buffer 7Descriptor 5 Descriptor 6 Descriptor 7GPIF Thread 1www.cypress.com文档编号:001-92220 修订版**Consumer USB Socket 3Descriptor 2USB Endpoint 0x83 BULK-IN11 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口3.4 设计策略在编译 GPIF II 状态机的详细信息前,建议考虑基本的传输 策略。 图 10. 在视频线内的数据传输GPIF Thread 0 Active Increment CT0 Load CT1Still in Line, DMA Buffer 0 full. Still in Line, DMA Buffer 1 full.个中断(表明完整的最后 DMA 缓冲)被警惕。通过这信 息,CPU 可以设置用于下一个帧的 GPIF II。 在状态 3 中,如果 FV=1,则表示图像传感器正在传输某一 帧,并且它将要重新激活 LV=1 ,以指出下个视频线。当 LV=1 时,状态机从状态 3 转换到状态 4,并会执行 GPIF 线程切换,该切换与从状态 1 转换到状态 4 的切换相同。 因此,路径 1-4 和 1-2-3-4 都进行了一个 GPIF 线程切换。 这些路径的区别在于第二个路径需要占用一个额外的周期, 这是因为它在线结尾上有一个暂停。 如果 DMA 缓冲区未满,则状态机将从状态 2 转换到状态 5。状态 5 与状态 3 相似,它将等待该帧结束或 LV 重新激 活(开始下一个视频线)。如果 LV=1,则它将继续填充处 于状态 1 的 DMA 缓冲区 0。如果 FV=0,则表示图像传感 器已完成传送一个视频帧,而且 DMA 缓冲区 0 只被部份填 充。在状态 6 中,状态机向 CPU 发送另一种中断,用以允 许它通过 USB 发送短 DMA 缓冲区。GPIF Thread 1 Active Increment CT1 Load CT0图 10 显示的是在活动的水平线期间,填满 DMA 缓冲区时 基本 DMA 缓冲区的乒乓操作。GPIF II 状态机有三个独立 的 计 数 器 。 在 这 示 例 中 , GPIF II 单 元 使 用 两 个 计 数 器 (CT0 和 CT1)来计算写入到一个 DMA 缓冲区内的字节数 量。当计数达到 DMA 缓冲区的限制时,将采取“DMA 缓 冲区已满”分支,并且 GPIF II 会切换 GPIF 线程。由于各 字节是在一个 GPIF 线程中进行传输的,因此需要初始化其 他 GPIF 线程的计数器,以便在切换到下一个 GPIF 线程 后,计数器可以计算字节。 如果图像传感器取消了激活 LV,则表示它已到达视频线的 结尾。这时,状态机有几个选项,如图 11 所示,其中 LV 表示有效线信号和 FV 表示有效帧信号。各选项结果取决于 DMA 缓冲区是否填满和该帧是否完成。 图 11. 在视频线结尾上数据传输的决策1 GPIF Thread 0 Active Increment CT0 Load CT1Still in Line, DMA Buffer 0 full. Still in Line, DMA Buffer 1 full.3.5 GPIF II 状态机FX3 GPIF II 是一个可多达 256 种状态的可编程状态机。每 个状态可以执行下列操作:? ? ?驱动多个控制线 发送或接收数据和/或地址 向内部 CPU 发送中断GPIF Thread 1 Active Increment CT1 Load CT04状态转换取决于内部或外部信号,如 DMA 就绪信号和图像 传感器的有效帧/线信号。 开始设计 GPIF II 状态机,可在图像传感器波形中,选择一 点为状态机的起始位置。由正向 FV 跃变指出的帧起始位置 是一个合逻辑的起始点。GPIF II 检测该沿会先等待 FV=0 (第一个状态),然后再等待 FV=1(第二个状态)这两个 过程。第二个状态亦初始化一个传输计数器去回应一个存储 满了视频数据的 DMA 缓冲区。状态机将测试该计数器的 值,如果达到极限值,它会切换 GPIF 线程( DMA 缓冲 区)。当 DMA 缓冲区已满时,则表示已经达到了计数器的 极限值。 状态机使用两个 GPIF II 内部计数器来计算 DMA 缓冲区字 节:GPIF II 地址计数器 ADDR 和数据计数器 DATA。每当 GPIF II 状态机切换 GPIF 线程时,它将为其他 GPIF 线程启 动合适的计数器。由于进行加载计数器的限制值需要一个时 钟周期,因此该值比终端计数值小 1。 每经过一个时钟周期,传输计数器的值都会加 1。因此,根 据接口的数据总线宽度,计数器的限定值会不一样。在该示 例中,数据总线的宽度为 8 位,DMA 缓冲区大小为 16,368 字节(如章节 5.6 中所述),因此编程限定值为 16,367。 一般情况下,DMA 缓冲区的计数限制值为:? producer _ buffer _ size( L) ? ? count ? ? ? ? ?1 data _ bus _ width ? ?End of a Line 2 DMA Buffer 0 YES full? NO LV 5 Wait for LV or !FV !FV Partial last DMA Buffer 0 6LV 3 Wait for LV or !FV !FVFull last DMA Buffer 07注意:由“线结尾”开始的映像决策树也是从状态 4 开始 的;为了提高清晰度,在该框图中没有显示。 在每个线的结尾处(LV=0),状态机从状态 1 转换到状态 2,然后它会检查 DMA 缓冲区字节计数器,以此确定 DMA 缓冲区是否已满。如果 DMA 缓冲区已满,则状态机将转换 到状态 3。在状态 3 中,如果 FV 为低电平,则表示已经传 输完了全帧,并且进入状态 7。在状态 7 中,CPU 通过一www.cypress.com文档编号:001-92220 修订版**12 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口所以对于 16 位的接口,DMA 缓冲区大小为 8184 个 16 位 字,编程限制值为 8183。对于 32 位的接口,DMA 缓冲区 大小为 4092 个 32 位字,编程极限值为 4091。图 12 显示的是 GPIF II 状态机的详细信息。两个 DMA 缓冲 区字节计数器分别为 GPIF II DATA 和 ADDR 计数器。这些 计数器同图 11 中显示的 CT0 和 CT1 相对应。图 12.GPIF II 状态机的框图State 0 State 1 State 2 Wait for Frame valid, Load DATAStartWait for Frame Done!FVFV & LV State 5 !LV & !DATA Limit Wait for LV with thread 0 active LV State 3 Transfer thread 0 data DATA++ ADDR=0 LV & DATA Limit LV & ADDR Limit State 4 Transfer thread 1 data, ADDR++ DATA=0 !LV& !ADDR Limit LV Wait for LV with thread 1 active State 6!LV & DATA Limit LV Wait for LV State 7 with thread 0 full LV!LV &ADDR LimitWait for LV with thread 1 fullState 8!FV State 9 Frame end partial buffer in thread 0 Intr CPU!FV State 11 Frame end full buffer in thread 0 Intr CPU State 12!FV State 10 Frame end full buffer in thread 1 Intr CPU!FVFrame end partial buffer in thread 1 Intr CPU在每一帧的结尾处, CPU 收到四个可能中断请求中的一 个,指出 DMA 缓冲区的编号和已满状态(状态 9-12)。可 以使用这些请求执行回调函数,以使能 CPU 处理某些任 务,具体如下所示: 1. 如果帧结尾处有一个 DMA 缓冲区(状态 9 和 10)未 满,则 USB 传输提供最后的 DMA 缓冲区。如果在帧 结尾处 DMA 缓冲区为满,则 GPIF II 会自动将它传送 到 USB 传输(状态 11 和 12)中。2.等待消耗插座(USB)传送最后的 DMA 缓冲区数据; 然后将该通道和 GPIF II 状态机复位到状态 0,以预备 下一个帧。 处理所有特殊应用任务,以指出帧的前进。UVC 需要 通过切换 12 字节插座中的位来表明帧改变事件。3.图 13 将图像传感器波形连接到 GPIF II 状态,显示一小部 分水平线。“Step”线处理 DMA 系统,具体情况在章节 4 和图 45 中进行介绍。www.cypress.com文档编号:001-92220 修订版**13 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口图 13.图像传感器接口、数据路径执行以及状态机的关联Active Frame FV Vertical BlankingLVStep1234561State0 1235346483534648120 12CPU Intervention Reset FIFO Reset GPIF II3.6 使用 GPIF II Designer 实现图像传感器接口本节介绍的是如何使用 GPIF II Designer 来设计图传感器接 口。有关参考材料,请访问附带源中压缩文件内的“GPIF II Designer/ImageSensorInterface.cydsn ” 目 录 路 径 , 以查找整个项目。 设计过程包括下面三个步骤: 1. 2. 3. 使用 GPIF II Designer 创建项目 选择接口定义 在画布上绘制状态机图 15. 打开 File 菜单并选择 New Project 项3.6.1 创建项目 启动 GPIF II Designer。GUI 出现,如图 14 所示。按照下 图所示的详细内容进行操作。每一个图都包含了多个子步 骤。介绍每一步的详细信息,请参考《GPIF II Designer 用 户指南》中的内容。 图 14.启动 GPIF II Designer 图 16.输入项目名称和位置现在完成了项目创建操作,GPIF II Designer 被打开,通过 它可以访问接口定义和状态机选项卡。在接口定义选项卡 中 , FX3 位 于 左 侧 , 图 像 传 感 器 ( 标 签 为 “ 应 用 处 理 器”)位于右侧。接下来进行设置这两者之间的接口。 3.6.2 定义接口 在该项目中,图像传感器具有 8 位数据总线与 FX3 器件相 连。它将 GPIO 28 用于 LV 信号,GPIO 29 用于 FV 信号,www.cypress.com文档编号:001-92220 修订版**14 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口另外 GPIO 22 为低电平有效输入的传感器复位(表 6)。 2 该图像传感器还可通过使用连接到 FX3 的 I C 对图像传感 器寄存器进行访问,例如,为 720p 模式配置传感器。“接 口设置”列显示的是各需要的选项。 另外,在下一个阶段中,可以使用指示输入信号来创建转换 公式。图 17 显示的是可选的接口设置。 1. 2. 3. 4. 在“Signals”(信号)项中,为 LV 和 FV 选择两个输 入。 在“Signals”(信号)项中,为 nSensor_Reset 选择 一个输出。 在“FX3 peripherals used”(使用的 FX3 外设)项中 2 2 ,选择 I C。这样可以激活 FX3 I C 主器件。 在 “ Interface type ” ( 接 口 类 型 ) 项 中 , 选 择 “Slave ”(从器件)。由于图像传感器提供时钟,并 驱动数据总线,因此 GPIF II 作为从器件使用。 在“ Communication type ”(通信类型)项中,选择 “Synchronous”(同步)。这样反映了在图像传感器 中存的在同步时钟。 在 “ Clock settings ” ( 时 钟 设 置 ) 项 中 , 选 择 “External”(外部)。图像传感器将为 GPIF II 提供 它的 PCLK 信号。 在“ Active clock edge ”(活动时钟沿)项中,选择 “Positive ”(上升沿)。图像传感器在它的上升沿上 启用数据转换。 在 “ Endianness ” ( 字 节 顺 序 ) 项 中 , 选 择 “ Little endian”(低位优先)。字节顺序指出数据总线中比一 个字节的宽度更大的字节顺序。对于 8 位的接口,该设 置不受影响。 在“Address/data bus usage”(地址/数据总线的使用 情况)项中,选择“8 bit”(8 位)。图像传感器提供 了一个 8 位的数据总线。图 17. 接口设置选项5.6.7.8.9.“I/O Matrix configuration”(I/O 矩阵配置)现在的情况如 图 18 所示。接下来需要修改输入和输出信号的属性,包括 信号名称、引脚映像(例如,哪个 GPIO 作为输入或输出) 、信号极性以及输出信号的初始值。www.cypress.com文档编号:001-92220 修订版**15 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口图 18. 当前的框图图 20. 已编辑的 INPUT0 属性然后,双击 INPUT1 标签,将信号名称修改为 FV ,并将 GPIO 设置为 GPIO_29 ,然后保持该极性为高电平有效 (图 21)。 图 21. 编辑 INPUT1 属性 在应用处理器区中双击 INPUT0 标签,这样可以打开输入 信号的属性,如图 19 所示。 图 19. INPUT0 的默认属性双击 OUTPUT0 标签并根据图 22 修改各设置内容。将信号名称修改为“LV”,并将“GPIO to use:”(被使 用的 GPIO)设置为 GPIO_28 (表 6)。将该极性保持为 “ Active High ”(高电平有效)。现在这些属性的情况如 图 20 所示。单击“OK”。www.cypress.com文档编号:001-92220 修订版**16 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口图 22. 已编辑的 OUTPUT0 属性图 23. 初始状态机画布1.通 过 双 击 STATE0 框 内 部 将 STATE0 的 名 称 改 为 IDLE ,然后编辑名称文本框。通过“重复操作直到发 生下一个转换为止”项可以确定进入该状态时,仅发生 一次操作还是在该状态内每个时钟上均发生。对于没有 操作的状态,如这状态,则检验栏状态不可用。 通过右击画布中的空白位置并选择“Add State”(添 加状态)项,可以添加一个新的状态。在新状态内部双 击 , 并 将 它 的 名 称 改 为 WAIT_FOR_FRAME_START。 创建从 IDLE 状态转换到 WAIT_FOR_FRAME_START 状态的转换。将光标放置在 IDLE 状态框的中心位置。 该光标将变为+形状,用以指出转换输入。将鼠标拖放 到 WAIT_FOR_FRAME_START 状态的中心位置。在 状态框内出现一个小正方形,它显示的是其中心。如果 在状态框中心任何位置中放开鼠标,那么不会创建转 换。重新尝试。请注意,这状态切换还没有任何条件。这样便完成了接口设置。设置各属性(如信号名称)时, GPIF II 设计的所有其他内容会根据该修改而不断更新。例 如,该框图内包含了信号名称,而不是通用的输入和输出名 称。另外,当您使用状态机设计工具时,可用的信号选项 (如 LV 和 FV 信号)会自动显示为下拉列表中的各选项。 3.6.3 绘制状态机 通过点击 State Machine(状态机)选项卡可以打开状态机 设计图。状态机设计包括下面三个步骤: 1. 创建状态 2. 在各状态下添加操作 3. 使用转换条件创建状态间的转换 绘制 GPIF II 状态机 通过点击 State Machine(状态机)选项卡打开设计图。未 编辑的设计图有两种状态:START 和 STATE0。无条件转 换(LOGIC_ONE)将连接各状态(图 23)。2.3.图 24. 步骤 1 到 3 的结果4.通 过 双 击 转 换 线 , 编 辑 从 IDLE 转 为 WAIT_FOR_FRAME_START 的转换公式(图 25)。 请注意,LV 和 FV 显示作为公式应项目并对应已重新 命名的框图信号。要想选择 FV 低,请使用按键和信号 选择编译该公式。点击 Not 按键,在公式输入窗口内将 显示“!”符号。然后选择 FV 信号并点击“Add”(添www.cypress.com文档编号:001-92220 修订版**17 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口加)按键(或双击 FV 输入),以创建最后的“!FV” 公式。也可以通过在公式输入窗口中键入“!FV”来直 接输入该公式。这时,该转换如图 26 所示。 图 25. 双击转换线后将显示该窗口图 27. LD_DATA/ADDR_COUNT 操作设置7. 图 26. 已编辑的转换添加一个名称为 PUSH_DATA_SCK0 的新状态(将图 像传感器数据推入插座 0 内)。该状态每个时钟将一个 图像传感器字节传输到 GPIF II 接口上,再路由到插座 0。 创 建 一 个 从 WAIT_FOR_FRAME_START 状 态 到 PUSH_DATA_SCK0 状态的转换。 编辑该转换公式输入创建公式 FV&LV,以便对应 FV 和 LV 激活时。结果状态转换如图 28 所示。8. 9.图 28. PUSH_DATA_SCK0 和它的转换条件 FV&LV5.在 WAIT_FOR_FRAME_START 状态下,我们要初始 化两字节计数器; 因为我们必须在计数器递增的状态 前初始化计数器。我们重新回顾一下,本设计的 DATA 计数器使用的是插座 0 缓冲区,而 ADDR 计数器使用 的是插座 1 缓冲区。 GPIF II Designer 右上窗口的 “Action List”(操作列表)窗口内显示的是各操作选 项。要想将某个操作添加到状态中,需要将它的名称拖 拉到状态框中的操作列表内。将 LD_DATA_COUNT 和 LD_ADDR_COUNT 操 作 拖 拉 到 WAIT_FOR_FRAME_START 状态框内。 要想编辑各操作属性,请双击状态框中的操作名称。然 后 编 辑两 个 操作 的属 性 ,如 图 27 所示 。 如果 勾 选 “Counter mask event”(计数器屏蔽事件)检验栏, 当计数器达到它的限定值时可以禁用其中断请求。10. 将 COUNT_DATA 操作添加到 PUSH_DATA_SCK0 状 态内。这样, DATA (插座 0 )计数器的值将在每个 PCLK 的上升沿上递增。 11. 将 IN_DATA 操作添加到 PUSH_DATA_SCK0 状态 内。使用该操作可以从数据总线上读取数据,并写入到 DMA 缓冲区内。 12. 将 LD_ADDR_COUNT 操 作 添 加 到 PUSH_DATA_SCK0 状态内,以重载 ADDR 计数器。6.www.cypress.com文档编号:001-92220 修订版**18 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口如上所述,计数器加载是在递增计数器的状态中完成 的。ADDR 计数器计算传输到 SCK1 内的字节。 13. 在 PUSH_DATA_SCK0 状态中,编辑操作 IN_DATA 的属性,如图 29 所示。 图 29. PUSH_DATA_SCK00 操作设置图 31.图 10 中的乒乓操作18. 将 名 称 为 “ LINE_END_SCK0 ” 的 新 状 态 添 加 到 PUSH_DATA_SCK0 状态的左侧。 19. 将 名 称 为 “ LINE_END_SCK1 ” 的 新 状 态 添 加 到 PUSH_DATA_SCK1 状态的右侧。 14. 添 加 名 称 为 PUSH_DATA_SCK1 的 新 状 态 。 将 COUNT_ADDR、IN_DATA 和 LD_DATA_COUNT 操 作添加到该状态内。 15. 在 PUSH_DATA_SCK1 状态中,设置 IN_DATA 操作 的属性配置,以使用 Thread1,如图 30 所示。 图 30. PUSH_DATA_SCK1 IN_DATA 操作 当图像传感器切换到下一个视频线时,而激活 LV 信号被取 消,则会进入这两个状态。由于不同的 GPIF 线程可轮流执 行同一个操作,因此插座 0 和插座 1 侧都需要这些状态。 PUSH_DATA 状态需要三个可能的退出转换,但 GPIF II 硬 件最多只能实现两个可能的转换。通过创建一个虚拟状态处 理三转换要求,该状态不进行任何操作,它只是在两个状态 之间分配三个退出条件。为了演示该操作,图 32 显示的是 一个状态 A 根据条件 1、2 或 3 转换到状态 B、C 或 D。 图 32. 状态 A 要求退出条件 1、2 和 3A1 2 3B C16. 创 建 从 PUSH_DATA_SCK0 状 态 到 PUSH_DATA_SCK1 状态的转换。使用公式“LV and DATA_CNT_HIT”编辑该转换的公式输入。 17. 创 建 从 PUSH_DATA_SCK1 状 态 到 PUSH_DATA_SCK0 状态的转换。反转方向。使用公 式“ LV and ADDR_CNT_HIT ”编辑该转换的公式输 入。 这些转换都是在线有效期间於 DMA 缓冲区边界,各 GPIF 线程之间进行的切换。图 31 显示这部分状态机。D要使它与 GPIF II 相兼容,需要添加虚拟状态 A2,如图 33 所示。www.cypress.com文档编号:001-92220 修订版**19 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口图 33. 添加虚拟状态 A2,是为了与 GPIF II 相兼容A1!1 2A2327. 创 建 从 “ WAIT_TO_FILL_SCK1 ” 状 态 到 “ PUSH_DATA_SCK1 ”状态的回转(该回转使用公 式“LV”)。 28. 在 “ PUSH_DATA_SCK0 ” 状 态 下 添 加 新 状 态 “WAIT_FULL_SCK0_NEXT_SCK1”。 29. 在 “ PUSH_DATA_SCK1 ” 状 态 面 添 加 新 状 态 “WAIT_FULL_SCK1_NEXT_SCK0”。 30. 在这两个状态期间( WAIT_FULL_ ),图像传感器在 DMA 缓冲区边界上切换各线。因此,下一个字节传输 必须使用当前未激活的 GPIF 线程。 31. 创 建 从 “ LINE_END_SCK0 ” 状 态 到 “WAIT_FULL_SCK0_NEXT_SCK1”状态的转换(该 转换使用公式“DATA_CNT_HIT”)。图 35 显示的是 该状态机的一部分。 图 35. 添加的 WAIT_FULL 状态BCD创建 LINE_END 为虚拟状态。 20. 创建从 PUSH_DATA_SCK0 状态到 LINE_END_SCK0 状态的转换(该转换使用转换公式“(not LV)”)。 21. 创建从 PUSH_DATA_SCK1 状态到 LINE_END_SCK1 状态的转换(该转换使用转换公式“(not LV)”)。 22. 在 LINE_END_SCK0 状 态 下 , 创 建 新 状 态 “WAIT_TO_FILL_SCK0”。 23. 在 LINE_END_SCK1 状 态 下 创 建 新 状 态 “WAIT_TO_FILL_SCK1”。 当 DMA 缓冲区未满却取消激活有效线时,会进入这两个状 态。 24. 创 建 从 LINE_END_SCK0 状 态 到 WAIT_TO_FILL_SCK0 状态的转换(该转换使用转换 公式“(not DATA_CNT_HIT)”),如图 34 所示。 图 34. DATA_CNT_HIT 表示计数器已达到它的编程极限32. 创 建 从 “ LINE_END_SCK1 ” 状 态 到 “WAIT_FULL_SCK1_NEXT_SCK0”状态的转换(该 转换使用公式“ADDR_CNT_HIT”)。 33. 创 建 从 “ WAIT_FULL_SCK0_NEXT_SCK1 ” 状 态 到 “ PUSH_DATA_SCK1 ”状态的转换(该转换使用公 式“ LV ”)。请注意,这样操作会在框图中创建交叉 链接。 34. 创 建 从 “ WAIT_FULL_SCK1_NEXT_SCK0 ” 状 态 到 “ PUSH_DATA_SCK0 ”状态的转换(该转换使用公 式“LV”)。图 36 显示的是该状态机的一部分。 图 36. DMA 缓冲区充满时进行等待25. 创 建 从 “ WAIT_TO_FILL_SCK0 ” 状 态 到 “ PUSH_DATA_SCK0 ”状态的回转(该回转使用公 式“ LV ”)。一旦该线有效,数据传输将恢复到同一 个插座内。 26. 创 建 从 “ LINE_END_SCK1 ” 状 态 到 “ WAIT_TO_FILL_SCK1 ”状态的转换(该转换使用 转换公式“(not ADDR_CNT_HIT)”)。35. 在 “ WAIT_TO_FILL_SCK0 ” 状 态 下 创 建 新 状 态 “PARTIAL_BUF_IN_SCK0”。www.cypress.com文档编号:001-92220 修订版**20 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口36. 在 “ WAIT_TO_FILL_SCK1 ” 状 态 下 创 建 新 状 态 “PARTIAL_BUF_IN_SCK1”。 PARTIAL_BUF_状态表示帧结束,在这里最后 DMA 缓冲区 未满。当 CPU 响应 GPIF II 生成的中断请求时,它要求手 动传送未满的 DMA 缓冲区。 37. 在“WAIT_FULL_SCK0_NEXT_SCK1”状态下添加新 状态“FULL_BUF_IN_SCK0”。 38. 在“WAIT_FULL_SCK1_NEXT_SCK0”状态下添加新 状态“FULL_BUF_IN_SCK1”。 FULL_BUF_ 的状态表示, DMA 缓冲区中的最后字节是帧 数据的结束(该缓冲区与相应的 GPIF 线程相关联)。由于 GPIF II 硬件负责传送已满的 DMA 缓冲区,因此任何其他 操作都是应用特定的。 39. 创 建 从 “ WAIT_TO_FILL_SCK0 ” 状 态 到 “ PARTIAL_BUF_IN_SCK0 ”状态的转换(该转换使 用公式“not FV”)。 40. 创 建 从 “ WAIT_TO_FILL_SCK1 ” 状 态 到 “ PARTIAL_BUF_IN_SCK1 ”状态的转换(该转换使 用公式“not FV”)。 41. 创 建 从 “ WAIT_FULL_SCK0_NEXT_SCK1 ” 状 态 到 “FULL_BUF_IN_SCK0 ”状态的转换(该转换使用公 式“not FV”)。 42. 创 建 从 “ WAIT_FULL_SCK1_NEXT_SCK0 ” 状 态 到 “FULL_BUF_IN_SCK1 ”状态的转换(该转换使用公 式“not FV”)。 43. 在“PARTIAL_BUF_IN_SCK0”、 “PARTIAL_BUF_IN_SCK1”、“FULL_BUF_IN_SCK0”和 “FULL_BUF_IN_SCK1”状态中添加操作 “Intr_CPU”。 图 38 显示的是最后状态机。与图 12 相比,主要区别在于 该图添加了 PUSH_DATA 状态,这样可以适应任何状态中 最多两个转换。 44. 通过选择“File-Save Project As”保存该项目。 45. 使用图 37 中加亮显示的 Build 图标编译该项目。项目 输出窗口指出的是编译的状态。 图 37.BUILD 按键46. 检查项目的输出。在项目目录中,该输出显示为一个名 称为 cyfxgpif2config.h 的头文件。如果检查该头文 件,您会发现 GPIF Designer II 已经创建了各 GPIF II 内部设置阵列。FX3 固件将使用这些设置来配置 GPIF II 并定义其状态机。请勿直接编辑该文件,而应该通过 GPIF II Designer 进行操作。www.cypress.com文档编号:001-92220 修订版**21 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口图 38. 最后状态机的框图3.6.4 编辑 GPIF II 接口的详细内容 本章节介绍的是如何修改接口设置(若需要)。例如,如果 图像传感器/ASIC 具有 16 位宽的数据总线,那么您需要修 改 GPIF II 接口,这样才能适应该数据总线。请按照下列步 骤进行操作: 1. 打 开 GPIF II Designer 中 的 ImageSensorInterface.cyfx 项目。(不能直接编译该 项目)。 依次选择 File-&Save Project As。 在出现的对话框内合适的位置,使用合适的名称保存该 项目。 关闭当前打开的项目(File-&Close Project)。 打开步骤 3 所保存的项目。 在 Interface Definition (接口定义)选项卡中选择 16 Bit 选项,以设置 Address/Data Bus Usage(地 址/数据总线的使用情况)。 打开 State Machine(状态机)选项卡。8.在状态机画布中,双击 WAIT_FOR_FRAME_START 状态中的 LD_DATA_COUNT 操作。将计数器的限定 值改为 8183。 对 LD_ADDR_COUNT 操作进行相同的操作。9.10. 保存项目。 11. 编译项目。 12. 在 步 骤 3 所 选 择 的 位 置 内 , 将 生 成 的 新 cyfxgpif2config.h 头文件复制到固件的项目目录中。 如果有 cyfxgpif2config.h 文件,它将被覆盖。在附件 源的 zip 文件中寻找固件项目目录 USBVideoClass。2. 3. 4. 5. 6.注意:如果您将 GPIF II 总线的宽度改为 32 位,请确保固 件中 iomatrix 配置的 isDQ32Bit 参数被设置为 CyTrue。 下一节将介绍用于数据流和支持 UVC 的固件的 DMA 通 道。7.www.cypress.com文档编号:001-92220 修订版**22 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口4. 设置 DMA 系统GPIF II 模块(处理器接口模块(PIB)的一部分)的工作频 率 可 达 100 MHz , 而 且 数 据 总 线 宽 度 为 32 位 ( 400 MBps)。为了将数据传输到内部 DMA 缓冲区内,GPIF II 使用多个 GPIF 线程连接到 DMA 生产插座(如章节 3.3 中 所述)。本应用使用了四个 GPIF 线程中的两个。它使用插 座和 GPIF 线程的默认映射(图 39) ― 插座 0 与 GPIF 线 程 0 相连,插座 1 与 GPIF 线程 1 相连。在上一章节中设计 的 GPIF II 状态机内实现 GPIF 线程切换。 图 39. GPIF II 插座/线程的默认映像Processor Interface Block (PIB)和长度,以及指向下个 DMA 描述符的指针。插座运行时, 每次仅检索各 DMA 描述符中的一个描述符,这样可以将数 据路由到描述符地址和长度所指定的 DMA 缓冲区。传输 L 个字节后,该插座会检索下一个描述符,并继续将各字节传 输到另一个 DMA 缓冲区内。 这结构使插座变得非常灵活,因为可以在存储器中的任何位 置上创建任何 DMA 缓冲区数量,而且这些缓冲区可以自动 被链接在一起。例如, 图 40 中的插座以重复循环检索 DMA 描述符。 图 41. 使用 DMA 描述符 1 运行的插座Socket Linked ListFX3 RAMDMA Descriptor 1 Address A1, Length L, Next Descriptor 2GPIF IISocket 0 Thread 0A1 LDMA Buffer 1 DMA Buffer 2SocketSwitchingSocket 1Thread 1DMA Descriptor 2 Address A2 Length L, Next Descriptor 3External Data BusDMA Buffer 3 DMA Descriptor 3 Address A3, Length L, Next Descriptor 1Socket 2Thread 2DataSocket 3 Thread 3在图 41 中,该插座加载了 DMA 描述符 1,并且传输操作 开始于 A1 地址的字节,直到传输 L 个字节结束。这时,它 将检索 DMA 描述符 2 并对其地址和长度设置(A2 和 L)进 行相同的操作(图 42)。 为了理解 DMA 传输,下面四个图中继续使用了插座的概 念。图 40 显示的是两个主插座属性、一个链接列表和一个 数据路由器。 图 40. 插座根据 DMA 描述符列表路由数据 图 42. 使用 DMA 描述符 2 运行的插座Socket Linked ListFX3 RAMDMA Descriptor 1 Address A1, Length L, Next Descriptor 2Socket Linked ListDMA Buffer 1SocketA2 LDMA Buffer 2 DMA Buffer 3FX3 RAMSocketDMA Buffer 1 DMA Buffer 2 DMA Buffer 3DMA Descriptor 1 Address A1, Length L, Next Descriptor 2DMA Descriptor 2 Address A2 Length L, Next Descriptor 3DMA Descriptor 2 Address A2 Length L, Next Descriptor 3DataDMA Descriptor 3 Address A3, Length L, Next Descriptor 1DataDMA Descriptor 1 Address A3, Length L, Next Descriptor 1在图 43 中,该插座检索第三个 DMA 描述符,并传输从 A3 地址开始的数据。传输 L 个字节后,将使用 DMA 描述符 1 重复该序列。插座链接列表是主存储器中的一组数据结构,这些结构又被 称为 DMA 描述符。每个描述符指定了 DMA 缓冲区的地址www.cypress.com文档编号:001-92220 修订版**23 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口图 43. 使用 DMA 描述符 3 运行的插座图 44. DMA 传输示例0 DMA Descriptor 1 Buffer Address: A1 C Size L Next DMA Descriptor: 2 DMA Descriptor 2 Buffer Address: A2 C Size L Next DMA Descriptor: 3 DMA Descriptor 3 Buffer Address: A3 C Size L Next DMA Descriptor: 1St e p3Socket Linked ListFX3 RAMDMA Descriptor 1 Address A1, Length L, Next Descriptor 2ep St 1SocketDMA Buffer 1 DMA Buffer 2 DMA Buffer 3Step 5DMA Descriptor 2 Address A2 Length L, Next Descriptor 3A3DataDMA Descriptor 3 Address A3, Length L, Next Descriptor 1Socket A1 DMA Buffer 1p2 S te4图 44 显示的是 DMA 数据传输的详细内容。本示例使用了 三个长度为 L 的 DMA 缓冲区,这些缓冲区通过链接方式形 成一个圆形循环。 FX3 存储器地址位于左边。蓝色箭头表 示该插座从存储器加载插座链接列表的描述符。红色箭头显 示的是结果数据的路径。下面各步骤描述的是在数据转移到 内部 DMA 缓冲区时,需要对插座进行的操作序列。 步骤 1:将存储器中的 DMA 描述符 1 加载到插座内。获取 有关 DMA 缓冲区位置(A1)、DMA 缓冲区大小(L)和下 个描述符(DMA 描述符 2)的信息。转到步骤 2。 步骤 2 :将数据传输到开始于 A1 地址的 DMA 缓冲区位 置。传输完 DMA 缓冲区大小 L 的数据量后,转到步骤 3。A1+L A2A2+L A3 DMA Buffer 3 A3+L步骤 3:加载当前 DMA 描述符 1 所指向的 DMA 描述符 2。获取有关 DMA 缓冲区的位置(A2)、DMA 缓冲区的大 小(L)以及下一个描述符(DMA 描述符 3)的信息。转到 步骤 4。 步骤 4:将数据传输到开始地址为 A2 的 DMA 缓冲区所在 的位置。传输完数量大小为 DMA 缓冲区 L 的数据后,转到 步骤 5。 步骤 5:加载当前 DMA 描述符 2 所指向的 DMA 描述符 3。获取有关 DMA 缓冲区的位置(A3)、DMA 缓冲区的大 小(L)以及下一个描述符(DMA 描述符 1)的信息。转到 步骤 6。 步骤 6:将数据传输到开始地址为 A3 的 DMA 缓冲区所在 的位置。在传输完数量大小为 DMA 缓冲区 L 的数据后,转 到步骤 1。 该简单方案在摄像头应用中存在问题。插座检索存储器中下 一个 DMA 描述符所需要的时间通常为 1 微秒。如果在视频 线中间暂停了该传输,将丢失视频数据。为了避免发生这种 情况,可以将 DMA 缓冲区大小设置为的视频线长度的倍 数。这样,DMA 缓冲区切换造成的暂停会与视频线无效事 件(LV=0 )同步发生。然而,在某些情况(如视频分辨率 发生改变时),该方法缺少灵活性。 设置 DMA 缓冲区大小等于线大小也不是一个好方案,因为 这样 BULK 传输将不会利用 USB 3.0 的最大突发速率。www.cypress.com文档编号:001-92220 修订版**St ep6DMA Buffer 2St ep24 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口USB 3.0 允许各 BULK 端点最大可达 16 个突发 x 1024 个 字节。这就是将 DMA 缓冲区大小设置为 16 KB 的原因。 利用插座在一个时钟周期内进行切换而不需要延迟的特性, 该方案更具有优势。因此,建议使用两个插座将数据存储在 四个交错的 DMA 缓冲区内。图 45 显示的是使用了双插座 的数据传输以及执行的各步骤。DMA 缓冲区的插座 0 和插 座 1 访问分别使用红色和绿色箭头(数据路径的单独插 座)区分。每一步骤中的‘a ’和‘b ’部分均同时发生。 通过硬件的此并行操作可以消除 DMA 描述符的检索死时间 并允许 GPIF II 连续将数据流动到内部存储器内。这些步骤 同图 13 中的“Step”线相对应。 图 45. 使用双插座的无缝传输座 1 将数据传输到 DMA 描述符 4 内,以便准备好将数据传 输到 DMA 缓冲区 4 内。插座 0 完成传输量为 L 的数据后, 请转到步骤 5。 步骤 5:GPIF II 将插座 1 中的数据布线到 DMA 缓冲区 4 内。同时,插座 0 通过加载 DMA 描述符 1 准备好将数据传 输到 DMA 缓冲区 1 内。请注意,步骤 5 与步骤 1a 相同, 但它的插座 1 未被启动,另外数据传输是同步进行的。 步骤 6:GPIF II 再次切换插座后,插座 0 开始将长度为 L 的数据传输到 DMA 缓冲区 1 内。这时,由于 UIB 消耗插座 已经用尽,因此 DMA 缓冲区为空。同时,插座 1 将数据加 载到 DMA 描述符 2 并准备将数据传输到 DMA 缓冲区 2 内。现在周期将转到执行路径的步骤 3。 只有消费端(USB)为空并及时释放了 DMA 缓冲区(这样 可以接受 GPIF II 中的下个视频数据块)时,插座才能传输 视频数据。如果消费端的速度不够块,插座将丢失数据因为 DMA 缓冲区的写操作被忽略。这样,字节计数器将不再与 实际传输同步,而且此现象将传播到下一帧。因此每一帧的 结尾处都需要一个清除机制。该机制在清除章节中进行了介 绍。0DMA Descriptor 1 Buffer Address: A1 C Size L Next DMA Descriptor: 3 DMA Descriptor 2 Buffer Address: A2 C Size L Next DMA Descriptor: 4 DMA Descriptor 3 Buffer Address: A3 C Size L Next DMA Descriptor: 1 DMA Descriptor 4 Buffer Address: A4 C Size L Next DMA Descriptor: 2Step 4aep StSte p1aSt ep1b3a根据图 12 所示的流程图,一个帧传输会以下面的四个可能 状态结束:Socket 0 A1 DMA Buffer 1 A1+L A2 DMA Buffer 2 A2+L A3 DMA Buffer 3 A3+L A4 DMA Buffer 4 A4+L4b5 Step aep St 6aSocket 1e Stp26bep St 3bep St? ? ? ?插座 0 已经传输已满的 DMA 缓冲区 插座 1 已经传输已满的 DMA 缓冲区 插座 0 已经传输未满的 DMA 缓冲区 插座 1 已经传输未满的 DMA 缓冲区对于未满的 DMA 缓冲区, CPU 需要将该缓冲区传送到 USB 消费者。 通过使用 uvc.c 文件中名称为 CyFxUVCApplnInit 的函数 可以启动 DMA 通道。在 CyFxUVCApplnInit 函数中的 “dmaMultiConfig”结构中对 DMA 通道的详细配置内容进 行 了 自 定 义 。 它 的 类 型 被 设 置 为 MANUAL_MANY_TO_ONE。 另外,将数据流动到 USB 3.0 主机的 USB 端点被配置为使 能 16 突发 x 1024 字节的 BULK 端点。通过使用传送到 “ CyU3PSetEpConfig ”函数中的“endPointConfig ”结构 (端点常量设置为“CY_FX_EP_BULK_VIDEO”)将可实 现该操作。St epSt ep 5b步骤 1:启动各插座时,插座 0 和插座 1 分别加载 DMA 描 述符 1 和 DMA 描述符 2。 步骤 2:当数据可用时,插座 0 将数据传输到 DMA 缓冲区 1 内,该传输的长度为 L。传输结束后,请转到步骤 3。 步骤 3:GPIF II 切换 GPIF 线程,从而切换进行数据传输的 插座。插座 1 开始将数据传输到 DMA 缓冲区 2 内,同时插 座 0 将数据加载到 DMA 描述符 3 内。在插座 1 完成传输量 为 L 的数据时,插座 0 会准备好将数据传输到 DMA 缓冲区 3 内。 步骤 4:GPIF II 现在切换回到原始的 GPIF 线程。这时,插 座 0 将长度为 L 的数据传输到 DMA 缓冲区 3 内。同时,插www.cypress.com文档编号:001-92220 修订版**25 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口4.1 DMA 缓冲区的相关内容本节介绍了如何创建 FX3 DMA 缓冲区,并将其用于该应 用。? ? ?当消耗插座已经读取了 DMA 缓冲区中所有的数据后, 它会释放锁定以便使生产插座访问 DMA 缓冲区。消耗 插座已经消耗了 DMA 缓冲区。 如果生产插座和消耗插座使用了相同的 DMA 描述符, 那么 DMA 缓冲区的满/空状态将通过 DMA 描述符和插 座间的事件在生产插座和消耗插座之间自动通信。 在本应用中,由于 CPU 需要添加一个 12 字节的 UVC 标头,因此生产插座和消耗插座需要加载不同 DMA 描 述符组。生产插座加载的 DMA 描述符指向的是 DMA 缓冲区,这些缓冲区位于离消耗插座所加载的 DMA 描 述符指向的相应 DMA 缓冲区 12 字节偏移的位置上。 由于生产插座和消耗插座使用了不同的 DMA 描述符, 因此 CPU 必须管理生产插座和消耗插座之间 DMA 缓 冲区状态的通信。这就是 DMA 通道实现被称为“手动 DMA”通道的原因。 GPIF II 模块生产 DMA 缓冲区后,将通过中断通知 CPU。然后,CPU 添加标头信息并将 DMA 缓冲区传 送到消费端(USB 接口模块)。 在 GPIF II 侧, DMA 缓冲区中的视频数据被自动包 装,并被传送到 FX3 RAM(帧中的最后 DMA 缓冲区 除外)。不需要 CPU 的干预。 在帧结尾处,最后的 DMA 缓冲区很大机会没有被完全 充满。这时,CPU 会手动包装 DMA 缓冲区,并将该缓 冲区传送到 FX3 RAM。这种操作称为“强制包装”。? ? ? ?DMA 通道的组成部分在章节 3.3 中进行了介绍。 在这应用中,GPIF II 单元作为产生端,而 FX3 USB 单 元作为消费端。 这应用使用了 GPIF II 模块中的 GPIF 线程切换性能以 避免丢失数据。 当生产插座加载一个 DMA 描述符时,它将检查相关的 DMA 缓冲区以确定该缓冲区是否能够进行写操作。生 产插座将其状态修改为“活动”。如果 DMA 缓冲区为 空,它会把数据写入到 FX3 RAM 内。生产插座锁定 DMA 缓冲区,以用于进行写操作。 当生产插座完成写入 DMA 缓冲区后,它会释放锁定, 以便消费插座访问 DMA 缓冲区。该操作称为“缓冲包 装”或“包装”。然后,DMA 单元会将 DMA 缓冲区 传送给 FX3 RAM。生产插座已经提供了一个 DMA 缓 冲区。缓冲区只会在生产端不在填充时被包装。因而, 状态框中才存在 FV=0 测试。 如果 DMA 缓冲区被完全填充满,并且在帧期间重复填 充操作,则包装操作会自动进行。生产插座释放 DMA 缓冲区上的锁定,将其传送到 FX3 RAM 内,切换到空 DMA 缓冲区,然后继续写入视频数据流。 当消耗插座加载了一个 DMA 描述符时,它将检查相关 的 DMA 缓冲区以确定该缓冲区是否能够进行读操作。 如果 DMA 缓冲区已被托付,消耗插座会将它的状态修 改为“活动”去读取 FX3 RAM 中的数据。消耗插座锁 定 DMA 缓冲区,以执行读操作。??? ? ???www.cypress.com文档编号:001-92220 修订版**26 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口5. FX3 固件本应用笔记的示例固件位于源压缩文件中的 USBVideoClass 文件夹下面。请参考 AN75705 ― “EZUSB FX3 入门”,了解如何将固件项目导入到 Eclipse 工 作区内。该示例固件可进行编译及枚举,但用户必须通过使 用 sensor.c 和 sensor.h 文件为特定的图像传感器定制固 件,以便可以从图像传感器流动视频。这些文件被作为示例 表 8. 示例项目文件文件项目中的占位符,您必须在该位置上实现代码以配置图像传 感器。 如果使用 Aptina 传感器板,如本应用笔记的章节 6 所述的 内容,并且签署了 Aptina NDA,赛普拉斯将提供 sensor.c 和 sensor.h 文件,用以同该特定传感器相应。通过本项目 所提供的预编译加载图像可以尝试 FX3-Aptina 而不需要使 用 NDA(章节 7)。 表 8 汇总了各种代码模块以及用于实 现每个模块的各个函数。说明sensor.csensor.hcamera_ ptzcontrol.c camera_ ptzcontrol.h cyfxtx.c定义 SensorWrite2B、SensorWrite、SensorRead2B 和 SensorRead 函数,以 I C 接口对图像传感 2 器配置进行读写操作。这些函数假定图像传感器的 I C 总线上的寄存器地址的宽度是 16 位的。 2 定义 SensorReset 函数可以控制图像传感器的复位线,另外通过使用 SensorInit 函数可以检测 I C 连 接并将图像传感器配置为默认的数据串流模式(使用 SensorScaling_HD720p_30fps 函数) 定义 SensorScaling_VGA 和 SensorScaling_HD720p_30fps 函数可以将图像传感器配置为所需要 的数据串流模式。这些函数是占位符函数,因此必须使用特定于图像传感器的配置指令填充它们。 定义 SensorGetBrightness 和 SensorSetBrightness 函数可以对亮度值进行读写操作,该亮度值位 于图像传感器的亮度控制寄存器中。这些函数是占位符函数,因此必须使用特定于图像传感器的配置指 令填充它们。 2 包含用于图像传感器的常量(它的 I C 从器件地址和 GPIO 复位编号)。在该文件内,您必须定义图像 2 传感器的 I C 从地址。 包含定义在 sensor.c 中的所有函数的声明。 定义用于读和写摄像机的 PTZ 值的函数。这些函数是占位符函数,因此必须使用特定于图像传感器配 置的指令填充它们。 取消注释 uvc.h 中的“#define UVC_PTZ_SUPPORT”线,以使能 PTZ 控制代码的占位符。 包含用于 PTZ 控制实现的常量 包含了定义在 camera_ptzcontrol.c 文件中的所有函数的声明。 无需改动。使用与本应用笔记相关的项目提供的文件。 它包含了各种变量和函数。RTOS 和 FX3 API 库将这些变量用于存储器映射,而 FX3 API 库将这些函 数用于存储器管理。 头文件由 GPIF II Designer 工具生成。无需更改。如果需要修改接口,则 GPIF II Designer 工具会生成 一个新的头文件。它将取代旧的头文件。 包含传送到 uvc.c 文件中的 API 调用的结构和常量,以启动和运行 GPIF II 状态机。 UVC 应用的主源文件。修改代码以支持其他控制功能(亮度和 PTZ 控制以外)或添加各种视频数据串 流模式的支持时,需要进修改该文件。 它包括下面各函数: Main:启动 FX3 器件、设置缓存、配置 FX3 I/O 和启动 RTOS 内核。 CyFxApplicationDefine:定义 RTOS 执行的两个应用线程 UVCAppThread_Entry:第一个应用线程函数,它调用 FX3 内部模块的启动函数,枚举器件, 然后处理视频数据传输 UVCAppEP0Thread_Entry:第二个应用线程函数,它等待指出已收到特定于 UVC 请求的事件 并调用相应的函数进行处理这些请求 UVCHandleProcessingUnitRqts:处理 VC 请求,用于处理单元性能 UVCHandleCameraTerminalRqts:处理 VC 请求,用于输入终端性能 UVCHandleExtensionUnitRqts:处理 VC 请求,用于扩展单元性能 UVCHandleInterfaceCtrlRqts:处理普通的 VC 请求(不使用于任何终端或单元) UVCHandleVideoStreamingRqts:处理 VS 请求作修改数据串流模式 CyFxUVCApplnDebugInit:初始化用于打印调试信息的 FX3 UART 模块2cyfxgpif2config.huvc.cwww.cypress.com文档编号:001-92220 修订版**27 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口文件说明cyfxuvcdscr.cCyFxUVCApplnI2CInit:初始化图像传感器配置的 FX3 I C 模块 CyFxUVCApplnInit:初始化 FX3 GPIO 模块、处理器模块(GPIF II 为处理器模块的一部分)、 传感器(配置为 720p 30fps)、枚举的 USB 模块、USB 传输的端点配置存储器以及用于将数 据从 GPIF II 传输到 USB 的 DMA 通道配置 CyFxUvcAppGpifInit:初始化 GPIF II 状态机并启动它 CyFxGpifCB:处理由 GPIF II 状态机生成的 CPU 中断 CyFxUvcAppCommitEOF:将 GPIF II 状态机提供的部分 DMA 缓冲区调配给 FX3 RAM CyFxUvcApplnDmaCallback:跟踪从 FX3 到主机的输出视频数据 CyFxUVCApplnUSBSetupCB :处理所有由主机发送的控制请求,设置的事件表示已接收到由 主机发送的 UVC 特定请求,并检测串流停止的时间 CyFxUVCApplnUSBEventCB:处理各个 USB 事件,如暂停、线缆断开连接、复位和恢复等事 件 CyFxUVCApplnAbortHandler:当发生任何错误或检测到串流停止请求时,将停止流视频数据 CyFxAppErrorHandler :错误处理函数。这是一个占位符函数,它允许您执行错误处理(若需 要) CyFxUVCAddHeader:在有效串流期间将 UVC 标头添加到视频数据中 包含 UVC 应用的 USB 枚举描述符。如果需要修改帧速率、图像分辨率、位深度或支持的视频控制, 则需要修改该文件。UVC 规范包含了所有需要的详细信息。 包含各个用于修改应用行为的开关,以便打开/关闭 PTZ 支持、调试接口以及帧计数的调试打印。 包含的各常量通常用于 uvc.c、cyfxuvcdscr.c、camera_ptzcontrol.c 以及 sensor.c 文件。2uvc.hcyfx_gcc_startup. s该汇编源文件包含了 FX3 CPU 启动代码。它具有用于设置堆栈和中断向量的函数。 无需改动。首先,固件将初始化 FX3 CPU 并配置它的 I/O。然后,它 将调用函数(CyU3PKernelEntry),以启动 ThreadX 实 时 操 作 系 统 ( RTOS ) 。 固 件 创 建 了 两 个 应 用 线 程 : uvcAppThread 和 uvcAppEP0Thread。RTOS 将调配资 源执行这些应用线程,并处理执行应用线程函数的顺序,即 : 分 别 执 行 UVCAppThread_Entry 和 UVCAppEP0Thread_Entry。图 46 显示的是基本的程序结 构。www.cypress.com文档编号:001-92220 修订版**28 如何使用 EZ-USB? FX3?在 USB 视频类别(UVC)框架内实现图像传感器接口图 46. 相机项目结构USB Request arrives over EP0 In a SETUP packet USBSetupCB() callback (in FX3 library) Raises Control and Stream Events uvc.c USBSetupCB() UVCAppEP0Thread_Entry() Handles Control & Stream events UVCAppThread_Entry() Handles DMA transfers and GPIFII state machine.CyU3PI2cTransmitBytes , 向 图 像 传 感 器 写 入 数 据 。 SensorRead2B 和 SensorRead 将 调 用 标 准 的 API CyU3PI2cReceiveBytes ,读取图像传感器内的数据。有 关更多这些 API 的详细信息,请查阅 FX3 SDK API 指南中 的内容。5.5 启动视频流USB 主机应用(如 VLC 播放器、AMCap 或 VirtualDub) 位于 UVC 驱动器之上,以便显示视频、将 USB 接口和 USB 备用设置组合到一个流视频(通常为接口 0 备用设置 1),并发送 PROBE/COMMIT 控制。该主机指示符表示快 要启动一个视频数据流。发生流事件时, USB 主机应用会 向 FX3 请求图像数据;FX3 应将图像数据从图像传感器发 送给 USB 3.0 主机。在固件中,UVCAppThread_Entry 函 数是一个无限循环。当没有流事件时,主应用线程将在该循 环下等待,直到发生流事件为止。 注意:如果没有流事件, FX3 不需要传输任何数据。所 以,不必要初始化 GPIF II 状态机来传输数据。否则,主机 应用从 DMA 缓冲区读取数据前,DMA 缓冲区会被填充, 并且 FX3 将传送一个坏帧。因此,只有发生了流事件时, 才能初始化 GPIF II 状态机。 当 FX3 接 收 到 流 事 件 时 , 主 应 用 线 程 将 调 用 CyFxUvcAppGpifInit 函数来启动 GPIF II 状态机。在该函 数中,固件使用 CyU3PGpifLoad 函数将 GPIF II 参数(寄 存器设置和波形数据)加载到 FX3 存储器内。然后,固件 通过 CyU3PGpifSMStart 函数启动 GPIF II 状态机。将定 义在 cyfxgpif2config.h 文件中的 CyFxGpifConfig 结构作 为参数,并将其传递到 CyU3PGpifLoad 函数内。将启动 状态名和启动条件作为参数使用,并将其传递到 CyU3PGpifSMStart 函数内。在 cyfxgpif2config.h 文件 中 定 义 了 启 动 状 态 ( START ) 和 启 动 条 件 (ALPHA_START )。cyfxgpif2config.h 文件由 GPIF II Designer 工具生成,如第 3.6 节中所述。5.1 应用线程两个应用线程实现并行功能。 UVCAppThread (应用)线 程用于管理视频数据流。它在启动流前等待流事件,在启动 流后会调配 DMA 缓冲区,并在每一帧后或停止流时清除 FIFO。 固件将处理通过 EP0 的 UVC 特定控制请求(SET_CUR、 GET_CUR、GET_MIN 和 GET_MAX

我要回帖

更多关于 usbcamera安卓 的文章

 

随机推荐