void DRV_USART_BufferEventHandlerSet
(
    const DRV_HANDLE hClient,
    const DRV_USART_BUFFER_EVENT_HANDLER eventHandler,
    const uintptr_t context
)
{
    DRV_USART_CLIENT_OBJ * clientObj;
    DRV_USART_OBJ *drvObj;

    /* Validate the driver handle */
    if((DRV_HANDLE_INVALID == hClient) || (0 == hClient))
    {
        /* This means the handle is invalid */
        SYS_DEBUG(0, "Driver Handle is invalid");
        return;
    }

    clientObj = (DRV_USART_CLIENT_OBJ *)hClient;

    if(!clientObj->inUse)
    {
        SYS_DEBUG(0, "Invalid driver handle");
        return;
    }

    drvObj = clientObj->hDriver;

    /* Register the event handler with the client */
    clientObj->eventHandler = eventHandler;
    clientObj->context = context;

    /* Setup the Event handler for the DMA TX channel interrupts */
    if(SYS_DMA_CHANNEL_HANDLE_INVALID != drvObj->dmaChannelHandleWrite )
    {
        if((DRV_IO_INTENT_WRITE == (DRV_IO_INTENT_WRITE & clientObj->ioIntent)))
        {
            SYS_DMA_ChannelTransferEventHandlerSet(drvObj->dmaChannelHandleWrite,
                                                   (SYS_DMA_CHANNEL_TRANSFER_EVENT_HANDLER)_DRV_USART_DMA_EventHandler,
                                                   (uintptr_t)drvObj);
        }
    }
    /* Setup the Event handler for the DMA Rx channel interrupts */
    if(SYS_DMA_CHANNEL_HANDLE_INVALID != drvObj->dmaChannelHandleRead)
    {
        if((DRV_IO_INTENT_READ == (DRV_IO_INTENT_READ & clientObj->ioIntent)))
        {
            SYS_DMA_ChannelTransferEventHandlerSet(drvObj->dmaChannelHandleRead,
                                                   (SYS_DMA_CHANNEL_TRANSFER_EVENT_HANDLER)_DRV_USART_DMA_EventHandler,
                                                   (uintptr_t)drvObj);
        }
    }
}
void DRV_SPI_SetupDMA( struct DRV_SPI_DRIVER_OBJECT * pDrvInstance)
{

        DMA_TRIGGER_SOURCE txSource = 0;
        DMA_TRIGGER_SOURCE rxSource = 0;

        switch(pDrvInstance->spiId)
        {
            case SPI_ID_1:
            {
                txSource = DMA_TRIGGER_SPI_1_TRANSMIT;
                rxSource = DMA_TRIGGER_SPI_1_RECEIVE;
            }
            break;
            case SPI_ID_2:
            {
                txSource = DMA_TRIGGER_SPI_2_TRANSMIT;
                rxSource = DMA_TRIGGER_SPI_2_RECEIVE;
            }
            break;
            case SPI_ID_3:
            {
                txSource = DMA_TRIGGER_SPI_3_TRANSMIT;
                rxSource = DMA_TRIGGER_SPI_3_RECEIVE;
            }
            break;
            case SPI_ID_4:
            {
                txSource = DMA_TRIGGER_SPI_4_TRANSMIT;
                rxSource = DMA_TRIGGER_SPI_4_RECEIVE;
            }
            break;
            case SPI_ID_5:
            {
                txSource = DMA_TRIGGER_SPI_5_TRANSMIT;
                rxSource = DMA_TRIGGER_SPI_5_RECEIVE;
            }
            break;
            case SPI_ID_6:
            {
                txSource = DMA_TRIGGER_SPI_6_TRANSMIT;
                rxSource = DMA_TRIGGER_SPI_6_RECEIVE;
            }
            break;
            default:
               break;
        }
        if (pDrvInstance->txDmaThreshold != 0)
        {
            pDrvInstance->txDmaChannelHandle = SYS_DMA_ChannelAllocate(pDrvInstance->txDmaChannel);
            SYS_DMA_ChannelSetup(pDrvInstance->txDmaChannelHandle, SYS_DMA_CHANNEL_OP_MODE_BASIC, txSource);
            SYS_DMA_ChannelTransferEventHandlerSet(pDrvInstance->txDmaChannelHandle, pDrvInstance->sendDMAHander, (uintptr_t)pDrvInstance);
        }
            
        if (pDrvInstance->rxDmaThreshold != 0)
        {
            pDrvInstance->rxDmaChannelHandle = SYS_DMA_ChannelAllocate(pDrvInstance->rxDmaChannel);
            SYS_DMA_ChannelSetup(pDrvInstance->rxDmaChannelHandle, SYS_DMA_CHANNEL_OP_MODE_BASIC, rxSource);
            SYS_DMA_ChannelTransferEventHandlerSet(pDrvInstance->rxDmaChannelHandle, pDrvInstance->receiveDMAHander, (uintptr_t)pDrvInstance);                
        }
}