Commit ca3aaa55 authored by schneider's avatar schneider

chore(display,portexpander): style

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