/* * Copyright (c) 2016, Alex Taradov * 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. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 OR CONTRIBUTORS 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. */ /*- Includes ----------------------------------------------------------------*/ #include #include #include #include #include #include "samd21.h" #include "hal_gpio.h" #include "nvm_data.h" #include "usb.h" #include "dap.h" #include "dap_config.h" /*- Definitions -------------------------------------------------------------*/ #define APP_EP_SEND 1 #define APP_EP_RECV 2 /*- Variables ---------------------------------------------------------------*/ alignas(4) uint8_t app_request_buffer[DAP_CONFIG_PACKET_SIZE]; alignas(4) uint8_t app_response_buffer[DAP_CONFIG_PACKET_SIZE]; /*- Implementations ---------------------------------------------------------*/ //----------------------------------------------------------------------------- static void sys_init(void) { uint32_t coarse, fine; SYSCTRL->OSC8M.bit.PRESC = 0; SYSCTRL->INTFLAG.reg = SYSCTRL_INTFLAG_BOD33RDY | SYSCTRL_INTFLAG_BOD33DET | SYSCTRL_INTFLAG_DFLLRDY; NVMCTRL->CTRLB.bit.RWS = 1; coarse = NVM_READ_CAL(NVM_DFLL48M_COARSE_CAL); fine = NVM_READ_CAL(NVM_DFLL48M_FINE_CAL); SYSCTRL->DFLLCTRL.reg = 0; // See Errata 9905 while (0 == (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY)); SYSCTRL->DFLLMUL.reg = SYSCTRL_DFLLMUL_MUL(48000); SYSCTRL->DFLLVAL.reg = SYSCTRL_DFLLVAL_COARSE(coarse) | SYSCTRL_DFLLVAL_FINE(fine); SYSCTRL->DFLLCTRL.reg = SYSCTRL_DFLLCTRL_ENABLE | SYSCTRL_DFLLCTRL_USBCRM | SYSCTRL_DFLLCTRL_MODE | SYSCTRL_DFLLCTRL_BPLCKC | SYSCTRL_DFLLCTRL_CCDIS | SYSCTRL_DFLLCTRL_STABLE; while (0 == (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY)); GCLK->GENCTRL.reg = GCLK_GENCTRL_ID(0) | GCLK_GENCTRL_SRC(GCLK_SOURCE_DFLL48M) | GCLK_GENCTRL_RUNSTDBY | GCLK_GENCTRL_GENEN; while (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY); } //----------------------------------------------------------------------------- void usb_send_callback(void) { } //----------------------------------------------------------------------------- void usb_recv_callback(void) { dap_process_request(app_request_buffer, sizeof(app_request_buffer), app_response_buffer, sizeof(app_response_buffer)); usb_send(APP_EP_SEND, app_response_buffer, sizeof(app_response_buffer), usb_send_callback); usb_recv(APP_EP_RECV, app_request_buffer, sizeof(app_request_buffer), usb_recv_callback); } //----------------------------------------------------------------------------- void usb_configuration_callback(int config) { usb_recv(APP_EP_RECV, app_request_buffer, sizeof(app_request_buffer), usb_recv_callback); (void)config; } //----------------------------------------------------------------------------- int main(void) { sys_init(); dap_init(); usb_init(); while (1); return 0; }