4 * main() ripped out of old stlink-hw.c
10 #include "stlink-common.h"
11 #include "uglylogging.h"
13 #define LOG_TAG __FILE__
14 #define DLOG(format, args...) ugly_log(UDEBUG, LOG_TAG, format, ## args)
15 #define ILOG(format, args...) ugly_log(UINFO, LOG_TAG, format, ## args)
16 #define WLOG(format, args...) ugly_log(UWARN, LOG_TAG, format, ## args)
17 #define fatal(format, args...) ugly_log(UFATAL, LOG_TAG, format, ## args)
19 static void __attribute__((unused)) mark_buf(stlink_t *sl) {
20 memset(sl->q_buf, 0, sizeof(sl->q_buf));
30 sl->q_buf[1024 * 6 - 1] = 0x42; //6kB
31 sl->q_buf[1024 * 8 - 1] = 0x42; //8kB
35 int main(int argc, char *argv[]) {
36 /* Avoid unused parameter warning */
38 // set scpi lib debug level: 0 for no debug info, 10 for lots
43 "\nUsage: stlink-access-test [anything at all] ...\n"
44 "\n*** Notice: The stlink firmware violates the USB standard.\n"
45 "*** Because we just use libusb, we can just tell the kernel's\n"
46 "*** driver to simply ignore the device...\n"
47 "*** Unplug the stlink and execute once as root:\n"
48 "modprobe -r usb-storage && modprobe usb-storage quirks=483:3744:i\n\n",
55 stlink_t *sl = stlink_v1_open(99, 1);
59 // we are in mass mode, go to swd
60 stlink_enter_swd_mode(sl);
61 stlink_current_mode(sl);
63 //----------------------------------------------------------------------
66 //stlink_force_debug(sl);
69 // core system control block
70 stlink_read_mem32(sl, 0xe000ed00, 4);
71 DLOG("cpu id base register: SCB_CPUID = got 0x%08x expect 0x411fc231\n", read_uint32(sl->q_buf, 0));
73 stlink_read_mem32(sl, 0xe000ed90, 4);
74 DLOG("mpu type register: MPU_TYPER = got 0x%08x expect 0x0\n", read_uint32(sl->q_buf, 0));
77 stlink_read_mem32(sl, 0xe000edf0, 4);
78 DD(sl, "DHCSR = 0x%08x", read_uint32(sl->q_buf, 0));
80 stlink_read_mem32(sl, 0x4001100c, 4);
81 DD(sl, "GPIOC_ODR = 0x%08x", read_uint32(sl->q_buf, 0));
84 // happy new year 2011: let blink all the leds
85 // see "RM0041 Reference manual - STM32F100xx advanced ARM-based 32-bit MCUs"
87 #define GPIOC 0x40011000 // port C
88 #define GPIOC_CRH (GPIOC + 0x04) // port configuration register high
89 #define GPIOC_ODR (GPIOC + 0x0c) // port output data register
90 #define LED_BLUE (1<<8) // pin 8
91 #define LED_GREEN (1<<9) // pin 9
92 stlink_read_mem32(sl, GPIOC_CRH, 4);
93 uint32_t io_conf = read_uint32(sl->q_buf, 0);
94 DLOG("GPIOC_CRH = 0x%08x\n", io_conf);
96 // set: general purpose output push-pull, output mode, max speed 10 MHz.
97 write_uint32(sl->q_buf, 0x44444411);
98 stlink_write_mem32(sl, GPIOC_CRH, 4);
100 memset(sl->q_buf, 0, sizeof(sl->q_buf));
101 for (int i = 0; i < 100; i++) {
102 write_uint32(sl->q_buf, LED_BLUE | LED_GREEN);
103 stlink_write_mem32(sl, GPIOC_ODR, 4);
104 /* stlink_read_mem32(sl, 0x4001100c, 4); */
105 /* DD(sl, "GPIOC_ODR = 0x%08x", read_uint32(sl->q_buf, 0)); */
108 memset(sl->q_buf, 0, sizeof(sl->q_buf));
109 stlink_write_mem32(sl, GPIOC_ODR, 4); // PC lo
112 write_uint32(sl->q_buf, io_conf); // set old state
116 // TODO rtfm: stlink doesn't have flash write routines
117 // writing to the flash area confuses the fw for the next read access
119 //stlink_read_mem32(sl, 0, 1024*6);
120 // flash 0x08000000 128kB
121 fputs("++++++++++ read a flash at 0x0800 0000\n", stderr);
122 stlink_read_mem32(sl, 0x08000000, 1024 * 6); //max 6kB
124 stlink_read_mem32(sl, 0x08000c00, 5);
125 stlink_read_mem32(sl, 0x08000c00, 4);
127 stlink_write_mem32(sl, 0x08000c00, 4);
128 stlink_read_mem32(sl, 0x08000c00, 256);
129 stlink_read_mem32(sl, 0x08000c00, 256);
132 // sram 0x20000000 8kB
133 fputs("\n++++++++++ read/write 8bit, sram at 0x2000 0000 ++++++++++++++++\n\n", stderr);
134 memset(sl->q_buf, 0, sizeof(sl->q_buf));
136 //stlink_write_mem8(sl, 0x20000000, 16);
138 //stlink_write_mem8(sl, 0x20000000, 1);
139 //stlink_write_mem8(sl, 0x20000001, 1);
140 stlink_write_mem8(sl, 0x2000000b, 3);
141 stlink_read_mem32(sl, 0x20000000, 16);
144 // a not aligned mem32 access doesn't work indeed
145 fputs("\n++++++++++ read/write 32bit, sram at 0x2000 0000 ++++++++++++++++\n\n", stderr);
146 memset(sl->q_buf, 0, sizeof(sl->q_buf));
148 stlink_write_mem32(sl, 0x20000000, 1);
149 stlink_read_mem32(sl, 0x20000000, 16);
151 stlink_write_mem32(sl, 0x20000001, 1);
152 stlink_read_mem32(sl, 0x20000000, 16);
154 stlink_write_mem32(sl, 0x2000000b, 3);
155 stlink_read_mem32(sl, 0x20000000, 16);
158 stlink_write_mem32(sl, 0x20000000, 17);
159 stlink_read_mem32(sl, 0x20000000, 32);
162 // sram 0x20000000 8kB
163 fputs("++++++++++ read/write 32bit, sram at 0x2000 0000 ++++++++++++\n", stderr);
164 memset(sl->q_buf, 0, sizeof(sl->q_buf));
166 stlink_write_mem8(sl, 0x20000000, 64);
167 stlink_read_mem32(sl, 0x20000000, 64);
170 stlink_write_mem32(sl, 0x20000000, 1024 * 8); //8kB
171 stlink_read_mem32(sl, 0x20000000, 1024 * 6);
172 stlink_read_mem32(sl, 0x20000000 + 1024 * 6, 1024 * 2);
176 stlink_read_all_regs(sl, ®s);
178 fputs("++++++++++ write r0 = 0x12345678\n", stderr);
179 stlink_write_reg(sl, 0x12345678, 0);
180 stlink_read_reg(sl, 0, ®s);
181 stlink_read_all_regs(sl, ®s);
187 stlink_force_debug(sl);
190 #if 0 /* read the system bootloader */
191 fputs("\n++++++++++ reading bootloader ++++++++++++++++\n\n", stderr);
192 stlink_fread(sl, "/tmp/barfoo", sl->sys_base, sl->sys_size);
194 #if 0 /* read the flash memory */
195 fputs("\n+++++++ read flash memory\n\n", stderr);
197 stlink_read_mem32(sl, 0x08000000, 4);
199 #if 0 /* flash programming */
200 fputs("\n+++++++ program flash memory\n\n", stderr);
201 stlink_fwrite_flash(sl, "/tmp/foobar", 0x08000000);
203 #if 0 /* check file contents */
204 fputs("\n+++++++ check flash memory\n\n", stderr);
206 const int res = stlink_fcheck_flash(sl, "/tmp/foobar", 0x08000000);
207 printf("_____ stlink_fcheck_flash() == %d\n", res);
211 fputs("\n+++++++ sram write and execute\n\n", stderr);
212 stlink_fwrite_sram(sl, "/tmp/foobar", sl->sram_base);
213 stlink_run_at(sl, sl->sram_base);
219 //----------------------------------------------------------------------
220 // back to mass mode, just in case ...
221 stlink_exit_debug_mode(sl);
222 stlink_current_mode(sl);
226 //fflush(stderr); fflush(stdout);