MotoFan.Ru — всё для Motorola > Разработки > Ломаем и строим! > Эльфы, их разработка и портирование

Учимся писать эльфов вместе Полная версия
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31

 av Andy51

 29.10.2007, 20:13

Вот и долгожданное обновление SDK до v0.2

Основные новшества с прошлой версии:
+ Добавлено множество функций в SDK
+ Добавлено два новых примера - на этот раз GUI

Что внутри:
Папка SDK - ну, и так ясно, заголовочные файлы. За описаниями функций заглядываем в эту папку.

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

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

ListTest - пример использования диалога List. Значительно более сложный пример, предназначен для изучения возможностей и принципов управления диалогами.

make_*.bat - батники для сборки эльфов-примеров. Эльфы расчитаны на компиляцию с комплектом ADS. Из-за правил форума, я не могу включить его в SDK, однако оставляю ссылки
http://ifolder.ru/3937671
http://slil.ru/25060171
http://rapidshare.com/files/67580866/ads.7z.html

Lib.o - для функционирования эльфа под моим загрузчиком, необходимо подлинковать этот файл к проекту (в make.bat уже прописан).
Внимание! Этот файл не зависит от конкретной версии прошивки, под которую собирается эльф, но, тем не менее, зависит от версии библиотеки!
В этом SDK уже включен Lib.o для библиотеки v071218 (оч. старый - не забудьте обновить, если понадобятся новые функции)

Пара слов об т.н. Application.
В телефонах motorola есть система AFW, которая позволяет, не затрачивая лишних ресурсов процессора на обеспечение "полноценной" многозадачности, достаточно полноценно работать нескольким приложениям, ориентированным на диалог с пользователем. Как это работает: приложения представляют собой, фактически, набор обработчиков событий(ивентов, events) + структура данных приложения. Откликаясь на те или иные события, приложения поочерёдно обрабатывают списки накопившихся ивентов. Таким образом, мы фактически имеем невытесняющую многозадачность.
Есть теоретическая возможность писать и эльфы, выделенные в отдельный процесс(task), но эта часть всё ещё в разработке.

Книги по Си
  1. Руководство полного идиота по программированию (на языке Си) - Не смотря на такое название все азы разжёваны. Если вы вообще никогда не видели Си, начните с этой книги
  2. Герберт Шилдт, "Полный справочник по С (4-е издание)" Нажмите для просмотра прикрепленного файла
  3. "Язык программирования C" Нажмите для просмотра прикрепленного файла
Исходники эльфов
  1. SRC by om2804
  2. SRC by G-XaD
SDK
  1. SDK by om2804
  2. SDK by G-XaD
Эльфостроение на motoWiki

Компилятор + исходники от om2804 для EP1 скачать

 av Andy51

 30.10.2007, 15:53

Цитата(motoprogger @ Сегодня, 15:03)

Andy51, это для каких телефонов и на каких прошивках? Приложи к документации ;-)
*


С т.з. SDK нет различий, под какую модель/прошивку писать. Хотя, на самом деле, могут возникнуть трудности с различиями в функциях и структурах данных на разных платформах. Чтобы помочь программеру сделать эльфа более универсальным, предусмотрены функции LdrGetPhoneName, LdrGetPlatformName, LdrGetFirmwareMajorVersion, LdrGetFirmwareMinorVersion (см. loader.h)

 av yakk

 31.10.2007, 6:44

Andy51 По-быстрому перевел комменты в исходниках.. В принципе могу заниматься этим время от времени..

Attached file contains sources of SDK with English comments.

 no av conanxu

 1.11.2007, 2:00

which tools can i debug my sourcefile like using F5,F9 in VC++6.0?

 av Vilko

 1.11.2007, 5:45

conanxu,
ARM emulator-debugger trace32

 no av conanxu

 1.11.2007, 14:44

QUOTE(Vilko @ 1.11.2007, 13:45) *

conanxu,
ARM emulator-debugger trace32

i can find many debugger system in the page,which one is for e398?thank you

 av Vilko

 1.11.2007, 19:31

conanxu,
of course you need debugger for ARM7 wink.gif

 av om2804

 1.11.2007, 23:06

Цитата(Vzhik @ 1.11.2007, 22:38) *

Попытался установить эльф для удаления .db файлов! Но чет ни че не делает! Как его запускать надо?


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

 no av conanxu

 2.11.2007, 0:51

QUOTE(Vilko @ 2.11.2007, 3:31) *

conanxu,
of course you need debugger for ARM7 wink.gif

I know E398 use ARM7,but at the download page, it just has debugger for GDB target (ARM), OSE (ARM), VaST (ARM), VIRTIO (ARM). Which one can i use? Thank you.

 no av conanxu

 2.11.2007, 14:54

