3월 052016
 

이미 구석기시대에 상당부분 분석이 끝난 NX 마운트 프로토콜의 재분석 작업에 들어갔습니다.

이전에 작업했던 것은 어떻게 보면 상당부분 꼼수를 부린 것이거든요. ㅎㅎㅎ
렌즈와 카메라가 부팅을 시도할 때, 이전에 했던 테스트는 NX 30팬 렌즈의 프로파일을 그대로 덤프받아서 NX 바디를 속였던 것입니다.

이번에 EF-NX 어댑터를 이용하게 되면, 사진 촬영시 EXIF 데이터에 사용한 렌즈 모델명이라던가, 초점 거리, 조리개값 등등의 정보가 정상적으로 입력이 되려면, 아무래도 이전처럼 단순하게 NX 30팬 렌즈의 프로파일을 그대로 이용하는 것은 좀 아니라는 생각이 들었습니다.

그리고, 그 분석 내용 자체가 NX10 바디를 이용한 ‘구석기 시대’ 프로토콜이라, 그동안 분석한 내용이 여전히 유효할지도 알 수 없는 노릇이고…

거기다, 당시에 바디도 NX10 하나, 렌즈도 2개 정도 밖에 없어서, 분석한 내용들 중에서 풀리지 않은 부분들도 있었습니다.

이런 이유 때문에 처음 NX 프로토콜을 분석했던 이후 현재 제가 보유하고 있는 NX20과, NX1, 그리고 최초 버젼 NX10, 그리고 추가된 몇몇 렌즈들을 모두 동원해서 신호를 분석해보기로 했습니다.

 

프로토콜 분석을 위해 사용한 도구

SAM_0001-ko

 

이미 백만년 전 쯤에 구성해서 사용했던 것이고, 어찌어찌 버리지 않고 갖고 있었더니 쓸 날이 다시 왔습니다. ㅎㄷㄷㄷ

처음 시도할 땐, NX 마운트 분석을 위해 NX10을 분해 하여, 접점 연장 케이블을 붙이는 몰지각(?)한 시도를 했습니다만, 나중에 접사튜브를 만들면서 그런 무식한 짓(?)을 했던게 좀 후회가 되기도 했습니다.

어쨌든 접사튜브를 자작하면서 얻어진 실험용 접사튜브에 NX 마운트 접점을 연장하여 사용하면, 어떤 NX 카메라든, NX 렌즈든 연결하여 사용할 수 있기 때문에 작업효율이 향상됩니다.

이렇게 뽑아진 접점 데이터를 분석해줄 장비로, Saleae 사에서 제작한 8채널 로직 애널라이저를 붙여 PC에 연결해 데이터를 뽑아냅니다.

NX 마운트 접점 배열과 설명

NX 마운트의 핀 구조는 아래와 같습니다. 총 8개의 접점들이 있고, 마운트를 정면에서 바라봤을 때, 좌측부터 1번.. 그리고 맨 우측이 8번입니다.

 

1번 : CLK (Clock) – 카메라와 렌즈간 데이터 통신을 동기화하기 위한 클록 시그널 (바디 –> 렌즈)
2번: DLC (Data from Lens to Camera) : 1번 클록 시그널에 맞춰 렌즈에서 카메라로 전송하는 데이터. (렌즈 –> 바디)
3번: DCL (Data from Camera to Lens) : 1번 클록 시그널에 맞춰 카메라에서 렌즈로 전송하는 데이터. (바디 –> 렌즈)
4번: LRR (Lens Report Request) : 카메라 바디가 AF 시 렌즈로부터 상태 자료가 필요할 때, 짧게 발생시키는 신호. (바디 –> 렌즈)
5번: LDR (Lens Data Ready) : 렌즈에서 바디로 올릴 데이터가 있을 때, 상태를 HIGH (3.3V) 에서 LOW (0V)로 변환. (렌즈 –> 바디)
6번: GND (Ground) : 접지
7번: VDD : Logic용 전원 (3.3V)
8번: VCC : 각종 모터 (AF, 줌, 조리개 조절용 등) 전원 (5V)

각각 접점에 대한 정보는 차근차근 설명하도록 하겠습니다.

