ST7565 tidyup (#10907)
This commit is contained in:
		
							parent
							
								
									1c0e8a6bb4
								
							
						
					
					
						commit
						3afe0ea9b9
					
				
					 9 changed files with 136 additions and 159 deletions
				
			
		| 
						 | 
				
			
			@ -8,8 +8,9 @@
 | 
			
		|||
#ifndef _GDISP_LLD_BOARD_H
 | 
			
		||||
#define _GDISP_LLD_BOARD_H
 | 
			
		||||
 | 
			
		||||
#define ST7565_LCD_BIAS ST7565_LCD_BIAS_9  // actually 6
 | 
			
		||||
#define ST7565_ADC ST7565_ADC_NORMAL
 | 
			
		||||
#include "quantum.h"
 | 
			
		||||
 | 
			
		||||
#define ST7565_LCD_BIAS ST7565_LCD_BIAS_7
 | 
			
		||||
#define ST7565_COM_SCAN ST7565_COM_SCAN_DEC
 | 
			
		||||
#define ST7565_PAGE_ORDER 0, 1, 2, 3
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			@ -17,19 +18,12 @@
 | 
			
		|||
 * #define ST7565_PAGE_ORDER       4,5,6,7,0,1,2,3
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define ST7565_GPIOPORT GPIOC
 | 
			
		||||
#define ST7565_PORT PORTC
 | 
			
		||||
#define ST7565_A0_PIN 7
 | 
			
		||||
#define ST7565_RST_PIN 8
 | 
			
		||||
#define ST7565_MOSI_PIN 6
 | 
			
		||||
#define ST7565_SLCK_PIN 5
 | 
			
		||||
#define ST7565_SS_PIN 4
 | 
			
		||||
#define ST7565_A0_PIN C7
 | 
			
		||||
#define ST7565_RST_PIN C8
 | 
			
		||||
#define ST7565_MOSI_PIN C6
 | 
			
		||||
#define ST7565_SCLK_PIN C5
 | 
			
		||||
#define ST7565_SS_PIN C4
 | 
			
		||||
 | 
			
		||||
#define palSetPadModeRaw(portname, bits) ST7565_PORT->PCR[ST7565_##portname##_PIN] = bits
 | 
			
		||||
 | 
			
		||||
#define palSetPadModeNamed(portname, portmode) palSetPadMode(ST7565_GPIOPORT, ST7565_##portname##_PIN, portmode)
 | 
			
		||||
 | 
			
		||||
#define ST7565_SPI_MODE PORTx_PCRn_DSE | PORTx_PCRn_MUX(2)
 | 
			
		||||
// DSPI Clock and Transfer Attributes
 | 
			
		||||
// Frame Size: 8 bits
 | 
			
		||||
// MSB First
 | 
			
		||||
| 
						 | 
				
			
			@ -38,9 +32,9 @@ static const SPIConfig spi1config = {
 | 
			
		|||
    // Operation complete callback or @p NULL.
 | 
			
		||||
    .end_cb = NULL,
 | 
			
		||||
    // The chip select line port - when not using pcs.
 | 
			
		||||
    .ssport = ST7565_GPIOPORT,
 | 
			
		||||
    .ssport = PAL_PORT(ST7565_SS_PIN),
 | 
			
		||||
    // brief The chip select line pad number - when not using pcs.
 | 
			
		||||
    .sspad = ST7565_SS_PIN,
 | 
			
		||||
    .sspad = PAL_PAD(ST7565_SS_PIN),
 | 
			
		||||
    // SPI initialization data.
 | 
			
		||||
    .tar0 = SPIx_CTARn_FMSZ(7)     // Frame size = 8 bytes
 | 
			
		||||
            | SPIx_CTARn_ASC(1)    // After SCK Delay Scaler (min 50 ns) = 55.56ns
 | 
			
		||||
| 
						 | 
				
			
			@ -66,13 +60,14 @@ static GFXINLINE void release_bus(GDisplay *g) {
 | 
			
		|||
 | 
			
		||||
static GFXINLINE void init_board(GDisplay *g) {
 | 
			
		||||
    (void)g;
 | 
			
		||||
    palSetPadModeNamed(A0, PAL_MODE_OUTPUT_PUSHPULL);
 | 
			
		||||
    palSetPad(ST7565_GPIOPORT, ST7565_A0_PIN);
 | 
			
		||||
    palSetPadModeNamed(RST, PAL_MODE_OUTPUT_PUSHPULL);
 | 
			
		||||
    palSetPad(ST7565_GPIOPORT, ST7565_RST_PIN);
 | 
			
		||||
    palSetPadModeRaw(MOSI, ST7565_SPI_MODE);
 | 
			
		||||
    palSetPadModeRaw(SLCK, ST7565_SPI_MODE);
 | 
			
		||||
    palSetPadModeNamed(SS, PAL_MODE_OUTPUT_PUSHPULL);
 | 
			
		||||
    setPinOutput(ST7565_A0_PIN);
 | 
			
		||||
    writePinHigh(ST7565_A0_PIN);
 | 
			
		||||
    setPinOutput(ST7565_RST_PIN);
 | 
			
		||||
    writePinHigh(ST7565_RST_PIN);
 | 
			
		||||
    setPinOutput(ST7565_SS_PIN);
 | 
			
		||||
 | 
			
		||||
    palSetPadMode(PAL_PORT(ST7565_MOSI_PIN), PAL_PAD(ST7565_MOSI_PIN), PAL_MODE_ALTERNATIVE_2);
 | 
			
		||||
    palSetPadMode(PAL_PORT(ST7565_SCLK_PIN), PAL_PAD(ST7565_SCLK_PIN), PAL_MODE_ALTERNATIVE_2);
 | 
			
		||||
 | 
			
		||||
    spiInit();
 | 
			
		||||
    spiStart(&SPID1, &spi1config);
 | 
			
		||||
| 
						 | 
				
			
			@ -83,19 +78,18 @@ static GFXINLINE void post_init_board(GDisplay *g) { (void)g; }
 | 
			
		|||
 | 
			
		||||
static GFXINLINE void setpin_reset(GDisplay *g, bool_t state) {
 | 
			
		||||
    (void)g;
 | 
			
		||||
    if (state) {
 | 
			
		||||
        palClearPad(ST7565_GPIOPORT, ST7565_RST_PIN);
 | 
			
		||||
    } else {
 | 
			
		||||
        palSetPad(ST7565_GPIOPORT, ST7565_RST_PIN);
 | 
			
		||||
    }
 | 
			
		||||
    writePin(ST7565_RST_PIN, !state);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static GFXINLINE void enter_data_mode(GDisplay *g) { palSetPad(ST7565_GPIOPORT, ST7565_A0_PIN); }
 | 
			
		||||
 | 
			
		||||
static GFXINLINE void enter_cmd_mode(GDisplay *g) { palClearPad(ST7565_GPIOPORT, ST7565_A0_PIN); }
 | 
			
		||||
 | 
			
		||||
static GFXINLINE void write_data(GDisplay *g, uint8_t *data, uint16_t length) {
 | 
			
		||||
static GFXINLINE void write_cmd(GDisplay *g, gU8 cmd) {
 | 
			
		||||
    (void)g;
 | 
			
		||||
    writePinLow(ST7565_A0_PIN);
 | 
			
		||||
    spiSend(&SPID1, 1, &cmd);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static GFXINLINE void write_data(GDisplay *g, gU8 *data, gU16 length) {
 | 
			
		||||
    (void)g;
 | 
			
		||||
    writePinHigh(ST7565_A0_PIN);
 | 
			
		||||
    spiSend(&SPID1, length, data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,3 @@
 | 
			
		|||
GFXINC += drivers/ugfx/gdisp/st7565
 | 
			
		||||
GFXSRC += drivers/ugfx/gdisp/st7565/gdisp_lld_ST7565.c
 | 
			
		||||
GDISP_DRIVER_LIST += GDISPVMT_ST7565_QMK
 | 
			
		||||
GDISP_DRIVER_LIST += GDISPVMT_ST7565_QMK
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -49,31 +49,15 @@
 | 
			
		|||
#        define ST7565_COM_SCAN ST7565_COM_SCAN_INC
 | 
			
		||||
#    endif
 | 
			
		||||
#    ifndef ST7565_PAGE_ORDER
 | 
			
		||||
#        define ST7565_PAGE_ORDER 0, 1, 2, 3
 | 
			
		||||
#        define ST7565_PAGE_ORDER 0, 1, 2, 3, 4, 5, 6, 7
 | 
			
		||||
#    endif
 | 
			
		||||
 | 
			
		||||
/*===========================================================================*/
 | 
			
		||||
/* Driver local functions.                                                   */
 | 
			
		||||
/*===========================================================================*/
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
    bool_t  buffer2;
 | 
			
		||||
    uint8_t data_pos;
 | 
			
		||||
    uint8_t data[16];
 | 
			
		||||
    uint8_t ram[GDISP_SCREEN_HEIGHT * GDISP_SCREEN_WIDTH / 8];
 | 
			
		||||
} PrivData;
 | 
			
		||||
 | 
			
		||||
// Some common routines and macros
 | 
			
		||||
#    define PRIV(g) ((PrivData *)g->priv)
 | 
			
		||||
#    define RAM(g) (PRIV(g)->ram)
 | 
			
		||||
 | 
			
		||||
static GFXINLINE void write_cmd(GDisplay *g, uint8_t cmd) { PRIV(g)->data[PRIV(g)->data_pos++] = cmd; }
 | 
			
		||||
 | 
			
		||||
static GFXINLINE void flush_cmd(GDisplay *g) {
 | 
			
		||||
    write_data(g, PRIV(g)->data, PRIV(g)->data_pos);
 | 
			
		||||
    PRIV(g)->data_pos = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#    define RAM(g) ((gU8 *)g->priv)
 | 
			
		||||
#    define write_cmd2(g, cmd1, cmd2) \
 | 
			
		||||
        {                             \
 | 
			
		||||
            write_cmd(g, cmd1);       \
 | 
			
		||||
| 
						 | 
				
			
			@ -106,9 +90,10 @@ static GFXINLINE void flush_cmd(GDisplay *g) {
 | 
			
		|||
 | 
			
		||||
LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
 | 
			
		||||
    // The private area is the display surface.
 | 
			
		||||
    g->priv           = gfxAlloc(sizeof(PrivData));
 | 
			
		||||
    PRIV(g)->buffer2  = false;
 | 
			
		||||
    PRIV(g)->data_pos = 0;
 | 
			
		||||
    g->priv = gfxAlloc(GDISP_SCREEN_HEIGHT * GDISP_SCREEN_WIDTH / 8);
 | 
			
		||||
    if (!g->priv) {
 | 
			
		||||
        return gFalse;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Initialise the board interface
 | 
			
		||||
    init_board(g);
 | 
			
		||||
| 
						 | 
				
			
			@ -119,25 +104,33 @@ LLDSPEC bool_t gdisp_lld_init(GDisplay *g) {
 | 
			
		|||
    setpin_reset(g, FALSE);
 | 
			
		||||
    gfxSleepMilliseconds(20);
 | 
			
		||||
    acquire_bus(g);
 | 
			
		||||
    enter_cmd_mode(g);
 | 
			
		||||
 | 
			
		||||
    write_cmd(g, ST7565_RESET);
 | 
			
		||||
    write_cmd(g, ST7565_LCD_BIAS);
 | 
			
		||||
    write_cmd(g, ST7565_ADC);
 | 
			
		||||
    write_cmd(g, ST7565_COM_SCAN);
 | 
			
		||||
 | 
			
		||||
    write_cmd(g, ST7565_RESISTOR_RATIO | 0x1);
 | 
			
		||||
    write_cmd2(g, ST7565_CONTRAST, GDISP_INITIAL_CONTRAST);
 | 
			
		||||
 | 
			
		||||
    // turn on internal power supply (VC=1, VR=1, VF=1)
 | 
			
		||||
    write_cmd(g, ST7565_POWER_CONTROL | 0x07);
 | 
			
		||||
 | 
			
		||||
    write_cmd(g, ST7565_INVERT_DISPLAY);
 | 
			
		||||
    write_cmd(g, ST7565_ALLON_NORMAL);
 | 
			
		||||
 | 
			
		||||
    write_cmd(g, ST7565_START_LINE | 0);
 | 
			
		||||
 | 
			
		||||
    write_cmd2(g, ST7565_CONTRAST, GDISP_INITIAL_CONTRAST * 64 / 101);
 | 
			
		||||
    write_cmd(g, ST7565_RESISTOR_RATIO | 0x1);
 | 
			
		||||
 | 
			
		||||
    // turn on voltage converter (VC=1, VR=0, VF=0)
 | 
			
		||||
    write_cmd(g, ST7565_POWER_CONTROL | 0x04);
 | 
			
		||||
    delay_ms(50);
 | 
			
		||||
 | 
			
		||||
    // turn on voltage regulator (VC=1, VR=1, VF=0)
 | 
			
		||||
    write_cmd(g, ST7565_POWER_CONTROL | 0x06);
 | 
			
		||||
    delay_ms(50);
 | 
			
		||||
 | 
			
		||||
    // turn on voltage follower (VC=1, VR=1, VF=1)
 | 
			
		||||
    write_cmd(g, ST7565_POWER_CONTROL | 0x07);
 | 
			
		||||
    delay_ms(50);
 | 
			
		||||
 | 
			
		||||
    write_cmd(g, ST7565_DISPLAY_ON);
 | 
			
		||||
    write_cmd(g, ST7565_ALLON_NORMAL);
 | 
			
		||||
    write_cmd(g, ST7565_INVERT_DISPLAY);  // Disable Inversion of display.
 | 
			
		||||
 | 
			
		||||
    write_cmd(g, ST7565_RMW);
 | 
			
		||||
    flush_cmd(g);
 | 
			
		||||
 | 
			
		||||
    // Finish Init
 | 
			
		||||
    post_init_board(g);
 | 
			
		||||
| 
						 | 
				
			
			@ -163,22 +156,14 @@ LLDSPEC void gdisp_lld_flush(GDisplay *g) {
 | 
			
		|||
    if (!(g->flags & GDISP_FLG_NEEDFLUSH)) return;
 | 
			
		||||
 | 
			
		||||
    acquire_bus(g);
 | 
			
		||||
    enter_cmd_mode(g);
 | 
			
		||||
    unsigned dstOffset = (PRIV(g)->buffer2 ? 4 : 0);
 | 
			
		||||
    for (p = 0; p < 4; p++) {
 | 
			
		||||
        write_cmd(g, ST7565_PAGE | (p + dstOffset));
 | 
			
		||||
    gU8 pagemap[] = {ST7565_PAGE_ORDER};
 | 
			
		||||
    for (p = 0; p < sizeof(pagemap); p++) {
 | 
			
		||||
        write_cmd(g, ST7565_PAGE | pagemap[p]);
 | 
			
		||||
        write_cmd(g, ST7565_COLUMN_MSB | 0);
 | 
			
		||||
        write_cmd(g, ST7565_COLUMN_LSB | 0);
 | 
			
		||||
        write_cmd(g, ST7565_RMW);
 | 
			
		||||
        flush_cmd(g);
 | 
			
		||||
        enter_data_mode(g);
 | 
			
		||||
        write_data(g, RAM(g) + (p * GDISP_SCREEN_WIDTH), GDISP_SCREEN_WIDTH);
 | 
			
		||||
        enter_cmd_mode(g);
 | 
			
		||||
    }
 | 
			
		||||
    unsigned line = (PRIV(g)->buffer2 ? 32 : 0);
 | 
			
		||||
    write_cmd(g, ST7565_START_LINE | line);
 | 
			
		||||
    flush_cmd(g);
 | 
			
		||||
    PRIV(g)->buffer2 = !PRIV(g)->buffer2;
 | 
			
		||||
    release_bus(g);
 | 
			
		||||
 | 
			
		||||
    g->flags &= ~GDISP_FLG_NEEDFLUSH;
 | 
			
		||||
| 
						 | 
				
			
			@ -243,6 +228,7 @@ LLDSPEC color_t gdisp_lld_get_pixel_color(GDisplay *g) {
 | 
			
		|||
}
 | 
			
		||||
#    endif
 | 
			
		||||
 | 
			
		||||
#    if GDISP_HARDWARE_BITFILLS
 | 
			
		||||
LLDSPEC void gdisp_lld_blit_area(GDisplay *g) {
 | 
			
		||||
    uint8_t *buffer     = (uint8_t *)g->p.ptr;
 | 
			
		||||
    int      linelength = g->p.cx;
 | 
			
		||||
| 
						 | 
				
			
			@ -268,6 +254,7 @@ LLDSPEC void gdisp_lld_blit_area(GDisplay *g) {
 | 
			
		|||
    }
 | 
			
		||||
    g->flags |= GDISP_FLG_NEEDFLUSH;
 | 
			
		||||
}
 | 
			
		||||
#    endif
 | 
			
		||||
 | 
			
		||||
#    if GDISP_NEED_CONTROL && GDISP_HARDWARE_CONTROL
 | 
			
		||||
LLDSPEC void gdisp_lld_control(GDisplay *g) {
 | 
			
		||||
| 
						 | 
				
			
			@ -279,16 +266,12 @@ LLDSPEC void gdisp_lld_control(GDisplay *g) {
 | 
			
		|||
                case powerSleep:
 | 
			
		||||
                case powerDeepSleep:
 | 
			
		||||
                    acquire_bus(g);
 | 
			
		||||
                    enter_cmd_mode(g);
 | 
			
		||||
                    write_cmd(g, ST7565_DISPLAY_OFF);
 | 
			
		||||
                    flush_cmd(g);
 | 
			
		||||
                    release_bus(g);
 | 
			
		||||
                    break;
 | 
			
		||||
                case powerOn:
 | 
			
		||||
                    acquire_bus(g);
 | 
			
		||||
                    enter_cmd_mode(g);
 | 
			
		||||
                    write_cmd(g, ST7565_DISPLAY_ON);
 | 
			
		||||
                    flush_cmd(g);
 | 
			
		||||
                    release_bus(g);
 | 
			
		||||
                    break;
 | 
			
		||||
                default:
 | 
			
		||||
| 
						 | 
				
			
			@ -318,12 +301,11 @@ LLDSPEC void gdisp_lld_control(GDisplay *g) {
 | 
			
		|||
            return;
 | 
			
		||||
 | 
			
		||||
        case GDISP_CONTROL_CONTRAST:
 | 
			
		||||
            g->g.Contrast = (unsigned)g->p.ptr & 63;
 | 
			
		||||
            if ((unsigned)g->p.ptr > 100) g->p.ptr = (void *)100;
 | 
			
		||||
            acquire_bus(g);
 | 
			
		||||
            enter_cmd_mode(g);
 | 
			
		||||
            write_cmd2(g, ST7565_CONTRAST, g->g.Contrast);
 | 
			
		||||
            flush_cmd(g);
 | 
			
		||||
            write_cmd2(g, ST7565_CONTRAST, ((((unsigned)g->p.ptr) << 6) / 101) & 0x3F);
 | 
			
		||||
            release_bus(g);
 | 
			
		||||
            g->g.Contrast = (unsigned)g->p.ptr;
 | 
			
		||||
            return;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue