From b175f77b1045232dacd9c0dd7ccd0db2c1a81644 Mon Sep 17 00:00:00 2001 From: songyanguang <345810377@qq.com> Date: Wed, 13 Aug 2025 15:21:27 +0800 Subject: [PATCH] Add SerDes --- Ubiquitous/XiZi_IIoT/board/ch569w/config.mk | 5 +- .../board/ch569w/third_party_driver/Kconfig | 9 +- .../board/ch569w/third_party_driver/Makefile | 4 + .../include/connect_serdes.h | 196 ++++++++++++++++++ .../ch569w/third_party_driver/serdes/Kconfig | 7 + .../ch569w/third_party_driver/serdes/Makefile | 3 + .../serdes/connect_serdes.c | 154 ++++++++++++++ .../third_party_driver/serdes/libSERDES.a | Bin 0 -> 64430 bytes Ubiquitous/XiZi_IIoT/link.mk | 2 +- 9 files changed, 376 insertions(+), 4 deletions(-) create mode 100644 Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/include/connect_serdes.h create mode 100644 Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/serdes/Kconfig create mode 100644 Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/serdes/Makefile create mode 100644 Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/serdes/connect_serdes.c create mode 100644 Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/serdes/libSERDES.a diff --git a/Ubiquitous/XiZi_IIoT/board/ch569w/config.mk b/Ubiquitous/XiZi_IIoT/board/ch569w/config.mk index 6db9c93c7..d87b3d1d1 100644 --- a/Ubiquitous/XiZi_IIoT/board/ch569w/config.mk +++ b/Ubiquitous/XiZi_IIoT/board/ch569w/config.mk @@ -14,5 +14,6 @@ export DEFINES := -DDEBUG=1 export ARCH = risc-v export MCU = CH569W - - +ifeq ($(CONFIG_BSP_USING_SERDES), y) +export LINK_BOARD += $(KERNEL_ROOT)/board/ch569w/third_party_driver/serdes/libSERDES.a +endif diff --git a/Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/Kconfig b/Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/Kconfig index ccc8dac9c..0b8a591b2 100644 --- a/Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/Kconfig +++ b/Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/Kconfig @@ -13,6 +13,13 @@ menuconfig BSP_USING_SPI source "$BSP_DIR/third_party_driver/spi/Kconfig" endif +menuconfig BSP_USING_SERDES + bool "Using serdes device" + default y + if BSP_USING_SERDES + source "$BSP_DIR/third_party_driver/serdes/Kconfig" + endif + menuconfig BSP_USING_WDT bool "Using watchdog timer device" - default y + default n diff --git a/Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/Makefile b/Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/Makefile index b4644627d..6cc73d828 100644 --- a/Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/Makefile +++ b/Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/Makefile @@ -10,6 +10,10 @@ ifeq ($(CONFIG_BSP_USING_SPI),y) SRC_DIR += spi endif +ifeq ($(CONFIG_BSP_USING_SPI),y) + SRC_DIR += serdes +endif + ifeq ($(CONFIG_BSP_USING_WDT),y) SRC_DIR += wdt endif diff --git a/Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/include/connect_serdes.h b/Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/include/connect_serdes.h new file mode 100644 index 000000000..4d125cc3b --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/include/connect_serdes.h @@ -0,0 +1,196 @@ + +#ifndef __CONNECT_SERDES_H__ +#define __CONNECT_SERDES_H__ + + + +#ifdef __cplusplus +extern "C" { +#endif + +#include "CH56xSFR.h" +#include "core_riscv.h" + +# + +#define SDS_ALIGN_EN (1<<18) +#define SDS_CONT_EN (1<<17) +#define SDS_POWR_UP (1<<16) +#define SDS_TX_PU (1<<15) +#define SDS_RX_PU (1<<14) +#define SDS_PLL_PU (1<<13) +#define SDS_PLL_DIV (18<<8) // 60*(DIV+2)MHz +#define SDS_PLL_1_2G (18<<8) // 60*(18+2)MHz +#define SDS_PLL_900M (13<<8) // 60*(13+2)MHz +#define SDS_PLL_600M ( 8<<8) // 60*(8+2)MHz + +#define SDS_DMA_EN 1<<7 +#define SDS_TX_EN 1<<6 +#define SDS_RX_EN 1<<5 +#define SDS_RX_POLAR 1<<4 +#define SDS_INT_BUSY_EN 1<<3 +#define PHY_RESET 1<<2 +#define LINK_RESET 1<<1 +#define SDS_ALL_CLR 1<<0 + +#define SDS_LINK_INIT 1<<16 +#define SDS_TX_START ((uint32_t)1<<17) +#define SDS_BUF_MODE 1<<18 + +#define SDS_PHY_RDY_EN 1<<0 +#define SDS_TX_INT_EN 1<<1 +#define SDS_RX_ERR_EN 1<<1 +#define SDS_RX_INT_EN 1<<2 +#define SDS_FIFO_OV_EN 1<<3 +#define SDS_COMMA_INT_EN 1<<5 +#define ALL_INT_TYPE 47 + +#define SDS_PHY_RDY_FLG 1<<0 +#define SDS_TX_INT_FLG 1<<1 +#define SDS_RX_INT_FLG 1<<2 +#define SDS_FIFO_OV_FLG 1<<3 +#define SDS_COMMA_INT_FLG 1<<5 +#define ALL_INT_FLG 47 + +#define SDS_SEQ_MATCH 1<<17 +#define SDS_RX_CRC_OK 1<<18 +#define SDS_PLL_READY 1<<19 +#define SDS_TX_READY 1<<20 + +#define SDS_RX_BUF 1<<24 +#define SDS_TX_BUF 1<<28 + +#define SDS_TX_NUMP_1 1<<20 +#define SDS_TX_NUMP_2 2<<20 +#define SDS_TX_NUMP_3 3<<20 +#define SDS_TX_NUMP_4 4<<20 + +/******************************************************************************* +* Function Name : Serdes_Tx_Init +* Description : Serdes configuration of hardware in Tx mode +* Input : None +* Return : None +*******************************************************************************/ +extern void Serdes_Tx_Init(void); + +/******************************************************************************* +* Function Name : Serdes_Rx_init +* Description : Serdes configuration of hardware in Rx mode +* Input : None +* Return : None +*******************************************************************************/ +extern UINT8 Serdes_Rx_Init(UINT32 cnt); + +/******************************************************************************* +* Function Name : DMA_Tx_CFG +* Description : Configure DMA transmitting mode +* Input : DMAaddr: DMA starting address +* Tx_len : length of transmitting data once +* custom_number: customized data using for data checking +* Return : None +*******************************************************************************/ +extern void DMA_Tx_CFG( UINT32 DMAaddr, UINT32 Tx_len, UINT32 custom_number); + +/******************************************************************************* +* Function Name : DoubleDMA_Rx_CFG +* Description : Configure double DMA receiving mode +* Input : DMA0_addr: DMA0 starting address + DMA1_addr: DMA1 starting address +* Return : None +*******************************************************************************/ +extern void DoubleDMA_Rx_CFG( UINT32 DMA0_addr , UINT32 DMA1_addr ); + +/******************************************************************************* +* Function Name : DMA_Tx +* Description : DMA start sending data +* Input : None +* Return : None +*******************************************************************************/ +extern void DMA_Tx(void); + +/******************************************************************************* +* Function Name : DMA_Rx_check +* Description : double DMA receiving data +* Input : DMA0_addr--DMA0 address + DMA1_addr--DMA1 address + custom_number: customized data using for data checking, + consistent with the transmitting one +* Return : None +*******************************************************************************/ +extern void DMA_Rx_check( UINT32 DMA0_addr, UINT32 DMA1_addr, UINT32 custom_number); + +/******************************************************************************* +* Function Name : ClearITFlag +* Description : Clear interruption flag +* Input : ITFlag: + 1.SDS_PHY_RDY_FLG + 2.SDS_TX_INT_FLG + 3.SDS_RX_INT_FLG + 4.SDS_FIFO_OV_FLG + 5.SDS_COMMA_INT_FLG + 6.ALL_INT_FLG +* Return : None +*******************************************************************************/ +extern void ClearITFlag( UINT16 ITFlag); + +/******************************************************************************* +* Function Name : EnableIT +* Description : Enable Interrupt +* Input : ITType: + 1.SDS_PHY_RDY_EN + 2(1).SDS_TX_INT_EN (Tx mode) + 2(2).SDS_RX_ERR_EN (Rx mode) + 3.SDS_RX_INT_EN + 4.SDS_FIFO_OV_EN + 5.SDS_COMMA_INT_EN + 6.ALL_INT_TYPE +* Return : None +*******************************************************************************/ +extern void EnableIT( UINT16 ITType); + +/******************************************************************************* +* Function Name : Wait_Txdone +* Description : waiting for Tx done +* Input : None +* Return : None +*******************************************************************************/ +extern void Wait_Txdone(void); + +/******************************************************************************* +* Function Name : Wait_commadone +* Description : waiting for Rx COMMA done +* Input : None +* Return : None +*******************************************************************************/ +extern UINT8 Wait_commadone(UINT32 cnt); + +/******************************************************************************* +* Function Name : ReadRxFlagBit +* Description : read Rx IT status +* Input : None +* Return : None +*******************************************************************************/ +extern UINT32 ReadITFlagBit(UINT16 ITFlag); + +/******************************************************************************* +* Function Name : ReadCOMMAFlagBit +* Description : read COMMA IT status +* Input : None +* Return : None +*******************************************************************************/ +extern UINT32 ReadCOMMAFlagBit(void); + +/******************************************************************************* +* Function Name : serdes_Rx_init +* Description : receiver module initialization +* Input : None +* Return : None +*******************************************************************************/ +extern void serdes_Rx_init(void); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/serdes/Kconfig b/Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/serdes/Kconfig new file mode 100644 index 000000000..47ea6f04b --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/serdes/Kconfig @@ -0,0 +1,7 @@ +config SERDES_TRANS + bool "Config serdes transmit mode." + default y + +config SERIAL_RECEI + bool "Config serdes receive mode." + default y \ No newline at end of file diff --git a/Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/serdes/Makefile b/Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/serdes/Makefile new file mode 100644 index 000000000..2b985267c --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/serdes/Makefile @@ -0,0 +1,3 @@ +SRC_FILES := connect_serdes.c + +include $(KERNEL_ROOT)/compiler.mk diff --git a/Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/serdes/connect_serdes.c b/Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/serdes/connect_serdes.c new file mode 100644 index 000000000..06d6b68e1 --- /dev/null +++ b/Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/serdes/connect_serdes.c @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2020 AIIT XUOS Lab + * XiUOS is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan + * PSL v2. You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY + * KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO + * NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. See the + * Mulan PSL v2 for more details. + */ + +/** + * @file connect_usart.c + * @brief support ch569 uart function and register to bus framework + * @version 1.0 + * @author AIIT XUOS Lab + * @date 2025-04-07 + */ + +#include "CH56x_common.h" +#include "xizi.h" +#include "board.h" +#include "shell.h" +#include "connect_serdes.h" + + +//#define Trans 1 +//#define Recei 1 + +//UINT32 Tx_DMAaddr = 0x20020000; +//UINT32 RX_DMA0_addr = 0x20033330; +//UINT32 RX_DMA1_addr = 0x20034330; +UINT32 Tx_DMAaddr[512] __attribute__((aligned(16))) = {0}; +UINT32 RX_DMA0_addr[512] __attribute__((aligned(16))) = {0}; +UINT32 RX_DMA1_addr[512] __attribute__((aligned(16))) = {0}; + +volatile UINT32 i=0; +volatile UINT32 k=0; +/******************************************************************************* +* Function Name : __attribute__((interrupt())) +* Description : SERDES_IRQHandler hard push +* Input : baudrate: UART1 communication baud rate. +* Return : None +*******************************************************************************/ +void SERDES_IRQHandler (void) __attribute__((interrupt())); + +/******************************************************************************* +* Function Name : SerdesTxTest +* Description : SerdesTxTest program. +* Input : None +* Return : None +*******************************************************************************/ +int SerdesTxTest(void) +{ + UINT32 *p32_txdma = (UINT32 *)Tx_DMAaddr; + UINT32 n=0; + UINT32 data=0; + + KPrintf("SerdesTxTest start\r\n"); + KPrintf("SerdesTxTest Tx_DMAaddr=0x%08x\r\n", (UINT32)Tx_DMAaddr); + +#ifdef SERDES_TRANS //Serdes query sent. + Serdes_Tx_Init(); + + do + { + *p32_txdma++ = data; + data += 0x01010101; + n++; + }while(n!=512); + mDelaymS(500); + + DMA_Tx_CFG( (UINT32)Tx_DMAaddr,2048,0x555555); //512 address spaces 2048 bytes + + while(1) + { + KPrintf("SerdesTxTest DMA_Tx\r\n"); + DMA_Tx(); + Wait_Txdone(); + ClearITFlag(SDS_TX_INT_FLG); + mDelaymS(5000); + } +#endif + +} + +/******************************************************************************* +* Function Name : SerdesRxTest +* Description : SerdesRxTest program. +* Input : None +* Return : None +*******************************************************************************/ +int SerdesRxTest(void) +{ + KPrintf("SerdesRxTest start\r\n"); + KPrintf("SerdesRxTest RX_DMA0_addr=0x%08x RX_DMA1_addr=0x%08x\r\n", (UINT32)RX_DMA0_addr, (UINT32)RX_DMA1_addr); + +#ifdef SERIAL_RECEI // Serdes interrupt reception. + PFIC_EnableIRQ(INT_ID_SERDES); + + DoubleDMA_Rx_CFG((UINT32)RX_DMA0_addr , (UINT32)RX_DMA1_addr ); + Serdes_Rx_Init(10*1000*1000); + Wait_commadone(10*1000*1000); + Serdes_Rx_Init(10*1000*1000); + EnableIT(SDS_RX_INT_EN|SDS_COMMA_INT_EN); + + KPrintf("SerdesRxTest init OK\r\n"); + while(1) + { + if(k==2) // After each completion of the double-buffered reception, print the received data. + { + for(i=0;i<512;i++) + { + KPrintf("%x\r\n",*(UINT32 *)(0x20033330+4*i)); + KPrintf("%x\r\n",*(UINT32 *)(0x20034330+4*i)); + } + k=0; + } + } +#endif +} + +/******************************************************************************* +* Function Name : SERDES_IRQHandler +* Description : Interruption function +* Input : None +* Return : None +*******************************************************************************/ +void SERDES_IRQHandler (void) +{ + if(ReadITFlagBit(SDS_RX_INT_FLG)) + { + ClearITFlag(SDS_RX_INT_FLG); + k++; + DMA_Rx_check((UINT32)RX_DMA0_addr, (UINT32)RX_DMA1_addr, 0x555555); + KPrintf("\nbuffer received ....... !\n"); + } + if(ReadITFlagBit(SDS_COMMA_INT_FLG)) + { + KPrintf("\nreceive COMMA, init....... !\n"); + Serdes_Rx_Init( 1000*30 ); + i = 0; + mDelaymS(50); + ClearITFlag(SDS_COMMA_INT_FLG); + } +} + + +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), + SerdesTxTest, SerdesTxTest, test serdes tx); + +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), + SerdesRxTest, SerdesRxTest, test serdes rx); diff --git a/Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/serdes/libSERDES.a b/Ubiquitous/XiZi_IIoT/board/ch569w/third_party_driver/serdes/libSERDES.a new file mode 100644 index 0000000000000000000000000000000000000000..1d9b91a31e77ba69da119161961f9b69f4be027e GIT binary patch literal 64430 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 Bs-XY? literal 0 HcmV?d00001 diff --git a/Ubiquitous/XiZi_IIoT/link.mk b/Ubiquitous/XiZi_IIoT/link.mk index fa76da46c..00e8eb95b 100644 --- a/Ubiquitous/XiZi_IIoT/link.mk +++ b/Ubiquitous/XiZi_IIoT/link.mk @@ -3,7 +3,7 @@ OBJS := $(shell cat make.obj) $(TARGET): $(OBJS) @echo ------------------------------------------------ @echo link $(TARGET) - @$(CROSS_COMPILE)g++ -o $@ $($(LINK_FLAGS)) $(OBJS) $(LINK_LWIP) $(LINK_MUSLLIB) $(LINK_MONGOOSE) $(LINK_WCH_NET) $(LIBCC) $(LINK_WCH_BLE) + @$(CROSS_COMPILE)g++ -o $@ $($(LINK_FLAGS)) $(OBJS) $(LINK_LWIP) $(LINK_MUSLLIB) $(LINK_MONGOOSE) $(LINK_WCH_NET) $(LIBCC) $(LINK_WCH_BLE) $(LINK_BOARD) @echo ------------------------------------------------ @$(CROSS_COMPILE)objcopy -O binary $@ XiZi-$(BOARD)$(COMPILE_TYPE).bin @$(CROSS_COMPILE)objdump -S $@ > XiZi-$(BOARD)$(COMPILE_TYPE).asm