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/*---------------------------------------------------------------------------*/
64static uint8_t m_version_string[] = "Contiki-NG DFU";
65static app_usbd_nrf_dfu_trigger_nordic_info_t m_dfu_info;
66/*---------------------------------------------------------------------------*/
67static void
68dfu_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/*---------------------------------------------------------------------------*/
83APP_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/*---------------------------------------------------------------------------*/
88void
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.