README ====== This README file discusses the port of NuttX to the Atmel SAM V71 Xplained Ultra Evaluation Kit (SAMV71-XULT). This board features the ATSAMV71Q21 Cortex-M7 microcontroller. Contents ======== - Board Features - Serial Console - SD card - Automounter - LEDs and Buttons - AT24MAC402 Serial EEPROM - Debugging - Configurations Board Features ============== - ATSAMV71Q21 microcontroller: Cortex-M7, 300MHz, 2MiB FLASH, 384KiB SRAM, I/D-caches - One mechanical reset button - One power switch button - Two mechanical user pushbuttons - Two yellow user LEDs - Supercap backup - 12.0 MHz crystal - 32.768 kHz crystal - 2 MB SDRAM - 2 MB QSPI Flash - IEEE 802.3az 10Base-T/100Base-TX Ethernet RMII PHY - AT24MAC402 256KByte EEPROM with EUI-48 address - WM8904 stereo audio codec - ATA6561 CAN Transceiver - SD Card connector with SDIO support - Camera interface connector - MediaLB connector - Two Xplained Pro extension headers - One Xplained Pro LCD header - Coresight 20 connector for 4-bit ETM - Arduino due compatible shield connectors - External debugger connector - USB interface, device and host mode - Embedded Debugger with Data Gateway Interface and Virtual COM port (CDC) - External power input (5-14V) or USB powered See the Atmel webite for further information about this board: - http://www.atmel.com/tools/atsamv71-xult.aspx Serial Console ============== The SAMV71-XULT has no on-board RS-232 drivers so it will be necessary to use either the VCOM or an external RS-232 driver. Here are some options. - Arduino Serial Shield: One option is to use an Arduino-compatible serial shield. This will use the RXD and TXD signals available at pins 0 an 1, respectively, of the Arduino "Digital Low" connector. On the SAMV71-XULT board, this corresponds to UART3: ------ ------ ------- ------- -------- Pin on SAMV71 Arduino Arduino SAMV71 J503 PIO Name Pin Function ------ ------ ------- ------- -------- 1 PD28 RX0 0 URXD3 2 PD30 TX0 1 UTXD3 ------ ------ ------- ------- -------- - SAMV7-XULT EXTn connectors. USART pins are also available the EXTn connectors. The following are labelled in the User Guide for USART functionality: ---- -------- ------ -------- EXT1 EXTI1 SAMV71 SAMV71 Pin Name PIO Function ---- -------- ------ -------- 13 USART_RX PB00 RXD0 14 USART_TX PB01 TXD0 ---- -------- ------ -------- EXT2 EXTI2 SAMV71 SAMV71 Pin Name PIO Function ---- -------- ------ -------- 13 USART_RX PA21 RXD1 14 USART_TX PB04 TXD1 - VCOM. The Virtual Com Port gateway is available on USART1: ------ -------- SAMV71 SAMV71 PIO Function ------ -------- PB04 TXD1 PA21 RXD1 ------ -------- Any of these options can be selected as the serial console by: 1. Enabling the UART/USART peripheral in the "System Type -> Peripheral Selection" menu, then 2. Configuring the peripheral in the "Drivers -> Serial Configuration" menu. SD Card ======= Card Slot --------- The SAM V71 Xplained Ultra has one standard SD card connector which is connected to the High Speed Multimedia Card Interface (HSMCI) of the SAM V71. SD card connector: ------ ----------------- --------------------- SAMV71 SAMV71 Shared functionality Pin Function ------ ----------------- --------------------- PA30 MCDA0 (DAT0) PA31 MCDA1 (DAT1) PA26 MCDA2 (DAT2) PA27 MCDA3 (DAT3) Camera PA25 MCCK (CLK) Shield PA28 MCCDA (CMD) PD18 Card Detect (C/D) Shield ------ ----------------- --------------------- Configuration Settings ---------------------- Enabling HSMCI support. The SAMV7-XULT provides a one, full-size SD memory card slots. The full size SD card slot connects via HSMCI0. Support for the SD slots can be enabled with the following settings: System Type->SAMV7 Peripheral Selection CONFIG_SAMV7_HSMCI0=y : To enable HSMCI0 support CONFIG_SAMV7_XDMAC=y : XDMAC is needed by HSMCI0/1 System Type CONFIG_SAMV7_PIO_IRQ=y : PIO interrupts needed CONFIG_SAMV7_PIOD_IRQ=y : Card detect pin is on PD18 Device Drivers -> MMC/SD Driver Support CONFIG_MMCSD=y : Enable MMC/SD support CONFIG_MMSCD_NSLOTS=1 : One slot per driver instance CONFIG_MMCSD_MULTIBLOCK_DISABLE=y : (REVISIT) CONFIG_MMCSD_HAVECARDDETECT=y : Supports card-detect PIOs CONFIG_MMCSD_MMCSUPPORT=n : Interferes with some SD cards CONFIG_MMCSD_SPI=n : No SPI-based MMC/SD support CONFIG_MMCSD_SDIO=y : SDIO-based MMC/SD support CONFIG_SDIO_DMA=y : Use SDIO DMA CONFIG_SDIO_BLOCKSETUP=y : Needs to know block sizes RTOS Features -> Work Queue Support CONFIG_SCHED_WORKQUEUE=y : Driver needs work queue support Application Configuration -> NSH Library CONFIG_NSH_ARCHINIT=y : NSH board-initialization, OR CONFIG_BOARD_INITIALIZE=y Using the SD card ----------------- 1) After booting, the HSCMI device will appear as /dev/mmcsd0. 2) If you try mounting an SD card with nothing in the slot, the mount will fail: nsh> mount -t vfat /dev/mmcsd0 /mnt/sd0 nsh: mount: mount failed: 19 NSH can be configured to provide errors as strings instead of numbers. But in this case, only the error number is reported. The error numbers can be found in nuttx/include/errno.h: #define ENODEV 19 #define ENODEV_STR "No such device" So the mount command is saying that there is no device or, more correctly, that there is no card in the SD card slot. 3) Inserted the SD card. Then the mount should succeed. nsh> mount -t vfat /dev/mmcsd0 /mnt/sd0 nsh> ls /mnt/sd1 /mnt/sd1: atest.txt nsh> cat /mnt/sd1/atest.txt This is a test NOTE: See the next section entitled "Auto-Mounter" for another way to mount your SD card. 4) Before removing the card, you must umount the file system. This is equivalent to "ejecting" or "safely removing" the card on Windows: It flushes any cached data to an SD card and makes the SD card unavailable to the applications. nsh> umount -t /mnt/sd0 It is now safe to remove the card. NuttX provides into callbacks that can be used by an application to automatically unmount the volume when it is removed. But those callbacks are not used in these configurations. Auto-Mounter ============ NuttX implements an auto-mounter than can make working with SD cards easier. With the auto-mounter, the file system will be automatically mounted when the SD card is inserted into the HSMCI slot and automatically unmounted when the SD card is removed. Here is a sample configuration for the auto-mounter: File System Configuration CONFIG_FS_AUTOMOUNTER=y Board-Specific Options CONFIG_SAMV7XULT_HSMCI0_AUTOMOUNT=y CONFIG_SAMV7XULT_HSMCI0_AUTOMOUNT_FSTYPE="vfat" CONFIG_SAMV7XULT_HSMCI0_AUTOMOUNT_BLKDEV="/dev/mmcsd0" CONFIG_SAMV7XULT_HSMCI0_AUTOMOUNT_MOUNTPOINT="/mnt/sdcard" CONFIG_SAMV7XULT_HSMCI0_AUTOMOUNT_DDELAY=1000 CONFIG_SAMV7XULT_HSMCI0_AUTOMOUNT_UDELAY=2000 WARNING: SD cards should never be removed without first unmounting them. This is to avoid data and possible corruption of the file system. Certainly this is the case if you are writing to the SD card at the time of the removal. If you use the SD card for read-only access, however, then I cannot think of any reason why removing the card without mounting would be harmful. LEDs and Buttons ================ LEDs ---- There are two yellow LED available on the SAM V71 Xplained Ultra board that can be turned on and off. The LEDs can be activated by driving the connected I/O line to GND. ------ ----------- --------------------- SAMV71 Function Shared functionality PIO ------ ----------- --------------------- PA23 Yellow LED0 EDBG GPIO PC09 Yellow LED1 LCD, and Shield ------ ----------- --------------------- These LEDs are not used by the board port unless CONFIG_ARCH_LEDS is defined. In that case, the usage by the board port is defined in include/board.h and src/sam_autoleds.c. The LEDs are used to encode OS-related events as follows: ------------------- ----------------------- -------- -------- SYMBOL Meaning LED state LED0 LED1 ------------------- ----------------------- -------- -------- LED_STARTED NuttX has been started OFF OFF LED_HEAPALLOCATE Heap has been allocated OFF OFF LED_IRQSENABLED Interrupts enabled OFF OFF LED_STACKCREATED Idle stack created ON OFF LED_INIRQ In an interrupt No change LED_SIGNAL In a signal handler No change LED_ASSERTION An assertion failed No change LED_PANIC The system has crashed N/C Blinking LED_IDLE MCU is is sleep mode Not used ------------------- ----------------------- -------- -------- Thus if LED0 is statically on, NuttX has successfully booted and is, apparently, running normally. If LED1 is flashing at approximately 2Hz, then a fatal error has been detected and the system has halted. NOTE: That LED0 is not used after completion of booting and may be used by other board-specific logic. Buttons ------- SAM V71 Xplained Ultra contains three mechanical buttons. One button is the RESET button connected to the SAM V71 reset line and the others are generic user configurable buttons. When a button is pressed it will drive the I/O line to GND. ------ ----------- --------------------- SAMV71 Function Shared functionality PIO ------ ----------- --------------------- RESET RESET Trace, Shield, and EDBG PA09 SW0 EDBG GPIO and Camera PB12 SW1 EDBG SWD and Chip Erase ------ ----------- --------------------- NOTES: - There are no pull-up resistors connected to the generic user buttons so it is necessary to enable the internal pull-up in the SAM V71 to use the button. - PB12 is set up as a system flash ERASE pin when the firmware boots. To use the SW1, PB12 has to be configured as a normal regular I/O pin in the MATRIX module. For more information see the SAM V71 datasheet. AT24MAC402 Serial EEPROM ======================== The SAM V71 Xplained Ultra features one external AT24MAC402 serial EEPROM with a EIA-48 MAC address connected to the SAM V71 through I2C. This device contains a MAC address for use with the Ethernet interface. Connectivity: ------ -------- -------- ------------------------------------------ SAMV71 SAMV71 I2C Shared Pin Function Function Functionality ------ -------- -------- ------------------------------------------ PA03 TWID0 SDA EXT1, EXT2, EDBG I2C, LCD, Camera, Audio, MediaLB, and Shield PA04 TWICK0 SCL EXT1, EXT2, EDBG I2C, LCD, Camera, Audio, MediaLB, and Shield ------ -------- -------- ------------------------------------------ I2C address: The 7-bit address of the AT24 part is is 0b1011AAA where AAA is the state of the A0, A1, and A3 pins on the part. On the SAMV71-XULT board, these are all pulled high so the full, 7-bit address is 0x5f. Debugging ========= The on-board EDBG appears to work only with Atmel Studio. You can however, simply connect a SAM-ICE or J-Link to the JTAG/SWD connector on the board and that works great. The only tricky thing is getting the correct orientation of the JTAG connection. I have been using Atmel Studio to write code to flash then I use the Segger J-Link GDB server to debug. I have been using the 'Device Programming' I available under the Atmel Studio 'Tool' menu. I have to disconnect the SAM-ICE while programming with the EDBG. I am sure that you could come up with a GDB server-only solution if you wanted. I run GDB like this from the directory containing the NuttX ELF file: arm-none-eabi-gdb (gdb) target remote localhost:2331 (gdb) mon reset (gdb) file nuttx (gdb) ... start debugging ... Configurations ============== Information Common to All Configurations ---------------------------------------- Each SAMV71-XULT configuration is maintained in a sub-directory and can be selected as follow: cd tools ./configure.sh samv71-xult/ cd - . ./setenv.sh Before sourcing the setenv.sh file above, you should examine it and perform edits as necessary so that TOOLCHAIN_BIN is the correct path to the directory than holds your toolchain binaries. And then build NuttX by simply typing the following. At the conclusion of the make, the nuttx binary will reside in an ELF file called, simply, nuttx. make oldconfig make The that is provided above as an argument to the tools/configure.sh must be is one of the following. NOTES: 1. These configurations use the mconf-based configuration tool. To change any of these configurations using that tool, you should: a. Build and install the kconfig-mconf tool. See nuttx/README.txt and misc/tools/ b. Execute 'make menuconfig' in nuttx/ in order to start the reconfiguration process. 2. Unless stated otherwise, all configurations generate console output on USART3 (i.e., for the Arduino serial shield). 3. All of these configurations are set up to build under Windows using the "GNU Tools for ARM Embedded Processors" that is maintained by ARM (unless stated otherwise in the description of the configuration). https://launchpad.net/gcc-arm-embedded As of this writing (2015-03-11), full support is difficult to find for the Cortex-M&, but is supported by at least this realeasse of the ARM GNU tools: https://launchpadlibrarian.net/192228215/release.txt That toolchain selection can easily be reconfigured using 'make menuconfig'. Here are the relevant current settings: Build Setup: CONFIG_HOST_WINDOWS=y : Window environment CONFIG_WINDOWS_CYGWIN=y : Cywin under Windows System Type -> Toolchain: CONFIG_ARMV7M_TOOLCHAIN_GNU_EABIW=y : GNU ARM EABI toolchain Configuration sub-directories ----------------------------- nsh: Configures the NuttShell (nsh) located at examples/nsh. NOTES: 1. The serial console is configured by default for use with and Arduino serial shield (UART3). You will need to reconfigure if you will to use a different U[S]ART. 2. Default stack sizes are large and should really be tuned to reduce the RAM footprint: CONFIG_ARCH_INTERRUPTSTACK=2048 CONFIG_IDLETHREAD_STACKSIZE=1024 CONFIG_USERMAIN_STACKSIZE=2048 CONFIG_PTHREAD_STACK_DEFAULT=2048 ... and others ... 3. NSH built-in applications are supported. Binary Formats: CONFIG_BUILTIN=y : Enable support for built-in programs Application Configuration: CONFIG_NSH_BUILTIN_APPS=y : Enable starting apps from NSH command line 3. The button test at apps/examples/buttons is included in the configuration. This configuration illustrates (1) use of the buttons on the evaluation board, and (2) the use of PIO interrupts. Example usage: NuttShell (NSH) NuttX-7.8 nsh> help help usage: help [-v] [] ... Builtin Apps: buttons nsh> buttons 3 maxbuttons: 3 Attached handler at 4078f7 to button 0 [SW0], oldhandler:0 Attached handler at 4078e9 to button 1 [SW1], oldhandler:0 IRQ:125 Button 1:SW1 SET:00: SW1 released IRQ:125 Button 1:SW1 SET:02: SW1 depressed IRQ:125 Button 1:SW1 SET:00: SW1 released IRQ:90 Button 0:SW0 SET:01: SW0 depressed IRQ:90 Button 0:SW0 SET:00: SW0 released IRQ:125 Button 1:SW1 SET:02: SW1 depressed nsh> 4. TWI/I2C TWIHS0 is enabled in this configuration. The SAM V71 Xplained Ultra supports two devices on the one on-board I2C device on the TWIHS0 bus: (1) The AT24MAC402 serial EEPROM described above and (2) the Wolfson WM8904 audio CODEC. This device contains a MAC address for use with the Ethernet interface. In this configuration, the I2C tool at apps/system/i2ctool is enabled. This tools supports interactive access to I2C devices on the enabled TWIHS bus. Relevant configuration settings: CONFIG_SAMV7_TWIHS0=y CONFIG_SAMV7_TWIHS0_FREQUENCY=100000 CONFIG_I2C=y CONFIG_I2C_TRANSFER=y CONFIG_SYSTEM_I2CTOOL=y CONFIG_I2CTOOL_MINBUS=0 CONFIG_I2CTOOL_MAXBUS=0 CONFIG_I2CTOOL_MINADDR=0x03 CONFIG_I2CTOOL_MAXADDR=0x77 CONFIG_I2CTOOL_MAXREGADDR=0xff CONFIG_I2CTOOL_DEFFREQ=400000 Example usage: nsh> i2c Usage: i2c [arguments] Where is one of: Show help : ? List busses : bus List devices : dev [OPTIONS] Read register : get [OPTIONS] [] Show help : help Write register: set [OPTIONS] [] Verify access : verf [OPTIONS] [] [] Where common "sticky" OPTIONS include: [-a addr] is the I2C device address (hex). Default: 03 Current: 03 [-b bus] is the I2C bus number (decimal). Default: 0 Current: 0 [-r regaddr] is the I2C device register address (hex). Default: 00 Current: 00 [-w width] is the data width (8 or 16 decimal). Default: 8 Current: 8 [-s|n], send/don't send start between command and data. Default: -n Current: -n [-i|j], Auto increment|don't increment regaddr on repititions. Default: NO Current: NO [-f freq] I2C frequency. Default: 400000 Current: 400000 NOTES: o An environment variable like $PATH may be used for any argument. o Arguments are "sticky". For example, once the I2C address is specified, that address will be re-used until it is changed. WARNING: o The I2C dev command may have bad side effects on your I2C devices. Use only at your own risk. nsh> i2c bus BUS EXISTS? Bus 0: YES nsh> i2c dev 3 77 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- 1a -- -- -- -- -- 20: -- -- -- -- -- -- -- -- 28 -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- 37 -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- 50: -- -- -- -- -- -- -- 57 -- -- -- -- -- -- -- 5f 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- nsh> Where 0x1a us the address of the WM8904 Audio CODEC and 0x5f is the address of the AT24 EEPROM (I am not sure what the others are as this writing). CAREFUL!!! You can trash your MAC address using the I2C tool! 5. Performance-related Configuration settings: CONFIG_ARMV7M_ICACHE=y : Instruction cache is enabled CONFIG_ARMV7M_DCACHE=y : Data cache is enabled CONFIG_ARCH_FPU=y : H/W floating point support is enabled CONFIG_ARCH_DPFPU=y : 64-bit H/W floating point support is enabled # CONFIG_ARMV7M_ITCM is not set : Support not yet in place # CONFIG_ARMV7M_DTCM is not set : Support not yet in place