UG_DriverRegister()

Функция регистрирует драйвер 2D акселерации

Прототип:

#include <ugui.h>
void UG_DriverRegister( UG_U8 type, void *driver );

Аргументы:

type
Тип драйвера
driver
Указатель на функцию драйвера

Библиотека:

ugui

Пример использования:

/* Hardware accelerator for UG_DrawLine( Platform: STM32F4x9 ) */
UG_RESULT _HW_DrawLine( void *ctx, UG_S16 x1, UG_S16 y1, UG_S16 x2, UG_S16 y2, UG_COLOR c )
{
DMA2D_InitTypeDef DMA2D_InitStruct;
RCC_AHB1PeriphResetCmd( RCC_AHB1Periph_DMA2D, ENABLE );
RCC_AHB1PeriphResetCmd( RCC_AHB1Periph_DMA2D, DISABLE );
DMA2D_InitStruct.DMA2D_Mode = DMA2D_R2M;
DMA2D_InitStruct.DMA2D_CMode = DMA2D_RGB565;
/* Convert UG_COLOR to RGB565 */
DMA2D_InitStruct.DMA2D_OutputBlue = (c >> 3) & 0x1F;
DMA2D_InitStruct.DMA2D_OutputGreen = (c >> 10) & 0x3F;
DMA2D_InitStruct.DMA2D_OutputRed = (c >> 19) & 0x1F;
DMA2D_InitStruct.DMA2D_OutputAlpha = 0x0F;
/* Horizontal line */
if ( y1 == y2 )
{
DMA2D_InitStruct.DMA2D_OutputOffset = 0;
DMA2D_InitStruct.DMA2D_NumberOfLine = 1;
DMA2D_InitStruct.DMA2D_PixelPerLine = x2 - x1 + 1;
}
/* Vertical line */
else if ( x1 == x2 )
{
DMA2D_InitStruct.DMA2D_OutputOffset = LCD PIXEL WIDTH
DMA2D_InitStruct.DMA2D_NumberOfLine = y2 - y1 + 1;
DMA2D_InitStruct.DMA2D_PixelPerLine = 1;
} else
return UG_RESULT_FAIL;
if ( ltdc_work_layer == LAYER_1 )
DMA2D_InitStruct.DMA2D_OutputMemoryAdd = SDRAM_BANK_ADDR + LAYER_1_OFFSET + 2 * (LCD_PIXEL_WIDTH * y1 + x1);
else
DMA2D_InitStruct.DMA2D_OutputMemoryAdd = SDRAM_BANK_ADDR + LAYER_2_OFFSET + 2 * (LCD_PIXEL_WIDTH * y1 + x1);
DMA2D_Init( &DMA2D_InitStruct );
DMA2D_StartTransfer();
while ( DMA2D_GetFlagStatus( DMA2D_FLAG_TC ) == RESET ) {};
return UG_RESULT_OK;
}
/* Hardware accelerator for UG_FillFrame( Platform : STM32F4x9 ) */
UG_RESULT _HW_FillFrame( void *ctx, UG_S16 x1, UG_S16 y1, UG_S16 x2, UG_S16 y2, UG_COLOR c )
{
DMA2D_InitTypeDef DMA2D_InitStruct;
DMA2D_DeInit() ;
DMA2D_InitStruct.DMA2D_Mode = DMA2D_R2M;
DMA2D_InitStruct.DMA2D_CMode = DMA2D_RGB565;
/* Convert UG_COLOR to RGB565 */
DMA2D_InitStruct.DMA2D_OutputBlue = (c >> 3) & 0x1F;
DMA2D_InitStruct.DMA2D_OutputGreen = (c >> 10) & 0x3F;
DMA2D_InitStruct.DMA2D_OutputRed = (c >> 19) & 0x1F;
DMA2D_InitStruct.DMA2D_OutputAlpha = 0x0F;
DMA2D_InitStruct.DMA2D_OutputOffset = (LCD_PIXEL_WIDTH - (x2 - x1 + 1));
DMA2D_InitStruct.DMA2D_NumberOfLine = y2 - y1 + 1;
DMA2D_InitStruct.DMA2D_PixelPerLine = x2 - x1 + 1;
if ( ltdc_work_layer == LAYER_1 )
DMA2D_InitStruct.DMA2D_OutputMemoryAdd = SDRAM_BANK_ADDR + LAYER_1_OFFSET + 2 * (LCD_PIXEL_WIDTH * y1 + x1);
else
DMA2D_InitStruct.DMA2D_OutputMemoryAdd = SDRAM_BANK_ADDR + LAYER_2_OFFSET + 2 * (LCD_PIXEL_WIDTH * y1 + x1);
DMA2D_Init( &DMA2D_InitStruct );
DMA2D_StartTransfer();
while ( DMA2D_GetFlagStatus( DMA2D_FLAG_TC ) == RESET ) {};
return UG_RESULT_OK;
}
int main( void )
{
// ...
/* Unleash the performance of the STM32 */
UG_DriverRegister( DRIVER_DRAW_LINE, (void *)_HW_DrawLine );
UG_DriverRegister( DRIVER_FILL_FRAME, (void *)_HW_FillFrame );
// . . .
}




Предыдущий раздел: Особенности 2D акселерации