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