Jest to prosty przykład, jak dowiedzieć się z poziomu elfa, na jakim telefonie i FW jest odpalany. Sama GetChipID zwraca tylko platformę, nie zwróci więc modelu telefonu i wersji FW.
Kodu użyłem w swoim najnowszym EasyGDFSBackup, by procedura była naprawdę "Easy" , a otrzymałem go [kod] prosto od ploika
No więc zacznijmy od utworzenia pliku phone.h:
#ifndef _PHONE_H_ #define _PHONE_H_ typedef struct { int type; char *addr; char *firmware; }PhoneDB_t; enum phone_t { UNKNOWN = 0, K750_R1CA021, W800_R1BD001, phoneNums }; extern PhoneDB_t PhoneDB[phoneNums]; #endif //_PHONE_H_
oraz phone.c:
#include "phone.h" #include "def_func.h" PhoneDB_t PhoneDB[phoneNums] = { {UNKNOWN, 0, "0000000"}, {K750_R1CA021, K750_R1CA021_ADDR, "R1CA021"}, {W800_R1BD001, W800_R1BD001_ADDR, "R1BD001"} };
oraz def_func.h
#ifndef _DEF_FUNC_H_ #define _DEF_FUNC_H_ #define W200_R4HA014_ADDR (char *)0x4482ADBE #define W300_R4EA031_ADDR (char *)0x448CA6BD #define W550_R4CB020_ADDR (char *)0x44898CEC #define W580_R8BE001_ADDR (char *)0x45AF7529 #define W600_R7CA017_ADDR (char *)0x44896D54 #define W610_R6BC002_ADDR (char *)0x45995A7D #define W660_R8BB001_ADDR (char *)0x45B14E61 #define W700_R1CA021_ADDR (char *)0x4467EDDC #define W710_R1JC002_ADDR (char *)0x459A6D3D #define W800_R1BD001_ADDR (char *)0x4467DFB2 #define W810_R4EA031_ADDR (char *)0x4493E81E #define W850_R1KG001_ADDR (char *)0x45BD5B0D #define W880_R8BA024_ADDR (char *)0x45BDF5FD #define K600_R2BB001_ADDR (char *)0x21423A90 #define K750_R1CA021_ADDR (char *)0x44670436 #define K770_R8BA024_ADDR (char *)0x45C072E8 #define K790_R8BF003_ADDR (char *)0x45A05CB9 #define K800_R8BF003_ADDR (char *)0x45B8F9C9 #define K810_R8BA024_ADDR (char *)0x45BA3581 #define K810_R8BF003_ADDR (char *)0x45BA5ED9 #define Z530_R6DA001_ADDR (char *)0x448A7E6E #define Z550_R6GA004_ADDR (char *)0x4492C6C7 #define Z610_R6DA001_ADDR (char *)0x45A7B0ED #endif //_DEF_FUNC_H_
Więc aby dodać do elfa:
1. Przechodzimy do naszego projektu. Dajemy w IAR: Project>Add Files.
2. Wybieramy phone.c i dajemy OK.
3. W main.c pod inkludami dodajemy:
#include "phone.h" int PhoneType = UNKNOWN;
4. Dodajemy funkcję:
int GetPhoneType() { char tmp[8]; for(int i=0; i<phoneNums; i++) { if(PhoneDB[i].addr) { memcpy(tmp,PhoneDB[i].addr,7); tmp[7] = 0; if(strcmp(tmp,PhoneDB[i].firmware) == 0) { return PhoneDB[i].type; } } } return UNKNOWN; }
I żeby użyć tego co mamy:
int main (void) { PhoneType = GetPhoneType(); if(PhoneType == K750_R1CA021) MessageBox(0x6fFFFFFF,STR("Wykryto: K750 R1CA021"),0, 1 ,5000,0); else if (PhoneType == W800_R1BD001) MessageBox(0x6fFFFFFF,STR("Wykryto: W800 R1BD001"),0, 1 ,5000,0); else MessageBox(0x6fFFFFFF,STR("Wykryto inny model"),0, 1 ,5000,0); return(0); }
No więc żeby sobie dodać telefony modyfikujemy plik phone.c i phone.h.
We wszystkim bazujemy się na pliku def_func.h.
Dodajmy więc K800 R8BF003.
W def_func.h szukamy wzmianki o tym telefonie i FW:
#define K800_R8BF003_ADDR (char *)0x45B8F9C9
Więc otwieramy phone.h i do enum phone_t dodajemy model:
enum phone_t { UNKNOWN = 0, K750_R1CA021, W800_R1BD001, K800_R8BF003, phoneNums };
Otwieramy phone.c i również dodajemy model do PhoneDB_t PhoneDB[phoneNums] według tego schematu:
{MODEL_wersja-SOFTWARE, MODEL_wersja-SOFTWARE_ADDR, "wersja-SOFTWARE"}
(żeby wiedzieć OCB porównaj poniższą część z częścią phone.c pokazaną na początku.
PhoneDB_t PhoneDB[phoneNums] = { {UNKNOWN, 0, "0000000"}, {K750_R1CA021, K750_R1CA021_ADDR, "R1CA021"}, {W800_R1BD001, W800_R1BD001_ADDR, "R1BD001"}, {K800_R8BF003, K800_R8BF003_ADDR, "R8BF003"} };
I żeby użyć nowego modelu w kodzie:
if (PhoneType == K800_R8BF003) ///zrob to i to....To chyba tyle
Enjoy