\documentclass[a4paper,12pt]{extarticle}
\usepackage{/home/eddy/ed}
\title{Протокол управления объективами Canon EF}
\author{}
\FDL
\begin{document}
\maketitle
\section{Методика <<взлома>>}
Для работы со SPI--интерфейсом объектива использовался микроконтроллер PIC16F873a,
подключенный к персональному компьютера через интерфейс~RS--232.
Так как кварцевый резонатор контроллера имел частоту~$f_{osc}=4\,$МГц, пришлось ограничиться
довольно медленной скоростью~--- 19.2\,кбит/с.

SPI--интерфейс контроллера был настроен на скорость передачи сообщений~$f_{osc}/64$ (62.5\,кГц).
SPI работал в третьем режиме (высокий уровень CLK, передача информации на падающий
фронт CLK, прием в середине такта -- на возрастающий фронт CLK), регистры:
\begin{verbatim}
SSPCON = 0x32; TRISC = 0xD0; CKE = 0; SSPIE = 1; SMP = 0;
\end{verbatim}

Для анализа сообщений, отсылаемых фотоаппаратом объективу, SPI переключался в пассивный
режим:
\begin{verbatim}
SSPCON = 0x35; TRISC = 0xD8; CKE = 0; SSPIE = 1;  SMP = 0;
\end{verbatim}
Однако, поток данных в обычном режиме работы фотоаппарата довольно велик, а скорость RS--232
слишком мала, чтобы контроллер успевал за промежуток между посылками отсылать их на~ПК.
Для буферизации посылок использовался массив данных из~95 элементов. Полученные по
SPI--интерфейсу данные буферизовались контроллером в этот массив, а затем, при заполнении
буфера или по команде пользователя, буфер передавался на~ПК.
Однако, и в этом случае оказалось очень много дополнительных команд, не имеющих отношения
к управлению объективом.

Для подбора команд, вызывающих изменение фокусного расстояния объектива было принято решение
отсылать поочередно объективу ненулевую однобайтную посылку, за которой следовало восемь
нулевых посылок (как оказалось, нулевые посылки используются фотоаппаратом для считывания
информации с объектива).

Методом последовательного перебора были определены основные управляющие команды.
Временн\'ые интервалы между командами могут быть довольно велики. Если объектив должен
ответить на какой-нибудь запрос, а после запроса никаких посылок не отсылалось, объектив
будет ждать очередных посылок, чтобы выдать запрашиваемые данные. Поэтому стоит
каждую команду завершать последовательностью нулевых посылок.

\section{Команды EF~200}
Некоторые команды не требуют от объектива ответа, поэтому их можно не завершать нулями,
однако, некоторые запросы подразумевают достаточно длинный ответ, и требуют до восьми
последующих нулевых сообщений.

Для перехода в ручной режим управления используется команда~{\bf94} или ее эквивалент~{\bf30}
(все команды записываются здесь в десятичной системе).
За этой командой должны следовать одна или две нулевых посылки.
Некоторые команды для изменения фокусного расстояния требуют предварительного
перехода в ручной режим управления.

Для увеличения фокусного расстояния объектива используются следующие команды
(объектив EF~200, для EF~85 скорости не изменяются).
\begin{description}
\item[5] плавное увеличение фокусного расстояния (если за ней не следует других команд).
\item[37] быстрый переход в~$\infty$, за этой посылкой должны следовать две нулевые.
\end{description}
Для уменьшения фокусного расстояния используются команды
\begin{description}
\item[6] плавное перемещение на отметку~2.5\,м.
\item[22] быстрый переход на отметку~2.5\,м. За этой командой следуют две
нулевых. Эта команда имеет полные эквиваленты: {\bf 38, 70, 86}.
\item[68] поворот привода объектива на заданный угол. Угол задается двумя следующими
байтами (short int, старший байт первый). Узнать текущее угловое положение можно командой~192.
\end{description}
Для останова используется команда~{\bf4}. Таким образом, манипулируя командами~{\bf5/6}
и~{\bf4} можно добиться постепенного изменения фокусного расстояния. Помимо ожидания
для изменения фокусного расстояния на нужную величину после команд~{\bf5} или~{\bf6}
можно отсылать нулевые посылки.

