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

понедельник, 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, форматы бинарников, работу с дробям и разные порядки байт.


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

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

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

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

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



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

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

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

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

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

вторник, 20 октября 2009 г.

Удвоенная прочность кода

- Поставить битовые сетки в два ряда!
- Есть, поставить битовые сетки в два ряда!


ssp_pcap_register_val = CDC_CLK_IN_13M0;
power_ic_set_reg_value( PCAP_AUD_CODEC, PCAP_AUD_CODEC_INDEX, PCAP_BIT_CLEAN_VALUE, PCAP_AUD_CODEC_NUM_BITS );
power_ic_set_reg_value( PCAP_AUD_CODEC, CDC_CLK_INDEX, CDC_CLK_IN_13M0, CDC_CLK_NUM_BITS );

power_ic_set_reg_value( PCAP_AUD_CODEC, SMB_INDEX, PCAP_BIT_CLEAN_VALUE, SMB_NUM_BITS );
power_ic_set_reg_value( PCAP_AUD_CODEC, FS_8K_16K_INDEX, PCAP_BIT_CLEAN_VALUE, FS_8K_16K_NUM_BITS );
power_ic_set_reg_value( PCAP_AUD_CODEC, DIG_AUD_IN_INDEX, PCAP_BIT_CLEAN_VALUE, DIG_AUD_IN_NUM_BITS );

power_ic_set_reg_value( PCAP_AUD_CODEC, AUDIHPF_INDEX, PCAP_BIT_SET_VALUE, AUDIHPF_NUM_BITS );
power_ic_set_reg_value( PCAP_AUD_CODEC, AUDOHPF_INDEX, PCAP_BIT_SET_VALUE, AUDOHPF_NUM_BITS );

power_ic_set_reg_value( PCAP_AUD_CODEC, CLK_INV_INDEX, PCAP_BIT_CLEAN_VALUE, CLK_INV_NUM_BITS );
power_ic_set_reg_value( PCAP_AUD_CODEC, FS_INV_INDEX, PCAP_BIT_CLEAN_VALUE, FS_INV_NUM_BITS );

/*(3) reset digital filter(DF_RESET=1) */
power_ic_set_reg_value( PCAP_AUD_CODEC, DF_RESET_INDEX, PCAP_BIT_SET_VALUE, DF_RESET_NUM_BITS );

power_ic_set_reg_value( PCAP_AUD_CODEC, ADITH_INDEX, PCAP_BIT_CLEAN_VALUE, ADITH_NUM_BITS );
/* (4) enable pcap clk(CDC_CLK_EN=1),enable CODEC(CDC_EN=1) */
power_ic_set_reg_value( PCAP_RX_AUD_AMPS, CD_BYP_INDEX, PCAP_BIT_CLEAN_VALUE, CD_BYP_NUM_BITS );
power_ic_set_reg_value( PCAP_AUD_CODEC, CDC_CLK_EN_INDEX, PCAP_BIT_SET_VALUE, CDC_CLK_EN_NUM_BITS );
power_ic_set_reg_value( PCAP_AUD_CODEC, CDC_EN_INDEX, PCAP_BIT_SET_VALUE, CDC_EN_NUM_BITS );
mdelay(1); /* specified enable time */


Для нормальных людей перевожу: сначала сбрасываем весь регистр в нуль, а потом отдельные биты по-очереди. Коварный враг не пройдет.

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

Звук

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

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

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

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

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

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

Usb-host

Что-то там такое интересное происходит. Правда непонятно, это только на E2/E6 или везде вокруг.

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

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

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

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

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

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

вторник, 11 августа 2009 г.

BUSTED!

И шо вы таки думаете? Во всем виноваты виндузятники:


/*
* As of 2.6.10 we introduce a new USB device initialization scheme which
* closely resembles the way Windows works. Hopefully it will be compatible
* with a wider range of devices than the old scheme. However some previously
* working devices may start giving rise to "device not accepting address"
* errors; if that happens the user can try the old scheme by adjusting the
* following module parameters.
*
* For maximum flexibility there are two boolean parameters to control the
* hub driver's behavior. On the first initialization attempt, if the
* "old_scheme_first" parameter is set then the old scheme will be used,
* otherwise the new scheme is used. If that fails and "use_both_schemes"
* is set, then the driver will make another attempt, using the other scheme.
*/


Вобщем BP после саспенда работает. Осталась всякая ерунда и будет щасте.
Если кратко - таймауты и последовательность инициализации в hub.c все решили.

