Работа с Intel xScale PXA 270

Тема в разделе "WASM.BEGINNERS", создана пользователем IOZ, 26 апр 2007.

  1. IOZ

    IOZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    4
    Добрый день.
    Дело в том, что я собираюсь разогнать процессор PXA 270. Многочасовые ковыряния в линуксе дали свои плоды.
    Все уперлось в процедуру
    int pm_do_standby()
    {
    unsigned long unused;

    cli();
    clf();

    leds_event(led_stop);

    printk(KERN_INFO "In function %s.\n", __FUNCTION__);

    /* This also works fine by useing SW12 to wake it up.*/
    /* Set PSTR. */
    PSTR = 0x4;
    /* Copied from PalmOS Group. */
    PWER = 0x80000002;
    PRER = 0x2;
    PFER = 0x2;
    PKWR = 0x000E0000;
    /* Copied from PalmOS Group end.*/

    /* Standby the CPU. */
    __asm__ __volatile__("\n\
    \n\
    \n\
    ldr r0, [%1] \n\
    mov r1, #0x18 \n\
    @ orr r1, r0, #0x08 \n\
    mov r2, #2 \n\
    b 1f \n\
    \n\
    .align 5 \n\
    1: \n\
    @ All needed values are now in registers. \n\
    @ These last instructions should be in cache \n\
    @ enter standby mode \n\
    \n\
    mcr p14, 0, r2, c7, c0, 0 \n\
    \n\
    @ CPU will stop exec until be waked up. \n\
    @ After be waken, just return. \n\
    str r1, [%1] \n\
    .rept 11 \n\
    nop \n\
    .endr"

    : "=&r" (unused)
    : "r" (&PSSR)
    : "r0", "r1", "r2");

    printk(KERN_INFO "Return from standby mode.\n");
    leds_event(led_start);

    sti();
    return 0;
    }

    Я ничего непонимаю в ассемблере, но насколько я понял ldr - это регистр процессора, nop (no operation) - ждем один тик процессора, mov - что то куда то перемещаем. Вобщем это все мои познания в asm. Если вам не трудно разьясните что тут делается на С. Буду очень благодарен.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Насколько я помню ARM-архитектуру, то:
    ldr - загрузка в регистр значения. Rx = [Imm]
    orr - оператор или, Rx = Ry | Imm.
    b - условный/безусловный переход по адресу.
    mcr - загрузить в сопроцессор значение ARM-регистра
    str - сохранение в память значения регистра. [Imm] = Rx.
    Оператора nop не помню такого :\
     
  3. IOZ

    IOZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    4
    то есть сначала мы загружаем в регистр ldr r0, [%1]. Но что такое [%1]? Это какое-то значение? Если да, то какое?
    mov r1, #0x18 \n\. mov перемещает r1? Что означает #0x18. Это случайно не значение 1F, то есть 17?
    @ orr r1, r0, #0x08 \n\. То есть в r1 мы пишем либо r0, либо 0х08? Я не вижу условия по которому осуществляется выбор между двумя значениями. Ткните носом пжлст.
    Что такое .align 5 ???
    и что это такое
    : "=&r" (unused)
    : "r" (&PSSR)
    : "r0", "r1", "r2");
    ???
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Я же написал r1 = r0 | 0x08. Не ||, а |.
    Это 0x18.
    хз, читай справку по компилятору. Скорее всего это [PSSR]
    Выравнивание на пяти-байтовую границу.
     
  5. IOZ

    IOZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    4
    Простите за мое непонимание, но мне не совсем понятны некоторые вещи.
    "r1 = r0 | 0x08" а что означает |?
    "Это 0x18". Какое значение будет в десятиричной системе исчисления. Правильно ли я понял что в двоичной это будет означать 00011000?
    "хз, читай справку по компилятору. Скорее всего это [PSSR]" Если вы помните что скорее всего это PSSR, может вы помните что это такое?
    что означает выравнивание на 5 байтовую таблицу? дайте ссылочку пжлст
     
  6. IOZ

    IOZ New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    4
    в тексте очень часто встречается \n\. Что это означает?
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    побитовое или.
    calc.exe, 0x18 == 16 * 1 + 8 == 24. Да, в двоичном виде это так.
    С ARM-процессорами я работал, но не конкретно с xScale. Какой-то внутренний регистр.
    границу
    Перенос строки, без этого было бы одной строкой, что ассемблер бы не понял.