Кроме этой команды есть следующие информационные команды, чье предназначение
пока не расшифровано (для EF~200, EF~85 см. в сводной таблице):
\begin{description}
\item[31] имеет двухбайтный ответ, оба байта содержали комбинации из единицы и тройки.
\item[79] имеет трехбайтный ответ, являющийся комбинацией единиц и нулей.
\item[95] ведет себя аналогично~{\bf31}.
\item[111] имеет однобайтный ответ~--- единицу.
\item[120] имеет однобайтный ответ~--- восьмерку.
\item[239] имеет однобайтный ответ~--- 224 или 225.
\item[247] однобайтный ответ 240.
\item[250] однобайтный ответ 130 или~128.
\item[251] однобайтный ответ 248.
\item[252] однобайтный ответ (разные числа).
\item[128] ответ из семи или восьми байт, возможно~--- запрос статуса объектива.
\end{description}

Было обнаружено еще несколько подозрительных запросов, ответом на которые был один
байт с постоянным значением 128 или 192 (при любых манипуляциях с объективом).


\subsection{Небольшое дополнение}
команды (EF~85):

10 --- {\bf инициализация}, без этой команды EF85 не работает.

194 --- узнать расстояние фокусировки (в метрах). Ответ --- четыре байта, первые два --- текущее расстояние,
вторые два --- предыдущее положение. В паре чисел первое умножаем на 2.5\,м и складываем со вторым (в
сантиметрах).

192 --- узнать угловое положение лимба (от некоторого условного нуля). Ответ --- два байта (short int,
старший байт первый).

Управление диафрагмой: два байта число 18 (собственно команда) и байт --- на сколько изменить
текущее состояние диафрагмы (signed char) положительное число для закрытия, отрицательное -- открыть.


При небольшом изменении состояния диафрагмы каждая команда 2 или 3 повторяет это изменение.
Плюс объектив входит в режим пошаговой подстройки фокусировки. Выход из этого режима --- команда 8
(или ее эквиваленты 11, 27, 43, 75).


\section{Сводный перечень команд для EF~85}
Расшифровка обозначений столбцов:
\begin{description}
\item[cmd] команда;
\item[N] минимальная длина ответа в байтах;
\item[ans] ответ (в случае изменяющегося ответа --- диапазон);
\item[desc] краткое описание команды.
\end{description}
Команды, чье предназначение не выявлено, имеют пустое поле описания.
Если действие команды аналогично другой команде, в описании пишется эта команда.
Под F подразумевается значение расстояния до объекта, чье изображение
четко сфокусировано. Буква <<о>> в описании означает, что назначение команды
неизвестно, но она приводит к отключению ручного управления~F.
Если в ответах встречаются записи через слеш, значит, в разные моменты времени
появляется то одна, то другая из приведенных команд без видимой зависимости.
\begin{longtable}[c]{||c||c|c| p{0.5\textwidth}||}
\caption{Сводка команд}\\
\hline\hline
\bf cmd &\bf N &\bf ans &\bf desc\\
\hline
\hline
\endfirsthead
\caption{(продолжение).}\\
\hline
\bf cmd &\bf N &\bf ans &\bf desc\\
\hline
\hline
\endhead
\hline
\endfoot

