aboutsummaryrefslogtreecommitdiff
path: root/drivers/oled
diff options
context:
space:
mode:
authorRyan Caltabiano <rcalt2vt@gmail.com>2019-04-16 18:36:55 -0500
committerskullydazed <skullydazed@users.noreply.github.com>2019-04-20 08:05:10 -0700
commitdd3a813f871b911012da55a499955307c309a7a5 (patch)
tree80df58d039a9b20283057809925a2351121135d5 /drivers/oled
parent0a645225b9c863a106921185a6c2e0c340f10694 (diff)
downloadqmk_firmware-dd3a813f871b911012da55a499955307c309a7a5.tar.gz
qmk_firmware-dd3a813f871b911012da55a499955307c309a7a5.zip
Reducing size of data send in one frame & update Zen rev2 oled usage
Diffstat (limited to 'drivers/oled')
-rw-r--r--drivers/oled/oled_driver.c7
-rw-r--r--drivers/oled/oled_driver.h43
2 files changed, 31 insertions, 19 deletions
diff --git a/drivers/oled/oled_driver.c b/drivers/oled/oled_driver.c
index aa025d7a4..96ea58ccb 100644
--- a/drivers/oled/oled_driver.c
+++ b/drivers/oled/oled_driver.c
@@ -203,7 +203,7 @@ bool oled_init(uint8_t rotation) {
203} 203}
204 204
205__attribute__((weak)) 205__attribute__((weak))
206uint8_t oled_init_user(uint8_t rotation) { 206oled_rotation_t oled_init_user(oled_rotation_t rotation) {
207 return rotation; 207 return rotation;
208} 208}
209 209
@@ -384,7 +384,10 @@ void oled_write_char(const char data, bool invert) {
384 384
385 // Dirty check 385 // Dirty check
386 if (memcmp(&oled_temp_buffer, oled_cursor, OLED_FONT_WIDTH)) { 386 if (memcmp(&oled_temp_buffer, oled_cursor, OLED_FONT_WIDTH)) {
387 oled_dirty |= (1 << ((oled_cursor - &oled_buffer[0]) / OLED_BLOCK_SIZE)); 387 uint16_t index = oled_cursor - &oled_buffer[0];
388 oled_dirty |= (1 << (index / OLED_BLOCK_SIZE));
389 // Edgecase check if the written data spans the 2 chunks
390 oled_dirty |= (1 << ((index + OLED_FONT_WIDTH) / OLED_BLOCK_SIZE));
388 } 391 }
389 392
390 // Finally move to the next char 393 // Finally move to the next char
diff --git a/drivers/oled/oled_driver.h b/drivers/oled/oled_driver.h
index 1ca31df11..ec07f1d9b 100644
--- a/drivers/oled/oled_driver.h
+++ b/drivers/oled/oled_driver.h
@@ -27,14 +27,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
27 #define OLED_DISPLAY_WIDTH 128 27 #define OLED_DISPLAY_WIDTH 128
28 #define OLED_DISPLAY_HEIGHT 64 28 #define OLED_DISPLAY_HEIGHT 64
29 #define OLED_MATRIX_SIZE (OLED_DISPLAY_HEIGHT / 8 * OLED_DISPLAY_WIDTH) // 1024 (compile time mathed) 29 #define OLED_MATRIX_SIZE (OLED_DISPLAY_HEIGHT / 8 * OLED_DISPLAY_WIDTH) // 1024 (compile time mathed)
30 #define OLED_BLOCK_TYPE uint16_t 30 #define OLED_BLOCK_TYPE uint32_t
31 #define OLED_BLOCK_COUNT (sizeof(OLED_BLOCK_TYPE) * 8) // 16 (compile time mathed) 31 #define OLED_BLOCK_COUNT (sizeof(OLED_BLOCK_TYPE) * 8) // 32 (compile time mathed)
32 #define OLED_BLOCK_SIZE (OLED_MATRIX_SIZE / OLED_BLOCK_COUNT) // 64 (compile time mathed) 32 #define OLED_BLOCK_SIZE (OLED_MATRIX_SIZE / OLED_BLOCK_COUNT) // 32 (compile time mathed)
33 33
34 // For 90 degree rotation, we map our internal matrix to oled matrix using fixed arrays 34 // For 90 degree rotation, we map our internal matrix to oled matrix using fixed arrays
35 // The OLED writes to it's memory horizontally, starting top left, but our memory starts bottom left in this mode 35 // The OLED writes to it's memory horizontally, starting top left, but our memory starts bottom left in this mode
36 #define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56 } 36 #define OLED_SOURCE_MAP { 32, 40, 48, 56 }
37 #define OLED_TARGET_MAP { 56, 48, 40, 32, 24, 16, 8, 0 } 37 #define OLED_TARGET_MAP { 24, 16, 8, 0 }
38 // If OLED_BLOCK_TYPE is uint16_t, these tables would look like:
39 // #define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56 }
40 // #define OLED_TARGET_MAP { 56, 48, 40, 32, 24, 16, 8, 0 }
38 // If OLED_BLOCK_TYPE is uint8_t, these tables would look like: 41 // If OLED_BLOCK_TYPE is uint8_t, these tables would look like:
39 // #define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 } 42 // #define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120 }
40 // #define OLED_TARGET_MAP { 56, 120, 48, 112, 40, 104, 32, 96, 24, 88, 16, 80, 8, 72, 0, 64 } 43 // #define OLED_TARGET_MAP { 56, 120, 48, 112, 40, 104, 32, 96, 24, 88, 16, 80, 8, 72, 0, 64 }
@@ -43,14 +46,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
43 #define OLED_DISPLAY_WIDTH 128 46 #define OLED_DISPLAY_WIDTH 128
44 #define OLED_DISPLAY_HEIGHT 32 47 #define OLED_DISPLAY_HEIGHT 32
45 #define OLED_MATRIX_SIZE (OLED_DISPLAY_HEIGHT / 8 * OLED_DISPLAY_WIDTH) // 512 (compile time mathed) 48 #define OLED_MATRIX_SIZE (OLED_DISPLAY_HEIGHT / 8 * OLED_DISPLAY_WIDTH) // 512 (compile time mathed)
46 #define OLED_BLOCK_TYPE uint8_t // Type to use for segmenting the oled display for smart rendering, use unsigned types only 49 #define OLED_BLOCK_TYPE uint16_t // Type to use for segmenting the oled display for smart rendering, use unsigned types only
47 #define OLED_BLOCK_COUNT (sizeof(OLED_BLOCK_TYPE) * 8) // 8 (compile time mathed) 50 #define OLED_BLOCK_COUNT (sizeof(OLED_BLOCK_TYPE) * 8) // 16 (compile time mathed)
48 #define OLED_BLOCK_SIZE (OLED_MATRIX_SIZE / OLED_BLOCK_COUNT) // 128 (compile time mathed) 51 #define OLED_BLOCK_SIZE (OLED_MATRIX_SIZE / OLED_BLOCK_COUNT) // 32 (compile time mathed)
49 52
50 // For 90 degree rotation, we map our internal matrix to oled matrix using fixed arrays 53 // For 90 degree rotation, we map our internal matrix to oled matrix using fixed arrays
51 // The OLED writes to it's memory horizontally, starting top left, but our memory starts bottom left in this mode 54 // The OLED writes to it's memory horizontally, starting top left, but our memory starts bottom left in this mode
52 #define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56 } 55 #define OLED_SOURCE_MAP { 0, 8, 16, 24 }
53 #define OLED_TARGET_MAP { 48, 32, 16, 0, 56, 40, 24, 8 } 56 #define OLED_TARGET_MAP { 24, 16, 8, 0 }
57 // If OLED_BLOCK_TYPE is uint8_t, these tables would look like:
58 // #define OLED_SOURCE_MAP { 0, 8, 16, 24, 32, 40, 48, 56 }
59 // #define OLED_TARGET_MAP { 48, 32, 16, 0, 56, 40, 24, 8 }
54#endif // defined(OLED_DISPLAY_CUSTOM) 60#endif // defined(OLED_DISPLAY_CUSTOM)
55 61
56// Address to use for tthe i2d oled communication 62// Address to use for tthe i2d oled communication
@@ -79,19 +85,22 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
79 #define OLED_FONT_HEIGHT 8 85 #define OLED_FONT_HEIGHT 8
80#endif 86#endif
81 87
82#define OLED_ROTATION_0 0x00 88// OLED Rotation enum values are flags
83#define OLED_ROTATION_90 0x01 89typedef enum {
84#define OLED_ROTATION_180 0x02 90 OLED_ROTATION_0 = 0,
85#define OLED_ROTATION_270 0x03 91 OLED_ROTATION_90 = 1,
92 OLED_ROTATION_180 = 2,
93 OLED_ROTATION_270 = 3, // OLED_ROTATION_90 | OLED_ROTATION_180
94} oled_rotation_t;
86 95
87// Initialize the oled display, rotating the rendered output based on the define passed in. 96// Initialize the oled display, rotating the rendered output based on the define passed in.
88// Returns true if the OLED was initialized successfully 97// Returns true if the OLED was initialized successfully
89bool oled_init(uint8_t rotation); 98bool oled_init(oled_rotation_t rotation);
90 99
91// Called at the start of oled_init, weak function overridable by the user 100// Called at the start of oled_init, weak function overridable by the user
92// rotation - the value passed into oled_init 101// rotation - the value passed into oled_init
93// Return new uint8_t if you want to override default rotation 102// Return new oled_rotation_t if you want to override default rotation
94uint8_t oled_init_user(uint8_t rotation); 103oled_rotation_t oled_init_user(oled_rotation_t rotation);
95 104
96// Clears the display buffer, resets cursor position to 0, and sets the buffer to dirty for rendering 105// Clears the display buffer, resets cursor position to 0, and sets the buffer to dirty for rendering
97void oled_clear(void); 106void oled_clear(void);