Peter Drescher's library for the Embedded Artists E-paper display, but modified to also support the LPC4088 QuickStart Board

Dependents:   app_epaper

Fork of EaEpaper by Peter Drescher

Committer:
embeddedartists
Date:
Wed Dec 04 12:51:40 2013 +0000
Revision:
3:6fb3e296a6fd
Parent:
0:fedcef5319f5
Added support for the LPC4088 QuickStart Board and more specifically the LPC4088 QSB Base Board

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dreschpe 0:fedcef5319f5 1 // Copyright 2013 Pervasive Displays, Inc.
dreschpe 0:fedcef5319f5 2 //
dreschpe 0:fedcef5319f5 3 // Licensed under the Apache License, Version 2.0 (the "License");
dreschpe 0:fedcef5319f5 4 // you may not use this file except in compliance with the License.
dreschpe 0:fedcef5319f5 5 // You may obtain a copy of the License at:
dreschpe 0:fedcef5319f5 6 //
dreschpe 0:fedcef5319f5 7 // http://www.apache.org/licenses/LICENSE-2.0
dreschpe 0:fedcef5319f5 8 //
dreschpe 0:fedcef5319f5 9 // Unless required by applicable law or agreed to in writing,
dreschpe 0:fedcef5319f5 10 // software distributed under the License is distributed on an
dreschpe 0:fedcef5319f5 11 // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
dreschpe 0:fedcef5319f5 12 // express or implied. See the License for the specific language
dreschpe 0:fedcef5319f5 13 // governing permissions and limitations under the License.
dreschpe 0:fedcef5319f5 14
dreschpe 0:fedcef5319f5 15 #ifndef EPD_H
dreschpe 0:fedcef5319f5 16 #define EPD_H
dreschpe 0:fedcef5319f5 17
dreschpe 0:fedcef5319f5 18 #include "mbed.h"
embeddedartists 3:6fb3e296a6fd 19 //#include "BurstSPI.h"
dreschpe 0:fedcef5319f5 20
dreschpe 0:fedcef5319f5 21 #define PROGMEM
dreschpe 0:fedcef5319f5 22
dreschpe 0:fedcef5319f5 23
dreschpe 0:fedcef5319f5 24 typedef enum {
dreschpe 0:fedcef5319f5 25 EPD_1_44, // 128 x 96
dreschpe 0:fedcef5319f5 26 EPD_2_0, // 200 x 96
dreschpe 0:fedcef5319f5 27 EPD_2_7 // 264 x 176
dreschpe 0:fedcef5319f5 28 } EPD_size;
dreschpe 0:fedcef5319f5 29
dreschpe 0:fedcef5319f5 30 typedef enum { // Image pixel -> Display pixel
dreschpe 0:fedcef5319f5 31 EPD_compensate, // B -> W, W -> B (Current Image)
dreschpe 0:fedcef5319f5 32 EPD_white, // B -> N, W -> W (Current Image)
dreschpe 0:fedcef5319f5 33 EPD_inverse, // B -> N, W -> B (New Image)
dreschpe 0:fedcef5319f5 34 EPD_normal // B -> B, W -> W (New Image)
dreschpe 0:fedcef5319f5 35 } EPD_stage;
dreschpe 0:fedcef5319f5 36
dreschpe 0:fedcef5319f5 37 typedef void EPD_reader(void *buffer, uint32_t address, uint16_t length);
dreschpe 0:fedcef5319f5 38
dreschpe 0:fedcef5319f5 39 class EPD_Class {
dreschpe 0:fedcef5319f5 40 private:
dreschpe 0:fedcef5319f5 41 DigitalOut EPD_Pin_PANEL_ON;
dreschpe 0:fedcef5319f5 42 DigitalOut EPD_Pin_BORDER;
dreschpe 0:fedcef5319f5 43 DigitalOut EPD_Pin_DISCHARGE;
embeddedartists 3:6fb3e296a6fd 44 #if defined(TARGET_LPC4088)
embeddedartists 3:6fb3e296a6fd 45 DigitalOut EPD_Pin_PWM;
embeddedartists 3:6fb3e296a6fd 46 #elif
dreschpe 0:fedcef5319f5 47 PwmOut EPD_Pin_PWM;
embeddedartists 3:6fb3e296a6fd 48 #endif
dreschpe 0:fedcef5319f5 49 DigitalOut EPD_Pin_RESET;
dreschpe 0:fedcef5319f5 50 DigitalIn EPD_Pin_BUSY;
dreschpe 0:fedcef5319f5 51 DigitalOut EPD_Pin_EPD_CS;
embeddedartists 3:6fb3e296a6fd 52 #if defined(TARGET_LPC4088)
embeddedartists 3:6fb3e296a6fd 53 SPI spi_;
embeddedartists 3:6fb3e296a6fd 54 Ticker pwmTicker;
embeddedartists 3:6fb3e296a6fd 55 #elif
dreschpe 0:fedcef5319f5 56 BurstSPI spi_;
embeddedartists 3:6fb3e296a6fd 57 #endif
embeddedartists 3:6fb3e296a6fd 58
dreschpe 0:fedcef5319f5 59 EPD_size size;
dreschpe 0:fedcef5319f5 60 uint16_t stage_time;
dreschpe 0:fedcef5319f5 61 uint16_t factored_stage_time;
dreschpe 0:fedcef5319f5 62 uint16_t lines_per_display;
dreschpe 0:fedcef5319f5 63 uint16_t dots_per_line;
dreschpe 0:fedcef5319f5 64 uint16_t bytes_per_line;
dreschpe 0:fedcef5319f5 65 uint16_t bytes_per_scan;
dreschpe 0:fedcef5319f5 66 PROGMEM const uint8_t *gate_source;
dreschpe 0:fedcef5319f5 67 uint16_t gate_source_length;
dreschpe 0:fedcef5319f5 68 PROGMEM const uint8_t *channel_select;
dreschpe 0:fedcef5319f5 69 uint16_t channel_select_length;
dreschpe 0:fedcef5319f5 70
dreschpe 0:fedcef5319f5 71 bool filler;
dreschpe 0:fedcef5319f5 72
dreschpe 0:fedcef5319f5 73 void SPI_put(uint8_t c);
dreschpe 0:fedcef5319f5 74 void SPI_put_wait(uint8_t c, DigitalIn busy_pin);
dreschpe 0:fedcef5319f5 75 void SPI_send(DigitalOut cs_pin, const uint8_t *buffer, uint16_t length);
embeddedartists 3:6fb3e296a6fd 76
embeddedartists 3:6fb3e296a6fd 77 void PWM_start();
embeddedartists 3:6fb3e296a6fd 78 void PWM_stop();
embeddedartists 3:6fb3e296a6fd 79 #if defined(TARGET_LPC4088)
embeddedartists 3:6fb3e296a6fd 80 void PWM_flip();
embeddedartists 3:6fb3e296a6fd 81 #endif
dreschpe 0:fedcef5319f5 82
dreschpe 0:fedcef5319f5 83 public:
dreschpe 0:fedcef5319f5 84 // power up and power down the EPD panel
dreschpe 0:fedcef5319f5 85 void begin();
dreschpe 0:fedcef5319f5 86 void end();
dreschpe 0:fedcef5319f5 87
dreschpe 0:fedcef5319f5 88 void setFactor(int temperature = 25) {
dreschpe 0:fedcef5319f5 89 this->factored_stage_time = this->stage_time * this->temperature_to_factor_10x(temperature) / 10;
dreschpe 0:fedcef5319f5 90 }
dreschpe 0:fedcef5319f5 91
dreschpe 0:fedcef5319f5 92 // clear display (anything -> white)
dreschpe 0:fedcef5319f5 93 void clear() {
dreschpe 0:fedcef5319f5 94 this->frame_fixed_repeat(0xff, EPD_compensate);
dreschpe 0:fedcef5319f5 95 this->frame_fixed_repeat(0xff, EPD_white);
dreschpe 0:fedcef5319f5 96 this->frame_fixed_repeat(0xaa, EPD_inverse);
dreschpe 0:fedcef5319f5 97 this->frame_fixed_repeat(0xaa, EPD_normal);
dreschpe 0:fedcef5319f5 98 }
dreschpe 0:fedcef5319f5 99
dreschpe 0:fedcef5319f5 100 // assuming a clear (white) screen output an image (PROGMEM data)
dreschpe 0:fedcef5319f5 101 void image(const uint8_t *image) {
dreschpe 0:fedcef5319f5 102 this->frame_fixed_repeat(0xaa, EPD_compensate);
dreschpe 0:fedcef5319f5 103 this->frame_fixed_repeat(0xaa, EPD_white);
dreschpe 0:fedcef5319f5 104 this->frame_data_repeat(image, EPD_inverse);
dreschpe 0:fedcef5319f5 105 this->frame_data_repeat(image, EPD_normal);
dreschpe 0:fedcef5319f5 106 }
dreschpe 0:fedcef5319f5 107
dreschpe 0:fedcef5319f5 108 // change from old image to new image (PROGMEM data)
dreschpe 0:fedcef5319f5 109 void image(const uint8_t *old_image, const uint8_t *new_image) {
dreschpe 0:fedcef5319f5 110 this->frame_data_repeat(old_image, EPD_compensate);
dreschpe 0:fedcef5319f5 111 this->frame_data_repeat(old_image, EPD_white);
dreschpe 0:fedcef5319f5 112 this->frame_data_repeat(new_image, EPD_inverse);
dreschpe 0:fedcef5319f5 113 this->frame_data_repeat(new_image, EPD_normal);
dreschpe 0:fedcef5319f5 114 }
dreschpe 0:fedcef5319f5 115
dreschpe 0:fedcef5319f5 116 #if defined(EPD_ENABLE_EXTRA_SRAM)
dreschpe 0:fedcef5319f5 117
dreschpe 0:fedcef5319f5 118 // change from old image to new image (SRAM version)
dreschpe 0:fedcef5319f5 119 void image_sram(const uint8_t *old_image, const uint8_t *new_image) {
dreschpe 0:fedcef5319f5 120 this->frame_sram_repeat(old_image, EPD_compensate);
dreschpe 0:fedcef5319f5 121 this->frame_sram_repeat(old_image, EPD_white);
dreschpe 0:fedcef5319f5 122 this->frame_sram_repeat(new_image, EPD_inverse);
dreschpe 0:fedcef5319f5 123 this->frame_sram_repeat(new_image, EPD_normal);
dreschpe 0:fedcef5319f5 124 }
dreschpe 0:fedcef5319f5 125 #endif
dreschpe 0:fedcef5319f5 126
dreschpe 0:fedcef5319f5 127 // Low level API calls
dreschpe 0:fedcef5319f5 128 // ===================
dreschpe 0:fedcef5319f5 129
dreschpe 0:fedcef5319f5 130 // single frame refresh
dreschpe 0:fedcef5319f5 131 void frame_fixed(uint8_t fixed_value, EPD_stage stage);
dreschpe 0:fedcef5319f5 132 void frame_data(const uint8_t *new_image, EPD_stage stage);
dreschpe 0:fedcef5319f5 133 #if defined(EPD_ENABLE_EXTRA_SRAM)
dreschpe 0:fedcef5319f5 134 void frame_sram(const uint8_t *new_image, EPD_stage stage);
dreschpe 0:fedcef5319f5 135 #endif
dreschpe 0:fedcef5319f5 136 void frame_cb(uint32_t address, EPD_reader *reader, EPD_stage stage);
dreschpe 0:fedcef5319f5 137
dreschpe 0:fedcef5319f5 138 // stage_time frame refresh
dreschpe 0:fedcef5319f5 139 void frame_fixed_repeat(uint8_t fixed_value, EPD_stage stage);
dreschpe 0:fedcef5319f5 140 void frame_data_repeat(const uint8_t *new_image, EPD_stage stage);
dreschpe 0:fedcef5319f5 141 #if defined(EPD_ENABLE_EXTRA_SRAM)
dreschpe 0:fedcef5319f5 142 void frame_sram_repeat(const uint8_t *new_image, EPD_stage stage);
dreschpe 0:fedcef5319f5 143 #endif
dreschpe 0:fedcef5319f5 144 void frame_cb_repeat(uint32_t address, EPD_reader *reader, EPD_stage stage);
dreschpe 0:fedcef5319f5 145
dreschpe 0:fedcef5319f5 146 // convert temperature to compensation factor
dreschpe 0:fedcef5319f5 147 int temperature_to_factor_10x(int temperature);
dreschpe 0:fedcef5319f5 148
dreschpe 0:fedcef5319f5 149 // single line display - very low-level
dreschpe 0:fedcef5319f5 150 // also has to handle AVR progmem
dreschpe 0:fedcef5319f5 151 void line(uint16_t line, const uint8_t *data, uint8_t fixed_value, bool read_progmem, EPD_stage stage);
dreschpe 0:fedcef5319f5 152
dreschpe 0:fedcef5319f5 153 // inline static void attachInterrupt();
dreschpe 0:fedcef5319f5 154 // inline static void detachInterrupt();
dreschpe 0:fedcef5319f5 155
dreschpe 0:fedcef5319f5 156 EPD_Class(EPD_size size,
dreschpe 0:fedcef5319f5 157 PinName panel_on_pin,
dreschpe 0:fedcef5319f5 158 PinName border_pin,
dreschpe 0:fedcef5319f5 159 PinName discharge_pin,
dreschpe 0:fedcef5319f5 160 PinName pwm_pin,
dreschpe 0:fedcef5319f5 161 PinName reset_pin,
dreschpe 0:fedcef5319f5 162 PinName busy_pin,
dreschpe 0:fedcef5319f5 163 PinName chip_select_pin,
dreschpe 0:fedcef5319f5 164 PinName mosi,
dreschpe 0:fedcef5319f5 165 PinName miso,
dreschpe 0:fedcef5319f5 166 PinName sck);
dreschpe 0:fedcef5319f5 167
dreschpe 0:fedcef5319f5 168 };
dreschpe 0:fedcef5319f5 169
dreschpe 0:fedcef5319f5 170 #endif
dreschpe 0:fedcef5319f5 171