Tekkaman Ninja | 2f05543 | 2012-09-17 21:31:16 +0800 | [diff] [blame] | 1 | Chinese translated version of Documentation/video4linux/omap3isp.txt |
| 2 | |
| 3 | If you have any comment or update to the content, please contact the |
| 4 | original document maintainer directly. However, if you have a problem |
| 5 | communicating in English you can also ask the Chinese maintainer for |
| 6 | help. Contact the Chinese maintainer if this translation is outdated |
| 7 | or if there is a problem with the translation. |
| 8 | |
| 9 | Maintainer: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
| 10 | Sakari Ailus <sakari.ailus@iki.fi> |
| 11 | David Cohen <dacohen@gmail.com> |
| 12 | Chinese maintainer: Fu Wei <tekkamanninja@gmail.com> |
| 13 | --------------------------------------------------------------------- |
| 14 | Documentation/video4linux/omap3isp.txt 的中文翻译 |
| 15 | |
| 16 | 如果想评论或更新本文的内容,请直接联系原文档的维护者。如果你使用英文 |
| 17 | 交流有困难的话,也可以向中文版维护者求助。如果本翻译更新不及时或者翻 |
| 18 | 译存在问题,请联系中文版维护者。 |
| 19 | 英文版维护者: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
| 20 | Sakari Ailus <sakari.ailus@iki.fi> |
| 21 | David Cohen <dacohen@gmail.com> |
| 22 | 中文版维护者: 傅炜 Fu Wei <tekkamanninja@gmail.com> |
| 23 | 中文版翻译者: 傅炜 Fu Wei <tekkamanninja@gmail.com> |
| 24 | 中文版校译者: 傅炜 Fu Wei <tekkamanninja@gmail.com> |
| 25 | |
| 26 | |
| 27 | 以下为正文 |
| 28 | --------------------------------------------------------------------- |
| 29 | OMAP 3 图像信号处理器 (ISP) 驱动 |
| 30 | |
| 31 | Copyright (C) 2010 Nokia Corporation |
| 32 | Copyright (C) 2009 Texas Instruments, Inc. |
| 33 | |
| 34 | 联系人: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
| 35 | Sakari Ailus <sakari.ailus@iki.fi> |
| 36 | David Cohen <dacohen@gmail.com> |
| 37 | |
| 38 | |
| 39 | 介绍 |
| 40 | === |
| 41 | |
| 42 | 本文档介绍了由 drivers/media/video/omap3isp 加载的德州仪器 |
| 43 | (TI)OMAP 3 图像信号处理器 (ISP) 驱动。原始驱动由德州仪器(TI) |
| 44 | 编写,但此后由诺基亚重写了两次。 |
| 45 | |
| 46 | 驱动已在以下 OMAP 3 系列的芯片中成功使用: |
| 47 | |
| 48 | 3430 |
| 49 | 3530 |
| 50 | 3630 |
| 51 | |
| 52 | 驱动实现了 V4L2、媒体控制器和 v4l2_subdev 接口。支持内核中使用 |
| 53 | v4l2_subdev 接口的传感器、镜头和闪光灯驱动。 |
| 54 | |
| 55 | |
| 56 | 拆分为子设备 |
| 57 | ========== |
| 58 | |
| 59 | OMAP 3 ISP 被拆分为 V4L2 子设备,ISP中的每个模块都由一个子设备 |
| 60 | 来表示。每个子设备向用户空间提供一个 V4L2 子设备接口。 |
| 61 | |
| 62 | OMAP3 ISP CCP2 |
| 63 | OMAP3 ISP CSI2a |
| 64 | OMAP3 ISP CCDC |
| 65 | OMAP3 ISP preview |
| 66 | OMAP3 ISP resizer |
| 67 | OMAP3 ISP AEWB |
| 68 | OMAP3 ISP AF |
| 69 | OMAP3 ISP histogram |
| 70 | |
| 71 | ISP 中每个可能的连接都通过一个链接嵌入到媒体控制器接口中。详见例程 [2]。 |
| 72 | |
| 73 | |
| 74 | 控制 OMAP 3 ISP |
| 75 | ============== |
| 76 | |
| 77 | 通常,对 OMAP 3 ISP 的配置会在下一帧起始时生效。在传感器垂直消隐期间, |
| 78 | 模块变为空闲时完成配置。在内存到内存的操作中,视频管道一次处理一帧。 |
| 79 | 应用配置应在帧间完成。 |
| 80 | |
| 81 | ISP 中的所有模块,除 CSI-2 和 (可能存在的)CCP2 接收器外,都必须 |
| 82 | 接收完整的帧数据。因此,传感器必须保证从不发送部分帧数据给ISP。 |
| 83 | |
| 84 | Autoidle(自动空闲)功能至少在 3430 的 ISP 模块中确实存在一些问题。 |
| 85 | 当 omap3isp 模块参数 autoidle 非零时,autoidle(自动空闲)功能 |
| 86 | 仅在 3630 中启用了。 |
| 87 | |
| 88 | |
| 89 | 事件机制 |
| 90 | ====== |
| 91 | |
| 92 | OMAP 3 ISP 驱动在 CCDC 和统计(AEWB、AF 和 直方图)子设备中支持 |
| 93 | V4L2 事件机制接口。 |
| 94 | |
| 95 | CCDC 子设备通过 HS_VS 中断,处理 V4L2_EVENT_FRAME_SYNC 类型 |
| 96 | 事件,用于告知帧起始。早期版本的驱动则使用 V4L2_EVENT_OMAP3ISP_HS_VS。 |
| 97 | 当在 CCDC 模块中接收到起始帧的第一行时,会准确地触发事件。这个事件 |
| 98 | 可以在 CCDC 子设备中“订阅”。 |
| 99 | |
| 100 | (当使用并行接口时,必须注意正确地配置 VS 信号极性。而当使用串行接收时 |
| 101 | 这个会自动校正。) |
| 102 | |
| 103 | 每个统计子设备都可以产生事件。每当一个统计缓冲区可由用户空间应用程序 |
| 104 | 通过 VIDIOC_OMAP3ISP_STAT_REQ IOCTL 操作获取时,就会产生一个 |
| 105 | 事件。当前存在以下事件: |
| 106 | |
| 107 | V4L2_EVENT_OMAP3ISP_AEWB |
| 108 | V4L2_EVENT_OMAP3ISP_AF |
| 109 | V4L2_EVENT_OMAP3ISP_HIST |
| 110 | |
| 111 | 这些 ioctl 的事件数据类型为 struct omap3isp_stat_event_status |
| 112 | 结构体。如果出现计算错误的统计,也同样会产生一个事件,但没有相关的统计 |
| 113 | 数据缓冲区。这种情况下 omap3isp_stat_event_status.buf_err 会被 |
| 114 | 设置为非零值。 |
| 115 | |
| 116 | |
| 117 | 私有 IOCTL |
| 118 | ========== |
| 119 | |
| 120 | OMAP 3 ISP 驱动支持标准的 V4L2 IOCTL 以及可能存在且实用的控制。但 |
| 121 | ISP 提供的许多功能都不在标准 IOCTL 之列,例如 gamma(伽马)表和统计 |
| 122 | 数据采集配置等。 |
| 123 | |
| 124 | 通常,会有一个私有 ioctl 用于配置每个包含硬件依赖功能的模块。 |
| 125 | |
| 126 | 支持以下私有 IOCTL: |
| 127 | |
| 128 | VIDIOC_OMAP3ISP_CCDC_CFG |
| 129 | VIDIOC_OMAP3ISP_PRV_CFG |
| 130 | VIDIOC_OMAP3ISP_AEWB_CFG |
| 131 | VIDIOC_OMAP3ISP_HIST_CFG |
| 132 | VIDIOC_OMAP3ISP_AF_CFG |
| 133 | VIDIOC_OMAP3ISP_STAT_REQ |
| 134 | VIDIOC_OMAP3ISP_STAT_EN |
| 135 | |
| 136 | 在 include/linux/omap3isp.h 中描述了这些 ioctl 使用的参数结构体。 |
| 137 | 与特定 ISP 模块相关的 ISP 自身的详细功能在技术参考手册 (TRMs)中有 |
| 138 | 描述,详见文档结尾。 |
| 139 | |
| 140 | 虽然在不使用任何私有 IOCTL 的情况下使用 ISP 驱动是可能的,但这样无法 |
| 141 | 获得最佳的图像质量。AEWB、AF 和 直方图(译者注:一般用于自动曝光和增益 |
| 142 | 控制,以及图像均衡等)模块无法在未使用适当的私有 IOCTL 配置的情况下使用。 |
| 143 | |
| 144 | |
| 145 | CCDC 和 preview(预览)模块 IOCTL |
| 146 | =============================== |
| 147 | |
| 148 | VIDIOC_OMAP3ISP_CCDC_CFG 和 VIDIOC_OMAP3ISP_PRV_CFG IOCTL |
| 149 | 被分别用于配置、启用和禁用 CCDC 和 preview(预览)模块的功能。在它们 |
| 150 | 所控制的模块中,两个 IOCTL 控制多种功能。VIDIOC_OMAP3ISP_CCDC_CFG IOCTL |
| 151 | 接受一个指向 omap3isp_ccdc_update_config 结构体的指针作为它的参数。 |
| 152 | 同样的,VIDIOC_OMAP3ISP_PRV_CFG 接受一个指向 omap3isp_prev_update_config |
| 153 | 结构体的指针。以上两个结构体定义位于 [1]。 |
| 154 | |
| 155 | 这些结构体中的 update 域标识是否针对指定的功能更新配置,而 flag 域 |
| 156 | 则标识是启用还是禁用此功能。 |
| 157 | |
| 158 | update 和 flag 位接受以下掩码值。CCDC 和 preview(预览)模块的 |
| 159 | 每个单独功能都与一个 flag 关联(禁用或启用;在结构体中 flag 域的 |
| 160 | 一部分)和一个指向功能配置数据的指针。 |
| 161 | |
| 162 | 对于 VIDIOC_OMAP3ISP_CCDC_CFG,下面列出了 update 和 flag 域 |
| 163 | 中的有效值。 这些值可能会在同一个 IOCTL 调用中配置多个功能。 |
| 164 | |
| 165 | OMAP3ISP_CCDC_ALAW |
| 166 | OMAP3ISP_CCDC_LPF |
| 167 | OMAP3ISP_CCDC_BLCLAMP |
| 168 | OMAP3ISP_CCDC_BCOMP |
| 169 | OMAP3ISP_CCDC_FPC |
| 170 | OMAP3ISP_CCDC_CULL |
| 171 | OMAP3ISP_CCDC_CONFIG_LSC |
| 172 | OMAP3ISP_CCDC_TBL_LSC |
| 173 | |
| 174 | 针对 VIDIOC_OMAP3ISP_PRV_CFG 的相应值如下: |
| 175 | |
| 176 | OMAP3ISP_PREV_LUMAENH |
| 177 | OMAP3ISP_PREV_INVALAW |
| 178 | OMAP3ISP_PREV_HRZ_MED |
| 179 | OMAP3ISP_PREV_CFA |
| 180 | OMAP3ISP_PREV_CHROMA_SUPP |
| 181 | OMAP3ISP_PREV_WB |
| 182 | OMAP3ISP_PREV_BLKADJ |
| 183 | OMAP3ISP_PREV_RGB2RGB |
| 184 | OMAP3ISP_PREV_COLOR_CONV |
| 185 | OMAP3ISP_PREV_YC_LIMIT |
| 186 | OMAP3ISP_PREV_DEFECT_COR |
| 187 | OMAP3ISP_PREV_GAMMABYPASS |
| 188 | OMAP3ISP_PREV_DRK_FRM_CAPTURE |
| 189 | OMAP3ISP_PREV_DRK_FRM_SUBTRACT |
| 190 | OMAP3ISP_PREV_LENS_SHADING |
| 191 | OMAP3ISP_PREV_NF |
| 192 | OMAP3ISP_PREV_GAMMA |
| 193 | |
| 194 | 在启用某个功能的时候,相关的配置数据指针不可为 NULL。在禁用某个功能时, |
| 195 | 配置数据指针会被忽略。 |
| 196 | |
| 197 | |
| 198 | 统计模块 IOCTL |
| 199 | ============= |
| 200 | |
| 201 | 统计子设备相较于其他子设备提供了更多动态配置选项。在图像处理流水线处于 |
| 202 | 工作状态时,它们可以被启用、禁用和重配。 |
| 203 | |
| 204 | 统计模块总是从 CCDC 中获取输入的图像数据(由于直方图内存读取未实现)。 |
| 205 | 统计数据可由用户通过统计子设备节点使用私有 IOCTL 获取。 |
| 206 | |
| 207 | AEWB、AF 和 直方图子设备提供的私有 IOCTL 极大程度上反应了 ISP 硬件 |
| 208 | 提供的寄存器级接口。有些方面纯粹和驱动程序的实现相关,这些将在下面讨论。 |
| 209 | |
| 210 | VIDIOC_OMAP3ISP_STAT_EN |
| 211 | ----------------------- |
| 212 | |
| 213 | 这个私有 IOCTL 启用/禁用 一个统计模块。如果这个申请在视频流启动前完成, |
| 214 | 它将在视频流水线开始工作时生效。如果视频流水线已经处于工作状态了,它将在 |
| 215 | CCDC 变为空闲时生效。 |
| 216 | |
| 217 | VIDIOC_OMAP3ISP_AEWB_CFG, VIDIOC_OMAP3ISP_HIST_CFG and VIDIOC_OMAP3ISP_AF_CFG |
| 218 | ----------------------------------------------------------------------------- |
| 219 | |
| 220 | 这些 IOCTL 用于配置模块。它们要求用户应用程序对硬件有深入的认识。对 |
| 221 | 大多数域的解释可以在 OMAP 的 TRM 中找到。以下两个域对于以上所有的 |
| 222 | 私有 IOCTL 配置都很常见,由于他们没有在 TRM 中提及,故需要对其有 |
| 223 | 更好的认识。 |
| 224 | |
| 225 | omap3isp_[h3a_af/h3a_aewb/hist]_config.buf_size: |
| 226 | |
| 227 | 模块在内部处理自身缓冲。对模块数据输出所必需的缓存大小依赖于已申请的配置。 |
| 228 | 虽然驱动支持在视频流工作时重新配置,但对于所需缓存量大于模块启用时内部 |
| 229 | 所分配数量的情况,则不支持重新配置。在这种情况下将返回 -EBUSY。为了避免 |
| 230 | 此类状况,无论是禁用/重配/启用模块,还是第一次配置时申请必须的缓存大小, |
| 231 | 都应在模块禁用的情况下进行。 |
| 232 | |
| 233 | 内部缓冲分配的大小需综合考虑所申请配置的最小缓存量以及 buf_size 域中 |
| 234 | 所设的值。如果 buf_size 域在[minimum(最小值), maximum(最大值)] |
| 235 | 缓冲大小范围之外,则应该将其调整到其范围中。驱动则会选择最大值。正确的 |
| 236 | buf_size 值将回写到用户应用程序中。 |
| 237 | |
| 238 | omap3isp_[h3a_af/h3a_aewb/hist]_config.config_counter: |
| 239 | |
| 240 | 由于配置并未在申请之后同步生效,驱动必须提供一个跟踪这类信息的方法, |
| 241 | 以提供更准确的数据。在一个配置被申请之后,返回到用户空间应用程序的 |
| 242 | config_counter 是一个与其配置相关的唯一值。当用户应用程序接收到 |
| 243 | 一个缓冲可用或一个新的缓冲申请事件时,这个 config_counter 用于 |
| 244 | 一个缓冲数据和一个配置的匹配。 |
| 245 | |
| 246 | VIDIOC_OMAP3ISP_STAT_REQ |
| 247 | ------------------------ |
| 248 | |
| 249 | 将内部缓冲队列中最早的数据发送到用户空间,然后丢弃此缓冲区。 |
| 250 | omap3isp_stat_data.frame_number 域与视频缓冲的 field_count |
| 251 | 域相匹配。 |
| 252 | |
| 253 | |
| 254 | 技术参考手册 (TRMs) 和其他文档 |
| 255 | ========================== |
| 256 | |
| 257 | OMAP 3430 TRM: |
| 258 | <URL:http://focus.ti.com/pdfs/wtbu/OMAP34xx_ES3.1.x_PUBLIC_TRM_vZM.zip> |
| 259 | 参考于 2011-03-05. |
| 260 | |
| 261 | OMAP 35xx TRM: |
| 262 | <URL:http://www.ti.com/litv/pdf/spruf98o> 参考于 2011-03-05. |
| 263 | |
| 264 | OMAP 3630 TRM: |
| 265 | <URL:http://focus.ti.com/pdfs/wtbu/OMAP36xx_ES1.x_PUBLIC_TRM_vQ.zip> |
| 266 | 参考于 2011-03-05. |
| 267 | |
| 268 | DM 3730 TRM: |
| 269 | <URL:http://www.ti.com/litv/pdf/sprugn4h> 参考于 2011-03-06. |
| 270 | |
| 271 | |
| 272 | 参考资料 |
| 273 | ======= |
| 274 | |
| 275 | [1] include/linux/omap3isp.h |
| 276 | |
| 277 | [2] http://git.ideasonboard.org/?p=media-ctl.git;a=summary |