NX 마운트 데이터 통신 개요

  • SPI (Serial Peripheral Interface)의 간략형을 사용(SS-Slave Select를 사용하지 않음)하며 3개의 라인으로 구성.
  • 카메라 바디가 SPI 통신에서 Master 담당, 렌즈가 Slave 담당.
  • 1번 CLK – SPI에서 Clock
  • 2번 DLC – MISO (Master Input Slave Output)
  • 3번 DCL – MOSI (Master Output Slave Input)
  • 일번적으로 마이크로 컨트롤러 프로그램할 때 주변기기와 인터페이스를 하는 흔한 방법 중 하나인 SPI 통신을 이용합니다. 이것은 캐논 EF 마운트도 마찬가지 입니다.

3개의 라인으로 구성하여, SPI 통신에서 마스터 역할을 하는 NX 바디가 SPI통신 동기에 필요한 클록을 발생시켜 주고, 카메라와 렌즈가 이 클록에 맞춰 데이터를 주고받는 형태입니다.

 

NX 마운트 데이터 SPI 통신 (1 Byte Data)

SPI 통신에서도 에서도 몇가지가 있습니다. 일단 로직 애널라이저로 캡쳐한 데이터를 이용해 설명을 드리겠습니다.
이 포작 데이터는 카메라 바디에서 렌즈로 1 Byte의 데이터를 내려보내는 부분을 캡쳐했습니다.

OneByte

딱 보시면 아시겠지만, 클록이 8번 생성됨을 볼 수 있습니다. 기본 통신 데이터 단위는 8비트라는 것입니다. 그리고 한 클록의 주기에 0.5us가 소요되는 2MHz를 클록으로 하는 통신이라고 할 수 있습니다. (캐논 EF 마운트가 250KHz 정도 쯤 되니까, NX의 경우 8배 정도 빠른 통신을 하고 있다고 보시면 됩니다. 뭐 EF 마운트가 등장한 시기를 고려한다면 놀랄만한 일도 아니죠.)

그리고 데이터를 읽는 순간은 클록이 LOW –> HIGH로 변경되는 순간에 데이터를 샘플링합니다. DCL 그림에 빨간색 수직선의 위치가 CLK이 LOW –> HIGH로 변하는 순간이고, 그 때 DCL 시그널의 위치가 읽혀지는 값으로 아래에 빨간색 2진수 숫자로 적었습니다.

이렇게 읽혀진 한 BYTE 2진수는 0000 0111 = 7 이라는 숫자가 카메라에서 렌즈로 전송된 것입니다.

이렇게 해서 밝혀진 SPI 통신 규약은

  • Most Significant Bit First 통신을 수행합니다. – 이 말은 숫자의 가장 첫번째 비트가 먼저 전송된다는 뜻입니다.
  • 8 Bit per Transfer – 한번의 통신으로 8비트 전송됩니다.
  • Clock is High When Inactive – 데이터 전송하지 않을 때, CLK 라인은 항상 3.3V 유지한다는 뜻입니다. (SPI 규격 중 CPOL = 1)
  • Data is Valid on Clock Tailing Edge – CLK이 LOW에서 HIGH로 변할 때 데이터를 샘플링 한단 의미입니다. (SPI 규격 중 CPHA = 1)

 

NX 마운트 바디와 렌즈의 데이터 전송 프로토콜

이제 NX 마운트 통신의 가장 기본이되는 통신 규격에 대해 알아봤습니다.
그럼, 바디와 렌즈는 어떤 절차를 통해 서로 통신을 주고 받는지 설명드리겠습니다.

OnePacket

위의 데이터는 카메라 전원을 켰을 때, 최초로 바디와 렌즈가 주고 받는 통신의 내용입니다. 왼쪽에서 오른쪽으로 시간이 흐르면서 진행되는데, 주요 위치는 빨간펜(?)으로 표시했습니다.

NX시스템은 기본 카메라 바디와 렌즈의 통신에선 4개의 라인이 사용됩니다. (1, 2, 3, 5번 핀들)

처음 1번 CLK 동기 신호를 이용해, 3 Byte 의 데이터를 렌즈로 보냅니다. 약 1.5ms 후에 렌즈에서는 CLK 동기신호를 이용해 3바이트 데이터를 렌즈에서 카메라로 전송합니다. 첫번째 블록 (1) 에서 카메라에서 렌즈로 데이터를 보낼때, 동시에 렌즈에서 카메라로도 뭔가 데이터가 올라가는 것이 보입니다. 반대로 렌즈에서 카메라로 보내는 때 (3)도 카메라에서 렌즈로 뭔가를 보냅니다.

