209 lines
6.2 KiB
C++
209 lines
6.2 KiB
C++
|
/**
|
||
|
******************************************************************************
|
||
|
* File Name : TouchGFXHAL.cpp
|
||
|
******************************************************************************
|
||
|
* @attention
|
||
|
*
|
||
|
* <h2><center>© Copyright (c) 2021 STMicroelectronics.
|
||
|
* All rights reserved.</center></h2>
|
||
|
*
|
||
|
* This software component is licensed by ST under Ultimate Liberty license
|
||
|
* SLA0044, the "License"; You may not use this file except in compliance with
|
||
|
* the License. You may obtain a copy of the License at:
|
||
|
* www.st.com/SLA0044
|
||
|
*
|
||
|
******************************************************************************
|
||
|
*/
|
||
|
#include <TouchGFXHAL.hpp>
|
||
|
|
||
|
/* USER CODE BEGIN TouchGFXHAL.cpp */
|
||
|
|
||
|
#include "stm32f7xx.h"
|
||
|
#include <touchgfx/hal/OSWrappers.hpp>
|
||
|
#include <CortexMMCUInstrumentation.hpp>
|
||
|
#include "touchgfx-config.h"
|
||
|
|
||
|
#if (TOUCHGFX_FREERTOS != 0)
|
||
|
#include "FreeRTOS.h"
|
||
|
#include "task.h"
|
||
|
#endif // TOUCHGFX_FREERTOS
|
||
|
|
||
|
using namespace touchgfx;
|
||
|
CortexMMCUInstrumentation instrumentation;
|
||
|
|
||
|
void TouchGFXHAL::initialize()
|
||
|
{
|
||
|
// Calling parent implementation of initialize().
|
||
|
//
|
||
|
// To overwrite the generated implementation, omit call to parent function
|
||
|
// and implemented needed functionality here.
|
||
|
// Please note, HAL::initialize() must be called to initialize the framework.
|
||
|
|
||
|
TouchGFXGeneratedHAL::initialize();
|
||
|
setFrameBufferStartAddresses((void*)0xC0000000, (void*)0xC003FC00, (void*)0xC007F800); //enable the animation storage to allow slide animations
|
||
|
lockDMAToFrontPorch(false);
|
||
|
instrumentation.init();
|
||
|
setMCUInstrumentation(&instrumentation);
|
||
|
enableMCULoadCalculation(true);
|
||
|
}
|
||
|
|
||
|
#if (TOUCHGFX_BAREMETAL != 0)
|
||
|
void TouchGFXHAL::taskEntry()
|
||
|
{
|
||
|
static bool firstCall = true;
|
||
|
|
||
|
if (firstCall)
|
||
|
{
|
||
|
firstCall = false;
|
||
|
enableLCDControllerInterrupt();
|
||
|
enableInterrupts();
|
||
|
}
|
||
|
|
||
|
OSWrappers::waitForVSync();
|
||
|
|
||
|
//backPorchExited();
|
||
|
// Not necessary to call here when it is done by the
|
||
|
// OSWrappers::waitForVSync() method
|
||
|
}
|
||
|
#endif // TOUCHGFX_BAREMETAL
|
||
|
|
||
|
/**
|
||
|
* Gets the frame buffer address used by the TFT controller.
|
||
|
*
|
||
|
* @return The address of the frame buffer currently being displayed on the TFT.
|
||
|
*/
|
||
|
uint16_t* TouchGFXHAL::getTFTFrameBuffer() const
|
||
|
{
|
||
|
// Calling parent implementation of getTFTFrameBuffer().
|
||
|
//
|
||
|
// To overwrite the generated implementation, omit call to parent function
|
||
|
// and implemented needed functionality here.
|
||
|
|
||
|
return TouchGFXGeneratedHAL::getTFTFrameBuffer();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the frame buffer address used by the TFT controller.
|
||
|
*
|
||
|
* @param [in] address New frame buffer address.
|
||
|
*/
|
||
|
void TouchGFXHAL::setTFTFrameBuffer(uint16_t* address)
|
||
|
{
|
||
|
// Calling parent implementation of setTFTFrameBuffer(uint16_t* address).
|
||
|
//
|
||
|
// To overwrite the generated implementation, omit call to parent function
|
||
|
// and implemented needed functionality here.
|
||
|
|
||
|
TouchGFXGeneratedHAL::setTFTFrameBuffer(address);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* This function is called whenever the framework has performed a partial draw.
|
||
|
*
|
||
|
* @param rect The area of the screen that has been drawn, expressed in absolute coordinates.
|
||
|
*
|
||
|
* @see flushFrameBuffer().
|
||
|
*/
|
||
|
void TouchGFXHAL::flushFrameBuffer(const touchgfx::Rect& rect)
|
||
|
{
|
||
|
// Calling parent implementation of flushFrameBuffer(const touchgfx::Rect& rect).
|
||
|
//
|
||
|
// To overwrite the generated implementation, omit call to parent function
|
||
|
// and implemented needed functionality here.
|
||
|
// Please note, HAL::flushFrameBuffer(const touchgfx::Rect& rect) must
|
||
|
// be called to notify the touchgfx framework that flush has been performed.
|
||
|
|
||
|
TouchGFXGeneratedHAL::flushFrameBuffer(rect);
|
||
|
|
||
|
// If the framebuffer is placed in Write Through cached memory (e.g. SRAM) then we need
|
||
|
// to flush the Dcache to make sure framebuffer is correct in RAM. That's done
|
||
|
// using SCB_CleanInvalidateDCache().
|
||
|
|
||
|
if ((SCB->CCR & SCB_CCR_DC_Msk) != 0) // Check data cache is enabled
|
||
|
{
|
||
|
SCB_CleanInvalidateDCache();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool TouchGFXHAL::blockCopy(void* RESTRICT dest, const void* RESTRICT src, uint32_t numBytes)
|
||
|
{
|
||
|
return TouchGFXGeneratedHAL::blockCopy(dest, src, numBytes);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Configures the interrupts relevant for TouchGFX. This primarily entails setting
|
||
|
* the interrupt priorities for the DMA and LCD interrupts.
|
||
|
*/
|
||
|
void TouchGFXHAL::configureInterrupts()
|
||
|
{
|
||
|
// Calling parent implementation of configureInterrupts().
|
||
|
//
|
||
|
// To overwrite the generated implementation, omit call to parent function
|
||
|
// and implemented needed functionality here.
|
||
|
|
||
|
TouchGFXGeneratedHAL::configureInterrupts();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Used for enabling interrupts set in configureInterrupts()
|
||
|
*/
|
||
|
void TouchGFXHAL::enableInterrupts()
|
||
|
{
|
||
|
// Calling parent implementation of enableInterrupts().
|
||
|
//
|
||
|
// To overwrite the generated implementation, omit call to parent function
|
||
|
// and implemented needed functionality here.
|
||
|
|
||
|
TouchGFXGeneratedHAL::enableInterrupts();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Used for disabling interrupts set in configureInterrupts()
|
||
|
*/
|
||
|
void TouchGFXHAL::disableInterrupts()
|
||
|
{
|
||
|
// Calling parent implementation of disableInterrupts().
|
||
|
//
|
||
|
// To overwrite the generated implementation, omit call to parent function
|
||
|
// and implemented needed functionality here.
|
||
|
|
||
|
TouchGFXGeneratedHAL::disableInterrupts();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Configure the LCD controller to fire interrupts at VSYNC. Called automatically
|
||
|
* once TouchGFX initialization has completed.
|
||
|
*/
|
||
|
void TouchGFXHAL::enableLCDControllerInterrupt()
|
||
|
{
|
||
|
// Calling parent implementation of enableLCDControllerInterrupt().
|
||
|
//
|
||
|
// To overwrite the generated implementation, omit call to parent function
|
||
|
// and implemented needed functionality here.
|
||
|
|
||
|
TouchGFXGeneratedHAL::enableLCDControllerInterrupt();
|
||
|
}
|
||
|
|
||
|
extern "C"
|
||
|
{
|
||
|
#if (TOUCHGFX_FREERTOS != 0)
|
||
|
portBASE_TYPE IdleTaskHook(void* p)
|
||
|
{
|
||
|
if ((int)p) //idle task sched out
|
||
|
{
|
||
|
touchgfx::HAL::getInstance()->setMCUActive(true);
|
||
|
}
|
||
|
else //idle task sched in
|
||
|
{
|
||
|
touchgfx::HAL::getInstance()->setMCUActive(false);
|
||
|
}
|
||
|
return pdTRUE;
|
||
|
}
|
||
|
#endif // TOUCHGFX_FREERTOS
|
||
|
|
||
|
}
|
||
|
|
||
|
/* USER CODE END TouchGFXHAL.cpp */
|
||
|
|
||
|
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|