Files
Michael Sauer 1b0501179d build: W600-SDK importiert, Firmware-Build und Hello am EVK
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.
2026-09-11 12:52:26 +02:00

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);
}