From 389c05b6433a591f4a5b6e0afca36534927b0176 Mon Sep 17 00:00:00 2001 From: Tavish Naruka Date: Fri, 12 Apr 2019 19:41:55 +0530 Subject: [PATCH] Add support for Electronut Labs Papyr Signed-off-by: Tavish Naruka --- README.md | 1 + src/boards/electronut_labs_papyr.h | 99 ++++++++++++++++++++++++++++++ src/usb/usb_desc.c | 43 +++++++------ src/usb/usb_desc.h | 8 +++ 4 files changed, 131 insertions(+), 20 deletions(-) create mode 100644 src/boards/electronut_labs_papyr.h diff --git a/README.md b/README.md index fba1c8e..6834ac0 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ This is a CDC/DFU/UF2 bootloader for nRF52 boards. - Particle Boron - Particle Xenon - MakerDiary MDK nRF52840 USB Dongle +- [Electronut Labs Papyr](https://docs.electronut.in/papyr/) UF2 is an easy-to-use bootloader that appears as a flash drive. You can just copy `.uf2`-format application images to the flash drive to load new firmware. diff --git a/src/boards/electronut_labs_papyr.h b/src/boards/electronut_labs_papyr.h new file mode 100644 index 0000000..8911584 --- /dev/null +++ b/src/boards/electronut_labs_papyr.h @@ -0,0 +1,99 @@ +/**************************************************************************/ +/*! + @file elelctronutlabs_papyr.h + @author Tavish Naruka + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2017, Adafruit Industries (adafruit.com) + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#ifndef PAPYR_H +#define PAPYR_H + +/*------------------------------------------------------------------*/ +/* LED + *------------------------------------------------------------------*/ +#define LEDS_NUMBER 2 +#define LED_PRIMARY_PIN 13 +#define LED_SECONDARY_PIN 14 +#define LED_STATE_ON 0 + +/*------------------------------------------------------------------*/ +/* BUTTON + *------------------------------------------------------------------*/ +// NOTE: USB UF2 bootloader can be triggered by double pressing RESET +// App can trigger OTA bootloader by writing DFU_MAGIC_OTA_APPJUM to +// GPREGRET register if softdevice is not initialized; or by +// writing DFU_MAGIC_OTA_RESET in case softdevice is initialized. +#define BUTTONS_NUMBER 2 +#define BUTTON_1 18 // RESET also by default +#define BUTTON_2 1 // P0.1 not exposed anywhere, FRST n/a +#define BUTTON_PULL NRF_GPIO_PIN_PULLUP + +/*------------------------------------------------------------------*/ +/* UART + *------------------------------------------------------------------*/ +#define RX_PIN_NUMBER 7 +#define TX_PIN_NUMBER 8 +#define CTS_PIN_NUMBER 0 +#define RTS_PIN_NUMBER 0 +#define HWFC false + +// Used as model string in OTA mode +#define DIS_MANUFACTURER "Electronut Labs" +#define DIS_MODEL "Papyr" + +#define BOARD_ID "Electronut Labs Papyr" +#define INDEX_URL "https://docs.electronut.in/papyr" + +#define USB_DESC_VID 0x239A +#define USB_DESC_UF2_PID 0x003B + +#define USB_STRING_DESCRIPTORS { \ + /* 0: is supported language = English */ \ + TUD_DESC_STRCONV(0x0409), \ + \ + /* 1: Manufacturer */ \ + TUD_DESC_STRCONV('E','l','e','c','t','r','o','n','u','t',' ','L','a','b','s'), \ + \ + /* 2: Product */ \ + TUD_DESC_STRCONV('P','a','p','y','r', ' ', 'D','F','U'), \ + \ + /* 3: Serials TODO use chip ID */ \ + usb_desc_str_serial, \ + \ + /* 4: CDC Interface */ \ + TUD_DESC_STRCONV('P','a','p','y','r',' ','S','e','r','i','a','l'), \ + \ + /* 5: MSC Interface */ \ + TUD_DESC_STRCONV('P','a','p','y','r',' ','U','F','2'), \ +} + +#endif // PPAPYR_H diff --git a/src/usb/usb_desc.c b/src/usb/usb_desc.c index 4e5f5a3..06fd089 100644 --- a/src/usb/usb_desc.c +++ b/src/usb/usb_desc.c @@ -79,30 +79,33 @@ enum { // STRING DESCRIPTORS //--------------------------------------------------------------------+ +#ifndef USB_STRING_DESCRIPTORS +#define USB_STRING_DESCRIPTORS { \ + /* 0: is supported language = English */ \ + TUD_DESC_STRCONV(0x0409), \ + \ + /* 1: Manufacturer */ \ + TUD_DESC_STRCONV('A','d','a','f','r','u','i','t',' ','I','n','d','u','s','t','r','i','e','s'), \ + \ + /* 2: Product */ \ + TUD_DESC_STRCONV('B','l','u','e','f','r','u','i','t',' ','n','R','F','5','2','8','4','0', ' ', 'D','F','U'), \ + \ + /* 3: Serials TODO use chip ID */ \ + usb_desc_str_serial, \ + \ + /* 4: CDC Interface */ \ + TUD_DESC_STRCONV('B','l','u','e','f','r','u','i','t',' ','S','e','r','i','a','l'), \ + \ + /* 5: MSC Interface */ \ + TUD_DESC_STRCONV('B','l','u','e','f','r','u','i','t',' ','U','F','2'), \ +} +#endif + // Serial is 64-bit DeviceID -> 16 chars len uint16_t usb_desc_str_serial[1+16] = { TUD_DESC_STR_HEADER(16) }; // array of pointer to string descriptors -uint16_t const * const string_desc_arr [] = -{ - // 0: is supported language = English - TUD_DESC_STRCONV(0x0409), - - // 1: Manufacturer - TUD_DESC_STRCONV('A','d','a','f','r','u','i','t',' ','I','n','d','u','s','t','r','i','e','s'), - - // 2: Product - TUD_DESC_STRCONV('B','l','u','e','f','r','u','i','t',' ','n','R','F','5','2','8','4','0', ' ', 'D','F','U'), - - // 3: Serials TODO use chip ID - usb_desc_str_serial, - - // 4: CDC Interface - TUD_DESC_STRCONV('B','l','u','e','f','r','u','i','t',' ','S','e','r','i','a','l'), - - // 5: MSC Interface - TUD_DESC_STRCONV('B','l','u','e','f','r','u','i','t',' ','U','F','2'), -}; +uint16_t const * const string_desc_arr [] = USB_STRING_DESCRIPTORS; //--------------------------------------------------------------------+ // Device Descriptor diff --git a/src/usb/usb_desc.h b/src/usb/usb_desc.h index b81946a..06d68ed 100644 --- a/src/usb/usb_desc.h +++ b/src/usb/usb_desc.h @@ -40,15 +40,23 @@ #define USB_DESC_H_ #include "tusb.h" +#include "boards.h" #ifdef __cplusplus extern "C" { #endif +#ifndef USB_DESC_VID #define USB_DESC_VID 0x239A +#endif +#ifndef USB_DESC_UF2_PID #define USB_DESC_UF2_PID 0x0029 +#endif + +#ifndef USB_DESC_SERIAL_ONLY_PID #define USB_DESC_SERIAL_ONLY_PID 0x002A +#endif /*------------- Configuration Descriptor -------------*/