3월 152016
 

지난 게시글로 어느정도 워밍업이 되셨을 것이라고 보고… ㅎㅎㅎ
오늘 게시글은 상당히 복잡합니다. 바로 NX 바디에 NX 렌즈가 결합되었을 때, 또는 NX 바디의 전원을 켰을 때, 바디와 렌즈가 서로 같인 인증을 거치면서 렌즈로 부터 바디가 필요로 하는 데이터를 수집하는 절차에 대해 글을 올려보겠습니다.
이 절차는 워낙 까다로운 부분이 들어가고, 4년전에 이미 해석을 시도했을 때도 그랬지만, 이번에 좀더 다양한 바디와 렌즈를 이용했음에도 완전히 파악하지 못한 부분입니다. 물론 아주 약간… 4년 전보다는 나아졌지만요….
아… 그리고, 이번에 NX 마운트 통신을 분석할 때 즈음해서, 이번 NX500 스크립트와 관련하여, 렌즈 부팅절차에 도움이 되는 정보도 있었습니다.
https://github.com/ottokiksmaler/nx500/blob/master/Working%20with%20lens.md

 

NX 바디/렌즈가 결합된 상태에서 전원을 켰을 때 데이터 전송 절차

아래 로직 에널라이져의 캡쳐 화면은 NX 30/2 렌즈가 바디에 연결되었을 때, 전체 과정을 보여줍니다.

Boot-0-30Pan

 

  1. Echo : 간단한 데이터를 주고 받음으로써 기본 인증
  2. 렌즈 기본 정보 요구/수신: 연결된 렌즈의 기본 정보
  3. 렌즈 개별 특정 정보 요구/수신: 연결된 렌즈 중 바디에서 필요한 특정 정보를 요구/수신
  4. 조리개 초기화: 조라개 초기 위치로

위의 과정에서 (1)과 (2)의 과정을 거치는 동안 바디에서 CLK (1번 핀)으로 발생하는 동기화 클록은 250 KHz로 통신을 하다가, (3) 단계 부터는 2 MHz로 속도를 올려 쭉 통신을 주고 받습니다.
이제 각 단계에 대해서 좀더 자세하게 알아보겠습니다.

 

1 단계 : 첫번째 통신. ECHO!

지난 글에도 올렸듯이 NX 바디에 렌즈가 물리거나, 바디에 전원을 켜게 되면, 그래서 일단 바디에 뭔가가 체결되었다고 하면 가장 첫번째로 렌즈와 주고 받는 것입니다.

 

Boot-1-Echo

 

  • 먼저 바디에선 렌즈로 0x03 0xAA 0x55 라는 데이터를 DCL (3번 핀)으로 보냅니다.
  • 약간의 시간 간격 후, 렌즈는 LDR (5번 핀)을 HIGH에서 LOW로 상태를 변경하여, 렌즈에서 바디로 올라갈 데이터가 있음을 알립니다.
  • NX 바디는 렌즈에 데이터가 있음을 알고 1번 핀의 CLK에 동기 신호를 넣어줍니다.
  • 렌즈는 1번 핀의 CLK에서 보내주는 동기신호에 맞춰 바디로 0x03 0xAA 0x55 라는 데이터를 DLC (2번 핀)을 통해 보냅니다.

 

첫번째니까 좀 자세하게 설명드렸습니다. 다음부턴 오가는 데이터만 언급하겠습니다. ㅎㄷㄷㄷ

 

2단계: 렌즈 기본 정보 요구/수신

아래는 NX 바디가 렌즈에게 렌즈 기본 정보를 요구하고 수신하는 일부분을 캡쳐한 것입니다.

