Rewrite README.md
This commit is contained in:
parent
5bb57bd6d7
commit
b9276a561c
290
README.md
290
README.md
|
@ -5,253 +5,85 @@
|
||||||
|
|
||||||
*https://www.pine64.org/pinetime/*
|
*https://www.pine64.org/pinetime/*
|
||||||
|
|
||||||
The goal of this project is to build a firmware designed for the PineTime around FreeRTOS.
|
The **Pinetime** smartwatch is built around the NRF52832 MCU (512KB Flash, 64KB RAM), a 240*240 LCD display driven by the ST7789 controller, an accelerometer, a heartrate sensor and a vibrator.
|
||||||
It's coded using a mix of C and C++ : the NRF52-SDK and FreeRTOS are written in C, but I prefer to write my own code in C++.
|
|
||||||
|
|
||||||
Please **NOTE : for now, this project is in heavy development state**. Feel free to use it, contribute to it or fork it !
|
The goal of this project is to design an open-source firmware for the Pinetime smartwatch :
|
||||||
|
|
||||||
This project is based on https://github.com/JF002/nrf52-baseproject.
|
- Code written in **modern C++**;
|
||||||
It's a CMake project that configure everything needed to build applications for the PineTime (https://wiki.pine64.org/index.php/PineTime).
|
- Build system based on **CMake**;
|
||||||
|
- Based on **[FreeRTOS 10.0.0](https://freertos.org)** real-time OS.
|
||||||
|
- Using **[LittleVGL/LVGL 6.1.2](https://lvgl.io/)** as UI library...
|
||||||
|
- ... and **[NimBLE 1.3.0](https://github.com/apache/mynewt-nimble)** as BLE stack.
|
||||||
|
|
||||||
I tested this project (compile only) with the following versions:
|
##Overview
|
||||||
|
|
||||||
* gcc-arm-none-eabi-8-2019-q3-update (from https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads)
|
![Pinetime screens](images/0.7.0/montage.jpg "PinetimeScreens")
|
||||||
* nRF5_SDK_15.3.0_59ac345 (from https://www.nordicsemi.com/Software-and-Tools/Software/nRF5-SDK)
|
|
||||||
|
|
||||||
I've tested this project on the actual PineTime hardware.
|
As of now, here is the list of achievements of this project:
|
||||||
|
|
||||||
## Current state
|
- Fast and optimized LCD driver
|
||||||
|
- BLE communication
|
||||||
![Pinetime](./images/v0.3.0.png "Pinetime")
|
- Rich user interface via display, touchpanel and push button
|
||||||
|
- Time synchronisation via BLE
|
||||||
* Project builds and runs on the Pinetime;
|
- Notification via BLE
|
||||||
* Logs available via JLink RTT;
|
- Multiple 'apps' :
|
||||||
* SPI (DMA & IRQ based) LCD driver;
|
* Clock (displays the date, time, battery level, ble connection status, heart rate and step count)
|
||||||
* Open source BLE stack : [NimBLE](https://github.com/apache/mynewt-nimble);
|
* Heart rate
|
||||||
* BLE advertising and connection connection;
|
* Motion
|
||||||
* BLE CTS client (retrieves the time from the connected device if it implements a CTS server);
|
* System info (displays various info : BLE MAC, build date/time, uptime, version,...)
|
||||||
* Push button to go to disable screen (and go to low power mode) / enable screen (and wake-up) and UI navigation
|
* Brightess (allows the user to configure the brightness of the display)
|
||||||
* Touch panel support;
|
- Supported by 2 companion apps (developpments ongoing):
|
||||||
* Rich user interface (using [LittleVGL](https://littlevgl.com/)) via display, touchpanel and push button.
|
* [Gadgetbridge](https://codeberg.org/Freeyourgadget/Gadgetbridge/src/branch/pinetime-jf) (on Android)
|
||||||
* Digital watch face and 4 demo applications (spinning meter, analog gauche, push button and message box);
|
* [Amazfish](https://openrepos.net/content/piggz/amazfish) (on SailfishOS)
|
||||||
* Watchdog (automatic reset in case of firmware crash) and reset support (push and hold the button for 7 - 10s);
|
- **[Experimental]** OTA (Over-the-air) update via BLE
|
||||||
* BLE Notification support (still Work-In-Progress, [companion app](https://github.com/JF002/gobbledegook) needed);
|
- **[Experimental]** Bootloader based on [MCUBoot](https://juullabs-oss.github.io/mcuboot/)
|
||||||
* Supported by companion app [Amazfish](https://openrepos.net/content/piggz/amazfish) (time synchronization and notifications are integrated).
|
|
||||||
* **[EXPERIMENTAL]** Firmware update (OTA) via BLE.
|
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
### Build, flash and debug
|
||||||
|
- [Build the project](doc/buildAndProgram.md)
|
||||||
|
- [Bootloader, OTA and DFU](./bootloader/README.md)
|
||||||
|
- [Stub using NRF52-DK](./doc/PinetimeStubWithNrf52DK.md)
|
||||||
|
- Logging with JLink RTT.
|
||||||
|
- Using files from the releases
|
||||||
|
|
||||||
* [BLE implementation and API](./doc/ble.md)
|
### API
|
||||||
* [Bootloader and DFU](./bootloader/README.md)
|
- [BLE implementation and API](./doc/ble.md)
|
||||||
|
|
||||||
## Stub using NRF52-DK
|
### Architecture and technical topics
|
||||||
![Pinetime stub](./images/pinetimestub1.jpg "PinetimeStub")
|
- [Memory analysis](./doc/MemoryAnalysis)
|
||||||
|
|
||||||
See [this page](./doc/PinetimeStubWithNrf52DK.md)
|
### Using the firmware
|
||||||
|
- Integration with Gadgetbridge
|
||||||
## How to build
|
- Integration with AmazFish
|
||||||
|
- Integration with NRFConnect
|
||||||
* Download and unzip arm-none-eabi and NRF52 SDK
|
- Firmware update, OTA
|
||||||
* Clone this repo
|
|
||||||
* **[JLINK]** Call CMake with the following command line argument
|
|
||||||
|
|
||||||
- -DARM_NONE_EABI_TOOLCHAIN_PATH=[Path to the toolchain directory]
|
|
||||||
- -DNRF5_SDK_PATH=[Path to the SDK directory]
|
|
||||||
- -DUSE_JLINK=1
|
|
||||||
- -DNRFJPROG=[Path to NRFJProg executable]
|
|
||||||
|
|
||||||
* OR
|
|
||||||
* **[GDB CLIENT (if you use a BlackMagicProbe, for example)]** Call CMake with the following command line argument
|
|
||||||
|
|
||||||
- -DARM_NONE_EABI_TOOLCHAIN_PATH=[Path to the toolchain directory]
|
|
||||||
- -DNRF5_SDK_PATH=[Path to the SDK directory]
|
|
||||||
- -DUSE_GDB_CLIENT=1
|
|
||||||
- -DGDB_CLIENT_BIN_PATH=[Path to arm-none-eabi-gdb executable]
|
|
||||||
- -DGDB_CLIENT_TARGET_REMOTE=[Target remote connetion string. Ex : /dev/ttyACM0]
|
|
||||||
|
|
||||||
* OR
|
|
||||||
* **[OPENOCD (if you use a STlink v2 clone, for example)]** Call CMake with the following command line argument
|
|
||||||
|
|
||||||
- -DARM_NONE_EABI_TOOLCHAIN_PATH=[Path to the toolchain directory]
|
|
||||||
- -DNRF5_SDK_PATH=[Path to the SDK directory]
|
|
||||||
- -DUSE_OPENOCD=1
|
|
||||||
|
|
||||||
* Optionally, if you want to use a another version then whats on your path
|
|
||||||
|
|
||||||
- -DOPENOCD_BIN_PATH=[path to openocd]
|
|
||||||
|
|
||||||
|
|
||||||
JLINK
|
## TODO - contribute
|
||||||
```
|
|
||||||
$ mkdir build
|
|
||||||
$ cd build
|
|
||||||
$ cmake -DCMAKE_BUILD_TYPE=Debug -DARM_NONE_EABI_TOOLCHAIN_PATH=... -DNRF5_SDK_PATH=... -DUSE_JLINK=1 -DNRFJPROG=... ../
|
|
||||||
```
|
|
||||||
|
|
||||||
GDB (Back Magic Probe)
|
This project is far from beeing finished, and there are still a lot of things to do for this project to become a firmware usable by the general public.
|
||||||
```
|
|
||||||
$ mkdir build
|
|
||||||
$ cd build
|
|
||||||
$ cmake -DARM_NONE_EABI_TOOLCHAIN_PATH=... -DNRF5_SDK_PATH=... -DUSE_GDB_CLIENT=1 -DGDB_CLIENT_BIN_PATH=... -DGDB_CLIENT_TARGET_REMOTE=... ../
|
|
||||||
```
|
|
||||||
|
|
||||||
OpenOCD (STlink v2 clones)
|
Here a quick list out of my head of things to do for this project:
|
||||||
```
|
|
||||||
$ mkdir build
|
|
||||||
$ cd build
|
|
||||||
$ cmake -DARM_NONE_EABI_TOOLCHAIN_PATH=... -DNRF5_SDK_PATH=... -DUSE_OPENOCD=1 -DGDB_CLIENT_BIN_PATH=[optional] ../
|
|
||||||
```
|
|
||||||
|
|
||||||
|
- Improve BLE communication stability and reliability
|
||||||
|
- Improve OTA and MCUBoot bootloader
|
||||||
|
- Add more functionalities : Alarm, chrono, configuration, activities, heart rate logging, games,...
|
||||||
|
- Add more BLE functionalities : call notifications, agenda, configuration, data logging,...
|
||||||
|
- Measure power consumption and improve battery life
|
||||||
|
- Improve documentation, take better pictures and video than mine
|
||||||
|
- Improve the UI
|
||||||
|
- Create companion app for multiple OSes (Linux, Android, IoS) and platforms (desktop, ARM, mobile). Do not forget the other devices from Pine64 like [the Pinephone](https://www.pine64.org/pinephone/) and the [Pinebook Pro](https://www.pine64.org/pinebook-pro/).
|
||||||
|
- Design a simple CI (preferably selfhosted and easy to reproduce).
|
||||||
|
|
||||||
**Note** : By default, the build configuration *Release* is applied. It means that the code is built with optimisations enabled (-O3). If you wanto to compile in *Debug* mode to ease debugging and step-by-step debugging, specify the CMake variable `CMAKE_BUILD_TYPE` in the CMake command line:
|
Do not hesitate to clone/fork the code, hack it and create pull-requests. I'll do my best to review and merge them :)
|
||||||
|
|
||||||
```
|
## Credits
|
||||||
-DCMAKE_BUILD_TYPE=Debug
|
I’m not working alone on this project. First, many people create PR for this projects. Then, there is the whole #pinetime community : a lot of people all around the world who are hacking, searching, experimenting and programming the Pinetime. We exchange our ideas, experiments and code in the chat rooms and forums.
|
||||||
```
|
|
||||||
|
|
||||||
|
Here are some people I would like to highlight:
|
||||||
|
|
||||||
* Make
|
- [Atc1441](https://github.com/atc1441/) : He works on an Arduino based firmware for the Pinetime and many other smartwatches based on similar hardware. He was of great help when I was implementing support for the BMA421 motion sensor and I²C driver.
|
||||||
```
|
- [Koen](https://github.com/bosmoment) : He’s working on a firmware based on RiotOS. He integrated similar libs than me : NimBLE, LittleVGL,… His help was invaluable too!
|
||||||
$ make -j pinetime-app
|
- [Lup Yuen Lee](https://github.com/lupyuen) : He is everywhere : he works on a Rust firmware, buils a MCUBoot based bootloader for the Pinetime, design a Flutter based companion app for smartphones and write a lot of articles about the Pinetime!
|
||||||
```
|
|
||||||
|
|
||||||
## How to program
|
*If you feel like you should appear on this list, just get in touch with me or submit a PR :)*
|
||||||
### Using make
|
|
||||||
|
|
||||||
* Erase
|
|
||||||
|
|
||||||
```
|
|
||||||
$ make FLASH_ERASE
|
|
||||||
```
|
|
||||||
|
|
||||||
* Flash application
|
|
||||||
|
|
||||||
```
|
|
||||||
$ make FLASH_pinetime-app
|
|
||||||
```
|
|
||||||
|
|
||||||
* For your information : list make targets :
|
|
||||||
|
|
||||||
```
|
|
||||||
$ make help
|
|
||||||
```
|
|
||||||
|
|
||||||
### Using GDB and a Black Magic Probe (BMP)
|
|
||||||
You can use this procedure if you want to flash the firmware (from a release, for example) without having to build the project locally.
|
|
||||||
|
|
||||||
Enter the following command into GDB:
|
|
||||||
|
|
||||||
```
|
|
||||||
target extended-remote /dev/ttyACM0
|
|
||||||
monitor swdp_scan
|
|
||||||
attach 1
|
|
||||||
file ./pinetime-app-full.hex
|
|
||||||
load
|
|
||||||
run
|
|
||||||
```
|
|
||||||
|
|
||||||
*Note* : Sometimes, I need to run this procedure 2 times : the first time, the screen stays blank, and the second time, it works. This is something I'll need to debug...
|
|
||||||
|
|
||||||
Example:
|
|
||||||
```
|
|
||||||
$ /home/jf/nrf52/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-gdb
|
|
||||||
|
|
||||||
(gdb) target extended-remote /dev/ttyACM0
|
|
||||||
Remote debugging using /dev/ttyACM0
|
|
||||||
(gdb) monitor swdp_scan
|
|
||||||
Target voltage: ABSENT!
|
|
||||||
Available Targets:
|
|
||||||
No. Att Driver
|
|
||||||
1 Nordic nRF52 M3/M4
|
|
||||||
2 Nordic nRF52 Access Port
|
|
||||||
|
|
||||||
(gdb) attach 1
|
|
||||||
Attaching to Remote target
|
|
||||||
warning: No executable has been specified and target does not support
|
|
||||||
determining executable automatically. Try using the "file" command.
|
|
||||||
0xfffffffe in ?? ()
|
|
||||||
(gdb) file ./pinetime-app-full.hex
|
|
||||||
A program is being debugged already.
|
|
||||||
Are you sure you want to change the file? (y or n) y
|
|
||||||
Reading symbols from ./pinetime-app-full.hex...
|
|
||||||
(No debugging symbols found in ./pinetime-app-full.hex)
|
|
||||||
(gdb) load
|
|
||||||
Loading section .sec1, size 0xb00 lma 0x0
|
|
||||||
Loading section .sec2, size 0xf000 lma 0x1000
|
|
||||||
Loading section .sec3, size 0x10000 lma 0x10000
|
|
||||||
Loading section .sec4, size 0x5150 lma 0x20000
|
|
||||||
Loading section .sec5, size 0xa000 lma 0x26000
|
|
||||||
Loading section .sec6, size 0x10000 lma 0x30000
|
|
||||||
Loading section .sec7, size 0xdf08 lma 0x40000
|
|
||||||
Start address 0x0, load size 314200
|
|
||||||
Transfer rate: 45 KB/sec, 969 bytes/write.
|
|
||||||
```
|
|
||||||
|
|
||||||
## RTT
|
|
||||||
|
|
||||||
RTT is a feature from Segger's JLink devices that allows bidirectionnal communication between the debugger and the target.
|
|
||||||
This feature can be used to get the logs from the embedded software on the development computer.
|
|
||||||
|
|
||||||
* Program the MCU with the code (see above)
|
|
||||||
* Start JLinkExe
|
|
||||||
|
|
||||||
```
|
|
||||||
$ JLinkExe -device nrf52 -if swd -speed 4000 -autoconnect 1
|
|
||||||
```
|
|
||||||
|
|
||||||
* Start JLinkRTTClient
|
|
||||||
|
|
||||||
```
|
|
||||||
$ JLinkRTTClient
|
|
||||||
```
|
|
||||||
|
|
||||||
## Tools
|
|
||||||
|
|
||||||
- https://github.com/eliotstock/memory : display the memory usage (FLASH/RAM) using the .map file from GCC.
|
|
||||||
|
|
||||||
## BLE connection and time synchronization
|
|
||||||
At runtime, BLE advertising is started. You can then use a smartphone or computer to connect and bond to your Pinetime.
|
|
||||||
As soon as a device is bonded, Pinetime will look for a **CTS** server (**C**urrent **T**ime **S**ervice) on the connected device.
|
|
||||||
|
|
||||||
### Using Android and NRFConnect
|
|
||||||
Here is how to do it with an Android smartphone running NRFConnect:
|
|
||||||
|
|
||||||
* Build and program the firmware on the Pinetime
|
|
||||||
* Install NRFConnect (https://www.nordicsemi.com/Software-and-Tools/Development-Tools/nRF-Connect-for-desktop)
|
|
||||||
* Start NRFConnect and create a CTS server :
|
|
||||||
- Tap the hamburger button on the top left and select "Configure GATT server"
|
|
||||||
- Tap "Add service" on the bottom
|
|
||||||
- Select server configuration "Current Time Service" and tap OK
|
|
||||||
* Go back to the main screen and scan for BLE devices. A device called "PineTime" should appear
|
|
||||||
* Tap the button "Connect" next to the PineTime device. It should connect to the PineTime and switch to a new tab.
|
|
||||||
* If a CTS server is found, the Pinetime should update its time with the time provided by the server.
|
|
||||||
|
|
||||||
### Using Linux and bluetoothctl
|
|
||||||
* Ensure that your bluetooth controller is enabled and working fine. I've tested this on a x86 Debian computer and on a RaspberryPi 3.
|
|
||||||
* Run bluetoothctl as root : `sudo bluetoothctl`
|
|
||||||
* Enter the following commands:
|
|
||||||
* `scan on` and wait for you Pinetime to be detected. Note the BLE MAC address
|
|
||||||
* `scan off'
|
|
||||||
* `trust <MAC ADDRESS>`
|
|
||||||
* `pair <MAC ADDRESS>`
|
|
||||||
* Wait for some time, and the connection should be established.
|
|
||||||
|
|
||||||
**NOTE : ** The commands above establish a BLE connection between your PC, but the time synchronization and notifications won't work because there is not CTS or ANS server running. I'm currently working on an application that'll provide both of these servers.
|
|
||||||
|
|
||||||
### Troubleshooting
|
|
||||||
If the connection cannot be established, or the time synchronization does not work, try the following steps.
|
|
||||||
|
|
||||||
On Android:
|
|
||||||
* Disable and re-enable your bluetooth device
|
|
||||||
* In NRFConnect, in the device tab corresponding to your pinetime, tap on the menu on the top left of the screen and select "Delete bond information".
|
|
||||||
* Then re-try to bond/connect.
|
|
||||||
|
|
||||||
On Linux:
|
|
||||||
* Reset the bluetooth device : `sudo hciconfig hci0 reset`
|
|
||||||
* Restart the Bluetooth service : `sudo systemctl restart bluetooth.service`
|
|
||||||
* In bluetootctl:
|
|
||||||
* `remove <MAC ADDRESS>`
|
|
||||||
* `trust <MAC ADDRESS>`
|
|
||||||
* `pair <MAC ADDRESS>`
|
|
||||||
|
|
||||||
Note that the current firmware only advertise for the first 3 minutes. If you cannot connect after more than 3 minutes, try resetting the device (push the button and hold it for 7-10 seconds).
|
|
||||||
|
|
76
README2.md
76
README2.md
|
@ -1,76 +0,0 @@
|
||||||
# PineTime
|
|
||||||
> The PineTime is a free and open source smartwatch capable of running custom-built open operating systems. Some of the notable features include a heart rate monitor, a week-long battery as well as a capacitive touch IPS display that is legible in direct sunlight. It is a fully community driven side-project, which means that it will ultimately be up to the developers and end-users to determine when they deem the PineTime ready to ship.
|
|
||||||
|
|
||||||
> We envision the PineTime as a companion for not only your PinePhone but also for your favorite devices — any phone, tablet, or even PC.
|
|
||||||
|
|
||||||
*https://www.pine64.org/pinetime/*
|
|
||||||
|
|
||||||
The **Pinetime** smartwatch is based built around the NRF52832 MCU (512KB Flash, 64KB Ram), a 240*240 LCD display driven by the ST7789 controller, an accelerometer, a heartrate sensor and a vibrator.
|
|
||||||
|
|
||||||
The goal of this project is to design an open-source firmware for the Pinetime smartwatch :
|
|
||||||
|
|
||||||
- Code written in **modern C++**;
|
|
||||||
- Build system based on **CMake**;
|
|
||||||
- Based on **[FreeRTOS](https://freertos.org)** real-time OS.
|
|
||||||
- Using **[LittleVGL/LVGL](https://lvgl.io/)** as UI library...
|
|
||||||
- ... and **[NimBLE](https://github.com/apache/mynewt-nimble)** as BLE stack.
|
|
||||||
|
|
||||||
##Overview
|
|
||||||
|
|
||||||
![Pinetime screens](images/0.7.0/montage.jpg "PinetimeScreens")
|
|
||||||
|
|
||||||
As of now, here is the list of achievements of this project:
|
|
||||||
|
|
||||||
- Fast and optimized LCD driver
|
|
||||||
- BLE communication
|
|
||||||
- Rich user interface via display, touchpanel and push button
|
|
||||||
- Time synchronisation via BLE
|
|
||||||
- Notification via BLE
|
|
||||||
- Multiples 'apps' :
|
|
||||||
* Clock (displays the date, time, battery level, ble connection status, heart rate and step count)
|
|
||||||
* Heart rate
|
|
||||||
* Motion
|
|
||||||
* System info (displays various info : BLE MAC, build date/time, uptime, version,...)
|
|
||||||
* Brightess (allows the user to configure the brightness of the display)
|
|
||||||
- Supported by 2 companion apps (developpments ongoing):
|
|
||||||
* [Gadgetbridge](https://codeberg.org/Freeyourgadget/Gadgetbridge/src/branch/pinetime-jf) (on Android)
|
|
||||||
* [Amazfish](https://openrepos.net/content/piggz/amazfish) (on SailfishOS)
|
|
||||||
- **[Experimental]** OTA (Over-the-air) update via BLE
|
|
||||||
- **[Experimental]** Bootloader based on [MCUBoot](https://juullabs-oss.github.io/mcuboot/)
|
|
||||||
|
|
||||||
## Documentation
|
|
||||||
|
|
||||||
- Build & program
|
|
||||||
- Bootloader, OTA and DFU
|
|
||||||
- Stub using NRF52-DK
|
|
||||||
- BLE implementation and API
|
|
||||||
- Memory analysis
|
|
||||||
|
|
||||||
## TODO - contribute
|
|
||||||
|
|
||||||
This project is far from beeing finished, and there are still a lot of things to do for this project to become a firmware usable by the general public.
|
|
||||||
|
|
||||||
Here a quick list out of my head of things to do for this project:
|
|
||||||
|
|
||||||
- Improve BLE communication stability and reliability
|
|
||||||
- Improve OTA and MCUBoot bootloader
|
|
||||||
- Add more functionalities : Alarm, chrono, configuration, activities, heart rate logging, games,...
|
|
||||||
- Add more BLE functionalities : call notifications, agenda, configuration, data logging,...
|
|
||||||
- Measure power consumption and improve battery life
|
|
||||||
- Improve documentation, take better pictures and video than mine
|
|
||||||
- Improve the UI
|
|
||||||
- Create companion app for multiple OSes (Linux, Android, IoS) and platforms (desktop, ARM, mobile). Do not forget the other devices from Pine64 like [the Pinephone](https://www.pine64.org/pinephone/) and the [Pinebook Pro](https://www.pine64.org/pinebook-pro/).
|
|
||||||
- Design a simple CI (preferably selfhosted and easy to reproduce).
|
|
||||||
|
|
||||||
Do not hesitate to clone/fork the code, hack it and create pull-requests. I'll do my best to review and merge them :)
|
|
||||||
|
|
||||||
## Credits
|
|
||||||
I’m not working alone on this project. First, many people create PR for this projects. Then, there is the whole #pinetime community : a lot of people all around the world who are hacking, searching, experimenting and programming the Pinetime. We exchange our ideas, experiments and code in the chat rooms and forums.
|
|
||||||
|
|
||||||
Here are some people I would like to highlight:
|
|
||||||
|
|
||||||
- Atc1441 : He works on an Arduino based firmware for the Pinetime and many other smartwatches based on similar hardware. He was of great help when I was implementing support for the BMA421 motion sensor and I²C driver.
|
|
||||||
- Koen : He’s working on a firmware based on RiotOS. He integrated similar libs than me : NimBLE, LittleVGL,… His help was invaluable too!
|
|
||||||
- Lup Yuen Lee : He is everywhere : he works on a Rust firmware, buils a MCUBoot based bootloader for the Pinetime, design a Flutter based companion app for smartphones and write a lot of articles about the Pinetime!
|
|
||||||
|
|
||||||
*If you feel like you should appear on this list, just get in touch with me or submit a PR :)**
|
|
|
@ -73,3 +73,6 @@ add_definitions(-D__STACK_SIZE=8192)
|
||||||
|
|
||||||
#NimBLE buffers
|
#NimBLE buffers
|
||||||
*TODO*
|
*TODO*
|
||||||
|
|
||||||
|
#Tools
|
||||||
|
- https://github.com/eliotstock/memory : display the memory usage (FLASH/RAM) using the .map file from GCC.
|
209
doc/buildAndProgram.md
Normal file
209
doc/buildAndProgram.md
Normal file
|
@ -0,0 +1,209 @@
|
||||||
|
# Build
|
||||||
|
##Dependencies
|
||||||
|
To build this project, you'll need:
|
||||||
|
- A cross-compiler : [gcc-arm-none-eabi-8-2019-q3-update](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads/8-2019q3-update)
|
||||||
|
- The NRF52 SDK 15.3.0 : [nRF5_SDK_15.3.0_59ac345](https://developer.nordicsemi.com/nRF5_SDK/nRF5_SDK_v15.x.x/nRF5_SDK_15.3.0_59ac345.zip)
|
||||||
|
- A reasonably recent version of CMake (I use 3.16.5)
|
||||||
|
|
||||||
|
##Build steps
|
||||||
|
###Clone the repo
|
||||||
|
```
|
||||||
|
git clone https://github.com/JF002/Pinetime.git
|
||||||
|
cd Pinetime
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
```
|
||||||
|
###Project generation using CMake
|
||||||
|
CMake configures the project according to variables you specify the command line. The variables are:
|
||||||
|
|
||||||
|
Variable | Description | Example|
|
||||||
|
----------|-------------|--------|
|
||||||
|
**ARM_NONE_EABI_TOOLCHAIN_PATH**|path to the toolchain directory|`-DARM_NONE_EABI_TOOLCHAIN_PATH=/home/jf/nrf52/gcc-arm-none-eabi-9-2019-q4-major/`|
|
||||||
|
**NRF5_SDK_PATH**|path to the NRF52 SDK|`-DNRF5_SDK_PATH=/home/jf/nrf52/Pinetime/sdk`|
|
||||||
|
**USE_JLINK, USE_GDB_CLIENT and USE_OPENOCD**|Enable *JLink* mode, *GDB Client* (Black Magic Probe) mode or *OpenOCD* mode (set the one you want to use to `1`)|`-DUSE_JLINK=1`
|
||||||
|
**CMAKE_BUILD_TYPE**| Build type (Release or Debug). Release is applied by default if this variable is not specified.|`-DCMAKE_BUILD_TYPE=Debug`
|
||||||
|
**NRFJPROG**|Path to the NRFJProg executable. Used only if `USE_JLINK` is 1.|`-DNRFJPROG=/opt/nrfjprog/nrfjprog`
|
||||||
|
**GDB_CLIENT_BIN_PATH**|Path to arm-none-eabi-gdb executable. Used only if `USE_GDB_CLIENT` is 1.|`-DGDB_CLIENT_BIN_PATH=/home/jf/nrf52/gcc-arm-none-eabi-9-2019-q4-major/bin/arm-none-eabi-gdb`
|
||||||
|
**GDB_CLIENT_TARGET_REMOTE**|Target remote connection string. Used only if `USE_GDB_CLIENT` is 1.|`-DGDB_CLIENT_TARGET_REMOTE=/dev/ttyACM0`
|
||||||
|
|
||||||
|
|
||||||
|
####CMake command line for JLink
|
||||||
|
```
|
||||||
|
cmake -DCMAKE_BUILD_TYPE=Debug -DARM_NONE_EABI_TOOLCHAIN_PATH=... -DNRF5_SDK_PATH=... -DUSE_JLINK=1 -DNRFJPROG=... ../
|
||||||
|
```
|
||||||
|
|
||||||
|
####CMake command line for GDB Client (Black Magic Probe)
|
||||||
|
```
|
||||||
|
cmake -DARM_NONE_EABI_TOOLCHAIN_PATH=... -DNRF5_SDK_PATH=... -DUSE_GDB_CLIENT=1 -DGDB_CLIENT_BIN_PATH=... -DGDB_CLIENT_TARGET_REMOTE=... ../
|
||||||
|
```
|
||||||
|
|
||||||
|
####CMake command line for OpenOCD
|
||||||
|
```
|
||||||
|
cmake -DARM_NONE_EABI_TOOLCHAIN_PATH=... -DNRF5_SDK_PATH=... -DUSE_OPENOCD=1 -DGDB_CLIENT_BIN_PATH=[optional] ../
|
||||||
|
```
|
||||||
|
|
||||||
|
###Build the project
|
||||||
|
During the project generation, CMake created the following targets:
|
||||||
|
- FLASH_ERASE : mass erase the flash memory of the NRF52.
|
||||||
|
- FLASH_pinetime-app : flash the firmware into the NRF52.
|
||||||
|
- pinetime-app : build the standalone (without bootloader support) version of the firmware.
|
||||||
|
- pinetime-mcuboot-app : build the firmware with the support of the bootloader (based on MCUBoot).
|
||||||
|
- pinetime-graphics : small firmware that writes the boot graphics into the SPI flash.
|
||||||
|
|
||||||
|
If you just want to build the project and run it on the Pinetime, using *pinetime-app* is recommanded. See ???? for more info about bootloader support.
|
||||||
|
|
||||||
|
Build:
|
||||||
|
```
|
||||||
|
make -j pinetime-app
|
||||||
|
```
|
||||||
|
|
||||||
|
List of files generated:
|
||||||
|
Binary files are generated into the folder `src`:
|
||||||
|
- **pinetime-app.bin, .hex and .out** : standalone firmware in bin, hex and out formats.
|
||||||
|
- **pinetime-app.map** : map file
|
||||||
|
- **pinetime-mcuboot-app.bin, .hex and .out** : firmware with bootloader support in bin, hex and out formats.
|
||||||
|
- **pinetime-mcuboot-app.map** : map file
|
||||||
|
- **pinetime-graphics.bin, .hex and .out** : firmware for the boot graphic in bin, hex and out formats.
|
||||||
|
- **pinetime-graphics.map** : map file
|
||||||
|
|
||||||
|
###Program and run
|
||||||
|
####Using CMake targets
|
||||||
|
These target have been configured during the project generation by CMake according to the parameters you provided to the command line.
|
||||||
|
|
||||||
|
Mass erase:
|
||||||
|
```
|
||||||
|
make FLASH_ERASE
|
||||||
|
```
|
||||||
|
|
||||||
|
Flash the application:
|
||||||
|
```
|
||||||
|
make FLASH_pinetime-app
|
||||||
|
```
|
||||||
|
|
||||||
|
###Using JLink
|
||||||
|
Start JLinkExe:
|
||||||
|
```
|
||||||
|
$ /opt/SEGGER/JLink/JLinkExe -device nrf52 -if swd -speed 4000 -autoconnect 1
|
||||||
|
SEGGER J-Link Commander V6.70d (Compiled Apr 16 2020 17:59:37)
|
||||||
|
DLL version V6.70d, compiled Apr 16 2020 17:59:25
|
||||||
|
|
||||||
|
Connecting to J-Link via USB...O.K.
|
||||||
|
Firmware: J-Link OB-SAM3U128-V2-NordicSemi compiled Mar 17 2020 14:43:00
|
||||||
|
Hardware version: V1.00
|
||||||
|
S/N: 682579153
|
||||||
|
License(s): RDI, FlashBP, FlashDL, JFlash, GDB
|
||||||
|
VTref=3.300V
|
||||||
|
Device "NRF52" selected.
|
||||||
|
|
||||||
|
|
||||||
|
Connecting to target via SWD
|
||||||
|
InitTarget() start
|
||||||
|
InitTarget() end
|
||||||
|
Found SW-DP with ID 0x2BA01477
|
||||||
|
DPIDR: 0x2BA01477
|
||||||
|
Scanning AP map to find all available APs
|
||||||
|
AP[2]: Stopped AP scan as end of AP map has been reached
|
||||||
|
AP[0]: AHB-AP (IDR: 0x24770011)
|
||||||
|
AP[1]: JTAG-AP (IDR: 0x02880000)
|
||||||
|
Iterating through AP map to find AHB-AP to use
|
||||||
|
AP[0]: Core found
|
||||||
|
AP[0]: AHB-AP ROM base: 0xE00FF000
|
||||||
|
CPUID register: 0x410FC241. Implementer code: 0x41 (ARM)
|
||||||
|
Found Cortex-M4 r0p1, Little endian.
|
||||||
|
FPUnit: 6 code (BP) slots and 2 literal slots
|
||||||
|
CoreSight components:
|
||||||
|
ROMTbl[0] @ E00FF000
|
||||||
|
ROMTbl[0][0]: E000E000, CID: B105E00D, PID: 000BB00C SCS-M7
|
||||||
|
ROMTbl[0][1]: E0001000, CID: B105E00D, PID: 003BB002 DWT
|
||||||
|
ROMTbl[0][2]: E0002000, CID: B105E00D, PID: 002BB003 FPB
|
||||||
|
ROMTbl[0][3]: E0000000, CID: B105E00D, PID: 003BB001 ITM
|
||||||
|
ROMTbl[0][4]: E0040000, CID: B105900D, PID: 000BB9A1 TPIU
|
||||||
|
ROMTbl[0][5]: E0041000, CID: B105900D, PID: 000BB925 ETM
|
||||||
|
Cortex-M4 identified.
|
||||||
|
J-Link>
|
||||||
|
```
|
||||||
|
|
||||||
|
Use the command loadfile to program the .hex file:
|
||||||
|
```
|
||||||
|
J-Link>loadfile pinetime-app.hex
|
||||||
|
Downloading file [pinetime-app.hex]...
|
||||||
|
Comparing flash [100%] Done.
|
||||||
|
Erasing flash [100%] Done.
|
||||||
|
Programming flash [100%] Done.
|
||||||
|
Verifying flash [100%] Done.
|
||||||
|
J-Link: Flash download: Bank 0 @ 0x00000000: 1 range affected (4096 bytes)
|
||||||
|
J-Link: Flash download: Total time needed: 0.322s (Prepare: 0.043s, Compare: 0.202s, Erase: 0.003s, Program: 0.064s, Verify: 0.000s, Restore: 0.007s)
|
||||||
|
O.K.
|
||||||
|
```
|
||||||
|
|
||||||
|
Then reset (r) and start (g) the CPU:
|
||||||
|
```
|
||||||
|
J-Link>r
|
||||||
|
Reset delay: 0 ms
|
||||||
|
Reset type NORMAL: Resets core & peripherals via SYSRESETREQ & VECTRESET bit.
|
||||||
|
Reset: Halt core after reset via DEMCR.VC_CORERESET.
|
||||||
|
Reset: Reset device via AIRCR.SYSRESETREQ.
|
||||||
|
J-Link>g
|
||||||
|
```
|
||||||
|
|
||||||
|
####JLink RTT
|
||||||
|
RTT is a feature from Segger's JLink devices that allows bidirectionnal communication between the debugger and the target. This feature can be used to get the logs from the embedded software on the development computer.
|
||||||
|
|
||||||
|
- Program the MCU with the code (see above)
|
||||||
|
- Start JLinkExe
|
||||||
|
|
||||||
|
```
|
||||||
|
$ JLinkExe -device nrf52 -if swd -speed 4000 -autoconnect 1
|
||||||
|
```
|
||||||
|
|
||||||
|
Start JLinkRTTClient
|
||||||
|
```
|
||||||
|
$ JLinkRTTClient
|
||||||
|
```
|
||||||
|
|
||||||
|
###Using GDB and Black Magic Probe (BMP)
|
||||||
|
Enter the following command into GDB:
|
||||||
|
|
||||||
|
```
|
||||||
|
target extended-remote /dev/ttyACM0
|
||||||
|
monitor swdp_scan
|
||||||
|
attach 1
|
||||||
|
file ./pinetime-app-full.hex
|
||||||
|
load
|
||||||
|
run
|
||||||
|
```
|
||||||
|
|
||||||
|
Example :
|
||||||
|
```
|
||||||
|
$ /home/jf/nrf52/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-gdb
|
||||||
|
|
||||||
|
(gdb) target extended-remote /dev/ttyACM0
|
||||||
|
Remote debugging using /dev/ttyACM0
|
||||||
|
(gdb) monitor swdp_scan
|
||||||
|
Target voltage: ABSENT!
|
||||||
|
Available Targets:
|
||||||
|
No. Att Driver
|
||||||
|
1 Nordic nRF52 M3/M4
|
||||||
|
2 Nordic nRF52 Access Port
|
||||||
|
|
||||||
|
(gdb) attach 1
|
||||||
|
Attaching to Remote target
|
||||||
|
warning: No executable has been specified and target does not support
|
||||||
|
determining executable automatically. Try using the "file" command.
|
||||||
|
0xfffffffe in ?? ()
|
||||||
|
(gdb) file ./pinetime-app-full.hex
|
||||||
|
A program is being debugged already.
|
||||||
|
Are you sure you want to change the file? (y or n) y
|
||||||
|
Reading symbols from ./pinetime-app-full.hex...
|
||||||
|
(No debugging symbols found in ./pinetime-app-full.hex)
|
||||||
|
(gdb) load
|
||||||
|
Loading section .sec1, size 0xb00 lma 0x0
|
||||||
|
Loading section .sec2, size 0xf000 lma 0x1000
|
||||||
|
Loading section .sec3, size 0x10000 lma 0x10000
|
||||||
|
Loading section .sec4, size 0x5150 lma 0x20000
|
||||||
|
Loading section .sec5, size 0xa000 lma 0x26000
|
||||||
|
Loading section .sec6, size 0x10000 lma 0x30000
|
||||||
|
Loading section .sec7, size 0xdf08 lma 0x40000
|
||||||
|
Start address 0x0, load size 314200
|
||||||
|
Transfer rate: 45 KB/sec, 969 bytes/write.
|
||||||
|
```
|
Loading…
Reference in New Issue
Block a user