Adapting MD380 display driver to uC/OS-III, making little code reorganisation and embedding endianness reordering into display_render()
This commit is contained in:
parent
f4ca5ca025
commit
bdb59a3ff9
|
|
@ -18,6 +18,8 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <os.h>
|
||||||
#include "gpio.h"
|
#include "gpio.h"
|
||||||
#include "display.h"
|
#include "display.h"
|
||||||
#include "delays.h"
|
#include "delays.h"
|
||||||
|
|
@ -110,8 +112,10 @@ static uint16_t *frameBuffer;
|
||||||
|
|
||||||
void __attribute__((used)) DMA2_Stream7_IRQHandler()
|
void __attribute__((used)) DMA2_Stream7_IRQHandler()
|
||||||
{
|
{
|
||||||
|
OSIntEnter();
|
||||||
DMA2->HIFCR |= DMA_HIFCR_CTCIF7 | DMA_HIFCR_CTEIF7; /* Clear flags */
|
DMA2->HIFCR |= DMA_HIFCR_CTCIF7 | DMA_HIFCR_CTEIF7; /* Clear flags */
|
||||||
gpio_setPin(CS);
|
gpio_setPin(CS);
|
||||||
|
OSIntExit();
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline __attribute__((__always_inline__)) void writeCmd(uint8_t cmd)
|
static inline __attribute__((__always_inline__)) void writeCmd(uint8_t cmd)
|
||||||
|
|
@ -126,14 +130,20 @@ static inline __attribute__((__always_inline__)) void writeData(uint8_t val)
|
||||||
|
|
||||||
void display_init()
|
void display_init()
|
||||||
{
|
{
|
||||||
|
/* Framebuffer size, in bytes */
|
||||||
|
const size_t fbSize = SCREEN_WIDTH * SCREEN_HEIGHT * sizeof(uint16_t);
|
||||||
|
|
||||||
/* Allocate framebuffer, two bytes per pixel */
|
/* Allocate framebuffer, two bytes per pixel */
|
||||||
frameBuffer = (uint16_t *) malloc(SCREEN_WIDTH * SCREEN_HEIGHT * 2);
|
frameBuffer = (uint16_t *) malloc(fbSize);
|
||||||
if(frameBuffer == NULL)
|
if(frameBuffer == NULL)
|
||||||
{
|
{
|
||||||
printf("*** LCD ERROR: cannot allocate framebuffer! ***");
|
printf("*** LCD ERROR: cannot allocate framebuffer! ***");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Clear framebuffer, setting all pixels to 0xFFFF makes the screen white */
|
||||||
|
memset(frameBuffer, 0xFF, fbSize);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Configure TIM8 for backlight PWM: Fpwm = 100kHz, 8 bit of resolution
|
* Configure TIM8 for backlight PWM: Fpwm = 100kHz, 8 bit of resolution
|
||||||
* APB2 freq. is 84MHz, then: PSC = 327 to have Ftick = 256.097kHz
|
* APB2 freq. is 84MHz, then: PSC = 327 to have Ftick = 256.097kHz
|
||||||
|
|
@ -383,7 +393,6 @@ void display_setBacklightLevel(uint8_t level)
|
||||||
|
|
||||||
void display_renderRows(uint8_t startRow, uint8_t endRow)
|
void display_renderRows(uint8_t startRow, uint8_t endRow)
|
||||||
{
|
{
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Put screen data lines back to alternate function mode, since they are in
|
* Put screen data lines back to alternate function mode, since they are in
|
||||||
* common with keyboard buttons and the keyboard driver sets them as inputs.
|
* common with keyboard buttons and the keyboard driver sets them as inputs.
|
||||||
|
|
@ -398,6 +407,18 @@ void display_renderRows(uint8_t startRow, uint8_t endRow)
|
||||||
|
|
||||||
gpio_clearPin(CS);
|
gpio_clearPin(CS);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* First of all, convert all pixels from little to big endian, for
|
||||||
|
* compatibility with the display driver. We do this after having brought
|
||||||
|
* the CS pin low, in this way user code calling the renderingInProgress
|
||||||
|
* function gets true as return value and does not stomp our work.
|
||||||
|
*/
|
||||||
|
for(size_t i = 0; i < SCREEN_HEIGHT * SCREEN_WIDTH; i++)
|
||||||
|
{
|
||||||
|
uint16_t pixel = frameBuffer[i];
|
||||||
|
frameBuffer[i] = __builtin_bswap16(pixel);
|
||||||
|
}
|
||||||
|
|
||||||
/* Configure start and end rows in display driver */
|
/* Configure start and end rows in display driver */
|
||||||
writeCmd(CMD_RASET);
|
writeCmd(CMD_RASET);
|
||||||
writeData(0x00);
|
writeData(0x00);
|
||||||
|
|
@ -414,8 +435,9 @@ void display_renderRows(uint8_t startRow, uint8_t endRow)
|
||||||
* we have to set the transfer size to twice the framebuffer size, since
|
* we have to set the transfer size to twice the framebuffer size, since
|
||||||
* this one is made of 16 bit variables.
|
* this one is made of 16 bit variables.
|
||||||
*/
|
*/
|
||||||
DMA2_Stream7->NDTR = (endRow - startRow)*SCREEN_WIDTH*2;
|
DMA2_Stream7->NDTR = (endRow - startRow) * SCREEN_WIDTH * sizeof(uint16_t);
|
||||||
DMA2_Stream7->PAR = ((uint32_t ) frameBuffer + (startRow*SCREEN_WIDTH*2));
|
DMA2_Stream7->PAR = ((uint32_t ) frameBuffer + (startRow * SCREEN_WIDTH
|
||||||
|
* sizeof(uint16_t)));
|
||||||
DMA2_Stream7->M0AR = LCD_FSMC_ADDR_DATA;
|
DMA2_Stream7->M0AR = LCD_FSMC_ADDR_DATA;
|
||||||
DMA2_Stream7->CR = DMA_SxCR_CHSEL /* Channel 7 */
|
DMA2_Stream7->CR = DMA_SxCR_CHSEL /* Channel 7 */
|
||||||
| DMA_SxCR_PL_0 /* Medium priority */
|
| DMA_SxCR_PL_0 /* Medium priority */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue