[patch] bug fixes and documentation improvements by Greg Alexander
[fw/stlink] / README
diff --git a/README b/README
index 77697c89b50864c19b9a2669f1ef42215c1567d9..c251be1616580d0064391b9d6c3c65df43616b78 100644 (file)
--- a/README
+++ b/README
@@ -1,8 +1,11 @@
 HOWTO
 =====
 
-To run the gdb server, do (you do not need sudo if you have
-set up permissions correctly):
+First, load the sg kernel module.
+# modprobe sg
+
+To run the gdb server, do (you do not need sudo if you have set up
+permissions correctly):
 $ make -C build && sudo ./build/st-util 1234 /dev/sg1
 
 Then, in gdb:
@@ -10,9 +13,76 @@ Then, in gdb:
 
 Have fun!
 
-Caveats
-=======
+Resetting the chip from GDB
+===========================
+
+You may reset the chip using GDB if you want. You'll need to use `target
+extended-remote' command like in this session:
+(gdb) target extended-remote localhost:1111
+Remote debugging using localhost:1111
+0x080007a8 in _startup ()
+(gdb) kill
+Kill the program being debugged? (y or n) y
+(gdb) run
+Starting program: /home/whitequark/ST/apps/bally/firmware.elf 
+
+Remember that you can shorten the commands. `tar ext :1111' is good enough
+for GDB.
+
+Setting up udev rules
+=====================
+
+For convenience, you may install udev rules file, 10-stlink.rules, located
+in the root of repository. You will need to copy it to /etc/udev/rules.d,
+and then either reboot or execute
+$ udevadm control --reload-rules
+
+Udev will now create a /dev/stlink file, which will point at appropriate
+/dev/sgX device. Good to not accidentally start debugging your flash drive.
+
+Setting up modprobe rules
+=========================
+
+You may install a modprobe rules file, stlink.modprobe.conf, located in
+the root of the repository.  You will need to copy it to /etc/modprobe.d
+and then 
+  $ rmmod usb-storage
+If you have usb-storage built as a module, then this will cause it to be
+loaded with a "quirks" parameter that will cause it to ignore the STLink,
+rather than causing repeated errors and resets.
+
+Running programs from SRAM
+==========================
+
+You can run your firmware directly from SRAM if you want to. Just link
+it at 0x20000000 and do
+(gdb) load firmware.elf
+
+It will be loaded, and pc will be adjusted to point to start of the
+code, if it is linked correctly (i.e. ELF has correct entry point).
+
+Writing to flash
+================
+
+The GDB stub ships with a correct memory map, including the flash area.
+If you would link your executable to 0x08000000 and then do
+(gdb) load firmware.elf
+then it would be written to the memory.
+
+FAQ
+===
+
+Q: My breakpoints do not work at all or only work once.
+
+A: Optimizations can cause severe instruction reordering. For example,
+if you are doing something like `REG = 0x100;' in a loop, the code may
+be split into two parts: loading 0x100 into some intermediate register
+and moving that value to REG. When you set up a breakpoint, GDB will
+hook to the first instruction, which may be called only once if there are
+enough unused registers. In my experience, -O3 causes that frequently.
+
+Q: At some point I use GDB command `next', and it hangs.
 
-`continue' GDB command does not work: target does not step at
-all or steps with a turtle speed. Looks like there's something
-wrong with SCSI requests.
+A: Sometimes when you will try to use GDB `next' command to skip a loop,
+it will use a rather inefficient single-stepping way of doing that.
+Set up a breakpoint manually in that case and do `continue'.