Contiki-NG
usb-dfu-trigger.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017 - 2019, Nordic Semiconductor ASA
3  *
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without modification,
7  * are permitted provided that the following conditions are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright notice, this
10  * list of conditions and the following disclaimer.
11  *
12  * 2. Redistributions in binary form, except as embedded into a Nordic
13  * Semiconductor ASA integrated circuit in a product or a software update for
14  * such product, must reproduce the above copyright notice, this list of
15  * conditions and the following disclaimer in the documentation and/or other
16  * materials provided with the distribution.
17  *
18  * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
19  * contributors may be used to endorse or promote products derived from this
20  * software without specific prior written permission.
21  *
22  * 4. This software, with or without modification, must only be used with a
23  * Nordic Semiconductor ASA integrated circuit.
24  *
25  * 5. Any software provided in binary form under this license must not be reverse
26  * engineered, decompiled, modified and/or disassembled.
27  *
28  * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
29  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
30  * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
31  * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
32  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
33  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
34  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
36  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
37  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38  *
39  */
40 /**
41  * \addtogroup nrf52840-usb
42  * @{
43  *
44  * \file
45  * Implementation of the nRF dongle USB DFU trigger interface.
46  * This allows nrfutil to reset the PCA10059 dongle to bootloader mode.
47  *
48  * Based on lib/nrf52-sdk/components/libraries/bootloader/dfu/nrf_dfu_trigger_usb.c
49  *
50  */
51 /*---------------------------------------------------------------------------*/
52 #include "app_usbd.h"
53 #include "app_usbd_nrf_dfu_trigger.h"
54 #include "nrf_gpio.h"
55 #include "boards.h"
56 /*---------------------------------------------------------------------------*/
57 #ifndef BSP_SELF_PINRESET_PIN
58 #error "This module is intended to be used with boards that have the GP pin shortened with the RESET pin."
59 #endif
60 /*---------------------------------------------------------------------------*/
61 #define DFU_FLASH_PAGE_SIZE (NRF_FICR->CODEPAGESIZE)
62 #define DFU_FLASH_PAGE_COUNT (NRF_FICR->CODESIZE)
63 /*---------------------------------------------------------------------------*/
64 static uint8_t m_version_string[] = "Contiki-NG DFU";
65 static app_usbd_nrf_dfu_trigger_nordic_info_t m_dfu_info;
66 /*---------------------------------------------------------------------------*/
67 static void
68 dfu_trigger_evt_handler(app_usbd_class_inst_t const *p_inst,
69  app_usbd_nrf_dfu_trigger_user_event_t event)
70 {
71  UNUSED_PARAMETER(p_inst);
72 
73  switch(event) {
74  case APP_USBD_NRF_DFU_TRIGGER_USER_EVT_DETACH:
75  nrf_gpio_cfg_output(BSP_SELF_PINRESET_PIN);
76  nrf_gpio_pin_clear(BSP_SELF_PINRESET_PIN);
77  break;
78  default:
79  break;
80  }
81 }
82 /*---------------------------------------------------------------------------*/
83 APP_USBD_NRF_DFU_TRIGGER_GLOBAL_DEF(m_app_dfu,
84  NRF_DFU_TRIGGER_USB_INTERFACE_NUM,
85  &m_dfu_info, m_version_string,
86  dfu_trigger_evt_handler);
87 /*---------------------------------------------------------------------------*/
88 void
90 {
91  app_usbd_class_inst_t const *class_dfu;
92 
93  m_dfu_info.wAddress = CODE_START;
94  m_dfu_info.wFirmwareSize = CODE_SIZE;
95  m_dfu_info.wVersionMajor = 0;
96  m_dfu_info.wVersionMinor = 0;
97  m_dfu_info.wFirmwareID = 0;
98  m_dfu_info.wFlashPageSize = DFU_FLASH_PAGE_SIZE;
99  m_dfu_info.wFlashSize = m_dfu_info.wFlashPageSize * DFU_FLASH_PAGE_COUNT;
100 
101  class_dfu = app_usbd_nrf_dfu_trigger_class_inst_get(&m_app_dfu);
102  app_usbd_class_append(class_dfu);
103 }
104 /*---------------------------------------------------------------------------*/
105 
106 /** @} */
void dfu_trigger_usb_init(void)
Initialise the DFU trigger library.