Показаны сообщения с ярлыком железо. Показать все сообщения
Показаны сообщения с ярлыком железо. Показать все сообщения

понедельник, 5 апреля 2010 г.

Embedded-faq

Последнее время стали появляться редкие анонсы разных железок типа ноутов и нетобуков на не-x86ой платформе. Кроме того, иногда я замечаю наивных людей, привыкших к уютному миру плаг-н-плея и стандартизированности x86 и считающих, что arm - это тот же x86, но другой.



Самое распространенное заблуждение таких людей заключается в следующем: "Я на ебее (лоре, слешдоте, сайте квалькома) видел лот (новость, анонс) о ноутбуке на процессоре ARM (нетбуке на MIPS). Я читал в инторнетах, что debian (редхат, арчлинупс, гента, винда) имеет порт на arm (mips). Значит на этот ноут можно поставить дебиан".



Эта заметка, а возможно и цикл заметок, покажет кусочек той бездны различий между X86 и теми архитектурами, которые часто называют словом "embedded".



Продолжение под катом






Биос и загрузка


X86


Зачем в современных десктопах и ноутах нужен BIOS? Не синий (черный) экранчик настройки, вылезающий по нажатию кнопочки Del (или F2, F12, F10), который называется BIOS Setup, а сама "базовая система ввода-вывода"?. Запрос в гугл "зачем нужен bios" выдает кучу юмористической информации, например "BIOS - это набор программ, которые переводят понятные пользователю команды Windows на язык, понятный компьютеру.



Во времена страшного черного консольного DOS, виснущей 9x винды, стращных досовских шрифтов, маленьких разрешений экрана, синих панелек и стеклянных монтиров, биос активно использовался этим самым досом и виндусом для работы с железом. Вот копипаст из статьи Вывод текста с использованием поддержки DOS и BIOS:


Пример 5.6. Вывод строки с использованием функции BIOS OEh

lea si, commun ; указываем адрес начала строки
mov ex, 48 ; задаем количество символов в строке
lp: lodsb ; читаем в al очередной символ строки
mov ah, OEh ; код запрашиваемой функции
int 10h ; вывод очередного символа
loop lp ; управление циклом



В настоящий момент, нормальные операционные системы такой ерундой не занимаются и биос нужен только на стадии загрузки системы, чтобы прогнать POST, найти ту ерунду, с которой в этот сезон модно грузиться (pata, sata, usb, pxe) и передать управление на ее "первый сектор". Далее, эта ерунда использует функции биоса для чтения остатков себя из загрузочной области, потом, опять же, используя биос, грузит с накопителя ядро системы и передает управление ему. Ядро уже имеет собственные полноценные драйвера для доступа к накопителю (если он вообще ему нужен).



ARM


Во встроенных системах биоса нет. Нет этих ваших досовских int 10h. Как же происходит загрузка? А как угодно - это личные проблемы каждого производителя процессора, производителя платы на этом процессоре и писателей софта к этому куску кремния



Обычно, загрузка начинается с исполнения инструкции, которая живет по адресу 0x0. Туда должен быть замаплен какой-то постоянный накопитель с произвольным доступом, например NOR память или какой-то ROM. Даже на этом этапе есть масса фокусов, например очень распространенный - по адресу 0x0 может быть два разных устройства, в зависимости от какого-то внешнего фактора. Копипаста из статьи Последовательность запуска, описывающей процесс загрузки телефона Motorola на процессоре Neptune



  • Если на выводе MOD высокий логический уровень, по адресу 0x00000000 находится irom, а по адресу 0x10000000 находится микросхема внешней памяти, идентифицируемая по сигналу выбора CS0 (активному на низкий уровень).


  • Если на выводе MOD низкий логический уровень, по адресу 0x00000000 находится микросхема внешней памяти, подключенная к CS0, а по адресу 0x10000000 - irom.