SPI 규격상 하나의 동기신호를 이용해 Master에서 Slave로, Slave에서 Master로 동시에 데이터를 전송하는 것이 가능합니다. 그러나 NX 마운트 프로토콜에서는 이런 쌍방향 통신이 의미있게 사용되지는 않습니다. (적어도 제가 관찰한 경우는 그렇습니다.)

즉, 카메라에서 렌즈로 데이터를 보낼 때, 또는 렌즈에서 카메라로 데이터를 보내는 순간 반대방향의 데이터는 사용되지 않습니다. (뭔가 있더라도 그냥 버려도 되는 쒸레기…. ㅎㄷㄷㄷ)

그런데, 보시면 새롭게 LDR (5번핀)의 데이터가 변하는 것이 보이죠. 보시면 카메라가 렌즈로 데이터를 보낼 때는 (일반 상태) HIGH 상태를 유지하다, 렌즈에서 카메라로 데이터를 보낼 때는 LOW가 됩니다. 그리고 데이터를 모두 전송하고 나면 다시 HIGH 상태가 됩니다.

그러니까, 5번핀 라인은 렌즈에서 데이터를 바디로 보낼 때만 LOW가 되는 신호 라인인 셈인데, 그래서 제가 이름을 LDR (Lens Data Ready)라고 이름을 붙였습니다. 렌즈가 바디에게 주는… “내가 너에게 할말이 있어….” 라는 신호라는 뜻이죠. ㅎㅎㅎ

자… NX 카메라와 렌즈의 통신 패킷에 대해 정리해보도록 하겠습니다.

(1) 카메라에서 렌즈로 3바이트 명령(?)을 전송한다. (스스로 CLK 동기신호를 발생하면서 거기에 맞춰 DCL 로 데이터를 전송한다.)
(2) 약 0.1ms 이후, 렌즈가 카메라에게 전송할 데이터가 있음을 알리기 위해 LDR신호 라인을 LOW로 변경한다.
(3) 카메라 바디는 렌즈의 데이터를 수신하기 위해, CLK 라인에 클록 시그널을 넣어준다. 동시에 렌즈는 그 클록 시그널을 이용해 DLC 라인을 이용해 데이터를 전송한다.
(4) 렌즈가 원하는 데이터를 모두 전송하고 나자, LDR 신호 라인을 다시 HIGH로 변경하고, 렌즈는 카메라의 명령을 받아들일 수 있는 상태로 돌아간다.

 

그럼.. 참고로… 이 데이터 전송의 의미는 무엇있가요?

상황으로 유추해 보겠습니다.

카메라의 전원이 처음 켜지자 마자 주고 받은 첫번째 데이터의 내용이 짧고, 송신과 수신한 내용이 같다????
이런 경우는 여친과 대화하는 상황에서도 발생합니다.

내가 누구와 대화를 하는데, 상대방이 내 말을 잘 듣고 있는지 의심이 갈 때 발생하는 상황이죠.

여친: !@##@%%$#%$
남친: …………..
여친: 너 내말 듣고 있어?
남친: 그럼!!!
여친: 그럼, 내가 뭐라고 했는지 말해봐.
남친: -_____-;;;;;

딱 요상황입니다.

카메라 전원을 켰고, 뭔가 카메라 마운트에 물려있는데, 이게 NX 렌즈인지 아닌지 후속 인증작업에 들어가기 위해, 첫마디 합니다.

카메라: 야호~~~
렌즈: 야호~~~~

이걸 확인하고, 카메라는 NX렌즈가 물려있다는 가정하게, 후속 인증작업을 시작합니다.

그러니까, 카메라가 주는 0x03 0xAA 0x55 명령어를 보면 16진수 AA 과 55를 2진수로 변경해 보면 1010 1010 0101 0101 인데, 패턴도 독특하죠. 데이터 통신을 주고 받는데, 간략한 확인 작업을 하기엔 아주 적합한 패턴아닌가요? ㅎㅎㅎ
저는 카메라가 0xAA 0x55 라는 패턴을 주고, 렌즈가 0xAA 0x55를 다시 전송하게 하는 이 명령을 ECHO 라로 명명하겠습니다. ㅎㅎㅎ

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)