01_SDK/modules/hal/panchip/panplat/pan1070/bsp/peripheral/src/pan_hal_i2c.c
@@ -291,8 +291,7 @@
    i2c->TxXferSize = Size;
    i2c->TxXferCount = 0;
    I2C_SetTxTirggerLevel(i2c->I2Cx, I2C_TX_TL_0);
    I2C_DMATransferDataLevel(i2c->I2Cx, I2C_TX_TL_0);
    I2C_DMATransferDataLevel(i2c->I2Cx, I2C_TX_TL_1); // I2C Tx-FIFO DMA-Trigger-Level = 1
    I2C_DMACmd(i2c->I2Cx, ENABLE);
    // Initialize the DMA controller
@@ -305,17 +304,15 @@
    dma_mem2i2c_config.PeripheralDst = i2c->DMA_DST;
    DMAC_Channel_Array[DmaChNum].ConfigTmp = dma_mem2i2c_config;
    DMAC_Channel_Array[DmaChNum].CallbackI2c = Callback;
    DMAC_Channel_Array[DmaChNum].XferFlag = false;
    DMAC_Channel_Array[DmaChNum].pBuffPtr = (uint32_t *)i2c->pTxBuffPtr;
    DMAC_Channel_Array[DmaChNum].XferSize = i2c->TxXferSize;
    DMAC_Channel_Array[DmaChNum].PeriMode = DMAC_Peri_I2C;
    /*enable dma transfer interrupt*/
    DMAC_ClrIntFlagMsk(DMA, DmaChNum, DMAC_FLAG_INDEX_TFR);
    DMAC_SetChannelConfig(DMA, DmaChNum, &DMAC_Channel_Array[DmaChNum].ConfigTmp);
    /*start dma tx channel*/
    DMAC_StartChannel(DMA, DmaChNum, i2c->pTxBuffPtr, (void *)&(i2c->I2Cx->DATACMD), i2c->TxXferSize);
    DMAC_StartChannel(DMA, DmaChNum, i2c->pTxBuffPtr, (void *)&(i2c->I2Cx->DATACMD), i2c->TxXferSize/4);
}
static void HAL_I2C_Master_SendData_DMA_U16_STC(I2C_HandleTypeDef *i2c, uint16_t DevAddress, uint16_t *Buf, uint32_t Size, I2C_CallbackFunc Callback)
@@ -324,11 +321,8 @@
    i2c->TxXferSize = Size;
    i2c->TxXferCount = 0;
    I2C_SetTxTirggerLevel(i2c->I2Cx, I2C_TX_TL_0);
    I2C_DMATransferDataLevel(i2c->I2Cx, I2C_TX_TL_0);
    I2C_SetRxTirggerLevel(i2c->I2Cx, I2C_RX_TL_3);
    I2C_DMAReceiveDataLevel(i2c->I2Cx, I2C_RX_TL_3);
    I2C_DMATransferDataLevel(i2c->I2Cx, I2C_TX_TL_1); // I2C Tx-FIFO DMA-Trigger-Level = 1
    I2C_DMAReceiveDataLevel(i2c->I2Cx, I2C_RX_TL_3);  // I2C Rx-FIFO DMA-Trigger-Level = 4
    // Initialize the DMA controller
    DMAC_Init(DMA);
@@ -337,10 +331,9 @@
    uint32_t DmaChNum = 0xFF;
    DmaChNum = DMAC_AcquireChannel(DMA);
    dma_mem2i2c_config.PeripheralDst = i2c->DMA_DST;
    dma_mem2i2c_u16_config.PeripheralDst = i2c->DMA_DST;
    DMAC_Channel_Array[DmaChNum].ConfigTmp = dma_mem2i2c_u16_config;
    DMAC_Channel_Array[DmaChNum].CallbackI2c = Callback;
    DMAC_Channel_Array[DmaChNum].XferFlag = false;
    DMAC_Channel_Array[DmaChNum].pBuffPtr = (uint32_t *)Buf;
    DMAC_Channel_Array[DmaChNum].XferSize = i2c->TxXferSize;
    DMAC_Channel_Array[DmaChNum].PeriMode = DMAC_Peri_I2C;