Дальнейшая процедура загрузки - целиком на совести инженеров, определивших состояние точки MOD и индусов, пишущих бутлоадер:


  • в neptune lte, загрузчик irom 0200 живет в неперезаписываемой памяти, при запуске проверяет (криво) цифровую подпись прошивки на NOR-флеше, после чего запускает вторичный загрузчик, который уже запускает прошивку

  • в neptune lte2, загрузчик irom 0300 живет в той же перезаписываемой памяти, проверяет цифровую подпись вторичного загрузчкика (не всей прошивки!), запускает вторичный загрузчик, который проверяет подпись оставшейся части прошивки и запускает ее

  • в линукосвых моторолах на pxa270 нет загрузочной ROM и по адресу 0x0 замаплена флеш-память (NOR), начинающаяся с джампа на следующий загрузчик (MBM), который запускает следующий за ним (blob-lubbock), который уже запускает ядро. Все три адреса (mbm, blob и ядра) диктуются исключительно размером сектора флеша и фантазией инженеров, проектировавших линейку телефонов: в разных версиях аппаратной платформы (gen1 и gen2) эти адреса немного различаются. Кроме того, энтузиасты из проекта openezx, ставят вместо ядра еще один загрузчик, а ядро помещают на карту памяти (mmc).

  • В телефоне fic-gat01 загрузчик живет во флеше NAND, а в телефоне fic-gta02 (neo frerunner) - два загрузчика: один в NAND, и резервный в NOR. В зависимости от последовательности нажатия кнопок AUR и POWER, грузится один или другой.



Память



Во время загрузки ядра линукса на системе семейства x86, оно определяет объем системной памяти (RAM) автоматически (видимо, через функции того же биоса). Кто-то имевший близкое знакомство с ядром, может знать о флаге mem, который позволяет вручную указать ее объем.



Во встраиваемых системах нет автоматичкского определения объема оперативной памяти (RAM). Строка запуска ядра может выглядеть так: mem=32M@0xa0000000 mem=16M@0xac000000, указывая ядру, что данная система имеет два банка памяти, а также объем и физические адреса обоих.



Если вы учили информатику в школе, то можете помнить, что значит аббревиатура "RAM" : Random Access Memory. В отличии от русскоязычного термина "оперативная память", английское обозначение указывает на то, что доступ к содержимому памяти может производиться в любом порядке, в отличии от дисковых накопителей, которые имеют задержки при позиционировании считывающих головок.



Если на дисковом накопителе лежит бинарный код программы, то, чтобы его исполнить, нужно как минимум считать его с накопителя (загрузчик отправляет контроллеру команда ну чтение нужного участка накопителя), поместить в память, а уже после этого передать управление на копию этого кода в RAM ( стадию линковки пропускаем для простоты ).



Во встраиваемых системах такие накопители обычно не используют из-за стоимости, размера, скорости доступа и необходимости копирования данных в оперативную память. Вместо этого, используется постоянная память или флеш-память NOR. В отличии от жестких дисков, доступ на чтение к содержимому NOR и ROM, подключенных напрямую к процессору, без промежуточных устройств производитя точно так же, как и к рам, то есть без использования драйверов. Зная физический адрес накопителя и адрес данных внутри накопителя, можно обращаться к данным напрямую (например сразу загрузить в регистр на ассемблере, обратиться по указателю в C). Если же в ром или флеш-памяти записан код, то его можно выполнить без копирования в RAM, которая будет нужна только для хранения стека, переменных и различных данных.




Простота доступа к накопителям - одна из причин, по которым во встраимваемых системах не нужен биос и загрузчику достачно знать адрес, по которому лежит ядро системы.



Еще одна особенность флеш-памяти заключается в процедуре ее записи, которая существенно отличается от записи в ram или hdd и больше похожа на работу с CD-RW. Полностью стертая флеш-память типа NOR имеет все биты выставленными в логическую единицу. Любой из битов может быть сброшен из еденицы в логический нуль, но не обратно. Единственный спрособ поменять нуль на еденицу - стереть весь сектор флеша, размер которого равен, например 128 килобайтам. Это вносит существенные изменения в хранение данных на таких накопителях, поэтому в линуксе для них существую специальные файловые системы (JFFS2, YAFFS) и специальных слой абстракции (MTD). Кроме того, во встраиваемых системах часто используются read-only файловые системы, в которых не нужно задумываться о таких тонкостях.



