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/3937671http://slil.ru/25060171http://rapidshare.com/files/67580866/ads.7z.htmlLib.o - для функционирования эльфа под моим загрузчиком, необходимо подлинковать этот файл к проекту (в make.bat уже прописан).
Внимание! Этот файл не зависит от конкретной версии прошивки, под которую собирается эльф, но, тем не менее, зависит от версии библиотеки!
В этом SDK уже включен Lib.o для библиотеки v071218 (оч. старый - не забудьте обновить, если понадобятся новые функции)
Пара слов об т.н. Application.
В телефонах motorola есть система AFW, которая позволяет, не затрачивая лишних ресурсов процессора на обеспечение "полноценной" многозадачности, достаточно полноценно работать нескольким приложениям, ориентированным на диалог с пользователем. Как это работает: приложения представляют собой, фактически, набор обработчиков событий(ивентов, events) + структура данных приложения. Откликаясь на те или иные события, приложения поочерёдно обрабатывают списки накопившихся ивентов. Таким образом, мы фактически имеем невытесняющую многозадачность.
Есть теоретическая возможность писать и эльфы, выделенные в отдельный процесс(task), но эта часть всё ещё в разработке.
Книги по Си- Руководство полного идиота по программированию (на языке Си) - Не смотря на такое название все азы разжёваны. Если вы вообще никогда не видели Си, начните с этой книги
- Герберт Шилдт, "Полный справочник по С (4-е издание)" Нажмите для просмотра прикрепленного файла
- "Язык программирования C" Нажмите для просмотра прикрепленного файла
Исходники эльфов- SRC by om2804
- SRC by G-XaD
SDK- SDK by om2804
- SDK by G-XaD
Эльфостроение на motoWikiКомпилятор + исходники от om2804 для EP1 скачать
Andy51
30.10.2007, 15:53
Цитата(motoprogger @ Сегодня, 15:03)
Andy51, это для каких телефонов и на каких прошивках? Приложи к документации ;-)
С т.з. SDK нет различий, под какую модель/прошивку писать. Хотя, на самом деле, могут возникнуть трудности с различиями в функциях и структурах данных на разных платформах. Чтобы помочь программеру сделать эльфа более универсальным, предусмотрены функции
LdrGetPhoneName,
LdrGetPlatformName,
LdrGetFirmwareMajorVersion,
LdrGetFirmwareMinorVersion (см. loader.h)
yakk
31.10.2007, 6:44
Andy51 По-быстрому перевел комменты в исходниках.. В принципе могу заниматься этим время от времени..
Attached file contains sources of SDK with English comments.
conanxu
1.11.2007, 2:00
which tools can i debug my sourcefile like using F5,F9 in VC++6.0?
Vilko
1.11.2007, 5:45
conanxu
1.11.2007, 14:44
QUOTE(Vilko @ 1.11.2007, 13:45)
i can find many debugger system in the page,which one is for e398?thank you
Vilko
1.11.2007, 19:31
conanxu,
of course you need debugger for ARM7
om2804
1.11.2007, 23:06
Цитата(Vzhik @ 1.11.2007, 22:38)
Попытался установить эльф для удаления .db файлов! Но чет ни че не делает! Как его запускать надо?
Также как и остальные эльфы. Ищем в файлбраузере эльф и выбираем его, далее нажимаем любую кнопку - файлы ToneDB удалены
conanxu
2.11.2007, 0:51
QUOTE(Vilko @ 2.11.2007, 3:31)
conanxu,
of course you need debugger for ARM7
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.
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.
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.
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
Add this to the SDK by yourself:
Ой, я забыл добавить функции для работы с памятью в SDK
Добавьте в 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, так не получится - нельзя определить, импорт "известный" или нет
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.
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?
It would be quite a help to all interested programmers
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!
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) );
}
Вот только я не уверен правильно ли это?
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;
}
G-XaD
15.11.2007, 12:23
теперь сделать бекап PDS совсем легко. Не прийдется даже переводить телефон во флеш-режим.
Эльф делает бекап памяти длинной в 0x10000 байт начиная с адресса 0x10010000 в файл /b/PDS.smg.
Закачиваем эльф, запускаем.
жмем на теле 1 чтобы сделать бекап (будет звук).
2 чтобы проверить существование бекап-файла (будет звук: да/нет).
3 чтобы удалить бекап (будет звук: да/нет).
* или # чтобы закрыть эльф (будет звук).
S@modelkin
18.11.2007, 7:37
Andy51,
1) Когда выйдет новый SDK? А то я уже все функции перепробовал...
2) Кстати, я нашёл
тут gnuarm. В нём много стандарных библиотек c++, но я просто не успел ещё им воспользоваться. Самое, что меня радует - это то, что в нём есть stdio.h
И ВОПРОС! Можно ли им пользоваться при написании эльфов? (там папочка есть arm-elf, и в ней много загололвочных файлов)
3) Наверное немного неуместный вопрос, но откуда взялась функция из dl.h (она там одна, просто забыл как называется), ну на проигрывание тона? Её в стандартных библиотеках нет, значит это наверное стандартная функция прошивки... И ещё: где можно(если можно) взять все эти функции?
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