123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399 |
- /* Copyright (C) 2018 RDA Technologies Limited and/or its affiliates("RDA").
- * All rights reserved.
- *
- * This software is supplied "AS IS" without any warranties.
- * RDA assumes no responsibility or liability for the use of the software,
- * conveys no license or title under any patent, copyright, or mask work
- * right to the product. RDA reserves the right to make changes in the
- * software without notification. RDA also make no representation or
- * warranty that such application will be suitable for the specified use
- * without further testing or modification.
- */
- #ifndef _HAL_CHIP_8850_H_
- #define _HAL_CHIP_8850_H_
- #include "hal_chip.h"
- #include "hwregs.h"
- #ifdef __cplusplus
- extern "C" {
- #endif
- // #define HAL_RESUME_SRC_PMIC (1 << 0)
- // #define HAL_RESUME_SRC_VAD (1 << 1)
- // #define HAL_RESUME_SRC_KEY (1 << 2)
- // #define HAL_RESUME_SRC_GPIO1 (1 << 3)
- // #define HAL_RESUME_SRC_UART1 (1 << 4)
- // #define HAL_RESUME_SRC_UART1_RXD (1 << 5)
- // #define HAL_RESUME_SRC_WCN2SYS (1 << 6)
- // #define HAL_RESUME_SRC_WCN_OSC (1 << 7)
- // #define HAL_RESUME_SRC_IDLE_TIMER1 (1 << 8)
- // #define HAL_RESUME_SRC_IDLE_TIMER2 (1 << 9)
- // #define HAL_RESUME_SRC_SELF (1 << 10)
- // #define HAL_RESUME_SRC_USB_MON (1 << 11)
- #define HAL_RESUME_SRC_PMIC (1 << 0)
- #define HAL_RESUME_SRC_UART1 (1 << 1)
- #define HAL_RESUME_SRC_KEYPAD (1 << 2)
- #define HAL_RESUME_SRC_GPIO1 (1 << 3)
- #define HAL_RESUME_SRC_GPT1 (1 << 4)
- #define HAL_RESUME_SRC_UART1_RX (1 << 5)
- #define HAL_RESUME_SRC_MAILBOX_AP (1 << 6)
- #define HAL_RESUME_SRC_MAILBOX_CP (1 << 7)
- #define HAL_RESUME_SRC_UART2 (1 << 8)
- #define HAL_RESUME_SRC_UART3 (1 << 9)
- #define HAL_RESUME_SRC_GPIO2 (1 << 10)
- #define HAL_RESUME_SRC_GPT2_IRQ0 (1 << 11)
- #define HAL_RESUME_SRC_GPT2_IRQ1 (1 << 12)
- #define HAL_RESUME_SRC_GPT2_IRQ2 (1 << 13)
- #define HAL_RESUME_SRC_UART2_RX (1 << 14)
- #define HAL_RESUME_SRC_UART3_RX (1 << 15)
- #define HAL_RESUME_SRC_USB (1 << 16)
- #define HAL_RESUME_SRC_SPI2 (1 << 17)
- #define HAL_RESUME_SRC_USB_SE0 (1 << 18)
- #define HAL_RESUME_SRC_RTC_TIMER (1 << 19)
- #define HAL_RESUME_SRC_P1 (1 << 24)
- #define HAL_RESUME_SRC_T1 (1 << 25)
- #define HAL_RESUME_SRC_T2 (1 << 26)
- #define HAL_RESUME_SRC_T3 (1 << 27)
- #define HAL_RESUME_SRC_T4 (1 << 28)
- #define HAL_RESUME_SRC_T5 (1 << 29)
- #define HAL_RESUME_SRC_T6 (1 << 30)
- #define HAL_RESUME_SRC_P2 (1 << 23)
- #define HAL_RESUME_SRC_T7 (1 << 20)
- #define HAL_RESUME_SRC_T8 (1 << 21)
- #define HAL_RESUME_SRC_T9 (1 << 22)
- #define HAL_RESUME_ABORT (1 << 31)
- #define HAL_32KSLEEP_SRC_USB_RESUME (1 << 0)
- // The followings are output by: halMmuShowDescriptors
- #define HAL_DESCL1_SECTION_NORMAL_RWX 0x00005c06
- #define HAL_DESCL1_SECTION_NORMAL_RW 0x00005c16
- #define HAL_DESCL1_SECTION_NORMAL_RX 0x0000dc06
- #define HAL_DESCL1_SECTION_NORMAL_R 0x0000dc16
- #define HAL_DESCL1_SECTION_NC_RWX 0x00004c02
- #define HAL_DESCL1_SECTION_NC_RW 0x00004c12
- #define HAL_DESCL1_SECTION_NC_RX 0x0000cc02
- #define HAL_DESCL1_SECTION_NC_R 0x0000cc12
- #define HAL_DESCL1_SECTION_DEVICE_RW 0x00000c12
- #define HAL_DESCL1_SECTION_DEVICE_R 0x00008c12
- #define HAL_DESCL1_SECTION_NO_ACCESS 0x00000012
- #define HAL_DESCL1_SECTION_PAGE64K 0x00000001
- #define HAL_DESCL2_PAGE64K_NORMAL_RWX 0x00005035
- #define HAL_DESCL2_PAGE64K_NORMAL_RW 0x0000d035
- #define HAL_DESCL2_PAGE64K_NORMAL_RX 0x00005235
- #define HAL_DESCL2_PAGE64K_NORMAL_R 0x0000d235
- #define HAL_DESCL2_PAGE64K_NC_RWX 0x00004031
- #define HAL_DESCL2_PAGE64K_NC_RW 0x0000c031
- #define HAL_DESCL2_PAGE64K_NC_RX 0x00004231
- #define HAL_DESCL2_PAGE64K_NC_R 0x0000c231
- #define HAL_DESCL2_PAGE64K_DEVICE_RW 0x00008031
- #define HAL_DESCL2_PAGE64K_DEVICE_R 0x00008231
- #define HAL_DESCL2_PAGE64K_NO_ACCESS 0x00008001
- #define HAL_DESCL1_SECTION_PAGE4K 0x00000001
- #define HAL_DESCL2_PAGE4K_NORMAL_RWX 0x00000176
- #define HAL_DESCL2_PAGE4K_NORMAL_RW 0x00000177
- #define HAL_DESCL2_PAGE4K_NORMAL_RX 0x00000376
- #define HAL_DESCL2_PAGE4K_NORMAL_R 0x00000377
- #define HAL_DESCL2_PAGE4K_NC_RWX 0x00000132
- #define HAL_DESCL2_PAGE4K_NC_RW 0x00000133
- #define HAL_DESCL2_PAGE4K_NC_RX 0x00000332
- #define HAL_DESCL2_PAGE4K_NC_R 0x00000333
- #define HAL_DESCL2_PAGE4K_DEVICE_RW 0x00000033
- #define HAL_DESCL2_PAGE4K_DEVICE_R 0x00000233
- #define HAL_DESCL2_PAGE4K_NO_ACCESS 0x00000003
- #define HAL_TIMER_FREQ (2000000)
- #define HAL_TIMER_IRQ_NUM HAL_SYSIRQ_NUM(SYS_IRQ_ID_TIMER2_OS)
- #define HAL_TIMER_IRQ_PRIO SYS_IRQ_PRIO_TIMER2_OS
- #define HAL_TIMER_16K_CURVAL (hwp_timer1->hwtimer_curval) // ??
- #define HAL_CHIP_FLASH_DEVICE_NAME(address) ({ \
- uintptr_t _p = (address); \
- _p &= 0xff000000; \
- (_p == CONFIG_NOR_PHY_ADDRESS) \
- ? DRV_NAME_SPI_FLASH \
- : (_p == CONFIG_NOR_EXT_PHY_ADDRESS) \
- ? DRV_NAME_SPI_FLASH_EXT \
- : DRV_NAME_INVALID; \
- })
- OSI_FORCE_INLINE static bool HAL_CHIP_ADDR_IS_ADI(uintptr_t p)
- {
- return (p & 0xfffff000) == 0x51108000;
- }
- OSI_FORCE_INLINE static bool HAL_CHIP_ADDR_IS_SRAM(uintptr_t p)
- {
- return p >= CONFIG_SRAM_PHY_ADDRESS &&
- p < CONFIG_SRAM_PHY_ADDRESS + CONFIG_SRAM_SIZE;
- }
- OSI_FORCE_INLINE static bool HAL_CHIP_ADDR_IS_AON_SRAM(uintptr_t p)
- {
- return p >= CONFIG_AON_SRAM_PHY_ADDRESS &&
- p < CONFIG_AON_SRAM_PHY_ADDRESS + CONFIG_AON_SRAM_SIZE;
- }
- OSI_FORCE_INLINE static bool HAL_CHIP_ADDR_IS_RAM(uintptr_t p)
- {
- return p >= CONFIG_RAM_PHY_ADDRESS &&
- p < CONFIG_RAM_PHY_ADDRESS + CONFIG_RAM_SIZE;
- }
- OSI_FORCE_INLINE static bool HAL_CHIP_ADDR_IS_SRAM_RAM(uintptr_t p)
- {
- return HAL_CHIP_ADDR_IS_SRAM(p) || HAL_CHIP_ADDR_IS_AON_SRAM(p) || HAL_CHIP_ADDR_IS_RAM(p);
- }
- /**
- * \brief enable hardware timer
- */
- OSI_FORCE_INLINE static void halTimerEnable(void)
- {
- hwp_timer2->ostimer_ctrl = 0;
- REGT_FIELD_WRITE(hwp_timer2->timer_irq_mask_set,
- REG_TIMER_AP_TIMER_IRQ_MASK_SET_T,
- ostimer_mask, 1);
- }
- /**
- * \brief disable hardware timer
- */
- OSI_FORCE_INLINE static void halTimerDisable(void)
- {
- hwp_timer2->ostimer_ctrl = 0;
- }
- /**
- * \brief clear hardware timer interrupt
- */
- OSI_FORCE_INLINE static void halTimerIrqClear(void)
- {
- hwp_timer2->timer_irq_clr = hwp_timer2->timer_irq_cause;
- }
- /**
- * \brief start hardware timer
- *
- * \param loadval expire tick count, negative shall be considered inside
- */
- OSI_FORCE_INLINE static void halTimerReload(int64_t loadval)
- {
- if (loadval < 0)
- loadval = 0;
- hwp_timer2->ostimer_ctrl = 0;
- hwp_timer2->ostimer_loadval_l = (uint32_t)loadval;
- REGT_FIELD_WRITE(hwp_timer2->ostimer_ctrl,
- REG_TIMER_AP_OSTIMER_CTRL_T,
- loadval_h, loadval >> 32,
- enable, 1,
- load, 1);
- }
- /**
- * \brief get current tick in 32bits
- */
- OSI_FORCE_INLINE static uint32_t halTimerTick32(void)
- {
- return hwp_timer2->hwtimer_curval_l;
- }
- /**
- * \brief get current tick in 64bits
- */
- OSI_FORCE_INLINE static uint64_t halTimerTick64(void)
- {
- unsigned hi = hwp_timer2->hwtimer_curval_h;
- unsigned lo = hwp_timer2->hwtimer_curval_l;
- unsigned hi_next = hwp_timer2->hwtimer_curval_h;
- if (hi_next != hi)
- lo = hwp_timer2->hwtimer_curval_l;
- return ((uint64_t)hi_next << 32) | lo;
- }
- /**
- * \brief Config pmic Power key 7s reset funtion
- *
- * \param enable
- * - true enable 7s reset funtion.
- * - false disable 7s reset funtion.
- */
- void halPmuSet7sReset(bool enable);
- typedef enum
- {
- CLK_26M_USER_AUDIO = (1 << 0),
- CLK_26M_USER_WCN = (1 << 1),
- CLK_26M_USER_ADC = (1 << 2),
- CLK_26M_USER_AUX1 = (1 << 3),
- } clock26MUser_t;
- typedef enum
- {
- CLK_CAMA_USER_CAMERA = (1 << 0),
- CLK_CAMA_USER_AUDIO = (1 << 1),
- } cameraUser_t;
- // enum: mclk of chip output
- typedef enum
- {
- CAMA_CLK_OUT_FREQ_12M = 12,
- CAMA_CLK_OUT_FREQ_13M = 13,
- CAMA_CLK_OUT_FREQ_24M = 24,
- CAMA_CLK_OUT_FREQ_26M = 26,
- CAMA_CLK_OUT_FREQ_MAX
- } cameraClk_t;
- /**
- * \brief request 26M clock
- *
- * \param user the 26M user
- */
- void halClock26MRequest(clock26MUser_t user);
- /**
- * \brief release 26M clock
- *
- * \param user the 26M user
- */
- void halClock26MRelease(clock26MUser_t user);
- /**
- * \brief measured rc26m real frequency
- */
- extern unsigned gClkRc26mCalibFreq;
- /**
- * \brief rc26m_calib frequency, through divider
- */
- extern unsigned gClkRc26mFreq;
- /**
- * \brief get clk_rc26m_calib clock frequency
- *
- * It is determined by the real frequency after calibration, and the
- * compensation divider register.
- *
- * \return clk_rc26m_calib frequency
- */
- unsigned halGetRc26mCalibFreq(void);
- /**
- * \brief start clk_rc26m calibration
- *
- * During clk_rc26m calibration, mcu_pll should be always on.
- *
- * \param count calibration time, in cycle count of clk_rc26m
- * \param ent_enable whether to enable interrupt
- */
- void halClkRc26mCalibStart(unsigned count, bool int_enable);
- /**
- * \brief whether clk_rc26m calibration is done
- * \return
- * - true if clk_rc26m calibration is done
- * - false if not done
- */
- bool halClkRc26mCalibIsDone(void);
- /**
- * \brief calibrated clk_rc26m frequency
- * \return calibrated clk_rc26m frequency
- */
- unsigned halClkRc26mCalibFreq(void);
- /**
- * \brief initial clock calibration
- *
- * In the initial clock calibration, rc26m will be calibrated. When
- * \p CONFIG_RC26M_CALIB_FIXED_FREQ is 0, the rc26m calibrated frequency
- * will be set to 80% of the measured rc26m frequency.
- *
- */
- void halClkInitCalib(void);
- /**
- * \brief rc26m and xtal32k calibration
- *
- * It is assumed that clk32k is xtal32k.
- *
- * When MCUPLL frequency is changed during calibration, the calibration
- * result will be dropped.
- *
- * \return
- * - true if calibration is done
- * - false if calibration is canceled or dropped
- */
- bool halClkReCalib(void);
- /**
- * \brief request Mclk clock for user
- *
- * \param user and clock
- */
- void halCameraClockRequest(cameraUser_t user, cameraClk_t Mclk);
- /**
- * \brief release clock for user
- *
- * \param user the user
- */
- void halCameraClockRelease(cameraUser_t user);
- /**
- * \brief get uart1/2/3/4/5/6 frequency by read registers
- * \param name device name
- * \return uart clock frequency
- */
- unsigned halGetUartClkFreq(uint32_t name);
- /**
- * \brief init hw aes trng module
- */
- void halAesTrngInit();
- /**
- * \brief reset hw aes trng module
- */
- void halAesTrngReset();
- /**
- * \brief start hw aes trng module
- */
- void halAesTrngEnable();
- /**
- * \brief get hw aes generated random data, two word generated each time
- * \param v0 data0
- * \param v1 data1
- */
- void halAesTrngGetValue(uint32_t *v0, uint32_t *v1);
- /**
- * \brief check hw aes trng module if has already generated random data
- * \return
- * - true if done else false
- */
- bool halAesCheckTrngComplete();
- /**
- * \brief read 2720 RTC and convert to second
- *
- * \return rtc second
- */
- int64_t halPmuRtcReadSecond(void);
- /**
- * \brief trigger watchdog reset immediately
- */
- void halWatchdogReset(void);
- #ifdef __cplusplus
- }
- #endif
- #endif
|