На usb-флешках, распространенных среди пользователей x86-систем, используются те же самые nor и nand, но, в отличии от arm и mipc, между микросхемами и процессором два контроллера (pic и usb) и слой абстракции в самой флешке, которые позволяют устаревшим файловым системам, типа винды, работать с ними, как с hdd и использовать те же самые файловые системы, сокращая срок службы накопителей. Логично было бы использовать специальные фс (см выше), но это невозможно из-за слоя абстракции в контроллере самой флешки.



Работа с устройствами и драйверами



Что делали доблестные пользователи древних систем в ISA шиной? Дергали перемычки, вбивали номера прерываний в биосе, чтобы не вылезли конфликты и ручками вписывали адреса для работы с этими железками. Потом весь этот ужас исчез, появился PCI и достачно втыкнуть железку в слот и она заработает. Ну еще пользователи этих ваших виндусов будут страдть два года и искать в яндексе бесплатные драйвера, но это уже проблемы индейцев. Потом появился usb и стало можно все то же самое, но без открывания корпуса и перезагрузок (пользователей виндов не учитываем, опять же).




Перемычки и irq? Это детский лепет, по сравнению с тем, что творится на арме. Во время загрузки на армовой системе ядро не знает вообще ничего. Чтобы заработал хоть какой-то минимальный плуг-н-плей для usb, нужно проинициализировать хостовый контроллер этого usb. Ядро не может знать, есть ли на в процессоре usb-контроллер, не может знать, какой ему нужен драйвер, не может знать, где его регистры, как включить его CLOCK и какие его порты нужно включать. Usb-контроллер может иметь несколько портов, из которых нулевой выведен наружу как клиентский, второй припаян внутри, как хостовый, а третий вообще не разведен.



Usb - это самый простой случай, потомучто нужно только проинициализировать хост-контроллер, узнать базовый адрес его регистров и натравить на него драйвер ohci-хоста. Все usb-устройства буду автоопределяться и их драйвера буду все так же подхватываться автоматически.



Интересней случай какого-нибудь mmc-контроллера, который подключен к процессоры по шине i2c. В данном случае, ядро должно иметь драйвер i2c-контроллера встроенного в процссор. Если нам повезло, то процессор интеловский, спецификация доступна и драйвер уже есть в ванильном ядре. Если нам не повезло и процессор, например фришкалевский и спецификации нет, то драйвера тоже нет - его нужно писать, вооружившись инструментами реверс-инженеринга. Далее, нам нужно знать адрес нашего mmc-контроллера на i2c шине, а потом протокол работы драйвера с ним. Далее уже протокол mmc, но он стандартный и тут ядро само разберется, если правильно написать драйвер устройства.



Еще интересней случай какого-нибудь ASIC (аппликейшн-специфик интегрейтед циркут). Он тоже висит на шине, которая не умеет pnp, тоже имеет непонятный протокол работы, но кроме всего прочего, внутри нет никакого стандартного протокола, типа MMC, а живет десять регистров и 20 прерываний. И этот ASIC управляет каким-то простым, но очень нужным процессом. Например включением питания, описанного выше MMC, подсветкой экрана и громкостью звукового усилка



Но это я отвлекся на трудности портирования и реверс-инженеринга. Проблема в том, что ядро не знает, какие устройства и шины у него есть, как их включить и какие драйвера для них использовать (если они есть), точно так же, как не знает объем RAM. Если у устройства есть субустройства (шина i2c и радиоприемник на ней), то ядро о нем тоже не знает, если шина не умеет pnp. Даже если устройство встроено в процессор, ядро все равно о нем не знает, потомучто не знает, на каком процессоре запущено.



Это решается очень просто: для каждой платы, на которой умеет запускаться линукс (около двух тысяч, судя по номерам machid), выделен уникальный номер (machid). Каждому номеру соответствует функция инициализации в которой захардкодены все устройства, параметры работы с ними, их драйвера и прочее. Там описано все от размера памяти и адреса регистров usb, до количества этих самых usb портов и функций включения питания на них. Живет это все в arch/архитекрута/mach-машина/плата.c (например arch/arm/mach-pxa/ezx.c). Для пяти телефонов на платформе motorola ezx, там записано пять разных функций, в совокупности - две тысячи строк кода.



