123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350 |
- /**
- * @file hv_chip_debuguart.h
- * @brief define uart debug interface
- * @details anyware
- * @author HiView SoC Software Team
- * @version 1.0.0
- * @date 2022-09-05
- * @copyright Copyright(c),2022-9, Hiview Software. All rights reserved.
- */
- #ifndef _HV_CHIP_DEBUG_UART_H
- #define _HV_CHIP_DEBUG_UART_H
- /**
- * @brief interface for write register.
- * @param[in] address to write.
- * @param[in] value to write.
- * @return none.
- */
- static void Hv_Chip_WriteReg(unsigned int uAddr, unsigned int uValue)
- {
- uAddr= ((uAddr) | 0xA0000000);
- *(volatile unsigned int*)uAddr = uValue;
- }
- /**
- * @brief interface for read register.
- * @param[in] address to read.
- * @return value from register.
- */
- static unsigned int Hv_Chip_ReadReg(unsigned int uAddr)
- {
- uAddr= ((uAddr) | 0xA0000000);
- return *(volatile unsigned int*)uAddr;
- }
- #define BOARD_DEBUG_UART_STOP_BITS 0 /* for 1bit */
- #define BOARD_DEBUG_UART_DATA_BITS 8
- #define BOARD_W32 Hv_Chip_WriteReg
- #define BOARD_R32 Hv_Chip_ReadReg
- #define BOARD_REG_VAL(reg) (*(unsigned int*)&(reg))
- #define BOARD_W32_REG(addr, reg) BOARD_W32(addr, BOARD_REG_VAL(reg))
- /**
- * @brief interface to switch qsti to rsic.
- * @param[in] none.
- * @return none.
- */
- static void Hv_Chip_SwitchQspiRsic(void)
- {
- unsigned int uiRegVal = 0;
- uiRegVal = BOARD_R32(STANDBY_SH08_TOP_STBY_CTRL_0);
- rs_standby_sh08_top_stby_ctrl_0 stProgSpi = (*(standby_sh08_top_stby_ctrl_0(uiRegVal)));
- stProgSpi.reg_prog_spi_clk_func_sel = 0;
- stProgSpi.reg_prog_spi_csn_func_sel = 0;
- stProgSpi.reg_prog_spi_hold_func_sel = 0;
- stProgSpi.reg_prog_spi_miso_func_sel = 0;
- stProgSpi.reg_prog_spi_mosi_func_sel = 0;
- stProgSpi.reg_prog_spi_wp_func_sel = 0;
- BOARD_W32_REG(STANDBY_SH08_TOP_STBY_CTRL_0, stProgSpi);
- }
- static void Hv_Chip_DebugUartConfig(void)
- {
- unsigned int uiUart = 0;
- #if 0 // TODO please open this if using HDMI0/1 DDC as uart0
- /* use hdmi0 uart0 to debug */
- /* set SYS_BLK3_TOP_REG_38 reg_uart0_sin_sel 1 */
- uiUart = BOARD_R32(SYS_BLK3_TOP_REG_38);
- rs_sys_blk3_top_reg_38 uart0_blk = (*(sys_blk3_top_reg_38(uiUart)));
- uart0_blk.reg_uart0_sin_sel = 1;
- BOARD_W32_REG(SYS_BLK3_TOP_REG_38, uart0_blk);
- uiUart = BOARD_R32(STANDBY_SH08_TOP_STBY_CTRL_24);
- rs_standby_sh08_top_stby_ctrl_24 uart0_tx__func = (*(standby_sh08_top_stby_ctrl_24(uiUart)));
- uart0_tx__func.reg_hdmi_rx0_ddc1_func_sel = 3;
- BOARD_W32_REG(STANDBY_SH08_TOP_STBY_CTRL_24, uart0_tx__func);
- uiUart = BOARD_R32(STANDBY_SH08_TOP_STBY_CTRL_0);
- rs_standby_sh08_top_stby_ctrl_0 uart0_rx__func = (*(standby_sh08_top_stby_ctrl_0(uiUart)));
- uart0_rx__func.reg_hdmi_rx0_ddc0_func_sel = 0;
- BOARD_W32_REG(STANDBY_SH08_TOP_STBY_CTRL_0, uart0_rx__func);
- //io_ctrl
- uiUart = BOARD_R32(STANDBY_SH08_TOP_STBY_CTRL_10);
- rs_standby_sh08_top_stby_ctrl_10 uart0_tx_ctrl= (*(standby_sh08_top_stby_ctrl_10(uiUart)));
- uart0_tx_ctrl.reg_hdmi_rx0_ddc1_io_ctrl = 0x1;
- uart0_tx_ctrl.reg_hdmi_rx0_ddc0_io_ctrl = 0x10;
- BOARD_W32_REG(STANDBY_SH08_TOP_STBY_CTRL_10, uart0_tx_ctrl);
- //sin_in_sel
- uiUart = BOARD_R32(STANDBY_SH08_TOP_STBY_CTRL_24);
- rs_standby_sh08_top_stby_ctrl_24 uart0_in_sel = (*(standby_sh08_top_stby_ctrl_24(uiUart)));
- uart0_in_sel.reg_uart0_sin_use_sel = 0;
- BOARD_W32_REG(STANDBY_SH08_TOP_STBY_CTRL_24, uart0_in_sel);
- uiUart = BOARD_R32(STANDBY_SH08_TOP_STBY_CTRL_4);
- rs_standby_sh08_top_stby_ctrl_4 stby_uart0_in_sel = (*(standby_sh08_top_stby_ctrl_4(uiUart)));
- stby_uart0_in_sel.reg_uart0_sin_in_sel = 0;
- BOARD_W32_REG(STANDBY_SH08_TOP_STBY_CTRL_4, stby_uart0_in_sel);
- /* use hdmi1 uart0 to debug */
- uiUart = BOARD_R32(STANDBY_SH08_TOP_STBY_CTRL_24);
- rs_standby_sh08_top_stby_ctrl_24 hdmi1_uart0_tx__func = (*(standby_sh08_top_stby_ctrl_24(uiUart)));
- hdmi1_uart0_tx__func.reg_hdmi_rx1_ddc1_func_sel = 3;
- BOARD_W32_REG(STANDBY_SH08_TOP_STBY_CTRL_24, hdmi1_uart0_tx__func);
- uiUart = BOARD_R32(STANDBY_SH08_TOP_STBY_CTRL_0);
- rs_standby_sh08_top_stby_ctrl_0 hdmi1_uart0_rx__func = (*(standby_sh08_top_stby_ctrl_0(uiUart)));
- hdmi1_uart0_rx__func.reg_hdmi_rx1_ddc0_func_sel = 0;
- BOARD_W32_REG(STANDBY_SH08_TOP_STBY_CTRL_0, hdmi1_uart0_rx__func);
- //io_ctrl
- uiUart = BOARD_R32(rs_standby_sh08_top_stby_ctrl_14);
- rs_standby_sh08_top_stby_ctrl_14 hdmi1_uart0_tx_ctrl= (*(standby_sh08_top_stby_ctrl_14(uiUart)));
- hdmi1_uart0_tx_ctrl.reg_hdmi_rx1_ddc1_io_ctrl = 0x1;
- hdmi1_uart0_tx_ctrl.reg_hdmi_rx1_ddc0_io_ctrl = 0x10;
- BOARD_W32_REG(STANDBY_SH08_TOP_STBY_CTRL_10, hdmi1_uart0_tx_ctrl);
- //sin_in_sel
- uiUart = BOARD_R32(STANDBY_SH08_TOP_STBY_CTRL_24);
- rs_standby_sh08_top_stby_ctrl_24 hdmi1_uart0_in_sel = (*(standby_sh08_top_stby_ctrl_24(uiUart)));
- hdmi1_uart0_in_sel.reg_uart0_sin_use_sel = 0;
- BOARD_W32_REG(STANDBY_SH08_TOP_STBY_CTRL_24, hdmi1_uart0_in_sel);
- uiUart = BOARD_R32(STANDBY_SH08_TOP_STBY_CTRL_4);
- rs_standby_sh08_top_stby_ctrl_4 hdmi1_stby_uart0_in_sel = (*(standby_sh08_top_stby_ctrl_4(uiUart)));
- hdmi1_stby_uart0_in_sel.reg_uart0_sin_in_sel = 0;
- BOARD_W32_REG(STANDBY_SH08_TOP_STBY_CTRL_4, hdmi1_stby_uart0_in_sel);
- #else
- /* use uart0 to debug */
- uiUart = BOARD_R32(RX_SH08_TOP_RX_CTRL_4);
- rs_rx_sh08_top_rx_ctrl_4 uart0_func = (*(rx_sh08_top_rx_ctrl_4(uiUart)));
- uart0_func.reg_uart0_rx_func_sel = 1;
- uart0_func.reg_uart0_tx_func_sel = 1;
- BOARD_W32_REG(RX_SH08_TOP_RX_CTRL_4, uart0_func);
- //pin_sel
- uiUart = BOARD_R32(RX_SH08_TOP_RX_CTRL_10);
- rs_rx_sh08_top_rx_ctrl_10 uart0_pin= (*(rx_sh08_top_rx_ctrl_10(uiUart)));
- uart0_pin.reg_uart0_rx_pin_sel = 0;
- uart0_pin.reg_uart0_tx_pin_sel = 0;
- BOARD_W32_REG(RX_SH08_TOP_RX_CTRL_10, uart0_pin);
- //io_ctrl
- uiUart = BOARD_R32(RX_SH08_TOP_RX_CTRL_38);
- rs_rx_sh08_top_rx_ctrl_38 uart0_tx_ctrl= (*(rx_sh08_top_rx_ctrl_38(uiUart)));
- uart0_tx_ctrl.reg_uart0_tx_io_ctrl = 0x1;
- uart0_tx_ctrl.reg_uart0_rx_io_ctrl = 0x40;
- BOARD_W32_REG(RX_SH08_TOP_RX_CTRL_38, uart0_tx_ctrl);
- //sin_in_sel
- uiUart = BOARD_R32(RX_SH08_TOP_RX_CTRL_8);
- rs_rx_sh08_top_rx_ctrl_8 uart0_in_sel = (*(rx_sh08_top_rx_ctrl_8(uiUart)));
- uart0_in_sel.reg_uart0_sin_in_sel = 0;
- BOARD_W32_REG(RX_SH08_TOP_RX_CTRL_8, uart0_in_sel);
- uiUart = BOARD_R32(STANDBY_SH08_TOP_STBY_CTRL_4);
- rs_standby_sh08_top_stby_ctrl_4 stby_uart0_in_sel = (*(standby_sh08_top_stby_ctrl_4(uiUart)));
- stby_uart0_in_sel.reg_uart0_sin_in_sel = 0;
- BOARD_W32_REG(STANDBY_SH08_TOP_STBY_CTRL_4, stby_uart0_in_sel);
- #endif
- return;
- }
- #define HS_DEBUG_UART_BASE_ADDR (0)
- /**
- * @brief interface to int debug uart.
- * @param[in] baudrate to set.
- * @return none.
- */
- static void Hv_Chip_DebugUartInit(unsigned int uBaudrate)
- {
- unsigned int uDdiv = 0;
- unsigned int uData = 0;
- unsigned int uVal = 0;
- unsigned int uUart = 0;
- Hv_Chip_SwitchQspiRsic();
- Hv_Chip_SetIOUserMode();
- {
- if(!HS_DEBUG_UART_BASE_ADDR)
- {
- Hv_Chip_DebugUartConfig();
- }
- // else
- // {
- // /* use uart1 to debug */
- // rs_sys_sh08_top_tx_ctrl_0 uart1_func={0};
- // uart1_func.reg_uart1_rx_func_sel =0;
- // uart1_func.reg_uart1_tx_func_sel =0;
- // BOARD_W32_REG(SYS_SH08_TOP_TX_CTRL_0, uart1_func);
- // rs_sys_sh08_top_tx_ctrl_8 uart1_pin={0};
- // uart1_pin.reg_uart1_rx_pin_sel = 0;
- // uart1_pin.reg_uart1_tx_pin_sel = 0;
- // BOARD_W32_REG(SYS_SH08_TOP_TX_CTRL_8, uart1_pin);
- // rs_sys_sh08_top_tx_ctrl_20 uart1_tx_ctrl={0};
- // uart1_tx_ctrl.reg_uart1_tx_io_ctrl = 0x1;
- // uart1_tx_ctrl.reg_uart1_rx_io_ctrl = 0x40;
- // BOARD_W32_REG(SYS_SH08_TOP_TX_CTRL_20, uart1_tx_ctrl);
- // }
- }
- /* set fcr */
- {
- rs_cpu_sys_uart0_fcr fcr = {0};
- fcr.reg_FIFOE = 1;
- fcr.reg_RFIFOR = 1;
- fcr.reg_XFIFOR = 1;
- BOARD_W32_REG(HS_DEBUG_UART_BASE_ADDR + CPU_SYS_UART0_FCR, fcr);
- }
- /* set baudrate */
- {
- uDdiv = ((HV_CHIP_CLK_AHB >> 4) + (uBaudrate >> 2)) / uBaudrate;
- uVal = BOARD_R32(HS_DEBUG_UART_BASE_ADDR + CPU_SYS_UART0_LCR);
- /* Enable setup baudrate */
- BOARD_W32(HS_DEBUG_UART_BASE_ADDR + CPU_SYS_UART0_LCR, uVal | 0x80);
- BOARD_W32(HS_DEBUG_UART_BASE_ADDR + CPU_SYS_UART0_THR_DLL, uDdiv & 0xff);
- BOARD_W32(HS_DEBUG_UART_BASE_ADDR + CPU_SYS_UART0_DLH_IER, (uDdiv >> 8) & 0xff);
- /* Disable setup baudrate */
- BOARD_W32(HS_DEBUG_UART_BASE_ADDR + CPU_SYS_UART0_LCR, uVal & 0x7f);
- }
- /* set lcr: stop bit, data bit, 奇偶 */
- {
- uData = (((BOARD_DEBUG_UART_STOP_BITS << 2) & 0x04) | ((BOARD_DEBUG_UART_DATA_BITS - 5) & 0x3));
- uVal = BOARD_R32(HS_DEBUG_UART_BASE_ADDR + CPU_SYS_UART0_LCR);
- /* NO ODD/EVEN */
- uVal = (uVal & 0xE0) | uData;
- BOARD_W32(HS_DEBUG_UART_BASE_ADDR + CPU_SYS_UART0_LCR, uVal);
- }
- }
- /**
- * @brief interface to put uart a char.
- * @param[in] the char to put.
- * @return always 1.
- */
- static int Hv_Chip_DebugUartPutc(int iChar)
- {
- unsigned int uVal = 0;
- if (iChar == '\n')
- {
- Hv_Chip_DebugUartPutc('\r');
- }
- uVal = BOARD_R32(HS_DEBUG_UART_BASE_ADDR + CPU_SYS_UART0_LSR);
- while (cpu_sys_uart0_lsr(uVal)->reg_THRE == 0){
- uVal = BOARD_R32(HS_DEBUG_UART_BASE_ADDR + CPU_SYS_UART0_LSR);
- }
- BOARD_W32(HS_DEBUG_UART_BASE_ADDR + CPU_SYS_UART0_THR_DLL, iChar);
- return 1;
- }
- /**
- * @brief whether to get a kb hit.
- * @param[in] none.
- * @return the value to hit or 0 for none.
- */
- static int Hv_Chip_DebugUartKbhit(void)
- {
- unsigned int uVal = BOARD_R32(HS_DEBUG_UART_BASE_ADDR + CPU_SYS_UART0_LSR);
- if (cpu_sys_uart0_lsr(uVal)->reg_DR)
- {
- return BOARD_R32(HS_DEBUG_UART_BASE_ADDR + CPU_SYS_UART0_THR_DLL);
- } else {
- return 0;
- }
- }
- /**
- * @brief interface to get a input char.
- * @param[in] the char value to get.
- * @return 0-success 1-fail.
- */
- static int Hv_Chip_DebugUartGetc(char *ch)
- {
- unsigned int uVal = BOARD_R32(HS_DEBUG_UART_BASE_ADDR + CPU_SYS_UART0_LSR);
- if (cpu_sys_uart0_lsr(uVal)->reg_DR == 0)
- {
- return 1;/*1代表fail*/
- }
- else
- {
- *ch = BOARD_R32(HS_DEBUG_UART_BASE_ADDR + CPU_SYS_UART0_THR_DLL);
- }
- return 0;
- }
- #undef BOARD_W32
- #undef BOARD_R32
- #undef BOARD_REG_VAL
- #undef BOARD_W32_REG
- #undef BOARD_DEBUG_UART_STOP_BITS
- #undef BOARD_DEBUG_UART_DATA_BITS
- /**
- * @brief interface to put chars.
- * @param[in] the strings to put.
- * @return none.
- */
- static void Hv_Chip_DebugUartPuts(const char *pcChar)
- {
- if (!pcChar)
- {
- return;
- }
- while (*pcChar)
- {
- Hv_Chip_DebugUartPutc(*pcChar);
- ++pcChar;
- }
- }
- /**
- * @brief interface to put chars with length to separate fd.
- * @param[in] debug fd. not usr now.
- * @param[in] the strings to put.
- * @param[in] the length.
- * @return none.
- */
- static void Hv_Chip_DebugUartWrite(int iFd, const char *pcBuf, int iLen)
- {
- int iLoop = 0;
- if (!pcBuf)
- {
- return;
- }
- if (iFd != 1 && iFd != 2)
- {
- Hv_Chip_DebugUartPuts("Unknown fd for write\n");
- } else {
- for (iLoop = 0; iLoop < iLen; iLoop++)
- {
- Hv_Chip_DebugUartPutc(pcBuf[iLoop]);
- }
- }
- }
- #endif
|