acassis commented on code in PR #8806: URL: https://github.com/apache/nuttx/pull/8806#discussion_r1136285909
########## arch/arm/src/nrf53/nrf53_tim.c: ########## @@ -0,0 +1,857 @@ +/**************************************************************************** + * arch/arm/src/nrf53/nrf53_tim.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> + +#include <assert.h> +#include <debug.h> + +#include <nuttx/arch.h> +#include <nuttx/irq.h> + +#include "arm_internal.h" +#include "hardware/nrf53_tim.h" + +#include "nrf53_tim.h" + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +struct nrf53_tim_priv_s +{ + struct nrf53_tim_ops_s *ops; + uint32_t base; + uint32_t irq; + uint8_t chan; + bool inuse; +}; + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +/* TIM registers access *****************************************************/ + +static uint32_t nrf53_tim_getreg(struct nrf53_tim_dev_s *dev, + uint32_t offset); +static void nrf53_tim_putreg(struct nrf53_tim_dev_s *dev, + uint32_t offset, + uint32_t value); + +/* TIM helpers **************************************************************/ + +static uint32_t nrf53_tim_irq2reg(struct nrf53_tim_dev_s *dev, + uint8_t s); + +/* TIM operations ***********************************************************/ + +static int nrf53_tim_start(struct nrf53_tim_dev_s *dev); +static int nrf53_tim_stop(struct nrf53_tim_dev_s *dev); +static int nrf53_tim_clear(struct nrf53_tim_dev_s *dev); +static int nrf53_tim_configure(struct nrf53_tim_dev_s *dev, uint8_t mode, + uint8_t width); +static int nrf53_tim_shorts(struct nrf53_tim_dev_s *dev, uint8_t s, + uint8_t i, bool en); +static int nrf53_tim_count(struct nrf53_tim_dev_s *dev); +static int nrf53_tim_setcc(struct nrf53_tim_dev_s *dev, uint8_t i, + uint32_t cc); +static int nrf53_tim_getcc(struct nrf53_tim_dev_s *dev, uint8_t i, + uint32_t *cc); +static int nrf53_tim_setpre(struct nrf53_tim_dev_s *dev, uint8_t pre); +static int nrf53_tim_setisr(struct nrf53_tim_dev_s *dev, xcpt_t handler, + void * arg); +static int nrf53_tim_enableint(struct nrf53_tim_dev_s *dev, uint8_t s); +static int nrf53_tim_disableint(struct nrf53_tim_dev_s *dev, uint8_t s); +static int nrf53_tim_checkint(struct nrf53_tim_dev_s *dev, uint8_t s); +static int nrf53_tim_ackint(struct nrf53_tim_dev_s *dev, uint8_t s); + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/* NRF53 TIM ops */ + +struct nrf53_tim_ops_s nrf53_tim_ops = +{ + .start = nrf53_tim_start, + .stop = nrf53_tim_stop, + .clear = nrf53_tim_clear, + .configure = nrf53_tim_configure, + .shorts = nrf53_tim_shorts, + .count = nrf53_tim_count, + .setcc = nrf53_tim_setcc, + .getcc = nrf53_tim_getcc, + .setpre = nrf53_tim_setpre, + .setisr = nrf53_tim_setisr, + .enableint = nrf53_tim_enableint, + .disableint = nrf53_tim_disableint, + .checkint = nrf53_tim_checkint, + .ackint = nrf53_tim_ackint +}; + +#ifdef CONFIG_NRF53_TIMER0 +/* TIMER0 */ + +struct nrf53_tim_priv_s g_nrf53_tim0_priv = +{ + .ops = &nrf53_tim_ops, + .base = NRF53_TIMER0_BASE, + .irq = NRF53_IRQ_TIMER0, + .chan = 4, + .inuse = false, +}; +#endif + +#ifdef CONFIG_NRF53_TIMER1 +/* TIMER1 */ + +struct nrf53_tim_priv_s g_nrf53_tim1_priv = +{ + .ops = &nrf53_tim_ops, + .base = NRF53_TIMER1_BASE, + .irq = NRF53_IRQ_TIMER1, + .chan = 4, + .inuse = false, +}; +#endif + +#ifdef CONFIG_NRF53_TIMER2 +/* TIMER2 */ + +struct nrf53_tim_priv_s g_nrf53_tim2_priv = +{ + .ops = &nrf53_tim_ops, + .base = NRF53_TIMER2_BASE, + .irq = NRF53_IRQ_TIMER2, + .chan = 4, + .inuse = false, +}; +#endif + +#ifdef CONFIG_NRF53_TIMER3 +/* TIMER3 */ + +struct nrf53_tim_priv_s g_nrf53_tim3_priv = +{ + .ops = &nrf53_tim_ops, + .base = NRF53_TIMER3_BASE, + .irq = NRF53_IRQ_TIMER3, + .chan = 6, + .inuse = false, +}; +#endif + +#ifdef CONFIG_NRF53_TIMER4 +/* TIMER4 */ + +struct nrf53_tim_priv_s g_nrf53_tim4_priv = +{ + .ops = &nrf53_tim_ops, + .base = NRF53_TIMER4_BASE, + .irq = NRF53_IRQ_TIMER4, + .chan = 6, + .inuse = false, +}; +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: nrf53_tim_getreg + * + * Description: + * Get a 32-bit register value by offset + * + ****************************************************************************/ + +static uint32_t nrf53_tim_getreg(struct nrf53_tim_dev_s *dev, + uint32_t offset) +{ + DEBUGASSERT(dev); + + return getreg32(((struct nrf53_tim_priv_s *)dev)->base + offset); +} + +/**************************************************************************** + * Name: nrf53_tim_putreg + * + * Description: + * Put a 32-bit register value by offset + * + ****************************************************************************/ + +static void nrf53_tim_putreg(struct nrf53_tim_dev_s *dev, + uint32_t offset, + uint32_t value) +{ + DEBUGASSERT(dev); + + putreg32(value, ((struct nrf53_tim_priv_s *)dev)->base + offset); +} + +/**************************************************************************** + * Name: nrf53_tim_irq2reg + * + * Description: + * Get the value of the interrupt register corresponding to the given + * interrupt source + * Review Comment: Ok, hahaha -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