Установка системы


В словаре матерых пользователей x86 есть слово "установка" (переустановка, инсталляция и проч.). Один из вариантов процесса установки дистрибутива Debian на ноутбук: записываем образ на usb-флеш, перезагружаем машину, меняем настройки биоса, перезагружаем еще раз, чтобы машина загрузилась с usb-флешки с дистрибутивом. Далее запускается специальная версия того же самого дебиана, которая спрашивает глупые вопросы и копирует себя на выбранный жесткий диск.



В случае встраиваемых систем, все намного проще и интересней. В болшинстве случаев, система не имеет никакой возможности запустить что-то со сменного носителя и вообще его не имеет. Процесс установки системы сводится к записи готового образа системы прямо в системный флеш.



Записью образа занимется один из системных загрузчиков и тут опять существует куча варинтов развития событий:



  • загрузчики в neptune lte не умеют сами писать образ. они умеют только принимать код лоадера по usb, копировать в ram и запускать его. При этом, они проверяют электронную подпись полученного кода, что не позволяет шить что попало (другую систему или "мод" существующей) без взлома загрузчика. Для процесса прошивки необходима проприетарная сервисная утилита, работающая только под виндой


  • на платформе motorola ezx ситуация та же самая, но нет проверки подписи


  • на телефоне neo frerunner можно прошить телефон напрямую через загрузчик по usb (без лоадера) или запустить ядро с sd-карты. Проверок подписи нет, протокол прошивки не такой, как у моторолы, но сервисная утилита доступна в исходниках


  • на множестве отладочных плат прошивка делается через последовательный кабель (он же rs232, он же COM) через свои собственные протоколы


  • в домашних роутерах и точках доступа прошивка происходит по сети, через веб-интерфейс, по сети через tftp или через тот последовательный кабель





У многих вариантво есть одно общее: при прошивке аппарата возможно его убить настолько, что восстановление будет возможно только с помощью специального оборудования или невозможно вообще. Достаточно стереть нулевой байт во флеше на телефоне ezx и можно спокойно его выкидывать или нести в очень хороший сервисный центр, где либо заменят флеш-память, либо прошьют через JTAG (последнее маловероятно). В нептуне lte и фрираннере, есть защита: в нептуне загрузчик зашит в кристалл процессора и не стирается, а во фрираннере два загрузчика.



На этом, пока все. Далее будут дополнения про версии arm, форматы бинарников, работу с дробям и разные порядки байт.


суббота, 3 апреля 2010 г.

Нептун, иром, usb

Залез в потроха L2, пишу себе рамлоадер. Тело в бланке, иром 0200 и у него есть замечательнейшая бага

:


In [100]: dev.jump(0x3fd0000)
Out[100]: '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'


Вместо любых данных иром шлет нули. Мой рамлоадер тоже, а вот ramldr - нет.



Отправка данных делается простейшим образом, пробажить негде: запихнуть в хардварный буфер данные и дернуть полтора бита в регистрах. Тем не менее, тупейший баг там зарылся и растет из костылей: для совместимости со старыми нептунами, usb имеет две карты памяти с разыными адресами буферов ввода-вывода. Нужная карта памяти выбирается через нулевой бит регистра 0x24852014 и по дефолту там как раз старая. А иром пишет по адресу из новой.



Зачатки бута на гитхабе тыц

понедельник, 1 марта 2010 г.

С кувалдой и ноутбуком



Совершенно непонятно зачем взял и убил L2. Взял ножик, сделал дырку и слил бекап через расово верный древний ramldr. И этим же расово верным ramldr стер весь флеш нахрен. И этим же расово верным ramldr хотел залить обратно, но тут возникла техническая заминка - лоадер ramldr не умеет шить флеш L2.



Можно взять реп-студию, но это неспортивно, а я все равно собирался что-то противоествественное с этим L2 делать. Тулчейн нашел, хелло-ворлд уже написал - поупражняюсь в написании лоадеров. И портировании наркоманских RTOS на наркоманский нептун



