\documentclass[a4paper,12pt]{extarticle}
\usepackage{/home/eddy/ed}
\usepackage{hyperref}
\title{Протокол управления объективами Canon EF}
\author{}
\FDL
\begin{document}
\maketitle
\section{Методика <<взлома>>}
Для работы со SPI--интерфейсом объектива использовался микроконтроллер PIC16F873a\footnote{На основе
STM32F103 разработано устройство управления:
\url{https://github.com/eddyem/stm32samples/tree/master/F1:F103/Canon_managing_device}.},
подключенный к персональному компьютера через интерфейс~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}
можно отсылать нулевые посылки.

Кроме этой, есть следующие информационные команды (предназначение многих
пока не расшифровано):
\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 не работает; для EF200 и EF400 эта команда~--- поллинг состояния
(во время движения элементов объектива возвращаются 0xff, как только движение прекращается~--- 0xaa).

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

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

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

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

Так как объектив отвечает, начиная со второго байта посылки по SPI, каждую команду необходимо дополнять нулем,
либо после нее сразу вызывать поллинг (0x0a, 0x00; вплоть до получения ответа xx, 0xaa, где xx~-- либо 0, либо
последний байт с предыдущего запроса). Команды, не связанные с выполнением какого-либо движения (особенно
геттеры), не требуют поллинга. Для вызова геттера 16-битного беззнакового параметра вызывать: cmd, 0, 0, 0; ответом
будет 0, cmd, H, L: cmd~-- команда, HL~-- данные. Сеттер 16-битного беззнакового: cmd, H, L, 0. Любой другой запрос
n~байт данных должен иметь длину n+1~байт: команда плюс n~нулей.


\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 & $X$, $Y$ & 16-битное беззнаковое (старший байт --~$X$), флаги ручного управления: бит~13 установлен в 1
во время активности (вращение лимба фокусировки) и 5с после ее прекращения; бит~7~-- флаг MF; бит~4~-- лимб в
одном из крайних положений; бит~2~-- лимб вращается \\
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, первый байт --- старший, нуль около бесконечности (чуть левей), отрицательные числа~--- движение к 2.5m, чем больше модуль числа, тем ближе к 2.5m\\
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$ (не работает у EF200!) \\
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.

\section{Сводный перечень команд для EF~200}
В марте 2016~г. при помощи цифрового логического анализатора были сняты логи протоколов общения
фотоаппарата и объектива, в результате чего выявлены используемые команды. В таблице представлены
только те команды, которые использовал фотоаппарат\footnote{В расшифровке команд также
использовались данные из
\url{https://pickandplace.wordpress.com/2011/10/05/canon-ef-s-protocol-and-electronic-follow-focus/}
и \url{http://www.rwpbb.ru/test/canonautosonyl.html}}.
\begin{longtable}[c]{||c|c||c|c| p{0.5\textwidth}||}
\caption{Сводка команд EF~200}\\
\hline\hline
\bf hex & \bf dec &\bf N &\bf ans &\bf desc\\
\hline
\hline
\endfirsthead
\caption{(продолжение).}\\
\hline
\bf hex & \bf dec &\bf N &\bf ans &\bf desc\\
\hline
\hline
\endhead
\hline
\endfoot
0x01 & 1 & 6 & 0xc8,0,0xc8,0,0,0 & lens ID, min/max zoom, proto, brand ? \\
0x05 & 5 & 1 & 0x05 & установка фокуса в положение минимума (отменяет действие 94)\\
0x06 & 6 & 1 & 0x06 & установка фокуса в положение максимума (отменяет действие 94)\\
0x07 & 7 & 1 & 0x07 & включить напряжение на двигателях объектива\\
0x08 & 8 & 1 & 0x08 & отключить напряжение\\
0x0a & 10 & 2 & 0xaa,0 & busy poll\\
0x0c & 12 & 1 & 0x0c & конец инициализации, за командой следует пауза\\
0x0e & 14 & 1 & 0x0e & ? встречается при включении, автофокусе, экспозиции, за ней
	обычно следует 0x0f\\
0x0f & 15 & 1 & 0x0f & аналогично предыдущей, за ней обычно следует что-нибудь из 0xf0, 0x0a,
	0xc0, 0x90\\
0x13 & 19 & 2 & 0x13,0x13 & установка диафрагмы, второй байт -- степень открытия (max: 0x80; F/2.5:
	0x07;	F/4.0: 0x12; F/8.0: 0x22; F/16.0: 0x32; за аргументом обычно идет 0x90, для некоторых
	объективов	перед этой командой надо дать 0x07\\
0x50 & 80 & 2 & 0x50, 0x50& имеет аргумент: 0x2c..0x2f; 0x2c встречается при
	нажатии кнопки <<set focus>> и иногда при автофокусировке; 0x2d~--- при автофокусе и экспозиции
	на бесконечность; 0x2e~--- автофокус и экспозиция на F2.5m; в остальных случаях~--- 0x2f\\
0x80 & 128 & x & 0x81,0x87,0x00 & с этого байта начинается стартовая последовательность
	0x80,0x0a,0x99 (третий байт для других объективов~--- 0x97), видимо, узнать модель или протокол
	объектива\\
0x90 & 144 & 3 & a,b,0 & Состояние регуляторов объектива. Первый байт при вращении кольца управления
	фокусом равен 0x20 (и некоторое время после окончания вращания), иначе нуль;
	второй байт: биты 0 и 1 равны единице, если диафрагма не полностью 	открыта;
	бит 2 равен единице, если в данный момент кольцо вращают; бит 4 равен единице, если достигнут
	нижний или верхний предел F; бит 7 равен единице при положении переключателя AF/MF в MF\\
0xa0 & 160 & 2 & 0x00,0xc8 & входит в состав порции данных при периодическом опросе (после
	инициализации), за ней идет 0xe4\\
0xb0 & 176 & 3 & 0x16,0x16,0x50 & идет после 0xf0 или 0x0a; за ней бывают либо 0,0,a0, либо 0,0,c0,
	либо 7f,ff,0a -> ответ не меняется; min/max aperture?\\
0xb2 & 178 & 4 & 0x5a,a,b,0 & ? ответ зависит от положения фокуса\\
0xc0 & 192 & 3 & a,b,0 &  положение лимба (в режиме <<ручной фокус>> возвращает нули, если подключен к фотоаппарату)\\
0xe0 & 224 & 2 & 0xc2,a & ? за ней обычно следует 0xea\\
0xe4 & 228 & 2 & 0x9c, 0x6a & ? за ней обычно следует 0xb2\\
0xe8& 232 & 7 & x & (меняются лишь первые 2 байта ответа, остальные~--- нули) меняется при изменении
	фокуса в автофокусе, за ней обычно следуют 0xf8, 0xfc; ответы при разных положениях MF:
	$\infty$,20m,10m~--- 0x22,0x16; 5m~--- 0x21,0x66; 2.5m~--- 0x20,0xed\\
0xea & 234 & 6 & x & (меняются лишь первые 2 байта ответа, остальные~--- нули)  меняется при
изменении	фокуса в автофокусе, встречается и в экспозиции при ручном фокусе\\
0xf0 & 240 & 1 & x &зависит от фокуса (0x11~--- $\infty$,20m,10m, 0x0d~--- 5m, 0x12~--- 2.5m), за
ней	всегда следует 0xb0\\
0xf8 & 248 & x & x &начало последовательности 0xf8,0xfc,0xfa,0xfe, следующей после команды 0xe8~---
при	фокусировке и экспозиции, ответы меняются: 2.5m~--- 0xbd, 0xcb, 0xbe, 0xcd; 5m~--- 0xba, 0xc6,
	0xbd, 0xca; 10m, 20m, $\infty$~--- 0xb3, 0xbe, 0xba, 0xc5\\
\hline\hline
\end{longtable}
Анализ предыдущей и этой таблицы в двоичном коде позволяет сделать следующие выводы:
\begin{itemize}
\item в командах, приводящих к определенному действию, старший (седьмой) бит нулевой, в
запрашивающих данные~--- единичный;
\item некоторые команды <<действия>> имеют следующую особенность: в старший квартет могут
добавляться 0x1, 0x2, 0x4, 0xa без изменения действий команды (исключение~--- команда 4, для нее
0x44 приводит к иному действию);
\item команды 4, 5, 6 и 7 отменяют действие команды 94 (вручную фокус перестает регулироваться).
\end{itemize}
\end{document}

