ÛãçèØÃÂ¥ Ã’ØàãáÞÃÂ’ - Xakep Online
ÛãçèØÃÂ¥ Ã’ØàãáÞÃÂ’ - Xakep Online
ÛãçèØÃÂ¥ Ã’ØàãáÞÃÂ’ - Xakep Online
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
phreaking<br />
ПРОТОКОЛЫ<br />
МАНЧЕСТЕР И EFM<br />
Допустим, тебе надо по очень длинной линии с кучей помех<br />
(неважно, оптическая она или просто медный провод) передать<br />
кучку единиц. Стартовые и стоповые биты не спасут от обилия<br />
сигналов с «высоким уровнем», и датчик/триггер на том конце линии<br />
просто перестает адекватно воспринимать данные. Поэтому<br />
для сред с высоким уровнем помех используются так называемые<br />
self-clocking модуляции.<br />
Например, в протоколе Manchester (используется в Ethernet) единица<br />
дополняется нулем, а ноль — единицей, поэтому значений<br />
с высоким уровнем на линии столько же, сколько и с низким. К<br />
тому же, так мы сохраняем заряд кабеля. Приемник всегда может<br />
подстроиться на частоту и амплитуду сигнала, и в итоге — потерь<br />
данных меньше.<br />
Что-то подобное используется и в кодировании данных на CD-<br />
ROM, где 8 бит каждого байта по таблице переводятся в избыточные<br />
14 с тем принципом, что любые две единицы разделяются,<br />
минимум, двумя и, максимум, десятью нулями. Вместе с дополнительными<br />
тремя битами, склеивающими байты, мы получаем<br />
равномерно «серую» поверхность диска, поэтому сенсор всегда<br />
явно различает темные (темнее серого) и светлые (светлее серого)<br />
участки.<br />
Википедия предлагает небольшие обзорные статьи по теме:<br />
• http://en.wikipedia.org/wiki/Manchester_code.<br />
• http://en.wikipedia.org/wiki/Eight-to-Fourteen_Modulation.<br />
Google тоже забывать не стоит. Полагаю, протоколы для большинства<br />
пультов уже расшифрованы и лежат в открытом доступе. Будешь читать<br />
алгоритм — не путай низкоуровневые нули и единицы (свечение pulse и<br />
space) с логическими, получаемыми после расшифровки.<br />
îêàçàëèñü. Åñëè ÷åðåç 1.2 ìñ, òî ê íàì ïðèåõàëà åäèíèöà,<br />
à åñëè ÷åðåç 0.6 — òî íîëèê. Çàïèõèâàåì åãî â «êîìàíäíûé»<br />
áàéò íîãàìè âïåðåä (LSB) è èäåì öèêëîì â ìåòêó [Ìåòêà!].<br />
— Êàê ïðèíÿëè 7 êîìàíäíûõ áèò, ïðèíèìàåì 5 àäðåñíûõ.<br />
— Ïî ïðîòîêîëó ÷åðåç 40 ìêñ ïóëüò ïîâòîðÿåò ïîñëåäîâàòåëüíîñòü,<br />
ïîýòîìó åñëè õî÷åøü äîïîëíèòåëüíîé íàäåæíîñòè<br />
— ïðèñòóïàé ê äåéñòâèþ òîëüêî ïîñëå âòîðîé ïîâòîðåííîé<br />
êîìàíäû.<br />
— Íó, à åñëè âñå áèòû ñîâïàëè ñ òåì, ÷òî ìû îæèäàåì, òî<br />
ïðîèçâîäèì äåéñòâèå (íàïðèìåð, ïèùèì ëàìïî÷êîé).<br />
Как-то так. Страшно, но в готовом коде букв будет в разы меньше.<br />
СБОРКА И ИСПЫТАНИЕ<br />
У меня уже была отладочная плата на контроллере ARM7. Вся периферия<br />
— отключена, к одному цифровому входу была привешена OUT-ножка<br />
датчика, а к выходу я временно привесил динамик-пищалку, чтобы не<br />
играться с высоким напряжением раньше времени. Datasheet порекомендовал<br />
мне привесить конденсатор 4.7 мкФ между питанием и землей<br />
датчика, ну а я был как бы не против. Затем я щупал осциллографом<br />
выход ИК-датчика, тыкал в кнопки пульта и пытался найти соответствие<br />
между протоколом и видимым мной на экране. После некоторых правок<br />
и перезаливок кода динамик стал наконец-то пищать, сообщая, что<br />
контроллер распознал мои нажатия.<br />
АПЛОДИСМЕНТЫ!<br />
Теперь ты можешь управлять с обыкновенного пульта дистанционного<br />
управления любой техникой в доме. Одной релюшкой с лампочкой все,<br />
естественно, не ограничивается, и ты волен привесить на контроллер<br />
какие угодно функции, хватило бы фантазии и усидчивости. Да, минусы<br />
в моем проекте тоже есть. Во-первых, устройство не умеет снаружи<br />
конфигурироваться через USB или UART. Захочешь поменять кнопку, на<br />
которую будет реагировать контроллер, — перекомпилируй и перепрошивай<br />
все по новой. Сам контроллер тоже слишком крут для таких задач.<br />
Я его выбрал за универсальность, но в готовом «серийном» устройстве,<br />
висящем в шкафу на стенке, понятно, придется использовать что-нибудь<br />
подешевле. Надеюсь, сидя на диване и руля техникой в доме, ты не<br />
заработаешь геморрой. Мой тебе совет, пока не поздно — выбрось пульт<br />
вместе с телевизором в окно и иди гулять. Весна, как-никак. z<br />
АЛГОРИТМ<br />
У меня оказался пульт от телевизора Sony ХХХ, поэтому прошивку для контроллера<br />
я писал, исходя из местного протокола. За «единичный интервал»<br />
берем 0,6 мс, тогда стартовый ноль — это 4 интервала, единица занимает<br />
1+2 интервала, а ноль — 1+1. Последовательность действий в моем случае<br />
примерно такова:<br />
— Ñòàâèì ïðåðûâàíèå íà ñðàáàòûâàíèå â 0 (êîãäà äàííûå íå<br />
ïåðåäàþòñÿ, òðàíçèñòîð â äàò÷èêå çàêðûò, íà íîæêå åäèíèöà).<br />
— Îêàçàâøèñü âíóòðè ïðåðûâàíèÿ, ñáðàñûâàåì è çàïóñêàåì<br />
òàéìåð.<br />
— Ñòàâèì ïðåðûâàíèå íà 1. Ñòàðòîâûé íîëü äîëæåí áûòü äëèíîé<br />
2.4 ìñ.<br />
— Âíóòðè ïðåðûâàíèÿ çàìåðÿåì, ñêîëüêî íàòèêàë òàéìåð:<br />
— Åñëè íàòèêàëî îêîëî 2.4 ìñ, òî ìû ïîéìàëè ïîëåçíûå äàííûå;<br />
— Åñëè íåò, òî ïîéìàëè ÷òî-òî íå òî.<br />
— [Ìåòêà!]  ëþáîì ñëó÷àå, ñòàâèì ïðåðûâàíèå ñíîâà íà 0,<br />
äà ê òîìó æå ñáðàñûâàåì ñ÷åò÷èê (åñëè ïðîäîëæàåì ïðèíèìàòü<br />
ïàêåò).<br />
— Ñðàáîòàòü îíî äîëæíî ïðèìåðíî ÷åðåç 0.6 ìñ. Åñëè ïðåðûâàíèå<br />
íàñòàëî ÷åðåç äðóãîé ïðîìåæóòîê âðåìåíè, òî ñáðàñûâàåì<br />
ñîñòîÿíèå. À åñëè ÷åðåç 0.6, — òî ìû ïîéìàëè îäèíî÷íóþ<br />
åäèíèöó. Ñëåäóþùàÿ ïîñëåäîâàòåëüíîñòü íàêîíåö-òî<br />
ñîîáùèò íàì, ÷òî èìåë â âèäó ïóëüò. Ñáðàñûâàåì ñ÷åò÷èê è<br />
ñòàâèì ïðåðûâàíèå íà 1.<br />
—  íåì ñìîòðèì, ÷åðåç êàêîé ïðîìåæóòîê âðåìåíè ìû òóò<br />
XÀÊÅÐ 04 /124/ 09<br />
АППАРАТНЫЕ<br />
ПРЕРЫВАНИЯ<br />
Любое ядро любого процессора как-то должно реагировать на<br />
внешние раздражители, например, на приход сигнала с какойнибудь<br />
ножки. Первый способ — банально написать программу,<br />
периодически опрашивающую периферию на предмет изменения<br />
состояния. Но это затратно, несинхронно и, вообще, немодно. Поэтому<br />
еще на заре компьютеростроения был изобретен механизм<br />
прерываний. Специальный периферийный контроллер содержит<br />
список функций (обработчиков), на которые нужно совершать переход,<br />
если произошло какое-либо событие. Если оно происходит,<br />
контроллер прерываний насильно сохраняет текущие значения<br />
регистров в стеке и перебрасывает процессорное ядро на новый<br />
адрес с обработчиком. Последний исполняется и сбрасывает флаг<br />
прерывания, сообщая, что оно обработано и можно двигаться<br />
дальше.<br />
101