diff --git a/bk7231n_os/beken378/driver/spi/spi_bk7231n.c b/bk7231n_os/beken378/driver/spi/spi_bk7231n.c index 1812b6db..3de11eb6 100755 --- a/bk7231n_os/beken378/driver/spi/spi_bk7231n.c +++ b/bk7231n_os/beken378/driver/spi/spi_bk7231n.c @@ -457,6 +457,26 @@ UINT32 spi_write_txfifo(UINT8 data) return 0; } +UINT32 spi_tx_rx_xfer_enable(UINT32 val) +{ + UINT32 value; + + value = REG_READ(SPI_CONFIG); + if (val == 0) + { + value &= ~SPI_RX_EN; + value &= ~SPI_TX_EN; + } + else if (val == 1) + { + value |= SPI_RX_EN; + value |= SPI_TX_EN; + } + + REG_WRITE(SPI_CONFIG, value); + return 0; +} + static struct spi_callback_des spi_receive_callback = {NULL, NULL}; static struct spi_callback_des spi_txfifo_needwr_callback = {NULL, NULL}; @@ -608,8 +628,10 @@ UINT32 spi_ctrl(UINT32 cmd, void *param) break; case CMD_SPI_SET_3_LINE: spi_3_line_gpio_configuration(); - break; - + break; + case CMD_SPI_TX_RX_EN: + spi_tx_rx_xfer_enable(*(UINT8 *)param); + break; default: ret = SPI_FAILURE; break; diff --git a/bk7231n_os/beken378/driver/spi/spi_master_bk7231n_new.c b/bk7231n_os/beken378/driver/spi/spi_master_bk7231n_new.c index aee187c4..c3b40862 100644 --- a/bk7231n_os/beken378/driver/spi/spi_master_bk7231n_new.c +++ b/bk7231n_os/beken378/driver/spi/spi_master_bk7231n_new.c @@ -134,10 +134,11 @@ static int spi_dma_master_tx_init(void) init_cfg.dst_start_addr = (void *)SPI_DAT; init_cfg.channel = SPI_TX_DMA_CHANNEL; init_cfg.prio = 0; - if(spi_dev->spci_flag) - init_cfg.fin_handler = bk_spi_dma_irq_cb; - else + if(spi_dev->spci_flag) + init_cfg.fin_handler = bk_spi_dma_irq_cb; + else init_cfg.fin_handler = NULL; + init_cfg.src_module = GDMA_X_SRC_DTCM_RD_REQ; init_cfg.dst_module = GDMA_X_DST_GSPI_TX_REQ; sddev_control(GDMA_DEV_NAME, CMD_GDMA_CFG_TYPE4, (void *)&init_cfg); @@ -216,7 +217,7 @@ static void bk_spi_master_config(UINT32 mode, UINT32 rate) param = 1; sddev_control(SPI_DEV_NAME, CMD_SPI_SET_NSSMD, (void *)¶m); - sddev_control(SPI_DEV_NAME, CMD_SPI_SET_3_LINE, NULL); + //sddev_control(SPI_DEV_NAME, CMD_SPI_SET_3_LINE, NULL); param = 0; sddev_control(SPI_DEV_NAME, CMD_SPI_SET_BITWIDTH, (void *)¶m); @@ -233,9 +234,10 @@ static void bk_spi_master_config(UINT32 mode, UINT32 rate) os_printf("[CONFIG]:0x%08x \n", REG_READ(SPI_CONFIG)); } -int bk_spi_master_dma_init(UINT32 mode, UINT32 rate, UINT32 flag) +int bk_spi_master_dma_init(UINT32 mode, UINT32 rate) { OSStatus result = 0; + UINT32 flag = 0; if(spi_dev) bk_spi_master_deinit(); @@ -253,7 +255,6 @@ int bk_spi_master_dma_init(UINT32 mode, UINT32 rate, UINT32 flag) result = 2; goto _exit; } - spi_dev->spci_flag= flag; bk_spi_master_config(mode, rate); spi_dma_master_tx_init(); @@ -433,6 +434,9 @@ int bk_spi_master_dma_recv(struct spi_message *spi_msg) // 全双工收发接口,也可仅发送或仅接收 //存在问题,收发同时时,接收会丢掉一个字节,在2M频率下 + +extern void spi_dma_tx_rx_enable(UINT8 enable); + int bk_spi_master_dma_xfer(struct spi_message *spi_msg) { if(spi_msg == NULL || NULL == spi_dev) { @@ -441,17 +445,21 @@ int bk_spi_master_dma_xfer(struct spi_message *spi_msg) if(spi_msg->recv_buf == NULL) spi_msg->recv_len = 0; if(spi_msg->send_buf == NULL) spi_msg->send_len = 0; //全双工模式,发送与接收长度必须一致 - if(spi_msg->recv_buf != NULL && spi_msg->send_buf != NULL && spi_msg->recv_len != spi_msg->send_len) { - return -1; - } - + //if(spi_msg->recv_buf != NULL && spi_msg->send_buf != NULL && spi_msg->recv_len != spi_msg->send_len) { + // return -1; + //} spi_dev->busy_flag = true; int len = spi_msg->recv_len > 0 ? spi_msg->recv_len : spi_msg->send_len; int offset = 0; + int value = 0; + int i,j,k= 0; GDMA_CFG_ST en_cfg; - + int recv_len = len; + spi_dma_master_tx_init(); + spi_dma_master_rx_init(); while(len > 0) { if(spi_msg->recv_buf) { + //spi_dma_master_rx_init(); spi_msg->recv_len = len > MAX_LEN_ONCE ? MAX_LEN_ONCE : len; spi_dev->last_pack = spi_msg->recv_len > MAX_LEN_ONCE ? false : true; spi_ctrl(CMD_SPI_RXTRANS_EN, (void *)&spi_msg->recv_len); //设置接收触发中断 @@ -463,6 +471,7 @@ int bk_spi_master_dma_xfer(struct spi_message *spi_msg) } if(spi_msg->send_buf) { + //spi_dma_master_tx_init(); spi_msg->send_len = len > MAX_LEN_ONCE ? MAX_LEN_ONCE : len; spi_dev->last_pack = spi_msg->send_len > MAX_LEN_ONCE ? false : true; spi_ctrl(CMD_SPI_TXTRANS_EN, (void *)&spi_msg->send_len); @@ -472,21 +481,148 @@ int bk_spi_master_dma_xfer(struct spi_message *spi_msg) en_cfg.param = spi_msg->send_len; // dma translen gdma_ctrl(CMD_GDMA_SET_TRANS_LENGTH, (void *)&en_cfg); } + + +/* if(spi_msg->send_buf && spi_msg->send_len > 0) spi_dma_tx_enable(1); if(spi_msg->recv_buf && spi_msg->recv_len > 0) spi_dma_rx_enable(1); +*/ + spi_dma_tx_rx_enable(1); rtos_get_semaphore(&spi_dev->finish_sem, BEKEN_NEVER_TIMEOUT); len = spi_msg->recv_len > 0 ? (len - spi_msg->recv_len) : (len - spi_msg->send_len); offset += spi_msg->recv_len > 0 ? spi_msg->recv_len : spi_msg->send_len; } - return 0; + + //os_printf("send len: %d\r\n", spi_msg->send_len); + //os_printf("recv len: %d\r\n", spi_msg->recv_len); + /* + for (i = 0, j = 0; i < recv_len; i = i + 6, j++) + { + os_printf("send %d: 0x%0x 0x%0x 0x%0x 0x%0x 0x%0x 0x%0x\r\n", j, + spi_msg->send_buf[i + 0], + spi_msg->send_buf[i + 1], + spi_msg->send_buf[i + 2], + spi_msg->send_buf[i + 3], + spi_msg->send_buf[i + 4], + spi_msg->send_buf[i + 5]); + os_printf("recv %d: 0x%0x 0x%0x 0x%0x 0x%0x 0x%0x 0x%0x\r\n", j, + spi_msg->recv_buf[i + 0], + spi_msg->recv_buf[i + 1], + spi_msg->recv_buf[i + 2], + spi_msg->recv_buf[i + 3], + spi_msg->recv_buf[i + 4], + spi_msg->recv_buf[i + 5]); + } + */ + + for (i = 0; i < recv_len; i = i + 6) + { + // Correct value is a[2,3,4] , offset to a[0,1,2], bugfix, should verify. + value += spi_msg->recv_buf[i + 2] << 16; + value += spi_msg->recv_buf[i + 3] << 8; + value += spi_msg->recv_buf[i + 4]; + + if (value >= 0x800000) + { + value = value - 0x1000000; + } + os_printf("%d,", value); + } + os_printf("\r\n"); + + return 0; } int bk_spi_get_status(void) { return spi_dev->busy_flag; } +#define SPI_VALUE_BUFFER_LEN 4800 +#define SPI_SEND_BUFFER_LEN (SPI_VALUE_BUFFER_LEN * 6) +#define SPI_RECV_BUFFER_LEN (SPI_VALUE_BUFFER_LEN * 6) +UINT8 *src_data = NULL; +UINT8 *dst_data = NULL; +UINT8 init = 0; + +void bk_tuya_test(void) +{ + UINT32 mode = SPI_MODE_3 | SPI_MSB | SPI_MASTER; + UINT32 rate = 750 * 1000; + UINT32 ret = 0; + UINT8 rst_data[6] = {0xA8, 0x1c, 0x5a, 0x5a, 0x5a, 0x0}; + + struct spi_message spi_msg = {0}; + + if (src_data == NULL) + { + src_data = (UINT8 *)os_malloc(SPI_SEND_BUFFER_LEN); + if (src_data == NULL) + { + os_printf("src_data malloc mem fail\n"); + return; + } + else{ + memset(src_data, 0, sizeof(UINT8) * SPI_SEND_BUFFER_LEN); + } + } + + if (dst_data == NULL) + { + dst_data = (UINT8 *)os_malloc(SPI_RECV_BUFFER_LEN); + if (dst_data == NULL) + { + os_printf("dst_data malloc mem fail\n"); + return; + } + else{ + memset(dst_data, 0, sizeof(UINT8) * SPI_RECV_BUFFER_LEN); + } + } + + for(UINT32 i = 0; i< SPI_SEND_BUFFER_LEN; i=i+6) + { + src_data[i] = 0x58; + src_data[i + 1] = 0x1; + src_data[i + 2] = 0; + src_data[i + 3] = 0; + src_data[i + 4] = 0; + src_data[i + 5] = 0; + } + + if (init == 0) + { + + ret = bk_spi_master_dma_init(mode, rate); + if (ret) + { + os_printf("spi_flash_init fail\n"); + return; + } + + spi_msg.send_buf = rst_data; + spi_msg.send_len = 6; + spi_msg.recv_buf = NULL; + spi_msg.recv_len = 0; + // os_printf("1\n"); + bk_spi_master_dma_send(&spi_msg); + init = 1; + } + + spi_msg.send_buf = src_data; + spi_msg.send_len = SPI_VALUE_BUFFER_LEN * 2; + spi_msg.recv_buf = dst_data; + spi_msg.recv_len = SPI_RECV_BUFFER_LEN; + bk_spi_master_dma_xfer(&spi_msg); + + //for(UINT32 i = 0; i < 2400;) + //{ + // os_printf("%d %d %d %d %d %d\n", dst_data[i], dst_data[i+1], dst_data[i+2], dst_data[i+3], dst_data[i+4], dst_data[i+5]); + // i += 6; + //} +} + #endif //CFG_USE_SPI_DMA #endif // CFG_USE_SPI_MASTER #endif //(CFG_SOC_NAME == SOC_BK7231N) diff --git a/bk7231n_os/beken378/driver/spi/spi_slave_bk7231n.c b/bk7231n_os/beken378/driver/spi/spi_slave_bk7231n.c index 7bd54a38..aea88d55 100755 --- a/bk7231n_os/beken378/driver/spi/spi_slave_bk7231n.c +++ b/bk7231n_os/beken378/driver/spi/spi_slave_bk7231n.c @@ -681,6 +681,28 @@ void spi_dma_rx_enable(UINT8 enable) spi_ctrl(CMD_SPI_RX_EN, (void *)¶m); } +void spi_dma_tx_rx_enable(UINT8 enable) +{ + int param ; + GDMA_CFG_ST en_cfg; + + en_cfg.channel = SPI_RX_DMA_CHANNEL; + + if (enable) + en_cfg.param = 1; + else + en_cfg.param = 0; + + sddev_control(GDMA_DEV_NAME, CMD_GDMA_SET_DMA_ENABLE, &en_cfg); + en_cfg.channel = SPI_TX_DMA_CHANNEL; + sddev_control(GDMA_DEV_NAME, CMD_GDMA_SET_DMA_ENABLE, &en_cfg); + + //enable rx + param = enable; + sddev_control(SPI_DEV_NAME, CMD_SPI_TX_RX_EN, (void *)¶m); +} + + void bk_spi_slave_dma_config(UINT32 mode, UINT32 rate) { UINT32 param;