DIY适马佳能AF镜头兼容性修复(\"rechip\")

原文:Github & Twitter

翻译/校对:Given

使用佳能EF卡口的旧的适马镜头不能在新的佳能机身上工作,因为适马不完全反向工程EF协议,没有实现所有需要的命令。这是一个DIY修复方法,使用ATtiny13单片机来修改协议,使镜头重新兼容数码EOS机身。

有些人喜欢称之为 “rechip”,”rechip”实际上是指官方的修复,包括更换镜头中的芯片。但这个修正是一个附加的修正,并没有替换镜头中现有的芯片,所以更应该称之为 “modchip”。


功能介绍

**低功耗**:该修复在活动模式下(例如拍摄、自动对焦、实时视图模式或更改镜头设置时)消耗约500µA,在睡眠模式下(在标准模式下或相机关闭时,在几秒钟不活动后自动进入)消耗不到1µA。因此,它不会对电池寿命产生可衡量的影响。 **被动式**:本方案不像其他方案那样通过DCL线路由MCU处理,而是使用一个电阻,仅在必要时主动覆盖DCL。因此,在协议的正常运行中,它的影响为零,只改变需要改变的一个位。 **正确的EF协议**:与其他版本不同,这个版本正确解析EF协议,并跟踪命令长度。它还有一个超时功能,如果出了问题,可以与命令重新同步。 [dogevideo]57b05519765a9df3[/dogevideo]


编译

输入make来编译工程(需要avra编译器),或者make flash来用avrdude flash (默认使用 usbtiny 编译器,但你可以使用 make PROGRAMMER=foo来改变编译器类型)。如果你使用其他的编程方法,不要忘了刷写保险丝 (LFUSE=0x72 HFUSE=0xfb)。


安装方法

安装时,需要剪断相机到镜头的DCL线,并在线路上插入一个220Ω的电阻,然后将编程后的ATtiny13接上,如下图所示。

                             Camera side
                =========================================
                DGND  LCLK  DLC  DCL  VDD  PGND/DET  VBAT
                                                
  ATtiny13    ,------------------------+             
 \_\_\_\_\_\_\_\_\_\_                                    
o                           \\                 

1RESET VCC8-‘ 220/
2PB3 PB27 Ω \
3PB4 PB16———-+ /
,-4GND PB05———————+
__________
`——————-+

                DGND  LCLK  DLC  DCL  VDD  PGND/DET  VBAT
                =========================================
                                Lens side

安装示例


问题

佳能EF镜头同时接受12 YY13 YY两个命令,以YY步数(符号为uint8)改变光圈。旧的胶片佳能机身使用12 YY,而新的数码机身使用13 YY。看来适马并没有通过尝试所有可能的命令来完全逆向工程协议,而只是实现了当时佳能机身使用的命令。因此,老的适马镜头只支持12 YY。如果这样的镜头用在新机身上,光圈永远不会移动。光圈有一个位子反馈给相机:是否在全开位置。相机会根据它所期望的光圈位置来检查这一点。因此,这些老镜头的行为如下:如果光圈是大开(常见情况),镜头只会在相机光圈设置为全开(匹配)的情况下拍摄,否则相机会抛出一个错误。如果光圈不是全开(比如被手动移动了,或者在关机时取下了镜头),那么相机会允许用其他光圈设置拍照,但光圈当然也不会移动。


解决方法

把命令13补成命令12。他们之间只有一个比特的差异差。由于协议是MSB优先,所以只要前面7个位都收到后,即可完成,也就是说不需要延迟或缓冲协议,而是可以近乎实时完成。


原理

代码的大部分时间都是处于在睡眠模式下的。当LCLK为低电平时(在命令开始时),它通过低电平INT0中断唤醒芯片。中断处理程序什么也不做,只是从掉电模式返回。然后,主程序禁用中断以防止其重新启动,并接收命令字节。唤醒延迟是这样的:当LCLK为高电平时,芯片正好可以对第一个命令位进行采样,这是预期的采样时间。 在接收到7个命令位后,代码会检查命令0x12/0x13。如果命令匹配,则等待下一个位周期,然后强制DCL为低。这将任何0x13命令改写成0x12,然后等待镜头通过LCLK脉冲确认命令。 由于命令可以有参数,而且没有明确的框架来区分参数和命令,因此代码中包含了所有256个可能的命令以及预期参数长度的表格(根据佳能镜头进行检查)。如果有任何参数字节,它就会读取这些字节,而不进行任何进一步的处理,然后回到睡眠模式,等待下一条命令。 为了在出现故障时实现超时,定时器0设置了0-700µs的超时,并在每个命令开始时启动,同时允许中断。只有当镜头应答一个命令时,它才会停止。如果定时器过期,它就会触发一个中断,该中断不会返回,而是从复位向量重新启动整个程序。这与佳能镜头的行为类似,如果一个命令字节的时间超过700µs,它将启动一个协议复位。