333 lines
10 KiB
ReStructuredText
333 lines
10 KiB
ReStructuredText
.. _altera_max10:
|
|
|
|
Altera MAX10
|
|
############
|
|
|
|
Overview
|
|
********
|
|
|
|
|
|
The Zephyr kernel is supported on the Altera MAX10 Rev C development kit, using
|
|
the Nios II Gen 2 soft CPU.
|
|
|
|
.. figure:: img/altera_max10.jpg
|
|
:width: 442px
|
|
:align: center
|
|
:alt: Altera's MAX* 10
|
|
|
|
Altera's MAX* 10 (Credit: Altera)
|
|
|
|
Hardware
|
|
********
|
|
|
|
DIP Switch settings
|
|
===================
|
|
|
|
There are two sets of switches on the back of the board. Of particular
|
|
importance is SW2:
|
|
|
|
* Switch 2 (CONFIG_SEL) should be in the OFF (up) position so that the first
|
|
boot image is CFM0
|
|
* Switch 3 (VTAP_BYPASS) needs to be in the ON (down) position or the flashing
|
|
scripts won't work
|
|
* Switch 4 (HSMC_BYPASSN) should be OFF (up)
|
|
|
|
.. image:: img/Altera_MAX10_switches.jpg
|
|
:width: 442px
|
|
:align: center
|
|
:alt: Altera's MAX* 10 Switches
|
|
|
|
Other switches are user switches, their position is application-specific.
|
|
|
|
Necessary Software
|
|
==================
|
|
|
|
You will need the Altera Quartus SDK in order to work with this device. The
|
|
`Altera Lite Distribution`_ of Quartus may be obtained without
|
|
charge.
|
|
|
|
For your convenience using the SDK tools (such as ``nios2-configure-sof``),
|
|
you should put the binaries provided by the SDK
|
|
in your path. Below is an example, adjust ALTERA_BASE to where you installed the
|
|
SDK:
|
|
|
|
.. code-block:: console
|
|
|
|
export ALTERA_BASE=/opt/altera_lite/16.0
|
|
export PATH=$PATH:$ALTERA_BASE/quartus/bin:$ALTERA_BASE/nios2eds/bin
|
|
|
|
You may need to adjust your udev rules so that you can talk to the USB Blaster
|
|
II peripheral, which is the built-in JTAG interface for this device.
|
|
|
|
The following works for Fedora 23:
|
|
|
|
.. code-block:: console
|
|
|
|
# For Altera USB-Blaster permissions.
|
|
SUBSYSTEM=="usb",\
|
|
ENV{DEVTYPE}=="usb_device",\
|
|
ATTR{idVendor}=="09fb",\
|
|
ATTR{idProduct}=="6010",\
|
|
MODE="0666",\
|
|
NAME="bus/usb/$env{BUSNUM}/$env{DEVNUM}",\
|
|
RUN+="/bin/chmod 0666 %c"
|
|
SUBSYSTEM=="usb",\
|
|
ENV{DEVTYPE}=="usb_device",\
|
|
ATTR{idVendor}=="09fb",\
|
|
ATTR{idProduct}=="6810",\
|
|
MODE="0666",\
|
|
NAME="bus/usb/$env{BUSNUM}/$env{DEVNUM}",\
|
|
RUN+="/bin/chmod 0666 %c"
|
|
|
|
You can test connectivity with the SDK jtagconfig tool, you should see something
|
|
like:
|
|
|
|
.. code-block:: console
|
|
|
|
$ jtagconfig
|
|
1) USB-BlasterII [1-1.2]
|
|
031050DD 10M50DA(.|ES)/10M50DC
|
|
020D10DD VTAP10
|
|
|
|
|
|
Reference CPU
|
|
=============
|
|
|
|
A reference CPU design of a Nios II/f core is included in the Zephyr tree
|
|
in the :zephyr_file:`soc/nios2/nios2f-zephyr/cpu` directory.
|
|
|
|
Flash this CPU using the ``nios2-configure-sof`` SDK tool with the FPGA
|
|
configuration file
|
|
:zephyr_file:`soc/nios2/nios2f-zephyr/cpu/ghrd_10m50da.sof`:
|
|
|
|
.. code-block:: console
|
|
|
|
$ nios2-configure-sof ghrd_10m50da.sof
|
|
|
|
This CPU is a Nios II/F core with a 16550 UART, JTAG UART, and the Avalon Timer.
|
|
For any Nios II SOC definition, you can find out more details about the CPU
|
|
configuration by inspecting system.h in the SOC's include directory.
|
|
|
|
Console Output
|
|
==============
|
|
|
|
16550 UART
|
|
----------
|
|
|
|
By default, the kernel is configured to send console output to the 16550 UART.
|
|
You can monitor this on your workstation by connecting to the top right mini USB
|
|
port on the board (it will show up in /dev as a ttyUSB node), and then running
|
|
minicom with flow control disabled, 115200-8N1 settings.
|
|
|
|
JTAG UART
|
|
---------
|
|
|
|
You can also have it send its console output to the JTAG UART. Set these in your
|
|
project configuration:
|
|
|
|
.. code-block:: console
|
|
|
|
CONFIG_UART_ALTERA_JTAG=y
|
|
CONFIG_UART_CONSOLE_ON_DEV_NAME="jtag_uart0"
|
|
|
|
To view these messages on your local workstation, run the terminal application
|
|
in the SDK:
|
|
|
|
.. code-block:: console
|
|
|
|
$ nios2-terminal
|
|
|
|
Programming and Debugging
|
|
*************************
|
|
|
|
Flashing
|
|
========
|
|
|
|
Flashing Kernel into UFM
|
|
------------------------
|
|
|
|
The usual ``flash`` target will work with the ``altera_max10`` board
|
|
configuration. Here is an example for the :ref:`hello_world`
|
|
application.
|
|
|
|
.. zephyr-app-commands::
|
|
:zephyr-app: samples/hello_world
|
|
:board: altera_max10
|
|
:goals: flash
|
|
|
|
Refer to :ref:`build_an_application` and :ref:`application_run` for
|
|
more details.
|
|
|
|
This provisions the Zephyr kernel and the CPU configuration onto the board,
|
|
using the scripts/support/quartus-flash.py script. After it completes the kernel
|
|
will immediately boot.
|
|
|
|
|
|
Flashing Kernel directly into RAM over JTAG
|
|
-------------------------------------------
|
|
|
|
The SDK included the nios2-download tool which will let you flash a kernel
|
|
directly into RAM and then boot it from the __start symbol.
|
|
|
|
In order for this to work, your entire kernel must be located in RAM. Make sure
|
|
the following config options are disabled:
|
|
|
|
.. code-block:: console
|
|
|
|
CONFIG_XIP=n
|
|
CONFIG_INCLUDE_RESET_VECTOR=n
|
|
|
|
Then, after building your kernel, push it into device's RAM by running
|
|
this from the build directory:
|
|
|
|
.. code-block:: console
|
|
|
|
$ nios2-download --go zephyr/zephyr.elf
|
|
|
|
If you have a console session running (either minicom or nios2-terminal) you
|
|
should see the application's output. There are additional arguments you can pass
|
|
to nios2-download so that it spawns a GDB server that you can connect to,
|
|
although it's typically simpler to just use nios2-gdb-server as described below.
|
|
|
|
Debugging
|
|
=========
|
|
|
|
The Altera SDK includes a GDB server which can be used to debug a MAX10 board.
|
|
You can either debug a running image that was flashed onto the device in User
|
|
Flash Memory (UFM), or load an image over the JTAG using GDB.
|
|
|
|
Debugging With UFM Flashed Image
|
|
--------------------------------
|
|
|
|
You can debug an application in the usual way. Here is an example.
|
|
|
|
.. zephyr-app-commands::
|
|
:zephyr-app: samples/hello_world
|
|
:board: altera_max10
|
|
:goals: debug
|
|
|
|
You will see output similar to the following:
|
|
|
|
.. code-block:: console
|
|
|
|
Nios II GDB server running on port 3335
|
|
Ignoring --stop option because --tcpport also specified
|
|
GNU gdb (GDB) 7.11.0.20160511-git
|
|
Copyright (C) 2016 Free Software Foundation, Inc.
|
|
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
|
|
This is free software: you are free to change and redistribute it.
|
|
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
|
|
and "show warranty" for details.
|
|
This GDB was configured as "--host=x86_64-pokysdk-linux --target=nios2-zephyr-elf".
|
|
Type "show configuration" for configuration details.
|
|
For bug reporting instructions, please see:
|
|
<http://www.gnu.org/software/gdb/bugs/>.
|
|
Find the GDB manual and other documentation resources online at:
|
|
<http://www.gnu.org/software/gdb/documentation/>.
|
|
For help, type "help".
|
|
Type "apropos word" to search for commands related to "word"...
|
|
Reading symbols from /projects/zephyr/samples/hello_world/build/zephyr/zephyr.elf...done.
|
|
Remote debugging using :3335
|
|
Using cable "USB-BlasterII [3-1.3]", device 1, instance 0x00
|
|
Resetting and pausing target processor: OK
|
|
Listening on port 3335 for connection from GDB: accepted
|
|
isr_tables_syms () at /projects/zephyr/arch/common/isr_tables.c:63
|
|
63 GEN_ABSOLUTE_SYM(__ISR_LIST_SIZEOF, sizeof(struct _isr_list));
|
|
(gdb) b _PrepC
|
|
Breakpoint 1 at 0xdf0: file /projects/zephyr/arch/nios2/core/prep_c.c, line 36.
|
|
(gdb) b _Cstart
|
|
Breakpoint 2 at 0x1254: file /projects/zephyr/kernel/init.c, line 348.
|
|
(gdb) c
|
|
Continuing.
|
|
|
|
Breakpoint 2, _Cstart () at /projects/zephyr/kernel/init.c:348
|
|
348 {
|
|
(gdb)
|
|
|
|
To start debugging manually:
|
|
|
|
|
|
.. code-block:: console
|
|
|
|
nios2-gdb-server --tcpport 1234 --stop --reset-target
|
|
|
|
And then connect with GDB from the build directory:
|
|
|
|
|
|
.. code-block:: console
|
|
|
|
nios2-poky-elf-gdb zephyr/zephyr.elf -ex "target remote :1234"
|
|
|
|
Debugging With JTAG Flashed Image
|
|
---------------------------------
|
|
|
|
In order for this to work, execute-in-place must be disabled, since the GDB
|
|
'load' command can only put text and data in RAM. Ensure this is in your
|
|
configuration:
|
|
|
|
.. code-block:: console
|
|
|
|
CONFIG_XIP=n
|
|
|
|
It is OK for this procedure to leave the reset vector enabled, unlike
|
|
nios2-download (which errors out if it finds sections outside of SRAM) it will
|
|
be ignored.
|
|
|
|
In a terminal, launch the nios2 GDB server. It doesn't matter what kernel (if
|
|
any) is on the device, but you should have at least flashed a CPU using
|
|
nios2-configure-sof. You can leave this process running.
|
|
|
|
.. code-block:: console
|
|
|
|
$ nios2-gdb-server --tcpport 1234 --tcppersist --init-cache --reset-target
|
|
|
|
Build your Zephyr kernel, and load it into a GDB built for Nios II (included in
|
|
the Zephyr SDK) from the build directory:
|
|
|
|
.. code-block:: console
|
|
|
|
$ nios2-poky-elf-gdb zephyr/zephyr.elf
|
|
|
|
Then connect to the GDB server:
|
|
|
|
.. code-block:: console
|
|
|
|
(gdb) target remote :1234
|
|
|
|
And then load the kernel image over the wire. The CPU will not start from the
|
|
reset vector, instead it will boot from the __start symbol:
|
|
|
|
|
|
.. code-block:: console
|
|
|
|
(gdb) load
|
|
Loading section reset, size 0xc lma 0x0
|
|
Loading section exceptions, size 0x1b0 lma 0x400020
|
|
Loading section text, size 0x8df0 lma 0x4001d0
|
|
Loading section devconfig, size 0x30 lma 0x408fc0
|
|
Loading section rodata, size 0x3f4 lma 0x408ff0
|
|
Loading section datas, size 0x888 lma 0x4093e4
|
|
Loading section initlevel, size 0x30 lma 0x409c6c
|
|
Loading section _k_task_list, size 0x58 lma 0x409c9c
|
|
Loading section _k_task_ptr, size 0x8 lma 0x409cf4
|
|
Loading section _k_event_list, size 0x10 lma 0x409cfc
|
|
Start address 0x408f54, load size 40184
|
|
Transfer rate: 417 KB/sec, 368 bytes/write.
|
|
After this is done you may set breakpoints and continue execution. If you ever want to reset the CPU, issue the 'load' command again.
|
|
|
|
|
|
|
|
References
|
|
**********
|
|
|
|
* `CPU Documentation <https://www.altera.com/en_US/pdfs/literature/hb/nios2/n2cpu-nii5v1gen2.pdf>`_
|
|
* `Nios II Processor Booting Methods in MAX 10 FPGA Devices <https://www.altera.com/en_US/pdfs/literature/an/an730.pdf>`_
|
|
* `Embedded Peripherals IP User Guide <https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/ug/ug_embedded_ip.pdf>`_
|
|
* `MAX 10 FPGA Configuration User Guide <https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/hb/max-10/ug_m10_config.pdf>`_
|
|
* `MAX 10 FPGA Development Kit User Guide <https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/ug/ug-max10m50-fpga-dev-kit.pdf>`_
|
|
* `Nios II Command-Line Tools <https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/hb/nios2/edh_ed51004.pdf>`_
|
|
* `Quartus II Scripting Reference Manual <https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/manual/tclscriptrefmnl.pdf>`_
|
|
|
|
|
|
.. _Altera Lite Distribution: http://dl.altera.com/?edition=lite
|