2311 lines
95 KiB
Plaintext
2311 lines
95 KiB
Plaintext
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.
|
|
|
|
Additional support of provided for the (optional) maXTouch Xplained Pro LCD.
|
|
|
|
Contents
|
|
========
|
|
|
|
- Board Features
|
|
- Status/Open Issues
|
|
- Serial Console
|
|
- SD card
|
|
- Automounter
|
|
- LEDs and Buttons
|
|
- AT24MAC402 Serial EEPROM
|
|
- S25FL116K QuadSPI FLASH
|
|
- Program FLASH Access
|
|
- Networking
|
|
- USBHS Device Controller Driver
|
|
- Audio Interface
|
|
- maXTouch Xplained Pro
|
|
- MCAN1 Loopback Test
|
|
- SPI Slave
|
|
- Tickless OS
|
|
- 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 website for further information about this board:
|
|
|
|
- http://www.atmel.com/tools/atsamv71-xult.aspx
|
|
|
|
Status/Open Issues
|
|
==================
|
|
|
|
I would characterize the general port as very mature and stable. However,
|
|
there are a number of issues, caveats, and unfinished drivers as detailed in
|
|
the following paragraphs.
|
|
|
|
The BASIC nsh configuration is fully function (as described below under
|
|
"Configurations"). There is also a graphics configuration (mxtxplnd), a
|
|
a configuration for network testing (netnsh), a graphics demo (nxwm), and
|
|
a sample protected mode build (knsh). There are still open issues that need
|
|
to be resolved. General problems are listed below. But see the STATUS
|
|
section associated with each configuration for additional issues specific
|
|
to a particular configuration.
|
|
|
|
1. HSCMI. CONFIG_MMCSD_MULTIBLOCK_DISABLE=y is set to disable multi-block
|
|
transfers only because I have not yet had a chance to verify this. The
|
|
is very low priority to me but might be important to you if you are need
|
|
very high performance SD card accesses.
|
|
|
|
2. HSMCI TX DMA is currently disabled for the SAMV7. There is some
|
|
issue with the TX DMA setup. This is a bug that needs to be resolved.
|
|
|
|
DMA is enabled by these settings in the file arch/arm/src/samv7/sam_hsmci.c:
|
|
|
|
#undef HSCMI_NORXDMA /* Define to disable RX DMA */
|
|
#define HSCMI_NOTXDMA 1 /* Define to disable TX DMA */
|
|
|
|
3. There may also be some issues with removing and re-inserting SD cards
|
|
(of course with appropriate mounting and unmounting). I all not sure
|
|
of this and need to do more testing to characterize if the issue.
|
|
|
|
4. There is a port of the SAMA5D4-EK Ethernet driver to the SAMV71-XULT.
|
|
This driver appears to be 100% functional with the following caveats:
|
|
|
|
- There is a compiler optimization issue. At -O2, there is odd
|
|
behavior on pings and ARP messages. But the behavior is OK with
|
|
optimization set to -O2. This may or may not be a compiler
|
|
optimization issue (it could also be a timing issue or a need
|
|
for some additional volatile qualifiers).
|
|
|
|
Update: I have switch toolchains and no longer see this issue. This
|
|
is probably not a driver-related issue.
|
|
|
|
- I- and D-Caches are enabled but the D-Cache must be enabled in
|
|
write-through mode. This is to work around issues with the RX and TX
|
|
descriptors with are 8-bytes in size. But the D-Cache cache line size
|
|
is 32-bytes. That means that you cannot reload, clean or invalidate a
|
|
descriptor without also effecting three neighboring descriptors.
|
|
Setting write through mode eliminates the need for cleaning the D-Cache.
|
|
If only reloading and invalidating are done, then there is no problem.
|
|
|
|
5. The USBHS device controller driver (DCD) is also fully functional. It
|
|
has only be tested with the CDC/ACM driver as described below. Like
|
|
the Ethernet driver:
|
|
|
|
- This driver does not work reliably with the write back D-Cache. The
|
|
write-through D-Cache must be enabled.
|
|
|
|
- As of this writing (2015-08-22), the USBHS only works in full speed
|
|
mode (aka, USBHS Low-Power mode). When configured in normal mode,
|
|
SETUP packets are no longer received or responded to; the firmware
|
|
only detects bus reset events. This is probably some issue with
|
|
480MHZ high speed clock setup, but I have not yet found the issue.
|
|
|
|
6. The full port for audio support is code complete: WM8904 driver,
|
|
SSC/I2C driver, and CS2100-CP driver. But this code is untested. The
|
|
WM8904 interface was taken directly from the SAMA5D4-EK and may well
|
|
need modification due to differences with the physical WM8904
|
|
interface.
|
|
|
|
7. An MCAN driver as added and verified on 2015-08-08 using the loopback
|
|
test at apps/examples/can. Like the Ethernet driver, the MCAN driver
|
|
does not work if the D-Cache is configured in write-back mode; write-
|
|
through mode is required.
|
|
|
|
8. An SPI slave driver as added on 2015-08-09 but has not been verified
|
|
as of this writing. See discussion in include/nuttx/spi/slave.h and
|
|
in the section entitle "SPI Slave" below.
|
|
|
|
9. A QSPI FLASH driver was added and verifed on 2015-11-10. This driver
|
|
operated in the memory mapped Serial Memory Mode (SMM). See the
|
|
"S25FL116K QuadSPI FLASH" section below for futher information.
|
|
|
|
10. On-chip FLASH support as added and verified on 2015-11-13. See the
|
|
"Program FLASH Access" section below for further information.
|
|
|
|
11. The knsh "protected mode" configuration was added on 2015-11-18. The
|
|
configuration has not been tested as of this writing.
|
|
|
|
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
|
|
------ ------ ------- ------- --------
|
|
|
|
In this configuration, an external RS232 driver can also be used
|
|
instead of the shield. Simply connext as follows:
|
|
|
|
--------- -----------
|
|
Arduino RS-232
|
|
Pin Label Connection
|
|
--------- -----------
|
|
D0 (RXD) RX
|
|
D1 (TXD) TX
|
|
GND GND
|
|
5VO Vcc
|
|
--------- -----------
|
|
|
|
- Arduino Communications. Additional UART/USART connections are available
|
|
on the Arduino Communications connection J505:
|
|
|
|
------ ------ ------- ------- --------
|
|
Pin on SAMV71 Arduino Arduino SAMV71
|
|
J503 PIO Name Pin Function
|
|
------ ------ ------- ------- --------
|
|
3 PD18 RX1 0 URXD4
|
|
4 PD19 TX1 0 UTXD4
|
|
5 PD15 RX2 0 RXD2
|
|
6 PD16 TX2 0 TXD2
|
|
7 PB0 RX3 0 RXD0
|
|
8 PB1 TX3 1 TXD0
|
|
------ ------ ------- ------- --------
|
|
|
|
- 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.
|
|
|
|
NOTE: If USART1 is used (TXD1, RXD1), then PB4 must be reconfigured in the
|
|
SUPC. Normally, PB4 is TDI. When it is reconfigured for use with USART1,
|
|
the capability to debug is lost! If you plan to debug you should most
|
|
certainly not use USART1.
|
|
|
|
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_GPIO_IRQ=y : PIO interrupts needed
|
|
CONFIG_SAMV7_GPIOD_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_SAMV71XULT_HSMCI0_AUTOMOUNT=y
|
|
CONFIG_SAMV71XULT_HSMCI0_AUTOMOUNT_FSTYPE="vfat"
|
|
CONFIG_SAMV71XULT_HSMCI0_AUTOMOUNT_BLKDEV="/dev/mmcsd0"
|
|
CONFIG_SAMV71XULT_HSMCI0_AUTOMOUNT_MOUNTPOINT="/mnt/sdcard"
|
|
CONFIG_SAMV71XULT_HSMCI0_AUTOMOUNT_DDELAY=1000
|
|
CONFIG_SAMV71XULT_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
|
|
========================
|
|
|
|
Ethernet MAC Address
|
|
--------------------
|
|
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 addresses of the AT24 part are 0b1010AAA for the normal 2Kbit
|
|
memory and 0b1011aaa for the "extended memory" 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.
|
|
|
|
Configuration
|
|
-------------
|
|
|
|
System Type -> SAMV7 Peripheral Support
|
|
CONFIG_SAMV7_TWIHS0=y : Used to access the EEPROM
|
|
CONFIG_SAMV7_TWIHS0_FREQUENCY=100000
|
|
|
|
Device drivers -> Memory Technology Devices
|
|
CONFIG_MTD_AT24XX=y : Enable the AT24 device driver
|
|
CONFIG_AT24XX_SIZE=2 : Normal EEPROM is 2Kbit (256b)
|
|
CONFIG_AT24XX_ADDR=0x57 : Normal EEPROM address */
|
|
CONFIG_AT24XX_EXTENDED=y : Supports an extended memory region
|
|
CONFIG_AT24XX_EXTSIZE=160 : Extended address up to 0x9f
|
|
|
|
MTD Configuration Data
|
|
----------------------
|
|
The AT24 EEPROM can also be used to storage of up to 256 bytes of
|
|
configuration data:
|
|
|
|
Device drivers -> Memory Technology Devices
|
|
|
|
The configuration data device will appear at /dev/config.
|
|
|
|
S25FL116K QuadSPI FLASH
|
|
====================
|
|
|
|
A QSPI FLASH driver was added and verifed on 2015-11-07. This driver
|
|
operated in the memory mapped Serial Memory Mode (SMM). These
|
|
configuration options were enabled to test QSPI:
|
|
|
|
CONFIG_SAMV7_QSPI=y
|
|
CONFIG_SAMV7_QSPI_DLYBCT=0
|
|
CONFIG_SAMV7_QSPI_DLYBS=0
|
|
CONFIG_SAMV7_QSPI_DMA=y
|
|
CONFIG_SAMV7_QSPI_DMATHRESHOLD=8
|
|
|
|
The MPU must be enabled to use QSPI:
|
|
|
|
CONFIG_ARCH_USE_MPU=y
|
|
CONFIG_ARM_MPU=y
|
|
CONFIG_ARM_MPU_NREGIONS=16
|
|
|
|
And there options enable the driver for the on-board S25FL116K QuadSPI
|
|
FLASH:
|
|
|
|
CONFIG_MTD_S25FL1=y
|
|
CONFIG_S25FL1_QSPIMODE=0
|
|
CONFIG_S25FL1_QSPI_FREQUENCY=108000000
|
|
|
|
SmartFS
|
|
-------
|
|
The SmartFS file system is selected with the following settings.
|
|
|
|
CONFIG_FS_SMARTFS=y
|
|
CONFIG_SMARTFS_ERASEDSTATE=0xff
|
|
CONFIG_SMARTFS_MAXNAMLEN=16
|
|
|
|
CONFIG_MTD_SMART=y
|
|
CONFIG_MTD_SMART_SECTOR_SIZE=512
|
|
CONFIG_MTD_SMART_WEAR_LEVEL=y
|
|
|
|
Upon boot, the on-board S25FL116k flash device will appears as:
|
|
|
|
/dev/smart0
|
|
|
|
Before SmartFS can be used, it must be formatted. So this command
|
|
must be used one time the first time that the system boots:
|
|
|
|
nsh> mksmartfs /dev/smart0
|
|
|
|
Then it can be mounted using the following NSH command:
|
|
|
|
nsh> mount -t smartfs /dev/smart0 /mnt/qspi
|
|
|
|
The first time that you boot the system, there will be a long delay
|
|
before the nsh> prompt. That long delay is SmartFS scanning the
|
|
large FLASH part. Likewise, the when you format the SmartFS, you
|
|
also expect a significant delay.
|
|
|
|
A better application design would perform SmartFS initialization
|
|
asynchronously on a separate thread to avoid the delay at the user
|
|
interface.
|
|
|
|
NXFFS
|
|
-----
|
|
The NXFFS file system is selected with the following settings.
|
|
|
|
CONFIG_FS_NXFFS=y
|
|
CONFIG_NXFFS_ERASEDSTATE=0xff
|
|
CONFIG_NXFFS_MAXNAMLEN=255
|
|
CONFIG_NXFFS_PACKTHRESHOLD=32
|
|
CONFIG_NXFFS_PREALLOCATED=y
|
|
CONFIG_NXFFS_TAILTHRESHOLD=8192
|
|
|
|
The NXFFS file system is automatically mounted by logic src/sam_bringup.c when the system boots:
|
|
|
|
nsh> mount
|
|
/mnt/s25fl1 type nxffs
|
|
nsh> echo "This is a test" >/mnt/s25fl1/atest.txt
|
|
nsh> ls /mnt/s25fl1
|
|
/mnt/s25fl1:
|
|
atest.txt
|
|
nsh> cat /mnt/s25fl1/atest.txt
|
|
This is a test
|
|
|
|
Character Driver
|
|
----------------
|
|
If neither SmartFS nor NXFFS are defined, then the S25FL1 driver will be
|
|
wrapped as a character driver and available as /dev/mtd0.
|
|
|
|
Program FLASH Access
|
|
====================
|
|
An on-chip FLASH driver was added and verifed on 2015-11-13. These
|
|
configuration options were enabled to test the on-chip FLASH support:
|
|
|
|
CONFIG_MTD_PROGMEM=y
|
|
CONFIG_SAMV7_PROGMEM=y
|
|
CONFIG_SAMV7_PROGMEM_NSECTORS=8
|
|
|
|
D-Cache must be configured in write-through mode:
|
|
|
|
CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y
|
|
|
|
The total FLASH on the SAMV71 is organized as 128KB/sector x 16 sectors
|
|
= 2MB. The sectors are all uniform (except for sector zero which will
|
|
never be used by the driver).
|
|
|
|
The configuration sets aside 8 sectors, or 8 * 128KB = 1MB of the FLASH
|
|
for programmable memory (CONFIG_SAMV7_PROGMEM_NSECTORS=8). The exact
|
|
number of sectors set aside is optional.
|
|
|
|
NOTE: Ideally, one should also modify the linker script and reduce the size
|
|
of the available FLASH the amount set aside for program usage to avoid
|
|
difficult run-time problems. That would be 1MB in this configuration. I
|
|
did not do that only because I know that my test program is small.
|
|
|
|
When the system boots, you can see the FLASH driver:
|
|
|
|
NuttShell (NSH) NuttX-7.12
|
|
nsh> ls /dev
|
|
/dev:
|
|
config
|
|
console
|
|
mmcsd0
|
|
mtd1
|
|
mtdblock1
|
|
null
|
|
ttyS0
|
|
|
|
/dev/mtdblock1 is a block driver that can be used with any file system on
|
|
the FLASH; /dev/mtd1 is the corresponding character driver used by the
|
|
apps/examples/media test.
|
|
|
|
Each of the uniform sectors is divided up into 256 512B "pages". This is
|
|
not really useful, however, because we can only erase a minimum of groups
|
|
of 16 pages or 8KB. In the code, I you will see that I refer to these
|
|
groups of 16 pages as "clusters." So the cluster is the smallest thing
|
|
that you can perform a read/write/modify operation on.
|
|
|
|
Using 8 sectors yields 16 *8 = 128 clusters (aka blocks). You can see
|
|
this when the apps/examples/media test runs:
|
|
|
|
nsh> media
|
|
MTD Geometry:
|
|
blocksize: 8192
|
|
erasesize: 8192
|
|
neraseblocks: 128
|
|
Using:
|
|
blocksize: 8192
|
|
nblocks: 128
|
|
Write/Verify: Block 0
|
|
Write/Verify: Block 1
|
|
Write/Verify: Block 2
|
|
Write/Verify: Block 3
|
|
...
|
|
Write/Verify: Block 127
|
|
Re-read/Verify: Block 0
|
|
Re-read/Verify: Block 1
|
|
Re-read/Verify: Block 2
|
|
Re-read/Verify: Block 3
|
|
...
|
|
Re-read/Verify: Block 127
|
|
nsh>
|
|
|
|
NOTE: The media test can be added to the NSH configuration with:
|
|
|
|
CONFIG_EXAMPLES_MEDIA=y
|
|
CONFIG_EXAMPLES_MEDIA_BLOCKSIZE=8192
|
|
CONFIG_EXAMPLES_MEDIA_DEVPATH="/dev/mtd1"
|
|
|
|
Networking
|
|
==========
|
|
|
|
KSZ8061RNBVA Connections
|
|
------------------------
|
|
|
|
------ --------- --------- --------------------------
|
|
SAMV71 SAMV71 Ethernet Shared functionality
|
|
Pin Function Function
|
|
------ --------- --------- --------------------------
|
|
PD00 GTXCK REF_CLK Shield
|
|
PD01 GTXEN TXEN
|
|
PD02 GTX0 TXD0
|
|
PD03 GTX1 TXD1
|
|
PD04 GRXDV CRS_DV Trace
|
|
PD05 GRX0 RXD0 Trace
|
|
PD06 GRX1 RXD1 Trace
|
|
PD07 GRXER RXER Trace
|
|
PD08 GMDC MDC Trace
|
|
PD09 GMDIO MDIO
|
|
PA19 GPIO INTERRUPT EXT1, Shield
|
|
PA29 GPIO SIGDET
|
|
PC10 GPIO RESET
|
|
------ --------- --------- --------------------------
|
|
|
|
Selecting the GMAC peripheral
|
|
-----------------------------
|
|
|
|
System Type -> SAMV7 Peripheral Support
|
|
CONFIG_SAMV7_EMAC0=y : Enable the GMAC peripheral (aka, EMAC0)
|
|
CONFIG_SAMV7_TWIHS0=y : We will get the MAC address from the AT24 EEPROM
|
|
CONFIG_SAMV7_TWIHS0_FREQUENCY=100000
|
|
|
|
System Type -> EMAC device driver options
|
|
CONFIG_SAMV7_EMAC0_NRXBUFFERS=16 : Set aside some RS and TX buffers
|
|
CONFIG_SAMV7_EMAC0_NTXBUFFERS=8
|
|
CONFIG_SAMV7_EMAC0_RMII=y : The RMII interfaces is used on the board
|
|
CONFIG_SAMV7_EMAC0_AUTONEG=y : Use autonegotiation
|
|
CONFIG_SAMV7_EMAC0_PHYADDR=1 : KSZ8061 PHY is at address 1
|
|
CONFIG_SAMV7_EMAC0_PHYSR=30 : Address of PHY status register on KSZ8061
|
|
CONFIG_SAMV7_EMAC0_PHYSR_ALTCONFIG=y : Needed for KSZ8061
|
|
CONFIG_SAMV7_EMAC0_PHYSR_ALTMODE=0x7 : " " " " " "
|
|
CONFIG_SAMV7_EMAC0_PHYSR_10HD=0x1 : " " " " " "
|
|
CONFIG_SAMV7_EMAC0_PHYSR_100HD=0x2 : " " " " " "
|
|
CONFIG_SAMV7_EMAC0_PHYSR_10FD=0x5 : " " " " " "
|
|
CONFIG_SAMV7_EMAC0_PHYSR_100FD=0x6 : " " " " " "
|
|
|
|
PHY selection. Later in the configuration steps, you will need to select
|
|
the KSZ8061 PHY for EMAC (See below)
|
|
|
|
Networking Support
|
|
CONFIG_NET=y : Enable Neworking
|
|
CONFIG_NET_NOINTS=y : Use the work queue, not interrupts for processing
|
|
CONFIG_NET_SOCKOPTS=y : Enable socket operations
|
|
CONFIG_NET_ETH_MTU=562 : Maximum packet size (MTU) 1518 is more standard
|
|
CONFIG_NET_ETH_TCP_RECVWNDO=562 : Should be the same as CONFIG_NET_ETH_MTU
|
|
CONFIG_NET_ARP=y : ARP support should be enabled
|
|
CONFIG_NET_ARP_SEND=y : Use ARP to get peer address before sending
|
|
CONFIG_NET_TCP=y : Enable TCP/IP networking
|
|
CONFIG_NET_TCPBACKLOG=y : Support TCP/IP backlog
|
|
CONFIG_NET_TCP_READAHEAD=y : Enable TCP read-ahead buffering
|
|
CONFIG_NET_TCP_WRITE_BUFFERS=y : Enable TCP write buffering
|
|
CONFIG_NET_UDP=y : Enable UDP networking
|
|
CONFIG_NET_BROADCAST=y : Support UDP broadcase packets
|
|
CONFIG_NET_ICMP=y : Enable ICMP networking
|
|
CONFIG_NET_ICMP_PING=y : Needed for NSH ping command
|
|
: Defaults should be okay for other options
|
|
Device drivers -> Network Device/PHY Support
|
|
CONFIG_NETDEVICES=y : Enabled PHY selection
|
|
CONFIG_ETH0_PHY_KSZ8061=y : Select the KSZ8061 PHY used with EMAC0
|
|
|
|
Device drivers -> Memory Technology Devices
|
|
CONFIG_MTD_AT24XX=y : Enable the AT24 device driver
|
|
CONFIG_AT24XX_SIZE=2 : Normal EEPROM is 2Kbit (256b)
|
|
CONFIG_AT24XX_ADDR=0x57 : Normal EEPROM address */
|
|
CONFIG_AT24XX_EXTENDED=y : Supports an extended memory region
|
|
CONFIG_AT24XX_EXTSIZE=160 : Extended address up to 0x9f
|
|
|
|
RTOS Features ->Work Queue Support
|
|
CONFIG_SCHED_WORKQUEUE=y : Work queue support is needed
|
|
CONFIG_SCHED_HPWORK=y
|
|
CONFIG_SCHED_HPWORKSTACKSIZE=2048 : Might need to be increased
|
|
|
|
Application Configuration -> Network Utilities
|
|
CONFIG_NETDB_DNSCLIENT=y : Enable host address resolution
|
|
CONFIG_NETUTILS_TELNETD=y : Enable the Telnet daemon
|
|
CONFIG_NETUTILS_TFTPC=y : Enable TFTP data file transfers for get and put commands
|
|
CONFIG_NETUTILS_NETLIB=y : Network library support is needed
|
|
CONFIG_NETUTILS_WEBCLIENT=y : Needed for wget support
|
|
: Defaults should be okay for other options
|
|
Application Configuration -> NSH Library
|
|
CONFIG_NSH_TELNET=y : Enable NSH session via Telnet
|
|
CONFIG_NSH_IPADDR=0x0a000002 : Select an IP address
|
|
CONFIG_NSH_DRIPADDR=0x0a000001 : IP address of gateway/host PC
|
|
CONFIG_NSH_NETMASK=0xffffff00 : Netmask
|
|
CONFIG_NSH_NOMAC=n : We will get the IP address from EEPROM
|
|
: Defaults should be okay for other options
|
|
|
|
Cache-Related Issues
|
|
--------------------
|
|
|
|
I- and D-Caches can be enabled but the D-Cache must be enabled in write-
|
|
through mode. This is to work around issues with the RX and TX descriptors
|
|
with are 8-bytes in size. But the D-Cache cache line size is 32-bytes.
|
|
That means that you cannot reload, clean or invalidate a descriptor without
|
|
also effecting three neighboring descriptors. Setting write through mode
|
|
eliminates the need for cleaning the D-Cache. If only reloading and
|
|
invalidating are done, then there is no problem.
|
|
|
|
Using the network with NSH
|
|
--------------------------
|
|
|
|
So what can you do with this networking support? First you see that
|
|
NSH has several new network related commands:
|
|
|
|
ifconfig, ifdown, ifup: Commands to help manage your network
|
|
get and put: TFTP file transfers
|
|
wget: HTML file transfers
|
|
ping: Check for access to peers on the network
|
|
Telnet console: You can access the NSH remotely via telnet.
|
|
|
|
You can also enable other add on features like full FTP or a Web
|
|
Server or XML RPC and others. There are also other features that
|
|
you can enable like DHCP client (or server) or network name
|
|
resolution.
|
|
|
|
By default, the IP address of the SAMV71-XULT will be 10.0.0.2 and
|
|
it will assume that your host is the gateway and has the IP address
|
|
10.0.0.1.
|
|
|
|
nsh> ifconfig
|
|
eth0 HWaddr 00:e0:de:ad:be:ef at UP
|
|
IPaddr:10.0.0.2 DRaddr:10.0.0.1 Mask:255.255.255.0
|
|
|
|
You can use ping to test for connectivity to the host (Careful,
|
|
Window firewalls usually block ping-related ICMP traffic). On the
|
|
target side, you can:
|
|
|
|
nsh> ping 10.0.0.1
|
|
PING 10.0.0.1 56 bytes of data
|
|
56 bytes from 10.0.0.1: icmp_seq=1 time=0 ms
|
|
56 bytes from 10.0.0.1: icmp_seq=2 time=0 ms
|
|
56 bytes from 10.0.0.1: icmp_seq=3 time=0 ms
|
|
56 bytes from 10.0.0.1: icmp_seq=4 time=0 ms
|
|
56 bytes from 10.0.0.1: icmp_seq=5 time=0 ms
|
|
56 bytes from 10.0.0.1: icmp_seq=6 time=0 ms
|
|
56 bytes from 10.0.0.1: icmp_seq=7 time=0 ms
|
|
56 bytes from 10.0.0.1: icmp_seq=8 time=0 ms
|
|
56 bytes from 10.0.0.1: icmp_seq=9 time=0 ms
|
|
56 bytes from 10.0.0.1: icmp_seq=10 time=0 ms
|
|
10 packets transmitted, 10 received, 0% packet loss, time 10100 ms
|
|
|
|
NOTE: In this configuration is is normal to have packet loss > 0%
|
|
the first time you ping due to the default handling of the ARP
|
|
table.
|
|
|
|
On the host side, you should also be able to ping the SAMV71-XULT:
|
|
|
|
$ ping 10.0.0.2
|
|
|
|
You can also log into the NSH from the host PC like this:
|
|
|
|
$ telnet 10.0.0.2
|
|
Trying 10.0.0.2...
|
|
Connected to 10.0.0.2.
|
|
Escape character is '^]'.
|
|
sh_telnetmain: Session [3] Started
|
|
|
|
NuttShell (NSH) NuttX-7.9
|
|
nsh> help
|
|
help usage: help [-v] [<cmd>]
|
|
|
|
[ echo ifconfig mkdir mw sleep
|
|
? exec ifdown mkfatfs ping test
|
|
cat exit ifup mkfifo ps umount
|
|
cp free kill mkrd put usleep
|
|
cmp get losetup mh rm wget
|
|
dd help ls mount rmdir xd
|
|
df hexdump mb mv sh
|
|
|
|
Builtin Apps:
|
|
nsh>
|
|
|
|
NOTE: If you enable this feature, you experience a delay on booting.
|
|
That is because the start-up logic waits for the network connection
|
|
to be established before starting NuttX. In a real application, you
|
|
would probably want to do the network bringup on a separate thread
|
|
so that access to the NSH prompt is not delayed.
|
|
|
|
This delay will be especially long if the board is not connected to
|
|
a network. On the order of a minute! You will probably think that
|
|
NuttX has crashed! And then, when it finally does come up, the
|
|
network will not be available.
|
|
|
|
Network Initialization Thread
|
|
-----------------------------
|
|
There is a configuration option enabled by CONFIG_NSH_NETINIT_THREAD
|
|
that will do the NSH network bring-up asynchronously in parallel on
|
|
a separate thread. This eliminates the (visible) networking delay
|
|
altogether. This networking initialization feature by itself has
|
|
some limitations:
|
|
|
|
- If no network is connected, the network bring-up will fail and
|
|
the network initialization thread will simply exit. There are no
|
|
retries and no mechanism to know if the network initialization was
|
|
successful.
|
|
|
|
- Furthermore, there is no support for detecting loss of the network
|
|
connection and recovery of networking when the connection is restored.
|
|
|
|
Both of these shortcomings can be eliminated by enabling the network
|
|
monitor:
|
|
|
|
Network Monitor
|
|
---------------
|
|
By default the network initialization thread will bring-up the network
|
|
then exit, freeing all of the resources that it required. This is a
|
|
good behavior for systems with limited memory.
|
|
|
|
If the CONFIG_NSH_NETINIT_MONITOR option is selected, however, then the
|
|
network initialization thread will persist forever; it will monitor the
|
|
network status. In the event that the network goes down (for example, if
|
|
a cable is removed), then the thread will monitor the link status and
|
|
attempt to bring the network back up. In this case the resources
|
|
required for network initialization are never released.
|
|
|
|
Pre-requisites:
|
|
|
|
- CONFIG_NSH_NETINIT_THREAD as described above.
|
|
|
|
- CONFIG_NETDEV_PHY_IOCTL. Enable PHY IOCTL commands in the Ethernet
|
|
device driver. Special IOCTL commands must be provided by the Ethernet
|
|
driver to support certain PHY operations that will be needed for link
|
|
management. There operations are not complex and are implemented for
|
|
the Atmel SAMV7 family.
|
|
|
|
- CONFIG_ARCH_PHY_INTERRUPT. This is not a user selectable option.
|
|
Rather, it is set when you select a board that supports PHY interrupts.
|
|
In most architectures, the PHY interrupt is not associated with the
|
|
Ethernet driver at all. Rather, the PHY interrupt is provided via some
|
|
board-specific GPIO and the board-specific logic must provide support
|
|
for that GPIO interrupt. To do this, the board logic must do two things:
|
|
(1) It must provide the function arch_phy_irq() as described and
|
|
prototyped in the nuttx/include/nuttx/arch.h, and (2) it must select
|
|
CONFIG_ARCH_PHY_INTERRUPT in the board configuration file to advertise
|
|
that it supports arch_phy_irq(). This logic can be found at
|
|
nuttx/configs/samv71-xult/src/sam_ethernet.c.
|
|
|
|
- And a few other things: UDP support is required (CONFIG_NET_UDP) and
|
|
signals must not be disabled (CONFIG_DISABLE_SIGNALS).
|
|
|
|
Given those prerequisites, the network monitor can be selected with these
|
|
additional settings.
|
|
|
|
Networking Support -> Networking Device Support
|
|
CONFIG_NETDEV_PHY_IOCTL=y : Enable PHY ioctl support
|
|
|
|
Application Configuration -> NSH Library -> Networking Configuration
|
|
CONFIG_NSH_NETINIT_THREAD : Enable the network initialization thread
|
|
CONFIG_NSH_NETINIT_MONITOR=y : Enable the network monitor
|
|
CONFIG_NSH_NETINIT_RETRYMSEC=2000 : Configure the network monitor as you like
|
|
CONFIG_NSH_NETINIT_SIGNO=18
|
|
|
|
USBHS Device Controller Driver
|
|
==============================
|
|
The USBHS device controller driver is enabled with he following configuration
|
|
settings:
|
|
|
|
Device Drivers -> USB Device Driver Support
|
|
CONFIG_USBDEV=y : Enable USB device support
|
|
For full-speed/low-power mode:
|
|
CONFIG_USBDEV_DUALSPEED=n : Disable High speed support
|
|
For high-speed/normal mode:
|
|
CONFIG_USBDEV_DUALSPEED=y : Enable High speed support
|
|
CONFIG_USBDEV_DMA=y : Enable DMA methods
|
|
CONFIG_USBDEV_MAXPOWER=100 : Maximum power consumption
|
|
CONFIG_USBDEV_SELFPOWERED=y : Self-powered device
|
|
|
|
System Type -> SAMV7 Peripheral Selection
|
|
CONFIG_SAMV7_USBDEVHS=y
|
|
|
|
System Type -> SAMV7 USB High Sppeed Device Controller (DCD options
|
|
For full-speed/low-power mode:
|
|
CONFIG_SAMV7_USBDEVHS_LOWPOWER=y : Select low power mode
|
|
For high-speed/normal mode:
|
|
CONFIG_SAMV7_USBDEVHS_LOWPOWER=n : Don't select low power mode
|
|
CONFIG_SAMV7_USBHS_NDTDS=32 : Number of DMA transfer descriptors
|
|
CONFIG_SAMV7_USBHS_PREALLOCATE=y : Pre-allocate descriptors
|
|
|
|
As noted above, this driver will not work correctly if the write back
|
|
data cache is enabled. You must have:
|
|
|
|
CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y
|
|
|
|
In order to be usable, you must all enabled some class driver(s) for the
|
|
USBHS device controller. Here, for example, is how to configure the CDC/ACM
|
|
serial device class:
|
|
|
|
Device Drivers -> USB Device Driver Support
|
|
CONFIG_CDCACM=y : USB Modem (CDC ACM) support
|
|
CONFIG_CDCACM_EP0MAXPACKET=64 : Enpoint 0 packet size
|
|
CONFIG_CDCACM_EPINTIN=1 : Interrupt IN endpoint number
|
|
CONFIG_CDCACM_EPINTIN_FSSIZE=64 : Full speed packet size
|
|
CONFIG_CDCACM_EPINTIN_HSSIZE=64 : High speed packet size
|
|
CONFIG_CDCACM_EPBULKOUT=3 : Bulk OUT endpoint number
|
|
CONFIG_CDCACM_EPBULKOUT_FSSIZE=64 : Full speed packet size
|
|
CONFIG_CDCACM_EPBULKOUT_HSSIZE=512 : High speed packet size
|
|
CONFIG_CDCACM_EPBULKIN=2 : Bulk IN endpoint number
|
|
CONFIG_CDCACM_EPBULKIN_FSSIZE=64 : Full speed packet size
|
|
CONFIG_CDCACM_EPBULKIN_HSSIZE=512 : High speed packet size
|
|
CONFIG_CDCACM_NWRREQS=4 : Number of write requests
|
|
CONFIG_CDCACM_NRDREQS=8 : Number of read requests
|
|
CONFIG_CDCACM_BULKIN_REQLEN=96 : Size of write request buffer (for full speed)
|
|
CONFIG_CDCACM_BULKIN_REQLEN=768 : Size of write request buffer (for high speed)
|
|
CONFIG_CDCACM_RXBUFSIZE=257 : Serial read buffer size
|
|
CONFIG_CDCACM_TXBUFSIZE=193 : Serial transmit buffer size (for full speed)
|
|
CONFIG_CDCACM_TXBUFSIZE=769 : Serial transmit buffer size (for high speed)
|
|
CONFIG_CDCACM_VENDORID=0x0525 : Vendor ID
|
|
CONFIG_CDCACM_PRODUCTID=0xa4a7 : Product ID
|
|
CONFIG_CDCACM_VENDORSTR="NuttX" : Vendor string
|
|
CONFIG_CDCACM_PRODUCTSTR="CDC/ACM Serial" : Product string
|
|
|
|
Device Drivers -> Serial Driver Support
|
|
CONFIG_SERIAL_REMOVABLE=y : Support for removable serial device
|
|
|
|
The CDC/ACM application provides commands to connect and disconnect the
|
|
CDC/ACM serial device:
|
|
|
|
CONFIG_SYSTEM_CDCACM=y : Enable connect/disconnect support
|
|
CONFIG_SYSTEM_CDCACM_DEVMINOR=0 : Use device /dev/ttyACM0
|
|
CONFIG_CDCACM_RXBUFSIZE=??? : A large RX may be needed
|
|
|
|
If you include this CDC/ACM application, then you can connect the CDC/ACM
|
|
serial device to the host by entering the command 'sercon' and you detach
|
|
the serial device with the command 'serdis'. If you do no use this
|
|
application, they you will have to write logic in your board initialization
|
|
code to initialize and attach the USB device.
|
|
|
|
Audio Interface
|
|
===============
|
|
|
|
WM8904 Audio Codec
|
|
------------------
|
|
|
|
SAMV71 Interface WM8904 Interface
|
|
---- ------------ ------- ----------------------------------
|
|
PIO Usage Pin Function
|
|
---- ------------ ------- ----------------------------------
|
|
PA3 TWD0 SDA I2C control interface, data line
|
|
PA4 TWCK0 SCLK I2C control interface, clock line
|
|
PA10 RD ADCDAT Digital audio output (microphone)
|
|
PB18 PCK2 MCLK Master clock
|
|
PB0 TF LRCLK Left/right data alignment clock
|
|
PB1 TK BCLK Bit clock, for synchronization
|
|
PD11 GPIO IRQ Audio interrupt
|
|
PD24 RF LRCLK Left/right data alignment clock
|
|
PD26 TD DACDAT Digital audio input (headphone)
|
|
---- ------------ ------- ----------------------------------
|
|
|
|
CP2100-CP Fractional-N Clock Multiplier
|
|
--------------------------------------
|
|
|
|
SAMV71 Interface CP2100-CP Interface
|
|
---- ------------ ------- ----------------------------------
|
|
PIO Usage Pin Function
|
|
---- ------------ ------- ----------------------------------
|
|
PA3 TWD0 SDA I2C control interface, data line
|
|
PA4 TWCK0 SCLK I2C control interface, clock line
|
|
PD21 TIOA11 CLK_IN PLL input
|
|
- - XTI/XTO 12.0MHz crystal
|
|
PA22 RK CLK_OUT PLL output
|
|
- - AUX_OUT N/C
|
|
---- ------------ ------- ----------------------------------
|
|
|
|
maXTouch Xplained Pro
|
|
=====================
|
|
|
|
Testing has also been performed using the maXTouch Xplained Pro LCD
|
|
(ATMXT-XPRO).
|
|
|
|
**************************************************************************
|
|
* WARNING: *
|
|
* The maXTouch chip was not configured on all of the maXTouch Xplained *
|
|
* Pro boards that I have used (which is two). The maXTouch is *
|
|
* completely non-functional with no configuration in its NV memory! *
|
|
* *
|
|
* My understanding is that this configuration can be set on Linux *
|
|
* using the mxp-app program which is available on GitHub. There is an *
|
|
* (awkward) way to do this with NuttX too. In order to set the *
|
|
* maXTouch configuration with Nuttx you need to do these things: *
|
|
* *
|
|
* - Copy the function atmxt_config() from the file *
|
|
* configs/samv71-xult/src/atmxt_config.c into the file *
|
|
* drivers/input/mxt.c *
|
|
* - Add a call to atmxt_config() in drivers/input/mxt.c in the *
|
|
* function mxt_register() just before the touchscreen device is *
|
|
* registered (i.e, the call to register_driver()). *
|
|
* - Run the code one time. Your maXTouch is configured and should *
|
|
* now work. *
|
|
* - Don't forget to remove atmxt_config() from drivers/input/mxt.c and *
|
|
* restore driver as it was. *
|
|
* *
|
|
**************************************************************************
|
|
|
|
|
|
maXTouch Xplained Pro Standard Extension Header
|
|
-----------------------------------------------
|
|
The LCD could be connected either via EXT1 or EXT2 using the 2x10 20-pin
|
|
cable and the maXTouch Xplained Pro standard extension header. Access would
|
|
then be performed in SPI mode.
|
|
|
|
NOTE: There is currently no support for use of the LCD in SPI mode. See
|
|
the next paragraph where the LCD/EXT4 connection is discussion.
|
|
|
|
NOTE the 3 switch mode selector on the back of the maXtouch. All switches
|
|
should be in the ON position to select 4-wire SPI mode.
|
|
|
|
---- -------- ---- ----------- ---- ----------- ------------------------------------------
|
|
SAMV71-XULT maxTouch Xplained Pro
|
|
PIN FUNCTION EXT1 FUNC EXT2 FUNC Description
|
|
---- -------- ---- ----------- ---- ----------- ------------------------------------------
|
|
1 ID - - - - Communication line to ID chip
|
|
2 GND - - - - Ground
|
|
3 N/C PC31 - PD30 -
|
|
4 N/C PA19 - PC13 -
|
|
5 GPIO PB3 GPIO PA6 GPIO Command/Data Select
|
|
6 N/C PB2 - PD11 -
|
|
7 PWM PA0 PWMC0_PWMH0 PC19 PWMC0_PMWH2 Backlight control
|
|
8 N/C PC30 - PD26 -
|
|
9 GPIO/IRQ PD28 GPIO PA2 GPIO IRQ from maXTouch controller
|
|
10 GPIO PA5 GPIO PA24 GPIO RESET signal for maXTouch and LCD controller
|
|
11 I2C SDA PA3 TWID0 PA3 TWID0 I2C Data line for maXTouch controller
|
|
12 I2C SCL PA4 TWICK0 PA4 TWICK0 I2C Clock line for maXTouch controller
|
|
13 N/C PB0 - PA21 -
|
|
14 N/C PB1 - PB4 -
|
|
15 CS PD25 GPIO PD27 GPIO CS line for LCD controller
|
|
16 SPI MOSI PD21 SPI0_MOSI PD21 SPI0_MOSI SPI Data to LCD controller
|
|
17 SPI MISO PD20 SPI0_MISO PD20 SPI0_MISO SPI Data from LCD controller
|
|
18 SPI SCK PD22 SPI0_SPCK PD22 SPI0_SPCK SPI Clock line
|
|
19 GND - - - - Ground
|
|
20 VCC - - - - Target supply voltage
|
|
---- -------- ---- ----------- ---- ----------- ------------------------------------------
|
|
|
|
NOTE: Use of EXT1 conflicts with the Arduino RXD pin (PD28). You cannot
|
|
put the maXTouch Xplained in EXT1 and also use the Arduino RXD/TXD pins
|
|
as your serial console.
|
|
|
|
maXTouch Xplained Pro Xplained Pro LCD Connector
|
|
------------------------------------------------
|
|
It is also possible to connect the LCD via the flat cable to the EXT4 LCD
|
|
connector. In this case, you would use the SMC/EBI to communicate with the
|
|
LCD.
|
|
|
|
NOTE: (1) Only the parallel interface is supported by the SAMV71-XULT and (2)
|
|
the 3 switch mode selector on the back of the maXtouch. These switches should
|
|
be in the OFF-ON-OFF positions to select 16-bit color mode.
|
|
|
|
----------------- ------------- -----------------------------------------------------------
|
|
LCD SAMV71 Description
|
|
Pin Function Pin Function
|
|
---- ------------ ---- -------- -----------------------------------------------------------
|
|
1 ID - - Communication line to ID chip on extension board
|
|
2 GND - GND Ground
|
|
3 D0 PC0 D0 Data line
|
|
4 D1 PC1 D1 Data line
|
|
5 D2 PC2 D2 Data line
|
|
6 D3 PC3 D3 Data line
|
|
7 GND - GND Ground
|
|
8 D4 PC4 D4 Data line
|
|
9 D5 PC5 D5 Data line
|
|
10 D6 PC6 D6 Data line
|
|
11 D7 PC7 D7 Data line
|
|
12 GND - GND Ground
|
|
13 D8 PE0 D8 Data line
|
|
14 D9 PE1 D9 Data line
|
|
15 D10 PE2 D10 Data line
|
|
16 D11 PE3 D11 Data line
|
|
17 GND - GND Ground
|
|
18 D12 PE4 D12 Data line
|
|
19 D13 PE5 D13 Data line
|
|
20 D14 PA15 D14 Data line
|
|
21 D15 PA16 D15 Data line
|
|
22 GND - GND Ground
|
|
23 D16 - - Data line
|
|
24 D17 - - Data line
|
|
25 N/C - -
|
|
26 N/C - -
|
|
27 GND - GND Ground
|
|
28 N/C - -
|
|
29 N/C - -
|
|
30 N/C - -
|
|
31 N/C - -
|
|
32 GND - GND Ground
|
|
33 PCLK/ PC30 GPIO SMC: Pixel clock Display RAM select.
|
|
CMD_DATA_SEL SPI: One address line of the MCU for displays where it
|
|
is possible to select either the register or the
|
|
data interface
|
|
34 VSYNC/CS PD19 NCS3 SMC: Vertical synchronization.
|
|
SPI: Chip select
|
|
35 HSYNC/WE PC8 NWE SMC: Horizontal synchronization
|
|
SPI: Write enable signal
|
|
36 DATA ENABLE/ PC11 NRD SMC: Data enable signal
|
|
RE SPI: Read enable signal
|
|
37 SPI SCK - - SPI: Clock for SPI
|
|
38 SPI MOSI - - SPI: Master out slave in line of SPI
|
|
39 SPI MISO - - SPI: Master in slave out line of SPI
|
|
40 SPI SS - - SPI: Slave select for SPI
|
|
41 N/C - -
|
|
42 TWI SDA PA3 TWD0 I2C data line (maXTouch®)
|
|
43 TWI SCL PA4 TWCK0 I2C clock line (maXTouch)
|
|
44 IRQ1 PD28 WKUP5 maXTouch interrupt line
|
|
45 N/C PA2 WKUP2
|
|
46 PWM PC9 TIOB7 Backlight control
|
|
47 RESET PC13 GPIO Reset for both display and maxTouch
|
|
48 VCC - - 3.3V power supply for extension board
|
|
49 VCC - - 3.3V power supply for extension board
|
|
50 GND - - Ground
|
|
---- ------------ ---- -------- -----------------------------------------------------------
|
|
|
|
NOTE: Use of LCD/EXT4 conflicts with the Arduino RXD pin (PD28). You cannot
|
|
put the maXTouch Xplained in LCD/EXT4 and also use the Arduino RXD/TXD pins
|
|
as your serial console.
|
|
|
|
Connecting the flat cable. I was embarrassed to say that I did not know how
|
|
the connectors worked. Let me share this so that, perhaps, I can save you
|
|
the same embarrassment:
|
|
|
|
- The maXTouch Xplained Pro has an Omron XF2M-5015-1A connector. There is a
|
|
black bar at back (toward the baord). Raise that bar and insert the cable
|
|
with the contacts away from the board. Lower that bar to lock the cable
|
|
in place.
|
|
|
|
- The SAMV71-Xult has a TE Connectivity 5-1734839-0 FPC connector that works
|
|
differently. On each size of the connector are two small white tabs. Pull
|
|
these out and away from the board. Insert the ribbon with the contacts
|
|
toward the board. Lock the cable in place by pushing the tabs back in
|
|
place.
|
|
|
|
MXT Configuration Options
|
|
-------------------------
|
|
|
|
System Type -> SAMV7 Peripheral Support
|
|
CONFIG_SAMV7_TWIHS0=y : Needed by the MaXTouch controller
|
|
CONFIG_SAMV7_TWIHS0_FREQUENCY=100000
|
|
|
|
Board Selection ->
|
|
CONFIG_SAMV71XULT_MXTXPLND=y : MaXTouch Xplained is connected
|
|
CONFIG_SAMV71XULT_MXTXPLND_EXT1=y : Connected on EXT1, or
|
|
CONFIG_SAMV71XULT_MXTXPLND_EXT2=y : Connected on EXT2, or
|
|
CONFIG_SAMV71XULT_MXTXPLND_LCD=y : Connected on LCD
|
|
CONFIG_SAMV71XULT_MXT_DEVMINOR=0 : Register as /dev/input0
|
|
CONFIG_SAMV71XULT_MXT_I2CFREQUENCY=400000
|
|
|
|
NOTE: When selecting EXT1 or EXT2, be conscious of possible pin conflicts.
|
|
EXT1, for example, will conflict with the use of the Arduino TXD and RXD
|
|
pins for the serial console
|
|
|
|
Device Drivers -> Input Devices
|
|
CONFIG_INPUT=y : Enable support for human input devices
|
|
CONFIG_INPUT_MXT=y : Enable support for the maXTouch controller
|
|
|
|
The following enables a small built-in application that can be used to
|
|
test the touchscreen:
|
|
|
|
Application Configuration -> Examples -> Touchscreen example
|
|
CONFIG_EXAMPLES_TOUCHSCREEN=y : Enables the example
|
|
CONFIG_EXAMPLES_TOUCHSCREEN_ARCHINIT=y : Have board-specific intialization
|
|
CONFIG_EXAMPLES_TOUCHSCREEN_DEVPATH="/dev/input0"
|
|
CONFIG_EXAMPLES_TOUCHSCREEN_MINOR=0
|
|
|
|
ILI9488 Configuration Options
|
|
-----------------------------
|
|
|
|
Currently only the parallel mode is supported. This means that the LCD can
|
|
only be used in connected in the LCD (EXT4) connection.
|
|
|
|
System Type -> SAMV7 Peripheral Support
|
|
CONFIG_SAMV7_SMC=y : Needed by the ILI9466 driver controller
|
|
CONFIG_SAMV7_XDMAC=y : Needed by the ILI9466 driver
|
|
CONFIG_SAMV7_TWIHS0_FREQUENCY=100000
|
|
|
|
Board Selection ->
|
|
CONFIG_SAMV71XULT_MXTXPLND=y : MaXTouch Xplained is connected
|
|
CONFIG_SAMV71XULT_MXTXPLND_LCD=y : Must be connected on LCD
|
|
|
|
NOTE: When selecting EXT1 or EXT2, be conscious of possible pin conflicts.
|
|
EXT1, for example, will conflict with the use of the Arduino TXD and RXD
|
|
pins for the serial console
|
|
|
|
Device Drivers -> LCD drivers
|
|
CONFIG_LCD=y : Enable support for LCDs
|
|
|
|
Graphics
|
|
CONFIG_NX=y : Enable Graphics supported
|
|
CONFIG_NX_LCDDRIVER=y : Enable LCD driver support
|
|
CONFIG_NX_DISABLE_*BPP=y : When * is {1,2,4,8,24, and 32}
|
|
CONFIG_NXFONTS_CHARBITS=7
|
|
CONFIG_NXFONT_SANS23X27=y : One font must be enabled
|
|
|
|
There are several graphics examples that can be enabled under apps/examples.
|
|
nxlines is one of these and can be enabled as follows. See
|
|
apps/examples/README.txt for information about configuring other graphics
|
|
examples.
|
|
|
|
The following enables a small built-in application that can be used to
|
|
test the touchscreen:
|
|
|
|
Application Configuration -> Examples -> NX lines example
|
|
CONFIG_EXAMPLES_NXLINES=y : Enables the nxlines example
|
|
CONFIG_EXAMPLES_NXLINES_VPLANE=0
|
|
CONFIG_EXAMPLES_NXLINES_DEVNO=0
|
|
|
|
MCAN1 Loopback Test
|
|
===================
|
|
|
|
MCAN1
|
|
-----
|
|
SAM V71 Xplained Ultra has two MCAN modules that performs communication according
|
|
to ISO11898-1 (Bosch CAN specification 2.0 part A,B) and Bosch CAN FD
|
|
specification V1.0. MCAN1 is connected to an on-board ATA6561 CAN physical-layer
|
|
transceiver.
|
|
|
|
------- -------- -------- -------------
|
|
SAM V71 FUNCTION ATA6561 SHARED
|
|
PIN FUNCTION FUNCTIONALITY
|
|
------- -------- -------- -------------
|
|
PC14 CANTX1 TXD Shield
|
|
PC12 CANRX1 RXD Shield
|
|
------- -------- -------- -------------
|
|
|
|
Enabling MCAN1
|
|
--------------
|
|
These modifications may be applied to the samv71-xult/nsh configuration in order
|
|
to enable MCAN1:
|
|
|
|
Device Drivers -> CAN Driver support
|
|
CONFIG_CAN=y # Enable the upper-half CAN driver
|
|
CONFIG_CAN_FIFOSIZE=8
|
|
CONFIG_CAN_NPENDINGRTR=4
|
|
|
|
System Type -> SAMV7 Peripheral Selections
|
|
CONFIG_SAMV7_MCAN1=y # Enable MCAN1 as the lower-half
|
|
|
|
System Type -> MCAN device driver options
|
|
CONFIG_SAMV7_MCAN_CLKSRC_MAIN=y # Use the MAIN clock as the source
|
|
CONFIG_SAMV7_MCAN_CLKSRC_PRESCALER=1
|
|
|
|
System Type ->MCAN device driver options -> MCAN1 device driver options
|
|
CONFIG_SAMV7_MCAN1_ISO11899_1=y # Loopback test only support ISO11899-1
|
|
CONFIG_SAMV7_MCAN1_LOOPBACK=y # Needed for loopback test
|
|
CONFIG_SAMV7_MCAN1_BITRATE=500000 # Not critical for loopback test
|
|
CONFIG_SAMV7_MCAN1_PROPSEG=2 # Bit timing setup
|
|
CONFIG_SAMV7_MCAN1_PHASESEG1=11 # " " " " " "
|
|
CONFIG_SAMV7_MCAN1_PHASESEG2=11 # " " " " " "
|
|
CONFIG_SAMV7_MCAN1_FSJW=4 # " " " " " "
|
|
CONFIG_SAMV7_MCAN1_FBITRATE=2000000 # CAN_FD BTW mode is not used
|
|
CONFIG_SAMV7_MCAN1_FPROPSEG=2 # " " " " " " "" " " " "
|
|
CONFIG_SAMV7_MCAN1_FPHASESEG1=4 # " " " " " " "" " " " "
|
|
CONFIG_SAMV7_MCAN1_FPHASESEG2=4 # " " " " " " "" " " " "
|
|
CONFIG_SAMV7_MCAN1_FFSJW=2 # " " " " " " "" " " " "
|
|
CONFIG_SAMV7_MCAN1_NSTDFILTERS=0 # Filters are not used in the loopback test
|
|
CONFIG_SAMV7_MCAN1_NEXTFILTERS=0 # " " " " " " " " "" " " " " " "
|
|
CONFIG_SAMV7_MCAN1_RXFIFO0_32BYTES=y # Each RX FIFO0 element is 32 bytes
|
|
CONFIG_SAMV7_MCAN1_RXFIFO0_SIZE=8 # There are 8 queue elements
|
|
CONFIG_SAMV7_MCAN1_RXFIFO0_32BYTES=y # Each RX FIFO1 element is 32 bytes
|
|
CONFIG_SAMV7_MCAN1_RXFIFO0_SIZE=8 # There are 8 queue elements
|
|
CONFIG_SAMV7_MCAN1_RXBUFFER_32BYTES=y # Each RX BUFFER is 32 bytes
|
|
CONFIG_SAMV7_MCAN1_TXBUFFER_32BYTES=y # Each TX BUFFER is 32 bytes
|
|
CONFIG_SAMV7_MCAN1_TXFIFOQ_SIZE=8 # There are 8 queue elements
|
|
CONFIG_SAMV7_MCAN1_TXEVENTFIFO_SIZE=0 # The event FIFO is not used
|
|
|
|
Board Selection
|
|
CONFIG_LIB_BOARDCTL=y # Needed for CAN initialization
|
|
CONFIG_BOARDCTL_CANINIT=y # Enabled CAN initialization
|
|
|
|
Enabling the CAN Loopback Test
|
|
------------------------------
|
|
Application Configuration -> Examples -> CAN Example
|
|
CONFIG_EXAMPLES_CAN=y # Enables the CAN test
|
|
|
|
Enabling CAN Debug Output
|
|
-------------------------
|
|
Build Setup -> Debug Options
|
|
CONFIG_DEBUG=y # Enables general debug features
|
|
CONFIG_DEBUG_VERBOSE=y # Enables verbose output
|
|
CONFIG_DEBUG_CAN=y # Enables debug output from CAN
|
|
|
|
CONFIG_STACK_COLORATION=y # Monitor stack usage
|
|
CONFIG_DEBUG_SYMBOLS=y # Needed only for use with a debugger
|
|
CONFIG_DEBUG_NOOPT=y # Disables optimization
|
|
|
|
System Type -> MCAN device driver options
|
|
CONFIG_SAMV7_MCAN_REGDEBUG=y # Super low level register debug output
|
|
|
|
SPI Slave
|
|
=========
|
|
|
|
An interrutp driven SPI slave driver as added on 2015-08-09 but has not
|
|
been verified as of this writing. See discussion in include/nuttx/spi/slave.h
|
|
and below.
|
|
|
|
I do not yet have a design that supports SPI slave DMA. And, under
|
|
certain, very limited conditions, I think it can be done. Those
|
|
certain conditions are:
|
|
|
|
a) The master does not tie the chip select to ground. The master must
|
|
raise chip select at the end of the transfer. Then I do not need to
|
|
know the length of the transfer; I can cancel the DMA when the chip
|
|
is de-selected.
|
|
|
|
b) The protocol includes a dummy read after sending the command. This
|
|
is very common in SPI device and should not be an issue if it is
|
|
specified. This dummy read time provides time to set up the DMA.
|
|
So the protocol would be:
|
|
|
|
i) Master drops the chip select.
|
|
ii) Master sends the command which will indicate whether the master
|
|
is reading, writing, or exchanging data. The master discards
|
|
the garbage return value.
|
|
iii) Slave is interrupted when the command word is received. The
|
|
SPI device then decodes the command word and setups up the
|
|
subsequent DMA.
|
|
iv) Master sends a dummy word and discards the return value.
|
|
During the bit times to shift the dummy word, the slave has time
|
|
to set up the DMA.
|
|
v) Master then reads or writes (or exchanges) the data If the DMA
|
|
is in place, the transfer should continue normally.
|
|
vi) At the end of the data transfer the master raises the chip
|
|
select.
|
|
|
|
c) There are limitations in the word time, i.e., the time between the
|
|
interrupt for each word shifted in from the master.
|
|
|
|
The controller driver will get events after the receipt of each word in
|
|
ii), iv), and v). The time between each word will be:
|
|
|
|
word-time = nbits * bit time + inter-word-gap
|
|
|
|
So for an 8 bit interface at 20MHz, the words will be received from the
|
|
master a 8 * 50nsec = 400 nsec + inter-word-gap. That is the time
|
|
during which the dummy word would be shifted and during which we
|
|
receive the interrupt for the command word, interpret the command word,
|
|
and to set up the DMA for the remaining word transfer. I don't think
|
|
that is possible, at least not at 20 MHz.
|
|
|
|
That is far too fast even for the interrupt driven solution that I have
|
|
in place now. It could not work at 20MHz. If we suppose that interrupt
|
|
processing is around 1 usec, then an 8 bit interface could not have bit
|
|
times more than 125 nsec or 8 KHz. Interrupt handling should be faster
|
|
than 1 usec, but not a lot faster. I have not benchmarked it. NuttX
|
|
also supports special, zero latency interrupts that could bring the
|
|
interrupt time down even more.
|
|
|
|
Note that we would also have a little more processing time if you used
|
|
16-bit SPI word size.
|
|
|
|
Note also that the interrupt driven approach would have this same basic
|
|
performance limitation with the additional disadvantage that:
|
|
|
|
a) The driver will receive two interrupts per word exchanged:
|
|
|
|
i) One interrupt will be received when the word is shifted in from
|
|
the master (at the end of 8-bit times). This is a data received
|
|
interrupt.
|
|
|
|
ii) And another interrupt when the next words moved to the shift-out
|
|
register, freeing up the transmit holding register. This is the
|
|
data sent interrupt.
|
|
|
|
The ii) event should be very soon after the i) event.
|
|
|
|
Without DMA, the only way to reduce the interrupt rate would be to add
|
|
interrupt-level polling to detect the when transmit holding register
|
|
is available. That is not really a good idea.
|
|
|
|
b) It will hog all of the CPU for the duration of the transfer).
|
|
|
|
Tickless OS
|
|
===========
|
|
|
|
Background
|
|
----------
|
|
By default, a NuttX configuration uses a periodic timer interrupt that
|
|
drives all system timing. The timer is provided by architecture-specific
|
|
code that calls into NuttX at a rate controlled by CONFIG_USEC_PER_TICK.
|
|
The default value of CONFIG_USEC_PER_TICK is 10000 microseconds which
|
|
corresponds to a timer interrupt rate of 100 Hz.
|
|
|
|
An option is to configure NuttX to operation in a "tickless" mode. Some
|
|
limitations of default system timer are, in increasing order of
|
|
importance:
|
|
|
|
- Overhead: Although the CPU usage of the system timer interrupt at 100Hz
|
|
is really very low, it is still mostly wasted processing time. One most
|
|
timer interrupts, there is really nothing that needs be done other than
|
|
incrementing the counter.
|
|
- Resolution: Resolution of all system timing is also determined by
|
|
CONFIG_USEC_PER_TICK. So nothing that be time with resolution finer than
|
|
10 milliseconds be default. To increase this resolution,
|
|
CONFIG_USEC_PER_TICK an be reduced. However, then the system timer
|
|
interrupts use more of the CPU bandwidth processing useless interrupts.
|
|
- Power Usage: But the biggest issue is power usage. When the system is
|
|
IDLE, it enters a light, low-power mode (for ARMs, this mode is entered
|
|
with the wfi or wfe instructions for example). But each interrupt
|
|
awakens the system from this low power mode. Therefore, higher rates
|
|
of interrupts cause greater power consumption.
|
|
|
|
The so-called Tickless OS provides one solution to issue. The basic
|
|
concept here is that the periodic, timer interrupt is eliminated and
|
|
replaced with a one-shot, interval timer. It becomes event driven
|
|
instead of polled: The default system timer is a polled design. On
|
|
each interrupt, the NuttX logic checks if it needs to do anything
|
|
and, if so, it does it.
|
|
|
|
Using an interval timer, one can anticipate when the next interesting
|
|
OS event will occur, program the interval time and wait for it to fire.
|
|
When the interval time fires, then the scheduled activity is performed.
|
|
|
|
Configuration
|
|
-------------
|
|
The following configuration options will enable support for the Tickless
|
|
OS for the SAMV7 platforms using TC0 channels 0-1 (other timers or
|
|
timer channels could be used making the obvious substitutions):
|
|
|
|
RTOS Features -> Clocks and Timers
|
|
CONFIG_SCHED_TICKLESS=y : Configures the RTOS in tickless mode
|
|
CONFIG_SCHED_TICKLESS_ALARM=n : (option not implemented)
|
|
CONFIG_SCHED_TICKLESS_LIMIT_MAX_SLEEP=y
|
|
|
|
System Type -> SAMV7 Peripheral Support
|
|
CONFIG_SAMV7_TC0=y : Enable TC0 (TC channels 0-3
|
|
|
|
System Type -> Timer/counter Configuration
|
|
CONFIG_SAMV7_ONESHOT=y : Enables one-shot timer wrapper
|
|
CONFIG_SAMV7_FREERUN=y : Enabled free-running timer wrapper
|
|
CONFIG_SAMV7_TICKLESS_ONESHOT=0 : Selects TC0 channel 0 for the one-shot
|
|
CONFIG_SAMV7_TICKLESS_FREERUN=1 : Selects TC0 channel 1 for the free-
|
|
: running timer
|
|
|
|
The resolution of the clock is provided by the CONFIG_USEC_PER_TICK
|
|
setting in the configuration file.
|
|
|
|
NOTE: In most cases, the slow clock will be used as the timer/counter
|
|
input. The 32.768KHz crystal is selected by the definition
|
|
BOARD_HAVE_SLOWXTAL in the configs/samv71-xult/board.h file.
|
|
|
|
The slow clock has a resolution of about 30.518 microseconds. Ideally,
|
|
the value of CONFIG_USEC_PER_TICK should be the exact clock resolution.
|
|
Otherwise there will be cumulative timing inaccuracies. But a choice
|
|
choice of:
|
|
|
|
CONFIG_USEC_PER_TICK=31
|
|
|
|
will have an error of 0.6% and will have inaccuracies that will
|
|
effect the time due to long term error build-up.
|
|
|
|
Using the slow clock clock input, the Tickless support is functional,
|
|
however, there are inaccuracies in delays. For example,
|
|
|
|
nsh> sleep 10
|
|
|
|
results in a delay of maybe 5.4 seconds. But the timing accuracy is
|
|
correct if all competing uses of the interval timer are disabled (mostly
|
|
from the high priority work queue). Therefore, I conclude that this
|
|
inaccuracy is due to the inaccuracies in the representation of the clock
|
|
rate. 30.518 usec cannot be represented accurately. Each timing
|
|
calculation results in a small error. When the interval timer is very
|
|
busy, long delays will be divided into many small pieces and each small
|
|
piece has a large error in the calculation. The cumulative error is the
|
|
cause of the problem.
|
|
|
|
Solution: The samv71-xult/src/sam_boot.c file has additional logic
|
|
to enable the programmable clock PCK6 as a clock source for the
|
|
timer/counters if the Tickless mode is selected. The ideal frequency
|
|
would be:
|
|
|
|
frequency = 1,000,000 / CONFIG_USEC_PER_TICK
|
|
|
|
The main crystal is selected as the frequency source. The maximum
|
|
prescaler value is 256 so the minimum frequency is 46,875 Hz which
|
|
corresponds to a period of 21.3 microseconds. A value of
|
|
CONFIG_USEC_PER_TICK=20, or 50KHz, would give an exact solution with
|
|
a divider of 240.
|
|
|
|
SAMV7 Timer Usage
|
|
-----------------
|
|
This current implementation uses two timers: A one-shot timer to
|
|
provide the timed events and a free running timer to provide the current
|
|
time. Since timers are a limited resource, that could be an issue on
|
|
some systems.
|
|
|
|
We could do the job with a single timer if we were to keep the single
|
|
timer in a free-running at all times. The SAMV7 timer/counters have
|
|
16-bit counters with the capability to generate a compare interrupt when
|
|
the timer matches a compare value but also to continue counting without
|
|
stopping (giving another, different interrupt when the timer rolls over
|
|
from 0xffff to zero). So we could potentially just set the compare at
|
|
the number of ticks you want PLUS the current value of timer. Then you
|
|
could have both with a single timer: An interval timer and a free-
|
|
running counter with the same timer! In this case, you would want to
|
|
to set CONFIG_SCHED_TICKLESS_ALARM in the NuttX configuration.
|
|
|
|
Patches are welcome!
|
|
|
|
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/<subdir>
|
|
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 <subdir> 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
|
|
see additional README.txt files in the NuttX tools repository.
|
|
|
|
b. Execute 'make menuconfig' in nuttx/ in order to start the
|
|
reconfiguration process.
|
|
|
|
2. Unless stated otherwise, all configurations generate console
|
|
output on UART3 (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-M7, but is supported by at least this realeasse of
|
|
the ARM GNU tools:
|
|
|
|
https://launchpadlibrarian.net/192228215/release.txt
|
|
|
|
Current (2105-07-31) setenv.sh file are configured to use this
|
|
release:
|
|
|
|
https://launchpadlibrarian.net/209776344/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
|
|
|
|
NOTE: As of this writing, there are issues with using this tool at
|
|
the -Os level of optimization. This has not been proven to be a
|
|
compiler issue (as least not one that might not be fixed with a
|
|
well placed volatile qualifier). However, in any event, it is
|
|
recommend that you use not more that -O2 optimization.
|
|
|
|
Configuration sub-directories
|
|
-----------------------------
|
|
|
|
knsh:
|
|
|
|
This is identical to the nsh configuration below except that NuttX
|
|
is built as a kernel-mode, monolithic module and the user applications
|
|
are built separately. There are four very similar NSH configurations:
|
|
|
|
- knsh. This is a somewhat simplified version of the nsh configuration
|
|
that builds using the protected build mode (CONFIG_BUILD_PROTECTED=y).
|
|
- nsh. This configuration is focused on low level, command-line
|
|
driver testing. It has no network.
|
|
- netnsh. This configuration is focused on network testing and
|
|
has only limited command support.
|
|
- mxtxplnd. This configuration is identical to the nsh configuration
|
|
but assumes that you have a maXTouch Xplained Pro LCD attached
|
|
and includes extra tests for the touchscreen and LCD.
|
|
|
|
It is recommends to use a special make command; not just 'make' but make
|
|
with the following two arguments:
|
|
|
|
make pass1 pass2
|
|
|
|
In the normal case (just 'make'), make will attempt to build both user-
|
|
and kernel-mode blobs more or less interleaved. This actual works!
|
|
However, for me it is very confusing so I prefer the above make command:
|
|
Make the user-space binaries first (pass1), then make the kernel-space
|
|
binaries (pass2)
|
|
|
|
NOTES:
|
|
|
|
1. At the end of the build, there will be several files in the top-level
|
|
NuttX build directory:
|
|
|
|
PASS1:
|
|
nuttx_user.elf - The pass1 user-space ELF file
|
|
nuttx_user.hex - The pass1 Intel HEX format file (selected in defconfig)
|
|
User.map - Symbols in the user-space ELF file
|
|
|
|
PASS2:
|
|
nuttx - The pass2 kernel-space ELF file
|
|
nuttx.hex - The pass2 Intel HEX file (selected in defconfig)
|
|
System.map - Symbols in the kernel-space ELF file
|
|
|
|
The J-Link programmer will except files in .hex, .mot, .srec, and .bin
|
|
formats.
|
|
|
|
2. Combining .hex files. If you plan to use the .hex files with your
|
|
debugger or FLASH utility, then you may need to combine the two hex
|
|
files into a single .hex file. Here is how you can do that.
|
|
|
|
a. The 'tail' of the nuttx.hex file should look something like this
|
|
(with my comments added):
|
|
|
|
$ tail nuttx.hex
|
|
# 00, data records
|
|
...
|
|
:10 9DC0 00 01000000000800006400020100001F0004
|
|
:10 9DD0 00 3B005A0078009700B500D400F300110151
|
|
:08 9DE0 00 30014E016D0100008D
|
|
# 05, Start Linear Address Record
|
|
:04 0000 05 0800 0419 D2
|
|
# 01, End Of File record
|
|
:00 0000 01 FF
|
|
|
|
Use an editor such as vi to remove the 05 and 01 records.
|
|
|
|
b. The 'head' of the nuttx_user.hex file should look something like
|
|
this (again with my comments added):
|
|
|
|
$ head nuttx_user.hex
|
|
# 04, Extended Linear Address Record
|
|
:02 0000 04 0801 F1
|
|
# 00, data records
|
|
:10 8000 00 BD89 01084C800108C8110208D01102087E
|
|
:10 8010 00 0010 00201C1000201C1000203C16002026
|
|
:10 8020 00 4D80 01085D80010869800108ED83010829
|
|
...
|
|
|
|
Nothing needs to be done here. The nuttx_user.hex file should
|
|
be fine.
|
|
|
|
c. Combine the edited nuttx.hex and un-edited nuttx_user.hex
|
|
file to produce a single combined hex file:
|
|
|
|
$ cat nuttx.hex nuttx_user.hex >combined.hex
|
|
|
|
Then use the combined.hex file with the to write the FLASH image.
|
|
If you do this a lot, you will probably want to invest a little time
|
|
to develop a tool to automate these steps.
|
|
|
|
module:
|
|
|
|
A simple stripped down configuration that was used for testing NuttX
|
|
OS modules. There are five
|
|
very similar NSH configurations:
|
|
|
|
- knsh. This is a somewhat simplified version of the nsh configuration
|
|
that builds using the protected build mode (CONFIG_BUILD_PROTECTED=y).
|
|
- nsh. This configuration is focused on low level, command-line
|
|
driver testing. It has no network.
|
|
- netnsh. This configuration is focused on network testing and
|
|
has only limited command support.
|
|
- module. A simple stripped down configuration that was used for testing
|
|
NuttXOS modules.
|
|
- mxtxplnd. This configuration is identical to the nsh configuration
|
|
but assumes that you have a maXTouch Xplained Pro LCD attached
|
|
and includes extra tests for the touchscreen and LCD.
|
|
|
|
mxtxplnd:
|
|
|
|
Configures the NuttShell (nsh) located at examples/nsh. There are five
|
|
very similar NSH configurations:
|
|
|
|
- knsh. This is a somewhat simplified version of the nsh configuration
|
|
that builds using the protected build mode (CONFIG_BUILD_PROTECTED=y).
|
|
- nsh. This configuration is focused on low level, command-line
|
|
driver testing. It has no network.
|
|
- netnsh. This configuration is focused on network testing and
|
|
has only limited command support.
|
|
- module. A simple stripped down configuration that was used for testing
|
|
NuttXOS modules.
|
|
- mxtxplnd. This configuration is identical to the nsh configuration
|
|
but assumes that you have a maXTouch Xplained Pro LCD attached
|
|
and includes extra tests for the touchscreen and LCD.
|
|
|
|
NOTES:
|
|
|
|
1. See the notes associated with the nsh configuration below. Only
|
|
differences from that configuration will be addressed here.
|
|
|
|
2. Basic touchscreen/LCD configuration settings are discussed above in
|
|
the paragraph entitled, "maXTouch Xplained Pro".
|
|
|
|
3. Unlike the nsh configuration, this configuration has the serial console
|
|
setup to USART0 which is available on EXT1:
|
|
|
|
----------- --- ------- -----
|
|
Connector PIO Arduino SAMV7
|
|
----------- --- ------- -----
|
|
EXT1 pin 13 PB0 RX3 RXD0
|
|
EXT1 pin 14 PB1 TX3 TXD0
|
|
----------- --- ------- -----
|
|
|
|
and also on the Arduino Communications connector (J505):
|
|
|
|
----------- --- ------- -----
|
|
Connector PIO Arduino SAMV7
|
|
----------- --- ------- -----
|
|
J505 pin 7 PB0 RX3 RXD0
|
|
J505 pin 8 PB1 TX3 TXD0
|
|
----------- --- ------- -----
|
|
|
|
Use of either the EXT1 or the LCD/EXT4 connectors conflict with the
|
|
Arduino RXD pin (UART3, PD28). You cannot put the maXTouch Xplained
|
|
in EXT1 or LCD/EXT4 and also use the Arduino RXD/TXD pins as your
|
|
serial console.
|
|
|
|
The LCD (EXT4) is configured by default because only the parallel LCD
|
|
interface is currently supported and that is only available on that
|
|
connector.
|
|
|
|
If you plan to use EXT2 for some reason, you may re-configure the
|
|
serial console to use UART3, the standard Arduino RXD/TXD. You
|
|
would also, of course, have to disable the LCD.
|
|
|
|
NOTE that the USART0 pins PB0 and PB1 conflict with SSC TF and TK
|
|
pins as connected to the WM8904 audio CODEC. So, unless yet a
|
|
different U[S]ART option is selected, Audio cannot be used with
|
|
this configuration.
|
|
|
|
4. SDRAM is NOT enabled in this configuration.
|
|
|
|
5. Support for the ILI8488 LCD is enabled. Only the parallel mode is
|
|
supported at present. As a consequence, the maXTouch Xplained Pro
|
|
must be connected at the LCD (EXT4) connector. This mode requires:
|
|
|
|
CONFIG_SAMV71XULT_MXTXPLND_LCD=y : Must be connect in LCD (EXT4)
|
|
CONFIG_SAMV7_SMC=y : SMC/EBI support
|
|
CONFIG_SAMV7_XDMAC=y : XDMAC support
|
|
|
|
6. The appx/examples/nxlines is enabled as a built-in application.
|
|
This is a test that displays some simple graphis and can be
|
|
executed from the NSH command line like:
|
|
|
|
nsh> nxlines
|
|
|
|
7. When the maXTouch Xplained is connected (in any position), a new I2C
|
|
address appears at address 0x4a:
|
|
|
|
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: -- -- -- -- -- -- -- -- -- -- 4a -- -- -- 4e --
|
|
50: -- -- -- -- -- -- -- 57 -- -- -- -- -- -- -- 5f
|
|
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
|
|
70: -- -- -- -- -- -- -- --
|
|
|
|
This is the I2C address of the maXTouch touchscreen controller.
|
|
|
|
(0x1a is the address of the WM8904 Audio CODEC, 0x28 is the
|
|
address of TWI interface to the EDBG, 0x4e is the address of the
|
|
CP2100CP programmable PLL, and 0x57 and 0x5f are the addresses of
|
|
the AT2 EEPROM. I am not sure what the other address, 0x37, is).
|
|
|
|
8. Support for the touchscreen test is enabled (see apps/examples/touchscreen),
|
|
however, the maXTouch is not yet working (see STATUS below).
|
|
|
|
STATUS:
|
|
2015-04-05: Partial support for the maXTouch Xplained Pro LCD is in
|
|
place. The ILI9488-based LCD is working well with a SMC DMA-based
|
|
interface. Very nice performance.
|
|
2015-05-12: After some difficulties, the maXTouch touchscreen
|
|
controller is now fully functional as well.
|
|
|
|
netnsh:
|
|
|
|
Configures the NuttShell (nsh) located at examples/nsh. There are five
|
|
very similar NSH configurations:
|
|
|
|
- knsh. This is a somewhat simplified version of the nsh configuration
|
|
that builds using the protected build mode (CONFIG_BUILD_PROTECTED=y).
|
|
- nsh. This configuration is focused on low level, command-line
|
|
driver testing. It has no network.
|
|
- netnsh. This configuration is focused on network testing and
|
|
has only limited command support.
|
|
- module. A simple stripped down configuration that was used for testing
|
|
NuttXOS modules.
|
|
- mxtxplnd. This configuration is identical to the nsh configuration
|
|
but assumes that you have a maXTouch Xplained Pro LCD attached
|
|
and includes extra tests for the touchscreen and LCD.
|
|
|
|
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_SCHED_HPWORKSTACKSIZE=2048
|
|
CONFIG_IDLETHREAD_STACKSIZE=1024
|
|
CONFIG_USERMAIN_STACKSIZE=2048
|
|
CONFIG_PTHREAD_STACK_MIN=256
|
|
CONFIG_PTHREAD_STACK_DEFAULT=2048
|
|
CONFIG_POSIX_SPAWN_PROXY_STACKSIZE=1024
|
|
CONFIG_TASK_SPAWN_DEFAULT_STACKSIZE=2048
|
|
CONFIG_BUILTIN_PROXY_STACKSIZE=1024
|
|
CONFIG_NSH_TELNETD_DAEMONSTACKSIZE=2048
|
|
CONFIG_NSH_TELNETD_CLIENTSTACKSIZE=2048
|
|
|
|
3. NSH built-in applications are supported. There are, however, not
|
|
enabled built-in applications.
|
|
|
|
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
|
|
|
|
4. The network initialization thread and the NSH network montior are
|
|
enabled in this configuration. As a result, networking initialization
|
|
is performed asynchronously with NSH bring-up. For more information,
|
|
see the paragraphs above entitled "Network Initialization Thread" and
|
|
"Network Monitor".
|
|
|
|
5. SDRAM is NOT enabled in this configuration.
|
|
|
|
6. 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.
|
|
|
|
Relevant configuration settings:
|
|
|
|
CONFIG_SAMV7_TWIHS0=y
|
|
CONFIG_SAMV7_TWIHS0_FREQUENCY=100000
|
|
|
|
CONFIG_I2C=y
|
|
|
|
7. TWIHS0 is used to support 256 byte non-volatile storage. This EEPROM
|
|
holds the assigned MAC address which is necessary for networking. The
|
|
EEPROM is also available for storage of configuration data using the
|
|
MTD configuration as described above under the heading, "MTD
|
|
Configuration Data".
|
|
|
|
8. Support for HSMCI is built-in by default. The SAMV71-XULT provides
|
|
one full-size SD memory card slot. Refer to the section entitled
|
|
"SD card" for configuration-related information.
|
|
|
|
See "Open Issues" above for issues related to HSMCI.
|
|
|
|
The auto-mounter is not enabled. See the section above entitled
|
|
"Auto-Mounter".
|
|
|
|
9. Performance-related Configuration settings:
|
|
|
|
CONFIG_ARMV7M_ICACHE=y : Instruction cache is enabled
|
|
CONFIG_ARMV7M_DCACHE=y : Data cache is enabled
|
|
CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y : Write through mode
|
|
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
|
|
|
|
I- and D-Caches are enabled but the D-Cache must be enabled in write-
|
|
through mode. This is to work around issues with the RX and TX
|
|
descriptors with are 8-bytes in size. But the D-Cache cache line
|
|
size is 32-bytes. That means that you cannot reload, clean or
|
|
invalidate a descriptor without also effecting three neighboring
|
|
descriptors. Setting write through mode eliminates the need for
|
|
cleaning the D-Cache. If only reloading and invalidating are done,
|
|
then there is no problem.
|
|
|
|
Stack sizes are also large to simplify the bring-up and should be
|
|
tuned for better memory usages.
|
|
|
|
STATUS:
|
|
2015-03-29: I- and D-caches are currently enabled, but as noted
|
|
above, the D-Cache must be enabled in write-through mode. Also -Os
|
|
optimization is not being used (-O2). If the cache is enabled in
|
|
Write-Back mode or if higher levels of optimization are enabled, then
|
|
there are failures when trying to ping the target from a host.
|
|
|
|
nsh:
|
|
|
|
Configures the NuttShell (nsh) located at examples/nsh. There are five
|
|
very similar NSH configurations:
|
|
|
|
- knsh. This is a somewhat simplified version of the nsh configuration
|
|
that builds using the protected build mode (CONFIG_BUILD_PROTECTED=y).
|
|
- nsh. This configuration is focused on low level, command-line
|
|
driver testing. It has no network.
|
|
- netnsh. This configuration is focused on network testing and
|
|
has only limited command support.
|
|
- module. A simple stripped down configuration that was used for testing
|
|
NuttXOS modules.
|
|
- mxtxplnd. This configuration is identical to the nsh configuration
|
|
but assumes that you have a maXTouch Xplained Pro LCD attached
|
|
and includes extra tests for the touchscreen and LCD.
|
|
|
|
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
|
|
|
|
4. SDRAM is enabled in this configuration. Here are the relevant
|
|
configuration settings:
|
|
|
|
System Type
|
|
CONFIG_SAMV7_SDRAMC=y
|
|
CONFIG_SAMV7_SDRAMSIZE=2097152
|
|
|
|
SDRAM is not added to the heap in this configuration. To do that
|
|
you would need to set CONFIG_SAMV7_SDRAMHEAP=y and CONFIG_MM_REGIONS=2.
|
|
Instead, the SDRAM is set up so that is can be used with a destructive
|
|
RAM test enabled with this option:
|
|
|
|
Application Configuration:
|
|
CONFIG_SYSTEM_RAMTEST=y
|
|
|
|
The RAM test can be executed as follows:
|
|
|
|
nsh> ramtest -w 70000000 2097152
|
|
|
|
NuttShell (NSH) NuttX-7.8
|
|
nsh> ramtest -w 70000000 2097152
|
|
RAMTest: Marching ones: 70000000 2097152
|
|
RAMTest: Marching zeroes: 70000000 2097152
|
|
RAMTest: Pattern test: 70000000 2097152 55555555 aaaaaaaa
|
|
RAMTest: Pattern test: 70000000 2097152 66666666 99999999
|
|
RAMTest: Pattern test: 70000000 2097152 33333333 cccccccc
|
|
RAMTest: Address-in-address test: 70000000 2097152
|
|
nsh>
|
|
|
|
5. 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] [<cmd>]
|
|
...
|
|
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>
|
|
|
|
6. 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_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 <cmd> [arguments]
|
|
Where <cmd> is one of:
|
|
|
|
Show help : ?
|
|
List busses : bus
|
|
List devices : dev [OPTIONS] <first> <last>
|
|
Read register : get [OPTIONS] [<repititions>]
|
|
Show help : help
|
|
Write register: set [OPTIONS] <value> [<repititions>]
|
|
Verify access : verf [OPTIONS] [<value>] [<repititions>]
|
|
|
|
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 is the address of the WM8904 Audio CODEC, 0x28 is the
|
|
address of TWI interface to the EDBG, 0x4e is the address of the
|
|
CP2100CP programmable PLL, and 0x57 and 0x5f are the addresses of
|
|
the AT2 EEPROM (I am not sure what the other address, 0x37, is
|
|
as this writing).
|
|
|
|
7. TWIHS0 is also used to support 256 byte non-volatile storage for
|
|
configuration data using the MTD configuration as described above
|
|
under the heading, "MTD Configuration Data".
|
|
|
|
8. Support for HSMCI is built-in by default. The SAMV71-XULT provides
|
|
one full-size SD memory card slot. Refer to the section entitled
|
|
"SD card" for configuration-related information.
|
|
|
|
See "Open Issues" above for issues related to HSMCI.
|
|
|
|
The auto-mounter is not enabled. See the section above entitled
|
|
"Auto-Mounter".
|
|
|
|
9. Performance-related Configuration settings:
|
|
|
|
CONFIG_ARMV7M_ICACHE=y : Instruction cache is enabled
|
|
CONFIG_ARMV7M_DCACHE=y : Data cache is enabled
|
|
CONFIG_ARMV7M_DCACHE_WRITETHROUGH=n : Write back mode
|
|
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
|
|
|
|
Stack sizes are also large to simplify the bring-up and should be
|
|
tuned for better memory usages.
|
|
|
|
STATUS:
|
|
2015-03-28: HSMCI TX DMA is disabled. There are some issues with the TX
|
|
DMA that need to be corrected.
|
|
|
|
nxwm:
|
|
|
|
This is a special configuration setup for the NxWM window manager
|
|
UnitTest. It provides an interactive windowing experience with the
|
|
maXTouch Xplained Pro LCD.
|
|
|
|
NOTES:
|
|
|
|
1. The NxWM window manager is a tiny window manager tailored for use
|
|
with smaller LCDs. It supports a task, a start window, and
|
|
multiple application windows with toolbars. However, to make the
|
|
best use of the visible LCD space, only one application window is
|
|
visible at at time.
|
|
|
|
The NxWM window manager can be found here:
|
|
|
|
nuttx-git/NxWidgets/nxwm
|
|
|
|
The NxWM unit test can be found at:
|
|
|
|
nuttx-git/NxWidgets/UnitTests/nxwm
|
|
|
|
Documentation for installing the NxWM unit test can be found here:
|
|
|
|
nuttx-git/NxWidgets/UnitTests/README.txt
|
|
|
|
2. Here is the quick summary of the build steps. These steps assume
|
|
that you have the entire NuttX GIT in some directory ~/nuttx-git.
|
|
You may have these components installed elsewhere. In that case, you
|
|
will need to adjust all of the paths in the following accordingly:
|
|
|
|
a. Install the nxwm configuration
|
|
|
|
$ cd ~/nuttx-git/nuttx/tools
|
|
$ ./configure.sh samv71-xult/nxwm
|
|
|
|
b. Make the build context (only)
|
|
|
|
$ cd ..
|
|
$ . ./setenv.sh
|
|
$ make context
|
|
...
|
|
|
|
NOTE: the use of the setenv.sh file is optional. All that it will
|
|
do is to adjust your PATH variable so that the build system can find
|
|
your tools. If you use it, you will most likely need to modify the
|
|
script so that it has the correct path to your tool binaries
|
|
directory.
|
|
|
|
c. Install the nxwm unit test
|
|
|
|
$ cd ~/nuttx-git/NxWidgets
|
|
$ tools/install.sh ~/nuttx-git/apps nxwm
|
|
Creating symbolic link
|
|
- To ~/nuttx-git/NxWidgets/UnitTests/nxwm
|
|
- At ~/nuttx-git/apps/external
|
|
|
|
d. Build the NxWidgets library
|
|
|
|
$ cd ~/nuttx-git/NxWidgets/libnxwidgets
|
|
$ make TOPDIR=~/nuttx-git/nuttx
|
|
...
|
|
|
|
e. Build the NxWM library
|
|
|
|
$ cd ~/nuttx-git/NxWidgets/nxwm
|
|
$ make TOPDIR=~/nuttx-git/nuttx
|
|
...
|
|
|
|
f. Built NuttX with the installed unit test as the application
|
|
|
|
$ cd ~/nuttx-git/nuttx
|
|
$ make
|
|
|
|
3. Reading from the LCD is not currently functional. The following
|
|
settings are in the configuration that tell the system that this
|
|
is a read-only LCD:
|
|
|
|
CONFIG_LCD_NOGETRUN=y
|
|
CONFIG_NX_WRITEONLY=y
|
|
|
|
4. Small Icons are selected and can be very difficult to touch. You
|
|
might want to enable larger icons with:
|
|
|
|
CONFIG_NXWM_LARGE_ICONS=y
|
|
|
|
STATUS:
|
|
2015-05-13:
|
|
- The demo functions and produces displays but is not yet very stable.
|
|
|
|
- I have two maXTouch Xplained Pro displays. One works well, the
|
|
other has some issues which I suspect are due to the ribbon cable
|
|
connector with fits too snugly on one side.
|
|
|
|
Here are the symptoms of the LCD that does not work. I attribute
|
|
these problems with problems in the parallel interface due to a
|
|
bad connection:
|
|
|
|
- The color is wrong; to reddish. This suggests some issue with color
|
|
format or pixel width
|
|
- Images are positioned correctly on the display, but all half the
|
|
horizontal width that they should be, again suggesting some problem
|
|
with the pixel with.
|
|
- Some images are simply truncated to half the correct size (such as
|
|
the touch circles in the calibration screen).
|
|
- Other images are horizontally compressed (such as the initial NX
|
|
logo on the background).
|
|
|
|
- As mentioned above, reading fromthe LCD is not currently functional.
|
|
There are some special settings work work around this but the
|
|
bottom line is that transparent operations cannot yet be supported.
|
|
|
|
- I am seeing some small artifacts with the font used in the HEX
|
|
calculator display.
|
|
|
|
- Line spacing in the NxTerm window is too much. This is probably
|
|
a font-related issue too.
|
|
|