forked

Committer:
Kojto
Date:
Thu Aug 03 13:13:39 2017 +0100
Revision:
170:19eb464bc2be
Parent:
167:e84263d55307
This updates the lib to the mbed lib v 148

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 167:e84263d55307 1 /* mbed Microcontroller Library
AnnaBridge 167:e84263d55307 2 * Copyright (c) 2013-2016 Realtek Semiconductor Corp.
AnnaBridge 167:e84263d55307 3 *
AnnaBridge 167:e84263d55307 4 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 167:e84263d55307 5 * you may not use this file except in compliance with the License.
AnnaBridge 167:e84263d55307 6 * You may obtain a copy of the License at
AnnaBridge 167:e84263d55307 7 *
AnnaBridge 167:e84263d55307 8 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 167:e84263d55307 9 *
AnnaBridge 167:e84263d55307 10 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 167:e84263d55307 11 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 167:e84263d55307 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 167:e84263d55307 13 * See the License for the specific language governing permissions and
AnnaBridge 167:e84263d55307 14 * limitations under the License.
AnnaBridge 167:e84263d55307 15 */
AnnaBridge 167:e84263d55307 16
AnnaBridge 167:e84263d55307 17 #include "device.h"
AnnaBridge 167:e84263d55307 18 #include "objects.h"
AnnaBridge 167:e84263d55307 19 #include "pinmap.h"
AnnaBridge 167:e84263d55307 20
AnnaBridge 167:e84263d55307 21 #if DEVICE_PWMOUT
AnnaBridge 167:e84263d55307 22
AnnaBridge 167:e84263d55307 23 #ifdef CONFIG_PWM_EN
AnnaBridge 167:e84263d55307 24 #include "pwmout_api.h"
AnnaBridge 167:e84263d55307 25
AnnaBridge 167:e84263d55307 26 static const PinMap PinMap_PWM[] = {
AnnaBridge 167:e84263d55307 27 {PB_4, RTL_PIN_PERI(PWM0, 0, S0), RTL_PIN_FUNC(PWM0, S0)},
AnnaBridge 167:e84263d55307 28 {PB_5, RTL_PIN_PERI(PWM1, 1, S0), RTL_PIN_FUNC(PWM1, S0)},
AnnaBridge 167:e84263d55307 29 {PB_6, RTL_PIN_PERI(PWM2, 2, S0), RTL_PIN_FUNC(PWM2, S0)},
AnnaBridge 167:e84263d55307 30 {PB_7, RTL_PIN_PERI(PWM3, 3, S0), RTL_PIN_FUNC(PWM3, S0)},
AnnaBridge 167:e84263d55307 31
AnnaBridge 167:e84263d55307 32 {PC_0, RTL_PIN_PERI(PWM0, 0, S1), RTL_PIN_FUNC(PWM0, S1)},
AnnaBridge 167:e84263d55307 33 {PC_1, RTL_PIN_PERI(PWM1, 1, S1), RTL_PIN_FUNC(PWM1, S1)},
AnnaBridge 167:e84263d55307 34 {PC_2, RTL_PIN_PERI(PWM2, 2, S1), RTL_PIN_FUNC(PWM2, S1)},
AnnaBridge 167:e84263d55307 35 {PC_3, RTL_PIN_PERI(PWM3, 3, S1), RTL_PIN_FUNC(PWM3, S1)},
AnnaBridge 167:e84263d55307 36
AnnaBridge 167:e84263d55307 37 {PD_3, RTL_PIN_PERI(PWM0, 0, S2), RTL_PIN_FUNC(PWM0, S2)},
AnnaBridge 167:e84263d55307 38 {PD_4, RTL_PIN_PERI(PWM1, 1, S2), RTL_PIN_FUNC(PWM1, S2)},
AnnaBridge 167:e84263d55307 39 {PD_5, RTL_PIN_PERI(PWM2, 2, S2), RTL_PIN_FUNC(PWM2, S2)},
AnnaBridge 167:e84263d55307 40 {PD_6, RTL_PIN_PERI(PWM3, 3, S2), RTL_PIN_FUNC(PWM3, S2)},
AnnaBridge 167:e84263d55307 41
AnnaBridge 167:e84263d55307 42 {PE_0, RTL_PIN_PERI(PWM0, 0, S3), RTL_PIN_FUNC(PWM0, S3)},
AnnaBridge 167:e84263d55307 43 {PE_1, RTL_PIN_PERI(PWM1, 1, S3), RTL_PIN_FUNC(PWM1, S3)},
AnnaBridge 167:e84263d55307 44 {PE_2, RTL_PIN_PERI(PWM2, 2, S3), RTL_PIN_FUNC(PWM2, S3)},
AnnaBridge 167:e84263d55307 45 {PE_3, RTL_PIN_PERI(PWM3, 3, S3), RTL_PIN_FUNC(PWM3, S3)},
AnnaBridge 167:e84263d55307 46
AnnaBridge 167:e84263d55307 47 {NC, NC, 0}
AnnaBridge 167:e84263d55307 48 };
AnnaBridge 167:e84263d55307 49
AnnaBridge 167:e84263d55307 50 void pwmout_init(pwmout_t* obj, PinName pin)
AnnaBridge 167:e84263d55307 51 {
AnnaBridge 167:e84263d55307 52 uint32_t peripheral;
AnnaBridge 167:e84263d55307 53 u32 pwm_idx;
AnnaBridge 167:e84263d55307 54 u32 pin_sel;
AnnaBridge 167:e84263d55307 55
AnnaBridge 167:e84263d55307 56 DBG_PWM_INFO("%s: Init PWM for pin(0x%x)\n", __FUNCTION__, pin);
AnnaBridge 167:e84263d55307 57
AnnaBridge 167:e84263d55307 58 // Get the peripheral name from the pin and assign it to the object
AnnaBridge 167:e84263d55307 59 peripheral = pinmap_peripheral(pin, PinMap_PWM);
AnnaBridge 167:e84263d55307 60
AnnaBridge 167:e84263d55307 61 if (unlikely(peripheral == NC)) {
AnnaBridge 167:e84263d55307 62 DBG_PWM_ERR("%s: Cannot find matched pwm for this pin(0x%x)\n", __FUNCTION__, pin);
AnnaBridge 167:e84263d55307 63 return;
AnnaBridge 167:e84263d55307 64 }
AnnaBridge 167:e84263d55307 65
AnnaBridge 167:e84263d55307 66 pwm_idx = RTL_GET_PERI_IDX(peripheral);
AnnaBridge 167:e84263d55307 67 pin_sel = RTL_GET_PERI_SEL(peripheral);
AnnaBridge 167:e84263d55307 68
AnnaBridge 167:e84263d55307 69 obj->pwm_idx = pwm_idx;
AnnaBridge 167:e84263d55307 70 obj->pin_sel = pin_sel;
AnnaBridge 167:e84263d55307 71 obj->period = 0;
AnnaBridge 167:e84263d55307 72 obj->pulse = 0;
AnnaBridge 167:e84263d55307 73 _memset((void *)&obj->pwm_hal_adp, 0, sizeof(HAL_PWM_ADAPTER));
AnnaBridge 167:e84263d55307 74 if (HAL_OK != HAL_Pwm_Init(&obj->pwm_hal_adp, pwm_idx, pin_sel)) {
AnnaBridge 167:e84263d55307 75 DBG_PWM_ERR("pwmout_init Err!\n");
AnnaBridge 167:e84263d55307 76 return;
AnnaBridge 167:e84263d55307 77 }
AnnaBridge 167:e84263d55307 78 pwmout_period_us(obj, 20000); // 20 ms per default
AnnaBridge 167:e84263d55307 79 HAL_Pwm_Enable(&obj->pwm_hal_adp);
AnnaBridge 167:e84263d55307 80 }
AnnaBridge 167:e84263d55307 81
AnnaBridge 167:e84263d55307 82 void pwmout_free(pwmout_t* obj)
AnnaBridge 167:e84263d55307 83 {
AnnaBridge 167:e84263d55307 84 HAL_Pwm_Disable(&obj->pwm_hal_adp);
AnnaBridge 167:e84263d55307 85 }
AnnaBridge 167:e84263d55307 86
AnnaBridge 167:e84263d55307 87 void pwmout_write(pwmout_t* obj, float value)
AnnaBridge 167:e84263d55307 88 {
AnnaBridge 167:e84263d55307 89 if (value < (float)0.0) {
AnnaBridge 167:e84263d55307 90 value = 0.0;
AnnaBridge 167:e84263d55307 91 } else if (value > (float)1.0) {
AnnaBridge 167:e84263d55307 92 value = 1.0;
AnnaBridge 167:e84263d55307 93 }
AnnaBridge 167:e84263d55307 94
AnnaBridge 167:e84263d55307 95 obj->pulse = (uint32_t)((float)obj->period * value);
AnnaBridge 167:e84263d55307 96 HAL_Pwm_SetDuty(&obj->pwm_hal_adp, obj->period, obj->pulse);
AnnaBridge 167:e84263d55307 97 }
AnnaBridge 167:e84263d55307 98
AnnaBridge 167:e84263d55307 99 float pwmout_read(pwmout_t* obj)
AnnaBridge 167:e84263d55307 100 {
AnnaBridge 167:e84263d55307 101 float value = 0;
AnnaBridge 167:e84263d55307 102 if (obj->period > 0) {
AnnaBridge 167:e84263d55307 103 value = (float)(obj->pulse) / (float)(obj->period);
AnnaBridge 167:e84263d55307 104 }
AnnaBridge 167:e84263d55307 105 return ((value > (float)1.0) ? (float)(1.0) : (value));
AnnaBridge 167:e84263d55307 106 }
AnnaBridge 167:e84263d55307 107
AnnaBridge 167:e84263d55307 108 void pwmout_period(pwmout_t* obj, float seconds)
AnnaBridge 167:e84263d55307 109 {
AnnaBridge 167:e84263d55307 110 pwmout_period_us(obj, (int)(seconds * 1000000.0f));
AnnaBridge 167:e84263d55307 111 }
AnnaBridge 167:e84263d55307 112
AnnaBridge 167:e84263d55307 113 void pwmout_period_ms(pwmout_t* obj, int ms)
AnnaBridge 167:e84263d55307 114 {
AnnaBridge 167:e84263d55307 115 pwmout_period_us(obj, (int)(ms * 1000));
AnnaBridge 167:e84263d55307 116 }
AnnaBridge 167:e84263d55307 117
AnnaBridge 167:e84263d55307 118 void pwmout_period_us(pwmout_t* obj, int us)
AnnaBridge 167:e84263d55307 119 {
AnnaBridge 167:e84263d55307 120 float dc = pwmout_read(obj);
AnnaBridge 167:e84263d55307 121
AnnaBridge 167:e84263d55307 122 obj->period = us;
AnnaBridge 167:e84263d55307 123 // Set duty cycle again
AnnaBridge 167:e84263d55307 124 pwmout_write(obj, dc);
AnnaBridge 167:e84263d55307 125 }
AnnaBridge 167:e84263d55307 126
AnnaBridge 167:e84263d55307 127 void pwmout_pulsewidth(pwmout_t* obj, float seconds)
AnnaBridge 167:e84263d55307 128 {
AnnaBridge 167:e84263d55307 129 pwmout_pulsewidth_us(obj, (int)(seconds * 1000000.0f));
AnnaBridge 167:e84263d55307 130 }
AnnaBridge 167:e84263d55307 131
AnnaBridge 167:e84263d55307 132 void pwmout_pulsewidth_ms(pwmout_t* obj, int ms)
AnnaBridge 167:e84263d55307 133 {
AnnaBridge 167:e84263d55307 134 pwmout_pulsewidth_us(obj, ms * 1000);
AnnaBridge 167:e84263d55307 135 }
AnnaBridge 167:e84263d55307 136
AnnaBridge 167:e84263d55307 137 void pwmout_pulsewidth_us(pwmout_t* obj, int us)
AnnaBridge 167:e84263d55307 138 {
AnnaBridge 167:e84263d55307 139 float value = (float)us / (float)obj->period;
AnnaBridge 167:e84263d55307 140 pwmout_write(obj, value);
AnnaBridge 167:e84263d55307 141 }
AnnaBridge 167:e84263d55307 142
AnnaBridge 167:e84263d55307 143 #endif // #ifdef CONFIG_PWM_EN
AnnaBridge 167:e84263d55307 144 #endif // #if DEVICE_PWMOUT