Boot-2-GetLensGeneralInfo

  • 바디에서 렌즈로 0x03 0x10 0x01 라는 데이터를 보냅니다.
  • 모든 게 정상이라면, 렌즈는 다음과 같은 데이터를 바디로 전송합니다.  
    • Byte 1: 전체 응답 패킷을 크기
    • Byte 2, 3 : 0x20 0x01 : 정상 처리했다는 의미 (다음부턴 ‘OK’ 라고 부르겠습니다.)
    • 블록 1 : Header (??) 라고 불러보겠습니다.
    • 블록 2 : 지원 Operation 정의 테이블 (크기 가변)
    • 블록 3 : 지원 Event 정의 테이블 (크기 가변)
    • 블록 4 : 지원 특성 정의 테이블 (크기 가변)
    • 블록 5 : 지원 특정 데이터 정의 테이블 (크기 가변)
    • 블록 6 : 지원 상태 정의 테이블 (크기 가변)
    • 블록 7 : 렌즈 제조사 (크기 가변)
    • 블록 8 : 렌즈 모델 (크기 가변)
    • 블록 9 : 렌즈 펌웨어 (크기 가변)
    • 블록 10 : 렌즈 시리얼 번호 (크기 가변)

이제 각 블록에 대해 알아보겠습니다.

 

2단계: 블록 1 : Header (??)

  • 크기 : 11 Byte

제가 이름 붙이길 Header라고 이름 붙인 부분인데, 모든 바디와 렌즈에서 같은 값이 올라옵니다. 마지막 값을 빼놓고요. 이 값이 혹시 렌즈 종류를 나타내는 고유번호가 아닐까 생갔했는데, 그것도 아니더군요.

일단 모아본 모든 데이터를 올려보겠습니다.

Header

 

2단계: 블록 2 : 지원 Operation 정의 테이블

  • Byte 1 – 3 : 무조건 0x00 0x00 0x00
  • Byte 4 : Operation 정의 갯수
  • 나머지 : 2 byte로 정의된 값이 Byte 4에서 정의된 값 만큼 있음

지원 Operation 정의 테이블의 구조는 파악했지만, 정확하게 의미하는 것은 알 도리가 없었습니다. 아래는 렌즈별 이 테이블의 값입니다.

10-SupportOperationTable

 

예를 들어 NX 20-50 렌즈의 경우 이 테이블은 16진수로 1001, 1005, 1006, 1007, 1008, 1009, 100C, 100D, 1101, 1102, 1004, 1008 들의 값을 가집니다.
이후로 어떤 데이터도 이와 관련한 값은 올라오지 않습니다. 추측컨데, 이 값들에 대한 정의는 NX 바디 내에서 가지고 있는 것 같고, 렌즈에서 올리는 이 값은, 바디 내에 정의된 값들을 지칭하는 값으로 보여집니다.

 

2단계: 블록 3 : 지원 Event 정의 테이블

  • Byte 1 – 3 : 무조건 0x00 0x00 0x00
  • Byte 4 : Event 정의 갯수
  • 나머지 : 2 byte로 정의된 값이 Byte 4에서 정의된 값 만큼 있음

이 Event 정의 테이블도 앞선 지원 Operation 정의 테이블과 같은 구조로 되어져 있습니다. 마찬가지로 이 테이블이 Event 정의 테이블이라는 것 이외에는 아무런 정보가 없습니다.

아래는 렌즈별 이 테이블의 값입니다.

11-SupportEventTable

앞선 경우와 마찬가지로, NX 45.8 렌즈의 경우 16진수로 4001, 4002, 4003 의 지원 값을 갖습니다.

 

2단계: 블록 4 : 지원 특성 정의 테이블

  • Byte 1 – 3 : 무조건 0x00 0x00 0x00
  • Byte 4 : 특성 정의 갯수
  • 나머지 : 2 byte로 정의된 값이 Byte 4에서 정의된 값 만큼 있음

이 특성 정의 테이블은 앞선 경우와 다른데, 여기서 정의된 값들은 차후 (3)단계 렌즈 개별 특정 정보 요구/수신 에서 각 값에 대한 상세정보를 요구하는데, 사용됩니다.