0 & 1 & 0 & <<пустышка>> для получения ответа от объектива\\
1 & 1 & 1 & \\
\bf 2 & 1 & 2 & повтор предыдущего изменения величины диафрагмы, режим коротких шагов перемещения\\
3 & 1 & 3 & 2\\
\bf 4 & 1 & 4 & остановить изменение F\\
\bf 5 & 1 & 5 & увеличить F\\
\bf 6 & 1 & 6 & уменьшить F\\
7 & 1 & 7 & о\\
\bf 8 & 2 & 255/0, 170 & отмена действия команды 2\\
9 & 1 & 9 & о\\
\bf 10 & 1 & 10 & инициализация объектива EF85 (без этой команды он не выходит из спящего режима)\\
11 & 1 & 11 & 8\\
12 & 1 & 12 & \\
13 & 1 & 13 & \\
14 & 1 & 14 & \\
15 & 1 & 15 & \\
16 & 2 & 16, 16 & \\
17 & 2 & 17, 17 & \\
\bf 18 & 2 & 18, 18 & управление затвором, вторым байтом (signed char) отсылается степень изменения
	диаметра отверстия (положительным значениям соответствует уменьшение диаметра)\\
19 & 2 & 19, 19 & 18\\
20 & 2 & 20, 20 & 4\\
21 & 2 & 21, 21 & 5\\
22 & 2 & 22, 22 & 6\\
23 & 2 & 23, 23 & о\\
24 & 3 & 24, 0/255, 170 & \\
25 & 2 & 25, 25 & о\\
26 & 2 & 26, 26 & \\
27 & 2 & 27, 27 & 8\\
28 & 2 & 28, 28 & \\
29 & 2 & 29, 29 & \\
30 & 2 & 30, 30 & (для EF~200 эквивалент команды 94)\\
31 & 2 & 31, 31 & \\
32 & 2 & 32, 32 & \\
33 & 2 & 33, 33 & \\
34 & 2 & 34, 34 & \\
35 & 2 & 35, 35 & \\
36 & 2 & 36, 36 & 4\\
37 & 2 & 37, 37 & 5\\
38 & 2 & 38, 38 & 6\\
39 & 2 & 39, 39 & о\\
40 & 3 & 40, 255/0, 170 & \\
41 & 2 & 41, 41 & о\\
42 & 2 & 42, 42 & \\
43 & 2 & 43, 43 & 8\\
44 & 2 & 44, 44 & \\
45 & 2 & 45, 45 & \\
46 & 2 & 46, 46 & \\
47 & 2 & 47, 47 & \\
48 & 1 & 48 & \\
49 & 1 & 49 & \\
50 & 1 & 50 & \\
51 & 1 & 51 & \\
52 & 1 & 52 & \\
53 & 1 & 53 & \\
54 & 1 & 54 & \\
55 & 1 & 55 & \\
56 & 1 & 56 & \\
57 & 1 & 57 & \\
58 & 1 & 58 & \\
59 & 1 & 59 & \\
60 & 1 & 60 & \\
61 & 1 & 61 & \\
62 & 1 & 62 & \\
63 & 1 & 63 & \\
64 & 3 & 64, 64, 64 & \\
65 & 3 & 65, 65, 65 & \\
66 & 3 & 66, 66, 66 & \\
67 & 3 & 67, 67, 67 & \\
68 & 3 & 68, 68, 68 & переместить объектив на заданное кол-во шагов (2 байта, int16, hi-low)\\
69 & 3 & 69, 69, 69 & 5\\
70 & 3 & 70, 70, 70 & 6\\
71 & 3 & 71, 71, 71 & о\\
72 & 4 & 72, 72, 255/0, 170 & \\
73 & 3 & 73, 73, 73 & о\\
74 & 3 & 74, 74, 170 & \\
75 & 3 & 75, 75, 75 & 8\\
76 & 3 & 76, 76, 76 & \\
77 & 3 & 77, 77, 77 & \\
78 & 3 & 78, 78, 78 & (для EF~200 эквивалент команды 94)\\
79 & 3 & 79, 79, 79 & \\
80 & 2 & 80, 80 & \\
81 & 2 & 81, 81 & \\
82 & 2 & 82, 82 & \\
83 & 2 & 83, 83 & \\
84 & 2 & 84, 84 & 4\\
85 & 2 & 85, 85 & 5\\
86 & 2 & 86, 86 & 6\\
87 & 2 & 87, 87 & о\\
88 & 3 & 88, 255/0, 170 & \\
89 & 2 & 89, 89 & о\\
90 & 2 & 90, 170 & \\
91 & 2 & 91, 91 & \\
92 & 2 & 92, 92 & \\
93 & 2 & 93, 93 & \\
\bf 94 & 2 & 94, 94 & включить ручное управление F\\
95 & 2 & 95, 95 & \\
96 & 1 & 96 & \\
97 & 1 & 97 & \\
98 & 1 & 98 & \\
99 & 1 & 99 & \\
100 & 1 & 100 & \\
101 & 1 & 101 & \\
102 & 1 & 102 & \\
103 & 1 & 103 & \\
104 & 1 & 240 & \\
105 & 1 & 35 & \\
106 & 2 & 35, 253 & \\
107 & 2 & 232, 103 $\div$ 215, 185& \\
108 & 2 & 108, 236 $\div$ 112, 0 & \\
109 & 2 & 220, 80 $\div$ 103, 56 & \\
110 & 2 & 112, 108 $\div$ 113, 62 & \\
111 & 1 & 0/16 & \\
112 & 1 & 112 & \\
113 & 1 & 113 & \\
114 & 1 & 114 & \\
115 & 1 & 115 & \\
116 & 1 & 116 & \\
117 & 1 & 117 & \\
118 & 1 & 118 & \\
119 & 1 & 119 & \\
120 & 1 & 120 & \\
121 & 1 & 121 & \\
122 & 1 & 122 & \\
123 & 1 & 123 & \\
124 & 1 & 124 & \\
125 & 1 & 125 & \\
126 & 1 & 126 & \\
127 & 1 & 127 & \\
128 & 6 & 129, 239, 0, 85, 0, 85 & модель объектива ?\\
129 & 1 & 129 & \\
130 & 1 & 130 & \\
131 & 1 & 131 & \\
132 & 1 & 132 & \\
133 & 1 & 133 & \\
134 & 1 & 134 & \\
135 & 1 & 135 & \\
136 & 1 & 136 & \\
137 & 1 & 137 & \\
138 & 1 & 138 & \\
139 & 1 & 139 & \\
140 & 1 & 140 & \\
141 & 1 & 141 & \\
142 & 1 & 142 & \\
143 & 1 & 143 & \\
\bf 144 & 2 & 0/32, $X$ & старший бит $X$ --- значение переключателя <<AF/MF>> (нулю
		соответствует AF)\\
