Docker-Build mit gcc-arm-none-eabi 4.9-2014q4 (statt Homebrew-Cask) verwendet, Dockerfile/tools/docker.sh dafür aus Task 13 vorgezogen. cmake/sdk.cmake schont gcc 4.9 (kennt -fcommon/-Wno-error=... nicht). Zwei zusätzliche SDK-Stubs (EarlyInit, pre_gpio_config) in src/sys/sdk_stubs.c ergänzt, siehe sdk/PATCHES.md.
188 lines
3.6 KiB
C
188 lines
3.6 KiB
C
/**************************************************************************//**
|
|
* @file wm_lcd.c
|
|
* @author
|
|
* @version
|
|
* @date
|
|
* @brief
|
|
*
|
|
* Copyright (c) 2014 Winner Microelectronics Co., Ltd. All rights reserved.
|
|
*****************************************************************************/
|
|
|
|
#include "wm_lcd.h"
|
|
|
|
#define RTC_CLK (32000UL)
|
|
|
|
/**
|
|
* @brief Initialize LCD Frame Counter
|
|
* @param[in] freq LCD reference refresh frequency in Hz that will be used
|
|
*/
|
|
void tls_lcd_fresh_ratio(uint16_t freq)
|
|
{
|
|
uint8_t com_num;
|
|
|
|
if (freq == 0)
|
|
{
|
|
freq = 60;
|
|
}
|
|
|
|
com_num = tls_bitband_read(HR_LCD_CR, LCD_CR_MODE_Pos) ? 4 : 8;
|
|
LCD->FRAMECNT = RTC_CLK/(com_num * freq);
|
|
}
|
|
|
|
/**
|
|
* @brief
|
|
* Turn on or clear a segment
|
|
*
|
|
* @param[in] com
|
|
* Which COM line to update
|
|
*
|
|
* @param[in] bit
|
|
* Bit index of which field to change
|
|
*
|
|
* @param[in] enable
|
|
* When one will set segment, when zero will clear segment
|
|
*
|
|
* @param[in] mode
|
|
* when one max configuration is 4x20, when zero max configuration is 8x16
|
|
*
|
|
*/
|
|
void tls_lcd_seg_set(int com, int bit, int on_off)
|
|
{
|
|
int mode;
|
|
|
|
/** get the mode congfig when one max configuration is 4x20, when zero max configuration is 8x16 */
|
|
mode = tls_bitband_read(HR_LCD_CR, LCD_CR_MODE_Pos);
|
|
|
|
if (!mode && (com < 0 || com > 7) && (bit < 0 || bit > 15))
|
|
{
|
|
return ;
|
|
}
|
|
if (mode && (com < 0 || com > 3) && (bit < 0 || bit > 19))
|
|
{
|
|
return ;
|
|
}
|
|
|
|
switch(com)
|
|
{
|
|
/** COM0 */
|
|
case 0:
|
|
tls_bitband_write(HR_LCD_COM0_1_SEG, bit, on_off);
|
|
break;
|
|
|
|
/** COM1 */
|
|
case 1:
|
|
if (mode)
|
|
tls_bitband_write(HR_LCD_COM2_3_SEG, bit, on_off);
|
|
else
|
|
{
|
|
bit += 16;
|
|
tls_bitband_write(HR_LCD_COM0_1_SEG, bit, on_off);
|
|
}
|
|
break;
|
|
|
|
/** COM2 */
|
|
case 2:
|
|
if (mode)
|
|
tls_bitband_write(HR_LCD_COM4_5_SEG, bit, on_off);
|
|
else
|
|
tls_bitband_write(HR_LCD_COM2_3_SEG, bit, on_off);
|
|
break;
|
|
|
|
/** COM3 */
|
|
case 3:
|
|
if (mode)
|
|
tls_bitband_write(HR_LCD_COM6_7_SEG, bit, on_off);
|
|
else
|
|
{
|
|
bit += 16;
|
|
tls_bitband_write(HR_LCD_COM2_3_SEG, bit, on_off);
|
|
}
|
|
break;
|
|
|
|
/** COM4 */
|
|
case 4:
|
|
tls_bitband_write(HR_LCD_COM4_5_SEG, bit, on_off);
|
|
break;
|
|
|
|
/** COM5 */
|
|
case 5:
|
|
bit += 16;
|
|
tls_bitband_write(HR_LCD_COM4_5_SEG, bit, on_off);
|
|
break;
|
|
|
|
/** COM6 */
|
|
case 6:
|
|
tls_bitband_write(HR_LCD_COM6_7_SEG, bit, on_off);
|
|
break;
|
|
|
|
/** COM7 */
|
|
case 7:
|
|
bit += 16;
|
|
tls_bitband_write(HR_LCD_COM6_7_SEG, bit, on_off);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief enable or disable the LCD module gpio
|
|
*
|
|
* @param[in] the config value per bit for one of LCD gpios, set 1 gpio output enable ,0 output disabled
|
|
*
|
|
*/
|
|
void tls_lcd_io_config(unsigned int val)
|
|
{
|
|
tls_reg_write32(HR_LCD_IO_EN, val);
|
|
}
|
|
|
|
/**
|
|
* @brief
|
|
* select the voltage of LCD module
|
|
*
|
|
*/
|
|
void tls_lcd_vlcd_sel(LCD_VlcdDef vlcd)
|
|
{
|
|
LCD->CTRL &= ~LCD_VLCD_MASK;
|
|
LCD->CTRL |= vlcd;
|
|
}
|
|
|
|
|
|
/**
|
|
* @brief
|
|
* set the duty of LCD module
|
|
*
|
|
*/
|
|
void tls_lcd_duty_set(LCD_DutyDef duty)
|
|
{
|
|
LCD->CTRL &= ~LCD_DUTY_MASK;
|
|
LCD->CTRL |= duty;
|
|
}
|
|
|
|
|
|
/**
|
|
* @brief
|
|
* set the bias of LCD module
|
|
*
|
|
*/
|
|
void tls_lcd_bias_set(LCD_BiasDef bias)
|
|
{
|
|
LCD->CTRL &= ~LCD_BIAS_MASK;
|
|
LCD->CTRL |= bias;
|
|
}
|
|
|
|
/**
|
|
* @brief
|
|
* initialize the lcd module
|
|
*
|
|
*/
|
|
void tls_lcd_init(tls_lcd_options_t *opts)
|
|
{
|
|
LCD->CTRL = 0;
|
|
LCD->CTRL = opts->mode | opts->bias | opts->duty | opts->vlcd | (1 << 12);
|
|
tls_lcd_fresh_ratio(opts->fresh_rate);
|
|
TLS_LCD_ENABLE(opts->enable);
|
|
TLS_LCD_POWERDOWM(0);
|
|
}
|