아래는 렌즈별 이 테이블의 값입니다.

12-SupportPropertyTable

예를 들자면, NX 30/2 렌즈의 경우는, 16진수로, 5001, 5002, 5003, 5007, 5008, 5009라는 값을 가지는데, 3단계에 가서 각 6개의 값에 대한 상세 정보를 바디에서 질의하고, 렌즈가 답하는 과정을 갖습니다. 그건 좀 있다 다시 설명 드리겠습니다.

 

2단계: 블록 5 : 지원 특정 데이터 정의 테이블

  • Byte 1 – 3 : 무조건 0x00 0x00 0x00
  • Byte 4 : 특정 데이터 정의 갯수
  • 나머지 : 2 byte로 정의된 값이 Byte 4에서 정의된 값 만큼 있음

이 Event 정의 테이블도 앞선 지원 Operation 정의 테이블과 같은 구조로 되어져 있습니다. 마찬가지로 이 테이블이 특정 데이터 정의 테이블이라는 것 이외에는 아무런 정보가 없습니다.

다만, NX1의 바디에선 이 테이블 값 중 특정 2개의 값만을 따로 (3)단계 렌즈 개별 특정 정보 요구/수신 에서 질의하는데, 이건 나중에 3단계에서 다시 설명드리겠습니다.

아래는 렌즈별 이 테이블의 값입니다.

13-SupportSpecificDataTable

2단계: 블록 6 : 지원 상태 정의 테이블

  • Byte 1 – 3 : 무조건 0x00 0x00 0x00
  • Byte 4 : 상태 정의 갯수
  • 나머지 : 2 byte로 정의된 값이 Byte 4에서 정의된 값 만큼 있음

이 Event 정의 테이블도 앞선 지원 Operation 정의 테이블과 같은 구조로 되어져 있습니다. 마찬가지로 이 테이블이 상태 정의 테이블이라는 것 이외에는 아무런 정보가 없습니다.

아래는 렌즈별 이 테이블의 값입니다.

14-SupportStatusTable

2단계: 블록 7 : 렌즈 제조사

  • Byte 1 : 제조사 값의 길이
  • 나머지 : Ascii 값으로 된 제조사 문자열

렌즈 제조사 정보를 담고 있습니다.

아래는 렌즈별 이 필드의 값입니다. 특이하게도 16-50PZ 렌즈만 완전한 렌즈 제조사 뿐만이 아니라 렌즈 이름 까지 완전하게 담고 있습니다.

15-LensManufacturer

2단계: 블록 8 : 렌즈 모델

  • Byte 1 : 렌즈 모델 값의 길이
  • 나머지 : Ascii 값으로 된 렌즈 모델 문자열

렌즈 모델 정보를 담고 있습니다.

아래는 렌즈별 이 필드의 값입니다.

16-LensModel

 

2단계: 블록 9 : 렌즈 펌웨어

  • Byte 1 : 렌즈 펌웨어 값의 길이
  • 나머지 : Ascii 값으로 된 렌즈 펌웨어 문자열

렌즈 펌웨어 정보를 담고 있습니다.

아래는 렌즈별 이 필드의 값입니다.

17-LensFirmware

 

2단계: 블록 10 : 렌즈 시리얼 번호

  • Byte 1 : 렌즈 시리얼 번호 값의 길이
  • 나머지 : Ascii 값으로 된 렌즈 시리얼 번호 문자열

렌즈 시리얼 번호 정보를 담고 있습니다. 앞선 블록들과 같은 구조입니다. 이 것에 대한 스샷은 생략하겠습니다.

자 여기까지 해서 2단계까지 진행된 후, 3단계로 들어가면 렌즈 개별 특정 정보 요구/수신하게 되는데, 앞선 블록 4 : 지원 특성 정의 테이블에서 정의한 모든 필드값들을 여기서 상세하게 질의하는 단계를 거칩니다.

 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)