mbed library sources. Supersedes mbed-src.

Fork of mbed by teralytic

Committer:
bogdanm
Date:
Thu Oct 01 15:25:22 2015 +0300
Revision:
0:9b334a45a8ff
Child:
144:ef7eb2e8f9f7
Initial commit on mbed-dev

Replaces mbed-src (now inactive)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm 0:9b334a45a8ff 1 /* mbed Microcontroller Library
bogdanm 0:9b334a45a8ff 2 *******************************************************************************
bogdanm 0:9b334a45a8ff 3 * Copyright (c) 2015 WIZnet Co.,Ltd. All rights reserved.
bogdanm 0:9b334a45a8ff 4 * All rights reserved.
bogdanm 0:9b334a45a8ff 5 *
bogdanm 0:9b334a45a8ff 6 * Redistribution and use in source and binary forms, with or without
bogdanm 0:9b334a45a8ff 7 * modification, are permitted provided that the following conditions are met:
bogdanm 0:9b334a45a8ff 8 *
bogdanm 0:9b334a45a8ff 9 * 1. Redistributions of source code must retain the above copyright notice,
bogdanm 0:9b334a45a8ff 10 * this list of conditions and the following disclaimer.
bogdanm 0:9b334a45a8ff 11 * 2. Redistributions in binary form must reproduce the above copyright notice,
bogdanm 0:9b334a45a8ff 12 * this list of conditions and the following disclaimer in the documentation
bogdanm 0:9b334a45a8ff 13 * and/or other materials provided with the distribution.
bogdanm 0:9b334a45a8ff 14 * 3. Neither the name of ARM Limited nor the names of its contributors
bogdanm 0:9b334a45a8ff 15 * may be used to endorse or promote products derived from this software
bogdanm 0:9b334a45a8ff 16 * without specific prior written permission.
bogdanm 0:9b334a45a8ff 17 *
bogdanm 0:9b334a45a8ff 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
bogdanm 0:9b334a45a8ff 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
bogdanm 0:9b334a45a8ff 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
bogdanm 0:9b334a45a8ff 21 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
bogdanm 0:9b334a45a8ff 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
bogdanm 0:9b334a45a8ff 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
bogdanm 0:9b334a45a8ff 24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
bogdanm 0:9b334a45a8ff 25 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
bogdanm 0:9b334a45a8ff 26 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
bogdanm 0:9b334a45a8ff 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
bogdanm 0:9b334a45a8ff 28 *******************************************************************************
bogdanm 0:9b334a45a8ff 29 */
bogdanm 0:9b334a45a8ff 30
bogdanm 0:9b334a45a8ff 31 #include <stddef.h>
bogdanm 0:9b334a45a8ff 32 #include "us_ticker_api.h"
bogdanm 0:9b334a45a8ff 33 #include "PeripheralNames.h"
bogdanm 0:9b334a45a8ff 34 #include "system_W7500x.h"
bogdanm 0:9b334a45a8ff 35 #include "W7500x_dualtimer.h"
bogdanm 0:9b334a45a8ff 36 #include "W7500x_pwm.h"
bogdanm 0:9b334a45a8ff 37
bogdanm 0:9b334a45a8ff 38 #define TIMER_0 DUALTIMER0_0
bogdanm 0:9b334a45a8ff 39 #define TIMER_1 PWM_CH1
bogdanm 0:9b334a45a8ff 40 #define TIMER_IRQn DUALTIMER0_IRQn
bogdanm 0:9b334a45a8ff 41
bogdanm 0:9b334a45a8ff 42 static PWM_TimerModeInitTypeDef TimerInitType;
bogdanm 0:9b334a45a8ff 43 static DUALTIMER_InitTypDef TimerHandler;
bogdanm 0:9b334a45a8ff 44
bogdanm 0:9b334a45a8ff 45 static int us_ticker_inited = 0;
bogdanm 0:9b334a45a8ff 46
bogdanm 0:9b334a45a8ff 47
bogdanm 0:9b334a45a8ff 48 #ifdef __cplusplus
bogdanm 0:9b334a45a8ff 49 extern "C"{
bogdanm 0:9b334a45a8ff 50 #endif
bogdanm 0:9b334a45a8ff 51
bogdanm 0:9b334a45a8ff 52 void DUALTIMER0_Handler(void)
bogdanm 0:9b334a45a8ff 53 {
bogdanm 0:9b334a45a8ff 54 if(DUALTIMER_GetIntStatus(DUALTIMER0_0))
bogdanm 0:9b334a45a8ff 55 {
bogdanm 0:9b334a45a8ff 56 DUALTIMER_IntClear(DUALTIMER0_0);
bogdanm 0:9b334a45a8ff 57 us_ticker_irq_handler();
bogdanm 0:9b334a45a8ff 58 }
bogdanm 0:9b334a45a8ff 59 }
bogdanm 0:9b334a45a8ff 60
bogdanm 0:9b334a45a8ff 61 #ifdef __cplusplus
bogdanm 0:9b334a45a8ff 62 }
bogdanm 0:9b334a45a8ff 63 #endif
bogdanm 0:9b334a45a8ff 64
bogdanm 0:9b334a45a8ff 65 void us_ticker_init(void)
bogdanm 0:9b334a45a8ff 66 {
bogdanm 0:9b334a45a8ff 67 if (us_ticker_inited) return;
bogdanm 0:9b334a45a8ff 68 us_ticker_inited = 1;
bogdanm 0:9b334a45a8ff 69
bogdanm 0:9b334a45a8ff 70 SystemCoreClockUpdate();
bogdanm 0:9b334a45a8ff 71 TimerInitType.PWM_CHn_PR = (GetSystemClock() / 1000000) -1;
bogdanm 0:9b334a45a8ff 72 TimerInitType.PWM_CHn_LR = 0xFFFFFFFF;
bogdanm 0:9b334a45a8ff 73 TimerInitType.PWM_CHn_PDMR = 1;
bogdanm 0:9b334a45a8ff 74
bogdanm 0:9b334a45a8ff 75 PWM_TimerModeInit(TIMER_1, &TimerInitType);
bogdanm 0:9b334a45a8ff 76 PWM_CHn_Start(TIMER_1);
bogdanm 0:9b334a45a8ff 77 }
bogdanm 0:9b334a45a8ff 78
bogdanm 0:9b334a45a8ff 79
bogdanm 0:9b334a45a8ff 80 uint32_t us_ticker_read()
bogdanm 0:9b334a45a8ff 81 {
bogdanm 0:9b334a45a8ff 82 if (!us_ticker_inited) us_ticker_init();
bogdanm 0:9b334a45a8ff 83 return (TIMER_1->TCR);
bogdanm 0:9b334a45a8ff 84 }
bogdanm 0:9b334a45a8ff 85
bogdanm 0:9b334a45a8ff 86
bogdanm 0:9b334a45a8ff 87 void us_ticker_set_interrupt(timestamp_t timestamp)
bogdanm 0:9b334a45a8ff 88 {
bogdanm 0:9b334a45a8ff 89 int32_t dev = 0;
bogdanm 0:9b334a45a8ff 90
bogdanm 0:9b334a45a8ff 91 if (!us_ticker_inited)
bogdanm 0:9b334a45a8ff 92 {
bogdanm 0:9b334a45a8ff 93 us_ticker_init();
bogdanm 0:9b334a45a8ff 94 }
bogdanm 0:9b334a45a8ff 95
bogdanm 0:9b334a45a8ff 96 dev = (int32_t)(timestamp - us_ticker_read());
bogdanm 0:9b334a45a8ff 97 dev = dev * ((GetSystemClock() / 1000000) / 16);
bogdanm 0:9b334a45a8ff 98
bogdanm 0:9b334a45a8ff 99 if(dev <= 0)
bogdanm 0:9b334a45a8ff 100 {
bogdanm 0:9b334a45a8ff 101 us_ticker_irq_handler();
bogdanm 0:9b334a45a8ff 102 return;
bogdanm 0:9b334a45a8ff 103 }
bogdanm 0:9b334a45a8ff 104
bogdanm 0:9b334a45a8ff 105 DUALTIMER_ClockEnable(TIMER_0);
bogdanm 0:9b334a45a8ff 106 DUALTIMER_Stop(TIMER_0);
bogdanm 0:9b334a45a8ff 107
bogdanm 0:9b334a45a8ff 108 TimerHandler.TimerControl_Mode = DUALTIMER_TimerControl_Periodic;
bogdanm 0:9b334a45a8ff 109 TimerHandler.TimerControl_OneShot = DUALTIMER_TimerControl_OneShot;
bogdanm 0:9b334a45a8ff 110 TimerHandler.TimerControl_Pre = DUALTIMER_TimerControl_Pre_16;
bogdanm 0:9b334a45a8ff 111 TimerHandler.TimerControl_Size = DUALTIMER_TimerControl_Size_32;
bogdanm 0:9b334a45a8ff 112
bogdanm 0:9b334a45a8ff 113 TimerHandler.TimerLoad = (uint32_t)dev;
bogdanm 0:9b334a45a8ff 114
bogdanm 0:9b334a45a8ff 115 DUALTIMER_Init(TIMER_0, &TimerHandler);
bogdanm 0:9b334a45a8ff 116
bogdanm 0:9b334a45a8ff 117 DUALTIMER_IntConfig(TIMER_0, ENABLE);
bogdanm 0:9b334a45a8ff 118
bogdanm 0:9b334a45a8ff 119 NVIC_EnableIRQ(TIMER_IRQn);
bogdanm 0:9b334a45a8ff 120
bogdanm 0:9b334a45a8ff 121 DUALTIMER_Start(TIMER_0);
bogdanm 0:9b334a45a8ff 122
bogdanm 0:9b334a45a8ff 123
bogdanm 0:9b334a45a8ff 124 }
bogdanm 0:9b334a45a8ff 125
bogdanm 0:9b334a45a8ff 126 void us_ticker_disable_interrupt(void)
bogdanm 0:9b334a45a8ff 127 {
bogdanm 0:9b334a45a8ff 128 NVIC_DisableIRQ(TIMER_IRQn);
bogdanm 0:9b334a45a8ff 129
bogdanm 0:9b334a45a8ff 130 DUALTIMER_IntConfig(TIMER_0, DISABLE);
bogdanm 0:9b334a45a8ff 131 }
bogdanm 0:9b334a45a8ff 132
bogdanm 0:9b334a45a8ff 133 void us_ticker_clear_interrupt(void)
bogdanm 0:9b334a45a8ff 134 {
bogdanm 0:9b334a45a8ff 135 DUALTIMER_IntClear(TIMER_0);
bogdanm 0:9b334a45a8ff 136 }