.motor.config.calibration_current`.
diff --git a/getting-started.md b/getting-started.md
new file mode 100644
index 00000000..bb720280
--- /dev/null
+++ b/getting-started.md
@@ -0,0 +1,191 @@
+---
+redirect_from:
+ - /getting-started
+permalink: /
+---
+
+# Getting Started
+
+### Table of contents
+
+
+
+- [Hardware Requirements](#hardware-requirements)
+- [Wiring up the ODrive](#wiring-up-the-odrive)
+- [Downloading and Installing Tools](#downloading-and-installing-tools)
+- [Start `odrivetool`](#start-odrivetool)
+- [Configure M0](#configure-m0)
+- [Position control of M0](#position-control-of-m0)
+- [What's next?](#whats-next)
+
+
+
+## Hardware Requirements
+
+You will need:
+
+* One or two [brushless motors](https://docs.google.com/spreadsheets/d/12vzz7XVEK6YNIOqH0jAz51F5VUpc-lJEs3mmkWP1H4Y). It is fine, even recommended, to start testing with just a single motor and encoder.
+* One or two [quadrature incremental encoder(s)](encoders)
+* A power resistor. A good starting point would be the 50W resistor included with your ODrive.
+ Do I really need a power resistor? What values to choose?
+
+ If you don't have a brake resistor, the ODrive will pump excess power back into the power supply during deceleration to achieve the desired deceleration torque. If your power supply doesn't eat that power (which it won't if it's not a battery), the bus voltage will inevitebly rise. If you're unlucky this will break the power supply.
+ At some point, the ODrive's overvoltage protection will trip, after which both motors will be allowed to spin freely. Depending on your machine, this may or may not be a problem.
+
+ The power resistor values you need depends on your motor setup, and peak/average deceleration power.
+
+ To be on the safe side, think about what speed and current limits you want to set for the motor.
+
+ When braking at max speed and with maximum motor current, the power that is dissipated in the power resistor can be calulated as: `P_brake = V_emf * I_motor` where `V_emf = motor_rpm / motor_kv`.
+
+
+
+* A power supply (12V-24V for the 24V board variant, 12V-48V for the 48V board variant). A battery is also fine.
+
+## Wiring up the ODrive
+
+
+Make sure you have a good mechanical connection between the encoder and the motor, slip can cause disasterous oscillations or runaway.
+
+
+All non-power I/O is 3.3V output and 5V tolerant on input, on ODrive v3.3 and newer.
+
+1. Wire up the motor phases into the 3-phase screw terminals, and the power resistor to the AUX terminal. Wire up the power source to the DC terminal, make sure to pay attention to the polarity. Do not apply power just yet.
+
+2. Wire up the encoder(s) to J4. The A,B phases are required, and the Z (index pulse) is optional. The A,B and Z lines have 3.3k pull up resistors, for use with open-drain encoder outputs. For single ended push-pull signals with weak drive current (\<4mA), you may want to desolder the pull-ups.
+
+
+
+## Downloading and Installing Tools
+
+Most instructions in this guide refer to a utility called `odrivetool`, so you should install that first.
+
+### Windows
+
+1. Install Python 3. We recommend the Anaconda distribution because it packs a lot of useful scientific tools, however you can also install the standalone python.
+ * __Anaconda__: Download the installer from [here](https://www.anaconda.com/download/#windows). Execute the downloaded file and follow the instructions.
+ * __Standalone Python__: Download the installer from [here](https://www.python.org/downloads/). Execute the downloaded file and follow the instructions.
+ * If you have Python 2 installed alongside Python 3, replace `pip` by `C:\Users\YOUR_USERNAME\AppData\Local\Programs\Python\Python36-32\Scripts\pip`. If you have trouble with this step then refer to [this walkthrough](https://www.youtube.com/watch?v=jnpC_Ib_lbc).
+2. Launch the command prompt.
+ * __Anaconda__: In the start menu, type `Anaconda Prompt` Enter
+ * __Standalone Python__: In the start menu, type `cmd` Enter
+3. Install dependencies by typing `pip install pywin32==222` Enter
+3. Install the ODrive tools by typing `pip install odrive` Enter
+4. Plug in a USB cable into the microUSB connector on ODrive, and connect it to your PC.
+5. Use the [Zadig](http://zadig.akeo.ie/) utility to set ODrive driver to libusb-win32.
+ * Check 'List All Devices' from the options menu, and select 'ODrive 3.x Native Interface (Interface 2)'. With that selected in the device list choose 'libusb-win32' from the target driver list and then press the large 'install driver' button.
+
+
+### Linux/macOS
+
+1. [Install Python 3](https://www.python.org/downloads/).
+2. Install the ODrive tools by opening a terminal and typing `pip install odrive` Enter
+3. __Linux__: set up USB permissions
+```bash
+ echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="1209", ATTR{idProduct}=="0d[0-9][0-9]", MODE="0666"' | sudo tee /etc/udev/rules.d/50-odrive.rules
+ sudo udevadm control --reload-rules
+ sudo udevadm trigger # until you reboot you may need to do this everytime you reset the ODrive
+```
+
+## Start `odrivetool`
+
+__ODrive v3.4 and earlier:__ Your board does not come preflashed with any firmware. Follow the instructions [here](odrivetool#device-firmware-update) before you continue.
+
+To launch the main interactive ODrive tool, type `odrivetool` Enter. Connect your ODrive and wait for the tool to find it. Now you can for instance type `odrv0.vbus_voltage` Enter to inpect the boards main supply voltage.
+It should look something like this:
+
+```text
+ODrive control utility v0.4.0
+Please connect your ODrive.
+Type help() for help.
+
+Connected to ODrive 306A396A3235 as odrv0
+In [1]: odrv0.vbus_voltage
+Out[1]: 11.97055721282959
+```
+
+The tool you're looking at is a fully capable Python command prompt, so you can type any valid python code.
+
+You can read more about the odrivetool [here](odrivetool.md).
+
+## Configure M0
+
+Read this section carefully, else you risk breaking something.
+
+1. Set the limits:
+
+ Wait, how do I set these?
+
+ In the previous step we started `odrivetool`. In there, you can assign variables directly by name.
+
+ For instance, to set the current limit of M0 to 10A you would type: `odrv0.axis0.motor.config.current_lim = 10` Enter
+
+
+
+ * The current limit: `odrv0.axis0.motor.config.current_lim` [A]. The default current limit, for safety reasons, is set to 10A. This is quite weak, and good for making sure the drive is stable. Once you have tuned the drive, you can increase this to 75A to get some performance. Note that above 75A, you must change the current amplifier gains.
+ * Note: The motor current and the current drawn from the power supply is not the same in general. You should not look at the power supply current to see what is going on with the motor current.
+ Ok so tell me how it actually works then...
+ The current in the motor is only connected to the current in the power supply _sometimes_ and other times it just cycles out of one phase and back in the other. This is what the modulation magnitude is (sometimes people call this duty cycle, but that's a bit confusing because we use SVM not straight PWM). When the modulation magnitude is 0, the average voltage seen across the motor phases is 0, and the motor current is never connected to the power supply. When the magnitude is 100%, it is always connected, and at 50% it's connected half the time, and cycled in just the motor half the time.
+
+ The largest effect on modulation magnitude is speed. There are other smaller factors, but in general: if the motor is still it's not unreasonable to have 50A in the motor from 5A on the power supply. When the motor is spinning close to top speed, the power supply current and the motor current will be somewhat close to each other.
+
+ * The velocity limit: `odrv0.axis0.motor.config.vel_limit` [counts/s]. The motor will be limited to this speed; again the default value is quite slow.
+ * You can change `odrv0.axis0.motor.config.calibration_current` [A] to the largest value you feel comfortable leaving running through the motor continously when the motor is stationary.
+
+2. Set other hardware parameters:
+
+ * `odrv0.config.brake_resistance` [Ohm]: This is the resistance of the brake resistor. If you are not using it, you may set it to `0`.
+ * `odrv0.axis0.motor.config.pole_pairs`: This is the number of **magnet poles** in the rotor, **divided by two**. You can simply count the number of permanent magnets in the rotor, if you can see them. _Note: this is not the same as the number of coils in the stator._
+ * `odrv0.axis0.motor.config.motor_type`: This is the type of motor being used. Currently two types of motors are supported: High-current motors (`MOTOR_TYPE_HIGH_CURRENT`) and Gimbal motors (`MOTOR_TYPE_GIMBAL`).
+
+ Which `motor_type` to choose?
+
+ If you're using a regular hobby brushless motor like [this](https://hobbyking.com/en_us/turnigy-aerodrive-sk3-5065-236kv-brushless-outrunner-motor.html) one, you should set `motor_mode` to `MOTOR_TYPE_HIGH_CURRENT`. For low-current gimbal motors like [this](https://hobbyking.com/en_us/turnigy-hd-5208-brushless-gimbal-motor-bldc.html) one, you should choose `MOTOR_TYPE_GIMBAL`. Do not use `MOTOR_TYPE_GIMBAL` on a motor that is not a gimbal motor, as it may overheat the motor or the ODrive.
+
+ **Further detail:**
+ If 100's of mA of current noise is "small" for you, you can choose `MOTOR_TYPE_HIGH_CURRENT`.
+ If 100's of mA of current noise is "large" for you, and you do not intend to spin the motor very fast (omega * L << R), and the motor is fairly large resistance (1 ohm or larger), you can chose `MOTOR_TYPE_GIMBAL`.
+ If 100's of mA current noise is "large" for you, _and_ you intend to spin the motor fast, then you need to replace the shunt resistors on the ODrive.
+
+
+
+ * `odrv0.axis0.encoder.config.cpr`: Encoder Count Per Revolution (CPR). This is 4x the Pulse Per Revolution (PPR) value. Usually this is indicated in the datasheet of your encoder.
+
+3. Save configuration. You can save all `.config` parameters to persistent memory such that the ODrive remembers them between power cycles.
+* `odrv0.save_configuration()` Enter
+
+## Position control of M0
+
+Let's get motor 0 up and running. The procedure for motor 1 is exactly the same, so feel free to replace read "axis1" wherever it says "axis0".
+
+1. Type `odrv0.axis0.requested_state = AXIS_STATE_FULL_CALIBRATION_SEQUENCE` Enter. After about 2 seconds should hear a beep. Then the motor will turn slowly in one direction for a few seconds, then back in the other direction.
+
+ What's the point of this?
+ This procedure first measures your motor's electrical properties (namely phase resistance and phase inductance) and then the offset between the motor's electrical phase and the encoder position.
+
+
+
+ The startup procedure is demonstrated [here](https://www.youtube.com/watch?v=VCX1bA2xnuY).
+
+ **Note**: the rotor must be allowed to rotate without any biased load during startup. That means mass and weak friction loads are fine, but gravity or spring loads are not okay. Also note that in the video, the motors spin after initalisation, but in the current software the default behaviour is not like that.
+
+ My motor doesn't beep or doesn't turn
+
+ Make sure the motor wires are connected firmly. Check the value of `odrv0.axis0.error` and then refer to the [error code documentation](troubleshooting.md#error-codes) for details.
+
+ Once you have understood the error and fixed its cause, you may clear the error state (`odrv0.axis0.error = 0` Enter) and retry. You may also need to clear the error state of other subcomponents (e.g. `odrv0.axis0.motor.error`).
+
+
+
+
+2. Type `odrv0.axis0.requested_state = AXIS_STATE_CLOSED_CONTROL_LOOP` Enter. From now on the ODrive will try to hold the motor's position. If you try to turn it by hand, it will fight you gently. That is unless you bump up `odrv0.axis0.motor.config.current_lim`, in which case it will fight you more fiercely.
+
+## What's next?
+
+You can now:
+
+ * See what other [commands and parameters](commands.md) are available, including setting tuning parameters for better performance.
+ * Control the ODrive from your own program or hook it up to an existing system through one of it's [interfaces](interfaces).
+ * See how you can improve the behavior during the startup procedure, like [bypassing encoder calibration](encoders.md#encoder-with-index-signal).
+
+If you have any issues or any questions please get in touch. The [ODrive Community](https://discourse.odriverobotics.com/) warmly welcomes you.
diff --git a/interfaces.md b/interfaces.md
new file mode 100644
index 00000000..90198145
--- /dev/null
+++ b/interfaces.md
@@ -0,0 +1,154 @@
+# Interfaces
+
+ While developing custom ODrive control code it is recommend that your motors are free to spin continuously and are not connected to a drivetrain with limited travel.
+
+The ODrive can be controlled over various ports and protocols. If you're comfortable with embedded systems development, you can also run custom code directly on the ODrive. For that refer to the [developer documentation](developer-guide.md).
+
+### Table of contents
+
+
+
+- [Pinout](#pinout)
+- [Native Protocol](#native-protocol)
+- [ASCII Protocol](#ascii-protocol) (and Arduino)
+- [Step/direction](#stepdirection)
+- [RC PWM input](#rc-pwm-input) (coming soon)
+- [Ports](#ports)
+ - [USB](#usb)
+ - [UART](#uart)
+
+
+
+## Pinout
+
+| GPIO | primary | step/dir | other |
+|-----------|-----------|---------------|-------------------------|
+| GPIO1 | UART TX | Axis0 Step | Analog input, PWM input |
+| GPIO2 | UART RX | Axis0 Dir | Analog input, PWM input |
+| GPIO3 | | Axis1 Step (+)| Analog input, PWM input |
+| GPIO4 | | Axis1 Dir (+) | Analog input, PWM input |
+| GPIO5 | | | Analog input (*) |
+| GPIO6 (*) | | | |
+| GPIO7 (*) | | Axis1 Step (*)| |
+| GPIO8 (*) | | Axis1 Dir (*) | |
+
+(+) on ODrive v3.4 and earlier
+(*) ODrive v3.5 and later
+
+ODrive v3.3 and onward have 5V tolerant GPIO pins.
+
+## Native Protocol
+
+This protocol is what the ODrive Tool uses to talk to the ODrive. If you have a choice, this is the recommended protocol for all applications. The native protocol runs on USB and can also be configured to run on UART.
+
+#### Python
+
+The ODrive Tool you installed as part of the [Getting Started guide](getting-started#downloading-and-installing-tools) comes with a library that you can use to easily control the ODrive from Python.
+
+Assuming you already installed the odrive library (`pip install odrive`), the simplest program to control the ODrive is this:
+
+```python
+import odrive
+odrv0 = odrive.find_any()
+print(str(odrv0.vbus_voltage))
+```
+
+For a more comprehensive example, see [tools/demo.py](../tools/demo.py).
+
+#### Other languages
+
+We don't have an official library for you just yet. Check the community, there might be someone working on it. If you want to write a library yourself, refer to the [native protocol specification](protocol). You are of course welcome to contribute it back.
+
+## ASCII protocol
+
+This is a simpler alternative to the native protocol if you don't need all its bells and whistles. Before you use this, be sure that you're ok with its limitations. The ASCII protocol is enabled by default on UART and can also be enabled on USB alongside with the native protocol.
+
+For more details, see the [ASCII protocol specification](ascii-protocol.md).
+
+### Arduino
+There is an Arduino library that gives some expamples on how to use the ASCII protocol to communicate with the ODrive. TODO LINK HERE.
+
+## Step/direction
+This is the simplest possible way of controlling the ODrive. It is also the most primitive and fragile one. So don't use it unless you must interoperate with other hardware that you don't control.
+
+Pinout:
+* Step/dir signals: see [Pinout](#pinout) above.
+* GND: you must connect the grounds of the devices together. Use any GND pin on J3 of the ODrive.
+
+To enable step/dir mode for the GPIO, set `.config.enable_step_dir` to true for each axis that you wish to use this on.
+Axis 0 step/dir pins conflicts with UART, and the UART takes priority. So to be able to use step/dir on Axis 0, you must also set `odrv0.config.enable_uart = False`.
+To apply these settings you must reboot, and to keep them on reboot you must save configuration:
+* `odrv0.save_configuration()`
+* `odrv0.reboot()`
+
+There is also a config variable called `.config.counts_per_step`, which specifies how many encoder counts a "step" corresponds to. It can be any floating point value.
+The maximum step rate is pending tests, but it should handle at least 50kHz. If you want to test it, please be aware that the failure mode on too high step rates is expected to be that the motors shuts down and coasts.
+
+Please be aware that there is no enable line right now, and the step/direction interface is enabled by default, and remains active as long as the ODrive is in position control mode. To get the ODrive to go into position control mode at bootup, see how to configure the [startup procedure](commands.md#startup-procedure).
+
+
+
+## Ports
+Note: when you use an existing library you don't have to deal with the specifics described in this section.
+
+### USB
+
+This section assumes that you are familiar with the general USB architecture, in particular with terms like "configuration", "interface" and "endpoint".
+
+On USB the ODrive provides a single configuration which is a composite device consisting of a CDC device (virtual COM port) and a vendor specific device.
+
+What is a composite device?
+A composite device is a device where interfaces are grouped by interface association descriptors. For such devices, the host OS loads an intermediate driver, so that each of the interface groups can be treated like a separate device and have its own host-side driver attached.
+
+
+On the ODrive, the following interface groups are present:
+
+ * Interface Association: Communication Device Class (CDC)
+ * Interface 0:
+ * Endpoint `0x82`: CDC commands
+ * Interface 1:
+ * Endpoint `0x01`: CDC data OUT
+ * Endpoint `0x81`: CDC data IN
+ * Interface Association: Vendor Specific Device Class
+ * Interface 2:
+ * Endpoint `0x03`: data OUT
+ * Endpoint `0x83`: data IN
+
+The endpoint pairs `0x01, 0x81` and `0x03, 0x83` behave exactly identical, only their descriptors (interface class, ...) are different.
+
+If you plan to access the USB endpoints directly it is recommended that you use interface 2. The other interfaces (the ones associated with the CDC device) are usually claimed by the CDC driver of the host OS, so their endpoints cannot be used without first detaching the CDC driver.
+
+### UART
+Baud rate: 115200
+Pinout:
+* GPIO 1: Tx (connect to Rx of other device)
+* GPIO 2: Rx (connect to Tx of other device)
+* GND: you must connect the grounds of the devices together. Use any GND pin on J3 of the ODrive.
diff --git a/odrivetool.md b/odrivetool.md
new file mode 100644
index 00000000..efa1f14b
--- /dev/null
+++ b/odrivetool.md
@@ -0,0 +1,133 @@
+# ODrive Tool
+
+The ODrive Tool is the accompanying PC program for the ODrive. It's main purpose is to provide an interactive shell to control the device manually, as well as some supporting functions like firmware update.
+
+## Installation
+
+Refer to the [Getting Started guide](getting-started#downloading-and-installing-tools).
+
+Type `odrivetool --help` to see what features are available.
+
+## Multiple ODrives
+
+By default, `odrivetool` will connect to any ODrive it finds. If this is not what you want, you can select a specific ODrive.
+
+To find the serial number of your ODrive, run `odrivetool`, connect exactly one ODrive and power it up. You should see this:
+```
+Connected to ODrive 306A396A3235 as odrv0
+In [1]:
+```
+`306A396A3235` is the serial number of this particular ODrive. If you want ODrive Tool to ignore all other devices you would close it and then run `odrivetool --serial-number 306A396A3235`.
+
+My ODrive is stuck in DFU mode, can I still find the serial number?
+Yes, the serial number is part of the USB descriptors.
+
+In Linux you can find it by running:
+```
+$ (sudo lsusb -d 1209:0d32 -v; sudo lsusb -d 0483:df11 -v) 2>/dev/null | grep iSerial
+ iSerial 3 385F324D3037
+ iSerial 3 306A396A3235
+```
+Here, two ODrives are connected.
+
+
+## Configuration Backup
+
+You can use ODrive Tool to back up and restore device configurations or transfer the configuration of one ODrive to another one.
+
+ * To save the configuration to a file on the PC, run `odrivetool backup-config my_config.json`.
+ * To restore the configuration form such a file, run `odrivetool restore-config my_config.json`.
+
+## Device Firmware Update
+
+__ODrive v3.4 or earlier__: DFU is not supported on these devices. You need to [flash with the external programmer](#flashing-with-an-stlink) instead.
+
+To update the ODrive to the newest firmware release, simply open up a terminal and run the following command:
+
+```
+~ $ odrivetool dfu
+ODrive control utility v0.3.7.dev
+Waiting for ODrive...
+Found ODrive 308039673235 (v3.5-24V) with firmware v0.3.7-dev
+Checking online for newest firmware... found v0.3.7
+Downloading firmware...
+Putting device 308039673235 into DFU mode...
+Erasing... done
+Flashing... done
+Verifying... done
+```
+
+Note that this command will connect to GitHub servers to retrieve the latest firmware.
+
+If you have a non-default configuration saved on the device, ODrive Tool will try to carry over the configuration across the firmware update. If any of the settings are removed or renamed, you will get warning messages.
+
+How to flash a custom firmware
+If you want to flash a specific firmware file instead of automatically downloading one, you can run `odrivetool dfu [path/to/firmware/file.hex]`.
+
+You can download one of the officially released firmware files from [here](https://github.com/madcowswe/ODrive/releases). You will need one of the __.hex__ files (not the __.elf__ file). Make sure you select the file that matches your board version.
+
+To compile firmware from source, refer to the [developer guide](developer-guide).
+
+
+
+### Troubleshooting
+
+* __Windows__: During the update, a new device called "STM32 BOOTLOADER" will appear. Open the [Zadig utility](http://zadig.akeo.ie/) and set the driver for "STM32 BOOTLOADER" to libusb-win32. After that the firmware update will continue.
+* On some machines you will need to unplug and plug back in the USB cable to make the PC understand that we switched from regular mode to bootloader mode.
+* If the DFU script can't find the device, try forcing it into DFU mode.
+
+ How to force DFU mode (ODrive v3.5)
+ Flick the DIP switch that "DFU, RUN" to "DFU" and power cycle the board. If that alone doesn't work, also connect the After you're done, put the switch back into the "RUN" position and power cycle the board again.
+
+
+ How to force DFU mode (ODrive v3.1, v3.2)
+ Connect the pin "BOOT0" to "3.3V" and power cycle the board. If that alone doesn't work, also connect the pin "GPIO1" to "GND". After you're done, remove the wires and power cycle the board again.
+
+
+
+## Flashing with an STLink
+
+This procedure is only necessary for ODrive v3.4 or earlier. You will need an STLink/v2 or compatible programmer. You should have received one with your ODrive.
+
+1. Install OpenOCD
+ * **Windows:** [instructions](http://gnuarmeclipse.github.io/openocd/install/) (also follow the instructions on the ST-LINK/V2 drivers)
+ * **Linux:** `sudo apt-get install openocd`
+ * **macOS:** `brew install openocd`
+2. Download the latest firmware release form [here](https://github.com/madcowswe/ODrive/releases). You will need the __.elf__ file. Make sure you select the file that matches your board version.
+3. Wire up the ODrive and STLink/v2 programmer as shown in this picture:
+ 
+ Power up the ODrive.
+4. Open up a terminal and navigate to the directory where the firmware is.
+5. Run the following command (replace `ODriveFirmware_v3.4-24V.elf` with the name of your firmware file):
+ ```
+~/Downloads $ openocd -f interface/stlink-v2.cfg -f target/stm32f4x.cfg -c init -c reset\ halt -c flash\ write_image\ erase\ ODriveFirmware_v3.4-24V.elf -c reset\ run -c exit
+Open On-Chip Debugger 0.10.0
+Licensed under GNU GPL v2
+For bug reports, read
+ http://openocd.org/doc/doxygen/bugs.html
+Info : auto-selecting first available session transport "hla_swd". To override use 'transport select '.
+Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
+adapter speed: 2000 kHz
+adapter_nsrst_delay: 100
+none separate
+Info : Unable to match requested speed 2000 kHz, using 1800 kHz
+Info : Unable to match requested speed 2000 kHz, using 1800 kHz
+Info : clock speed 1800 kHz
+Info : STLINK v2 JTAG v17 API v2 SWIM v4 VID 0x0483 PID 0x3748
+Info : using stlink api v2
+Info : Target voltage: 3.236027
+Info : stm32f4x.cpu: hardware has 6 breakpoints, 4 watchpoints
+adapter speed: 2000 kHz
+target halted due to debug-request, current mode: Thread
+xPSR: 0x01000000 pc: 0x08009224 msp: 0x20020000
+auto erase enabled
+Info : device id = 0x10076413
+Info : flash size = 1024kbytes
+target halted due to breakpoint, current mode: Thread
+xPSR: 0x61000000 pc: 0x20000046 msp: 0x20020000
+Warn : no flash bank found for address 10000000
+wrote 262144 bytes from file ODriveFirmware_v3.4-24V.elf in 10.194110s (25.113 KiB/s)
+adapter speed: 2000 kHz
+ ```
+
+If something doesn't work, make sure `openocd` is in your `PATH` variable, check that the wires are connected properly and try with elevated privileges.
diff --git a/Firmware/protocol.md b/protocol.md
similarity index 100%
rename from Firmware/protocol.md
rename to protocol.md
diff --git a/Firmware/screenshots/CodeAsMakefile.png b/screenshots/CodeAsMakefile.png
similarity index 100%
rename from Firmware/screenshots/CodeAsMakefile.png
rename to screenshots/CodeAsMakefile.png
diff --git a/Firmware/screenshots/ImportLaunch.png b/screenshots/ImportLaunch.png
similarity index 100%
rename from Firmware/screenshots/ImportLaunch.png
rename to screenshots/ImportLaunch.png
diff --git a/Firmware/screenshots/LaunchConfigFilter.png b/screenshots/LaunchConfigFilter.png
similarity index 100%
rename from Firmware/screenshots/LaunchConfigFilter.png
rename to screenshots/LaunchConfigFilter.png
diff --git a/stlink-wiring-cropped.jpg b/stlink-wiring-cropped.jpg
new file mode 100644
index 00000000..368524e9
Binary files /dev/null and b/stlink-wiring-cropped.jpg differ
diff --git a/test.md b/test.md
new file mode 100644
index 00000000..9daeafb9
--- /dev/null
+++ b/test.md
@@ -0,0 +1 @@
+test
diff --git a/troubleshooting.md b/troubleshooting.md
new file mode 100644
index 00000000..b6e8b66c
--- /dev/null
+++ b/troubleshooting.md
@@ -0,0 +1,91 @@
+# Troubleshooting
+
+## Error codes
+If your ODrive is not working as expected, run `odrivetool` and type `hex(.error)` Enter where `` is the axis that isn't working. This will display a [hexadecimal](https://en.wikipedia.org/wiki/Hexadecimal) representation of the error code. Each bit represents one error flag.
+
+Example
+
+Say you got this error output:
+```python
+In [1]: hex(odrv0.axis0.error)
+Out[1]: '0x6'
+```
+
+Written in binary, the number `0x6` corresponds to `110`, that means bits 1 and 2 are set (counting starts at 0).
+
+Looking at the reference below, this means that both `ERROR_DC_BUS_UNDER_VOLTAGE` and `ERROR_DC_BUS_OVER_VOLTAGE` occurred.
+
+
+
+There is a slight chance that the values here are out of sync with the actual firmware. To be completely sure, check the linked definition in the source code.
+
+### Axis error flags
+
+Defined [here](../Firmware/MotorControl/axis.hpp)
+
+0. `ERROR_INVALID_STATE`
+1. `ERROR_DC_BUS_UNDER_VOLTAGE`
+2. `ERROR_DC_BUS_OVER_VOLTAGE`
+3. `ERROR_CURRENT_MEASUREMENT_TIMEOUT`
+4. `ERROR_BRAKE_RESISTOR_DISARMED`
+5. `ERROR_MOTOR_DISARMED`
+6. `ERROR_MOTOR_FAILED` (check `.motor.error` for more details)
+7. `ERROR_SENSORLESS_ESTIMATOR_FAILED` (check `.sensorless_estimator.error` for more details)
+8. `ERROR_ENCODER_FAILED` (check `.encoder.error` for more details)
+9. `ERROR_CONTROLLER_FAILED`
+10. `ERROR_POS_CTRL_DURING_SENSORLESS`
+
+### Motor error flags
+
+Defined [here](../Firmware/MotorControl/motor.hpp)
+
+0. `ERROR_PHASE_RESISTANCE_OUT_OF_RANGE`
+1. `ERROR_PHASE_INDUCTANCE_OUT_OF_RANGE`
+2. `ERROR_ADC_FAILED`
+3. [`ERROR_DRV_FAULT`](#drv-fault)
+4. `ERROR_CONTROL_DEADLINE_MISSED`
+5. `ERROR_NOT_IMPLEMENTED_MOTOR_TYPE`
+6. `ERROR_BRAKE_CURRENT_OUT_OF_RANGE`
+7. `ERROR_NUMERICAL`
+
+### Encoder error flags
+
+Defined [here](../Firmware/MotorControl/encoder.hpp)
+
+0. `ERROR_NUMERICAL`
+1. `ERROR_CPR_OUT_OF_RANGE`
+2. `ERROR_RESPONSE`
+
+### Sensorless estimator error flags
+
+Defined [here](../Firmware/MotorControl/sensorless_estimator.hpp)
+
+0. `ERROR_NUMERICAL`
+
+
+## DRV fault
+
+The ODrive v3.4 is known to have a hardware issue whereby the motors would stop operating
+when applying high currents to M0. The reported error of both motors in this case
+is `ERROR_DRV_FAULT`.
+
+The conjecture is that the high switching current creates large ripples in the
+power supply of the DRV8301 gate driver chips, thus tripping its undervoltage
+fault detection.
+
+* Limit the M0 current to 40A. The lowest current at which the DRV fault was observed is 45A on one test motor and 50A on another test motor.
+* Refer to [this post](https://discourse.odriverobotics.com/t/drv-fault-on-odrive-v3-4/558) for instructions for a hardware fix
+
+
+## USB Connectivity Issues
+
+ * Try turning it off and on again (the ODrive, the script, the PC)
+ * Make sure you're using the latest firmware and python tools release
+ * **Linux**: Type `lsusb` to list all USB devices. Verify that your ODrive is listed.
+ * **Linux**: Make sure you [set up your udev rules](getting-started#downloading-and-installing-tools) correctly.
+ * **Windows**: Right-click on the start menu and open "Device Manager". Verify that your ODrive is listed.
+ * **Windows**: Use the [Zadig utility](http://zadig.akeo.ie/) to verify the driver is set to `libusb-win32`.
+ * Ensure that no other ODrive program is running
+ * Run `odrivetools` with the `--verbose` option.
+ * Run `PYUSB_DEBUG=debug odrivetools` to get even more log output.
+ * If you're a developer you can use Wireshark to capture USB traffic.