资讯中心

038、sensor OTP/EEPROM标定数据的暗知识——那些不写在datasheet里的sensor个性——从LSC网格到AWB参考点的OTP数据解析与利用

📅 2026/8/12 16:16:25
038、sensor OTP/EEPROM标定数据的暗知识——那些不写在datasheet里的sensor个性——从LSC网格到AWB参考点的OTP数据解析与利用
038、sensor OTP/EEPROM标定数据的暗知识——那些不写在datasheet里的sensor个性——从LSC网格到AWB参考点的OTP数据解析与利用去年秋天我接手了一个安防项目的图像质量优化。项目用的是某家国产sensor型号我就不点了datasheet写得干干净净寄存器表、时序图、灵敏度曲线该有的都有。但样机一装问题就来了——同一批次的模组白平衡漂移得厉害有的偏青有的偏黄色温6000K的灯箱里同一张灰卡不同模组拍出来的RGB比值能差出8%。一开始我以为是模组厂没调好后来发现问题根本不在模组而在sensor的OTP数据——那批sensor的OTP里AWB参考点数据压根就没烧录或者烧录了但格式跟模组厂读出来的预期完全对不上。这事儿让我想起一个更早的教训。某手机项目LSC镜头阴影校正在实验室里调得完美中心到边缘的亮度均匀性做到95%以上但量产之后用户投诉边缘发暗尤其是暗光环境下四角明显偏色。我们排查了镜头、马达、模组组装最后发现是OTP里的LSC网格数据被读错了——sensor的OTP里存的LSC增益表不是我们以为的4x4网格而是6x6而且每个网格点的数据格式是12bit不是8bit。读错一位整个校正表就全乱了。这两件事让我意识到OTP/EEPROM里的标定数据才是sensor真正的“个性”所在。datasheet告诉你sensor应该是什么样OTP告诉你这颗sensor实际是什么样。而这两者之间的差距就是你要在代码里补的功课。先说LSC网格。很多工程师拿到sensor第一件事就是看datasheet里的LSC章节找到网格大小、增益范围、寄存器地址然后照着写驱动。但datasheet里写的往往是“典型值”或者说是“设计值”而每颗sensor因为工艺波动、微透镜偏移、IR滤光片镀膜差异实际的镜头阴影特性都不一样。OTP里存的LSC数据就是出厂前厂商用标准镜头测出来的每颗sensor的阴影补偿表。但问题在于这个表的格式、网格密度、数据位宽、甚至存储顺序不同厂商、不同型号甚至同一型号的不同批次都可能不一样。我踩过最深的坑是某颗sensor的OTP里LSC数据是分块存储的——前16字节是网格配置头后面跟着的是R、Gr、Gb、B四个通道的增益表但每个通道的表不是连续存储而是交错存放的。我一开始按连续读取结果校正出来的图像边缘出现明显的马赛克状色块。后来用逻辑分析仪抓了sensor厂商的参考驱动才发现他们读OTP的时候是分四次读每次读一个通道然后按网格坐标重新排列。这个细节datasheet上只字未提。再说AWB参考点。这是另一个容易被忽略的暗知识。很多sensor的OTP里会存一组“黄金参考点”数据通常是在标准光源D65、A光源、CWF等下sensor对灰卡的R/G、B/G比值。这组数据的作用是让ISP在自动白平衡时有一个“这颗sensor应该看到什么颜色”的基准。但问题来了——这组参考点是sensor厂商用他们自己的测试环境测出来的用的是他们的标准镜头、标准光源、标准灰卡。而你的模组镜头不一样IR滤光片不一样甚至sensor前面的保护玻璃不一样都会导致实际的光谱响应偏移。如果你直接拿OTP里的参考点去做AWB结果就是——在实验室里用标准灯箱测白平衡是准的但一到户外或者换了光源颜色就偏。我见过一个项目工程师把OTP里的AWB参考点直接写死到ISP的寄存器里结果用户拍蓝天拍出来是青的。后来我们做了个实验把OTP里的参考点跟实际模组在积分球里测出来的参考点对比发现B/G的差值有5%以上。这个偏移就是镜头和IR滤光片带来的。所以OTP数据的利用不是“读出来、写进去”这么简单。你要做的是理解每颗sensor的OTP数据结构然后根据你的模组实际做二次校准。具体来说分三步。第一步解析OTP数据结构。这一步的关键是不要相信datasheet里的寄存器表要相信实际读出来的数据。我通常的做法是写一个OTP dump工具把整颗sensor的OTP内容全部读出来存成二进制文件然后用十六进制编辑器打开对照datasheet里的地址映射逐字节核对。如果datasheet里没有地址映射那就只能靠猜——但猜也是有技巧的。比如LSC数据通常会有明显的规律性增益值一般是单调变化的或者有对称性。AWB参考点通常是一组小数值比如0.5到2.0之间的定点数。如果你读出来的数据某个区域的数值明显比其他区域大或者有明显的边界那很可能就是数据表的起始位置。这里有个经验OTP里通常会有校验和或者CRC但很多厂商的校验算法不公开。我遇到过一颗sensorOTP里最后两个字节是校验和但算法是简单的累加取反。我一开始没注意直接读了数据结果发现有些sensor的数据是错的但校验和居然通过了——因为厂商的校验算法只覆盖了部分地址。所以如果你发现某些sensor的OTP数据异常不要急着怀疑硬件先看看校验算法是不是覆盖了全部数据。第二步LSC数据的应用。读出来的LSC增益表不能直接写到ISP的寄存器里。因为ISP的LSC引擎通常要求增益表是“归一化”的即中心区域的增益为1.0边缘的增益大于1.0。但OTP里存的可能是绝对值也可能是相对值甚至可能是对数域的值。你需要根据ISP的规格做格式转换。这里我踩过一个坑某ISP的LSC增益表要求的是12bit定点数小数点在bit4即增益范围是0到15.9375。但OTP里存的是8bit整数范围是0到255。我一开始直接左移4位结果边缘增益过大图像出现严重的过曝。后来才发现OTP里的值需要先除以一个固定的缩放因子才能映射到ISP的格式。另一个坑是网格插值。OTP里的LSC数据通常是稀疏网格比如5x7或者9x9。但ISP的LSC引擎可能要求的是更密的网格比如17x17。这时候你需要做插值。但插值算法有讲究——双线性插值是最常用的但如果你直接对增益值做双线性插值在网格边界处会出现不连续。我建议先对增益值取对数再做插值最后再取指数。这样能保证插值后的增益曲线是平滑的不会出现突变。第三步AWB参考点的校准。OTP里的AWB参考点不能直接用。你需要用你的模组在标准光源下拍灰卡然后计算实际的R/G、B/G比值跟OTP里的参考点做对比得到一个偏移量。这个偏移量可以存到模组的EEPROM里或者存到系统的校准文件里。在ISP的AWB算法里用这个偏移量去修正OTP的参考点。这样即使你的模组跟sensor厂商的标准模组有差异也能保证白平衡的准确性。这里有个细节AWB参考点的偏移量不是简单的加减。因为sensor的光谱响应是非线性的不同色温下偏移量可能不一样。所以你需要在多个色温下比如D65、A光源、CWF分别测偏移量然后做插值。我见过一个项目只测了D65下的偏移量结果在A光源下白平衡还是偏。最后说点个人经验。OTP数据的解析和利用本质上是一个“逆向工程”的过程。你面对的是一个黑盒里面存着厂商不想让你轻易读懂的数据。但只要你耐心总能找到规律。我的建议是第一永远不要假设OTP数据的格式跟datasheet里写的一样一定要实际读出来验证。第二写一个通用的OTP解析工具支持多种格式的解析这样换sensor的时候不用重新写代码。第三OTP数据读出来之后一定要做交叉验证——比如用LSC数据校正后的图像跟用标准灰卡测出来的实际阴影做对比看是否一致。如果一致说明你读对了如果不一致说明哪里读错了。还有一点OTP数据是每颗sensor独有的所以量产的时候一定要在产线上做OTP数据的读取和校验。有些sensor的OTP是可编程的但有些是一次性的。如果你的模组厂在组装过程中不小心把OTP写坏了那这颗sensor就废了。所以产线上的OTP读取一定要加校验确保读出来的数据是完整的、正确的。OTP数据是sensor的“身份证”也是sensor的“体检报告”。读懂它你才能真正驾驭这颗sensor。别嫌麻烦别跳过这一步。否则你会在后续的图像质量调优中花十倍的时间去弥补。