aboutsummaryrefslogtreecommitdiff
path: root/docs/feature_oled_driver.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/feature_oled_driver.md')
-rw-r--r--docs/feature_oled_driver.md42
1 files changed, 30 insertions, 12 deletions
diff --git a/docs/feature_oled_driver.md b/docs/feature_oled_driver.md
index f261bbef1..7011f1457 100644
--- a/docs/feature_oled_driver.md
+++ b/docs/feature_oled_driver.md
@@ -56,7 +56,7 @@ In split keyboards, it is very common to have two OLED displays that each render
56 56
57```C++ 57```C++
58#ifdef OLED_DRIVER_ENABLE 58#ifdef OLED_DRIVER_ENABLE
59uint8_t oled_init_user(uint8_t rotation) { 59oled_rotation_t oled_init_user(oled_rotation_t rotation) {
60 if (!is_keyboard_master()) 60 if (!is_keyboard_master())
61 return OLED_ROTATION_180; // flips the display 180 degrees if offhand 61 return OLED_ROTATION_180; // flips the display 180 degrees if offhand
62 return rotation; 62 return rotation;
@@ -99,18 +99,28 @@ void oled_task_user(void) {
99|`OLED_DISPLAY_WIDTH` |`128` |The width of the OLED display. | 99|`OLED_DISPLAY_WIDTH` |`128` |The width of the OLED display. |
100|`OLED_DISPLAY_HEIGHT` |`32` |The height of the OLED display. | 100|`OLED_DISPLAY_HEIGHT` |`32` |The height of the OLED display. |
101|`OLED_MATRIX_SIZE` |`512` |The local buffer size to allocate.<br />`(OLED_DISPLAY_HEIGHT / 8 * OLED_DISPLAY_WIDTH)`| 101|`OLED_MATRIX_SIZE` |`512` |The local buffer size to allocate.<br />`(OLED_DISPLAY_HEIGHT / 8 * OLED_DISPLAY_WIDTH)`|
102|`OLED_BLOCK_TYPE` |`uint8_t` |The unsigned integer type to use for dirty rendering.| 102|`OLED_BLOCK_TYPE` |`uint16_t` |The unsigned integer type to use for dirty rendering.|
103|`OLED_BLOCK_COUNT` |`8` |The number of blocks the display is divided into for dirty rendering.<br />`(sizeof(OLED_BLOCK_TYPE) * 8)`| 103|`OLED_BLOCK_COUNT` |`16` |The number of blocks the display is divided into for dirty rendering.<br />`(sizeof(OLED_BLOCK_TYPE) * 8)`|
104|`OLED_BLOCK_SIZE` |`64` |The size of each block for dirty rendering<br />`(OLED_MATRIX_SIZE / OLED_BLOCK_COUNT)`| 104|`OLED_BLOCK_SIZE` |`32` |The size of each block for dirty rendering<br />`(OLED_MATRIX_SIZE / OLED_BLOCK_COUNT)`|
105|`OLED_SOURCE_MAP` |`{ 0, ... N }` |Precalculated source array to use for mapping source buffer to target OLED memory in 90 degree rendering. | 105|`OLED_SOURCE_MAP` |`{ 0, ... N }` |Precalculated source array to use for mapping source buffer to target OLED memory in 90 degree rendering. |
106|`OLED_TARGET_MAP` |`{ 48, ... N }`|Precalculated target array to use for mapping source buffer to target OLED memory in 90 degree rendering. | 106|`OLED_TARGET_MAP` |`{ 24, ... N }`|Precalculated target array to use for mapping source buffer to target OLED memory in 90 degree rendering. |
107 107
108 108
109### 90 Degree Rotation - Technical Mumbo Jumbo 109### 90 Degree Rotation - Technical Mumbo Jumbo
110 110
111```C
112// OLED Rotation enum values are flags
113typedef enum {
114 OLED_ROTATION_0 = 0,
115 OLED_ROTATION_90 = 1,
116 OLED_ROTATION_180 = 2,
117 OLED_ROTATION_270 = 3, // OLED_ROTATION_90 | OLED_ROTATION_180
118} oled_rotation_t;
119```
120
111 OLED displays driven by SSD1306 drivers only natively support in hard ware 0 degree and 180 degree rendering. This feature is done in software and not free. Using this feature will increase the time to calculate what data to send over i2c to the OLED. If you are strapped for cycles, this can cause keycodes to not register. In testing however, the rendering time on an `atmega32u4` board only went from 2ms to 5ms and keycodes not registering was only noticed once we hit 15ms. 121 OLED displays driven by SSD1306 drivers only natively support in hard ware 0 degree and 180 degree rendering. This feature is done in software and not free. Using this feature will increase the time to calculate what data to send over i2c to the OLED. If you are strapped for cycles, this can cause keycodes to not register. In testing however, the rendering time on an `atmega32u4` board only went from 2ms to 5ms and keycodes not registering was only noticed once we hit 15ms.
112 122
113 90 Degree Rotated Rendering is achieved by using bitwise operations to rotate each 8 block of memory and uses two precalculated arrays to remap buffer memory to OLED memory. The memory map defines are precalculated for remap performance and are calculated based on the OLED Height, Width, and Block Size. For example, in the default 128x32 implementation we have a 64 byte block size. This gives us eight 8 byte blocks that need to be rotated and rendered. The OLED renders horizontally two 8 byte blocks before moving down a page, e.g: 123 90 Degree Rotated Rendering is achieved by using bitwise operations to rotate each 8 block of memory and uses two precalculated arrays to remap buffer memory to OLED memory. The memory map defines are precalculated for remap performance and are calculated based on the OLED Height, Width, and Block Size. For example, in the 128x32 implementation with a `uint8_t` block type, we have a 64 byte block size. This gives us eight 8 byte blocks that need to be rotated and rendered. The OLED renders horizontally two 8 byte blocks before moving down a page, e.g:
114 124
115| | | | | | | 125| | | | | | |
116|---|---|---|---|---|---| 126|---|---|---|---|---|---|
@@ -133,14 +143,22 @@ So those precalculated arrays just index the memory offsets in the order in whic
133## OLED API 143## OLED API
134 144
135```C++ 145```C++
136// Initialize the OLED display, rotating the rendered output 180 degrees if true. 146// OLED Rotation enum values are flags
147typedef enum {
148 OLED_ROTATION_0 = 0,
149 OLED_ROTATION_90 = 1,
150 OLED_ROTATION_180 = 2,
151 OLED_ROTATION_270 = 3, // OLED_ROTATION_90 | OLED_ROTATION_180
152} oled_rotation_t;
153
154// Initialize the OLED display, rotating the rendered output based on the define passed in.
137// Returns true if the OLED was initialized successfully 155// Returns true if the OLED was initialized successfully
138bool oled_init(bool flip180); 156bool oled_init(oled_rotation_t rotation);
139 157
140// Called at the start of oled_init, weak function overridable by the user 158// Called at the start of oled_init, weak function overridable by the user
141// flip180 - the value passed into oled_init 159// rotation - the value passed into oled_init
142// Return true if you want the oled to be flip180 160// Return new oled_rotation_t if you want to override default rotation
143bool oled_init_user(bool flip180); 161oled_rotation_t oled_init_user(oled_rotation_t rotation);
144 162
145// Clears the display buffer, resets cursor position to 0, and sets the buffer to dirty for rendering 163// Clears the display buffer, resets cursor position to 0, and sets the buffer to dirty for rendering
146void oled_clear(void); 164void oled_clear(void);
@@ -217,7 +235,7 @@ bool oled_scroll_off(void);
217// Returns the maximum number of characters that will fit on a line 235// Returns the maximum number of characters that will fit on a line
218uint8_t oled_max_chars(void); 236uint8_t oled_max_chars(void);
219 237
220// Returns the maximum number of lines that will fit on the oled 238// Returns the maximum number of lines that will fit on the OLED
221uint8_t oled_max_lines(void); 239uint8_t oled_max_lines(void);
222``` 240```
223 241