BLE5.2 1.0
开发文档说明
xc_drv_fmc_spi_dma.c
浏览该文件的文档.
1
25/*-----------------------------------------------------------------------------------
26 INCLUDE HEADE FILES
27 ------------------------------------------------------------------------------------*/
28#include "xc_drv_fmc_spi_dma.h"
29
30/*------------------------------------------------------------------------------------
31 Local Variables
32 -------------------------------------------------------------------------------------*/
33
34static volatile bool wr_tfr_flag;
35static volatile bool rd_tfr_flag;
36static volatile bool err_flag;
37
38/*------------------------------------------------------------------------------------
39 Func Prototype
40 -------------------------------------------------------------------------------------*/
41__RAM_CODE uint8_t xc_fmc_spi_dma_flash_read_status(void);
42
43/*------------------------------------------------------------------------------------
44 Functions
45 -------------------------------------------------------------------------------------*/
54static __RAM_CODE void *ram_memcpy_byte(void *dst, const void *src, int size)
55{
56 if (dst == NULL || src == NULL || size <= 0)
57 return NULL;
58
59 char *pdst = (char *)dst;
60 char *psrc = (char *)src;
61
62 if (pdst > psrc && pdst < psrc + size) {
63 pdst = pdst + size - 1;
64 psrc = psrc + size - 1;
65 while (size--)
66 *pdst-- = *psrc--;
67 } else {
68 while (size--)
69 *pdst++ = *psrc++;
70 }
71
72 return dst;
73}
74
83__RAM_CODE void xc_fmc_status_wait_idle(void)
84{
85 uint32_t reg = 0;
86 do {
87 __READ_REG32(BLE_COMN_AGC_REG_OUT0, reg);
88 } while (!(reg & FMC_IDLE_STATUS));
89}
90
99__RAM_CODE void fmc_dma_write_callback(uint8_t eCode)
100{
101 wr_tfr_flag = true;
102}
103
112__RAM_CODE void fmc_dma_read_callback(uint8_t eCode)
113{
114 rd_tfr_flag = true;
115}
116
125__RAM_CODE void fmc_dma_write_err(uint8_t eCode)
126{
127 // -------
128 // This function is called by the IRQ handler.
129 // We use this function to deal with interrupts that the DMA
130 // driver is unable to cater for (these are application
131 // specific). All of the interrupts handled by this function
132 // are cleared by the DMA driver, so there's no need to clear here.
133 // -------
134
135 // Check the source of the interrupt
136
137 if (eCode == DMA_IRQ_ERR) {
138
139 // Just inform the application that this interrupt has occured.
140 err_flag = true;
141 }
142}
143
152__RAM_CODE void fmc_dma_read_err(uint8_t eCode)
153{
154 // -------
155 // This function is called by the IRQ handler.
156 // We use this function to deal with interrupts that the DMA
157 // driver is unable to cater for (these are application
158 // specific). All of the interrupts handled by this function
159 // are cleared by the DMA driver, so there's no need to clear here.
160 // -------
161
162 // Check the source of the interrupt
163
164 if (eCode == DMA_IRQ_ERR) {
165
166 // Just inform the application that this interrupt has occured.
167 err_flag = true;
168 }
169}
170
179__RAM_CODE void xc_fmc_dma_mem2prf_finish(void)
180{
181 while (wr_tfr_flag == false) {
182#if (DMAC_NVIC_ENABLE == 0)
184#endif
185 if (err_flag == true) {
186 // Wasn't expecting this !!
187 DEBUG("\nERROR: Recieved an err interrupt\n");
188 err_flag = false;
189 }
190 }
191 wr_tfr_flag = false;
192}
193
202__RAM_CODE void xc_fmc_dma_prf2mem_finish(void)
203{
204 while (rd_tfr_flag == false) {
205#if (DMAC_NVIC_ENABLE == 0)
207#endif
208 if (err_flag == true) {
209 // Wasn't expecting this !!
210 DEBUG("\nERROR: Recieved an err interrupt\n");
211 err_flag = false;
212 }
213 }
214 rd_tfr_flag = false;
215}
216
225__RAM_CODE uint8_t xc_fmc_spi_dma_read_config(eDMA_Ch_Num ch_num, uint16_t blockSize, uint8_t *rx_buff)
226{
227 DMA_Chx_Cfg_t ch_cfg;
228 uint8_t errorCode = DMA_OK;
229 uint32_t fmc_prf_addr = XC_REG_FMC_BASE_ADDR + FMC_DATA_OFFSET;
230
231 ch_cfg.sar = (uint32_t)fmc_prf_addr;
232 ch_cfg.dar = (uint32_t)rx_buff;
233
234 ch_cfg.ctl_src_msize = DMA_MSIZE_1;
235 ch_cfg.ctl_dst_msize = DMA_MSIZE_1;
236
239
242
243 ch_cfg.ctl_tt_fc = DMA_PRF2MEM_DMA;
244
245 ch_cfg.ctl_block_ts = blockSize;
246
249
251
253
255 // Now we can intialise the channel configuration structure for
256 // DMA channel 0 by loading the structure members with the
257 // contents of the DMAC's channel 0 registers.
258 errorCode = xc_dma_set_channel_config(ch_num, &ch_cfg);
259 if (errorCode != 0) {
260 DEBUG("\nERROR: Failed to initialise configuration\n");
261 }
262
264
265 return errorCode;
266}
267
276__RAM_CODE uint8_t xc_fmc_spi_dma_write_config(eDMA_Ch_Num ch_num, uint16_t blockSize, uint8_t *tx_buff)
277{
278 DMA_Chx_Cfg_t ch_cfg;
279 uint8_t errorCode = DMA_OK;
280 uint32_t fmc_prf_addr = XC_REG_FMC_BASE_ADDR + FMC_DATA_OFFSET;
281
282 ch_cfg.sar = (uint32_t)tx_buff;
283 ch_cfg.dar = (uint32_t)fmc_prf_addr;
284
285 ch_cfg.ctl_src_msize = DMA_MSIZE_1;
286 ch_cfg.ctl_dst_msize = DMA_MSIZE_1;
287
290
293
294 ch_cfg.ctl_tt_fc = DMA_MEM2PRF_DMA;
295
296 ch_cfg.ctl_block_ts = blockSize;
297
300
302
304
306 // Now we can intialise the channel configuration structure for
307 // DMA channel 0 by loading the structure members with the
308 // contents of the DMAC's channel 0 registers.
309 errorCode = xc_dma_set_channel_config(ch_num, &ch_cfg);
310 if (errorCode != 0) {
311 DEBUG("\nERROR: Failed to initialise configuration\n");
312 }
313
315
316 return errorCode;
317}
318
327__RAM_CODE void xc_fmc_spi_dma_write_and_read(eDMA_Ch_Num w_chnum, uint16_t w_size, uint8_t *w_buff,
328 eDMA_Ch_Num r_chnum, uint16_t r_size, uint8_t *r_buff)
329{
330 uint8_t errorCode;
331
332 xc_dma_init( );
333
334 errorCode = xc_fmc_spi_dma_read_config(r_chnum, r_size, r_buff);
335 if (errorCode != 0) {
336 DEBUG("\nERROR: Failed SPI_DMAC_Recv_Cfg\n");
337 }
338 errorCode = xc_fmc_spi_dma_write_config(w_chnum, w_size + 1, w_buff);
339 if (errorCode != 0) {
340 DEBUG("\nERROR: Failed SPI_DMAC_Send_Cfg\n");
341 }
342
343 xc_dma_enable( );
344
345 errorCode = xc_dma_start_transfer(r_chnum,fmc_dma_read_callback);
346 if (errorCode != 0) {
347 DEBUG("\nERROR: Failed DMAC_StartTransfer read\n");
348 }
349
350 errorCode = xc_dma_start_transfer(w_chnum, fmc_dma_write_callback);
351 if (errorCode != 0) {
352 DEBUG("\nERROR: Failed DMAC_StartTransfer write\n");
353 }
354
357
359}
360
369void xc_fmc_spi_dma_read_and_write(eDMA_Ch_Num w_chnum, uint16_t w_size, uint8_t *w_buff,
370 eDMA_Ch_Num r_chnum, uint16_t r_size, uint8_t *r_buff)
371{
372 uint8_t errorCode;
373
374 xc_dma_init( );
375
376 errorCode = xc_fmc_spi_dma_read_config(r_chnum, r_size, r_buff);
377 if(errorCode != 0) {
378 DEBUG("\nERROR: Failed SPI_DMAC_Recv_Cfg\n");
379 }
380 errorCode = xc_fmc_spi_dma_write_config(w_chnum, w_size+1, w_buff);
381 if(errorCode != 0) {
382 DEBUG("\nERROR: Failed SPI_DMAC_Send_Cfg\n");
383 }
384
385 xc_dma_enable( );
386
387 errorCode = xc_dma_start_transfer(r_chnum, fmc_dma_read_callback);
388 if(errorCode != 0) {
389 DEBUG("\nERROR: Failed DMAC_StartTransfer read\n");
390 }
391
392 errorCode = xc_dma_start_transfer(w_chnum, fmc_dma_write_callback);
393 if(errorCode != 0) {
394 DEBUG("\nERROR: Failed DMAC_StartTransfer write\n");
395 }
396
399
401}
410__RAM_CODE void xc_fmc_spi_dma_write(eDMA_Ch_Num w_chnum, uint16_t w_size, uint8_t *w_buff)
411{
412 uint8_t errorCode;
413
414 xc_dma_init( );
415
416 errorCode = xc_fmc_spi_dma_write_config(w_chnum, w_size, w_buff);
417 if (errorCode != 0) {
418 DEBUG("\nERROR: Failed SPI_DMAC_Send_Cfg\n");
419 }
420
421 xc_dma_enable( );
422
423 errorCode = xc_dma_start_transfer(w_chnum, fmc_dma_write_callback);
424 if (errorCode != 0) {
425 DEBUG("\nERROR: Failed DMAC_StartTransfer write\n");
426 }
427
429
431}
432
441__RAM_CODE void xc_fmc_spi_init(void)
442{
443 cpr_bt_clk_ctl__bt_clk_en__setf(ENABLE);
444
445 cpr_bt_modem_clk_ctl__bt_modem_clk_en__setf(ENABLE);
446
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);
451
453
454#if (USE_XIP != 1)
455 xc_gpio_mux_ctl(35, GPIO_Mux2); // clk
456 xc_gpio_mux_ctl(36, GPIO_Mux2); // cs
457 xc_gpio_mux_ctl(37, GPIO_Mux2); // d0
458 xc_gpio_mux_ctl(38, GPIO_Mux2); // d1
459 xc_gpio_mux_ctl(33, GPIO_Mux1); // d2
460 xc_gpio_mux_ctl(34, GPIO_Mux1); // d3
461
462 cpr_fmc_ctl_set(0x0503);
463 delay_us(200);
464 cpr_fmc_ctl_set(0x3503);
465 delay_us(50);
466#endif
467
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);
470 fmc_dmatdl_set(1);
471 fmc_dmardl_set(1);
472 fmc_ctrl0__dfs__setf(0x1f);
473
474 fmc_ctrl0__sste__setf(DISABLE);
475
476 fmc_se_set(ENABLE);
477 fmc_ie_set(DISABLE);
478 fmc_baud_set(2);
479 fmc_txftl_set(0);
480 fmc_rxftl_set(0);
481
482 fmc_en__ssic_en__setf(FMC_SSI_EN_SEN_ENABLE);
483}
484
493__RAM_CODE void xc_fmc_spi_dma_init(uint8_t dfs, uint8_t tdl, uint8_t rdl)
494{
495 fmc_en__ssic_en__setf(FMC_SSI_EN_SEN_DISABLE);
496 fmc_ctrl0__dfs__setf(dfs);
497 fmc_dmatdl_set(tdl);
498 fmc_dmardl_set(rdl);
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);
501}
502
511__RAM_CODE void xc_fmc_spi_dma_deinit(void)
512{
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);
515
516 fmc_ctrl0__dfs__setf(0x1f);
517 fmc_en__ssic_en__setf(FMC_SSI_EN_SEN_ENABLE);
518}
519
529{
531
532 uint8_t cmd[1];
533
534 cmd[0] = CMD_PWRDWN;
535
536 xc_fmc_spi_dma_init(0x07, 1, 1);
537
538 xc_fmc_spi_dma_write(DMA_CHANNEL0, sizeof(cmd), cmd);
539
541}
542
551__RAM_CODE void xc_fmc_spi_dma_flash_wake_up(void)
552{
554 uint8_t cmd[1];
555
556 cmd[0] = CMD_RELEASE_PWRDWN;
557
558 xc_fmc_spi_dma_init(0x07, 1, 1);
559
560 xc_fmc_spi_dma_write(DMA_CHANNEL0, sizeof(cmd), cmd);
561
563}
564
574{
575 while (xc_fmc_spi_dma_flash_read_status() & 0x01)
576 ;
577}
578
588{
590
591 uint8_t cmd[1];
592
593 cmd[0] = CMD_WRITE_ENABLE;
594
595 xc_fmc_spi_dma_init(0x07, 1, 1);
596
597 xc_fmc_spi_dma_write(DMA_CHANNEL0, sizeof(cmd), cmd);
598
600}
601
611{
613
614 uint8_t cmd[1];
615
616 cmd[0] = CMD_WRITE_DISABLE;
617
618 xc_fmc_spi_dma_init(0x07, 1, 1);
619
620 xc_fmc_spi_dma_write(DMA_CHANNEL0, sizeof(cmd), cmd);
621
623}
624
633__RAM_CODE void xc_fmc_spi_dma_flash_erase_sector(uint32_t Dst_Addr)
634{
635 uint8_t cmd[4] = {0};
636
641
642 cmd[0] = CMD_SECTOR_ERASE;
643 cmd[1] = Dst_Addr >> 16;
644 cmd[2] = Dst_Addr >> 8;
645 cmd[3] = Dst_Addr;
646
647 xc_fmc_spi_dma_init(0x07, 1, 1);
648
649 xc_fmc_spi_dma_write(DMA_CHANNEL0, sizeof(cmd), cmd);
650
652
654}
655
664__RAM_CODE void xc_fmc_spi_dma_flash_erase_page(uint32_t Dst_Addr)
665{
666 uint8_t cmd[4] = {0};
667
671
672 cmd[0] = CMD_PAGE_ERASE;
673 cmd[1] = Dst_Addr >> 16;
674 cmd[2] = Dst_Addr >> 8;
675 cmd[3] = Dst_Addr;
676
677 xc_fmc_spi_dma_init(0x07, 1, 1);
678
679 xc_fmc_spi_dma_write(DMA_CHANNEL0, sizeof(cmd), cmd);
680
682
684}
685
697__RAM_CODE void xc_fmc_spi_dma_flash_write_page(uint32_t WriteAddr, uint8_t *data, uint16_t size)
698{
699 uint8_t cmd[FLASH_PAGE_SIZE + 4] = {0};
700
701 if (size > FLASH_PAGE_SIZE)
702 return;
703
705
707
709
710 cmd[0] = CMD_PAGE_PROGRAM;
711 cmd[1] = WriteAddr >> 16;
712 cmd[2] = WriteAddr >> 8;
713 cmd[3] = WriteAddr;
714
715 ram_memcpy_byte(&cmd[4], data, FLASH_PAGE_SIZE);
716
717 xc_fmc_spi_dma_init(0x07, 1, 1);
718
719 xc_fmc_spi_dma_write(DMA_CHANNEL0, size + 4, cmd);
720
722
724}
725
737__RAM_CODE void xc_fmc_spi_dma_flash_read_page(uint32_t ReadAddr, uint8_t *data, uint16_t size)
738{
739 uint8_t cmd[FLASH_PAGE_SIZE + 4] = {0};
740 uint8_t mid[FLASH_PAGE_SIZE + 4] = {0};
741
742 if (size > FLASH_PAGE_SIZE)
743 return;
744
746
747 cmd[0] = CMD_READ_DATA;
748 cmd[1] = ReadAddr >> 16;
749 cmd[2] = ReadAddr >> 8;
750 cmd[3] = ReadAddr;
751
752 xc_fmc_spi_dma_init(0x07, 1, 1);
753
755 DMA_CHANNEL0, (size + 4), mid);
756
758
759 ram_memcpy_byte(data, mid + 4, FLASH_PAGE_SIZE);
760
761}
762
774__RAM_CODE eXC_RESULT xc_fmc_spi_dma_flash_read(uint32_t readAddr, uint8_t *buff, uint16_t len)
775{
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};
783
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)
788 ReqPageCnt = 2;
789 else
790 ReqPageCnt = 1;
791
792 if (ReqPageCnt == 1)
793 {
794 xc_fmc_spi_dma_flash_read_page(CurPageNum * FLASH_PAGE_SIZE, temp_buff,
795 FLASH_PAGE_SIZE);
796
797 ram_memcpy_byte(buff, &temp_buff[CurStartPsr], len);
798 } else if (ReqPageCnt == 2) {
799 NextPageNum = CurPageNum + 1;
800 NextStopPsr = len + CurStartPsr - FLASH_PAGE_SIZE;
801
802 xc_fmc_spi_dma_flash_read_page(CurPageNum * FLASH_PAGE_SIZE, temp_buff,
803 FLASH_PAGE_SIZE);
804
805 ram_memcpy_byte(buff, &temp_buff[CurStartPsr], len - NextStopPsr);
806
807 uint16_t HaveCopyNum = len - NextStopPsr;
808 xc_fmc_spi_dma_flash_read_page(NextPageNum * FLASH_PAGE_SIZE,
809 temp_buff, FLASH_PAGE_SIZE);
810
811 ram_memcpy_byte(buff + HaveCopyNum, temp_buff, NextStopPsr);
812 }
813 } else {
814 CurPageNum = CUR_PAGE_NUM(readAddr);
815 CurStartPsr = CUR_START_PSR(readAddr);
816 NextPageNum = CurPageNum + 1;
817
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;
821 xc_fmc_spi_dma_flash_read_page(pre_addr, temp_buff, FLASH_PAGE_SIZE);
822
823 ram_memcpy_byte(buff, &temp_buff[CurStartPsr], pre_len);
824 buff_idx += pre_len;
825
826 pre_addr = NextPageNum * FLASH_PAGE_SIZE;
827 while (buff_idx < len) {
828 if ((len - buff_idx) >= FLASH_PAGE_SIZE) {
829 xc_fmc_spi_dma_flash_read_page(pre_addr, temp_buff,
830 FLASH_PAGE_SIZE);
831
832 ram_memcpy_byte(&buff[buff_idx], temp_buff, FLASH_PAGE_SIZE);
833 buff_idx += FLASH_PAGE_SIZE;
834 pre_addr += FLASH_PAGE_SIZE;
835 } else {
836 xc_fmc_spi_dma_flash_read_page(pre_addr, temp_buff,
837 FLASH_PAGE_SIZE);
838
839 ram_memcpy_byte(&buff[buff_idx], temp_buff, len - buff_idx);
840 buff_idx += (len - buff_idx);
841 pre_addr += (len - buff_idx);
842 }
843 }
844 }
845
846 return ret;
847}
848
860__RAM_CODE eXC_RESULT xc_fmc_spi_dma_flash_write(uint32_t writeAddr, uint8_t *buff, uint16_t size)
861{
862 eXC_RESULT ret = XR_OK;
863
864 uint32_t cur_addr = writeAddr;
865 uint32_t end_addr = writeAddr + size;
866 uint16_t wt_len = 0;
867 // The current page number occupied by this data storage
868 uint16_t CurPageNum = 0;
869 uint16_t CurSectorNum = 0;
870 // The position occupied by this address on the current page
871 uint32_t CurStartPsr = 0;
872
873
874 uint32_t mid = 0;
875 xc_fmc_spi_dma_flash_rdid((uint8_t*)&mid);
876
877
878 if(mid != GD_FlASH_RDID){
879 uint8_t temp_buff[FLASH_PAGE_SIZE];
880 while (cur_addr != end_addr) {
881 /* code */
882 CurPageNum = CUR_PAGE_NUM(cur_addr);
883 CurStartPsr = CUR_START_PSR(cur_addr);
884
885 xc_fmc_spi_dma_flash_read_page(CurPageNum * FLASH_PAGE_SIZE, temp_buff,
886 FLASH_PAGE_SIZE);
887 xc_fmc_spi_dma_flash_erase_page(CurPageNum * FLASH_PAGE_SIZE);
888
889
890 if (CurStartPsr) {
891 ram_memcpy_byte(&temp_buff[CurStartPsr], buff + wt_len,
892 (FLASH_PAGE_SIZE - CurStartPsr) > size - wt_len // ǰʣĿռǷд
893 ? size - wt_len
894 : (FLASH_PAGE_SIZE - CurStartPsr));
895 wt_len += wt_len + ((FLASH_PAGE_SIZE - CurStartPsr) > size - wt_len
896 ? size - wt_len
897 : (FLASH_PAGE_SIZE - CurStartPsr));
898 cur_addr += wt_len;
899 } else {
900 ram_memcpy_byte(temp_buff, buff + wt_len,
901 size - wt_len > FLASH_PAGE_SIZE ? FLASH_PAGE_SIZE
902 : size - wt_len);
903 cur_addr += (size - wt_len > FLASH_PAGE_SIZE ? FLASH_PAGE_SIZE
904 : size - wt_len);
905 wt_len += (size - wt_len > FLASH_PAGE_SIZE ? FLASH_PAGE_SIZE
906 : size - wt_len);
907 }
908
909 xc_fmc_spi_dma_flash_write_page(CurPageNum * FLASH_PAGE_SIZE, temp_buff,
910 FLASH_PAGE_SIZE);
911 }
912
913 }else if(mid == GD_FlASH_RDID){
914 uint8_t temp_buff[FLASH_SECTOR_SIZE] = {0};
915 while (cur_addr != end_addr) {
916 /* code */
917 CurSectorNum = CUR_SECTOR_NUM(cur_addr);
918 CurStartPsr = CUR_START_PSR(cur_addr);
919
920 for(int i=0;i<FLASH_SECTOR_SIZE/FLASH_PAGE_SIZE;i++){
921 xc_fmc_spi_dma_flash_read_page(CurSectorNum * FLASH_SECTOR_SIZE+ i* FLASH_PAGE_SIZE, temp_buff+i*FLASH_PAGE_SIZE,
922 FLASH_PAGE_SIZE);
923 }
924
925 xc_fmc_spi_dma_flash_erase_sector(CurSectorNum * FLASH_SECTOR_SIZE);
926
927 if (CurStartPsr) {
928 ram_memcpy_byte(&temp_buff[CurStartPsr], buff + wt_len,
929 (FLASH_SECTOR_SIZE - CurStartPsr) > size - wt_len
930 ? size - wt_len
931 : (FLASH_SECTOR_SIZE - CurStartPsr));
932 wt_len += wt_len + ((FLASH_SECTOR_SIZE - CurStartPsr) > size - wt_len
933 ? size - wt_len
934 : (FLASH_SECTOR_SIZE - CurStartPsr));
935 cur_addr += wt_len;
936 } else {
937 ram_memcpy_byte(temp_buff, buff + wt_len,
938 size - wt_len > FLASH_SECTOR_SIZE ? FLASH_SECTOR_SIZE
939 : size - wt_len);
940 cur_addr += (size - wt_len > FLASH_SECTOR_SIZE ? FLASH_SECTOR_SIZE
941 : size - wt_len);
942 wt_len += (size - wt_len > FLASH_SECTOR_SIZE ? FLASH_SECTOR_SIZE
943 : size - wt_len);
944 }
945
946 for(int i=0;i<FLASH_SECTOR_SIZE/FLASH_PAGE_SIZE;i++){
947 xc_fmc_spi_dma_flash_write_page(CurSectorNum * FLASH_SECTOR_SIZE+ i* FLASH_PAGE_SIZE, temp_buff+i*FLASH_PAGE_SIZE,
948 FLASH_PAGE_SIZE);
949 }
950 }
951 }
952
953 return ret;
954}
955
967__RAM_CODE void xc_fmc_spi_dma_flash_rdid(uint8_t *rdid)
968{
970
971 uint8_t cmd[4] = {0};
972 uint8_t id[4] = {0};
973
974 cmd[0] = CMD_RDID;
975 cmd[1] = 0xff;
976 cmd[2] = 0xff;
977 cmd[3] = 0xff;
978
979 xc_fmc_spi_dma_init(0x07, 1, 1);
980
982 DMA_CHANNEL0, sizeof(id), id);
983
985
986 ram_memcpy_byte(rdid, &id[1], 3);
987}
988
1000__RAM_CODE void xc_fmc_spi_dma_flash_ruid(uint8_t *ruid)
1001{
1003
1004 uint8_t cmd[21] = {0};
1005 uint8_t id[21] = {0};
1006
1007 cmd[0] = CMD_RUID;
1008 cmd[1] = 0xff;
1009 cmd[2] = 0xff;
1010 cmd[3] = 0xff;
1011 cmd[4] = 0xff;
1012
1013 xc_fmc_spi_dma_init(0x07, 1, 1);
1014
1016 DMA_CHANNEL0, sizeof(id), id);
1017
1019
1020 ram_memcpy_byte(ruid, &id[5], 16);
1021}
1022
1031__RAM_CODE uint8_t xc_fmc_spi_dma_flash_read_status(void)
1032{
1034
1035 uint8_t cmd[2] = {0};
1036 uint8_t sta[2] = {0xff, 0xff};
1037
1038 cmd[0] = CMD_READ_STATUS;
1039 cmd[1] = 0xff;
1040
1041 xc_fmc_spi_dma_init(0x07, 1, 1);
1042
1044 DMA_CHANNEL0, sizeof(sta), sta);
1045
1047
1048 return sta[1];
1049}
1050
1063 uint8_t *w_data, uint16_t w_size,
1064 uint8_t *r_data, uint16_t r_size)
1065{
1066 xc_fmc_spi_dma_init(0x07, 1, 1);
1067
1069 DMA_CHANNEL1, w_size, w_data,
1070 DMA_CHANNEL0, r_size, r_data);
1071
1073}
1074
1087 uint8_t *w_data, uint16_t w_size,
1088 uint8_t *r_data, uint16_t r_size)
1089{
1090 xc_fmc_spi_dma_init(0x07, 1, 1);
1091
1093 DMA_CHANNEL1, w_size, w_data,
1094 DMA_CHANNEL0, r_size, r_data);
1095
1097}
1098
eDMA_CH_Priority cfg_ch_prior
Definition xc_drv_dma.h:230
eDMA_Burst_Trans_Len ctl_dst_msize
Definition xc_drv_dma.h:218
eDMA_Fifo_Mode cfg_fifo_mode
Definition xc_drv_dma.h:227
eDMA_Trans_Width ctl_src_tr_width
Definition xc_drv_dma.h:221
eDMA_SW_HW_HS_Select cfg_hs_sel_src
Definition xc_drv_dma.h:228
eDMA_SW_HW_HS_Select cfg_hs_sel_dst
Definition xc_drv_dma.h:229
eDMA_Burst_Trans_Len ctl_src_msize
Definition xc_drv_dma.h:217
eDMA_Trans_Flow ctl_tt_fc
Definition xc_drv_dma.h:226
eDMA_Trans_Width ctl_dst_tr_width
Definition xc_drv_dma.h:222
eDMA_HS_Interface cfg_dst_per
Definition xc_drv_dma.h:223
eDMA_Addr_Increment ctl_dinc
Definition xc_drv_dma.h:220
eDMA_HS_Interface cfg_src_per
Definition xc_drv_dma.h:224
eDMA_Addr_Increment ctl_sinc
Definition xc_drv_dma.h:219
static volatile uint32_t mid
__RAM_CODE uint8_t xc_dma_disable(void)
xc_dma_disable
Definition xc_drv_dma.c:235
__RAM_CODE uint8_t xc_dma_set_channel_config(eDMA_Ch_Num ch_num, DMA_Chx_Cfg_t *ch)
xc_dma_set_channel_config
Definition xc_drv_dma.c:630
__RAM_CODE bool xc_dma_set_listener(eDMA_Ch_Num ch_num, DMA_Callback userFunction)
xc_dma_set_listener
Definition xc_drv_dma.c:673
__RAM_CODE uint8_t xc_dma_init(void)
xc_dma_init
Definition xc_drv_dma.c:588
__RAM_CODE void xc_dma_enable(void)
xc_dma_enable
Definition xc_drv_dma.c:222
__RAM_CODE uint8_t xc_dma_start_transfer(eDMA_Ch_Num ch_num, DMA_Callback cb_func)
xc_dma_start_transfer
Definition xc_drv_dma.c:705
DMA_Instance_t DMA_Instance
Definition xc_drv_dma.c:33
__RAM_CODE bool dma_irq_handler(DMA_Instance_t *inst)
dma_irq_handler
Definition xc_drv_dma.c:759
@ DMA_FIFO_MODE_SINGLE
Definition xc_drv_dma.h:197
@ DMA_PRIORITY_0
Definition xc_drv_dma.h:203
@ DMA_PRIORITY_1
Definition xc_drv_dma.h:204
@ DMA_PRF2MEM_DMA
Definition xc_drv_dma.h:187
@ DMA_MEM2PRF_DMA
Definition xc_drv_dma.h:186
@ DMA_MSIZE_1
Definition xc_drv_dma.h:130
@ DMA_IRQ_ERR
Definition xc_drv_dma.h:124
@ SSI0_DMA_TX_HS_IF2
Definition xc_drv_dma.h:167
@ SSI0_DMA_RX_HS_IF10
Definition xc_drv_dma.h:175
enum dmac_channel_number eDMA_Ch_Num
@ DMA_HS_HARDWARE
Definition xc_drv_dma.h:159
@ DMA_ADDR_INCREMENT
Definition xc_drv_dma.h:142
@ DMA_ADDR_NOCHANGE
Definition xc_drv_dma.h:144
@ DMA_CHANNEL1
Definition xc_drv_dma.h:72
@ DMA_CHANNEL0
Definition xc_drv_dma.h:71
@ DMA_TRANS_WIDTH_8
Definition xc_drv_dma.h:149
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
@ GPIO_Mux1
Definition xc_drv_gpio.h:97
@ GPIO_Mux2
Definition xc_drv_gpio.h:98
void delay_us(uint32_t nus)