Skip to content

Commit 6d4ffc6

Browse files
committed
add TG-Watch02A
1 parent c000567 commit 6d4ffc6

File tree

6 files changed

+391
-0
lines changed

6 files changed

+391
-0
lines changed
Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
# Setup
2+
3+
The `feather52840` board is currently based on the `PCA10056` development
4+
board from Nordic Semiconductors, since commercial modules are not yet
5+
available for the nRF52840.
6+
7+
The difference between the `pca10056` and `feather52840` board support
8+
packages is that no bootloader is present on the `pca10056` (a HW debugger
9+
like a Segger J-Link is required to flash firmware images), whereas the
10+
`feather52840` package uses a serial bootloader, with a slightly different
11+
flash layout to account for the bootloader's presence.
12+
13+
Both targets run on the same hardware and assume the same pinouts.
14+
15+
The `feather52840` board support package will be updated at a later date
16+
to reflect any pin changes in the final Feather form-factor HW.
17+
18+
## Installing CircuitPython submodules
19+
20+
Before you can build, you will need to run the following commands once, which
21+
will install the submodules that are part of the CircuitPython ecosystem, and
22+
build the `mpy-cross` tool:
23+
24+
```
25+
$ cd circuitpython
26+
$ git submodule update --init
27+
$ make -C mpy-cross
28+
```
29+
30+
You then need to download the SD and Nordic SDK files via:
31+
32+
> This script relies on `wget`, which must be available from the command line.
33+
34+
```
35+
$ cd ports/nrf
36+
$ ./bluetooth/download_ble_stack.sh
37+
```
38+
39+
## Installing the Serial Bootloader
40+
41+
The Adafruit nRF52840 Feather uses a serial bootloader that allows you to
42+
update the core CircuitPython firmware and internal file system contents
43+
using only a serial connection.
44+
45+
On empty devices, the serial bootloader will need to be flashed once using a
46+
HW debugger such as a Segger J-Link before the serial updater (`adafruit-nrfutil`) can
47+
be used.
48+
49+
### Install `nrfjprog`
50+
51+
Before you can install the bootloader, you will first need to install the
52+
`nrfjprog` tool from Nordic Semiconductors for your operating system. The
53+
binary files can be downloaded via the following links:
54+
55+
- [nRF5x toolset tar for Linux 32-bit v9.7.2](http://www.nordicsemi.com/eng/nordic/Products/nRF52832/nRF5x-Command-Line-Tools-Linux32/52619)
56+
- [nRF5x toolset tar for Linux 64-bit v9.7.2](http://www.nordicsemi.com/eng/nordic/Products/nRF52832/nRF5x-Command-Line-Tools-Linux64/51388)
57+
- [nRF5x toolset tar for OSX v9.7.2](http://www.nordicsemi.com/eng/nordic/Products/nRF52832/nRF5x-Command-Line-Tools-OSX/53406)
58+
- [nRF5x toolset installer for Windows v9.7.2](http://www.nordicsemi.com/eng/nordic/Products/nRF52832/nRF5x-Command-Line-Tools-Win32/48768)
59+
60+
You will then need to add the `nrfjprog` folder to your system `PATH` variable
61+
so that it is available from the command line. The exact process for this is
62+
OS specific, but on a POSIX type system like OS X or Linux, you can
63+
temporarily add the location to your `PATH` environment variables as follows:
64+
65+
```
66+
$ export PATH=$PATH:YOURPATHHERE/nRF5x-Command-Line-Tools_9_7_2_OSX/nrfjprog/
67+
```
68+
69+
You can test this by running the following command:
70+
71+
```
72+
$ nrfjprog --version
73+
nrfjprog version: 9.7.2
74+
JLinkARM.dll version: 6.20f
75+
```
76+
77+
### Flash the USB CDC Bootloader with 'nrfjprog'
78+
79+
> This operation only needs to be done once, and only on boards that don't
80+
already have the serial bootloader installed.
81+
82+
Firstly clone the [Adafruit_nRF52_Bootloader](https://github.com/adafruit/Adafruit_nRF52_Bootloader.git) and enter its directory
83+
84+
```
85+
$ git clone https://github.com/adafruit/Adafruit_nRF52_Bootloader.git
86+
$ cd Adafruit_nRF52_Bootloader
87+
```
88+
89+
Once `nrfjprog` is installed and available in `PATH` you can flash your
90+
board with the serial bootloader via the following command:
91+
92+
```
93+
make BOARD=feather_nrf52840_express VERSION=latest flash
94+
```
95+
96+
This should give you the following (or very similar) output, and you will see
97+
a DFU blinky pattern on one of the board LEDs:
98+
99+
```
100+
$ make BOARD=pca10056 VERSION=latest flash
101+
Flashing: bin/pca10056/6.0.0r0/pca10056_bootloader_s140_6.0.0r0.hex
102+
nrfjprog --program bin/pca10056/6.0.0r0/pca10056_bootloader_s140_6.0.0r0.hex --chiperase -f nrf52 --reset
103+
Parsing hex file.
104+
Erasing user available code and UICR flash areas.
105+
Applying system reset.
106+
Checking that the area to write is not protected.
107+
Programing device.
108+
Applying system reset.
109+
Run.
110+
```
111+
112+
From this point onward, you can now use a simple serial port for firmware
113+
updates.
114+
115+
Note: You can specify other version that are available in the directory `Adafruit_nRF52_Bootloader/bin/feather_nrf52840_express/` . The `VERSION=latest` will use the latest bootloader available.
116+
117+
### IMPORTANT: Disable Mass Storage on PCA10056 J-Link
118+
119+
The J-Link firmware on the PCA10056 implement USB Mass Storage, but this
120+
causes a known conflict with reliable USB CDC serial port communication. In
121+
order to use the serial bootloader, **you must disable MSD support on the
122+
Segger J-Link**!
123+
124+
To disable mass storage support, run the `JLinkExe` (or equivalent) command,
125+
and send `MSDDisable`. (You can re-enable MSD support via `MSDEnable`):
126+
127+
```
128+
$ JLinkExe
129+
SEGGER J-Link Commander V6.20f (Compiled Oct 13 2017 17:20:01)
130+
DLL version V6.20f, compiled Oct 13 2017 17:19:52
131+
132+
Connecting to J-Link via USB...O.K.
133+
Firmware: J-Link OB-SAM3U128-V2-NordicSemi compiled Jul 24 2017 17:30:12
134+
Hardware version: V1.00
135+
S/N: 683947110
136+
VTref = 3.300V
137+
138+
139+
Type "connect" to establish a target connection, '?' for help
140+
J-Link>MSDDisable
141+
Probe configured successfully.
142+
J-Link>exit
143+
```
144+
145+
## Building and Flashing CircuitPython
146+
147+
### Installing `adafruit-nrfutil`
148+
149+
run follow command to install [adafruit-nrfutil](https://github.com/adafruit/Adafruit_nRF52_nrfutil) from PyPi
150+
151+
```
152+
$ pip3 install adafruit-nrfutil --user
153+
```
154+
155+
### Flashing CircuitPython with USB CDC
156+
157+
With the serial bootloader present on your board, you first need to force your
158+
board into DFU mode by holding down BUTTON1 and RESETTING the board (with
159+
BUTTON1 still pressed as you come out of reset).
160+
161+
This will give you a **fast blinky DFU pattern** to indicate you are in DFU
162+
mode.
163+
164+
You can **build and flash** a CircuitPython binary via the following command:
165+
166+
```
167+
$ make V=1 SD=s140 SERIAL=/dev/tty.usbmodem1411 BOARD=feather52840 all dfu-gen dfu-flash
168+
```
169+
170+
This should give you the following results:
171+
172+
```
173+
$make V=1 BOARD=feather52840 SD=s140 SERIAL=/dev/tty.usbmodem1411 dfu-gen dfu-flash
174+
nrfutil dfu genpkg --sd-req 0xFFFE --dev-type 0x0052 --application build-feather52840-s140/firmware.hex build-feather52840-s140/dfu-package.zip
175+
Zip created at build-feather52840-s140/dfu-package.zip
176+
nrfutil --verbose dfu serial --package build-feather52840-s140/dfu-package.zip -p /dev/ttyACM1 -b 115200 --singlebank
177+
Upgrading target on /dev/ttyACM1 with DFU package /home/hathach/Dropbox/adafruit/circuitpython/ada_cp/ports/nrf/build-feather52840-s140/dfu-package.zip. Flow control is disabled, Single bank mode
178+
Starting DFU upgrade of type 4, SoftDevice size: 0, bootloader size: 0, application size: 199840
179+
Sending DFU start packet
180+
Sending DFU init packet
181+
Sending firmware file
182+
#########################################################################################################################################################################################################################################################################################################################################################################################################
183+
Activating new firmware
184+
185+
DFU upgrade took 8.50606513023s
186+
Device programmed.
187+
```
188+
189+
### Flashing CircuitPython with MSC UF2
190+
191+
uf2 file is generated last by `all` target
192+
193+
```
194+
$ make V=1 SD=s140 SERIAL=/dev/tty.usbmodem1411 BOARD=feather52840 all
195+
Create firmware.uf2
196+
../../tools/uf2/utils/uf2conv.py -f 0xADA52840 -c -o "build-feather52840-s140/firmware.uf2" "build-feather52840-s140/firmware.hex"
197+
Converting to uf2, output size: 392192, start address: 0x26000
198+
Wrote 392192 bytes to build-feather52840-s140/firmware.uf2.
199+
```
200+
201+
Simply drag and drop firmware.uf2 to the MSC, the nrf52840 will blink fast and reset after done.

ports/nrf/boards/TG-Watch02A/board.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* This file is part of the MicroPython project, http://micropython.org/
3+
*
4+
* The MIT License (MIT)
5+
*
6+
* Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
7+
*
8+
* Permission is hereby granted, free of charge, to any person obtaining a copy
9+
* of this software and associated documentation files (the "Software"), to deal
10+
* in the Software without restriction, including without limitation the rights
11+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+
* copies of the Software, and to permit persons to whom the Software is
13+
* furnished to do so, subject to the following conditions:
14+
*
15+
* The above copyright notice and this permission notice shall be included in
16+
* all copies or substantial portions of the Software.
17+
*
18+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24+
* THE SOFTWARE.
25+
*/
26+
27+
#include "boards/board.h"
28+
29+
void board_init(void) {
30+
}
31+
32+
bool board_requests_safe_mode(void) {
33+
return false;
34+
}
35+
36+
void reset_board(void) {
37+
38+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/*
2+
* This file is part of the MicroPython project, http://micropython.org/
3+
*
4+
* The MIT License (MIT)
5+
*
6+
* Copyright (c) 2016 Glenn Ruben Bakke
7+
* Copyright (c) 2018 Dan Halbert for Adafruit Industries
8+
*
9+
* Permission is hereby granted, free of charge, to any person obtaining a copy
10+
* of this software and associated documentation files (the "Software"), to deal
11+
* in the Software without restriction, including without limitation the rights
12+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13+
* copies of the Software, and to permit persons to whom the Software is
14+
* furnished to do so, subject to the following conditions:
15+
*
16+
* The above copyright notice and this permission notice shall be included in
17+
* all copies or substantial portions of the Software.
18+
*
19+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25+
* THE SOFTWARE.
26+
*/
27+
28+
#include "nrfx/hal/nrf_gpio.h"
29+
30+
#define MICROPY_HW_BOARD_NAME "TG-Watch02A-rev00"
31+
#define MICROPY_HW_MCU_NAME "nRF52840"
32+
33+
#define FLASH_SIZE (0x100000)
34+
#define FLASH_PAGE_SIZE (4096)
35+
36+
#define MICROPY_HW_NEOPIXEL (&pin_P0_16)
37+
38+
#define MICROPY_HW_LED_STATUS (&pin_P1_15)
39+
40+
#if QSPI_FLASH_FILESYSTEM
41+
#define MICROPY_QSPI_DATA0 NRF_GPIO_PIN_MAP(0, 17)
42+
#define MICROPY_QSPI_DATA1 NRF_GPIO_PIN_MAP(0, 22)
43+
#define MICROPY_QSPI_DATA2 NRF_GPIO_PIN_MAP(0, 23)
44+
#define MICROPY_QSPI_DATA3 NRF_GPIO_PIN_MAP(0, 21)
45+
#define MICROPY_QSPI_SCK NRF_GPIO_PIN_MAP(0, 19)
46+
#define MICROPY_QSPI_CS NRF_GPIO_PIN_MAP(0, 20)
47+
#endif
48+
49+
#if SPI_FLASH_FILESYSTEM
50+
#define SPI_FLASH_MOSI_PIN &pin_P0_17
51+
#define SPI_FLASH_MISO_PIN &pin_P0_22
52+
#define SPI_FLASH_SCK_PIN &pin_P0_19
53+
#define SPI_FLASH_CS_PIN &pin_P0_20
54+
#endif
55+
56+
#define CIRCUITPY_AUTORELOAD_DELAY_MS 500
57+
58+
#define CIRCUITPY_INTERNAL_NVM_SIZE (4096)
59+
60+
#define BOARD_FLASH_SIZE (FLASH_SIZE - 0x4000 - CIRCUITPY_INTERNAL_NVM_SIZE)
61+
62+
#define BOARD_HAS_CRYSTAL 0
63+
64+
#define DEFAULT_I2C_BUS_SCL (&pin_P0_11)
65+
#define DEFAULT_I2C_BUS_SDA (&pin_P0_12)
66+
67+
#define DEFAULT_SPI_BUS_SCK (&pin_P0_14)
68+
#define DEFAULT_SPI_BUS_MOSI (&pin_P0_13)
69+
#define DEFAULT_SPI_BUS_MISO (&pin_P0_15)
70+
71+
#define DEFAULT_UART_BUS_RX (&pin_P0_24)
72+
#define DEFAULT_UART_BUS_TX (&pin_P0_25)
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
USB_VID = 0x239A
2+
USB_PID = 0x802A
3+
USB_PRODUCT = "TG-Watch02"
4+
USB_MANUFACTURER = "TG-Tech
5+
6+
MCU_SERIES = m4
7+
MCU_VARIANT = nrf52
8+
MCU_SUB_VARIANT = nrf52840
9+
MCU_CHIP = nrf52840
10+
SD ?= s140
11+
SOFTDEV_VERSION ?= 6.1.0
12+
13+
BOOT_SETTING_ADDR = 0xFF000
14+
15+
ifeq ($(SD),)
16+
LD_FILE = boards/nrf52840_1M_256k.ld
17+
else
18+
LD_FILE = boards/adafruit_$(MCU_SUB_VARIANT)_$(SD_LOWER)_v$(firstword $(subst ., ,$(SOFTDEV_VERSION))).ld
19+
CIRCUITPY_BLEIO = 1
20+
endif
21+
22+
NRF_DEFINES += -DNRF52840_XXAA -DNRF52840
23+
24+
QSPI_FLASH_FILESYSTEM = 1
25+
EXTERNAL_FLASH_DEVICE_COUNT = 1
26+
EXTERNAL_FLASH_DEVICES = "GD25Q16C"

ports/nrf/boards/TG-Watch02A/pins.c

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#include "shared-bindings/board/__init__.h"
2+
3+
STATIC const mp_rom_map_elem_t board_module_globals_table[] = {
4+
{ MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_P0_04) },
5+
{ MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_P0_05) },
6+
{ MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_P0_30) },
7+
{ MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_P0_28) },
8+
{ MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_P0_02) },
9+
{ MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_P0_03) },
10+
11+
{ MP_ROM_QSTR(MP_QSTR_AREF), MP_ROM_PTR(&pin_P0_31) },
12+
13+
{ MP_ROM_QSTR(MP_QSTR_VOLTAGE_MONITOR), MP_ROM_PTR(&pin_P0_29) },
14+
{ MP_ROM_QSTR(MP_QSTR_BATTERY), MP_ROM_PTR(&pin_P0_29) },
15+
16+
{ MP_ROM_QSTR(MP_QSTR_SWITCH), MP_ROM_PTR(&pin_P1_02) },
17+
18+
{ MP_ROM_QSTR(MP_QSTR_NFC1), MP_ROM_PTR(&pin_P0_09) },
19+
{ MP_ROM_QSTR(MP_QSTR_NFC2), MP_ROM_PTR(&pin_P0_10) },
20+
21+
{ MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_P0_10) },
22+
{ MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_P1_08) },
23+
{ MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_P0_07) },
24+
{ MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_P0_26) },
25+
{ MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_P0_27) },
26+
{ MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_P0_06) },
27+
{ MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_P0_08) },
28+
{ MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_P1_09) },
29+
30+
{ MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_P0_16) },
31+
32+
{ MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_P0_14) },
33+
{ MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_P0_13) },
34+
{ MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_P0_15) },
35+
36+
{ MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_P0_25) },
37+
{ MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_P0_24) },
38+
39+
{ MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_P0_11) },
40+
{ MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_P0_12) },
41+
42+
{ MP_ROM_QSTR(MP_QSTR_L), MP_ROM_PTR(&pin_P1_15) },
43+
{ MP_ROM_QSTR(MP_QSTR_RED_LED), MP_ROM_PTR(&pin_P1_15) },
44+
{ MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_P1_15) },
45+
46+
{ MP_ROM_QSTR(MP_QSTR_BLUE_LED), MP_ROM_PTR(&pin_P1_10) },
47+
48+
{ MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) },
49+
{ MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) },
50+
{ MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) },
51+
};
52+
53+
MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);

0 commit comments

Comments
 (0)