This topic has been moved to Camera Emergency Department.
https://www.magiclantern.fm/forum/index.php?topic=26287.0
https://www.magiclantern.fm/forum/index.php?topic=26287.0
Etiquette, expectations, entitlement...
@autoexec_bin | #magiclantern | Discord | Reddit | Server issues
This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.
Show posts Menu
sudo apt-get update
sudo apt-get install make gcc gcc-arm-none-eabi mercurial gcc-mingw-w64 python3-docutils zip
sudo apt-get install python2
hg clone -u unified https://bitbucket.org/hudson/magic-lantern
ls /usr/lib/gcc/arm-none-eabi/
arm-none-eabi-gcc- [TAB] [TAB]
GCC_VERSION=-4.8.2
ARM_PATH=/usr
# prepare system
sudo apt-get update
sudo apt-get install make gcc gcc-arm-none-eabi mercurial gcc-mingw-w64 python3-docutils zip
# download and prepare ML
hg clone -u unified https://bitbucket.org/hudson/magic-lantern
cd magic-lantern
echo "GCC_VERSION=-`ls /usr/lib/gcc/arm-none-eabi/`" > Makefile.user
echo "ARM_PATH=/usr" >> Makefile.user
# preparation complete, now build ML
cd platform/5D3.123
make zip
# desktop utilities
cd ../../modules/mlv_rec
make mlv_dump.exe
cd ../../modules/dual_iso
make cr2hdr.exe
# ports in progress (100D, 70D)
hg update 100D_merge_fw101 -C # use TAB to find the exact name
hg merge unified # or lua_fix or whatever (optional)
cd ../../platform/100D.101
make zip
# 4K with sound
hg update crop_rec_4k_mlv_snd -C
cd ../../platform/5D3.123
make clean; make zip
# quick build (autoexec.bin only, without modules)
cd ../../platform/5D3.123
make zip ML_MODULES_DYNAMIC=
# recovery (portable display test, ROM dumper, CPU info...)
hg update recovery -C
cd ../../platform/portable.000
make zip ML_MODULES_DYNAMIC=
sudo apt-get update
sudo apt-get install zlib1g-dev libglib2.0 autoconf libtool libsdl-console flex bison libgtk2.0-dev mtools
sudo apt-get install libsdl-console-dev
hg update qemu
qemu-system-arm: -chardev socket,server,nowait,path=qemu.monitor,id=monsock: Failed to bind socket to qemu.monitor: Operation not permitted
-chardev socket,server,nowait,path=qemu.monitor,id=monsock \
-mon chardev=monsock,mode=readline \
<EngineDescription Name="SDCON">
<Registers>
<Register Offset="0x000" Name="" Text="Unknown" Description="Set to 0x00 on init"/>
<Register Offset="0x004" Name="" Text="Unknown" Description="Set to 0x01 on init"/>
<Register Offset="0x008" Name="" Text="Unknown" Description="Set to 0x00 on init, 0x01/0xF1 before read/write, not used for status block. means: use DMA?"/>
<Register Offset="0x00C" Name="" Text="Unknown" Description="Set to 0x14/0x13/0x12/0x11/0x02 on command, after writing regs +0x024, +0x020 and +0x010, with 0x11, registers +0x028/+0x02C is ignored probably"/>
<Register Offset="0x010" Name="" Text="Status Register" Description="">
<RegisterFields>
<RegisterField xsi:type="Bit" Pos="0" Name="" Text="Transfer finished" Description="" />
<RegisterField xsi:type="Bit" Pos="1" Name="" Text="Error during transfer" Description="" />
<RegisterField xsi:type="Bit" Pos="20" Name="" Text="DAT transfer data available in reg +0x06C?" Description="" />
<RegisterField xsi:type="Bit" Pos="21" Name="" Text="DAT transfer finished?" Description="" />
</RegisterFields>
</Register>
<Register Offset="0x014" Name="" Text="Unknown" Description="Set to 0x03 before transfer start, 0x00 on ISR"/>
<Register Offset="0x018" Name="" Text="Unknown" Description="Set to 0x08 on init"/>
<Register Offset="0x020" Name="" Text="Command frame lower 32 bits" Description="needs 0x0001 being set (end bit)"/>
<Register Offset="0x024" Name="" Text="Command frame upper 16 bits" Description="needs 0x4000 being set (transmission bit)"/>
<Register Offset="0x028" Name="" Text="Unknown" Description="Written with 0x88/0x30/0x30 before CMD"/>
<Register Offset="0x02C" Name="" Text="Unknown" Description="Written with 0x7F08/0x2701/0x80000000 before CMD"/>
<Register Offset="0x034" Name="" Text="Data received lower 32 bits" Description=""/>
<Register Offset="0x038" Name="" Text="Data received upper 16 bits" Description=""/>
<Register Offset="0x058" Name="" Text="SD bus width" Description="">
<RegisterFields>
<RegisterField xsi:type="Bits" Start="0" End="4" Name="" Text="0---0 1 bit" Description="" />
<RegisterField xsi:type="Bits" Start="0" End="4" Name="" Text="0---1 4 bit" Description="" />
<RegisterField xsi:type="Bits" Start="0" End="4" Name="" Text="1---0 8 bit" Description="" />
</RegisterFields>
</Register>
<Register Offset="0x05C" Name="" Text="Write transfer block size" Description=""/>
<Register Offset="0x064" Name="" Text="SD bus width" Description="">
<RegisterFields>
<RegisterField xsi:type="Bits" Start="0" End="4" Name="" Text="0---0 1 bit" Description="" />
<RegisterField xsi:type="Bits" Start="0" End="4" Name="" Text="0---1 4 bit" Description="" />
<RegisterField xsi:type="Bits" Start="0" End="4" Name="" Text="1---0 8 bit" Description="" />
<RegisterField xsi:type="Bits" Start="20" End="27" Name="" Text="01100000 1 bit" Description="" />
<RegisterField xsi:type="Bits" Start="20" End="27" Name="" Text="01100000 4 bit" Description="" />
<RegisterField xsi:type="Bits" Start="20" End="27" Name="" Text="01110000 8 bit" Description="" />
</RegisterFields>
</Register>
<Register Offset="0x068" Name="" Text="Read transfer block size" Description=""/>
<Register Offset="0x070" Name="" Text="Some flags" Description="set to 0x39 before transfer">
<RegisterFields>
<RegisterField xsi:type="Bit" Pos="0" Name="Transfer running" Text="" Description="" />
</RegisterFields>
</Register>
<Register Offset="0x07C" Name="" Text="Read/Write transfer block count" Description=""/>
<Register Offset="0x080" Name="" Text="Transferred blocks" Description=""/>
<Register Offset="0x084" Name="SDREP" Text="Status register/error codes" Description=""/>
<Register Offset="0x088" Name="SDBUFCTR" Text="Buffer counter?" Description="Set to 0x03 before reading/writing"/>
</Registers>
</EngineDescription>
SDCON Engines
-------------------
0xC0C10000 SDCON0
0xC0C20000 SDCON1
0xC0C30000 SDCON2
0xC0C40000 SDCON3
+0x0000 Unknown
Set to 0x00 on init
+0x0004 Unknown
Set to 0x01 on init
+0x0008 Unknown
Set to 0x00 on init, 0x01/0xF1 before read/write, not used for status block. means: use DMA?
+0x000C Unknown
Set to 0x14/0x13/0x12/0x11/0x02 on command, after writing regs +0x024, +0x020 and +0x010, with 0x11, registers +0x028/+0x02C is ignored probably
+0x0010 Status Register
-------- -------- -------- -------X Transfer finished
-------- -------- -------- ------X- Error during transfer
-------- ---X---- -------- -------- DAT transfer data available in reg +0x06C?
-------- --X----- -------- -------- DAT transfer finished?
+0x0014 Unknown
Set to 0x03 before transfer start, 0x00 on ISR
+0x0018 Unknown
Set to 0x08 on init
+0x0020 Command frame lower 32 bits
needs 0x0001 being set (end bit)
+0x0024 Command frame upper 16 bits
needs 0x4000 being set (transmission bit)
+0x0028 Unknown
Written with 0x88/0x30/0x30 before CMD
+0x002C Unknown
Written with 0x7F08/0x2701/0x80000000 before CMD
...
struct struc_JobClass *cmd_FA_CreateTestImage()
{
struct struc_JobClass *job; // r4@3
unsigned int length; // [sp+Ch] [bp-44h]@3
unsigned int *data_ptr; // [sp+10h] [bp-40h]@3
struct struc_ShootParm tv; // [sp+14h] [bp-3Ch]@3
DryosDebugMsg(0x90, 0x16, "FA_CreateTestImage");
exec_command_vararg("sht_FA_CreateTestImage");
msleep(20);
if ( !word_2771C )
{
SRM_ChangeMemoryManagementForFactory();
}
++word_2771C;
PROP_GetMulticastProperty(PROP_SHUTTER, &data_ptr, &length);
tv.Tv = *data_ptr;
tv.Tv2 = *data_ptr;
PROP_GetMulticastProperty(PROP_APERTURE, &data_ptr, &length);
tv.Av = *data_ptr;
tv.Av2 = *data_ptr;
PROP_GetMulticastProperty(PROP_ISO, &data_ptr, &length);
tv.ISO = *data_ptr;
tv.PO_lo = 185;
tv.PO_hi = 0;
tv.TP = 153;
job = CreateSkeltonJob(&tv, FA_CreateTestImage_cbr);
DryosDebugMsg(0x90, 0x16, "hJob(%#lx)(tv=%#x,av=%#x,iso=%#x)", job, (unsigned __int8)tv.Tv, (unsigned __int8)tv.Av, (unsigned __int8)tv.ISO);
DryosDebugMsg(0x90, 0x16, "FA_CreateTestImage Fin");
return job;
}
#pragma pack(push, 1)
struct __attribute__((packed)) __attribute__((aligned(1))) struc_ShootParm
{
char Tv;
char Av;
char Tv2;
char Av2;
char ISO;
char field_5;
char unk_HI;
char unk_LO;
int field_8;
int field_C;
char field_10;
char field_11;
char WftReleaseCheck;
char field_13;
char field_14;
char field_15;
char field_16;
char field_17;
char field_18;
char TP;
char field_1A;
char PO_hi;
char PO_lo;
char field_1D;
char field_1E;
char field_1F;
char field_20;
char field_21;
char field_22;
char field_23;
char field_24;
__int16 field_25;
char field_27;
char field_28;
char field_29;
char field_2A;
char field_2B;
int field_2C;
char EshutMode__;
char EshutMode_;
char field_32;
char field_33;
int field_34;
int field_38;
int field_3C;
char field_40;
};
#pragma pack(pop)
struct struc_JobClass *__cdecl CreateSkeltonJob(struct struc_ShootParm *shootParam, int (__cdecl *cbr)(int, int))
{
int v4; // r0@1
const char *v5; // r2@1
int v6; // r3@1
struct struc_memChunk *v7; // r0@4
struct struc_JobClass *job; // r5@4
signed int jobField; // r0@4
int v10; // r1@5
int v11; // r0@6
int v12; // r0@10
const char *v13; // r2@10
int v14; // r3@10
struct struc_Container *v15; // r0@13
struct struc_Container *v16; // r0@14
signed int v17; // r0@16
struct struc_memSuite *Mem1Component; // r0@21
void *v20; // [sp+0h] [bp-38h]@1
struct struc_memSuite *suite; // [sp+8h] [bp-30h]@1
int data; // [sp+Ch] [bp-2Ch]@3
v20 = shootParam;
suite = 0;
DryosDebugMsg(0x8F, 5, "CreateSkeltonJob (%#x)", cbr);
SRM_AllocateMemoryResourceForJobObject(0x114C, SRM_AllocateMemoryResourceFor1stJob_cbr, &suite);
v4 = TakeSemaphoreTimeout((void *)dword_27A44, 0x64);
if ( v4 )
{
v6 = v4;
v5 = "SRM_AllocateMemoryResourceForJobObject failed [%#x]";
}
data = v4;
if ( v4 )
{
goto LABEL_9;
}
v7 = GetFirstChunkFromSuite(suite);
job = (struct struc_JobClass *)GetMemoryAddressOfMemoryChunk(v7);
memzero(job, 0x114Cu);
jobField = 0;
do
{
v10 = 0x31 * jobField;
job->jobs[jobField++].job_ref = job;
job->jobs[4 * v10 / 0xC4u].signature = "JobClass";
}
while ( jobField < 3 );
job->suite = suite;
SRM_AllocateMemoryResourceForCaptureWork(0x40000, (int)SRM_AllocateMemoryResourceFor1stJob_cbr, (unsigned int *)&job->Mem1Component_0x4000_MEM1);
v11 = TakeSemaphoreTimeout((void *)dword_27A44, 0x64);
data = v11;
if ( v11 || !job->Mem1Component_0x4000_MEM1 )
{
v5 = (const char *)"SRM_AllocateMemoryResourceForCaptureWork failed [%#x, %#x]";
v20 = suite;
v6 = v11;
LABEL_9:
DryosDebugMsg(0x8F, 6, v5, v6, v20);
data = 5;
prop_request_change(PROP_MVR_REC, &data, 4u);
return (struct struc_JobClass *)&unk_5;
}
SRM_AllocateMemoryResourceFor1stJob((int)SRM_AllocateMemoryResourceFor1stJob_cbr, (int)&job->ImageBuffer);
v12 = TakeSemaphoreTimeout((void *)dword_27A44, 0x64);
if ( v12 )
{
v14 = v12;
v13 = "SRM_AllocateMemoryResourceFor1stJob failed [%#x]";
}
data = v12;
if ( v12 )
{
LABEL_18:
DryosDebugMsg(0x8F, 6, v13, v14);
return (struct struc_JobClass *)&unk_5;
}
memcpy_0(&job->ShootParam, shootParam, 0x31u);
GetCurrentDcsParam(&job->DcsParam);
jobSetUnitPictType(job, job->DcsParam.PictType);
job->cbr = cbr;
job->cbr_ptr = &job->cbr;
job->field_25C = 1;
job->JobID = dword_27A24 + 1;
v15 = CreateContainerWithoutLock("JobClass");
job->FileContainer = v15;
if ( (unsigned __int8)v15 & 1 || (v16 = CreateContainerWithoutLock("JobClass"), job->JobClassContainer = v16, (unsigned __int8)v16 & 1) )
{
v14 = data;
v13 = (const char *)"CreateContainerWithoutLock failed [%#x]";
goto LABEL_18;
}
v17 = Container_AddObject(job->FileContainer, "Mem1Component", (int)job->Mem1Component_0x4000_MEM1, 0x40000, (int)sub_FF0F2008, 0);
data = v17;
if ( v17 & 1 )
{
v14 = v17;
v13 = "AddObject failed [%#x]";
goto LABEL_18;
}
Mem1Component = job->Mem1Component_0x4000_MEM1;
job->pLuckyTable = &Mem1Component[0x2600];
DryosDebugMsg(0x8F, 5, "Mem1Component 0x%x pLuckyTable 0x%x", Mem1Component, &Mem1Component[0x2600]);
irq_disable();
if ( !powersave_count )
{
cmd_DisablePowerSave();
}
++dword_27A24;
++powersave_count;
irq_enable();
return job;
}
#pragma pack(push, 4)
struct struc_JobClass
{
struc_JobClassListElem jobs[3];
_BYTE gap24C[4];
struct struc_memSuite *suite;
int (__cdecl **cbr_ptr)(int, int);
int (__cdecl *cbr)(int, int);
int field_25C;
int JobID;
int field_264;
int field_268;
int ObjectID;
int field_270;
int field_274;
int field_278;
int Destination;
struct struc_ShootParm ShootParam;
struc_AfterParam AfterParam;
__attribute__((aligned(4))) struct struc_DcsParam DcsParam;
int ShootImageStorage;
struct struc_memSuite *ImageMemory_0x4_JPEG_L;
struct struc_memSuite *ImageMemory_0x1_JPEG_M;
struct struc_memSuite *ImageMemory_0x1_JPEG_S;
struct struc_memSuite *ImageMemory_0x40000000;
struct struc_memSuite *ImageMemory_0x80000000;
struct struc_memSuite *ImageMemory_0x40;
struct struc_memSuite *ImageMemory_0x20;
struct struc_memSuite *ImageMemory_0x10;
struct struc_memSuite *ImageMemory_0x800;
struct struc_memSuite *ImageMemory_0x200_JPEG_M1;
struct struc_memSuite *ImageMemory_0x400_JPEG_M2;
struct struc_memSuite *ImageMemory_0x100;
struct struc_memSuite *ImageMemory_0x10000;
struct struc_memSuite *ImageMemory_0x8000;
struct struc_memSuite *ImageMemory_0x4000;
struct struc_memSuite *ImageMemory_0x1000;
struct struc_memSuite *ImageMemory_0x2000;
struct struc_memSuite *ImageMemory_0x20000000_RAW;
struct struc_memSuite *ImageMemory_0x10000000;
struct struc_memSuite *ImageMemory_0x1000000;
struct struc_memSuite *ImageMemory_0x80000;
struct struc_memSuite *ImageMemory_0x400000;
struct struc_memSuite *ImageMemory_0x100000;
struct struc_memSuite *ImageMemory_0x200000;
int field_F88;
_BYTE gapF8C[140];
int field_1018;
int field_101C;
struct struc_Container *FileContainer;
void *JobClassContainer;
struct struc_memSuite *Mem1Component_0x4000_MEM1;
int field_102C;
int field_1030;
int DonePictType;
int field_1038;
struct struc_memSuite *ImageBuffer;
int HDRCorrectImageBuffer;
int HDRUnderImageBuffer;
int HDROverImageBuffer;
int field_104C;
int field_1050;
int field_1054;
int field_1058;
struct struc_memSuite *ImageMemory_0x2000000;
int field_1060;
int field_1064;
int field_1068;
_BYTE gap106C[116];
int field_10E0;
void *pLuckyTable;
struct struc_LuckyParm LuckyParam;
_BYTE gap1128[16];
int BackupWbOutList;
int BackupLensOutList;
int BackupFnoOutList;
int BackupLongExpNoiseReductionList;
int BackupMultipleExposureSettingList;
};
#pragma pack(pop)
void __cdecl cmd_FA_CaptureTestImage(struct struc_JobClass **hJob)
{
struct struc_JobClass *job; // r4@1
int fa_flag; // [sp+0h] [bp-10h]@1
job = *hJob;
DryosDebugMsg(0x90, 0x16, "FA_CaptureTestImage(hJob:%#lx)", *hJob);
SCS_FaSetSkeltonJob(job);
faGetProperty(PROP_FA_ADJUST_FLAG, &fa_flag, 4u);
fa_flag |= 4u;
faSetProperty(PROP_FA_ADJUST_FLAG, &fa_flag, 4u);
msleep(20);
sht_FA_ReleaseStart();
exec_command_vararg("sht_FA_ReleaseStart");
msleep(20);
sht_FA_ReleaseData();
exec_command_vararg("sht_FA_ReleaseData");
if ( TakeSemaphoreTimeout(FactRC_Semaphore_2, 20000) & 1 )
{
DryosDebugMsg(0x90, 6, "ERROR TakeSemaphore");
}
fa_flag &= 0xFFFFFFFB;
faSetProperty(PROP_FA_ADJUST_FLAG, &fa_flag, 4u);
DryosDebugMsg(0x90, 0x16, "FA_CaptureTestImage Fin");
}
signed int sht_FA_ReleaseStart()
{
return StageClass_Post(ShootCapture->StageClass, ShootCapture, 1, 0, 0);
}
signed int sht_FA_ReleaseData()
{
return StageClass_Post(ShootCapture->StageClass, ShootCapture, 2, 0, 0);
}
void *__fastcall GetImageBuffer(struct struc_JobClass *job)
{
void *result; // r0@2
if ( job->jobs[0].signature == "JobClass" )
{
result = job->jobs[0].job_ref->ImageBuffer;
}
else
{
DryosDebugMsg(0x8F, 6, "GetImageBuffer failed");
result = &byte_7;
}
return result;
}
Audionut
Gr3g01
MarsBlessed
Marsu42
OtherOnePercent
Pelican
Simon Dibbern
Sticks
[0xAF]
a1ex
a_d_
af
andrewjohncoutts
andyperring
antonynpavlov
arm.indiana
ayshih
bnvm
britom
broscutamaker
cbob5435
chris.nz
cjb
count-magiclantern
david.l.milligan
dhessel
dkelly11
dlrpgmsvc
escho
flameeyes
freemed
g3gg0
gary.mathews.93
go
grumpyriffic
grzesiekpl
hipescho
housebox
houz
hudson
info
jarno.paananen
joao_pedro_lx
jordancolburn
josepvm
kedzierski.m
kichetof
kotyatokino
leigh_tuck
ltuck
mahonrig
mail
marazmarci
marcus
me
meeok
michael.angle
minimimi4649
mk11174
morghus
nanomad
nospam
nsr204
nviennot
pdavis
pel
phil.a.mitchell
piersg
ppluciennik
pravdomil.toman
roald.frederickx
rob
rudison
sc1ence
scrizza
sodapopodalaigh
sven
swinxx
trsaunders
ubbut
up4
viniciusatique
vladimir.vyskocil
w01f
zloe
/* init sample graphic */
graph_t *my_own_graph = graph_alloc(PIX_FMT_PAL8, 1024, 768);
/* set a dot (width 1) */
graph_draw_pixel(my_own_graph, 10, 20, 1, COLOR_WHITE);
/* draw an ellipse, width 2 */
graph_draw_circle(my_own_graph, 90, 90, 40, 80, 2, COLOR_WHITE);
/* save it */
graph_save_bmp(my_own_graph, "ML/DATA/PLOT.BMP");
/* width/height may be zero for auto */
graph_copy(CANON_BMP_FRONT, my_own_graph, 0, 0, 0, 0, COPY_MODE_CROP);
-o output_file set the filename to write into
-v verbose output
-- DNG output --
--dng output frames into separate .dng files. set prefix with -o
--no-cs no chroma smoothing
--cs2x2 2x2 chroma smoothing
--cs3x3 3x3 chroma smoothing
--cs5x5 5x5 chroma smoothing
-- RAW output --
-r output into a legacy raw file for e.g. raw2dng
-- MLV output --
-b bits convert image data to given bit depth per channel (1-16)
-z bits zero the lowest bits, so we have only specified number of bits containing data (1-16) (improves compression rate)
-f frames stop after that number of frames
-x build xref file (indexing)
-m write only metadata, no audio or video frames
-n write no metadata, only audio and video frames
-a average all frames in <inputfile> and output a single-frame MLV from it
-s mlv_file subtract the reference frame in given file from every single frame during processing
-e delta-encode frames to improve compression, but lose random access capabilities
-c (re-)compress video and audio frames using LZMA (set bpp to 16 to improve compression rate)
-d decompress compressed video and audio frames using LZMA
-l level set compression level from 0=fastest to 9=best compression
# show mlv content (verbose)
./mlv_dump -v in.mlv
# will dump frames 0 through 123 into a new file
# note that ./mlv_dump --dng -f 0 in.mlv (or ./mlv_dump --dng -f 0-0 in.mlv) will now extract just frame 0 instead of all of the frames.
./mlv_dump -f 123 -o out.mlv in.mlv
# prepare an .idx (XREF) file
./mlv_dump -x in.mlv
# compress input file
./mlv_dump -c -o out.mlv in.mlv
# compress input file with maximum compression level 9
./mlv_dump -c -l 9 -o out.mlv in.mlv
# compress input file with maximum compression level 9 and improved delta encoding
./mlv_dump -c -e -l 9 -o out.mlv in.mlv
# compress input file with maximum compression level 9, improved delta encoding, 16 bit alignment which improves compression and 12 bpp
./mlv_dump -c -e -l 9 -z12 -b16 -o out.mlv in.mlv
# decompress input file
./mlv_dump -d -o out.mlv in.mlv
# convert to 10 bit per pixel
./mlv_dump -b 10 -o out.mlv in.mlv
# convert to 8 bit per pixel and compress
./mlv_dump -c -b 14 -o out.mlv in.mlv
# create legacy raw, decompress and convert to 14 bits if needed
./mlv_dump -r -o out.raw in.mlv
extern void *ime_base_start (char *caption, char *text, int max_length, int codepage, int charset, t_ime_update_cbr update_cbr, t_ime_done_cbr done_cbr, int x, int y, int w, int h );
static char text_buffer[100];
IME_UPDATE_FUNC(ime_base_test_update)
{
//bmp_printf(FONT_MED, 30, 90, "ime_base: CBR: <%s>, %d, %d", text, caret_pos, selection_length);
return IME_OK;
}
IME_DONE_FUNC(ime_base_test_done)
{
for(int loops = 0; loops < 50; loops++)
{
bmp_printf(FONT_MED, 30, 120, "ime_base: done: <%s>, %d", text, status);
msleep(100);
}
return IME_OK;
}
static MENU_SELECT_FUNC(ime_base_test)
{
strcpy(text_buffer, "test");
ime_base_start("Enter something:", text_buffer, sizeof(text_buffer), IME_UTF8, IME_CHARSET_ANY, &ime_base_test_update, &ime_base_test_done, 0, 0, 0, 0);
}
struct struc_LockEntry
{
char *name;
int status;
int semaphore;
int some_prev;
int some_next;
unsigned int *pResource;
int resourceEntries;
void (*cbr)(struct struc_LockEntry *lockEntry, void *cbr_priv);
void *cbr_priv;
};
struct struc_LockEntry *CreateResLockEntry(uint32_t *resIds, resIdCount);
unsigned int LockEngineResources(struct struc_LockEntry *lockEntry);
unsigned int UnLockEngineResources(struct struc_LockEntry *lockEntry);
unsigned int AsyncLockEngineResources(struct struc_LockEntry *lockEntry, void (*cbr)(struct struc_LockEntry *lockEntry, void *cbr_priv), void *cbr_priv);
/* print ISO range */
{ .string = { { INFO_TYPE_STRING, { ISO_RANGE_POS_X, ISO_RANGE_POS_Y, 2 }}, INFO_STRING_ISO_MINMAX, COLOR_YELLOW, INFO_COL_FIELD, INFO_FONT_MEDIUM } },
/* entry 2 and 3, WB strings */
{ .string = { { INFO_TYPE_STRING, { WBS_POS_X, WBS_POS_Y, 2 }}, INFO_STRING_WBS_BA, COLOR_YELLOW, INFO_COL_FIELD, INFO_FONT_LARGE } },
{ .string = { { INFO_TYPE_STRING, { WBS_POS_X + 40, WBS_POS_Y, 2 }}, INFO_STRING_WBS_GM, COLOR_YELLOW, INFO_COL_FIELD, INFO_FONT_LARGE } },
/* entry 4, battery_icon referenced as anchor */
{ .battery_icon = { { INFO_TYPE_BATTERY_ICON, { DISPLAY_BATTERY_POS_X, DISPLAY_BATTERY_POS_Y, 2 }}, DISPLAY_BATTERY_LEVEL_2, DISPLAY_BATTERY_LEVEL_1 } },
{ .battery_perf = { { INFO_TYPE_BATTERY_PERF, { -14, 0, 3, INFO_ANCHOR_LEFT | INFO_ANCHOR_TOP, 4 }}, /* 0=vert,1=horizontal */ 0, /* x size */ 12, /* y size */ 12 } },
{ .string = { { INFO_TYPE_STRING, { 0, 2, 2, INFO_ANCHOR_HCENTER | INFO_ANCHOR_BOTTOM, 4, INFO_ANCHOR_HCENTER | INFO_ANCHOR_TOP }}, INFO_STRING_BATTERY_PCT, COLOR_YELLOW, INFO_COL_FIELD, INFO_FONT_LARGE } },
{ .string = { { INFO_TYPE_STRING, { 0, 0, 2, INFO_ANCHOR_RIGHT | INFO_ANCHOR_TOP, 4 }}, INFO_STRING_BATTERY_ID, COLOR_YELLOW, INFO_COL_FIELD, INFO_FONT_LARGE } },
/* entry 8, MLU string */
{ .string = { { INFO_TYPE_STRING, { MLU_STATUS_POS_X, MLU_STATUS_POS_Y, 2 }}, INFO_STRING_MLU, COLOR_YELLOW, INFO_COL_FIELD, INFO_FONT_MEDIUM } },
/* entry 9, kelvin */
{ .string = { { INFO_TYPE_STRING, { WB_KELVIN_POS_X, WB_KELVIN_POS_Y, 2 }}, INFO_STRING_KELVIN, COLOR_YELLOW, INFO_COL_FIELD, INFO_FONT_MEDIUM_SHADOW } },
/* entry 10, pictures */
{ .fill = { { INFO_TYPE_FILL, { 540, 390, 1, 0, 0, 0, 150, 60 }}, INFO_COL_FIELD } },
{ .string = { { INFO_TYPE_STRING, { 550, 402, 2 }}, INFO_STRING_PICTURES_4, COLOR_FG_NONLV, INFO_COL_FIELD, INFO_FONT_CANON } },
/* print ISO range */
{
/* we are defining a new string to be printed */
.string =
{
{
/* it must be of the type STRING and match the .string initializer above */
INFO_TYPE_STRING,
/* print it at X, Y and Z. Z is the layer - the higher the number, the later it gets drawn and overwrites other items (like fills or other strings) */
{ ISO_RANGE_POS_X, ISO_RANGE_POS_Y, 2 }
},
/* print the ISO_MINMAX string there. we have dozens of other strings, see the header */
INFO_STRING_ISO_MINMAX,
/* foreground color */
COLOR_YELLOW,
/* background color is "FIELD" or "BG" or any other COLOR_ define */
INFO_COL_FIELD,
/* medium font size */
INFO_FONT_MEDIUM
}
},
while(1)
{
uint32_t line = 0;
uint32_t bp = 0;
bmp_printf(FONT_MED, 0, line++ * 20, "exc %08X, l 0x%08X", gdb_exceptions_handled, loops++);
for(bp = 0; bp < GDB_BKPT_COUNT; bp++)
{
if(gdb_breakpoints[bp].flags & GDB_BKPT_FLAG_ENABLED)
{
uint32_t reg = 0;
bmp_printf(FONT_MED, 0, line++ * 20, "BP#%d 0x%08X flags 0x%1X hits %d", bp, gdb_breakpoints[bp].address, gdb_breakpoints[bp].flags, gdb_breakpoints[bp].hitcount);
for(reg = 0; reg < 15; reg+=2)
{
bmp_printf(FONT_MED, 0, line++ * 20, "R%02d %08X R%02d 0x%08X", reg, gdb_breakpoints[bp].ctx[reg], reg+1, gdb_breakpoints[bp].ctx[reg+1]);
}
bmp_printf(FONT_MED, 0, line++ * 20, "CPSR %08X", gdb_breakpoints[bp].ctx[16]);
}
}
msleep(100);
}
Quote
i added GDB stubs to my emulator.
what this means?
you can use IDA Pro to connect to the emulator and step through code using breakpoints, dumping memory etc etc.
check contents of main routine at line 938 and make fit them to your firmware.
1. start TriX
2. select your firmware image as input file
3. click on "Scripts" tab ("General", "Scripts", "Editor")
4. click the lens at the bottom, right of "Script" and the textbox
5. choose "armulate_shell_eos.trx"
6. click "Add" button at bottom
7. click "Start" in the top toolbar
8. a few register/disassembly windows pop up
9. arrange them that you see every window
10. in the main dialog again where it asks you "Your choice", below is a text box. enter the number "16" and press enter
then in IDA just connect to localhost, port 23946 using gdb as debugger interface.
before connecting: in "Debugger Setup", "Set specific options" you should set "Max packet size" to 512
and in same window under "Memory map" you have to insert (rightclick into the list) a new memory segment which
starts at 0x000000 and ends at 0xFFFFFFFE, base 0, 32 bit, read only. delete the old one, if one is defined.
enjoy
http://upload.g3gg0.de/pub_files/0e7cc977a512c2168003a4ceb0e82932/TriX_EOS.7z
Page created in 0.257 seconds with 13 queries.