Semi-decennial update. 50% code inflation.
[cbaos.git] / applications / dump_secret_flash / main.c
blob47fd1b3d2667545246aa68354e45fc2ea7b11987
1 /* Author: Domen Puncer Kugler <domen@cba.si>. License: WTFPL, see file LICENSE */
2 #include <stdio.h>
3 #include <string.h>
4 #include <stdlib.h>
5 #include <errno.h>
7 #include <sched.h>
8 #include <lock.h>
9 #include <compiler.h>
10 #include <endianess.h>
12 #include <interrupt.h>
13 #include <mach/lpc13xx_interrupt.h>
14 #include <mach/lpc13xx_regs.h>
15 #include <mach/LPC13xx.h>
18 #define DEVICE_ID ((u32*)0x400483f4)
20 void print_hex(unsigned base, const u8 *buf, unsigned len)
22 int p = 0;
23 while (len--) {
24 if (p%16 == 0) {
25 if (p)
26 printf("\n");
27 printf("%08x: ", base);
28 base += 16;
30 printf("%02x ", buf[p++]);
32 printf("\n");
36 static u32 buf[1024];
38 __attribute__ ((section(".data"))) void copy_secret_flash(int addr)
40 u32 *reg = (u32*)0x4003c000;
42 int i;
43 u32 *src = (u32*)addr;
44 asm volatile ("":::"memory");
45 *reg |= 0x40;
46 for (i=0; i<sizeof(buf)/sizeof(buf[0]); i++)
47 buf[i] = src[i];
49 *reg &= ~0x40;
52 __attribute__ ((section(".data"))) u32 copy_one_secret_flash(int addr)
54 u32 *reg = (u32*)0x4003c000;
55 u32 val;
57 u32 *src = (u32*)addr;
58 asm volatile ("":::"memory");
59 *reg |= 0x40;
60 asm volatile ("":::"memory");
61 val = *src;
62 asm volatile ("":::"memory");
63 *reg &= ~0x40;
64 asm volatile ("":::"memory");
66 return val;
69 int main()
71 int i;
73 printf("%s: enter\n", __func__);
74 print_hex(0x10000000, (u8*)0x10000000, 0x200);
76 printf("%s: dumping bootloader for device %08x\n", __func__, *DEVICE_ID);
77 print_hex(0x1fff0000, (u8*)0x1fff0000, 0x4000);
79 for (i=0; i<sizeof(buf)/sizeof(buf[0]); i++)
80 buf[0] = 0;
81 printf("%s: copy_secret_flash\n", __func__);
82 copy_secret_flash(0);
83 print_hex(0x0, (u8*)buf, sizeof(buf));
85 for (i=0; i<sizeof(buf)/sizeof(buf[0]); i++)
86 buf[0] = 0;
87 printf("%s: copy_ one by one\n", __func__);
88 for (i=0; i<sizeof(buf)/sizeof(buf[0]); i++)
89 buf[i] = copy_one_secret_flash(i*4);
90 print_hex(0x0, (u8*)buf, sizeof(buf));
92 while (1)
95 return 0;