56 if (dst == NULL || src == NULL || size <= 0)
59 char *pdst = (
char *)dst;
60 char *psrc = (
char *)src;
62 if (pdst > psrc && pdst < psrc + size) {
63 pdst = pdst + size - 1;
64 psrc = psrc + size - 1;
87 __READ_REG32(BLE_COMN_AGC_REG_OUT0, reg);
88 }
while (!(reg & FMC_IDLE_STATUS));
182#if (DMAC_NVIC_ENABLE == 0)
187 DEBUG(
"\nERROR: Recieved an err interrupt\n");
205#if (DMAC_NVIC_ENABLE == 0)
210 DEBUG(
"\nERROR: Recieved an err interrupt\n");
228 uint8_t errorCode = DMA_OK;
229 uint32_t fmc_prf_addr = XC_REG_FMC_BASE_ADDR + FMC_DATA_OFFSET;
231 ch_cfg.
sar = (uint32_t)fmc_prf_addr;
232 ch_cfg.
dar = (uint32_t)rx_buff;
259 if (errorCode != 0) {
260 DEBUG(
"\nERROR: Failed to initialise configuration\n");
279 uint8_t errorCode = DMA_OK;
280 uint32_t fmc_prf_addr = XC_REG_FMC_BASE_ADDR + FMC_DATA_OFFSET;
282 ch_cfg.
sar = (uint32_t)tx_buff;
283 ch_cfg.
dar = (uint32_t)fmc_prf_addr;
310 if (errorCode != 0) {
311 DEBUG(
"\nERROR: Failed to initialise configuration\n");
328 eDMA_Ch_Num r_chnum, uint16_t r_size, uint8_t *r_buff)
335 if (errorCode != 0) {
336 DEBUG(
"\nERROR: Failed SPI_DMAC_Recv_Cfg\n");
339 if (errorCode != 0) {
340 DEBUG(
"\nERROR: Failed SPI_DMAC_Send_Cfg\n");
346 if (errorCode != 0) {
347 DEBUG(
"\nERROR: Failed DMAC_StartTransfer read\n");
351 if (errorCode != 0) {
352 DEBUG(
"\nERROR: Failed DMAC_StartTransfer write\n");
370 eDMA_Ch_Num r_chnum, uint16_t r_size, uint8_t *r_buff)
378 DEBUG(
"\nERROR: Failed SPI_DMAC_Recv_Cfg\n");
382 DEBUG(
"\nERROR: Failed SPI_DMAC_Send_Cfg\n");
389 DEBUG(
"\nERROR: Failed DMAC_StartTransfer read\n");
394 DEBUG(
"\nERROR: Failed DMAC_StartTransfer write\n");
417 if (errorCode != 0) {
418 DEBUG(
"\nERROR: Failed SPI_DMAC_Send_Cfg\n");
424 if (errorCode != 0) {
425 DEBUG(
"\nERROR: Failed DMAC_StartTransfer write\n");
443 cpr_bt_clk_ctl__bt_clk_en__setf(ENABLE);
445 cpr_bt_modem_clk_ctl__bt_modem_clk_en__setf(ENABLE);
447 cpr_ctlapbclken_grctl__bt_pclk_en__setf(ENABLE);
448 cpr_ssi0_mclk_ctl__ssi_mclk_en__setf(DISABLE);
449 cpr_rstctl_subrst_sw__ssi0_rstn__setf(ENABLE);
450 cpr_rstctl_subrst_sw__ssi0_rstn__setf(DISABLE);
462 cpr_fmc_ctl_set(0x0503);
464 cpr_fmc_ctl_set(0x3503);
468 fmc_en__ssic_en__setf(FMC_SSI_EN_SEN_DISABLE);
469 fmc_dmac_pack(FMC_SSI_DMAC_RDMAE_DISABLE, FMC_SSI_DMAC_TDMAE_DISABLE);
472 fmc_ctrl0__dfs__setf(0x1f);
474 fmc_ctrl0__sste__setf(DISABLE);
482 fmc_en__ssic_en__setf(FMC_SSI_EN_SEN_ENABLE);
495 fmc_en__ssic_en__setf(FMC_SSI_EN_SEN_DISABLE);
496 fmc_ctrl0__dfs__setf(dfs);
499 fmc_dmac_pack(FMC_SSI_DMAC_RDMAE_ENABLE, FMC_SSI_DMAC_TDMAE_ENABLE);
500 fmc_en__ssic_en__setf(FMC_SSI_EN_SEN_ENABLE);
513 fmc_dmac_pack(FMC_SSI_DMAC_RDMAE_DISABLE, FMC_SSI_DMAC_TDMAE_DISABLE);
514 fmc_en__ssic_en__setf(FMC_SSI_EN_SEN_DISABLE);
516 fmc_ctrl0__dfs__setf(0x1f);
517 fmc_en__ssic_en__setf(FMC_SSI_EN_SEN_ENABLE);
556 cmd[0] = CMD_RELEASE_PWRDWN;
593 cmd[0] = CMD_WRITE_ENABLE;
616 cmd[0] = CMD_WRITE_DISABLE;
635 uint8_t cmd[4] = {0};
642 cmd[0] = CMD_SECTOR_ERASE;
643 cmd[1] = Dst_Addr >> 16;
644 cmd[2] = Dst_Addr >> 8;
666 uint8_t cmd[4] = {0};
672 cmd[0] = CMD_PAGE_ERASE;
673 cmd[1] = Dst_Addr >> 16;
674 cmd[2] = Dst_Addr >> 8;
699 uint8_t cmd[FLASH_PAGE_SIZE + 4] = {0};
701 if (size > FLASH_PAGE_SIZE)
710 cmd[0] = CMD_PAGE_PROGRAM;
711 cmd[1] = WriteAddr >> 16;
712 cmd[2] = WriteAddr >> 8;
739 uint8_t cmd[FLASH_PAGE_SIZE + 4] = {0};
740 uint8_t
mid[FLASH_PAGE_SIZE + 4] = {0};
742 if (size > FLASH_PAGE_SIZE)
747 cmd[0] = CMD_READ_DATA;
748 cmd[1] = ReadAddr >> 16;
749 cmd[2] = ReadAddr >> 8;
776 eXC_RESULT ret = XR_OK;
777 uint16_t ReqPageCnt = 0;
778 uint16_t CurPageNum = 0;
779 uint16_t CurStartPsr = 0;
780 uint16_t NextPageNum = 0;
781 uint16_t NextStopPsr = 0;
782 uint8_t temp_buff[FLASH_PAGE_SIZE] = {0};
784 if (len <= FLASH_PAGE_SIZE) {
785 CurPageNum = CUR_PAGE_NUM(readAddr);
786 CurStartPsr = CUR_START_PSR(readAddr);
787 if ((len + CurStartPsr) > FLASH_PAGE_SIZE)
798 }
else if (ReqPageCnt == 2) {
799 NextPageNum = CurPageNum + 1;
800 NextStopPsr = len + CurStartPsr - FLASH_PAGE_SIZE;
807 uint16_t HaveCopyNum = len - NextStopPsr;
809 temp_buff, FLASH_PAGE_SIZE);
814 CurPageNum = CUR_PAGE_NUM(readAddr);
815 CurStartPsr = CUR_START_PSR(readAddr);
816 NextPageNum = CurPageNum + 1;
818 uint16_t buff_idx = 0;
819 uint16_t pre_len = NextPageNum * FLASH_PAGE_SIZE - readAddr;
820 uint32_t pre_addr = CurPageNum * FLASH_PAGE_SIZE;
826 pre_addr = NextPageNum * FLASH_PAGE_SIZE;
827 while (buff_idx < len) {
828 if ((len - buff_idx) >= FLASH_PAGE_SIZE) {
833 buff_idx += FLASH_PAGE_SIZE;
834 pre_addr += FLASH_PAGE_SIZE;
840 buff_idx += (len - buff_idx);
841 pre_addr += (len - buff_idx);
862 eXC_RESULT ret = XR_OK;
864 uint32_t cur_addr = writeAddr;
865 uint32_t end_addr = writeAddr + size;
868 uint16_t CurPageNum = 0;
869 uint16_t CurSectorNum = 0;
871 uint32_t CurStartPsr = 0;
878 if(
mid != GD_FlASH_RDID){
879 uint8_t temp_buff[FLASH_PAGE_SIZE];
880 while (cur_addr != end_addr) {
882 CurPageNum = CUR_PAGE_NUM(cur_addr);
883 CurStartPsr = CUR_START_PSR(cur_addr);
892 (FLASH_PAGE_SIZE - CurStartPsr) > size - wt_len
894 : (FLASH_PAGE_SIZE - CurStartPsr));
895 wt_len += wt_len + ((FLASH_PAGE_SIZE - CurStartPsr) > size - wt_len
897 : (FLASH_PAGE_SIZE - CurStartPsr));
901 size - wt_len > FLASH_PAGE_SIZE ? FLASH_PAGE_SIZE
903 cur_addr += (size - wt_len > FLASH_PAGE_SIZE ? FLASH_PAGE_SIZE
905 wt_len += (size - wt_len > FLASH_PAGE_SIZE ? FLASH_PAGE_SIZE
913 }
else if(
mid == GD_FlASH_RDID){
914 uint8_t temp_buff[FLASH_SECTOR_SIZE] = {0};
915 while (cur_addr != end_addr) {
917 CurSectorNum = CUR_SECTOR_NUM(cur_addr);
918 CurStartPsr = CUR_START_PSR(cur_addr);
920 for(
int i=0;i<FLASH_SECTOR_SIZE/FLASH_PAGE_SIZE;i++){
929 (FLASH_SECTOR_SIZE - CurStartPsr) > size - wt_len
931 : (FLASH_SECTOR_SIZE - CurStartPsr));
932 wt_len += wt_len + ((FLASH_SECTOR_SIZE - CurStartPsr) > size - wt_len
934 : (FLASH_SECTOR_SIZE - CurStartPsr));
938 size - wt_len > FLASH_SECTOR_SIZE ? FLASH_SECTOR_SIZE
940 cur_addr += (size - wt_len > FLASH_SECTOR_SIZE ? FLASH_SECTOR_SIZE
942 wt_len += (size - wt_len > FLASH_SECTOR_SIZE ? FLASH_SECTOR_SIZE
946 for(
int i=0;i<FLASH_SECTOR_SIZE/FLASH_PAGE_SIZE;i++){
971 uint8_t cmd[4] = {0};
1004 uint8_t cmd[21] = {0};
1005 uint8_t
id[21] = {0};
1035 uint8_t cmd[2] = {0};
1036 uint8_t sta[2] = {0xff, 0xff};
1038 cmd[0] = CMD_READ_STATUS;
1063 uint8_t *w_data, uint16_t w_size,
1064 uint8_t *r_data, uint16_t r_size)
1087 uint8_t *w_data, uint16_t w_size,
1088 uint8_t *r_data, uint16_t r_size)
eDMA_CH_Priority cfg_ch_prior
eDMA_Burst_Trans_Len ctl_dst_msize
eDMA_Fifo_Mode cfg_fifo_mode
eDMA_Trans_Width ctl_src_tr_width
eDMA_SW_HW_HS_Select cfg_hs_sel_src
eDMA_SW_HW_HS_Select cfg_hs_sel_dst
eDMA_Burst_Trans_Len ctl_src_msize
eDMA_Trans_Flow ctl_tt_fc
eDMA_Trans_Width ctl_dst_tr_width
eDMA_HS_Interface cfg_dst_per
eDMA_Addr_Increment ctl_dinc
eDMA_HS_Interface cfg_src_per
eDMA_Addr_Increment ctl_sinc
static volatile uint32_t mid
__RAM_CODE uint8_t xc_dma_disable(void)
xc_dma_disable
__RAM_CODE uint8_t xc_dma_set_channel_config(eDMA_Ch_Num ch_num, DMA_Chx_Cfg_t *ch)
xc_dma_set_channel_config
__RAM_CODE bool xc_dma_set_listener(eDMA_Ch_Num ch_num, DMA_Callback userFunction)
xc_dma_set_listener
__RAM_CODE uint8_t xc_dma_init(void)
xc_dma_init
__RAM_CODE void xc_dma_enable(void)
xc_dma_enable
__RAM_CODE uint8_t xc_dma_start_transfer(eDMA_Ch_Num ch_num, DMA_Callback cb_func)
xc_dma_start_transfer
DMA_Instance_t DMA_Instance
__RAM_CODE bool dma_irq_handler(DMA_Instance_t *inst)
dma_irq_handler
enum dmac_channel_number eDMA_Ch_Num
static __RAM_CODE void * ram_memcpy_byte(void *dst, const void *src, int size)
__RAM_CODE void xc_fmc_spi_dma_flash_write_page(uint32_t WriteAddr, uint8_t *data, uint16_t size)
__RAM_CODE void xc_fmc_spi_dma_flash_write_enable(void)
__RAM_CODE uint8_t xc_fmc_spi_dma_write_config(eDMA_Ch_Num ch_num, uint16_t blockSize, uint8_t *tx_buff)
__RAM_CODE void xc_fmc_spi_dma_flash_ruid(uint8_t *ruid)
__RAM_CODE void xc_fmc_spi_dma_deinit(void)
__RAM_CODE void xc_fmc_spi_dma_flash_wait_busy(void)
__RAM_CODE void xc_fmc_spi_init(void)
__RAM_CODE void xc_fmc_spi_dma_flash_erase_sector(uint32_t Dst_Addr)
__RAM_CODE void xc_fmc_spi_dma_init(uint8_t dfs, uint8_t tdl, uint8_t rdl)
static volatile bool wr_tfr_flag
__RAM_CODE void xc_fmc_spi_dma_flash_rdid(uint8_t *rdid)
__RAM_CODE void xc_fmc_spi_dma_flash_erase_page(uint32_t Dst_Addr)
__RAM_CODE void xc_fmc_spi_dma_flash_read_page(uint32_t ReadAddr, uint8_t *data, uint16_t size)
__RAM_CODE void xc_fmc_dma_mem2prf_finish(void)
__RAM_CODE void xc_fmc_spi_dma_write_and_read_data(uint8_t *w_data, uint16_t w_size, uint8_t *r_data, uint16_t r_size)
__RAM_CODE void xc_fmc_spi_dma_flash_power_down(void)
void xc_fmc_spi_dma_read_and_write_data(uint8_t *w_data, uint16_t w_size, uint8_t *r_data, uint16_t r_size)
__RAM_CODE uint8_t xc_fmc_spi_dma_read_config(eDMA_Ch_Num ch_num, uint16_t blockSize, uint8_t *rx_buff)
__RAM_CODE void xc_fmc_spi_dma_flash_wake_up(void)
__RAM_CODE void xc_fmc_spi_dma_write_and_read(eDMA_Ch_Num w_chnum, uint16_t w_size, uint8_t *w_buff, eDMA_Ch_Num r_chnum, uint16_t r_size, uint8_t *r_buff)
__RAM_CODE uint8_t xc_fmc_spi_dma_flash_read_status(void)
__RAM_CODE void fmc_dma_read_err(uint8_t eCode)
__RAM_CODE void xc_fmc_spi_dma_flash_write_disable(void)
__RAM_CODE void fmc_dma_read_callback(uint8_t eCode)
static volatile bool rd_tfr_flag
void xc_fmc_spi_dma_read_and_write(eDMA_Ch_Num w_chnum, uint16_t w_size, uint8_t *w_buff, eDMA_Ch_Num r_chnum, uint16_t r_size, uint8_t *r_buff)
static volatile bool err_flag
__RAM_CODE void xc_fmc_spi_dma_write(eDMA_Ch_Num w_chnum, uint16_t w_size, uint8_t *w_buff)
__RAM_CODE eXC_RESULT xc_fmc_spi_dma_flash_write(uint32_t writeAddr, uint8_t *buff, uint16_t size)
__RAM_CODE void fmc_dma_write_callback(uint8_t eCode)
__RAM_CODE eXC_RESULT xc_fmc_spi_dma_flash_read(uint32_t readAddr, uint8_t *buff, uint16_t len)
__RAM_CODE void xc_fmc_status_wait_idle(void)
__RAM_CODE void xc_fmc_dma_prf2mem_finish(void)
__RAM_CODE void fmc_dma_write_err(uint8_t eCode)
The header of xc_drv_fmc_spi_dma.c
void xc_gpio_mux_ctl(uint8_t num, GPIO_MUX_TypeDef mux)
xc_gpio_init
void delay_us(uint32_t nus)