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

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

Я все-таки нашел, почему 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 из слипа через раз. ГРР

7 комментариев:

  1. имхо это ахуенно.

    ОтветитьУдалить
  2. да я сам в шоке - еще пару дней буду бояться телефон в руки брать.

    ОтветитьУдалить
  3. красиво написано...

    ОтветитьУдалить
  4. Двачую. Просто потрясающе написано.
    А уж то, что ты эту хуйню победил, заслуживает отдельной нефтяной вышки.

    ОтветитьУдалить
  5. Да, статья улыбнула. Браво, Илья! и за текст, и за еще одну победу.

    ОтветитьУдалить
  6. только прочел, поздравляю, молодец
    Maksimka

    ОтветитьУдалить
  7. Очень интересно написано, посмеялся :)

    ОтветитьУдалить