И да, я не знаю, нафига я все это делаю



А еще я вот вброс:


[10:46:40 PM] trsid: шустрее чем на 2.4
[10:46:50 PM] связист: чо?
[10:47:05 PM] trsid: жабо
[10:47:15 PM] связист: чо, на теле уже зопустилг?
[10:47:25 PM] trsid: да
[10:47:31 PM] связист: гы
[10:48:55 PM] trsid: ща мидлет запущу какой нито
[10:49:19 PM] trsid: но стартует быстрее раза в полтора два
[10:49:36 PM] связист: дык eabi

воскресенье, 8 ноября 2009 г.

Тем временем, в открытом космосе

Звук и зарядка ушли в openezx. Проснется азкапоне - буду обновлять код в кутопии, для работы с измененным интерфейсом звука.

среда, 28 октября 2009 г.

Магия? Нет никакой магии



Нет никакой магии!

Почему нет звука? Потомучто его нет. А нет его потому, что кто-то что-то сделал с SSP, по которому ходит звук.
Потомучто так не бывает, что все правильно, а ничего не работает.

воскресенье, 25 октября 2009 г.

Магическая магия

Есть звук. Есть четыре регистра, которые им управляют. Все регистры правильные. На ядре 2.6.30 работает, на 31 и выше - нет. Чудеса!

воскресенье, 18 октября 2009 г.

Звук

Звук заслуживает отдельного опуса. На одной шине пять устройств (AP, BP, блютуз, радио и сам звук), звук состоит из двух цапов и усилка. А рулит всем конечно же AP. А на ап наркоманская подсистема звука и имей ей ASOC.

четверг, 1 октября 2009 г.

Ценные кадры, овладевшие техникой

Очень подозрительный график разряда/заряда батареи.

Такое впечатление, что в режиме "sleep", оно потреблает столько же, сколько и в обычном. На минге можно заюзать "deep-sleep" - там должно быть нормально. Надо будет попробовать.

Желающие померяться длиной аккумулятора, могут невозбранно использовать http://pastebin.com/f714d10fa. Скармливать нужно файл такого вида:


1252741198 717 2
1252741379 723 2


Первая колонка - таймстамп (хинт: $(date +%s) ), вторая колонка - показания датчика BATT (на ядре 2.4 читается через hwtool -b), третья колонка не учитывается - можно просто нуль

суббота, 26 сентября 2009 г.

Сказка про линейный процессор

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

И так, жыла-была бабка, делала деревянные телефоны, типа E398, над которыми некоторые товарищи полюбили измываться, рисуя на них маркером слово "ЗУБ", заставля эти телефоны делать разную прикольную ерунду. В телефонах был процессор Neptune LTE. Потом бабка навострилась делать тонкие телефоны, уже не из дерева, а из фанеры - всякие L7, например, и делать их на процессоре Neptune LTE2.

Еще бабка решила поделать смартфоны из кирпича, но схитрила, ибо ленивая была. Взяла кусок деревянного телефона и засунула внутрь кирпичного КПК - так появились A780. А потом сделала то же самое с фанерным - так пявились минги и едва.

Телефоны продавала не сама бабка, а старый барыга-еврей, который продавал не всякие телефоны, а со справкой и печятью. А печять была у другого барыги, который был жадный жлоп, трус и кое-какер - потому боялся, что кто-то поломает телефонные провода и будет звонить так, чтобы не платить ему деньге.

Поэтому барыга печять ставил только на такие телефоны, на которых нельзя было написать волшебное слово "ЗУБ", для чего все телефоны нужно было продавать в гондонах. А если снять его с телефона, или сделать дырку - телефон должен ломаться и не звонить. Гондоны для телефонов делал старый слепой дед и делал их фигово.

Товарищи, любившие прикольную фигню, знамо дело, нашли в гондоне дырку, сували туда маркер и стали писать слово "ЗУБ", не снимая ево с телефона, за что бабка получала от барыги по жопе.