I have write a ToneDBKiller,too. When i compile, it show some warning as below。

"ToneDBKiller.c", line 101: Warning: C2207W: inventing 'extern int malloc();'
"ToneDBKiller.c", line 105: Warning: C2207W: inventing 'extern int u_atou();'
"ToneDBKiller.c", line 111: Warning: C2207W: inventing 'extern int free();'
ToneDBKiller.c: 3 warnings, 0 errors, 0 serious errors

it links ok,but when i run the file,my phone will restart.Here is my code for the function。

WCHAR *puMyToneDB = NULL;
WCHAR *puTempToneDB = NULL;
puMyToneDB = (WCHAR *)malloc(100);
puTempToneDB = (WCHAR *)malloc(100);

u_atou( "file://b/MyToneDB.db", puMyToneDB);
u_atou( "file://b/TempToneDB.db", puTempToneDB);

DL_FsDeleteFile( puMyToneDB, 0);
DL_FsDeleteFile( puTempToneDB, 0);

free(puMyToneDB);
free(puTempToneDB);

Which mistake have i make?
Thank you.

 no av conanxu

 2.11.2007, 15:32

to Vilko:
it didn't show warning message,but when i run it,my phone will also restart.Can you help me to find which mistake i have make?<
Attachment is my source file.
Thank you.

 av Andy51

 2.11.2007, 16:53

conanxu, first of all - have you updated the library to 071029? Most likely it is the problem.

Oops, ive forgot to add mem functions sad.gif Add this to the SDK by yourself:
Ой, я забыл добавить функции для работы с памятью в SDK sad.gif Добавьте в SDK:
Код
void *suAllocMem(UINT32 size, INT32 *result); //result can be NULL
void suFreeMem(void *ptr);

Use it instead of malloc and free
Используйте их вместо malloc и free

If you still have problems with u_atou, then you haven't updated the SDK to v0.1a

Vilko, так не получится - нельзя определить, импорт "известный" или нет sad.gif

 no av conanxu

 3.11.2007, 3:35

Andy51, thank you for your help. the string convert is normal. Now,there is a new problem. I try to implement the function.when i press star double, it will delete the tonedbfiles. when i press star first and then press pound, it will exit. but in practice, i only press star once at first. it will delete the tonedbfiles. i press other key at first , then press star double. it works normal.here is my code for keyevent handle function.
Код

UINT32 HandleKeypress( EVENT_STACK_T *ev_st,  void *app )
{
    static BOOL bPressStar = FALSE;
    EVENT_T     *event = AFW_GetEv(ev_st);

    UtilLogStringData(" *** ELF *** HelloWorld: key pressed 0x%X", event->data.key_pressed);

    DL_AudPlayTone(event->data.key_pressed, 6);
    
    if(event->data.key_pressed == KEY_STAR)
    {
        if(bPressStar == FALSE)
            bPressStar = TRUE;
        else
        {
            DelToneDBFile();
            return ToneDBKillerExit(ev_st, app);
        }
    }
    else
    {
        if(bPressStar == TRUE && event->data.key_pressed == KEY_POUND)
            return ToneDBKillerExit(ev_st, app);
        bPressStar = FALSE;
    }
    
    return RESULT_OK;
}


i think the var bPressStar maybe is TRUE at first.

 av Andy51

 3.11.2007, 12:51

conanxu, edited your message... About the question: try to catch EV_KEY_RELEASE event and make in its handler bPressStar = TRUE. The cause could be that you're catching the event twice.

btw, maybe Vilko would be so kind to explain how to use UtilLogStringData? wink.gif It would be quite a help to all interested programmers smile.gif

 no av conanxu

 4.11.2007, 12:28

I modified my code.
Код

BOOL bPressStar = FALSE;

/* Handler of the HW_STATE_ANY event (it used in every state) */
const EVENT_HANDLER_ENTRY_T any_state_handlers[] =
{  
    { EV_KEY_PRESS,             HandleKeypress },
    { EV_KEY_RELEASE,           HandleKeyrelease },

    // The list must always end with such record
    { STATE_HANDLERS_END,           NULL           },
};

