Commit ca3aaa55 authored by schneider's avatar schneider

chore(display,portexpander): style

parent a76880e9
...@@ -9,38 +9,37 @@ ...@@ -9,38 +9,37 @@
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
/***** Globals *****/ /***** Globals *****/
const gpio_cfg_t DEV_DC_PIN = {PORT_1, PIN_6, GPIO_FUNC_OUT, GPIO_PAD_NONE}; const gpio_cfg_t DEV_DC_PIN = { PORT_1, PIN_6, GPIO_FUNC_OUT, GPIO_PAD_NONE };
// Parameters for PWM output // Parameters for PWM output
#define PORT_PWM PORT_0 // port #define PORT_PWM PORT_0 // port
#define PIN_PWM PIN_28 // pin #define PIN_PWM PIN_28 // pin
#define FREQ 200 // (Hz) #define FREQ 200 // (Hz)
//#define DUTY_CYCLE 75 // (%) //#define DUTY_CYCLE 75 // (%)
#define DUTY_CYCLE 20 // (%) #define DUTY_CYCLE 20 // (%)
#define PWM_TIMER MXC_TMR4 // must change PORT_PWM and PIN_PWM if changed #define PWM_TIMER MXC_TMR4 // must change PORT_PWM and PIN_PWM if changed
/***** Functions *****/ /***** Functions *****/
void PWM_Output(void) void PWM_Output(void)
{ {
// Declare variables // Declare variables
gpio_cfg_t gpio_pwm; // to configure GPIO gpio_cfg_t gpio_pwm; // to configure GPIO
tmr_cfg_t tmr; // to congigure timer tmr_cfg_t tmr; // to congigure timer
tmr_pwm_cfg_t tmr_pwm; // for configure PWM tmr_pwm_cfg_t tmr_pwm; // for configure PWM
unsigned int period_ticks = PeripheralClock / FREQ; unsigned int period_ticks = PeripheralClock / FREQ;
unsigned int duty_ticks = period_ticks * DUTY_CYCLE / 100; unsigned int duty_ticks = period_ticks * DUTY_CYCLE / 100;
// Congfigure GPIO port and pin for PWM // Congfigure GPIO port and pin for PWM
gpio_pwm.func = GPIO_FUNC_ALT4; gpio_pwm.func = GPIO_FUNC_ALT4;
gpio_pwm.port = PORT_PWM; gpio_pwm.port = PORT_PWM;
gpio_pwm.mask = PIN_PWM; gpio_pwm.mask = PIN_PWM;
gpio_pwm.pad = GPIO_PAD_PULL_DOWN; gpio_pwm.pad = GPIO_PAD_PULL_DOWN;
if (GPIO_Config(&gpio_pwm) != E_NO_ERROR) { if (GPIO_Config(&gpio_pwm) != E_NO_ERROR) {
printf("Failed GPIO_Config for pwm.\n"); printf("Failed GPIO_Config for pwm.\n");
} }
/* /*
Steps for configuring a timer for PWM mode: Steps for configuring a timer for PWM mode:
1. Disable the timer 1. Disable the timer
2. Set the prescale value 2. Set the prescale value
...@@ -49,55 +48,55 @@ void PWM_Output(void) ...@@ -49,55 +48,55 @@ void PWM_Output(void)
5. Enable Timer 5. Enable Timer
*/ */
TMR_Disable(PWM_TIMER); TMR_Disable(PWM_TIMER);
TMR_Init(PWM_TIMER, TMR_PRES_1, 0); TMR_Init(PWM_TIMER, TMR_PRES_1, 0);
tmr.mode = TMR_MODE_PWM; tmr.mode = TMR_MODE_PWM;
tmr.cmp_cnt = period_ticks; tmr.cmp_cnt = period_ticks;
tmr.pol = 0; tmr.pol = 0;
TMR_Config(PWM_TIMER, &tmr); TMR_Config(PWM_TIMER, &tmr);
tmr_pwm.pol = 1; tmr_pwm.pol = 1;
tmr_pwm.per_cnt = period_ticks; tmr_pwm.per_cnt = period_ticks;
tmr_pwm.duty_cnt = duty_ticks; tmr_pwm.duty_cnt = duty_ticks;
if (TMR_PWMConfig(PWM_TIMER, &tmr_pwm) != E_NO_ERROR) { if (TMR_PWMConfig(PWM_TIMER, &tmr_pwm) != E_NO_ERROR) {
printf("Failed TMR_PWMConfig.\n"); printf("Failed TMR_PWMConfig.\n");
} }
TMR_Enable(PWM_TIMER); TMR_Enable(PWM_TIMER);
printf("PWM started.\n"); printf("PWM started.\n");
} }
void display_set_reset_pin(uint8_t state) void display_set_reset_pin(uint8_t state)
{ {
if(!portexpander_detected()) { if (!portexpander_detected()) {
MAX77650_setDO(state ? true:false); MAX77650_setDO(state ? true : false);
} else { } else {
portexpander_set(4, state); portexpander_set(4, state);
} }
} }
void display_init(void) void display_init(void)
{ {
if(!portexpander_detected()) { if (!portexpander_detected()) {
// Open-drain // Open-drain
MAX77650_setDRV(false); MAX77650_setDRV(false);
// Output // Output
MAX77650_setDIR(false); MAX77650_setDIR(false);
} }
GPIO_Config(&DEV_DC_PIN); GPIO_Config(&DEV_DC_PIN);
PWM_Output(); PWM_Output();
LCD_SetBacklight(500); LCD_SetBacklight(500);
LCD_Init(); LCD_Init();
LCD_Clear(BLACK); LCD_Clear(BLACK);
Paint_NewImage(LCD_WIDTH, LCD_HEIGHT,0,WHITE); Paint_NewImage(LCD_WIDTH, LCD_HEIGHT, 0, WHITE);
Paint_Clear(BLACK); Paint_Clear(BLACK);
Paint_SetRotate(180); Paint_SetRotate(180);
} }
...@@ -12,72 +12,76 @@ static uint8_t output_state; ...@@ -12,72 +12,76 @@ static uint8_t output_state;
void portexpander_init(void) void portexpander_init(void)
{ {
uint8_t addr = 0x21; uint8_t addr = 0x21;
int ret; int ret;
// Enable pull-ups for buttons // Enable pull-ups for buttons
uint8_t command[] = {0x43, 0x68}; uint8_t command[] = { 0x43, 0x68 };
ret = I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0); ret = I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0);
if(ret != 2) { if (ret != 2) {
printf("portexpander NOT detected\n"); printf("portexpander NOT detected\n");
detected = false; detected = false;
return; return;
} }
detected = true; detected = true;
// Set _all_ outputs to open-drain to support the high side p-channel transistors. // Set _all_ outputs to open-drain to support the high side p-channel transistors.
command[0] = 0x4F; command[1] = 0x01; command[0] = 0x4F;
I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0); command[1] = 0x01;
I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0);
// Enable outputs for the transistors, the LED and the LCD reset
command[0] = 0x03; command[1] = 0x68; // Enable outputs for the transistors, the LED and the LCD reset
I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0); command[0] = 0x03;
command[1] = 0x68;
// Set outputs to high (i.e. open-drain) I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0);
output_state = 0x97;
command[0] = 0x01; command[1] = output_state; // Set outputs to high (i.e. open-drain)
I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0); output_state = 0x97;
command[0] = 0x01;
// Turn on LEDs command[1] = output_state;
// TODO: only turn on LEDs if value != 0,0,0 && dim > 0 I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0);
command[0] = 0x01; command[1] = 0x90;
I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0); // Turn on LEDs
// TODO: only turn on LEDs if value != 0,0,0 && dim > 0
command[0] = 0x01;
command[1] = 0x90;
I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0);
} }
uint8_t portexpander_get(void) uint8_t portexpander_get(void)
{ {
uint8_t addr = 0x21; uint8_t addr = 0x21;
uint8_t command[] = {0x00}; uint8_t command[] = { 0x00 };
uint8_t buf = 0xFF; uint8_t buf = 0xFF;
if(detected) { if (detected) {
I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 1, 1); I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 1, 1);
I2C_MasterRead(MXC_I2C1_BUS0, addr << 1, &buf, 1, 0); I2C_MasterRead(MXC_I2C1_BUS0, addr << 1, &buf, 1, 0);
} }
return buf; return buf;
} }
bool portexpander_detected(void) bool portexpander_detected(void)
{ {
return detected; return detected;
} }
void portexpander_set(uint8_t pin, uint8_t value) void portexpander_set(uint8_t pin, uint8_t value)
{ {
uint8_t addr = 0x21; uint8_t addr = 0x21;
uint8_t command[2]; uint8_t command[2];
if(detected && pin < 8) { if (detected && pin < 8) {
if(value) { if (value) {
output_state |= (1 << pin); output_state |= (1 << pin);
} else { } else {
output_state &= ~(1 << pin); output_state &= ~(1 << pin);
} }
command[0] = 0x01; command[1] = output_state; command[0] = 0x01;
I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0); command[1] = output_state;
} I2C_MasterWrite(MXC_I2C1_BUS0, addr << 1, command, 2, 0);
}
} }
/***************************************************************************** /*****************************************************************************
* | File : LCD_Driver.c * | File : LCD_Driver.c
* | Author : Waveshare team * | Author : Waveshare team
* | Function : Electronic paper driver * | Function : Electronic paper driver
* | Info : * | Info :
*---------------- *----------------
* | This version: V1.0 * | This version: V1.0
* | Date : 2018-11-18 * | Date : 2018-11-18
* | Info : * | Info :
# #
# Permission is hereby granted, free of UBYTEge, to any person obtaining a copy # Permission is hereby granted, free of UBYTEge, to any person obtaining a copy
# of this software and associated documnetation files (the "Software"), to deal # of this software and associated documnetation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights # in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is # copies of the Software, and to permit persons to whom the Software is
# furished to do so, subject to the following conditions: # furished to do so, subject to the following conditions:
# #
# The above copyright notice and this permission notice shall be included in # The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software. # all copies or substantial portions of the Software.
# #
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE. # THE SOFTWARE.
# #
******************************************************************************/ ******************************************************************************/
#include "LCD_Driver.h" #include "LCD_Driver.h"
static uint8_t screen[LCD_HEIGHT][LCD_WIDTH][2]; static uint8_t screen[LCD_HEIGHT][LCD_WIDTH][2];
/******************************************************************************* /*******************************************************************************
function: function:
Hardware reset Hardware reset
*******************************************************************************/ *******************************************************************************/
static void LCD_Reset(void) static void LCD_Reset(void)
{ {
//DEV_Digital_Write(DEV_CS_PIN,0); //DEV_Digital_Write(DEV_CS_PIN,0);
DEV_Delay_ms(20); DEV_Delay_ms(20);
DEV_RESET_LOW(); DEV_RESET_LOW();
DEV_Delay_ms(20); DEV_Delay_ms(20);
DEV_RESET_HIGH(); DEV_RESET_HIGH();
DEV_Delay_ms(20); DEV_Delay_ms(20);
} }
/******************************************************************************* /*******************************************************************************
function: function:
Setting backlight Setting backlight
parameter : parameter :
value : Range 0~1000 Duty cycle is value/1000 value : Range 0~1000 Duty cycle is value/1000
*******************************************************************************/ *******************************************************************************/
void LCD_SetBacklight(UWORD Value) void LCD_SetBacklight(UWORD Value)
{ {
DEV_Set_BL(Value); DEV_Set_BL(Value);
} }
/******************************************************************************* /*******************************************************************************
function: function:
Write register address and data Write register address and data
*******************************************************************************/ *******************************************************************************/
void LCD_WriteData_Byte(UBYTE da) void LCD_WriteData_Byte(UBYTE da)
{ {
//DEV_Digital_Write(DEV_CS_PIN,0); //DEV_Digital_Write(DEV_CS_PIN,0);
DEV_Digital_Write(DEV_DC_PIN,1); DEV_Digital_Write(DEV_DC_PIN, 1);
DEV_SPI_WRITE(da); DEV_SPI_WRITE(da);
//DEV_Digital_Write(DEV_CS_PIN,1); //DEV_Digital_Write(DEV_CS_PIN,1);
} }
void LCD_WriteData_Word(UWORD da) void LCD_WriteData_Word(UWORD da)
{ {
UBYTE i=(da>>8)&0xff; UBYTE i = (da >> 8) & 0xff;
//DEV_Digital_Write(DEV_CS_PIN,0); //DEV_Digital_Write(DEV_CS_PIN,0);
DEV_Digital_Write(DEV_DC_PIN,1); DEV_Digital_Write(DEV_DC_PIN, 1);
DEV_SPI_WRITE(i); DEV_SPI_WRITE(i);
uint8_t tmp = da; uint8_t tmp = da;
DEV_SPI_WRITE(tmp); DEV_SPI_WRITE(tmp);
//DEV_Digital_Write(DEV_CS_PIN,1); //DEV_Digital_Write(DEV_CS_PIN,1);
} }
void LCD_WriteReg(UBYTE da) void LCD_WriteReg(UBYTE da)
{ {
//DEV_Digital_Write(DEV_CS_PIN,0); //DEV_Digital_Write(DEV_CS_PIN,0);
DEV_Digital_Write(DEV_DC_PIN,0); DEV_Digital_Write(DEV_DC_PIN, 0);
DEV_SPI_WRITE(da); DEV_SPI_WRITE(da);
//DEV_Digital_Write(DEV_CS_PIN,1); //DEV_Digital_Write(DEV_CS_PIN,1);
} }
/****************************************************************************** /******************************************************************************
function: function:
Common register initialization Common register initialization
******************************************************************************/ ******************************************************************************/
void LCD_Init(void) void LCD_Init(void)
{ {
LCD_Reset(); LCD_Reset();
//************* Start Initial Sequence **********// //************* Start Initial Sequence **********//
LCD_WriteReg(0x11);//Sleep exit LCD_WriteReg(0x11); //Sleep exit
DEV_Delay_ms (120); DEV_Delay_ms(120);
LCD_WriteReg(0x21); LCD_WriteReg(0x21);
LCD_WriteReg(0x21); LCD_WriteReg(0x21);
LCD_WriteReg(0xB1); LCD_WriteReg(0xB1);
LCD_WriteData_Byte(0x05); LCD_WriteData_Byte(0x05);
LCD_WriteData_Byte(0x3A); LCD_WriteData_Byte(0x3A);
LCD_WriteData_Byte(0x3A); LCD_WriteData_Byte(0x3A);
LCD_WriteReg(0xB2); LCD_WriteReg(0xB2);
LCD_WriteData_Byte(0x05); LCD_WriteData_Byte(0x05);
LCD_WriteData_Byte(0x3A); LCD_WriteData_Byte(0x3A);
LCD_WriteData_Byte(0x3A); LCD_WriteData_Byte(0x3A);
LCD_WriteReg(0xB3); LCD_WriteReg(0xB3);
LCD_WriteData_Byte(0x05); LCD_WriteData_Byte(0x05);
LCD_WriteData_Byte(0x3A); LCD_WriteData_Byte(0x3A);
LCD_WriteData_Byte(0x3A); LCD_WriteData_Byte(0x3A);
LCD_WriteData_Byte(0x05); LCD_WriteData_Byte(0x05);
LCD_WriteData_Byte(0x3A); LCD_WriteData_Byte(0x3A);
LCD_WriteData_Byte(0x3A); LCD_WriteData_Byte(0x3A);
LCD_WriteReg(0xB4); LCD_WriteReg(0xB4);
LCD_WriteData_Byte(0x03); LCD_WriteData_Byte(0x03);
LCD_WriteReg(0xC0); LCD_WriteReg(0xC0);
LCD_WriteData_Byte(0x62); LCD_WriteData_Byte(0x62);
LCD_WriteData_Byte(0x02); LCD_WriteData_Byte(0x02);
LCD_WriteData_Byte(0x04); LCD_WriteData_Byte(0x04);
LCD_WriteReg(0xC1); LCD_WriteReg(0xC1);
LCD_WriteData_Byte(0xC0); LCD_WriteData_Byte(0xC0);
LCD_WriteReg(0xC2); LCD_WriteReg(0xC2);
LCD_WriteData_Byte(0x0D); LCD_WriteData_Byte(0x0D);
LCD_WriteData_Byte(0x00); LCD_WriteData_Byte(0x00);
LCD_WriteReg(0xC3); LCD_WriteReg(0xC3);
LCD_WriteData_Byte(0x8D); LCD_WriteData_Byte(0x8D);
LCD_WriteData_Byte(0x6A); LCD_WriteData_Byte(0x6A);
LCD_WriteReg(0xC4); LCD_WriteReg(0xC4);
LCD_WriteData_Byte(0x8D); LCD_WriteData_Byte(0x8D);
LCD_WriteData_Byte(0xEE); LCD_WriteData_Byte(0xEE);
LCD_WriteReg(0xC5); /*VCOM*/ LCD_WriteReg(0xC5); /*VCOM*/
LCD_WriteData_Byte(0x0E); LCD_WriteData_Byte(0x0E);
LCD_WriteReg(0xE0); LCD_WriteReg(0xE0);
LCD_WriteData_Byte(0x10); LCD_WriteData_Byte(0x10);
LCD_WriteData_Byte(0x0E); LCD_WriteData_Byte(0x0E);
LCD_WriteData_Byte(0x02); LCD_WriteData_Byte(0x02);
LCD_WriteData_Byte(0x03); LCD_WriteData_Byte(0x03);
LCD_WriteData_Byte(0x0E); LCD_WriteData_Byte(0x0E);
LCD_WriteData_Byte(0x07); LCD_WriteData_Byte(0x07);
LCD_WriteData_Byte(0x02); LCD_WriteData_Byte(0x02);
LCD_WriteData_Byte(0x07); LCD_WriteData_Byte(0x07);
LCD_WriteData_Byte(0x0A); LCD_WriteData_Byte(0x0A);
LCD_WriteData_Byte(0x12); LCD_WriteData_Byte(0x12);
LCD_WriteData_Byte(0x27); LCD_WriteData_Byte(0x27);
LCD_WriteData_Byte(0x37); LCD_WriteData_Byte(0x37);
LCD_WriteData_Byte(0x00); LCD_WriteData_Byte(0x00);
LCD_WriteData_Byte(0x0D); LCD_WriteData_Byte(0x0D);
LCD_WriteData_Byte(0x0E); LCD_WriteData_Byte(0x0E);
LCD_WriteData_Byte(0x10); LCD_WriteData_Byte(0x10);
LCD_WriteReg(0xE1); LCD_WriteReg(0xE1);
LCD_WriteData_Byte(0x10); LCD_WriteData_Byte(0x10);
LCD_WriteData_Byte(0x0E); LCD_WriteData_Byte(0x0E);
LCD_WriteData_Byte(0x03); LCD_WriteData_Byte(0x03);
LCD_WriteData_Byte(0x03); LCD_WriteData_Byte(0x03);
LCD_WriteData_Byte(0x0F); LCD_WriteData_Byte(0x0F);
LCD_WriteData_Byte(0x06); LCD_WriteData_Byte(0x06);
LCD_WriteData_Byte(0x02); LCD_WriteData_Byte(0x02);
LCD_WriteData_Byte(0x08); LCD_WriteData_Byte(0x08);
LCD_WriteData_Byte(0x0A); LCD_WriteData_Byte(0x0A);
LCD_WriteData_Byte(0x13); LCD_WriteData_Byte(0x13);
LCD_WriteData_Byte(0x26); LCD_WriteData_Byte(0x26);
LCD_WriteData_Byte(0x36); LCD_WriteData_Byte(0x36);
LCD_WriteData_Byte(0x00); LCD_WriteData_Byte(0x00);
LCD_WriteData_Byte(0x0D); LCD_WriteData_Byte(0x0D);