11bd4fe43Sopenharmony_ci/* 21bd4fe43Sopenharmony_ci * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED. 31bd4fe43Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 41bd4fe43Sopenharmony_ci * you may not use this file except in compliance with the License. 51bd4fe43Sopenharmony_ci * You may obtain a copy of the License at 61bd4fe43Sopenharmony_ci * 71bd4fe43Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 81bd4fe43Sopenharmony_ci * 91bd4fe43Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 101bd4fe43Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 111bd4fe43Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 121bd4fe43Sopenharmony_ci * See the License for the specific language governing permissions and 131bd4fe43Sopenharmony_ci * limitations under the License. 141bd4fe43Sopenharmony_ci */ 151bd4fe43Sopenharmony_ci 161bd4fe43Sopenharmony_ci#ifndef PWM_HI35XX_H 171bd4fe43Sopenharmony_ci#define PWM_HI35XX_H 181bd4fe43Sopenharmony_ci#include "hdf_base.h" 191bd4fe43Sopenharmony_ci 201bd4fe43Sopenharmony_ci#define PWM_CLK_HZ 3000000 // 3MHz 211bd4fe43Sopenharmony_ci#define PWM_CLK_PERIOD 333 // 333ns 221bd4fe43Sopenharmony_ci 231bd4fe43Sopenharmony_ci#define PWM_MAX_HZ 1500000 // 1.5MHz 241bd4fe43Sopenharmony_ci#define PWM_MIN_PERIOD 666 // 666ns 251bd4fe43Sopenharmony_ci 261bd4fe43Sopenharmony_ci#define PWM_MIN_HZ 0.045 // 0.045Hz 271bd4fe43Sopenharmony_ci#define PWM_MAX_PERIOD 22222222222 // 22222222222ns > 4294967295ns (UINT32_MAX) 281bd4fe43Sopenharmony_ci 291bd4fe43Sopenharmony_ci#define PWM_ENABLE 1 301bd4fe43Sopenharmony_ci#define PWM_DISABLE 0 311bd4fe43Sopenharmony_ci 321bd4fe43Sopenharmony_ci#define PWM_INV_OFFSET 1 331bd4fe43Sopenharmony_ci#define PWM_KEEP_OFFSET 2 341bd4fe43Sopenharmony_ci 351bd4fe43Sopenharmony_ci#define PWM_DEFAULT_PERIOD 0x3E7 // 999 361bd4fe43Sopenharmony_ci#define PWM_DEFAULT_POLARITY 0 371bd4fe43Sopenharmony_ci#define PWM_DEFAULT_DUTY_CYCLE 0x14D // 333 381bd4fe43Sopenharmony_ci 391bd4fe43Sopenharmony_ci#define PWM_DUMPER_NAME_PREFIX "pwm_dumper_" 401bd4fe43Sopenharmony_ci#define PWM_DUMPER_NAME_LEN 64 411bd4fe43Sopenharmony_ci 421bd4fe43Sopenharmony_ci#define PWM_CFG1_SHIFT 0x4 // Offset Address 0x4 431bd4fe43Sopenharmony_ci#define PWM_CFG2_SHIFT 0x8 // Offset Address 0x8 441bd4fe43Sopenharmony_ci#define PWM_CTRL_SHIFT 0xC // Offset Address 0xC 451bd4fe43Sopenharmony_ci#define PWM_STATE0_SHIFT 0x10 // Offset Address 0x10 461bd4fe43Sopenharmony_ci#define PWM_STATE1_SHIFT 0x14 // Offset Address 0x14 471bd4fe43Sopenharmony_ci#define PWM_STATE2_SHIFT 0x18 // Offset Address 0x18 481bd4fe43Sopenharmony_ci 491bd4fe43Sopenharmony_cistruct HiPwmRegs { 501bd4fe43Sopenharmony_ci volatile uint32_t cfg0; 511bd4fe43Sopenharmony_ci volatile uint32_t cfg1; 521bd4fe43Sopenharmony_ci volatile uint32_t cfg2; 531bd4fe43Sopenharmony_ci volatile uint32_t ctrl; 541bd4fe43Sopenharmony_ci volatile uint32_t state0; 551bd4fe43Sopenharmony_ci volatile uint32_t state1; 561bd4fe43Sopenharmony_ci volatile uint32_t state2; 571bd4fe43Sopenharmony_ci}; 581bd4fe43Sopenharmony_ci 591bd4fe43Sopenharmony_cistatic inline void HiPwmDisable(struct HiPwmRegs *reg) 601bd4fe43Sopenharmony_ci{ 611bd4fe43Sopenharmony_ci reg->ctrl &= ~1; 621bd4fe43Sopenharmony_ci} 631bd4fe43Sopenharmony_ci 641bd4fe43Sopenharmony_cistatic inline void HiPwmAlwaysOutput(struct HiPwmRegs *reg) 651bd4fe43Sopenharmony_ci{ 661bd4fe43Sopenharmony_ci /* keep the pwm always output */ 671bd4fe43Sopenharmony_ci reg->ctrl |= ((1 << PWM_KEEP_OFFSET) | PWM_ENABLE); 681bd4fe43Sopenharmony_ci} 691bd4fe43Sopenharmony_ci 701bd4fe43Sopenharmony_cistatic inline void HiPwmOutputNumberSquareWaves(struct HiPwmRegs *reg, uint32_t number) 711bd4fe43Sopenharmony_ci{ 721bd4fe43Sopenharmony_ci uint32_t mask; 731bd4fe43Sopenharmony_ci 741bd4fe43Sopenharmony_ci /* pwm output number square waves */ 751bd4fe43Sopenharmony_ci reg->cfg2 = number; 761bd4fe43Sopenharmony_ci mask = ~(1 << PWM_KEEP_OFFSET); 771bd4fe43Sopenharmony_ci reg->ctrl &= mask; 781bd4fe43Sopenharmony_ci reg->ctrl |= PWM_ENABLE; 791bd4fe43Sopenharmony_ci} 801bd4fe43Sopenharmony_ci 811bd4fe43Sopenharmony_cistatic inline void HiPwmSetPolarity(struct HiPwmRegs *reg, uint8_t polarity) 821bd4fe43Sopenharmony_ci{ 831bd4fe43Sopenharmony_ci uint32_t mask; 841bd4fe43Sopenharmony_ci 851bd4fe43Sopenharmony_ci mask = ~(1 << PWM_INV_OFFSET); 861bd4fe43Sopenharmony_ci reg->ctrl &= mask; 871bd4fe43Sopenharmony_ci reg->ctrl |= (polarity << PWM_INV_OFFSET); 881bd4fe43Sopenharmony_ci} 891bd4fe43Sopenharmony_ci 901bd4fe43Sopenharmony_cistatic inline void HiPwmSetPeriod(struct HiPwmRegs *reg, uint32_t period) 911bd4fe43Sopenharmony_ci{ 921bd4fe43Sopenharmony_ci reg->cfg0 = period / PWM_CLK_PERIOD; 931bd4fe43Sopenharmony_ci} 941bd4fe43Sopenharmony_ci 951bd4fe43Sopenharmony_cistatic inline void HiPwmSetDuty(struct HiPwmRegs *reg, uint32_t duty) 961bd4fe43Sopenharmony_ci{ 971bd4fe43Sopenharmony_ci reg->cfg1 = duty / PWM_CLK_PERIOD; 981bd4fe43Sopenharmony_ci} 991bd4fe43Sopenharmony_ci 1001bd4fe43Sopenharmony_ci#endif /* PWM_HI35XX_H */ 101