aboutsummaryrefslogtreecommitdiffstats
path: root/docs/source/bootloader.rst
diff options
context:
space:
mode:
Diffstat (limited to 'docs/source/bootloader.rst')
-rw-r--r--docs/source/bootloader.rst710
1 files changed, 355 insertions, 355 deletions
diff --git a/docs/source/bootloader.rst b/docs/source/bootloader.rst
index d42c050..57833ed 100644
--- a/docs/source/bootloader.rst
+++ b/docs/source/bootloader.rst
@@ -138,447 +138,447 @@ This time, however, no DFU transaction is initiated, and the
bootloader gives way to user code, closing down the DFU pipe and
bringing up the USB serial.
-.. _bootloader-rev6:
-
-Maple Rev6 - The Serial Bootloader (Tentative)
-----------------------------------------------
-
-.. note:: This section documents an in-progress version of the Maple
- bootloader. **No Maples yet sold use this bootloader protocol**.
- It has not been yet been publicly released, and its interface is
- not stable.
-
-The bootloader in Rev3/Rev5 works well on Linux, acceptably on Mac,
-but was unsatisfactory on Windows. Unlike the other operating systems,
-Windows needed to be manually pointed to both the driver to use for
-programming (DFU, via `libusb <http://www.libusb.org/>`_) and the
-driver to use for serial communication (usbser.sys, built in to
-Windows). Since Maple operates in only one of these modes at a time,
-driver installation was unnecessarily complicated. It was necessary to
-bring Maple into the correct mode before installing each of the
-drivers. Furthermore, because libusb is not bundled with Windows, and
-its driver is not signed, Windows 7 users have been forced to
-laboriously disable driver signing checks. Finally, Windows hates the
-constant switching of the device between Serial and DFU modes (during
-programming), and often prompts users to install drivers that are
-already installed. We have therefore decided to abandon DFU.
-
-In our new bootloader scheme, Maple is simply a serial device.
-Windows comes bundled with usbser.sys, so no driver signing is
-required. The IDE installation process is greatly simplified, there
-is no more switching back and forth between "modes", and we can build
-in new functionality outside the DFU spec.
-
-The first incarnation of this serial-only bootloader leaves libmaple
-and user code untouched. However, during programming, instead of
-calling :command:`dfu-util` to upload code we will now call a newly
-written utility script similar to `avr-dude
-<http://savannah.nongnu.org/projects/avrdude/>`_. The high level
-operation of the bootloader will remain the same - come on at startup,
-wait for an upload operation or timeout, and jump to user code.
-
-The second version of this bootloader will eliminate this dependence
-on resetting and timing out by having the bootloader run in the
-background. It will additionally own the serial port. In this scheme,
-sending data over the COM port while DTR is pulled low results in that
-packet being captured by the bootloader and interpreted as a
-bootloader command. When the user uploads a new program, the
-bootloader will overwrite the old one, reset the various peripheral
-registers, and jump to user code. All of this will occur without
-resetting the chip and thus causing Maple to connect and disconnect
-from your computer (which seems to cause many problems).
-
-The final version of this bootloader scheme will involve a separate
-microcontroller, whose responsibilities are to drive the USB port,
-program the main processor, and offer some amount of debugging
-capability. This will allow user sketches to run on the bare metal of
-the main processor, without any bootloader hiding underneath. This
-approach is similar to the approaches taken by mbed and the Arduino
-Uno.
-
-Regardless of which generation of the new serial bootloader you are
-working with, the command interface is the same. The low level
-communication protocol is inspired by STK-500, the protocol used to
-program many AVR-based development boards. The protocol is a
-packetized query-response scheme. The host PC initiates every
-transaction, and for every query sent to the bootloader, a single
-response will be returned (or the system times out). Data is
-transmitted over 115.2kbps, 8 data bits, 1 stop bit, no parity
-bit. Every query or response follows the same packet format that looks
-like this:
-
-.. _bootloader-packet-structure:
-
-Packet Structure
-^^^^^^^^^^^^^^^^
-
-A bootloader packet is composed of a sequence of fields, as follows.
-
-.. list-table::
- :header-rows: 1
-
- * - Field
- - Length (bytes)
- - Value
- - Description
-
- * - START
- - 1
- - 0x1B
- - Magic constant, indicates bootloader packet
-
- * - SEQUENCE_NUM
- - 1
- - 0--0xFF
- - Queries and responses must have the same sequence number; rolls
- over to 0 after 0xFF
-
- * - MESSAGE_SIZE
- - 2
- - 0--0xFFFF
- - Size of message body, currently limited to a 1024B=1KB maximum
-
- * - TOKEN
- - 1
- - 0x7F
- - Differs from STK500 value of 0x0E
-
- * - MESSAGE_BODY
- - Variable, determined by MESSAGE_SIZE field
- - Command query or response
- - See :ref:`next section <bootloader-commands>`
-
- * - CHECKSUM
- - 4
- - XOR of all other 32-bit words in packet
- - See :ref:`below <bootloader-checksum>`
-
-.. _bootloader-checksum:
-
-.. highlight:: cpp
-
-.. note:: When computing the checksum, the words in a packet are
- interpreted big-endian (as if the packet were a sequence of 32-bit,
- big-endian unsigned integers). If the end of the MESSAGE_BODY is
- not aligned with a four-byte boundary, then the checksum will treat
- it as if it was padded with zero bytes to a four-byte boundary.
-
- As a concrete example, an entire GET_INFO query (see :ref:`below
- <bootloader-get-info>`), including the packet structure, is
- comprised of the byte sequence ::
-
- {0x1B, 0x7F, 0x00, 0x01, 0x7F, 0x00, 0x64, 0x7F, 0x00, 0x01}
-
- The SEQUENCE_NUM of this query is 0x7F.
+.. .. _bootloader-rev6:
+
+.. Maple Rev6 - The Serial Bootloader (Tentative)
+.. ----------------------------------------------
+
+.. .. note:: This section documents an in-progress version of the Maple
+.. bootloader. **No Maples yet sold use this bootloader protocol**.
+.. It has not been yet been publicly released, and its interface is
+.. not stable.
+
+.. The bootloader in Rev3/Rev5 works well on Linux, acceptably on Mac,
+.. but was unsatisfactory on Windows. Unlike the other operating systems,
+.. Windows needed to be manually pointed to both the driver to use for
+.. programming (DFU, via `libusb <http://www.libusb.org/>`_) and the
+.. driver to use for serial communication (usbser.sys, built in to
+.. Windows). Since Maple operates in only one of these modes at a time,
+.. driver installation was unnecessarily complicated. It was necessary to
+.. bring Maple into the correct mode before installing each of the
+.. drivers. Furthermore, because libusb is not bundled with Windows, and
+.. its driver is not signed, Windows 7 users have been forced to
+.. laboriously disable driver signing checks. Finally, Windows hates the
+.. constant switching of the device between Serial and DFU modes (during
+.. programming), and often prompts users to install drivers that are
+.. already installed. We have therefore decided to abandon DFU.
+
+.. In our new bootloader scheme, Maple is simply a serial device.
+.. Windows comes bundled with usbser.sys, so no driver signing is
+.. required. The IDE installation process is greatly simplified, there
+.. is no more switching back and forth between "modes", and we can build
+.. in new functionality outside the DFU spec.
+
+.. The first incarnation of this serial-only bootloader leaves libmaple
+.. and user code untouched. However, during programming, instead of
+.. calling :command:`dfu-util` to upload code we will now call a newly
+.. written utility script similar to `avr-dude
+.. <http://savannah.nongnu.org/projects/avrdude/>`_. The high level
+.. operation of the bootloader will remain the same - come on at startup,
+.. wait for an upload operation or timeout, and jump to user code.
+
+.. The second version of this bootloader will eliminate this dependence
+.. on resetting and timing out by having the bootloader run in the
+.. background. It will additionally own the serial port. In this scheme,
+.. sending data over the COM port while DTR is pulled low results in that
+.. packet being captured by the bootloader and interpreted as a
+.. bootloader command. When the user uploads a new program, the
+.. bootloader will overwrite the old one, reset the various peripheral
+.. registers, and jump to user code. All of this will occur without
+.. resetting the chip and thus causing Maple to connect and disconnect
+.. from your computer (which seems to cause many problems).
+
+.. The final version of this bootloader scheme will involve a separate
+.. microcontroller, whose responsibilities are to drive the USB port,
+.. program the main processor, and offer some amount of debugging
+.. capability. This will allow user sketches to run on the bare metal of
+.. the main processor, without any bootloader hiding underneath. This
+.. approach is similar to the approaches taken by mbed and the Arduino
+.. Uno.
+
+.. Regardless of which generation of the new serial bootloader you are
+.. working with, the command interface is the same. The low level
+.. communication protocol is inspired by STK-500, the protocol used to
+.. program many AVR-based development boards. The protocol is a
+.. packetized query-response scheme. The host PC initiates every
+.. transaction, and for every query sent to the bootloader, a single
+.. response will be returned (or the system times out). Data is
+.. transmitted over 115.2kbps, 8 data bits, 1 stop bit, no parity
+.. bit. Every query or response follows the same packet format that looks
+.. like this:
+
+.. .. _bootloader-packet-structure:
+
+.. Packet Structure
+.. ^^^^^^^^^^^^^^^^
+
+.. A bootloader packet is composed of a sequence of fields, as follows.
+
+.. .. list-table::
+.. :header-rows: 1
+
+.. * - Field
+.. - Length (bytes)
+.. - Value
+.. - Description
+
+.. * - START
+.. - 1
+.. - 0x1B
+.. - Magic constant, indicates bootloader packet
+
+.. * - SEQUENCE_NUM
+.. - 1
+.. - 0--0xFF
+.. - Queries and responses must have the same sequence number; rolls
+.. over to 0 after 0xFF
+
+.. * - MESSAGE_SIZE
+.. - 2
+.. - 0--0xFFFF
+.. - Size of message body, currently limited to a 1024B=1KB maximum
+
+.. * - TOKEN
+.. - 1
+.. - 0x7F
+.. - Differs from STK500 value of 0x0E
+
+.. * - MESSAGE_BODY
+.. - Variable, determined by MESSAGE_SIZE field
+.. - Command query or response
+.. - See :ref:`next section <bootloader-commands>`
+
+.. * - CHECKSUM
+.. - 4
+.. - XOR of all other 32-bit words in packet
+.. - See :ref:`below <bootloader-checksum>`
+
+.. .. _bootloader-checksum:
+
+.. .. highlight:: cpp
+
+.. .. note:: When computing the checksum, the words in a packet are
+.. interpreted big-endian (as if the packet were a sequence of 32-bit,
+.. big-endian unsigned integers). If the end of the MESSAGE_BODY is
+.. not aligned with a four-byte boundary, then the checksum will treat
+.. it as if it was padded with zero bytes to a four-byte boundary.
-.. highlight:: sh
+.. As a concrete example, an entire GET_INFO query (see :ref:`below
+.. <bootloader-get-info>`), including the packet structure, is
+.. comprised of the byte sequence ::
+
+.. {0x1B, 0x7F, 0x00, 0x01, 0x7F, 0x00, 0x64, 0x7F, 0x00, 0x01}
+
+.. The SEQUENCE_NUM of this query is 0x7F.
+
+.. .. highlight:: sh
-.. _bootloader-commands:
+.. .. _bootloader-commands:
-Commands
-^^^^^^^^
+.. Commands
+.. ^^^^^^^^
-The packet structure overhead is for reliability. The actual queries
-and responses are transacted inside of the message body. Following
-the STK-500 protocol, each query or response begins with the single
-byte command field. For each query, the resultant response must begin
-with the same CMD byte. For each type of command, the structure of
-queries and responses is of fixed size.
+.. The packet structure overhead is for reliability. The actual queries
+.. and responses are transacted inside of the message body. Following
+.. the STK-500 protocol, each query or response begins with the single
+.. byte command field. For each query, the resultant response must begin
+.. with the same CMD byte. For each type of command, the structure of
+.. queries and responses is of fixed size.
-Also following STK-500, fields longer than 1 byte are transmitted MSB
-first (big-endian). However, READ and WRITE commands operate byte-wise
-(not word-wise); it is up to the host PC to ensure that alignment and
-ordering issues are handled appropriately.
+.. Also following STK-500, fields longer than 1 byte are transmitted MSB
+.. first (big-endian). However, READ and WRITE commands operate byte-wise
+.. (not word-wise); it is up to the host PC to ensure that alignment and
+.. ordering issues are handled appropriately.
-.. _bootloader-get-info:
+.. .. _bootloader-get-info:
-GET_INFO
-""""""""
+.. GET_INFO
+.. """"""""
-Used to query device characteristics.
+.. Used to query device characteristics.
-GET_INFO Query:
+.. GET_INFO Query:
-.. list-table::
- :header-rows: 1
+.. .. list-table::
+.. :header-rows: 1
- * - Field
- - Bytes
- - Comments
+.. * - Field
+.. - Bytes
+.. - Comments
- * - GET_INFO
- - 1
- - Value 0
+.. * - GET_INFO
+.. - 1
+.. - Value 0
-GET_INFO Response:
+.. GET_INFO Response:
-.. list-table::
- :header-rows: 1
- :widths: 4 2 10
+.. .. list-table::
+.. :header-rows: 1
+.. :widths: 4 2 10
- * - Field
- - Bytes
- - Comments
+.. * - Field
+.. - Bytes
+.. - Comments
- * - GET_INFO
- - 1
- - Value 0
+.. * - GET_INFO
+.. - 1
+.. - Value 0
- * - Endianness
- - 1
- - 0 indicates little-endian, 1 indicates big-endian.
- (Currently returns 0; this field allows for future
- expansion).
+.. * - Endianness
+.. - 1
+.. - 0 indicates little-endian, 1 indicates big-endian.
+.. (Currently returns 0; this field allows for future
+.. expansion).
- * - Available Ram
- - 4
- - In bytes
+.. * - Available Ram
+.. - 4
+.. - In bytes
- * - Available Flash
- - 4
- - In bytes
+.. * - Available Flash
+.. - 4
+.. - In bytes
- * - Flash Page Size
- - 2
- - In bytes
+.. * - Flash Page Size
+.. - 2
+.. - In bytes
- * - Starting Address (FLASH)
- - 4
- - Usually 0x08005000
+.. * - Starting Address (FLASH)
+.. - 4
+.. - Usually 0x08005000
- * - Starting Address (RAM)
- - 4
- - Usually 0x200000C0
+.. * - Starting Address (RAM)
+.. - 4
+.. - Usually 0x200000C0
- * - Bootloader Version
- - 4
- - Current version 0x00060000 (MAJ,MIN)
+.. * - Bootloader Version
+.. - 4
+.. - Current version 0x00060000 (MAJ,MIN)
-.. _bootloader-erase-page:
+.. .. _bootloader-erase-page:
-ERASE_PAGE
-""""""""""
+.. ERASE_PAGE
+.. """"""""""
-Used to erase flash pages.
+.. Used to erase flash pages.
-ERASE_PAGE query:
+.. ERASE_PAGE query:
-.. list-table::
- :header-rows: 1
- :widths: 4 2 10
+.. .. list-table::
+.. :header-rows: 1
+.. :widths: 4 2 10
- * - Field
- - Bytes
- - Comments
+.. * - Field
+.. - Bytes
+.. - Comments
- * - ERASE_PAGE
- - 1
- - Value 1
+.. * - ERASE_PAGE
+.. - 1
+.. - Value 1
- * - ADDRESS
- - 4
- - Will erase whichever page contains ADDRESS
+.. * - ADDRESS
+.. - 4
+.. - Will erase whichever page contains ADDRESS
-ERASE_PAGE response:
+.. ERASE_PAGE response:
-.. list-table::
- :header-rows: 1
- :widths: 3 2 10
+.. .. list-table::
+.. :header-rows: 1
+.. :widths: 3 2 10
- * - Field
- - Bytes
- - Comments
+.. * - Field
+.. - Bytes
+.. - Comments
- * - ERASE_PAGE
- - 1
- - Value 1
+.. * - ERASE_PAGE
+.. - 1
+.. - Value 1
- * - SUCCESS
- - 1
- - Either 0 (failure) or 1 (success)
+.. * - SUCCESS
+.. - 1
+.. - Either 0 (failure) or 1 (success)
-WRITE_BYTES
-"""""""""""
+.. WRITE_BYTES
+.. """""""""""
-Used to write to RAM or flash.
+.. Used to write to RAM or flash.
-WRITE_BYTES query:
+.. WRITE_BYTES query:
-.. list-table::
- :header-rows: 1
- :widths: 4 4 10
+.. .. list-table::
+.. :header-rows: 1
+.. :widths: 4 4 10
- * - Field
- - Bytes
- - Comments
+.. * - Field
+.. - Bytes
+.. - Comments
- * - WRITE_BYTES
- - 1
- - Value 2
+.. * - WRITE_BYTES
+.. - 1
+.. - Value 2
- * - Starting Address
- - 4
- - Can address arbitrary RAM, or :ref:`cleared
- <bootloader-erase-page>` flash pages.
+.. * - Starting Address
+.. - 4
+.. - Can address arbitrary RAM, or :ref:`cleared
+.. <bootloader-erase-page>` flash pages.
- * - DATA
- - MESSAGE_SIZE - 5
- - See :ref:`Packet Structure <bootloader-packet-structure>`
+.. * - DATA
+.. - MESSAGE_SIZE - 5
+.. - See :ref:`Packet Structure <bootloader-packet-structure>`
-WRITE_BYTES response:
+.. WRITE_BYTES response:
-.. list-table::
- :header-rows: 1
- :widths: 2 2 10
+.. .. list-table::
+.. :header-rows: 1
+.. :widths: 2 2 10
- * - Field
- - Bytes
- - Comments
+.. * - Field
+.. - Bytes
+.. - Comments
- * - WRITE_BYTES
- - 1
- - Value 2
+.. * - WRITE_BYTES
+.. - 1
+.. - Value 2
- * - SUCCESS
- - 1
- - Either 0 (failure) or 1 (success). Will fail if writes were
- made to uncleared pages. Does not clean up failed writes
- (memory will be left in an undefined state).
+.. * - SUCCESS
+.. - 1
+.. - Either 0 (failure) or 1 (success). Will fail if writes were
+.. made to uncleared pages. Does not clean up failed writes
+.. (memory will be left in an undefined state).
-READ_BYTES
-""""""""""
+.. READ_BYTES
+.. """"""""""
-Used to read from RAM or flash.
+.. Used to read from RAM or flash.
-READ_BYTES query:
+.. READ_BYTES query:
-.. list-table::
- :header-rows: 1
- :widths: 2 2 10
+.. .. list-table::
+.. :header-rows: 1
+.. :widths: 2 2 10
- * - Field
- - Bytes
- - Comments
+.. * - Field
+.. - Bytes
+.. - Comments
- * - READ_BYTES
- - 1
- - Value 3
+.. * - READ_BYTES
+.. - 1
+.. - Value 3
- * - ADDRESS
- - 4
- - Start of block to read. Must be a multiple of 4.
+.. * - ADDRESS
+.. - 4
+.. - Start of block to read. Must be a multiple of 4.
- * - LENGTH
- - 2
- - Maximum number of bytes to read (currently, this may be at most
- 1024 = 1KB). Must be a multiple of 4.
+.. * - LENGTH
+.. - 2
+.. - Maximum number of bytes to read (currently, this may be at most
+.. 1024 = 1KB). Must be a multiple of 4.
-READ_BYTES response:
+.. READ_BYTES response:
-.. list-table::
- :header-rows: 1
- :widths: 2 2 10
+.. .. list-table::
+.. :header-rows: 1
+.. :widths: 2 2 10
- * - Field
- - Bytes
- - Comments
+.. * - Field
+.. - Bytes
+.. - Comments
- * - READ_BYTES
- - 1
- - Value 3
+.. * - READ_BYTES
+.. - 1
+.. - Value 3
- * - DATA
- - MESSAGE_SIZE - 1
- - Contains read bytes. The actual number of bytes read may be
- less than the LENGTH field of the corresponding READ_BYTES
- query. If this section is of length 0, this should be
- interpreted as a read failure. See
- :ref:`bootloader-packet-structure`.
+.. * - DATA
+.. - MESSAGE_SIZE - 1
+.. - Contains read bytes. The actual number of bytes read may be
+.. less than the LENGTH field of the corresponding READ_BYTES
+.. query. If this section is of length 0, this should be
+.. interpreted as a read failure. See
+.. :ref:`bootloader-packet-structure`.
-JUMP_TO_USER
-""""""""""""
+.. JUMP_TO_USER
+.. """"""""""""
-Causes the bootloader to jump to user code's starting address.
+.. Causes the bootloader to jump to user code's starting address.
-JUMP_TO_USER query:
+.. JUMP_TO_USER query:
-.. list-table::
- :header-rows: 1
- :widths: 2 1 10
+.. .. list-table::
+.. :header-rows: 1
+.. :widths: 2 1 10
- * - Field
- - Bytes
- - Comments
+.. * - Field
+.. - Bytes
+.. - Comments
- * - JUMP_TO_USER
- - 1
- - Value 4
+.. * - JUMP_TO_USER
+.. - 1
+.. - Value 4
- * - Location
- - 1
- - 0 means jump to flash starting address, 1 means jump to RAM
- starting address. See the :ref:`bootloader-get-info` command
- for more information.
+.. * - Location
+.. - 1
+.. - 0 means jump to flash starting address, 1 means jump to RAM
+.. starting address. See the :ref:`bootloader-get-info` command
+.. for more information.
-JUMP_TO_USER response:
+.. JUMP_TO_USER response:
-.. list-table::
- :header-rows: 1
- :widths: 2 1 10
+.. .. list-table::
+.. :header-rows: 1
+.. :widths: 2 1 10
- * - Field
- - Bytes
- - Comments
+.. * - Field
+.. - Bytes
+.. - Comments
- * - JUMP_TO_USER
- - 1
- - Value 4
+.. * - JUMP_TO_USER
+.. - 1
+.. - Value 4
- * - SUCCESS
- - 1
- - Either 0 (failure) or 1 (success). If successful, after the
- response is sent, the bootloader ends this session and jumps to
- the user code in flash or RAM as specified in the query's
- Location field.
+.. * - SUCCESS
+.. - 1
+.. - Either 0 (failure) or 1 (success). If successful, after the
+.. response is sent, the bootloader ends this session and jumps to
+.. the user code in flash or RAM as specified in the query's
+.. Location field.
-SOFT_RESET
-""""""""""
+.. SOFT_RESET
+.. """"""""""
-Engages a full software reset.
+.. Engages a full software reset.
-SOFT_RESET query:
+.. SOFT_RESET query:
-.. list-table::
- :header-rows: 1
- :widths: 2 1 10
+.. .. list-table::
+.. :header-rows: 1
+.. :widths: 2 1 10
- * - Field
- - Bytes
- - Comments
+.. * - Field
+.. - Bytes
+.. - Comments
- * - SOFT_RESET
- - 1
- - Value 5
+.. * - SOFT_RESET
+.. - 1
+.. - Value 5
-SOFT_RESET response:
+.. SOFT_RESET response:
-.. list-table::
- :header-rows: 1
- :widths: 2 1 10
+.. .. list-table::
+.. :header-rows: 1
+.. :widths: 2 1 10
- * - Field
- - Bytes
- - Comments
+.. * - Field
+.. - Bytes
+.. - Comments
- * - SOFT_RESET
- - 1
- - Value 5
+.. * - SOFT_RESET
+.. - 1
+.. - Value 5
- * - SUCCESS
- - 1
- - Either 0 or 1 (FAILED and OK, respectively). Will end this
- bootloader session and reset the processor.
+.. * - SUCCESS
+.. - 1
+.. - Either 0 or 1 (FAILED and OK, respectively). Will end this
+.. bootloader session and reset the processor.
.. _bootloader-reflashing: