The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.
Dependents: hello SerialTestv11 SerialTestv12 Sierpinski ... more
mbed 2
This is the mbed 2 library. If you'd like to learn about Mbed OS please see the mbed-os docs.
Diff: TARGET_LPC546XX/TOOLCHAIN_GCC_ARM/fsl_lcdc.h
- Revision:
- 171:3a7713b1edbc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TARGET_LPC546XX/TOOLCHAIN_GCC_ARM/fsl_lcdc.h Thu Nov 08 11:45:42 2018 +0000 @@ -0,0 +1,612 @@ +/* + * The Clear BSD License + * Copyright (c) 2016, Freescale Semiconductor, Inc. + * Copyright 2016-2017 NXP + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted (subject to the limitations in the disclaimer below) provided + * that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE. + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __FSL_LCDC_H__ +#define __FSL_LCDC_H__ + +#include "fsl_common.h" + +/*! + * @addtogroup lpc_lcdc + * @{ + */ + +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/*! @name Driver version */ +/*@{*/ +/*! @brief LCDC driver version 2.0.0. */ +#define LPC_LCDC_DRIVER_VERSION (MAKE_VERSION(2, 0, 0)) +/*@}*/ + +/*!@brief How many hardware cursors supports. */ +#define LCDC_CURSOR_COUNT 4 + +/*!@brief LCD cursor image bits per pixel. */ +#define LCDC_CURSOR_IMG_BPP 2 + +/*!@brief LCD 32x32 cursor image size in word(32-bit). */ +#define LCDC_CURSOR_IMG_32X32_WORDS (32 * 32 * LCDC_CURSOR_IMG_BPP / (8 * sizeof(uint32_t))) + +/*!@brief LCD 64x64 cursor image size in word(32-bit). */ +#define LCDC_CURSOR_IMG_64X64_WORDS (64 * 64 * LCDC_CURSOR_IMG_BPP / (8 * sizeof(uint32_t))) + +/*!@brief LCD palette size in words(32-bit). */ +#define LCDC_PALETTE_SIZE_WORDS (ARRAY_SIZE(((LCD_Type *)0)->PAL)) + +/*! + * @brief LCD sigal polarity flags. + */ +enum _lcdc_polarity_flags +{ + kLCDC_InvertVsyncPolarity = LCD_POL_IVS_MASK, /*!< Invert the VSYNC polarity, set to active low. */ + kLCDC_InvertHsyncPolarity = LCD_POL_IHS_MASK, /*!< Invert the HSYNC polarity, set to active low. */ + kLCDC_InvertClkPolarity = LCD_POL_IPC_MASK, /*!< Invert the panel clock polarity, set to + drive data on falling edge. */ + kLCDC_InvertDePolarity = LCD_POL_IOE_MASK, /*!< Invert the data enable (DE) polarity, set to active low. */ +}; + +/*! + * @brief LCD bits per pixel. + */ +typedef enum _lcdc_bpp +{ + kLCDC_1BPP = 0U, /*!< 1 bpp. */ + kLCDC_2BPP = 1U, /*!< 2 bpp. */ + kLCDC_4BPP = 2U, /*!< 4 bpp. */ + kLCDC_8BPP = 3U, /*!< 8 bpp. */ + kLCDC_16BPP = 4U, /*!< 16 bpp. */ + kLCDC_24BPP = 5U, /*!< 24 bpp, TFT panel only. */ + kLCDC_16BPP565 = 6U, /*!< 16 bpp, 5:6:5 mode. */ + kLCDC_12BPP = 7U, /*!< 12 bpp, 4:4:4 mode. */ +} lcdc_bpp_t; + +/*! + * @brief The types of display panel. + */ +typedef enum _lcdc_display +{ + kLCDC_DisplayTFT = LCD_CTRL_LCDTFT_MASK, /*!< Active matrix TFT panels with up to 24-bit bus interface. */ + kLCDC_DisplaySingleMonoSTN4Bit = LCD_CTRL_LCDBW_MASK, /*!< Single-panel monochrome STN (4-bit bus interface). */ + kLCDC_DisplaySingleMonoSTN8Bit = + LCD_CTRL_LCDBW_MASK | LCD_CTRL_LCDMONO8_MASK, /*!< Single-panel monochrome STN (8-bit bus interface). */ + kLCDC_DisplayDualMonoSTN4Bit = + LCD_CTRL_LCDBW_MASK | LCD_CTRL_LCDDUAL_MASK, /*!< Dual-panel monochrome STN (4-bit bus interface). */ + kLCDC_DisplayDualMonoSTN8Bit = LCD_CTRL_LCDBW_MASK | LCD_CTRL_LCDMONO8_MASK | + LCD_CTRL_LCDDUAL_MASK, /*!< Dual-panel monochrome STN (8-bit bus interface). */ + kLCDC_DisplaySingleColorSTN8Bit = 0U, /*!< Single-panel color STN (8-bit bus interface). */ + kLCDC_DisplayDualColorSTN8Bit = LCD_CTRL_LCDDUAL_MASK, /*!< Dual-panel coor STN (8-bit bus interface). */ +} lcdc_display_t; + +/*! + * @brief LCD panel buffer data format. + */ +typedef enum _lcdc_data_format +{ + kLCDC_LittleEndian = 0U, /*!< Little endian byte, little endian pixel. */ + kLCDC_BigEndian = LCD_CTRL_BEPO_MASK | LCD_CTRL_BEBO_MASK, /*!< Big endian byte, big endian pixel. */ + kLCDC_WinCeMode = LCD_CTRL_BEPO_MASK, /*!< little-endian byte, big-endian pixel for Windows CE mode. */ +} lcdc_data_format_t; + +/*! + * @brief LCD configuration structure. + */ +typedef struct _lcdc_config +{ + uint32_t panelClock_Hz; /*!< Panel clock in Hz. */ + uint16_t ppl; /*!< Pixels per line, it must could be divided by 16. */ + uint8_t hsw; /*!< HSYNC pulse width. */ + uint8_t hfp; /*!< Horizontal front porch. */ + uint8_t hbp; /*!< Horizontal back porch. */ + uint16_t lpp; /*!< Lines per panal. */ + uint8_t vsw; /*!< VSYNC pulse width. */ + uint8_t vfp; /*!< Vrtical front porch. */ + uint8_t vbp; /*!< Vertical back porch. */ + uint8_t acBiasFreq; /*!< The number of line clocks between AC bias pin toggling. Only used for STN display. */ + uint16_t polarityFlags; /*!< OR'ed value of @ref _lcdc_polarity_flags, used to contol the signal polarity. */ + bool enableLineEnd; /*!< Enable line end or not, the line end is a positive pulse with 4 panel clock. */ + uint8_t lineEndDelay; /*!< The panel clocks between the last pixel of line and the start of line end. */ + uint32_t upperPanelAddr; /*!< LCD upper panel base address, must be double-word(64-bit) align. */ + uint32_t lowerPanelAddr; /*!< LCD lower panel base address, must be double-word(64-bit) align. */ + lcdc_bpp_t bpp; /*!< LCD bits per pixel. */ + lcdc_data_format_t dataFormat; /*!< Data format. */ + bool swapRedBlue; /*!< Set true to use BGR format, set false to choose RGB format. */ + lcdc_display_t display; /*!< The display type. */ +} lcdc_config_t; + +/*! + * @brief LCD vertical compare interrupt mode. + */ +typedef enum _lcdc_vertical_compare_interrupt_mode +{ + kLCDC_StartOfVsync, /*!< Generate vertical compare interrupt at start of VSYNC. */ + kLCDC_StartOfBackPorch, /*!< Generate vertical compare interrupt at start of back porch. */ + kLCDC_StartOfActiveVideo, /*!< Generate vertical compare interrupt at start of active video. */ + kLCDC_StartOfFrontPorch, /*!< Generate vertical compare interrupt at start of front porch. */ +} lcdc_vertical_compare_interrupt_mode_t; + +/*! + * @brief LCD interrupts. + */ +enum _lcdc_interrupts +{ + kLCDC_CursorInterrupt = LCD_CRSR_INTMSK_CRSRIM_MASK, /*!< Cursor image read finished interrupt. */ + kLCDC_FifoUnderflowInterrupt = LCD_INTMSK_FUFIM_MASK, /*!< FIFO underflow interrupt. */ + kLCDC_BaseAddrUpdateInterrupt = LCD_INTMSK_LNBUIM_MASK, /*!< Panel frame base address update interrupt. */ + kLCDC_VerticalCompareInterrupt = LCD_INTMSK_VCOMPIM_MASK, /*!< Vertical compare interrupt. */ + kLCDC_AhbErrorInterrupt = LCD_INTMSK_BERIM_MASK, /*!< AHB master error interrupt. */ +}; + +/*! + * @brief LCD panel frame. + */ +typedef enum _lcdc_panel +{ + kLCDC_UpperPanel, /*!< Upper panel frame. */ + kLCDC_LowerPanel /*!< Lower panel frame. */ +} lcdc_panel_t; + +/*! + * @brief LCD hardware cursor size + */ +typedef enum _lcdc_cursor_size +{ + kLCDC_CursorSize32, /*!< 32x32 pixel cursor. */ + kLCDC_CursorSize64, /*!< 64x64 pixel cursor. */ +} lcdc_cursor_size_t; + +/*! + * @brief LCD hardware cursor palette + */ +typedef struct _lcdc_cursor_palette +{ + uint8_t red; /*!< Red color component. */ + uint8_t green; /*!< Red color component. */ + uint8_t blue; /*!< Red color component. */ +} lcdc_cursor_palette_t; + +/*! + * @brief LCD hardware cursor frame synchronization mode. + */ +typedef enum _lcdc_cursor_sync_mode +{ + kLCDC_CursorAsync, /*!< Cursor change will be displayed immediately. */ + kLCDC_CursorSync, /*!< Cursor change will be displayed in next frame. */ +} lcdc_cursor_sync_mode_t; + +/*! + * @brief LCD hardware cursor configuration structure. + */ +typedef struct _lcdc_cursor_config +{ + lcdc_cursor_size_t size; /*!< Cursor size. */ + lcdc_cursor_sync_mode_t syncMode; /*!< Cursor synchronization mode. */ + lcdc_cursor_palette_t palette0; /*!< Cursor palette 0. */ + lcdc_cursor_palette_t palette1; /*!< Cursor palette 1. */ + uint32_t *image[LCDC_CURSOR_COUNT]; /*!< Pointer to cursor image data. */ +} lcdc_cursor_config_t; + +#if defined(__cplusplus) +extern "C" { +#endif + +/******************************************************************************* + * API + ******************************************************************************/ + +/*! + * @name Initialization and Deinitialization + * @{ + */ + +/*! + * @brief Initialize the LCD module. + * + * @param base LCD peripheral base address. + * @param config Pointer to configuration structure, see to @ref lcdc_config_t. + * @param srcClock_Hz The LCD input clock (LCDCLK) frequency in Hz. + * @retval kStatus_Success LCD is initialized successfully. + * @retval kStatus_InvalidArgument Initlialize failed because of invalid argument. + */ +status_t LCDC_Init(LCD_Type *base, const lcdc_config_t *config, uint32_t srcClock_Hz); + +/*! + * @brief Deinitialize the LCD module. + * + * @param base LCD peripheral base address. + */ +void LCDC_Deinit(LCD_Type *base); + +/*! + * @brief Gets default pre-defined settings for initial configuration. + * + * This function initializes the configuration structure. The default values are: + * + @code + config->panelClock_Hz = 0U; + config->ppl = 0U; + config->hsw = 0U; + config->hfp = 0U; + config->hbp = 0U; + config->lpp = 0U; + config->vsw = 0U; + config->vfp = 0U; + config->vbp = 0U; + config->acBiasFreq = 1U; + config->polarityFlags = 0U; + config->enableLineEnd = false; + config->lineEndDelay = 0U; + config->upperPanelAddr = 0U; + config->lowerPanelAddr = 0U; + config->bpp = kLCDC_1BPP; + config->dataFormat = kLCDC_LittleEndian; + config->swapRedBlue = false; + config->display = kLCDC_DisplayTFT; + @endcode + * + * @param config Pointer to configuration structure. + */ +void LCDC_GetDefaultConfig(lcdc_config_t *config); + +/* @} */ + +/*! + * @name Start and stop + * @{ + */ + +/*! + * @brief Start to output LCD timing signal. + * + * The LCD power up sequence should be: + * 1. Apply power to LCD, here all output signals are held low. + * 2. When LCD power stablized, call @ref LCDC_Start to output the timing signals. + * 3. Apply contrast voltage to LCD panel. Delay if the display requires. + * 4. Call @ref LCDC_PowerUp. + * + * @param base LCD peripheral base address. + */ +static inline void LCDC_Start(LCD_Type *base) +{ + base->CTRL |= LCD_CTRL_LCDEN_MASK; +} + +/*! + * @brief Stop the LCD timing signal. + * + * The LCD power down sequence should be: + * 1. Call @ref LCDC_PowerDown. + * 2. Delay if the display requires. Disable contrast voltage to LCD panel. + * 3. Call @ref LCDC_Stop to disable the timing signals. + * 4. Disable power to LCD. + * + * @param base LCD peripheral base address. + */ +static inline void LCDC_Stop(LCD_Type *base) +{ + base->CTRL &= ~LCD_CTRL_LCDEN_MASK; +} + +/*! + * @brief Power up the LCD and output the pixel signal. + * + * @param base LCD peripheral base address. + */ +static inline void LCDC_PowerUp(LCD_Type *base) +{ + base->CTRL |= LCD_CTRL_LCDPWR_MASK; +} + +/*! + * @brief Power down the LCD and disable the output pixel signal. + * + * @param base LCD peripheral base address. + */ +static inline void LCDC_PowerDown(LCD_Type *base) +{ + base->CTRL &= ~LCD_CTRL_LCDPWR_MASK; +} + +/* @} */ + +/*! + * @name LCD control + * @{ + */ + +/*! + * @brief Sets panel frame base address + * + * @param base LCD peripheral base address. + * @param panel Which panel to set. + * @param addr Frame base address, must be doubleword(64-bit) aligned. + */ +void LCDC_SetPanelAddr(LCD_Type *base, lcdc_panel_t panel, uint32_t addr); + +/*! + * @brief Sets palette + * + * @param base LCD peripheral base address. + * @param palette Pointer to the palette array. + * @param count_words Length of the palette array to set (how many words), it should + * not be larger than LCDC_PALETTE_SIZE_WORDS. + */ +void LCDC_SetPalette(LCD_Type *base, const uint32_t *palette, uint8_t count_words); + +/* @} */ + +/*! + * @name Interrupts + * @{ + */ + +/*! + * @brief Sets the vertical compare interrupt mode. + * + * @param base LCD peripheral base address. + * @param mode The vertical compare interrupt mode. + */ +static inline void LCDC_SetVerticalInterruptMode(LCD_Type *base, lcdc_vertical_compare_interrupt_mode_t mode) +{ + base->CTRL = (base->CTRL & ~LCD_CTRL_LCDVCOMP_MASK) | LCD_CTRL_LCDVCOMP(mode); +} + +/*! + * @brief Enable LCD interrupts. + * + * Example to enable LCD base address update interrupt and vertical compare + * interrupt: + * + * @code + LCDC_EnableInterrupts(LCD, kLCDC_BaseAddrUpdateInterrupt | kLCDC_VerticalCompareInterrupt); + @endcode + * + * @param base LCD peripheral base address. + * @param mask Interrupts to enable, it is OR'ed value of @ref _lcdc_interrupts. + */ +void LCDC_EnableInterrupts(LCD_Type *base, uint32_t mask); + +/*! + * @brief Disable LCD interrupts. + * + * Example to disable LCD base address update interrupt and vertical compare + * interrupt: + * + * @code + LCDC_DisableInterrupts(LCD, kLCDC_BaseAddrUpdateInterrupt | kLCDC_VerticalCompareInterrupt); + @endcode + * + * @param base LCD peripheral base address. + * @param mask Interrupts to disable, it is OR'ed value of @ref _lcdc_interrupts. + */ +void LCDC_DisableInterrupts(LCD_Type *base, uint32_t mask); + +/*! + * @brief Get LCD interrupt pending status. + * + * Example: + * + * @code + uint32_t status; + + status = LCDC_GetInterruptsPendingStatus(LCD); + + if (kLCDC_BaseAddrUpdateInterrupt & status) + { + // LCD base address update interrupt occurred. + } + + if (kLCDC_VerticalCompareInterrupt & status) + { + // LCD vertical compare interrupt occurred. + } + @endcode + * + * @param base LCD peripheral base address. + * @return Interrupts pending status, it is OR'ed value of @ref _lcdc_interrupts. + */ +uint32_t LCDC_GetInterruptsPendingStatus(LCD_Type *base); + +/*! + * @brief Get LCD enabled interrupt pending status. + * + * This function is similar with @ref LCDC_GetInterruptsPendingStatus, the only + * difference is, this function only returns the pending status of the + * interrupts that have been enabled using @ref LCDC_EnableInterrupts. + * + * @param base LCD peripheral base address. + * @return Interrupts pending status, it is OR'ed value of @ref _lcdc_interrupts. + */ +uint32_t LCDC_GetEnabledInterruptsPendingStatus(LCD_Type *base); + +/*! + * @brief Clear LCD interrupts pending status. + * + * Example to clear LCD base address update interrupt and vertical compare + * interrupt pending status: + * + * @code + LCDC_ClearInterruptsStatus(LCD, kLCDC_BaseAddrUpdateInterrupt | kLCDC_VerticalCompareInterrupt); + @endcode + * + * @param base LCD peripheral base address. + * @param mask Interrupts to disable, it is OR'ed value of @ref _lcdc_interrupts. + */ +void LCDC_ClearInterruptsStatus(LCD_Type *base, uint32_t mask); + +/* @} */ + +/*! + * @name Hardware cursor + * @{ + */ + +/*! + * @brief Set the hardware cursor configuration + * + * This function should be called before enabling the hardware cursor. + * It supports initializing multiple cursor images at a time when using + * 32x32 pixels cursor. + * + * For example: + * + * @code + uint32_t cursor0Img[LCDC_CURSOR_IMG_32X32_WORDS] = {...}; + uint32_t cursor2Img[LCDC_CURSOR_IMG_32X32_WORDS] = {...}; + + lcdc_cursor_config_t cursorConfig; + + LCDC_CursorGetDefaultConfig(&cursorConfig); + + cursorConfig.image[0] = cursor0Img; + cursorConfig.image[2] = cursor2Img; + + LCDC_SetCursorConfig(LCD, &cursorConfig); + + LCDC_ChooseCursor(LCD, 0); + LCDC_SetCursorPosition(LCD, 0, 0); + + LCDC_EnableCursor(LCD); + @endcode + * + * In this example, cursor 0 and cursor 2 image data are initialized, but cursor 1 + * and cursor 3 image data are not initialized because image[1] and image[2] are + * all NULL. With this, application could initializes all cursor images it will + * use at the beginning and call @ref LCDC_SetCursorImage directly to display the + * one which it needs. + * + * @param base LCD peripheral base address. + * @param config Pointer to the hardware cursor configuration structure. + */ +void LCDC_SetCursorConfig(LCD_Type *base, const lcdc_cursor_config_t *config); + +/*! + * @brief Get the hardware cursor default configuration + * + * The default configuration values are: + * + * @code + config->size = kLCDC_CursorSize32; + config->syncMode = kLCDC_CursorAsync; + config->palette0.red = 0U; + config->palette0.green = 0U; + config->palette0.blue = 0U; + config->palette1.red = 255U; + config->palette1.green = 255U; + config->palette1.blue = 255U; + config->image[0] = (uint32_t *)0; + config->image[1] = (uint32_t *)0; + config->image[2] = (uint32_t *)0; + config->image[3] = (uint32_t *)0; + @endcode + * + * @param config Pointer to the hardware cursor configuration structure. + */ +void LCDC_CursorGetDefaultConfig(lcdc_cursor_config_t *config); + +/*! + * @brief Enable or disable the cursor. + * + * @param base LCD peripheral base address. + * @param enable True to enable, false to disable. + */ +static inline void LCDC_EnableCursor(LCD_Type *base, bool enable) +{ + if (enable) + { + base->CRSR_CTRL |= LCD_CRSR_CTRL_CRSRON_MASK; + } + else + { + base->CRSR_CTRL &= ~LCD_CRSR_CTRL_CRSRON_MASK; + } +} + +/*! + * @brief Choose which cursor to display. + * + * When using 32x32 cursor, the number of cursors supports is @ref LCDC_CURSOR_COUNT. + * When using 64x64 cursor, the LCD only supports one cursor. + * This function selects which cursor to display when using 32x32 cursor. + * When synchronization mode is @ref kLCDC_CursorSync, the change effects in the + * next frame. When synchronization mode is @ref * kLCDC_CursorAsync, change effects + * immediately. + * + * @param base LCD peripheral base address. + * @param index Index of the cursor to display. + * @note The function @ref LCDC_SetCursorPosition must be called after this function + * to show the new cursor. + */ +static inline void LCDC_ChooseCursor(LCD_Type *base, uint8_t index) +{ + base->CRSR_CTRL = (base->CRSR_CTRL & ~LCD_CRSR_CTRL_CRSRNUM1_0_MASK) | LCD_CRSR_CTRL_CRSRNUM1_0(index); +} + +/*! + * @brief Set the position of cursor + * + * When synchronization mode is @ref kLCDC_CursorSync, position change effects + * in the next frame. When synchronization mode is @ref kLCDC_CursorAsync, + * position change effects immediately. + * + * @param base LCD peripheral base address. + * @param positionX X ordinate of the cursor top-left measured in pixels + * @param positionY Y ordinate of the cursor top-left measured in pixels + */ +void LCDC_SetCursorPosition(LCD_Type *base, int32_t positionX, int32_t positionY); + +/*! + * @brief Set the cursor image. + * + * The interrupt @ref kLCDC_CursorInterrupt indicates that last cursor pixel is + * displayed. When the hardware cursor is enabled, + * + * @param base LCD peripheral base address. + * @param size The cursor size. + * @param index Index of the cursor to set when using 32x32 cursor. + * @param image Pointer to the cursor image. When using 32x32 cursor, the image + * size should be LCDC_CURSOR_IMG_32X32_WORDS. When using 64x64 cursor, the image + * size should be LCDC_CURSOR_IMG_64X64_WORDS. + */ +void LCDC_SetCursorImage(LCD_Type *base, lcdc_cursor_size_t size, uint8_t index, const uint32_t *image); + +/* @} */ + +#if defined(__cplusplus) +} +#endif + +#endif /* __FSL_LCDC_H__ */