@@ -349,21 +342,24 @@
    
    DMAC_SetChannelConfig(DMA, DmaChNum, &DMAC_Channel_Array[DmaChNum].ConfigTmp);
    /*start dma tx channel*/
    DMAC_StartChannel(DMA, DmaChNum, Buf, (void *)&(i2c->I2Cx->DATACMD), i2c->TxXferSize);
}
static uint16_t cmd_buf[256]={0};
void HAL_I2C_Master_ReceiveData_DMA(I2C_HandleTypeDef *i2c, uint16_t DevAddress, uint8_t *Buf, uint32_t Size, I2C_CallbackFunc Callback)
{
    uint16_t i;
   for(i=0;i<Size-1;i++){
    uint16_t i = 0;
    // Check to avoid buf overflow
    if (Size > 256) {
        return;
    }
    for(; i < Size - 1; i++) {
        cmd_buf[i] = (I2C_CMD_RD << 8);
    }
    cmd_buf[i] = ((I2C_CMD_RD|I2C_CMD_STOP) << 8);
    HAL_I2C_Master_SendData_DMA_U16_STC(i2c,DevAddress, cmd_buf, Size, NULL);
@@ -380,12 +376,11 @@
    dma_i2c2mem_config.PeripheralSrc = i2c->DMA_SRC;
    DMAC_Channel_Array[DmaChNum].ConfigTmp = dma_i2c2mem_config;
    DMAC_Channel_Array[DmaChNum].CallbackI2c = Callback;
    DMAC_Channel_Array[DmaChNum].XferFlag = false;
    DMAC_Channel_Array[DmaChNum].pBuffPtr = (uint32_t*)i2c->pRxBuffPtr;
    DMAC_Channel_Array[DmaChNum].XferSize = i2c->RxXferSize;
    DMAC_Channel_Array[DmaChNum].PeriMode = DMAC_Peri_I2C;
    DMAC_SetChannelConfig(DMA, DmaChNum, &DMAC_Channel_Array[DmaChNum].ConfigTmp);
    /*start dma tx channel*/
    /*start dma rx channel*/
    DMAC_StartChannel(DMA, DmaChNum, (void *)&(i2c->I2Cx->DATACMD), i2c->pRxBuffPtr, i2c->RxXferSize);
    I2C_DMACmd(i2c->I2Cx, ENABLE);
}
@@ -480,10 +475,7 @@
    i2c->TxXferSize = Size;
    i2c->TxXferCount = 0;
    I2C_SetTxTirggerLevel(i2c->I2Cx, I2C_TX_TL_3);
    I2C_SetRxTirggerLevel(i2c->I2Cx, I2C_RX_TL_3);
    I2C_DMATransferDataLevel(i2c->I2Cx, I2C_TX_TL_3);
    I2C_DMAReceiveDataLevel(i2c->I2Cx, I2C_RX_TL_3);
    I2C_DMATransferDataLevel(i2c->I2Cx, I2C_TX_TL_1); // I2C Tx-FIFO DMA-Trigger-Level = 1
    // Initialize the DMA controller
    DMAC_Init(DMA);
@@ -498,13 +490,12 @@
    dma_mem2i2c_config.PeripheralDst = i2c->DMA_DST;
    DMAC_Channel_Array[DmaChNum].ConfigTmp = dma_mem2i2c_config;
    DMAC_Channel_Array[DmaChNum].CallbackI2c = Callback;
    DMAC_Channel_Array[DmaChNum].XferFlag = false;
    DMAC_Channel_Array[DmaChNum].pBuffPtr = (uint32_t *)i2c->pTxBuffPtr;
    DMAC_Channel_Array[DmaChNum].XferSize = i2c->TxXferSize;
    DMAC_Channel_Array[DmaChNum].PeriMode = DMAC_Peri_I2C;
    DMAC_SetChannelConfig(DMA, DmaChNum, &DMAC_Channel_Array[DmaChNum].ConfigTmp);
    /*start dma tx channel*/
    DMAC_StartChannel(DMA, DmaChNum, i2c->pTxBuffPtr, (void *)&(i2c->I2Cx->DATACMD), i2c->TxXferSize/4);
    DMAC_StartChannel(DMA, DmaChNum, i2c->pTxBuffPtr, (void *)&(i2c->I2Cx->DATACMD), i2c->TxXferSize);
    while(!I2C_GetRawITStatus(i2c->I2Cx, I2C_IT_RD_REQ)){}
    I2C_DMACmd(i2c->I2Cx, ENABLE);
    I2C_ClearITPendingBit(i2c->I2Cx, I2C_IT_RD_REQ);
@@ -516,8 +507,7 @@
    i2c->RxXferSize = Size;
    i2c->RxXferCount = 0;
    I2C_SetRxTirggerLevel(i2c->I2Cx, I2C_RX_TL_3);
    I2C_DMAReceiveDataLevel(i2c->I2Cx, I2C_RX_TL_3);
    I2C_DMAReceiveDataLevel(i2c->I2Cx, I2C_RX_TL_3); // I2C Rx-FIFO DMA-Trigger-Level = 4
    I2C_DMACmd(i2c->I2Cx, ENABLE);
    // Initialize the DMA controller
@@ -531,17 +521,15 @@
    dma_i2c2mem_config.PeripheralSrc = i2c->DMA_SRC;
    DMAC_Channel_Array[DmaChNum].ConfigTmp = dma_i2c2mem_config;
    DMAC_Channel_Array[DmaChNum].CallbackI2c = Callback;
    DMAC_Channel_Array[DmaChNum].XferFlag = false;
    DMAC_Channel_Array[DmaChNum].pBuffPtr = (uint32_t *)i2c->pRxBuffPtr;
    DMAC_Channel_Array[DmaChNum].XferSize = i2c->RxXferSize;
    DMAC_Channel_Array[DmaChNum].PeriMode = DMAC_Peri_I2C;
    DMAC_SetChannelConfig(DMA, DmaChNum, &DMAC_Channel_Array[DmaChNum].ConfigTmp);
    /*start dma tx channel*/
    DMAC_StartChannel(DMA, DmaChNum, (void *)&(i2c->I2Cx->DATACMD), i2c->pRxBuffPtr, i2c->RxXferSize);
}
void I2C0_IRQHandler()
__WEAK void I2C0_IRQHandlerOverlay(void)
{
    if (I2C_GetITStatus(I2C0, I2C_IT_TX_EMPTY))
    {
@@ -629,8 +617,14 @@
                }
            }
        }
    }
}
void I2C0_IRQHandler(void)
{
    PAN_IO_TIMING_TRACK_LEVEL(CONFIG_TRACK_PIN_I2C_IRQ, 1);
    I2C0_IRQHandlerOverlay();
    PAN_IO_TIMING_TRACK_LEVEL(CONFIG_TRACK_PIN_I2C_IRQ, 0);
}