Use TouchGFX
This commit is contained in:
52
TouchGFX/target/STM32TouchController.cpp
Normal file
52
TouchGFX/target/STM32TouchController.cpp
Normal file
@ -0,0 +1,52 @@
|
||||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
* File Name : STM32TouchController.cpp
|
||||
******************************************************************************
|
||||
* This file was created by TouchGFX Generator 4.21.1. This file is only
|
||||
* generated once! Delete this file from your project and re-generate code
|
||||
* using STM32CubeMX or change this file manually to update it.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2023 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
/* USER CODE END Header */
|
||||
|
||||
/* USER CODE BEGIN STM32TouchController */
|
||||
|
||||
#include <STM32TouchController.hpp>
|
||||
|
||||
void STM32TouchController::init()
|
||||
{
|
||||
/**
|
||||
* Initialize touch controller and driver
|
||||
*
|
||||
*/
|
||||
}
|
||||
|
||||
bool STM32TouchController::sampleTouch(int32_t& x, int32_t& y)
|
||||
{
|
||||
/**
|
||||
* By default sampleTouch returns false,
|
||||
* return true if a touch has been detected, otherwise false.
|
||||
*
|
||||
* Coordinates are passed to the caller by reference by x and y.
|
||||
*
|
||||
* This function is called by the TouchGFX framework.
|
||||
* By default sampleTouch is called every tick, this can be adjusted by HAL::setTouchSampleRate(int8_t);
|
||||
*
|
||||
*/
|
||||
return false;
|
||||
}
|
||||
|
||||
/* USER CODE END STM32TouchController */
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
72
TouchGFX/target/STM32TouchController.hpp
Normal file
72
TouchGFX/target/STM32TouchController.hpp
Normal file
@ -0,0 +1,72 @@
|
||||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
* File Name : STM32TouchController.hpp
|
||||
******************************************************************************
|
||||
* This file was created by TouchGFX Generator 4.21.1. This file is only
|
||||
* generated once! Delete this file from your project and re-generate code
|
||||
* using STM32CubeMX or change this file manually to update it.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2023 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
/* USER CODE END Header */
|
||||
|
||||
/* USER CODE BEGIN STM32TouchController */
|
||||
|
||||
#ifndef STM32TOUCHCONTROLLER_HPP
|
||||
#define STM32TOUCHCONTROLLER_HPP
|
||||
|
||||
#include <platform/driver/touch/TouchController.hpp>
|
||||
|
||||
/**
|
||||
* @class STM32TouchController
|
||||
*
|
||||
* @brief This class specializes TouchController Interface.
|
||||
*
|
||||
* @sa touchgfx::TouchController
|
||||
*/
|
||||
|
||||
class STM32TouchController : public touchgfx::TouchController
|
||||
{
|
||||
public:
|
||||
|
||||
STM32TouchController() {}
|
||||
|
||||
/**
|
||||
* @fn virtual void STM32TouchController::init() = 0;
|
||||
*
|
||||
* @brief Initializes touch controller.
|
||||
*
|
||||
* Initializes touch controller.
|
||||
*/
|
||||
virtual void init();
|
||||
|
||||
/**
|
||||
* @fn virtual bool STM32TouchController::sampleTouch(int32_t& x, int32_t& y) = 0;
|
||||
*
|
||||
* @brief Checks whether the touch screen is being touched, and if so, what coordinates.
|
||||
*
|
||||
* Checks whether the touch screen is being touched, and if so, what coordinates.
|
||||
*
|
||||
* @param [out] x The x position of the touch
|
||||
* @param [out] y The y position of the touch
|
||||
*
|
||||
* @return True if a touch has been detected, otherwise false.
|
||||
*/
|
||||
virtual bool sampleTouch(int32_t& x, int32_t& y);
|
||||
};
|
||||
|
||||
#endif // STM32TOUCHCONTROLLER_HPP
|
||||
|
||||
/* USER CODE END STM32TouchController */
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
176
TouchGFX/target/TouchGFXGPIO.cpp
Normal file
176
TouchGFX/target/TouchGFXGPIO.cpp
Normal file
@ -0,0 +1,176 @@
|
||||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
* File Name : TouchGFXGPIO.cpp
|
||||
******************************************************************************
|
||||
* This file was created by TouchGFX Generator 4.21.1. This file is only
|
||||
* generated once! Delete this file from your project and re-generate code
|
||||
* using STM32CubeMX or change this file manually to update it.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2023 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
/* USER CODE END Header */
|
||||
|
||||
#include <touchgfx/hal/GPIO.hpp>
|
||||
|
||||
/**
|
||||
* GPIO_ID Enum
|
||||
* The signals represented by this enum are used by TouchGFX framework to signal internal events.
|
||||
*
|
||||
* VSYNC_FREQ, /// Pin is toggled at each VSYNC
|
||||
* RENDER_TIME, /// Pin is high when frame rendering begins, low when finished
|
||||
* FRAME_RATE, /// Pin is toggled when the frame buffers are swapped.
|
||||
* MCU_ACTIVE /// Pin is high when framework is utilizing the MCU.
|
||||
*
|
||||
* Configure GPIO's with the same name as the GPIO_IDs above, as output, in CubeMX to export
|
||||
* the signals for performance measuring. See support.touchgfx.com for further details.
|
||||
*
|
||||
*/
|
||||
|
||||
/* USER CODE BEGIN TouchGFXGPIO.cpp */
|
||||
#include "main.h"
|
||||
|
||||
using namespace touchgfx;
|
||||
|
||||
/*
|
||||
* Perform configuration of IO pins.
|
||||
*/
|
||||
void GPIO::init()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Sets a pin high.
|
||||
*/
|
||||
void GPIO::set(GPIO_ID id)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case GPIO::VSYNC_FREQ:
|
||||
#if defined(VSYNC_FREQ_GPIO_Port) && defined(VSYNC_FREQ_Pin)
|
||||
HAL_GPIO_WritePin(VSYNC_FREQ_GPIO_Port, VSYNC_FREQ_Pin, GPIO_PIN_SET);
|
||||
#endif
|
||||
break;
|
||||
case GPIO::RENDER_TIME:
|
||||
#if defined(RENDER_TIME_GPIO_Port) && defined(RENDER_TIME_Pin)
|
||||
HAL_GPIO_WritePin(RENDER_TIME_GPIO_Port, RENDER_TIME_Pin, GPIO_PIN_SET);
|
||||
#endif
|
||||
break;
|
||||
case GPIO::FRAME_RATE:
|
||||
#if defined(FRAME_RATE_GPIO_Port) && defined(FRAME_RATE_Pin)
|
||||
HAL_GPIO_WritePin(FRAME_RATE_GPIO_Port, FRAME_RATE_Pin, GPIO_PIN_SET);
|
||||
#endif
|
||||
break;
|
||||
case GPIO::MCU_ACTIVE:
|
||||
#if defined(MCU_ACTIVE_GPIO_Port) && defined(MCU_ACTIVE_Pin)
|
||||
HAL_GPIO_WritePin(MCU_ACTIVE_GPIO_Port, MCU_ACTIVE_Pin, GPIO_PIN_SET);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Sets a pin low.
|
||||
*/
|
||||
void GPIO::clear(GPIO_ID id)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case GPIO::VSYNC_FREQ:
|
||||
#if defined(VSYNC_FREQ_GPIO_Port) && defined(VSYNC_FREQ_Pin)
|
||||
HAL_GPIO_WritePin(VSYNC_FREQ_GPIO_Port, VSYNC_FREQ_Pin, GPIO_PIN_RESET);
|
||||
#endif
|
||||
break;
|
||||
case GPIO::RENDER_TIME:
|
||||
#if defined(RENDER_TIME_GPIO_Port) && defined(RENDER_TIME_Pin)
|
||||
HAL_GPIO_WritePin(RENDER_TIME_GPIO_Port, RENDER_TIME_Pin, GPIO_PIN_RESET);
|
||||
#endif
|
||||
break;
|
||||
case GPIO::FRAME_RATE:
|
||||
#if defined(FRAME_RATE_GPIO_Port) && defined(FRAME_RATE_Pin)
|
||||
HAL_GPIO_WritePin(FRAME_RATE_GPIO_Port, FRAME_RATE_Pin, GPIO_PIN_RESET);
|
||||
#endif
|
||||
break;
|
||||
case GPIO::MCU_ACTIVE:
|
||||
#if defined(MCU_ACTIVE_GPIO_Port) && defined(MCU_ACTIVE_Pin)
|
||||
HAL_GPIO_WritePin(MCU_ACTIVE_GPIO_Port, MCU_ACTIVE_Pin, GPIO_PIN_RESET);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Toggles a pin.
|
||||
*/
|
||||
void GPIO::toggle(GPIO_ID id)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case GPIO::VSYNC_FREQ:
|
||||
#if defined(VSYNC_FREQ_GPIO_Port) && defined(VSYNC_FREQ_Pin)
|
||||
HAL_GPIO_TogglePin(VSYNC_FREQ_GPIO_Port, VSYNC_FREQ_Pin);
|
||||
#endif
|
||||
break;
|
||||
case GPIO::RENDER_TIME:
|
||||
#if defined(RENDER_TIME_GPIO_Port) && defined(RENDER_TIME_Pin)
|
||||
HAL_GPIO_TogglePin(RENDER_TIME_GPIO_Port, RENDER_TIME_Pin);
|
||||
#endif
|
||||
break;
|
||||
case GPIO::FRAME_RATE:
|
||||
#if defined(FRAME_RATE_GPIO_Port) && defined(FRAME_RATE_Pin)
|
||||
HAL_GPIO_TogglePin(FRAME_RATE_GPIO_Port, FRAME_RATE_Pin);
|
||||
#endif
|
||||
break;
|
||||
case GPIO::MCU_ACTIVE:
|
||||
#if defined(MCU_ACTIVE_GPIO_Port) && defined(MCU_ACTIVE_Pin)
|
||||
HAL_GPIO_TogglePin(MCU_ACTIVE_GPIO_Port, MCU_ACTIVE_Pin);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Gets the state of a pin.
|
||||
*/
|
||||
bool GPIO::get(GPIO_ID id)
|
||||
{
|
||||
GPIO_PinState bitstatus = GPIO_PIN_RESET;
|
||||
switch (id)
|
||||
{
|
||||
case GPIO::VSYNC_FREQ:
|
||||
#if defined(VSYNC_FREQ_GPIO_Port) && defined(VSYNC_FREQ_Pin)
|
||||
bitstatus = HAL_GPIO_ReadPin(VSYNC_FREQ_GPIO_Port, VSYNC_FREQ_Pin);
|
||||
#endif
|
||||
break;
|
||||
case GPIO::RENDER_TIME:
|
||||
#if defined(RENDER_TIME_GPIO_Port) && defined(RENDER_TIME_Pin)
|
||||
bitstatus = HAL_GPIO_ReadPin(RENDER_TIME_GPIO_Port, RENDER_TIME_Pin);
|
||||
#endif
|
||||
break;
|
||||
case GPIO::FRAME_RATE:
|
||||
#if defined(FRAME_RATE_GPIO_Port) && defined(FRAME_RATE_Pin)
|
||||
bitstatus = HAL_GPIO_ReadPin(FRAME_RATE_GPIO_Port, FRAME_RATE_Pin);
|
||||
#endif
|
||||
break;
|
||||
case GPIO::MCU_ACTIVE:
|
||||
#if defined(MCU_ACTIVE_GPIO_Port) && defined(MCU_ACTIVE_Pin)
|
||||
bitstatus = HAL_GPIO_ReadPin(MCU_ACTIVE_GPIO_Port, MCU_ACTIVE_Pin);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
return (bitstatus == GPIO_PIN_SET);
|
||||
}
|
||||
|
||||
/* USER CODE END TouchGFXGPIO.cpp */
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
163
TouchGFX/target/TouchGFXHAL.cpp
Normal file
163
TouchGFX/target/TouchGFXHAL.cpp
Normal file
@ -0,0 +1,163 @@
|
||||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
* File Name : TouchGFXHAL.cpp
|
||||
******************************************************************************
|
||||
* This file was created by TouchGFX Generator 4.21.1. This file is only
|
||||
* generated once! Delete this file from your project and re-generate code
|
||||
* using STM32CubeMX or change this file manually to update it.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2023 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
/* USER CODE END Header */
|
||||
|
||||
#include <TouchGFXHAL.hpp>
|
||||
|
||||
/* USER CODE BEGIN TouchGFXHAL.cpp */
|
||||
|
||||
using namespace touchgfx;
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
// To calculate he start adress of rect,
|
||||
// use advanceFrameBufferToRect(uint8_t* fbPtr, const touchgfx::Rect& rect)
|
||||
// defined in TouchGFXGeneratedHAL.cpp
|
||||
|
||||
TouchGFXGeneratedHAL::flushFrameBuffer(rect);
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
bool TouchGFXHAL::beginFrame()
|
||||
{
|
||||
return TouchGFXGeneratedHAL::beginFrame();
|
||||
}
|
||||
|
||||
void TouchGFXHAL::endFrame()
|
||||
{
|
||||
TouchGFXGeneratedHAL::endFrame();
|
||||
}
|
||||
|
||||
/* USER CODE END TouchGFXHAL.cpp */
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
171
TouchGFX/target/TouchGFXHAL.hpp
Normal file
171
TouchGFX/target/TouchGFXHAL.hpp
Normal file
@ -0,0 +1,171 @@
|
||||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
* File Name : TouchGFXHAL.hpp
|
||||
******************************************************************************
|
||||
* This file was created by TouchGFX Generator 4.21.1. This file is only
|
||||
* generated once! Delete this file from your project and re-generate code
|
||||
* using STM32CubeMX or change this file manually to update it.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2023 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
/* USER CODE END Header */
|
||||
#ifndef TouchGFXHAL_HPP
|
||||
#define TouchGFXHAL_HPP
|
||||
|
||||
/* USER CODE BEGIN TouchGFXHAL.hpp */
|
||||
|
||||
#include <TouchGFXGeneratedHAL.hpp>
|
||||
|
||||
/**
|
||||
* @class TouchGFXHAL
|
||||
*
|
||||
* @brief HAL implementation for TouchGFX.
|
||||
*
|
||||
* @sa HAL
|
||||
*/
|
||||
class TouchGFXHAL : public TouchGFXGeneratedHAL
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* @fn TouchGFXHAL::TouchGFXHAL(touchgfx::DMA_Interface& dma, touchgfx::LCD& display, touchgfx::TouchController& tc, uint16_t width, uint16_t height) : TouchGFXGeneratedHAL(dma, display, tc, width, height)
|
||||
*
|
||||
* @brief Constructor.
|
||||
*
|
||||
* Constructor. Initializes members.
|
||||
*
|
||||
* @param [in,out] dma Reference to DMA interface.
|
||||
* @param [in,out] display Reference to LCD interface.
|
||||
* @param [in,out] tc Reference to Touch Controller driver.
|
||||
* @param width Width of the display.
|
||||
* @param height Height of the display.
|
||||
*/
|
||||
TouchGFXHAL(touchgfx::DMA_Interface& dma, touchgfx::LCD& display, touchgfx::TouchController& tc, uint16_t width, uint16_t height) : TouchGFXGeneratedHAL(dma, display, tc, width, height)
|
||||
{
|
||||
}
|
||||
|
||||
virtual void initialize();
|
||||
|
||||
/**
|
||||
* @fn virtual void TouchGFXHAL::disableInterrupts();
|
||||
*
|
||||
* @brief Disables the DMA and LCD interrupts.
|
||||
*
|
||||
* Disables the DMA and LCD interrupts.
|
||||
*/
|
||||
virtual void disableInterrupts();
|
||||
|
||||
/**
|
||||
* @fn virtual void TouchGFXHAL::enableInterrupts();
|
||||
*
|
||||
* @brief Enables the DMA and LCD interrupts.
|
||||
*
|
||||
* Enables the DMA and LCD interrupts.
|
||||
*/
|
||||
virtual void enableInterrupts();
|
||||
|
||||
/**
|
||||
* @fn virtual void TouchGFXHAL::configureInterrupts();
|
||||
*
|
||||
* @brief Sets the DMA and LCD interrupt priorities.
|
||||
*
|
||||
* Sets the DMA and LCD interrupt priorities.
|
||||
*/
|
||||
virtual void configureInterrupts();
|
||||
|
||||
/**
|
||||
* @fn virtual void TouchGFXHAL::enableLCDControllerInterrupt();
|
||||
*
|
||||
* @brief Configure the LCD controller to fire interrupts at VSYNC.
|
||||
*
|
||||
* Configure the LCD controller to fire interrupts at VSYNC. Called automatically
|
||||
* once TouchGFX initialization has completed.
|
||||
*/
|
||||
virtual void enableLCDControllerInterrupt();
|
||||
|
||||
virtual bool beginFrame();
|
||||
|
||||
virtual void endFrame();
|
||||
|
||||
/**
|
||||
* @fn virtual void TouchGFXHAL::flushFrameBuffer();
|
||||
*
|
||||
* @brief This function is called whenever the framework has performed a complete draw.
|
||||
*
|
||||
* This specialization is only in place to keep compilers happy. Base impl. will call the
|
||||
* Rect version.
|
||||
* @see HAL::flushFrameBuffer
|
||||
*/
|
||||
virtual void flushFrameBuffer()
|
||||
{
|
||||
TouchGFXGeneratedHAL::flushFrameBuffer();
|
||||
}
|
||||
|
||||
/**
|
||||
* @fn virtual void TouchGFXHAL::flushFrameBuffer(const Rect& rect);
|
||||
*
|
||||
* @brief This function is called whenever the framework has performed a partial draw.
|
||||
*
|
||||
* This function is called whenever the framework has performed a partial draw.
|
||||
* On the STM32F7, make sure to clean and invalidate the data cache. This is to
|
||||
* ensure that LTDC sees correct data when transferring to the display.
|
||||
*
|
||||
* @param rect The area of the screen that has been drawn, expressed in absolute coordinates.
|
||||
*
|
||||
* @see flushFrameBuffer().
|
||||
*/
|
||||
virtual void flushFrameBuffer(const touchgfx::Rect& rect);
|
||||
|
||||
/**
|
||||
* @fn virtual bool TouchGFXHAL::blockCopy(void* RESTRICT dest, const void* RESTRICT src, uint32_t numBytes);
|
||||
*
|
||||
* @brief This function performs a platform-specific memcpy.
|
||||
*
|
||||
* This function performs a platform-specific memcpy, if supported by the hardware.
|
||||
*
|
||||
* @param [out] dest Pointer to destination memory.
|
||||
* @param [in] src Pointer to source memory.
|
||||
* @param numBytes Number of bytes to copy.
|
||||
*
|
||||
* @return true if the copy succeeded, false if copy was not performed.
|
||||
*/
|
||||
virtual bool blockCopy(void* RESTRICT dest, const void* RESTRICT src, uint32_t numBytes);
|
||||
|
||||
protected:
|
||||
/**
|
||||
* @fn virtual uint16_t* TouchGFXHAL::getTFTFrameBuffer() const;
|
||||
*
|
||||
* @brief Gets the frame buffer address used by the TFT controller.
|
||||
*
|
||||
* Gets the frame buffer address used by the TFT controller.
|
||||
*
|
||||
* @return The address of the frame buffer currently being displayed on the TFT.
|
||||
*/
|
||||
virtual uint16_t* getTFTFrameBuffer() const;
|
||||
|
||||
/**
|
||||
* @fn virtual void TouchGFXHAL::setTFTFrameBuffer(uint16_t* adr);
|
||||
*
|
||||
* @brief Sets the frame buffer address used by the TFT controller.
|
||||
*
|
||||
* Sets the frame buffer address used by the TFT controller.
|
||||
*
|
||||
* @param [in,out] adr New frame buffer address.
|
||||
*/
|
||||
virtual void setTFTFrameBuffer(uint16_t* adr);
|
||||
};
|
||||
|
||||
/* USER CODE END TouchGFXHAL.hpp */
|
||||
|
||||
#endif // TouchGFXHAL_HPP
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
245
TouchGFX/target/generated/OSWrappers.cpp
Normal file
245
TouchGFX/target/generated/OSWrappers.cpp
Normal file
@ -0,0 +1,245 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* File Name : OSWrappers.cpp
|
||||
******************************************************************************
|
||||
* This file is generated by TouchGFX Generator 4.21.2. Please, do not edit!
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2023 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <cassert>
|
||||
#include <touchgfx/hal/HAL.hpp>
|
||||
#include <touchgfx/hal/OSWrappers.hpp>
|
||||
|
||||
#include "stm32h7xx.h"
|
||||
|
||||
#include "tx_api.h"
|
||||
#include "tx_byte_pool.h"
|
||||
|
||||
// tx_thread.h is not C++ compatible, declare used symbols here as externals
|
||||
extern "C" volatile UINT _tx_thread_preempt_disable;
|
||||
extern "C" VOID _tx_thread_system_preempt_check(VOID);
|
||||
|
||||
#define OSWRAPPER_BYTE_POOL_SIZE TX_BYTE_POOL_MIN
|
||||
#define OSWRAPPER_QUEUE_SIZE sizeof(ULONG)
|
||||
|
||||
static uint8_t oswrapper_pool_mem[OSWRAPPER_BYTE_POOL_SIZE];
|
||||
static TX_BYTE_POOL oswrapper_byte_pool;
|
||||
static TX_SEMAPHORE frame_buffer_sem = { 0 };
|
||||
static TX_QUEUE vsync_q = { 0 };
|
||||
|
||||
// Just a dummy message to insert in the VSYNC queue.
|
||||
static ULONG dummy_msg = 0x5A5A5A5A;
|
||||
|
||||
using namespace touchgfx;
|
||||
|
||||
/*
|
||||
* Initialize frame buffer semaphore and queue/mutex for VSYNC signal.
|
||||
*/
|
||||
void OSWrappers::initialize()
|
||||
{
|
||||
CHAR* pointer;
|
||||
|
||||
/* Create a byte memory pool from which to allocate the thread stacks. */
|
||||
if (tx_byte_pool_create(&oswrapper_byte_pool, (CHAR*) "OSWrapper Byte Pool", oswrapper_pool_mem,
|
||||
OSWRAPPER_BYTE_POOL_SIZE) != TX_SUCCESS)
|
||||
{
|
||||
assert(0 && "Failed to create OSWrapper Pool memory!");
|
||||
}
|
||||
|
||||
/* Allocate the vsync_q. */
|
||||
if (tx_byte_allocate(&oswrapper_byte_pool, (VOID**) &pointer,
|
||||
OSWRAPPER_QUEUE_SIZE, TX_NO_WAIT) != TX_SUCCESS)
|
||||
{
|
||||
assert(0 && "Failed to allocate memory for the Vsync Message Queue!");
|
||||
}
|
||||
|
||||
// Create a queue of length 1
|
||||
if (tx_queue_create(&vsync_q, (CHAR*) "Vsync Message Queue", TX_1_ULONG,
|
||||
pointer, OSWRAPPER_QUEUE_SIZE) != TX_SUCCESS)
|
||||
{
|
||||
assert(0 && "Failed to create Vsync Message Queue!");
|
||||
}
|
||||
|
||||
// Create the Framebuffer Semaphore (Binary)
|
||||
if (tx_semaphore_create(&frame_buffer_sem, (CHAR*) "FrameBuffer Semaphore", 1) != TX_SUCCESS)
|
||||
{
|
||||
assert(0 && "Failed to create FrameBuffer Semaphore!");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Take the frame buffer semaphore. Blocks until semaphore is available.
|
||||
*/
|
||||
void OSWrappers::takeFrameBufferSemaphore()
|
||||
{
|
||||
if (tx_semaphore_get(&frame_buffer_sem, TX_WAIT_FOREVER) != TX_SUCCESS)
|
||||
{
|
||||
assert(0 && "Failed to get FrameBuffer Semaphore!");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Release the frame buffer semaphore.
|
||||
*/
|
||||
void OSWrappers::giveFrameBufferSemaphore()
|
||||
{
|
||||
if (!frame_buffer_sem.tx_semaphore_count)
|
||||
{
|
||||
if (tx_semaphore_put(&frame_buffer_sem) != TX_SUCCESS)
|
||||
{
|
||||
assert(0 && "Failed to put FrameBuffer Semaphore!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Attempt to obtain the frame buffer semaphore. If semaphore is not available, do
|
||||
* nothing.
|
||||
*
|
||||
* Note must return immediately! This function does not care who has the taken the semaphore,
|
||||
* it only serves to make sure that the semaphore is taken by someone.
|
||||
*/
|
||||
void OSWrappers::tryTakeFrameBufferSemaphore()
|
||||
{
|
||||
if (tx_semaphore_get(&frame_buffer_sem, TX_NO_WAIT) != TX_SUCCESS)
|
||||
{
|
||||
// Typically we should inform the requester about failing to get this semaphore
|
||||
// Maybe we should update the prototype of this method to return the result of the try
|
||||
// assert(0 && "Failed to get FrameBuffer Semaphore!");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Release the frame buffer semaphore in a way that is safe in interrupt context. Called
|
||||
* from ISR.
|
||||
*
|
||||
* Release the frame buffer semaphore in a way that is safe in interrupt context.
|
||||
* Called from ISR.
|
||||
*/
|
||||
void OSWrappers::giveFrameBufferSemaphoreFromISR()
|
||||
{
|
||||
TX_INTERRUPT_SAVE_AREA
|
||||
TX_DISABLE;
|
||||
_tx_thread_preempt_disable++;
|
||||
if (!frame_buffer_sem.tx_semaphore_count)
|
||||
{
|
||||
if (tx_semaphore_put(&frame_buffer_sem) != TX_SUCCESS)
|
||||
{
|
||||
assert(0 && "Failed to put FrameBuffer Semaphore!");
|
||||
}
|
||||
}
|
||||
_tx_thread_preempt_disable--;
|
||||
TX_RESTORE;
|
||||
_tx_thread_system_preempt_check();
|
||||
}
|
||||
|
||||
/*
|
||||
* Signal that a VSYNC has occurred. Should make the vsync queue/mutex available.
|
||||
*
|
||||
* Note This function is called from an ISR, and should (depending on OS) trigger a
|
||||
* scheduling.
|
||||
*/
|
||||
void OSWrappers::signalVSync()
|
||||
{
|
||||
UINT ret;
|
||||
|
||||
// Send the message only if the queue is empty.
|
||||
// This call is from ISR, so no need to re-send
|
||||
// the message if not yet consumed by threads
|
||||
if (vsync_q.tx_queue_enqueued == 0)
|
||||
{
|
||||
// This is supposed to be called from Vsync Interrupt Handler
|
||||
// So wait_option should be equal to TX_NO_WAIT
|
||||
ret = tx_queue_send(&vsync_q, &dummy_msg, TX_NO_WAIT);
|
||||
if (ret != TX_SUCCESS)
|
||||
{
|
||||
assert(0 && "Failed to Signal Vsync!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Signal that the rendering of the frame has completed. Used by
|
||||
* some systems to avoid using any previous vsync.
|
||||
*/
|
||||
void OSWrappers::signalRenderingDone()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* This function blocks until a VSYNC occurs.
|
||||
*
|
||||
* Note This function must first clear the mutex/queue and then wait for the next one to
|
||||
* occur.
|
||||
*/
|
||||
void OSWrappers::waitForVSync()
|
||||
{
|
||||
UINT ret;
|
||||
|
||||
// First make sure the queue is empty, by trying to remove an element with 0 timeout.
|
||||
ret = tx_queue_receive(&vsync_q, &dummy_msg, TX_NO_WAIT);
|
||||
|
||||
if ((ret == TX_SUCCESS) || (ret == TX_QUEUE_EMPTY))
|
||||
{
|
||||
// Then, wait for next VSYNC to occur.
|
||||
ret = tx_queue_receive(&vsync_q, &dummy_msg, TX_WAIT_FOREVER);
|
||||
}
|
||||
|
||||
if (ret != TX_SUCCESS)
|
||||
{
|
||||
assert(0 && "Failed to Wait for Vsync!");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* A function that causes executing task to sleep for a number of milliseconds.
|
||||
*
|
||||
* A function that causes executing task to sleep for a number of milliseconds.
|
||||
* This function is OPTIONAL. It is only used by the TouchGFX in the case of
|
||||
* a specific frame refresh strategy (REFRESH_STRATEGY_OPTIM_SINGLE_BUFFER_TFT_CTRL).
|
||||
* Due to backwards compatibility, in order for this function to be useable by the HAL
|
||||
* the function must be explicitly registered:
|
||||
* hal.registerTaskDelayFunction(&OSWrappers::taskDelay)
|
||||
*
|
||||
* see HAL::setFrameRefreshStrategy(FrameRefreshStrategy s)
|
||||
* see HAL::registerTaskDelayFunction(void (*delayF)(uint16_t))
|
||||
*/
|
||||
void OSWrappers::taskDelay(uint16_t ms)
|
||||
{
|
||||
tx_thread_sleep(ms);
|
||||
}
|
||||
|
||||
/**
|
||||
* A function that causes the executing task to yield control to
|
||||
* another thread. This function is used by the framework when it
|
||||
* is necessary to wait a little before continuing (e.g. drawing).
|
||||
*
|
||||
* The implementation should typically request the operating
|
||||
* system to change to another task of similar priority. When
|
||||
* running without an operating system, the implementation can run
|
||||
* a very short task and return.
|
||||
*/
|
||||
void OSWrappers::taskYield()
|
||||
{
|
||||
/* Check if this API is called from Interrupt Service Routines */
|
||||
if (__get_IPSR() == 0U)
|
||||
{
|
||||
/* Call the tx_thread_relinquish to relinquishes processor control to
|
||||
other ready-to-run threads at the same or higher priority. */
|
||||
tx_thread_relinquish();
|
||||
}
|
||||
}
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
|
||||
689
TouchGFX/target/generated/STM32DMA.cpp
Normal file
689
TouchGFX/target/generated/STM32DMA.cpp
Normal file
@ -0,0 +1,689 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* File Name : STM32DMA.cpp
|
||||
******************************************************************************
|
||||
* This file is generated by TouchGFX Generator 4.21.2. Please, do not edit!
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2023 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include "stm32h7xx_hal.h"
|
||||
#include "stm32h7xx_hal_dma2d.h"
|
||||
#include <STM32DMA.hpp>
|
||||
#include <cassert>
|
||||
#include <touchgfx/Color.hpp>
|
||||
#include <touchgfx/hal/HAL.hpp>
|
||||
#include <touchgfx/hal/OSWrappers.hpp>
|
||||
#include <touchgfx/lcd/LCD.hpp>
|
||||
|
||||
/* Makes touchgfx specific types and variables visible to this file */
|
||||
using namespace touchgfx;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
const uint16_t format;
|
||||
const uint16_t size;
|
||||
const uint32_t* const data;
|
||||
} clutData_t;
|
||||
|
||||
extern "C" void DMA2D_IRQHandler()
|
||||
{
|
||||
/* Transfer Complete Interrupt management ************************************/
|
||||
if ((READ_REG(DMA2D->ISR) & DMA2D_FLAG_TC) != RESET)
|
||||
{
|
||||
/* Verify Transfer Complete Interrupt */
|
||||
if ((READ_REG(DMA2D->CR) & DMA2D_IT_TC) != RESET)
|
||||
{
|
||||
/* Disable the transfer complete interrupt */
|
||||
DMA2D->CR &= ~(DMA2D_IT_TC);
|
||||
|
||||
/* Clear the transfer complete flag */
|
||||
DMA2D->IFCR = (DMA2D_FLAG_TC);
|
||||
|
||||
/* Signal DMA queue of execution complete */
|
||||
touchgfx::HAL::getInstance()->signalDMAInterrupt();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
STM32DMA::STM32DMA()
|
||||
: DMA_Interface(dma_queue), dma_queue(queue_storage, sizeof(queue_storage) / sizeof(queue_storage[0]))
|
||||
{
|
||||
}
|
||||
|
||||
STM32DMA::~STM32DMA()
|
||||
{
|
||||
/* Disable DMA2D global Interrupt */
|
||||
NVIC_DisableIRQ(DMA2D_IRQn);
|
||||
}
|
||||
|
||||
void STM32DMA::initialize()
|
||||
{
|
||||
/* Ensure DMA2D Clock is enabled */
|
||||
__HAL_RCC_DMA2D_CLK_ENABLE();
|
||||
__HAL_RCC_DMA2D_FORCE_RESET();
|
||||
__HAL_RCC_DMA2D_RELEASE_RESET();
|
||||
|
||||
/* Enable DMA2D global Interrupt */
|
||||
HAL_NVIC_SetPriority(DMA2D_IRQn, 5, 0);
|
||||
HAL_NVIC_EnableIRQ(DMA2D_IRQn);
|
||||
}
|
||||
|
||||
inline uint32_t STM32DMA::getChromARTInputFormat(Bitmap::BitmapFormat format)
|
||||
{
|
||||
// Default color mode set to ARGB8888
|
||||
uint32_t dma2dColorMode = DMA2D_INPUT_ARGB8888;
|
||||
|
||||
switch (format)
|
||||
{
|
||||
case Bitmap::ARGB8888: /* DMA2D input mode set to 32bit ARGB */
|
||||
dma2dColorMode = DMA2D_INPUT_ARGB8888;
|
||||
break;
|
||||
case Bitmap::RGB888: /* DMA2D input mode set to 24bit RGB */
|
||||
dma2dColorMode = DMA2D_INPUT_RGB888;
|
||||
break;
|
||||
case Bitmap::RGB565: /* DMA2D input mode set to 16bit RGB */
|
||||
dma2dColorMode = DMA2D_INPUT_RGB565;
|
||||
break;
|
||||
case Bitmap::ARGB2222: /* Fall through */
|
||||
case Bitmap::ABGR2222: /* Fall through */
|
||||
case Bitmap::RGBA2222: /* Fall through */
|
||||
case Bitmap::BGRA2222: /* Fall through */
|
||||
case Bitmap::L8: /* DMA2D input mode set to 8bit Color Look up table*/
|
||||
dma2dColorMode = DMA2D_INPUT_L8;
|
||||
break;
|
||||
case Bitmap::BW: /* Fall through */
|
||||
case Bitmap::BW_RLE: /* Fall through */
|
||||
case Bitmap::GRAY4: /* Fall through */
|
||||
case Bitmap::GRAY2: /* Fall through */
|
||||
default: /* Unsupported input format for DMA2D */
|
||||
assert(0 && "Unsupported Format!");
|
||||
break;
|
||||
}
|
||||
|
||||
return dma2dColorMode;
|
||||
}
|
||||
|
||||
inline uint32_t STM32DMA::getChromARTOutputFormat(Bitmap::BitmapFormat format)
|
||||
{
|
||||
// Default color mode set to ARGB8888
|
||||
uint32_t dma2dColorMode = DMA2D_OUTPUT_ARGB8888;
|
||||
|
||||
switch (format)
|
||||
{
|
||||
case Bitmap::ARGB8888: /* DMA2D output mode set to 32bit ARGB */
|
||||
dma2dColorMode = DMA2D_OUTPUT_ARGB8888;
|
||||
break;
|
||||
case Bitmap::RGB888: /* Fall through */
|
||||
case Bitmap::ARGB2222: /* Fall through */
|
||||
case Bitmap::ABGR2222: /* Fall through */
|
||||
case Bitmap::RGBA2222: /* Fall through */
|
||||
case Bitmap::BGRA2222: /* DMA2D output mode set to 24bit RGB */
|
||||
dma2dColorMode = DMA2D_OUTPUT_RGB888;
|
||||
break;
|
||||
case Bitmap::RGB565: /* DMA2D output mode set to 16bit RGB */
|
||||
dma2dColorMode = DMA2D_OUTPUT_RGB565;
|
||||
break;
|
||||
case Bitmap::L8: /* Fall through */
|
||||
case Bitmap::BW: /* Fall through */
|
||||
case Bitmap::BW_RLE: /* Fall through */
|
||||
case Bitmap::GRAY4: /* Fall through */
|
||||
case Bitmap::GRAY2: /* Fall through */
|
||||
default: /* Unsupported output format for DMA2D */
|
||||
assert(0 && "Unsupported Format!");
|
||||
break;
|
||||
}
|
||||
|
||||
return dma2dColorMode;
|
||||
}
|
||||
|
||||
BlitOperations STM32DMA::getBlitCaps()
|
||||
{
|
||||
return static_cast<BlitOperations>(BLIT_OP_FILL
|
||||
| BLIT_OP_FILL_WITH_ALPHA
|
||||
| BLIT_OP_COPY
|
||||
| BLIT_OP_COPY_L8
|
||||
| BLIT_OP_COPY_WITH_ALPHA
|
||||
| BLIT_OP_COPY_ARGB8888
|
||||
| BLIT_OP_COPY_ARGB8888_WITH_ALPHA
|
||||
| BLIT_OP_COPY_A4
|
||||
| BLIT_OP_COPY_A8);
|
||||
}
|
||||
|
||||
/*
|
||||
* void STM32DMA::setupDataCopy(const BlitOp& blitOp) handles blit operation of
|
||||
* BLIT_OP_COPY
|
||||
* BLIT_OP_COPY_L8
|
||||
* BLIT_OP_COPY_WITH_ALPHA
|
||||
* BLIT_OP_COPY_ARGB8888
|
||||
* BLIT_OP_COPY_ARGB8888_WITH_ALPHA
|
||||
* BLIT_OP_COPY_A4
|
||||
* BLIT_OP_COPY_A8
|
||||
*/
|
||||
void STM32DMA::setupDataCopy(const BlitOp& blitOp)
|
||||
{
|
||||
uint32_t dma2dForegroundColorMode = getChromARTInputFormat(static_cast<Bitmap::BitmapFormat>(blitOp.srcFormat));
|
||||
uint32_t dma2dBackgroundColorMode = getChromARTInputFormat(static_cast<Bitmap::BitmapFormat>(blitOp.dstFormat));
|
||||
uint32_t dma2dOutputColorMode = getChromARTOutputFormat(static_cast<Bitmap::BitmapFormat>(blitOp.dstFormat));
|
||||
|
||||
/* DMA2D OOR register configuration */
|
||||
WRITE_REG(DMA2D->OOR, blitOp.dstLoopStride - blitOp.nSteps);
|
||||
|
||||
/* DMA2D BGOR register configuration */
|
||||
WRITE_REG(DMA2D->BGOR, blitOp.dstLoopStride - blitOp.nSteps);
|
||||
|
||||
/* DMA2D FGOR register configuration */
|
||||
WRITE_REG(DMA2D->FGOR, blitOp.srcLoopStride - blitOp.nSteps);
|
||||
|
||||
/* DMA2D OPFCCR register configuration */
|
||||
WRITE_REG(DMA2D->OPFCCR, dma2dOutputColorMode);
|
||||
|
||||
/* Configure DMA2D data size */
|
||||
WRITE_REG(DMA2D->NLR, (blitOp.nLoops | (blitOp.nSteps << DMA2D_NLR_PL_Pos)));
|
||||
|
||||
/* Configure DMA2D destination address */
|
||||
WRITE_REG(DMA2D->OMAR, reinterpret_cast<uint32_t>(blitOp.pDst));
|
||||
|
||||
/* Configure DMA2D source address */
|
||||
WRITE_REG(DMA2D->FGMAR, reinterpret_cast<uint32_t>(blitOp.pSrc));
|
||||
|
||||
switch (blitOp.operation)
|
||||
{
|
||||
case BLIT_OP_COPY_A4:
|
||||
/* Set DMA2D color mode and alpha mode */
|
||||
WRITE_REG(DMA2D->FGPFCCR, DMA2D_INPUT_A4 | (DMA2D_COMBINE_ALPHA << DMA2D_FGPFCCR_AM_Pos) | (blitOp.alpha << 24));
|
||||
|
||||
/* set DMA2D foreground color */
|
||||
WRITE_REG(DMA2D->FGCOLR, blitOp.color);
|
||||
|
||||
/* Write DMA2D BGPFCCR register */
|
||||
WRITE_REG(DMA2D->BGPFCCR, dma2dBackgroundColorMode | (DMA2D_NO_MODIF_ALPHA << DMA2D_BGPFCCR_AM_Pos));
|
||||
|
||||
/* Configure DMA2D Stream source2 address */
|
||||
WRITE_REG(DMA2D->BGMAR, reinterpret_cast<uint32_t>(blitOp.pDst));
|
||||
|
||||
/* Set DMA2D mode */
|
||||
WRITE_REG(DMA2D->CR, DMA2D_M2M_BLEND | DMA2D_IT_TC | DMA2D_CR_START);
|
||||
break;
|
||||
case BLIT_OP_COPY_A8:
|
||||
/* Set DMA2D color mode and alpha mode */
|
||||
WRITE_REG(DMA2D->FGPFCCR, DMA2D_INPUT_A8 | (DMA2D_COMBINE_ALPHA << DMA2D_FGPFCCR_AM_Pos) | (blitOp.alpha << 24));
|
||||
|
||||
/* set DMA2D foreground color */
|
||||
WRITE_REG(DMA2D->FGCOLR, blitOp.color);
|
||||
|
||||
/* Write DMA2D BGPFCCR register */
|
||||
WRITE_REG(DMA2D->BGPFCCR, dma2dBackgroundColorMode | (DMA2D_NO_MODIF_ALPHA << DMA2D_BGPFCCR_AM_Pos));
|
||||
|
||||
/* Configure DMA2D Stream source2 address */
|
||||
WRITE_REG(DMA2D->BGMAR, reinterpret_cast<uint32_t>(blitOp.pDst));
|
||||
|
||||
/* Set DMA2D mode */
|
||||
WRITE_REG(DMA2D->CR, DMA2D_M2M_BLEND | DMA2D_IT_TC | DMA2D_CR_START);
|
||||
break;
|
||||
case BLIT_OP_COPY_WITH_ALPHA:
|
||||
/* Set DMA2D color mode and alpha mode */
|
||||
WRITE_REG(DMA2D->FGPFCCR, dma2dForegroundColorMode | (DMA2D_COMBINE_ALPHA << DMA2D_FGPFCCR_AM_Pos) | (blitOp.alpha << 24));
|
||||
|
||||
/* Write DMA2D BGPFCCR register */
|
||||
WRITE_REG(DMA2D->BGPFCCR, dma2dBackgroundColorMode | (DMA2D_NO_MODIF_ALPHA << DMA2D_BGPFCCR_AM_Pos));
|
||||
|
||||
/* Configure DMA2D Stream source2 address */
|
||||
WRITE_REG(DMA2D->BGMAR, reinterpret_cast<uint32_t>(blitOp.pDst));
|
||||
|
||||
/* Set DMA2D mode */
|
||||
WRITE_REG(DMA2D->CR, DMA2D_M2M_BLEND | DMA2D_IT_TC | DMA2D_CR_START);
|
||||
break;
|
||||
case BLIT_OP_COPY_L8:
|
||||
{
|
||||
bool blend = true;
|
||||
const clutData_t* const palette = reinterpret_cast<const clutData_t*>(blitOp.pClut);
|
||||
|
||||
/* Write foreground CLUT memory address */
|
||||
WRITE_REG(DMA2D->FGCMAR, reinterpret_cast<uint32_t>(&palette->data));
|
||||
|
||||
/* Set DMA2D color mode and alpha mode */
|
||||
WRITE_REG(DMA2D->FGPFCCR, dma2dForegroundColorMode | (DMA2D_COMBINE_ALPHA << DMA2D_FGPFCCR_AM_Pos) | (blitOp.alpha << 24));
|
||||
|
||||
/* Write DMA2D BGPFCCR register */
|
||||
WRITE_REG(DMA2D->BGPFCCR, dma2dBackgroundColorMode | (DMA2D_NO_MODIF_ALPHA << DMA2D_BGPFCCR_AM_Pos));
|
||||
|
||||
/* Configure DMA2D Stream source2 address */
|
||||
WRITE_REG(DMA2D->BGMAR, reinterpret_cast<uint32_t>(blitOp.pDst));
|
||||
|
||||
/* Configure CLUT */
|
||||
switch ((Bitmap::ClutFormat)palette->format)
|
||||
{
|
||||
case Bitmap::CLUT_FORMAT_L8_ARGB8888:
|
||||
/* Write foreground CLUT size and CLUT color mode */
|
||||
MODIFY_REG(DMA2D->FGPFCCR, (DMA2D_FGPFCCR_CS | DMA2D_FGPFCCR_CCM), (((palette->size - 1) << DMA2D_FGPFCCR_CS_Pos) | (DMA2D_CCM_ARGB8888 << DMA2D_FGPFCCR_CCM_Pos)));
|
||||
break;
|
||||
case Bitmap::CLUT_FORMAT_L8_RGB888:
|
||||
if(blitOp.alpha == 255)
|
||||
{
|
||||
blend = false;
|
||||
}
|
||||
MODIFY_REG(DMA2D->FGPFCCR, (DMA2D_FGPFCCR_CS | DMA2D_FGPFCCR_CCM), (((palette->size - 1) << DMA2D_FGPFCCR_CS_Pos) | (DMA2D_CCM_RGB888 << DMA2D_FGPFCCR_CCM_Pos)));
|
||||
break;
|
||||
|
||||
case Bitmap::CLUT_FORMAT_L8_RGB565:
|
||||
default:
|
||||
assert(0 && "Unsupported format");
|
||||
break;
|
||||
}
|
||||
|
||||
/* Enable the CLUT loading for the foreground */
|
||||
SET_BIT(DMA2D->FGPFCCR, DMA2D_FGPFCCR_START);
|
||||
|
||||
while ((READ_REG(DMA2D->FGPFCCR) & DMA2D_FGPFCCR_START) != 0U)
|
||||
{
|
||||
}
|
||||
DMA2D->IFCR = (DMA2D_FLAG_CTC);
|
||||
|
||||
/* Set DMA2D mode */
|
||||
if(blend)
|
||||
{
|
||||
WRITE_REG(DMA2D->CR, DMA2D_M2M_BLEND | DMA2D_IT_TC | DMA2D_CR_START);
|
||||
}
|
||||
else
|
||||
{
|
||||
WRITE_REG(DMA2D->CR, DMA2D_M2M_PFC | DMA2D_IT_TC | DMA2D_CR_START);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case BLIT_OP_COPY_ARGB8888:
|
||||
case BLIT_OP_COPY_ARGB8888_WITH_ALPHA:
|
||||
/* Set DMA2D color mode and alpha mode */
|
||||
WRITE_REG(DMA2D->FGPFCCR, dma2dForegroundColorMode | (DMA2D_COMBINE_ALPHA << DMA2D_FGPFCCR_AM_Pos) | (blitOp.alpha << 24));
|
||||
|
||||
/* Write DMA2D BGPFCCR register */
|
||||
WRITE_REG(DMA2D->BGPFCCR, dma2dBackgroundColorMode | (DMA2D_NO_MODIF_ALPHA << DMA2D_BGPFCCR_AM_Pos));
|
||||
|
||||
/* Configure DMA2D Stream source2 address */
|
||||
WRITE_REG(DMA2D->BGMAR, reinterpret_cast<uint32_t>(blitOp.pDst));
|
||||
|
||||
/* Set DMA2D mode */
|
||||
WRITE_REG(DMA2D->CR, DMA2D_M2M_BLEND | DMA2D_IT_TC | DMA2D_CR_START);
|
||||
break;
|
||||
default: /* BLIT_OP_COPY */
|
||||
/* Set DMA2D color mode and alpha mode */
|
||||
WRITE_REG(DMA2D->FGPFCCR, dma2dForegroundColorMode | (DMA2D_COMBINE_ALPHA << DMA2D_FGPFCCR_AM_Pos) | (blitOp.alpha << 24));
|
||||
|
||||
/* Perform pixel-format-conversion (PFC) If Bitmap format is not same format as framebuffer format */
|
||||
if (blitOp.srcFormat != blitOp.dstFormat)
|
||||
{
|
||||
/* Start DMA2D : PFC Mode */
|
||||
WRITE_REG(DMA2D->CR, DMA2D_M2M_PFC | DMA2D_IT_TC | DMA2D_CR_START);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Start DMA2D : M2M Mode */
|
||||
WRITE_REG(DMA2D->CR, DMA2D_M2M | DMA2D_IT_TC | DMA2D_CR_START);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* void STM32DMA::setupDataFill(const BlitOp& blitOp) handles blit operation of
|
||||
* BLIT_OP_FILL
|
||||
* BLIT_OP_FILL_WITH_ALPHA
|
||||
*/
|
||||
void STM32DMA::setupDataFill(const BlitOp& blitOp)
|
||||
{
|
||||
uint32_t dma2dOutputColorMode = getChromARTOutputFormat(static_cast<Bitmap::BitmapFormat>(blitOp.dstFormat));
|
||||
|
||||
/* DMA2D OPFCCR register configuration */
|
||||
WRITE_REG(DMA2D->OPFCCR, dma2dOutputColorMode);
|
||||
|
||||
/* Configure DMA2D data size */
|
||||
WRITE_REG(DMA2D->NLR, (blitOp.nLoops | (blitOp.nSteps << DMA2D_NLR_PL_Pos)));
|
||||
|
||||
/* Configure DMA2D destination address */
|
||||
WRITE_REG(DMA2D->OMAR, reinterpret_cast<uint32_t>(blitOp.pDst));
|
||||
|
||||
/* DMA2D OOR register configuration */
|
||||
WRITE_REG(DMA2D->OOR, blitOp.dstLoopStride - blitOp.nSteps);
|
||||
|
||||
if (blitOp.operation == BLIT_OP_FILL_WITH_ALPHA)
|
||||
{
|
||||
/* DMA2D BGOR register configuration */
|
||||
WRITE_REG(DMA2D->BGOR, blitOp.dstLoopStride - blitOp.nSteps);
|
||||
|
||||
/* DMA2D FGOR register configuration */
|
||||
WRITE_REG(DMA2D->FGOR, blitOp.dstLoopStride - blitOp.nSteps);
|
||||
|
||||
/* Write DMA2D BGPFCCR register */
|
||||
WRITE_REG(DMA2D->BGPFCCR, dma2dOutputColorMode | (DMA2D_NO_MODIF_ALPHA << DMA2D_BGPFCCR_AM_Pos));
|
||||
|
||||
/* Write DMA2D FGPFCCR register */
|
||||
WRITE_REG(DMA2D->FGPFCCR, DMA2D_INPUT_A8 | (DMA2D_REPLACE_ALPHA << DMA2D_FGPFCCR_AM_Pos) | ((blitOp.alpha << 24) & DMA2D_FGPFCCR_ALPHA));
|
||||
|
||||
/* DMA2D FGCOLR register configuration */
|
||||
WRITE_REG(DMA2D->FGCOLR, blitOp.color);
|
||||
|
||||
/* Configure DMA2D Stream source2 address */
|
||||
WRITE_REG(DMA2D->BGMAR, reinterpret_cast<uint32_t>(blitOp.pDst));
|
||||
|
||||
/* Configure DMA2D source address */
|
||||
WRITE_REG(DMA2D->FGMAR, reinterpret_cast<uint32_t>(blitOp.pDst));
|
||||
|
||||
/* Enable the Peripheral and Enable the transfer complete interrupt */
|
||||
WRITE_REG(DMA2D->CR, (DMA2D_IT_TC | DMA2D_CR_START | DMA2D_M2M_BLEND));
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Write DMA2D FGPFCCR register */
|
||||
WRITE_REG(DMA2D->FGPFCCR, dma2dOutputColorMode | (DMA2D_NO_MODIF_ALPHA << DMA2D_FGPFCCR_AM_Pos));
|
||||
|
||||
/* DMA2D FGOR register configuration */
|
||||
WRITE_REG(DMA2D->FGOR, 0);
|
||||
|
||||
/* Set color */
|
||||
WRITE_REG(DMA2D->OCOLR, ((blitOp.color >> 8) & 0xF800) | ((blitOp.color >> 5) & 0x07E0) | ((blitOp.color >> 3) & 0x001F));
|
||||
|
||||
/* Enable the Peripheral and Enable the transfer complete interrupt */
|
||||
WRITE_REG(DMA2D->CR, (DMA2D_IT_TC | DMA2D_CR_START | DMA2D_R2M));
|
||||
}
|
||||
}
|
||||
|
||||
namespace touchgfx
|
||||
{
|
||||
namespace paint
|
||||
{
|
||||
namespace
|
||||
{
|
||||
const clutData_t* L8CLUT = 0;
|
||||
uint32_t L8ClutLoaded = 0;
|
||||
} // namespace
|
||||
|
||||
void setL8Pallette(const uint8_t* const data)
|
||||
{
|
||||
L8CLUT = reinterpret_cast<const clutData_t*>(data - offsetof(clutData_t, data));
|
||||
L8ClutLoaded = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @fn void tearDown();
|
||||
*
|
||||
* @brief Waits until previous DMA drawing operation has finished
|
||||
*/
|
||||
void tearDown()
|
||||
{
|
||||
/* Wait for DMA2D to finish last run */
|
||||
while ((READ_REG(DMA2D->CR) & DMA2D_CR_START) != 0U);
|
||||
|
||||
/* Clear transfer flags */
|
||||
WRITE_REG(DMA2D->IFCR, DMA2D_FLAG_TC | DMA2D_FLAG_CE | DMA2D_FLAG_TE);
|
||||
}
|
||||
|
||||
namespace rgb565
|
||||
{
|
||||
/**
|
||||
* @fn void lineFromColor();
|
||||
*
|
||||
* @brief Renders Canvas Widget chunks using DMA.
|
||||
* This functions will not generate an interrupt, and will not affect the DMA queue.
|
||||
*/
|
||||
void lineFromColor(uint16_t* const ptr, const unsigned count, const uint32_t color, const uint8_t alpha, const uint32_t color565)
|
||||
{
|
||||
/* Wait for DMA2D to finish last run */
|
||||
while ((READ_REG(DMA2D->CR) & DMA2D_CR_START) != 0U);
|
||||
|
||||
/* Clear transfer flags */
|
||||
WRITE_REG(DMA2D->IFCR, DMA2D_FLAG_TC | DMA2D_FLAG_CE | DMA2D_FLAG_TE);
|
||||
|
||||
/* DMA2D OPFCCR register configuration */
|
||||
WRITE_REG(DMA2D->OPFCCR, DMA2D_OUTPUT_RGB565);
|
||||
|
||||
/* Configure DMA2D data size */
|
||||
WRITE_REG(DMA2D->NLR, (1 | (count << DMA2D_NLR_PL_Pos)));
|
||||
|
||||
/* Configure DMA2D destination address */
|
||||
WRITE_REG(DMA2D->OMAR, reinterpret_cast<uint32_t>(ptr));
|
||||
|
||||
if (alpha < 0xFF)
|
||||
{
|
||||
/* Write DMA2D BGPFCCR register */
|
||||
WRITE_REG(DMA2D->BGPFCCR, DMA2D_OUTPUT_RGB565 | (DMA2D_NO_MODIF_ALPHA << DMA2D_BGPFCCR_AM_Pos));
|
||||
|
||||
/* Write DMA2D FGPFCCR register */
|
||||
WRITE_REG(DMA2D->FGPFCCR, DMA2D_INPUT_A8 | (DMA2D_REPLACE_ALPHA << DMA2D_FGPFCCR_AM_Pos) | ((alpha << 24) & DMA2D_FGPFCCR_ALPHA));
|
||||
|
||||
/* DMA2D FGCOLR register configuration */
|
||||
WRITE_REG(DMA2D->FGCOLR, color);
|
||||
|
||||
/* Configure DMA2D Stream source2 address */
|
||||
WRITE_REG(DMA2D->BGMAR, (uint32_t)ptr);
|
||||
|
||||
/* Configure DMA2D source address */
|
||||
WRITE_REG(DMA2D->FGMAR, (uint32_t)ptr);
|
||||
|
||||
/* Enable the Peripheral and Enable the transfer complete interrupt */
|
||||
WRITE_REG(DMA2D->CR, (DMA2D_CR_START | DMA2D_M2M_BLEND));
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Write DMA2D FGPFCCR register */
|
||||
WRITE_REG(DMA2D->FGPFCCR, DMA2D_OUTPUT_RGB565 | (DMA2D_NO_MODIF_ALPHA << DMA2D_FGPFCCR_AM_Pos));
|
||||
|
||||
/* Set color */
|
||||
WRITE_REG(DMA2D->OCOLR, color565);
|
||||
|
||||
/* Enable the Peripheral and Enable the transfer complete interrupt */
|
||||
WRITE_REG(DMA2D->CR, (DMA2D_CR_START | DMA2D_R2M));
|
||||
}
|
||||
}
|
||||
|
||||
void lineFromRGB565(uint16_t* const ptr, const uint16_t* const data, const unsigned count, const uint8_t alpha)
|
||||
{
|
||||
/* Wait for DMA2D to finish last run */
|
||||
while ((READ_REG(DMA2D->CR) & DMA2D_CR_START) != 0U);
|
||||
|
||||
/* Clear transfer flags */
|
||||
WRITE_REG(DMA2D->IFCR, DMA2D_FLAG_TC | DMA2D_FLAG_CE | DMA2D_FLAG_TE);
|
||||
|
||||
/* DMA2D OPFCCR register configuration */
|
||||
WRITE_REG(DMA2D->OPFCCR, DMA2D_OUTPUT_RGB565);
|
||||
|
||||
/* Configure DMA2D data size */
|
||||
WRITE_REG(DMA2D->NLR, (1 | (count << DMA2D_NLR_PL_Pos)));
|
||||
|
||||
/* Configure DMA2D destination address */
|
||||
WRITE_REG(DMA2D->OMAR, reinterpret_cast<uint32_t>(ptr));
|
||||
|
||||
/* Configure DMA2D source address */
|
||||
WRITE_REG(DMA2D->FGMAR, reinterpret_cast<uint32_t>(data));
|
||||
|
||||
if (alpha < 0xFF)
|
||||
{
|
||||
/* Set DMA2D color mode and alpha mode */
|
||||
WRITE_REG(DMA2D->FGPFCCR, DMA2D_INPUT_RGB565 | (DMA2D_COMBINE_ALPHA << DMA2D_FGPFCCR_AM_Pos) | (alpha << 24));
|
||||
|
||||
/* Write DMA2D BGPFCCR register */
|
||||
WRITE_REG(DMA2D->BGPFCCR, DMA2D_INPUT_RGB565 | (DMA2D_NO_MODIF_ALPHA << DMA2D_BGPFCCR_AM_Pos));
|
||||
|
||||
/* Configure DMA2D Stream source2 address */
|
||||
WRITE_REG(DMA2D->BGMAR, reinterpret_cast<uint32_t>(ptr));
|
||||
|
||||
/* Set DMA2D mode */
|
||||
WRITE_REG(DMA2D->CR, DMA2D_M2M_BLEND | DMA2D_CR_START);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Set DMA2D color mode and alpha mode */
|
||||
WRITE_REG(DMA2D->FGPFCCR, DMA2D_INPUT_RGB565 | (DMA2D_COMBINE_ALPHA << DMA2D_FGPFCCR_AM_Pos) | (alpha << 24));
|
||||
|
||||
/* Start DMA2D : M2M Mode */
|
||||
WRITE_REG(DMA2D->CR, DMA2D_M2M | DMA2D_CR_START);
|
||||
}
|
||||
}
|
||||
|
||||
void lineFromARGB8888(uint16_t* const ptr, const uint32_t* const data, const unsigned count, const uint8_t alpha)
|
||||
{
|
||||
/* Wait for DMA2D to finish last run */
|
||||
while ((READ_REG(DMA2D->CR) & DMA2D_CR_START) != 0U);
|
||||
|
||||
/* Clear transfer flags */
|
||||
WRITE_REG(DMA2D->IFCR, DMA2D_FLAG_TC | DMA2D_FLAG_CE | DMA2D_FLAG_TE);
|
||||
|
||||
/* DMA2D OPFCCR register configuration */
|
||||
WRITE_REG(DMA2D->OPFCCR, DMA2D_OUTPUT_RGB565);
|
||||
|
||||
/* Configure DMA2D data size */
|
||||
WRITE_REG(DMA2D->NLR, (1 | (count << DMA2D_NLR_PL_Pos)));
|
||||
|
||||
/* Configure DMA2D destination address */
|
||||
WRITE_REG(DMA2D->OMAR, reinterpret_cast<uint32_t>(ptr));
|
||||
|
||||
/* Configure DMA2D source address */
|
||||
WRITE_REG(DMA2D->FGMAR, reinterpret_cast<uint32_t>(data));
|
||||
|
||||
/* Set DMA2D color mode and alpha mode */
|
||||
WRITE_REG(DMA2D->FGPFCCR, DMA2D_INPUT_ARGB8888 | (DMA2D_COMBINE_ALPHA << DMA2D_BGPFCCR_AM_Pos) | (alpha << 24));
|
||||
|
||||
/* Write DMA2D BGPFCCR register */
|
||||
WRITE_REG(DMA2D->BGPFCCR, DMA2D_INPUT_RGB565 | (DMA2D_NO_MODIF_ALPHA << DMA2D_BGPFCCR_AM_Pos));
|
||||
|
||||
/* Configure DMA2D Stream source2 address */
|
||||
WRITE_REG(DMA2D->BGMAR, reinterpret_cast<uint32_t>(ptr));
|
||||
|
||||
/* Set DMA2D mode */
|
||||
WRITE_REG(DMA2D->CR, DMA2D_M2M_BLEND | DMA2D_CR_START);
|
||||
}
|
||||
|
||||
void lineFromL8RGB888(uint16_t* const ptr, const uint8_t* const data, const unsigned count, const uint8_t alpha)
|
||||
{
|
||||
/* wait for DMA2D to finish last run */
|
||||
while ((READ_REG(DMA2D->CR) & DMA2D_CR_START) != 0U);
|
||||
|
||||
/* DMA2D OPFCCR register configuration */
|
||||
WRITE_REG(DMA2D->OPFCCR, DMA2D_OUTPUT_RGB565);
|
||||
|
||||
/* Configure DMA2D data size */
|
||||
WRITE_REG(DMA2D->NLR, (1 | (count << DMA2D_NLR_PL_Pos)));
|
||||
|
||||
/* Configure DMA2D destination address */
|
||||
WRITE_REG(DMA2D->OMAR, reinterpret_cast<uint32_t>(ptr));
|
||||
|
||||
/* Configure DMA2D source address */
|
||||
WRITE_REG(DMA2D->FGMAR, reinterpret_cast<uint32_t>(data));
|
||||
|
||||
/* Configure DMA2D Stream source2 address */
|
||||
WRITE_REG(DMA2D->BGMAR, reinterpret_cast<uint32_t>(ptr));
|
||||
|
||||
/* Load CLUT if not already loaded */
|
||||
if (L8ClutLoaded == 0)
|
||||
{
|
||||
/* Write foreground CLUT memory address */
|
||||
WRITE_REG(DMA2D->FGCMAR, reinterpret_cast<uint32_t>(&L8CLUT->data));
|
||||
|
||||
/* Set DMA2D color mode and alpha mode */
|
||||
WRITE_REG(DMA2D->FGPFCCR, DMA2D_INPUT_L8 | (DMA2D_COMBINE_ALPHA << DMA2D_BGPFCCR_AM_Pos) | (alpha << 24));
|
||||
|
||||
MODIFY_REG(DMA2D->FGPFCCR, (DMA2D_FGPFCCR_CS | DMA2D_FGPFCCR_CCM), (((L8CLUT->size - 1) << DMA2D_FGPFCCR_CS_Pos) | (DMA2D_CCM_RGB888 << DMA2D_FGPFCCR_CCM_Pos)));
|
||||
|
||||
/* Enable the CLUT loading for the foreground */
|
||||
SET_BIT(DMA2D->FGPFCCR, DMA2D_FGPFCCR_START);
|
||||
|
||||
/* Write DMA2D BGPFCCR register */
|
||||
WRITE_REG(DMA2D->BGPFCCR, DMA2D_INPUT_RGB565 | (DMA2D_NO_MODIF_ALPHA << DMA2D_BGPFCCR_AM_Pos));
|
||||
|
||||
/* Mark CLUT loaded */
|
||||
L8ClutLoaded = 1;
|
||||
|
||||
/* Wait for load to finish */
|
||||
while ((READ_REG(DMA2D->FGPFCCR) & DMA2D_FGPFCCR_START) != 0U);
|
||||
|
||||
/* Clear CLUT Transfer Complete flag */
|
||||
DMA2D->IFCR = (DMA2D_FLAG_CTC);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Set correct alpha for these pixels */
|
||||
MODIFY_REG(DMA2D->FGPFCCR, DMA2D_BGPFCCR_ALPHA_Msk, alpha << 24);
|
||||
}
|
||||
|
||||
/* Start pixel transfer in correct mode */
|
||||
if (alpha < 0xFF)
|
||||
{
|
||||
/* Set DMA2D mode */
|
||||
WRITE_REG(DMA2D->CR, DMA2D_M2M_BLEND | DMA2D_CR_START);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Set DMA2D mode */
|
||||
WRITE_REG(DMA2D->CR, DMA2D_M2M_PFC | DMA2D_CR_START);
|
||||
}
|
||||
}
|
||||
|
||||
void lineFromL8ARGB8888(uint16_t* const ptr, const uint8_t* const data, const unsigned count, const uint8_t alpha)
|
||||
{
|
||||
/* wait for DMA2D to finish last run */
|
||||
while ((READ_REG(DMA2D->CR) & DMA2D_CR_START) != 0U);
|
||||
|
||||
/* DMA2D OPFCCR register configuration */
|
||||
WRITE_REG(DMA2D->OPFCCR, DMA2D_OUTPUT_RGB565);
|
||||
|
||||
/* Configure DMA2D data size */
|
||||
WRITE_REG(DMA2D->NLR, (1 | (count << DMA2D_NLR_PL_Pos)));
|
||||
|
||||
/* Configure DMA2D destination address */
|
||||
WRITE_REG(DMA2D->OMAR, reinterpret_cast<uint32_t>(ptr));
|
||||
|
||||
/* Configure DMA2D source address */
|
||||
WRITE_REG(DMA2D->FGMAR, reinterpret_cast<uint32_t>(data));
|
||||
|
||||
/* Configure DMA2D Stream source2 address */
|
||||
WRITE_REG(DMA2D->BGMAR, reinterpret_cast<uint32_t>(ptr));
|
||||
|
||||
/* Load CLUT if not already loaded */
|
||||
if (L8ClutLoaded == 0)
|
||||
{
|
||||
/* Write foreground CLUT memory address */
|
||||
WRITE_REG(DMA2D->FGCMAR, reinterpret_cast<uint32_t>(&L8CLUT->data));
|
||||
|
||||
/* Set DMA2D color mode and alpha mode */
|
||||
WRITE_REG(DMA2D->FGPFCCR, DMA2D_INPUT_L8 | (DMA2D_COMBINE_ALPHA << DMA2D_BGPFCCR_AM_Pos) | (alpha << 24));
|
||||
|
||||
MODIFY_REG(DMA2D->FGPFCCR, (DMA2D_FGPFCCR_CS | DMA2D_FGPFCCR_CCM), (((L8CLUT->size - 1) << DMA2D_FGPFCCR_CS_Pos) | (DMA2D_CCM_ARGB8888 << DMA2D_FGPFCCR_CCM_Pos)));
|
||||
|
||||
/* Enable the CLUT loading for the foreground */
|
||||
SET_BIT(DMA2D->FGPFCCR, DMA2D_FGPFCCR_START);
|
||||
|
||||
/* Write DMA2D BGPFCCR register */
|
||||
WRITE_REG(DMA2D->BGPFCCR, DMA2D_INPUT_RGB565 | (DMA2D_NO_MODIF_ALPHA << DMA2D_BGPFCCR_AM_Pos));
|
||||
|
||||
/* Mark CLUT loaded */
|
||||
L8ClutLoaded = 1;
|
||||
|
||||
/* Wait for load to finish */
|
||||
while ((READ_REG(DMA2D->FGPFCCR) & DMA2D_FGPFCCR_START) != 0U);
|
||||
|
||||
/* Clear CLUT Transfer Complete flag */
|
||||
DMA2D->IFCR = (DMA2D_FLAG_CTC);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Set correct alpha for these pixels */
|
||||
MODIFY_REG(DMA2D->FGPFCCR, DMA2D_BGPFCCR_ALPHA_Msk, alpha << 24);
|
||||
}
|
||||
|
||||
/* Start pixel transfer in blending mode */
|
||||
WRITE_REG(DMA2D->CR, DMA2D_M2M_BLEND | DMA2D_CR_START);
|
||||
}
|
||||
|
||||
} // namespace rgb565
|
||||
} // namespace paint
|
||||
} // namespace touchgfx
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
165
TouchGFX/target/generated/STM32DMA.hpp
Normal file
165
TouchGFX/target/generated/STM32DMA.hpp
Normal file
@ -0,0 +1,165 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* File Name : STM32DMA.hpp
|
||||
******************************************************************************
|
||||
* This file is generated by TouchGFX Generator 4.21.2. Please, do not edit!
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2023 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef STM32DMA_HPP
|
||||
#define STM32DMA_HPP
|
||||
|
||||
#include <touchgfx/Bitmap.hpp>
|
||||
#include <touchgfx/hal/DMA.hpp>
|
||||
|
||||
/**
|
||||
* @class STM32DMA
|
||||
*
|
||||
* @brief This class specializes DMA_Interface for the STM32 processors.
|
||||
*
|
||||
* @sa touchgfx::DMA_Interface
|
||||
*/
|
||||
class STM32DMA : public touchgfx::DMA_Interface
|
||||
{
|
||||
/**
|
||||
* @typedef touchgfx::DMA_Interface Base
|
||||
*
|
||||
* @brief Defines an alias representing the base.
|
||||
*
|
||||
Defines an alias representing the base.
|
||||
*/
|
||||
typedef touchgfx::DMA_Interface Base;
|
||||
|
||||
public:
|
||||
/**
|
||||
* @fn STM32DMA::STM32DMA();
|
||||
*
|
||||
* @brief Default constructor.
|
||||
*
|
||||
* Default constructor.
|
||||
*/
|
||||
STM32DMA();
|
||||
|
||||
/**
|
||||
* @fn STM32DMA::~STM32DMA();
|
||||
*
|
||||
* @brief Destructor.
|
||||
*
|
||||
* Destructor.
|
||||
*/
|
||||
virtual ~STM32DMA();
|
||||
|
||||
/**
|
||||
* @fn DMAType touchgfx::STM32DMA::getDMAType()
|
||||
*
|
||||
* @brief Function for obtaining the DMA type of the concrete DMA_Interface implementation.
|
||||
*
|
||||
* Function for obtaining the DMA type of the concrete DMA_Interface implementation.
|
||||
* As default, will return DMA_TYPE_CHROMART type value.
|
||||
*
|
||||
* @return a DMAType value of the concrete DMA_Interface implementation.
|
||||
*/
|
||||
virtual touchgfx::DMAType getDMAType(void)
|
||||
{
|
||||
return touchgfx::DMA_TYPE_CHROMART;
|
||||
}
|
||||
|
||||
/**
|
||||
* @fn touchgfx::BlitOperations STM32DMA::getBlitCaps();
|
||||
*
|
||||
* @brief Gets the blit capabilities.
|
||||
*
|
||||
* Gets the blit capabilities.
|
||||
*
|
||||
* This DMA supports a range of blit caps: BLIT_OP_COPY, BLIT_OP_COPY_ARGB8888,
|
||||
* BLIT_OP_COPY_ARGB8888_WITH_ALPHA, BLIT_OP_COPY_A4, BLIT_OP_COPY_A8.
|
||||
*
|
||||
*
|
||||
* @return Currently supported blitcaps.
|
||||
*/
|
||||
virtual touchgfx::BlitOperations getBlitCaps();
|
||||
|
||||
/**
|
||||
* @fn void STM32DMA::initialize();
|
||||
*
|
||||
* @brief Perform hardware specific initialization.
|
||||
*
|
||||
* Perform hardware specific initialization.
|
||||
*/
|
||||
virtual void initialize();
|
||||
|
||||
/**
|
||||
* @fn void STM32DMA::signalDMAInterrupt()
|
||||
*
|
||||
* @brief Raises a DMA interrupt signal.
|
||||
*
|
||||
* Raises a DMA interrupt signal.
|
||||
*/
|
||||
virtual void signalDMAInterrupt()
|
||||
{
|
||||
executeCompleted();
|
||||
}
|
||||
|
||||
protected:
|
||||
/**
|
||||
* @fn virtual void STM32DMA::setupDataCopy(const touchgfx::BlitOp& blitOp);
|
||||
*
|
||||
* @brief Configures the DMA for copying data to the frame buffer.
|
||||
*
|
||||
* Configures the DMA for copying data to the frame buffer.
|
||||
*
|
||||
* @param blitOp Details on the copy to perform.
|
||||
*/
|
||||
virtual void setupDataCopy(const touchgfx::BlitOp& blitOp);
|
||||
|
||||
/**
|
||||
* @fn virtual void STM32DMA::setupDataFill(const touchgfx::BlitOp& blitOp);
|
||||
*
|
||||
* @brief Configures the DMA for "filling" the frame-buffer with a single color.
|
||||
*
|
||||
* Configures the DMA for "filling" the frame-buffer with a single color.
|
||||
*
|
||||
* @param blitOp Details on the "fill" to perform.
|
||||
*/
|
||||
virtual void setupDataFill(const touchgfx::BlitOp& blitOp);
|
||||
|
||||
private:
|
||||
touchgfx::LockFreeDMA_Queue dma_queue;
|
||||
touchgfx::BlitOp queue_storage[96];
|
||||
|
||||
/**
|
||||
* @fn void STM32DMA::getChromARTInputFormat()
|
||||
*
|
||||
* @brief Convert Bitmap format to ChromART Input format.
|
||||
*
|
||||
* @param format Bitmap format.
|
||||
*
|
||||
* @return ChromART Input format.
|
||||
*/
|
||||
|
||||
inline uint32_t getChromARTInputFormat(touchgfx::Bitmap::BitmapFormat format);
|
||||
|
||||
/**
|
||||
* @fn void STM32DMA::getChromARTOutputFormat()
|
||||
*
|
||||
* @brief Convert Bitmap format to ChromART Output format.
|
||||
*
|
||||
* @param format Bitmap format.
|
||||
*
|
||||
* @return ChromART Output format.
|
||||
*/
|
||||
inline uint32_t getChromARTOutputFormat(touchgfx::Bitmap::BitmapFormat format);
|
||||
};
|
||||
|
||||
#endif // STM32DMA_HPP
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
75
TouchGFX/target/generated/TouchGFXConfiguration.cpp
Normal file
75
TouchGFX/target/generated/TouchGFXConfiguration.cpp
Normal file
@ -0,0 +1,75 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* File Name : TouchGFXConfiguration.cpp
|
||||
******************************************************************************
|
||||
* This file is generated by TouchGFX Generator 4.21.2. Please, do not edit!
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2023 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <texts/TypedTextDatabase.hpp>
|
||||
#include <fonts/ApplicationFontProvider.hpp>
|
||||
#include <gui/common/FrontendHeap.hpp>
|
||||
#include <BitmapDatabase.hpp>
|
||||
#include <platform/driver/lcd/LCD16bpp.hpp>
|
||||
#include <STM32DMA.hpp>
|
||||
#include <TouchGFXHAL.hpp>
|
||||
#include <STM32TouchController.hpp>
|
||||
#include <stm32h7xx_hal.h>
|
||||
|
||||
extern "C" void touchgfx_init();
|
||||
extern "C" void touchgfx_taskEntry();
|
||||
extern "C" void touchgfx_components_init();
|
||||
|
||||
static STM32TouchController tc;
|
||||
static STM32DMA dma;
|
||||
static LCD16bpp display;
|
||||
static ApplicationFontProvider fontProvider;
|
||||
static Texts texts;
|
||||
static TouchGFXHAL hal(dma, display, tc, 320, 480);
|
||||
|
||||
void touchgfx_init()
|
||||
{
|
||||
Bitmap::registerBitmapDatabase(BitmapDatabase::getInstance(), BitmapDatabase::getInstanceSize());
|
||||
TypedText::registerTexts(&texts);
|
||||
Texts::setLanguage(0);
|
||||
|
||||
FontManager::setFontProvider(&fontProvider);
|
||||
|
||||
FrontendHeap& heap = FrontendHeap::getInstance();
|
||||
/*
|
||||
* we need to obtain the reference above to initialize the frontend heap.
|
||||
*/
|
||||
(void)heap;
|
||||
|
||||
/*
|
||||
* Initialize TouchGFX
|
||||
*/
|
||||
hal.initialize();
|
||||
}
|
||||
|
||||
void touchgfx_components_init()
|
||||
{
|
||||
}
|
||||
|
||||
void touchgfx_taskEntry()
|
||||
{
|
||||
/*
|
||||
* Main event loop. Will wait for VSYNC signal, and then process next frame. Call
|
||||
* this function from your GUI task.
|
||||
*
|
||||
* Note This function never returns
|
||||
*/
|
||||
hal.taskEntry();
|
||||
}
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
166
TouchGFX/target/generated/TouchGFXGeneratedHAL.cpp
Normal file
166
TouchGFX/target/generated/TouchGFXGeneratedHAL.cpp
Normal file
@ -0,0 +1,166 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* File Name : TouchGFXGeneratedHAL.cpp
|
||||
******************************************************************************
|
||||
* This file is generated by TouchGFX Generator 4.21.2. Please, do not edit!
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2023 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#include <TouchGFXGeneratedHAL.hpp>
|
||||
#include <touchgfx/hal/OSWrappers.hpp>
|
||||
#include <gui/common/FrontendHeap.hpp>
|
||||
#include <touchgfx/hal/GPIO.hpp>
|
||||
|
||||
#include "stm32h7xx.h"
|
||||
#include "stm32h7xx_hal_ltdc.h"
|
||||
|
||||
using namespace touchgfx;
|
||||
|
||||
namespace
|
||||
{
|
||||
static volatile bool refreshRequested = false;
|
||||
static uint16_t lcd_int_active_line;
|
||||
static uint16_t lcd_int_porch_line;
|
||||
}
|
||||
|
||||
void TouchGFXGeneratedHAL::initialize()
|
||||
{
|
||||
HAL::initialize();
|
||||
registerEventListener(*(Application::getInstance()));
|
||||
setFrameBufferStartAddresses((void*)0x24040000, (void*)0x240A0000, (void*)0);
|
||||
}
|
||||
|
||||
void TouchGFXGeneratedHAL::configureInterrupts()
|
||||
{
|
||||
NVIC_SetPriority(DMA2D_IRQn, 9);
|
||||
NVIC_SetPriority(LTDC_IRQn, 9);
|
||||
}
|
||||
|
||||
void TouchGFXGeneratedHAL::enableInterrupts()
|
||||
{
|
||||
NVIC_EnableIRQ(DMA2D_IRQn);
|
||||
NVIC_EnableIRQ(LTDC_IRQn);
|
||||
}
|
||||
|
||||
void TouchGFXGeneratedHAL::disableInterrupts()
|
||||
{
|
||||
NVIC_DisableIRQ(DMA2D_IRQn);
|
||||
NVIC_DisableIRQ(LTDC_IRQn);
|
||||
}
|
||||
|
||||
void TouchGFXGeneratedHAL::enableLCDControllerInterrupt()
|
||||
{
|
||||
lcd_int_active_line = (LTDC->BPCR & 0x7FF) - 1;
|
||||
lcd_int_porch_line = (LTDC->AWCR & 0x7FF) - 1;
|
||||
|
||||
/* Sets the Line Interrupt position */
|
||||
LTDC->LIPCR = lcd_int_active_line;
|
||||
/* Line Interrupt Enable */
|
||||
LTDC->IER |= LTDC_IER_LIE;
|
||||
}
|
||||
|
||||
bool TouchGFXGeneratedHAL::beginFrame()
|
||||
{
|
||||
return HAL::beginFrame();
|
||||
}
|
||||
|
||||
void TouchGFXGeneratedHAL::endFrame()
|
||||
{
|
||||
if (frameBufferUpdatedThisFrame)
|
||||
{
|
||||
refreshRequested = true;
|
||||
}
|
||||
HAL::endFrame();
|
||||
}
|
||||
|
||||
uint16_t* TouchGFXGeneratedHAL::getTFTFrameBuffer() const
|
||||
{
|
||||
return (uint16_t*)LTDC_Layer1->CFBAR;
|
||||
}
|
||||
|
||||
void TouchGFXGeneratedHAL::setTFTFrameBuffer(uint16_t* adr)
|
||||
{
|
||||
LTDC_Layer1->CFBAR = (uint32_t)adr;
|
||||
|
||||
/* Reload immediate */
|
||||
LTDC->SRCR = (uint32_t)LTDC_SRCR_IMR;
|
||||
}
|
||||
|
||||
void TouchGFXGeneratedHAL::flushFrameBuffer(const touchgfx::Rect& rect)
|
||||
{
|
||||
HAL::flushFrameBuffer(rect);
|
||||
}
|
||||
|
||||
bool TouchGFXGeneratedHAL::blockCopy(void* RESTRICT dest, const void* RESTRICT src, uint32_t numBytes)
|
||||
{
|
||||
return HAL::blockCopy(dest, src, numBytes);
|
||||
}
|
||||
|
||||
void TouchGFXGeneratedHAL::InvalidateCache()
|
||||
{
|
||||
// If the framebuffer is placed in Write Through cached memory (e.g. SRAM) then
|
||||
// the DCache must be flushed prior to DMA2D accessing it. That's done
|
||||
// using the function SCB_CleanInvalidateDCache(). Remember to enable "CPU Cache" in the
|
||||
// "System Core" settings for "Cortex M7" in CubeMX in order for this function call to work.
|
||||
if (SCB->CCR & SCB_CCR_DC_Msk)
|
||||
{
|
||||
SCB_CleanInvalidateDCache();
|
||||
}
|
||||
}
|
||||
|
||||
void TouchGFXGeneratedHAL::FlushCache()
|
||||
{
|
||||
// If the framebuffer is placed in Write Through cached memory (e.g. SRAM) then
|
||||
// the DCache must be flushed prior to DMA2D accessing it. That's done
|
||||
// using the function SCB_CleanInvalidateDCache(). Remember to enable "CPU Cache" in the
|
||||
// "System Core" settings for "Cortex M7" in CubeMX in order for this function call to work.
|
||||
if (SCB->CCR & SCB_CCR_DC_Msk)
|
||||
{
|
||||
SCB_CleanInvalidateDCache();
|
||||
}
|
||||
}
|
||||
|
||||
extern "C"
|
||||
{
|
||||
void HAL_LTDC_LineEventCallback(LTDC_HandleTypeDef* hltdc)
|
||||
{
|
||||
if (!HAL::getInstance())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (LTDC->LIPCR == lcd_int_active_line)
|
||||
{
|
||||
//entering active area
|
||||
HAL_LTDC_ProgramLineEvent(hltdc, lcd_int_porch_line);
|
||||
HAL::getInstance()->vSync();
|
||||
OSWrappers::signalVSync();
|
||||
|
||||
// Swap frame buffers immediately instead of waiting for the task to be scheduled in.
|
||||
// Note: task will also swap when it wakes up, but that operation is guarded and will not have
|
||||
// any effect if already swapped.
|
||||
HAL::getInstance()->swapFrameBuffers();
|
||||
GPIO::set(GPIO::VSYNC_FREQ);
|
||||
}
|
||||
else
|
||||
{
|
||||
//exiting active area
|
||||
HAL_LTDC_ProgramLineEvent(hltdc, lcd_int_active_line);
|
||||
|
||||
// Signal to the framework that display update has finished.
|
||||
HAL::getInstance()->frontPorchEntered();
|
||||
GPIO::clear(GPIO::VSYNC_FREQ);
|
||||
}
|
||||
}
|
||||
}
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
190
TouchGFX/target/generated/TouchGFXGeneratedHAL.hpp
Normal file
190
TouchGFX/target/generated/TouchGFXGeneratedHAL.hpp
Normal file
@ -0,0 +1,190 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* File Name : TouchGFXGeneratedHAL.hpp
|
||||
******************************************************************************
|
||||
* This file is generated by TouchGFX Generator 4.21.2. Please, do not edit!
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2023 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
#ifndef TouchGFXGeneratedHAL_HPP
|
||||
#define TouchGFXGeneratedHAL_HPP
|
||||
|
||||
#include <touchgfx/hal/HAL.hpp>
|
||||
|
||||
/**
|
||||
* @class TouchGFXGeneratedHAL
|
||||
*
|
||||
* @brief HAL implementation for TouchGFXGenerated.
|
||||
*
|
||||
* @sa HAL
|
||||
*/
|
||||
class TouchGFXGeneratedHAL : public touchgfx::HAL
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* @fn TouchGFXGeneratedHAL::TouchGFXGeneratedHAL(touchgfx::DMA_Interface& dma, touchgfx::LCD& display, touchgfx::TouchController& tc, uint16_t width, uint16_t height) : touchgfx::HAL(dma, display, tc, width, height)
|
||||
*
|
||||
* @brief Constructor.
|
||||
*
|
||||
* Constructor. Initializes members.
|
||||
*
|
||||
* @param [in,out] dma Reference to DMA interface.
|
||||
* @param [in,out] display Reference to LCD interface.
|
||||
* @param [in,out] tc Reference to Touch Controller driver.
|
||||
* @param width Width of the display.
|
||||
* @param height Height of the display.
|
||||
*/
|
||||
TouchGFXGeneratedHAL(touchgfx::DMA_Interface& dma, touchgfx::LCD& display, touchgfx::TouchController& tc, uint16_t width, uint16_t height) :
|
||||
touchgfx::HAL(dma, display, tc, width, height)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @fn void TouchGFXGeneratedHAL::initialize();
|
||||
*
|
||||
* @brief This function is responsible for initializing the entire framework.
|
||||
*
|
||||
* This function is responsible for initializing the entire framework.
|
||||
*/
|
||||
virtual void initialize();
|
||||
|
||||
/**
|
||||
* @fn virtual void TouchGFXGeneratedHAL::configureInterrupts();
|
||||
*
|
||||
* @brief Sets the DMA and LCD interrupt priorities.
|
||||
*
|
||||
* Sets the DMA and LCD interrupt priorities.
|
||||
*/
|
||||
virtual void configureInterrupts();
|
||||
|
||||
/**
|
||||
* @fn virtual void TouchGFXGeneratedHAL::enableInterrupts();
|
||||
*
|
||||
* @brief Enables the DMA and LCD interrupts.
|
||||
*
|
||||
* Enables the DMA and LCD interrupts.
|
||||
*/
|
||||
virtual void enableInterrupts();
|
||||
|
||||
/**
|
||||
* @fn virtual void TouchGFXGeneratedHAL::disableInterrupts();
|
||||
*
|
||||
* @brief Disables the DMA and LCD interrupts.
|
||||
*
|
||||
* Disables the DMA and LCD interrupts.
|
||||
*/
|
||||
virtual void disableInterrupts();
|
||||
|
||||
/**
|
||||
* @fn virtual void TouchGFXGeneratedHAL::enableLCDControllerInterrupt();
|
||||
*
|
||||
* @brief Configure the LCD controller to fire interrupts at VSYNC.
|
||||
*
|
||||
* Configure the LCD controller to fire interrupts at VSYNC. Called automatically
|
||||
* once TouchGFX initialization has completed.
|
||||
*/
|
||||
virtual void enableLCDControllerInterrupt();
|
||||
|
||||
/**
|
||||
* @fn virtual void TouchGFXGeneratedHAL::flushFrameBuffer();
|
||||
*
|
||||
* @brief This function is called whenever the framework has performed a complete draw.
|
||||
*
|
||||
* This specialization is only in place to keep compilers happy. Base impl. will call the
|
||||
* Rect version.
|
||||
* @see HAL::flushFrameBuffer
|
||||
*/
|
||||
virtual void flushFrameBuffer()
|
||||
{
|
||||
HAL::flushFrameBuffer();
|
||||
}
|
||||
|
||||
/**
|
||||
* @fn virtual void TouchGFXGeneratedHAL::flushFrameBuffer(const touchgfx::Rect& rect);
|
||||
*
|
||||
* @brief This function is called whenever the framework has performed a partial draw.
|
||||
*
|
||||
* This function is called whenever the framework has performed a partial draw.
|
||||
* On the STM32F7, make sure to clean and invalidate the data cache. This is to
|
||||
* ensure that LTDC sees correct data when transferring to the display.
|
||||
*
|
||||
* @param rect The area of the screen that has been drawn, expressed in absolute coordinates.
|
||||
*
|
||||
* @see flushFrameBuffer().
|
||||
*/
|
||||
virtual void flushFrameBuffer(const touchgfx::Rect& rect);
|
||||
|
||||
/**
|
||||
*
|
||||
* @fn virtual void TouchGFXGeneratedHAL::blockCopy();
|
||||
*
|
||||
* This function performs a platform-specific memcpy, if supported by the hardware.
|
||||
*
|
||||
* @param [out] dest Pointer to destination memory.
|
||||
* @param [in] src Pointer to source memory.
|
||||
* @param numBytes Number of bytes to copy.
|
||||
*
|
||||
* @return true if the copy succeeded, false if copy was not performed.
|
||||
*/
|
||||
virtual bool blockCopy(void* RESTRICT dest, const void* RESTRICT src, uint32_t numBytes);
|
||||
|
||||
/**
|
||||
* @fn virtual void TouchGFXGeneratedHAL::beginFrame();
|
||||
*
|
||||
* @brief Called when beginning to rendering a frame.
|
||||
*
|
||||
* Called when beginning to rendering a frame.
|
||||
*
|
||||
* @return true if rendering can begin, false otherwise.
|
||||
*/
|
||||
virtual bool beginFrame();
|
||||
|
||||
/**
|
||||
* @fn virtual void TouchGFXGeneratedHAL::endFrame();
|
||||
*
|
||||
* @brief Called when a rendering pass is completed.
|
||||
*
|
||||
* Called when a rendering pass is completed.
|
||||
*/
|
||||
virtual void endFrame();
|
||||
|
||||
protected:
|
||||
/**
|
||||
* @fn virtual uint16_t* TouchGFXGeneratedHAL::getTFTFrameBuffer() const;
|
||||
*
|
||||
* @brief Gets the frame buffer address used by the TFT controller.
|
||||
*
|
||||
* Gets the frame buffer address used by the TFT controller.
|
||||
*
|
||||
* @return The address of the frame buffer currently being displayed on the TFT.
|
||||
*/
|
||||
virtual uint16_t* getTFTFrameBuffer() const;
|
||||
|
||||
/**
|
||||
* @fn virtual void TouchGFXGeneratedHAL::setTFTFrameBuffer(uint16_t* adr);
|
||||
*
|
||||
* @brief Sets the frame buffer address used by the TFT controller.
|
||||
*
|
||||
* Sets the frame buffer address used by the TFT controller.
|
||||
*
|
||||
* @param [in,out] adr New frame buffer address.
|
||||
*/
|
||||
virtual void setTFTFrameBuffer(uint16_t* adr);
|
||||
|
||||
virtual void InvalidateCache();
|
||||
|
||||
virtual void FlushCache();
|
||||
|
||||
};
|
||||
#endif // TouchGFXGeneratedHAL_HPP
|
||||
|
||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||
Reference in New Issue
Block a user