UINT32 HandleKeypress( EVENT_STACK_T *ev_st,  void *app )
{
    EVENT_T     *event = AFW_GetEv(ev_st);

    UtilLogStringData(" *** ELF *** HelloWorld: key pressed 0x%X", event->data.key_pressed);

    DL_AudPlayTone(event->data.key_pressed, 6);
    
    if(event->data.key_pressed == KEY_STAR)
    {
        if(bPressStar == TRUE)
        {
            UtilLogStringData(" *** ELF *** ToneDBKiller: key pressed star double");
            DelToneDBFile();
            return ToneDBKillerExit(ev_st, app);
        }
        else
            UtilLogStringData(" *** ELF *** ToneDBKiller: key pressed star once");
    }
    else
    {
        if(bPressStar == TRUE && event->data.key_pressed == KEY_POUND)
        {
            UtilLogStringData(" *** ELF *** ToneDBKiller: key pressed star and pound");
            return ToneDBKillerExit(ev_st, app);
        }
        else
            UtilLogStringData(" *** ELF *** ToneDBKiller: key pressed other");
    }
    
    return RESULT_OK;
}

UINT32 HandleKeyrelease( EVENT_STACK_T *ev_st,  void *app )
{
    EVENT_T     *event = AFW_GetEv(ev_st);

    if(event->data.key_pressed == KEY_STAR)
    {
        if(bPressStar == FALSE)
            bPressStar = TRUE;
    }
    else
        bPressStar = FALSE;
    return RESULT_OK;
}

now, it works normally

Edit by A51 - Do not forget to use [code][/code] tags!

 av G-XaD

 6.11.2007, 14:06

Код

UINT8 DL_FsWriteFile( void* buffer,
                      UINT32 size,
                      UINT32 count,
                      FILE_HANDLE_T handle,
                      UINT32* written);

Для чего параметр written?
Долго эксперементировал с функциями файловой системы, но тело постоянно уходило в ребут при вызове DL_FsWriteFile. В конце концов добился правильной работы вот так:
Код

UINT8 fwrite( void* buffer, UINT32 size, UINT32 count, FILE f ) {
    return DL_FsWriteFile( buffer, size, count, f, (((UINT32*)buffer)-4) );
}

Вот только я не уверен правильно ли это?

 av Andy51

 6.11.2007, 16:17

G-XaD, ты ведь работал с fwrite? Если помнишь, она возвращает количество записанных блоков размером size. Так вот DL_FsWriteFile вместо этого возвращает код ошибки, а количество записанных блоков - через параметр written.
Т.е. правильно так:
Код
UINT32 fwrite( void* buffer, UINT32 size, UINT32 count, FILE f )
{
    UINT32 written;
    DL_FsWriteFile( buffer, size, count, f, &written);
    return written;
}

 av G-XaD

 15.11.2007, 12:23

теперь сделать бекап PDS совсем легко. Не прийдется даже переводить телефон во флеш-режим.
Эльф делает бекап памяти длинной в 0x10000 байт начиная с адресса 0x10010000 в файл /b/PDS.smg.

Закачиваем эльф, запускаем.
жмем на теле 1 чтобы сделать бекап (будет звук).
2 чтобы проверить существование бекап-файла (будет звук: да/нет).
3 чтобы удалить бекап (будет звук: да/нет).
* или # чтобы закрыть эльф (будет звук).

 av S@modelkin

 18.11.2007, 7:37

Andy51,
1) Когда выйдет новый SDK? А то я уже все функции перепробовал...
2) Кстати, я нашёл тут gnuarm. В нём много стандарных библиотек c++, но я просто не успел ещё им воспользоваться. Самое, что меня радует - это то, что в нём есть stdio.h smile.gif И ВОПРОС! Можно ли им пользоваться при написании эльфов? (там папочка есть arm-elf, и в ней много загололвочных файлов)
3) Наверное немного неуместный вопрос, но откуда взялась функция из dl.h (она там одна, просто забыл как называется), ну на проигрывание тона? Её в стандартных библиотеках нет, значит это наверное стандартная функция прошивки... И ещё: где можно(если можно) взять все эти функции?

 av Andy51

 18.11.2007, 10:39

Цитата(S@modelkin @ Сегодня, 10:37)

Когда выйдет новый SDK? А то я уже все функции перепробовал...
*

Это не так просто делается...
Цитата(S@modelkin @ Сегодня, 10:37)

Можно ли им пользоваться при написании эльфов?
*

Можно, но далеко не всеми функциями. printf-ы использовать не получится, а всякие sprintf - пожалста. Статическая линковка не рекомендуется, лучше использовать функции, которые уже есть в прошивке.
Цитата(S@modelkin @ Сегодня, 10:37)

где можно(если можно) взять все эти функции?
*

Берёшь из эльфа gsm_flash_dev. Найдёшь там кстати функции libc - можешь добавить в библиотеку и юзать на здоровье. Да и если получится - поможешь тем самым расширению SDK wink.gif
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31

Полная версия:


MotoFan.ru (©) 2024    Слушать Radio