/* This program requires either a hardware breakpoint at the end of the code, or the code for software breakpoint in BDM/ROM Monitor configurations (e.g. BGND for CPU32). PRECOMPILED VERSIONS: Binary version for some example configurations can be found in the architecture specific examples (flash subdirectory). */ typedef unsigned char uchar8; typedef unsigned short ushort16; typedef unsigned long ulong32; typedef void * pvoid; typedef struct { ulong32 flashaddr; ulong32 flashwidth; ulong32 width; ulong32 offset; ulong32 addr; ulong32 size; ulong32 reserved; ulong32 status; /* in: 5=read, 6=write, out: 0=o.k., 0x100=fail */ uchar8 data[4096]; /* Transfer Buffer, size can be made smaller (DATA.USRACCESS command) */ } UsrAccessParameter; static void UsrAccessRead(UsrAccessParameter * param); static void UsrAccessWrite(UsrAccessParameter * param); asm void dcbf(pvoid value) { % reg value dcbf r0,value } UsrAccessParameter * main(UsrAccessParameter * param) { int size; uchar8 *datab, *addrb; ushort16 *dataw, *addrw; ulong32 *datal, *addrl; if (param->status == 5) { size = param->size; addrb = (uchar8 *) param->addr; while (size > 0) { dcbf((pvoid) addrb); addrb += 16; size -= 16; } size = param->size; switch (param->width) { case 2: dataw = (ushort16 *) param->data; addrw = (ushort16 *) param->addr; while (size > 0) { *dataw++ = *addrw++; size -= 2; } break; case 4: datal = (ulong32 *) param->data; addrl = (ulong32 *) param->addr; while (size > 0) { *datal++ = *addrl++; size -= 4; } break; default: datab = (uchar8 *) param->data; addrb = (uchar8 *) param->addr; while (size > 0) { *datab++ = *addrb++; size -= 1; } break; } param->status = 0; } else if (param->status == 6) { size = param->size; switch (param->width) { case 2: dataw = (ushort16 *) param->data; addrw = (ushort16 *) param->addr; while (size > 0) { *addrw++ = *dataw++; size -= 2; } break; case 4: datal = (ulong32 *) param->data; addrl = (ulong32 *) param->addr; while (size > 0) { *addrl++ = *datal++; size -= 4; } break; default: datab = (uchar8 *) param->data; addrb = (uchar8 *) param->addr; while (size > 0) { *addrb++ = *datab++; size -= 1; } break; } size = param->size; addrb = (uchar8 *) param->addr; while (size > 0) { dcbf((pvoid) addrb); addrb += 16; size -= 16; } param->status = 0; } return param; }