Чтобы телефон звонил и показывал картинки, ему нужна прошивка, а чтобы хранить прошивку в телефоне, нужна флешка, которую можно читать, начинается она с адреса 0x10000000. А чтобы прошивка могла работать, ему нужна память (RAM), которыю можно быстро-бытро читать и писать, начинается она с адреса 0x14000000. Еще телефон нужно бутать и шить - для этого в телефоне есть два загрузчика - иромовый и нормальный.

Иромовый загрузчик живет внутри процессора, в памяти IROM, которую писать нельзя и которая начинается с 0x0 и юзается не обычную RAM, а свою собственную IRAM, которая начинается с 0x03F80000. Нормальный загрузчик живет в начале флеша и при работе пользуется RAM.

Как происходит обычная загрузка: при включении, управление передается по адресу 0x0 (иром).

Иром включает флешку и проверяет, есть ли на флешке бут и проверяет подпись бута, которая лежит вконце блока, в котором он прошит. Если поправить бут, то подпись не сойдется и иром уйдет в режим "бланк" - включит usb и будет ждать, пока ему по usb скажут, что делать. Суть тестпоинта: замыканием ноги, флешка выключается, иромовый бут не находит нормальный и уходит в бланк.

Если иром проверил бут, то он читает из его заголовка адрес точки входа и передает туда управление. Пример заголовка:


00000000 10 00 46 F4 00 00 00 B1 00 13 02 01 FF 00 09 84
00000010 01 13 02 FF 07 00 09 84 10 00 46 FC 10 00 00 00
00000020 10 00 EF D7 10 00 4A 9C 10 00 E8 00 10 00 F0 00
00000030 10 35 08 00 00 00 00 00 10 08 00 00 28 63 29 20


Красным выделен адрес точки входа, синим - адрес подписи бута, зеленым - адрес прошивки. Лирическое отступление: код бутлоадера заканчивается по адресу 0x10005E10, подпись начинается с адреса 0x1000E800, между ними неиспользуема область, забитая 0xFF, в которую можно совершенно спокойно записать слово "ЗУБ".

Загрузчик с флеша запускается и начинает проверять подпись самой прошивки, для этого он читает заголовок прошивки с адреса, который написан в заголовке бута. Заголовок прошивки:


00080000 10 21 EF 95 00 00 00 B1 00 13 02 06 FF FF 11 52
....
000800A0 FF FF FF FF FF FF FF FF FF FF FF FF 10 33 00 00


Красным выделен адрес точки входа, зеленым - адрес заголовка подписи прошивки. Заголовок подписи прошивки:


00330000 10 33 00 10 00 00 00 B1 01 13 02 06 FF FF 11 52


Красным выделен адрес начала самой подписи.

Процесс проверки просходит так: узнаем адрес прошивки, узнаем адрес блока подписи прошивки и адрес самой подписи, читаем подпись, сверяем хеш блоков, адреса которых указанны в подписи с тем, что записан в подписи. Если все хорошо - запоминаем, что этот диапазон - доверенная область.

Затем читаем адрес точки входа - если он внутри доверенной обрасти, то передаем управление туда.
Зарытых собак тут несколько.

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

Кроме самой прошивки, в телефоне есть другие подписанные области: сам бут и CG7. И в буте и в CG7 есть области между подписью и блоком, который она закрывает.

Блок CG7 лежит по адресу 0x10350000 и начинается с подписи, которая заканчивается на 0x1035045C, но сами данные начинается с 0x10350800.

На взломанной прошивке процедура походит так:

Вместо адреса настоящей подписи, подсовывается адрес подписи другого блока (CG7 или самого бута) и вместо самой прошивки, проверяется этот блок и заносится в доверенную зону.

Вместо адреса точки входа, указывается адрес удачного куска данных в этом блоке: "E5 9F", что является тумбовой инструкцией, делающей джамп на 0x59F (59f - отрицательное число, значит джампаемся на 0x59f ^ 0x7ff = 0x260 назад) и управление передается в неподписанную область между подписью и началом блока.

В итоге загрузчик доволен собой и думает, что проверил прошивку (а проверил CG7), при чем успешно. Адрес точки входа ведет как раз в CG7, которую он проверил, а значит туда можно передвать управление. Саму прошивку никто не проверял, а значит можно там все менять.

