43uint8_t
mid[FLASH_PAGE_SIZE+4];
152 DEBUG(
"\nERROR: Recieved an err interrupt\n");
170 DEBUG(
"\nERROR: Recieved an err interrupt\n");
185 uint32_t spi_prf_addr = XC_REG_SPI_BASE_ADDR;
187 if(spi_idx == SPI2_IDX) {
188 spi_prf_addr += (SPI2_BASE_OFFSET + SSIx_DATA_OFFSET);
189 }
else if(spi_idx < SPI2_IDX) {
190 if(spi_idx == SPI1_IDX)
191 spi_prf_addr += (SPI1_BASE_OFFSET + SSIx_DATA_OFFSET);
193 spi_prf_addr += SSIx_DATA_OFFSET;
212 uint8_t errorCode = DMA_OK;
213 uint8_t data_size = spi_ctrl0__ssi_dfs__getf(spi_idx);
216 if(errorCode != DMA_OK)
221 ch_cfg.
sar = (uint32_t)tx_buff;
222 ch_cfg.
dar = (uint32_t)spi_prf_addr;
230 if(data_size == 0x07) {
233 }
else if(data_size == 0x0f) {
249 else if(spi_idx == 1)
251 else if(spi_idx == 2)
260 DEBUG(
"\nERROR: Failed to initialise configuration\n");
279 uint8_t errorCode = DMA_OK;
280 uint8_t data_size = spi_ctrl0__ssi_dfs__getf(spi_idx);
283 if(errorCode != DMA_OK)
288 ch_cfg.
sar = (uint32_t)spi_prf_addr;
289 ch_cfg.
dar = (uint32_t)rx_buff;
297 if(data_size == 0x07) {
300 }
else if(data_size == 0x0f) {
316 else if(spi_idx == 1)
318 else if(spi_idx == 2)
327 DEBUG(
"\nERROR: Failed to initialise configuration\n");
344 eDMA_Ch_Num w_chnum, uint16_t w_size, uint8_t *w_buff,
345 eDMA_Ch_Num r_chnum, uint16_t r_size, uint8_t *r_buff)
353 DEBUG(
"\nERROR: Failed SPI_DMAC_Recv_Cfg\n");
357 DEBUG(
"\nERROR: Failed SPI_DMAC_Send_Cfg\n");
364 DEBUG(
"\nERROR: Failed DMAC_StartTransfer read\n");
369 DEBUG(
"\nERROR: Failed DMAC_StartTransfer write\n");
391 eDMA_Ch_Num w_chnum, uint16_t w_size, uint8_t *w_buff,
392 eDMA_Ch_Num r_chnum, uint16_t r_size, uint8_t *r_buff)
400 DEBUG(
"\nERROR: Failed SPI_DMAC_Recv_Cfg\n");
404 DEBUG(
"\nERROR: Failed SPI_DMAC_Send_Cfg\n");
411 DEBUG(
"\nERROR: Failed DMAC_StartTransfer read\n");
416 DEBUG(
"\nERROR: Failed DMAC_StartTransfer write\n");
445 DEBUG(
"\nERROR: Failed SPI_DMAC_Send_Cfg\n");
452 DEBUG(
"\nERROR: Failed DMAC_StartTransfer write\n");
481 DEBUG(
"\nERROR: Failed SPI_DMAC_Send_Cfg\n");
488 DEBUG(
"\nERROR: Failed DMAC_StartTransfer read\n");
511 spi_en__ssi_sen__setf(spi_idx, DISABLE);
512 spi_dmas_pack(spi_idx, ENABLE, ENABLE);
513 spi_ctrl0__ssi_dfs__setf(spi_idx, dfs);
514 spi_dmatdl_set(spi_idx, tdl);
515 spi_dmardl_set(spi_idx, rdl);
516 spi_en__ssi_sen__setf(spi_idx, ENABLE);
529 spi_dmas_pack(spi_idx, DISABLE, DISABLE);
530 spi_en__ssi_sen__setf(spi_idx, DISABLE);;
585 uint8_t *w_data, uint16_t w_size,
586 uint8_t *r_data, uint16_t r_size)
609 uint8_t *w_data, uint16_t w_size,
610 uint8_t *r_data, uint16_t r_size)
659 cmd[0] = CMD_RELEASE_PWRDWN;
696 cmd[0] = CMD_WRITE_ENABLE;
719 cmd[0] = CMD_WRITE_DISABLE;
738 uint8_t cmd[4] = { 0 };
744 cmd[0] = CMD_SECTOR_ERASE;
745 cmd[1] = Dst_Addr>>16;
746 cmd[2] = Dst_Addr>>8;
766 uint8_t cmd[4] = { 0 };
769 if(
mid != GD_FlASH_RDID){
774 cmd[0] = CMD_PAGE_ERASE;
775 cmd[1] = Dst_Addr>>16;
776 cmd[2] = Dst_Addr>>8;
801 uint8_t cmd[2] = { 0 };
802 uint8_t sta[2] = { 0xff, 0xff };
806 cmd[0] = CMD_READ_STATUS;
834 uint8_t cmd[FLASH_PAGE_SIZE+4] = { 0 };
836 if(size > FLASH_PAGE_SIZE)
843 cmd[0] = CMD_PAGE_PROGRAM;
844 cmd[1] = WriteAddr >> 16;
845 cmd[2] = WriteAddr >> 8;
849 memcpy(&cmd[4], data, FLASH_PAGE_SIZE);
871 uint16_t buad_idx = spi_baud__ssi_sckdv__getf(spi_idx);
873 uint8_t cmd[FLASH_PAGE_SIZE+4] = { 0 };
875 if(size > FLASH_PAGE_SIZE)
880 memset(
mid, 0xff,
sizeof(
mid));
882 if(buad_idx != SSI_BAUD_DIV_2) {
883 cmd[0] = CMD_READ_DATA;
884 cmd[1] = ReadAddr >> 16;
885 cmd[2] = ReadAddr >> 8;
890 cmd[0] = ReadAddr >> 16;
891 cmd[1] = CMD_READ_DATA;
893 cmd[3] = ReadAddr >> 8;
906 if(buad_idx != SSI_BAUD_DIV_2) {
907 memcpy(data,
mid+4, FLASH_PAGE_SIZE);
909 for(uint16_t n=0; n<(FLASH_PAGE_SIZE/2); n++)
911 data[2*n] =
mid[2*n+5];
912 data[2*n+1] =
mid[2*n+4];
930 eXC_RESULT ret = XR_OK;
931 uint16_t ReqPageCnt = 0;
932 uint16_t CurPageNum = 0;
933 uint16_t CurStartPsr = 0;
934 uint16_t NextPageNum = 0;
935 uint16_t NextStopPsr = 0;
936 uint8_t temp_buff[FLASH_PAGE_SIZE] = { 0 };
938 if(len <= FLASH_PAGE_SIZE)
940 CurPageNum = CUR_PAGE_NUM(readAddr);
941 CurStartPsr = CUR_START_PSR(readAddr);
942 if((len + CurStartPsr) > FLASH_PAGE_SIZE)
950 memcpy(buff, &temp_buff[CurStartPsr], len);
952 else if(ReqPageCnt == 2)
954 NextPageNum = CurPageNum + 1;
955 NextStopPsr = len + CurStartPsr - FLASH_PAGE_SIZE;
958 memcpy(buff, &temp_buff[CurStartPsr], len-NextStopPsr);
960 uint16_t HaveCopyNum = len - NextStopPsr;
962 memcpy(buff+HaveCopyNum, temp_buff, NextStopPsr);
967 CurPageNum = CUR_PAGE_NUM(readAddr);
968 CurStartPsr = CUR_START_PSR(readAddr);
969 NextPageNum = CurPageNum + 1;
971 uint16_t buff_idx = 0;
972 uint16_t pre_len = NextPageNum*FLASH_PAGE_SIZE - readAddr;
973 uint32_t pre_addr = CurPageNum*FLASH_PAGE_SIZE;
975 memcpy(buff, &temp_buff[CurStartPsr], pre_len);
978 pre_addr = NextPageNum*FLASH_PAGE_SIZE;
979 while(buff_idx < len)
981 if((len - buff_idx) >= FLASH_PAGE_SIZE)
984 memcpy(&buff[buff_idx], temp_buff, FLASH_PAGE_SIZE);
985 buff_idx += FLASH_PAGE_SIZE;
986 pre_addr += FLASH_PAGE_SIZE;
991 memcpy(&buff[buff_idx], temp_buff, len - buff_idx);
992 buff_idx += (len - buff_idx);
993 pre_addr += (len - buff_idx);
1015 uint32_t cur_addr = writeAddr;
1016 uint32_t end_addr = writeAddr + size;
1017 uint16_t wt_len = 0;
1019 uint16_t CurPageNum = 0;
1020 uint16_t CurSectorNum = 0;
1022 uint32_t CurStartPsr = 0;
1027 if(
mid != GD_FlASH_RDID){
1028 uint8_t temp_buff[FLASH_PAGE_SIZE];
1029 while (cur_addr != end_addr) {
1031 CurPageNum = CUR_PAGE_NUM(cur_addr);
1032 CurStartPsr = CUR_START_PSR(cur_addr);
1039 memcpy(&temp_buff[CurStartPsr], buff + wt_len,
1040 (FLASH_PAGE_SIZE - CurStartPsr) > size - wt_len
1042 : (FLASH_PAGE_SIZE - CurStartPsr));
1043 wt_len += wt_len + ((FLASH_PAGE_SIZE - CurStartPsr) > size - wt_len
1045 : (FLASH_PAGE_SIZE - CurStartPsr));
1048 memcpy(temp_buff, buff + wt_len,
1049 size - wt_len > FLASH_PAGE_SIZE ? FLASH_PAGE_SIZE
1051 cur_addr += (size - wt_len > FLASH_PAGE_SIZE ? FLASH_PAGE_SIZE
1053 wt_len += (size - wt_len > FLASH_PAGE_SIZE ? FLASH_PAGE_SIZE
1060 }
else if(
mid == GD_FlASH_RDID){
1061 uint8_t temp_buff[FLASH_SECTOR_SIZE];
1062 while (cur_addr != end_addr) {
1064 CurSectorNum = CUR_SECTOR_NUM(cur_addr);
1065 CurStartPsr = CUR_START_PSR(cur_addr);
1066 for(
int i=0;i<FLASH_SECTOR_SIZE/FLASH_PAGE_SIZE;i++){
1067 xc_spi_dma_flash_read_page(reg_idx, CurSectorNum * FLASH_SECTOR_SIZE + i* FLASH_PAGE_SIZE, temp_buff+i*FLASH_PAGE_SIZE, FLASH_PAGE_SIZE);
1073 memcpy(&temp_buff[CurStartPsr], buff + wt_len,
1074 (FLASH_SECTOR_SIZE - CurStartPsr) > size - wt_len
1076 : (FLASH_SECTOR_SIZE - CurStartPsr));
1077 wt_len += wt_len + ((FLASH_SECTOR_SIZE - CurStartPsr) > size - wt_len
1079 : (FLASH_SECTOR_SIZE - CurStartPsr));
1082 memcpy(temp_buff, buff + wt_len,
1083 size - wt_len > FLASH_SECTOR_SIZE ? FLASH_SECTOR_SIZE
1085 cur_addr += (size - wt_len > FLASH_SECTOR_SIZE ? FLASH_SECTOR_SIZE
1087 wt_len += (size - wt_len > FLASH_SECTOR_SIZE ? FLASH_SECTOR_SIZE
1091 for(
int i=0;i<FLASH_SECTOR_SIZE/FLASH_PAGE_SIZE;i++){
1092 xc_spi_dma_flash_write_page(reg_idx, CurSectorNum * FLASH_SECTOR_SIZE + i* FLASH_PAGE_SIZE, temp_buff+i*FLASH_PAGE_SIZE, FLASH_PAGE_SIZE);
1113 uint8_t cmd[4] = { 0 };
1114 uint8_t
id[4] = { 0 };
1131 memcpy(rdid, &
id[1], 3);
1147 uint16_t buad_idx = spi_baud__ssi_sckdv__getf(spi_idx);
1149 uint8_t cmd[22] = { 0 };
1150 uint8_t
id[22] = { 0 };
1154 if(buad_idx != SSI_BAUD_DIV_2) {
1181 if(buad_idx != SSI_BAUD_DIV_2) {
1182 memcpy(ruid, &
id[5], 16);
1186 for(uint8_t i=0; i<7; i++)
1188 ruid[2*i+1] =
id[2*i+7];
1189 ruid[2*i+2] =
id[2*i+6];
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
__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
enum dmac_channel_number eDMA_Ch_Num
void xc_spi_dma_flash_erase_page(uint8_t spi_idx, uint32_t Dst_Addr)
_idx
eXC_RESULT xc_spi_dma_flash_read(uint8_t spi_idx, uint32_t readAddr, uint8_t *buff, uint16_t len)
eXC_RESULT xc_spi_dma_flash_write(uint8_t reg_idx, uint32_t writeAddr, uint8_t *buff, uint16_t size)
uint8_t mid[FLASH_PAGE_SIZE+4]
void spi_dma_read_err(uint8_t eCode)
void xc_spi_dma_flash_power_down(uint8_t spi_idx)
void spi_dma_write_callback(uint8_t eCode)
void xc_spi_dma_read_and_write_data(uint8_t spi_idx, uint8_t *w_data, uint16_t w_size, uint8_t *r_data, uint16_t r_size)
void xc_spi_dma_write_data(uint8_t spi_idx, uint8_t *data, uint16_t size)
void spi_dma_read_callback(uint8_t eCode)
void xc_spi_dma_deinit(uint8_t spi_idx)
void xc_spi_dma_write_and_read_data(uint8_t spi_idx, uint8_t *w_data, uint16_t w_size, uint8_t *r_data, uint16_t r_size)
uint8_t xc_spi_dma_flash_read_status(uint8_t spi_idx)
void xc_dma_prf2mem_finish(void)
void xc_spi_dma_flash_rdid(uint8_t spi_idx, uint8_t *rdid)
uint8_t xc_spi_dma_read_config(uint8_t spi_idx, eDMA_Ch_Num ch_num, uint16_t blockSize, uint8_t *rx_buff)
uint32_t xc_spi_prf_data_addr(uint8_t spi_idx, uint8_t *eCode)
static volatile bool wr_tfr_flag
void xc_spi_dma_write(uint8_t spi_idx, eDMA_Ch_Num w_chnum, uint16_t w_size, uint8_t *w_buff)
void xc_spi_dma_flash_ruid(uint8_t spi_idx, uint8_t *ruid)
void xc_spi_dma_flash_read_page(uint8_t spi_idx, uint32_t ReadAddr, uint8_t *data, uint16_t size)
uint8_t xc_spi_dma_write_config(uint8_t spi_idx, eDMA_Ch_Num ch_num, uint16_t blockSize, uint8_t *tx_buff)
void xc_spi_dma_flash_write_enable(uint8_t spi_idx)
void xc_spi_dma_read_and_write(uint8_t spi_idx, 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)
void xc_spi_dma_flash_write_page(uint8_t spi_idx, uint32_t WriteAddr, uint8_t *data, uint16_t size)
static volatile bool rd_tfr_flag
void xc_spi_dma_flash_wakeup(uint8_t spi_idx)
void xc_spi_dma_flash_write_disable(uint8_t spi_idx)
void xc_spi_dma_read(uint8_t spi_idx, eDMA_Ch_Num r_chnum, uint16_t r_size, uint8_t *r_buff)
static volatile bool err_flag
void xc_spi_dma_flash_erase_sector(uint8_t spi_idx, uint32_t Dst_Addr)
void spi_dma_write_err(uint8_t eCode)
void xc_dma_mem2prf_finish(void)
void xc_spi_dma_init(uint8_t spi_idx, uint8_t dfs, uint8_t tdl, uint8_t rdl)
void xc_spi_dma_flash_wait_busy(uint8_t spi_idx)
void xc_spi_dma_read_data(uint8_t spi_idx, uint8_t *data, uint16_t size)
void xc_spi_dma_write_and_read(uint8_t spi_idx, 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)
The header of xc_drv_spi_dma.c