145 & 1 & 145 & \\
146 & 1 & 146 & \\
147 & 1 & 147 & \\
148 & 1 & 255 & \\
149 & 1 & 149 & \\
150 & 1 & 150 & \\
151 & 1 & 151 & \\
152 & 1 & 152 & \\
153 & 1 & 153 & \\
154 & 1 & 154 & \\
155 & 1 & 155 & \\
156 & 1 & 156 & \\
157 & 1 & 157 & \\
158 & 1 & 158 & \\
159 & 1 & 159 & \\
160 & 2 & 0, 85 & \\
161 & 1 & 161 & \\
162 & 1 & 162 & \\
163 & 1 & 163 & \\
164 & 1 & 164 & \\
165 & 1 & 165 & \\
166 & 1 & 166 & \\
167 & 1 & 167 & \\
168 & 1 & 168 & \\
169 & 1 & 169 & \\
170 & 1 & 170 & \\
171 & 1 & 171 & \\
172 & 1 & 172 & \\
173 & 1 & 173 & \\
174 & 1 & 174 & \\
175 & 1 & 175 & \\
176 & 3 & 13, 13, 72 & \\
177 & 2 & 91, 92 & \\
178 & 3 & 96, 2, 71 & \\
179 & 2 & 104, 92 & \\
180 & 1 & 180 & \\
181 & 1 & 181 & \\
182 & 1 & 182 & \\
183 & 1 & 183 & \\
184 & 1 & 184 & \\
185 & 1 & 185 & \\
186 & 1 & 186 & \\
187 & 1 & 187 & \\
188 & 1 & 188 & \\
189 & 1 & 189 & \\
190 & 1 & 190 & \\
191 & 1 & 191 & \\
\bf 192 & 2 & short int & угловое положение лимба F, первый байт --- старший, нуль относительный\\
193 & 1 & 193 & \\
\bf 194 & 4 & $X_1, X_2, Y_1, Y_2$ & значение F в метрах; $X$~-- текущее F, $Y$~-- предыдущее F;
		$F(\text{метр}) = 2.5\cdot X_1+X_2/100$ \\