Теперь про загрузчики и процесс обновления прошивки.

Оба загрузчика (иромовый и нормальный) имеют набор комманд, которые можно выполнять через usb. Основные три: ADDR, BIN и JUMP. ADDR указывает адрес, на который нужно положить данные, BIN шлет сами данные, JUMP передает на них управление. В качестве данных выступает так называемый "лоадер" - программа, которая умеет шить флеш. Ее подпись тоже проверяется и она позволяет стирать, шить и читать только узкий диапазон адресов (нельзя заменить бут и pds).

В иромовом буте есть тупая дыра (срыв стека), через которую можно запустить любой код, например лоадер "ramldr2", который позволяет читать и писать любые адреса. Но иромвый бут запускается только тогда, когда не видит бут на флеше (или AP криво уходит в слип).

Про PDS. pds - область в телефоне, которая не меняется при его прошивке и лежит по адресам 0x10010000 и 0x10020000 (да, два раза - одна рабочая, вторая - запасная). В начале pds записана версия, которая меняется от прошивки к прошивке (в E2 - 4015, в A1200 - 4017). PDS разбит на нумерованые файлы, некоторые из которых зашифрованы уникальным ключем телефона. К закриптованным файлам относятся разные блокировки, например привязка к сети определенного оператора. Из-за этих криптованных файлов нельзя заливать PDS от одного телефона в другой.

Именно из-за PDS у меня и произошла вся эта история: прошивка E2 поменяла его версию и стерла зашифрованные файлы. Пришлось отрывать расшифровывалке руки, чтобы она не выдергивалась.

Еще в телефоне есть зона, в которую пишутся паники. Лежит по адресу 0x10030000.

ps. Свой ремонтный набор я скоро приведу в нормальный вид и выложу.

четверг, 17 сентября 2009 г.

Опять про зарядку

Ежели у кого еще осталась живая батарея - сбросьте показания датчика на старом ядре.

Интересуют циферки: максимально разряженный и максимально разряженный (каждое состояние в трех вариантах: с отключенным ЗУ, с подключенным ЗУ, с подключенным USB).

У меня полный заряд - 760, когда отключаю зарядное - быстро убегает до 620,615,600. Не осиливаю, или это батарея деградировала или кто-то опять дурак...

четверг, 3 сентября 2009 г.

Зарядка батареи

Заряжает до положенного напряжения. Вольтметр показывает три с копейками вольта, заряженная через openezx батарея дальше другим телефоном не заряжается.

среда, 12 августа 2009 г.

Звук, черт побери

Звук поломали хорошо. На AP пашет, а в режим звонка не переходит.
В коде микшера черти-что, при чем непонятно - или я не осилил, как его юзать, или его просто кое-кто недописал.
Надеюсь, что поправим и его наконец-то заберут в ваниллу - надоел уже.

воскресенье, 9 августа 2009 г.

Магия линейного процессора

Кино и немцы: бутаем телефон, проходим хендшейк по gpio, девайс опознается на usb шине, как 0x3006 (драйвер ipc), на одном из интерфейсов которого есть ендпоинты для передачи и получения данных по ipc. Далее слипаю usb девайс (контроллер перестает посылать ему какие-то там периодические сообщения), bp это видит и со своей стороны тоже слипается, слипаю usb порт и ухожу в саспенд ap.

Врубаю обратно, usb не трогаю, вместо этого перевожу bp в флешмод (ставлю ногу flash в 1 и делаю ресет), прохожу хендшейк по gpio. Вот теперь включаю порт и девайс - драйвер usb контроллера замечает, что устройство изменилось во время слипа и опознает новое (0x4003).


[ 20.911537] flash: 0
[ 20.920759] flash: 512
[ 20.927860] reset bp
[ 20.934154] bp handshake entered!
[ 20.941279] ezx-bp: handshake step 1
[ 20.948080] ezx-bp: handshake step 2
[ 21.240547] BP rdy irq
[ 43.045223] usb 1-3: reset full speed USB device using pxa27x-ohci and address 5
[ 43.266384] usb 1-3: device firmware changed
[ 43.271897] usb 1-3: USB disconnect, address 5
[ 43.465206] usb 1-3: new full speed USB device using pxa27x-ohci and address 6
[ 43.697291] usb 1-3: configuration #1 chosen from 1 choice