воскресенье, 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, что идут от хоста к устройству.

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

Внезапный тестпоинт?

Проводил опыты с саспендом usb хоста. Единственное, что понял - система там очень хлипкая, зависит от кучи рейскондишинов и последовательности включения/выключения usb хоста и просыпания/засыпания bp.

И еще словил вот такой замечательный фокус:


[ 8.480980] pxa27x-ohci pxa27x-ohci: GetStatus roothub.portstatus [2] = 0x00130103 PRSC PESC CSC PPS PES CCS
[ 8.493472] hub 1-0:1.0: unable to enumerate USB device on port 3
[ 8.505488] hub 1-0:1.0: state 7 ports 3 chg 0000 evt 0008
[ 8.517448] pxa27x-ohci pxa27x-ohci: GetStatus roothub.portstatus [2] = 0x00030101 PESC CSC PPS CCS
[ 8.529480] hub 1-0:1.0: port 3, status 0101, change 0003, 12 Mb/s
[ 8.699736] hub 1-0:1.0: debounce: port 3: total 100ms stable 100ms status 0x101
[ 8.829765] pxa27x-ohci pxa27x-ohci: GetStatus roothub.portstatus [2] = 0x00100103 PRSC PPS PES CCS
[ 8.899751] usb 1-3: new full speed USB device using pxa27x-ohci and address 6
[ 9.029666] pxa27x-ohci pxa27x-ohci: GetStatus roothub.portstatus [2] = 0x00100103 PRSC PPS PES CCS
[ 9.129612] usb 1-3: ep0 maxpacket = 8
[ 9.142082] usb 1-3: default language 0x0409
[ 9.151041] usb 1-3: udev 6, busnum 1, minor = 5
[ 9.156380] usb 1-3: New USB device found, idVendor=22b8, idProduct=4903
[ 9.167987] usb 1-3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 9.180013] usb 1-3: Product: S Blank Neptune LTE2
[ 9.185511] usb 1-3: Manufacturer: Motorola
[ 9.192990] usb 1-3: uevent
[ 9.215618] usb 1-3: usb_probe_device
[ 9.222460] usb 1-3: configuration #1 chosen from 1 choice
[ 9.249015] usb 1-3: adding 1-3:1.0 (config #1, interface 0)
[ 9.262191] usb 1-3:1.0: uevent
[ 9.289933] usbserial_generic 1-3:1.0: usb_probe_interface
[ 9.302780] usbserial_generic 1-3:1.0: usb_probe_interface - got id
[ 9.340334] hub 1-0:1.0: state 7 ports 3 chg 0000 evt 0008
[ 32.936371] rdy: 1


То есть bp ВНЕЗАПНО перезагрузился и его бут подумал, что флешка чистая, предлагая его шить с ap. Повторить не удалось - все остальные разы bp не хотел подключаться после резюма. На всякий случай - лог этого безобразия: http://pastebin.com/f33b62daa

UPD: опять вылезло. видимо, это не случайный глюк, а закономерный баг. А я был почти уверен, что в этот раз получу обратно модем.
UPD2: и опять...

вторник, 28 июля 2009 г.

Как регистр назвали, то он и показывает

PEDR, defined in Table 3-20, indicates which GPIO pin (enabled through the PWER, PRER and
PFER registers) caused a wake-up from standby, sleep or deep-sleep mode. These bits can be set
only by a rising edge, falling edge, or either on the given GPIO pin, depending on the settings in the PRER and PFER registers.

Вобщем показывает на того педр^W^W ту ногу, за которую дернули, чтобы железка проснулась.

Следующий кандидат на жертву двухмесячного марафона "кто больше обматерит этот драйвер" - PCAP. Теперь, при входе в слип, нам мешает он - быстро-быстро вытаскивает обратно.

UPD: все не так страшно - это всего-то драйвер rtc.

Не верь глазам своим: магии не существует

Я все-таки нашел, почему BP не хотел идти спать.

Небольшая предыстория: в телефоне есть два проца AP и BP.

На ap имеем линупс, на bp имеем vrtx. Если кто не в курсе, bp - это LTE2 Neptune (arm7tdmi), огрызок старой платформы, отвечающий за GSM.

У процессоров есть два способа общения: первый - ноги gpio, их пять штук ( bp_rdy, ap_rdy, reset, flash и bp_wdi ), второй - usb.

По usb они гоняют данные, по ap_rdy и bp_rdy они при буте делаеют хендшейк (это их первое назначение). Когда bp что-то хочет от ap, он делает вот такой фокус:

смотрит, не спит ли ap, если спит, то:
ставит bp_rdy в 0, ждет чуть-чуть, ставит bp_rdy в 1 и опять смотрит.

Так до тех пор, пока AP не включится сам и не включит usb.

На это дело (мигание ноги bp_rdy) срабатывает прерывание и ap смотрит, чо там хочет этот убогий.

Если же ap что-то хочет от bp, он просто шлет по usb данные.

Дальше начинается самое интересное: когда ap хочет, чтобы bp ушел спать (сам ap не идет спать, пока bp не спит), он просто саспендит usb порт.

Если bp видит, что ap потормозил порт, но сам он еще имеет чего слать туда, то он саспендит порт, но при этом не саспендится сам, а один раз передергивает bp_rdy.

Когда ap видит, что bp дергает bp_rdy, он шлет по usb запрос на передачу.

Когда ap хочет что-то послать bp (например запрос на передачу), то сначала смотрит не спит ли bp если спит, то он передергивает ap_rdy, а потом уже врубает порт.

Что собственно происходило такого нехорошего и заставляло думать, будто bp не идет спать:

саспендим порт и видим, что дергается bp_rdy. BP не разрешает слип, думаю я.

BP не может отменять слип
BP не отменяет слип
BP совершенно незачем отменять слип
BP тупо пошел и слипнулся, как ему и сказали

...и поставил ногу bp_rdy в нуль.

А какой-то нехороший человек перепутал направление интеррапт лайна и генерит прерывание по переходу 1->0 (надо по 0->1, как в 2.4). В итоге ap думает, что bp отменило слип и врубает порт обратно. AP смотрит, что оно проснулося и спрашивает "нучо?". Тот молчит, потомучто нечего ему слать - он разрешил слип AP, сам тоже пошел спать, а тут к нему пристали.

Естественно, что после изменения типа ноги с IRQ_FALLING_EDGE на IRQ_RISING_EDGE все благополучно прошло.

UPD:... но ap он слипаться все равно не разрешает.
UPD: дергает ap из слипа через раз. ГРР

четверг, 23 июля 2009 г.

Новости

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

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

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

Первые результаты этого вандализма - патч к boot_usb для чтения памяти (флеша) BP. Как оказалось, там все плохо: родной загрузчик проверяет подписи того что пишут (это патчится), того что запускают (это ломается на лету) и не дает возможности читать и писать произвольные адреса и объемы данных.

Читать он дает только флеш BP, да и то не весь (зону PDS не дает), а писать - только определенные кодовые группы, при чем целиком. Придется делать как на EZX и запускать из-под родного бута кастомный (олдскульных мотохакеров с мотофана), при чем запускать через дыру, чем я сейчас и занимаюсь.

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

PCAP в ванильном ядре

Спешите видеть: linux/kernel/git/torvalds/linux-2.6.git/drivers/mfd/ezx-pcap.c.

Чтобы это еще кто-то юзал...

А я все не могу победить слип в этом самом bp.

upd: pcap - это контроллер специального назначения, на котором висит почти вся периферия в ezx-телефонах: тач, звук, adc, часы, регуляторы питания, кнопка включения и еще всякие лампочки и вибраторы. более новая инкарнация этой мерзенькой железки (atlas) - заведует тем же самым, но в мотобагиксах, при чем имеет тот же интерфейс (прерываения и регистры почти совпадают).

воскресенье, 14 июня 2009 г.

Тестируем 2.6.30

Начинаем тестирование сборки на ядре 2.6.30.

Необходимые для запуска ингридиенты:


  • Загрузчик gen-blob зашитый по адресу 0x000A08000 [1]

  • Утилита boot-usb на большой машине [2]

  • Раздел с ext2 на карте памяти с рутфс

  • Рутфс дистрибутива Angstrom со всеми зависимостями для кутопии [3]

  • Сама кутопия [4]

  • Ядро 2.6.30-ezxdev [5] и модули [6]

  • Инициализатор mux TS07.10 [7]

  • Скрипт [8] и конфиг Qtopia [9] в /etc/

  • Калибровки тачскрина [10]



upd: правильный адрес ядра - 0x000A08000

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

Консоль на EMU

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



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

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

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

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

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

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

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

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