195 & 1 & 195 & \\
196 & 2 & 0, 9 $\div$ 10, 1 & \\
197 & 1 & 197 & \\
198 & 1 & 198 & \\
199 & 1 & 199 & \\
200 & 1 & 200 & \\
201 & 1 & 201 & \\
202 & 1 & 202 & \\
203 & 1 & 203 & \\
204 & 1 & 204 & \\
205 & 1 & 205 & \\
206 & 1 & 206 & \\
207 & 1 & 207 & \\
208 & 1 & 208 & \\
209 & 1 & 209 & \\
210 & 1 & 210 & \\
211 & 1 & 211 & \\
212 & 1 & 212 & \\
213 & 1 & 213 & \\
214 & 1 & 214 & \\
215 & 1 & 215 & \\
216 & 1 & 216 & \\
217 & 1 & 217 & \\
218 & 1 & 218 & \\
219 & 1 & 219 & \\
220 & 1 & 220 & \\
221 & 1 & 221 & \\
222 & 1 & 222 & \\
223 & 1 & 223 & \\
224 & 2 & 61, 186 $\div$ 61, 172 & \\
225 & 1 & 225 & \\
226 & 1 & 226 & \\
227 & 1 & 227 & \\
228 & 2 & 30, 84 & \\
229 & 1 & 229 & \\
230 & 1 & 230 & \\
231 & 1 & 231 & \\
232 & 2 & 163, 203 $\div$ 162, 105 & \\
233 & 1 & 233 & \\
234 & 2 & 157, 166 $\div$ 163, 205 & \\
235 & 1 & 235 & \\
236 & 1 & 236 & \\
237 & 1 & 237 & \\
238 & 1 & 238 & \\
239 & 1 & 239 & \\
240 & 1 & 10 & \\
241 & 1 & 241 & \\
242 & 1 & 242 & \\
243 & 1 & 243 & \\
244 & 1 & 244 & \\
245 & 1 & 245 & \\
246 & 1 & 246 & \\
247 & 1 & 247 & \\
248 & 1 & 185 $\div$ 188 & \\
249 & 1 & 3 $\div$ 7 & \\
250 & 1 & 192 $\div$ 194 & \\
251 & 1 & 251 & \\
252 & 1 & 198 $\div$ 201 & \\
253 & 1 & 0 & \\
254 & 1 & 207 $\div$ 208 & \\
255 & 1 & 255 & \\
\hline\hline
\end{longtable}
Команды можно условно разделить на две половины: если старший бит команды равен нулю, объектив
выполняет определенные действия. Когда старший бит команды равен единицы, у объектива запрашиваются
определенные данные.

Команды изменения F аналогичны (за исключением разрядности ответа). Младшие 4~байта принимают
значения 0100 (стоп), 0101 (F$+$), 0110 (F$-$), самый старший бит --- обязательно 0.
Биты $4\div6$ принимают любые значения, кроме 110, 011 и 111.
\end{document}