А тепер без перевода в режим флеша. Бутаем телефон, проходим хендшейк, девайс опознается, саспендим usb девайс, саспендим usb порт, саспендим ap. Просыпаемся, врубаем порт, врубаем девайс - ДЕВАЙС ТУПИТ и не отвечает на контрольные запросы, но при этом моргает ногой (ааа! включите меня!) и потом валится в панику.


[ 25.704865] usb 1-3: reset full speed USB device using pxa27x-ohci and address 5
[ 25.718791] BP rdy irq
[ 25.838537] usb 1-3: USB disconnect, address 5
[ 26.194880] usb 1-3: new full speed USB device using pxa27x-ohci and address 6
[ 35.436193] BP rdy irq
[ 35.441631] BP Lowered WDI line. This is not good :(
[ 41.384807] usb 1-3: device descriptor read/64, error -110
[ 41.684849] usb 1-3: device descriptor read/64, error -62
[ 41.974861] usb 1-3: new full speed USB device using pxa27x-ohci and address 7
[ 42.164846] usb 1-3: device descriptor read/64, error -62
[ 42.454801] usb 1-3: device descriptor read/64, error -62
[ 42.744881] usb 1-3: new full speed USB device using pxa27x-ohci and address 8
[ 43.174716] usb 1-3: device not accepting address 8, error -62
[ 43.364761] usb 1-3: new full speed USB device using pxa27x-ohci and address 9
[ 43.794714] usb 1-3: device not accepting address 9, error -62
[ 43.805893] hub 1-0:1.0: unable to enumerate USB device on port 3


А теперь третий фокус:

Делаем все то же самое, что и в первом случае, но ресет bp делаем без перевода в флешмод - девайс проходит хендшейк, но по usb опять не отвечает.

Рабочая гипотеза - bp не замечает, что надо ресетнуть usb со своей стороны. Чисто теоретически, это должно делаться через single-ended zero - установку двух ног usb в 0 на 10 msec, но это не работает (или я неправильно делаю?), и ничего похожего я в старом ядре не вижу. Зато в старом ядре есть куча непонятной возни вокруг ног 90, 91 и 113 - те пины usb, что идут от хоста к устройству.

суббота, 13 июня 2009 г.

Консоль на EMU

Что-то получилось:



Патчем ядра переключил ноги 39 и 53 из режима usb в режим uart (ffuart). Регистры EOC (чип EMU порта) не трогал. В будущем хочется переключать режимы uart/usb автоматически, по показаниям eoc и pcap. Мусор на скриншоте - скорее всего недостатки схемы.

Ссылки: схема и описание, патч.

пятница, 12 июня 2009 г.

Пингвин жирный...

Киборгизированный:


total used free shared buffers cached
Mem: 44352 42844 1508 0 228 12160
-/+ buffers/cache: 30456 13896
Swap: 32760 16048 16712


Утопический:


total used free shared buffers cached
Mem: 46552 45652 900 0 144 26844
-/+ buffers/cache: 18664 27888
Swap: 0 0 0


Такие дела

ps. образы ведроида тут
pps. нихера там не пашет, можете даже не качать

понедельник, 8 июня 2009 г.

Сериал консоль на EMU

Оказывается, вот этот фокус не работает на втором поколении. Пины нормального порта туда не подведены - только ноги 53 и 39 (usb).

Попробовал переключить EOC во второй режим UART (ноги 53 и 39 выводятся на usb порт) и "подрыгать" ногами - ничего со стороны хоста не увидел. Со стороны аппарата rx тоже все время 0. Драйвер сериал порта на gpio - тоже писать придется.

Попросил припаять к конвертеру диоды для индикации RX и TX - завтра попробую еще.

upd: все-таки туда можно сконфигурировать FFUART. утром попробую