Skip to content

Commit 27ae5bc

Browse files
committed
Add Protomatter and FramebufferDisplay
1 parent 2cb3527 commit 27ae5bc

File tree

61 files changed

+1953
-49
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+1953
-49
lines changed

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,3 +119,6 @@
119119
[submodule "ports/stm/st_driver"]
120120
path = ports/stm/st_driver
121121
url = https://github.com/hathach/st_driver.git
122+
[submodule "lib/protomatter"]
123+
path = lib/protomatter
124+
url = https://github.com/adafruit/Adafruit_Protomatter

lib/protomatter

Submodule protomatter added at c3a3e35

ports/atmel-samd/boards/hallowing_m0_express/board.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ void board_init(void) {
9797
false, // Pixels in a byte share a row. Only used for depth < 8
9898
1, // bytes per cell. Only valid for depths < 8
9999
false, // reverse_pixels_in_byte. Only valid for depths < 8
100+
true, // reverse_pixels_in_word
100101
MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command
101102
MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command
102103
MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command

ports/atmel-samd/boards/hallowing_m4_express/board.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ void board_init(void) {
7777
false, // Pixels in a byte share a row. Only used for depth < 8
7878
1, // bytes per cell. Only valid for depths < 8
7979
false, // reverse_pixels_in_byte. Only valid for depths < 8
80+
true, // reverse_pixels_in_word
8081
MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command
8182
MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command
8283
MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command

ports/atmel-samd/boards/kicksat-sprite/mpconfigboard.mk

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@ LONGINT_IMPL = MPZ
1111

1212
# Not needed.
1313
CIRCUITPY_AUDIOBUSIO = 0
14+
CIRCUITPY_FRAMEBUFFERIO = 0
1415
CIRCUITPY_DISPLAYIO = 0
1516
CIRCUITPY_NETWORK = 0
17+
CIRCUITPY_PROTOMATTER = 0
1618
CIRCUITPY_PS2IO = 0
1719
CIRCUITPY_AUDIOMP3 = 0
1820

ports/atmel-samd/boards/monster_m4sk/board.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ void board_init(void) {
7878
false, // pixels in a byte share a row. Only valid for depths < 8
7979
1, // bytes per cell. Only valid for depths < 8
8080
false, // reverse_pixels_in_byte. Only valid for depths < 8
81+
true, // reverse_pixels_in_word
8182
MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command
8283
MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command
8384
MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command

ports/atmel-samd/boards/pewpew_m4/board.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ void board_init(void) {
128128
false, // pixels in byte share row. only used for depth < 8
129129
1, // bytes per cell. Only valid for depths < 8
130130
false, // reverse_pixels_in_byte. Only valid for depths < 8
131+
true, // reverse_pixels_in_word
131132
MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command
132133
MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command
133134
MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command

ports/atmel-samd/boards/pybadge/board.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ void board_init(void) {
100100
false, // pixels in byte share row. only used for depth < 8
101101
1, // bytes per cell. Only valid for depths < 8
102102
false, // reverse_pixels_in_byte. Only valid for depths < 8
103+
true, // reverse_pixels_in_word
103104
MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command
104105
MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command
105106
MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command

ports/atmel-samd/boards/pybadge_airlift/board.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ void board_init(void) {
7878
false, // pixels in byte share row. Only used for depth < 8
7979
1, // bytes per cell. Only valid for depths < 8
8080
false, // reverse_pixels_in_byte. Only valid for depths < 8
81+
true, // reverse_pixels_in_word
8182
MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command
8283
MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command
8384
MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command

ports/atmel-samd/boards/pycubed/mpconfigboard.mk

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ LONGINT_IMPL = MPZ
1515
# Not needed.
1616
CIRCUITPY_AUDIOBUSIO = 0
1717
CIRCUITPY_DISPLAYIO = 0
18+
CIRCUITPY_FRAMEBUFFERIO = 0
1819
CIRCUITPY_GAMEPAD = 0
20+
CIRCUITPY_PROTOMATTER = 0
1921
CIRCUITPY_PS2IO = 0
2022

2123
FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BusDevice

ports/atmel-samd/boards/pygamer/board.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ void board_init(void) {
100100
false, // pixels in a byte share a row. Only valid for depths < 8
101101
1, // bytes per cell. Only valid for depths < 8
102102
false, // reverse_pixels_in_byte. Only valid for depths < 8
103+
true, // reverse_pixels_in_word
103104
MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command
104105
MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command
105106
MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command

ports/atmel-samd/boards/pygamer_advance/board.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ void board_init(void) {
7878
false, // pixels in a byte share a row. Only valid for depths < 8
7979
1, // bytes per cell. Only valid for depths < 8
8080
false, // reverse_pixels_in_byte. Only valid for depths < 8
81+
true, // reverse_pixels_in_word
8182
MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command
8283
MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command
8384
MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command

ports/atmel-samd/boards/pyportal/board.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ void board_init(void) {
8787
false, // pixels_in_byte_share_row (unused for depths > 8)
8888
1, // bytes per cell. Only valid for depths < 8
8989
false, // reverse_pixels_in_byte. Only valid for depths < 8
90+
true, // reverse_pixels_in_word
9091
MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command
9192
MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command
9293
MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command

ports/atmel-samd/boards/pyportal_titano/board.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,10 @@ void board_init(void) {
101101
0, // rotation
102102
16, // Color depth
103103
false, // grayscale
104-
false, // pixels_in_byte_share_row (unused for depths > 8)
104+
false, // pixels_i|n_byte_share_row (unused for depths > 8)
105105
1, // bytes per cell. Only valid for depths < 8
106106
false, // reverse_pixels_in_byte. Only valid for depths < 8
107+
true, // reverse_pixels_in_word
107108
MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command
108109
MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command
109110
MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command

ports/atmel-samd/boards/robohatmm1_m4/mpconfigboard.mk

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ LONGINT_IMPL = MPZ
1717
CIRCUITPY_AUDIOBUSIO = 0
1818
# Make room for more stuff
1919
CIRCUITPY_DISPLAYIO = 0
20+
CIRCUITPY_FRAMEBUFFERIO = 0
2021
CIRCUITPY_FREQUENCYIO = 0
22+
CIRCUITPY_PROTOMATTER = 0
2123

2224
# Include these Python libraries in firmware.
2325
#FROZEN_MPY_DIRS += $(TOP)/frozen/Adafruit_CircuitPython_BusDevice

ports/atmel-samd/boards/ugame10/board.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ void board_init(void) {
9797
false, // pixels in byte share row. Only used with depth < 8
9898
1, // bytes per cell. Only valid for depths < 8
9999
false, // reverse_pixels_in_byte. Only valid for depths < 8
100+
true, // reverse_pixels_in_word
100101
MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command
101102
MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command
102103
MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command

ports/atmel-samd/boards/winterbloom_big_honking_button/mpconfigboard.mk

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ CIRCUITPY_AUDIOIO = 1
1818

1919
# Disable modules that are unusable on this special-purpose board.
2020
CIRCUITPY_BITBANGIO = 0
21+
CIRCUITPY_FRAMEBUFFERIO = 0
2122
CIRCUITPY_FREQUENCYIO = 0
2223
CIRCUITPY_I2CSLAVE = 0
2324
CIRCUITPY_AUDIOBUSIO = 0
@@ -27,6 +28,7 @@ CIRCUITPY_GAMEPAD = 0
2728
CIRCUITPY_I2CSLAVE = 0
2829
CIRCUITPY_NETWORK = 0
2930
CIRCUITPY_TOUCHIO = 0
31+
CIRCUITPY_PROTOMATTER = 0
3032
CIRCUITPY_PS2IO = 0
3133
CIRCUITPY_USB_HID = 0
3234
CIRCUITPY_RTC = 0

ports/atmel-samd/boards/winterbloom_sol/mpconfigboard.mk

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@ CIRCUITPY_AUDIOBUSIO = 0
2121
CIRCUITPY_AUDIOIO = 0
2222
CIRCUITPY_BLEIO = 0
2323
CIRCUITPY_DISPLAYIO = 0
24+
CIRCUITPY_FRAMEBUFFERIO = 0
2425
CIRCUITPY_GAMEPAD = 0
2526
CIRCUITPY_I2CSLAVE = 0
2627
CIRCUITPY_NETWORK = 0
2728
CIRCUITPY_TOUCHIO = 0
29+
CIRCUITPY_PROTOMATTER = 0
2830
CIRCUITPY_PS2IO = 0
2931
CIRCUITPY_USB_HID = 0
3032

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/*
2+
* This file is part of the Micro Python project, http://micropython.org/
3+
*
4+
* The MIT License (MIT)
5+
*
6+
* Copyright (c) 2020 Jeff Epler for Adafruit Industries
7+
*
8+
* Permission is hereby granted, free of charge, to any person obtaining a copy
9+
* of this software and associated documentation files (the "Software"), to deal
10+
* in the Software without restriction, including without limitation the rights
11+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+
* copies of the Software, and to permit persons to whom the Software is
13+
* furnished to do so, subject to the following conditions:
14+
*
15+
* The above copyright notice and this permission notice shall be included in
16+
* all copies or substantial portions of the Software.
17+
*
18+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24+
* THE SOFTWARE.
25+
*/
26+
27+
#include <stddef.h>
28+
29+
#include "common-hal/_protomatter/Protomatter.h"
30+
31+
#include "samd/timers.h"
32+
#include "timer_handler.h"
33+
34+
void *common_hal_protomatter_timer_allocate() {
35+
uint8_t timer_index = find_free_timer();
36+
if (timer_index == 0xff) {
37+
return NULL;
38+
}
39+
timer_never_reset(timer_index, true);
40+
return tc_insts[timer_index];
41+
}
42+
43+
static uint8_t tc_index_from_ptr(void* ptr) {
44+
for (uint8_t i = TC_INST_NUM; i > 0; i--) {
45+
if (tc_insts[i] == ptr) {
46+
return i;
47+
}
48+
}
49+
return 0xff;
50+
}
51+
52+
void common_hal_protomatter_timer_enable(void* ptr) {
53+
uint8_t timer_index = tc_index_from_ptr(ptr);
54+
if (timer_index == 0xff) {
55+
return;
56+
}
57+
set_timer_handler(true, timer_index, TC_HANDLER_PROTOMATTER);
58+
turn_on_clocks(true, timer_index, 1);
59+
}
60+
61+
void common_hal_protomatter_timer_disable(void* ptr) {
62+
uint8_t timer_index = tc_index_from_ptr(ptr);
63+
if (timer_index == 0xff) {
64+
return;
65+
}
66+
set_timer_handler(true, timer_index, TC_HANDLER_NO_INTERRUPT);
67+
}
68+
69+
void common_hal_protomatter_timer_free(void* ptr) {
70+
uint8_t timer_index = tc_index_from_ptr(ptr);
71+
if (timer_index == 0xff) {
72+
return;
73+
}
74+
tc_set_enable(ptr, false);
75+
tc_reset(ptr);
76+
timer_reset_ok(timer_index, true);
77+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* This file is part of the Micro Python project, http://micropython.org/
3+
*
4+
* The MIT License (MIT)
5+
*
6+
* Copyright (c) 2020 Jeff Epler for Adafruit Industries
7+
*
8+
* Permission is hereby granted, free of charge, to any person obtaining a copy
9+
* of this software and associated documentation files (the "Software"), to deal
10+
* in the Software without restriction, including without limitation the rights
11+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12+
* copies of the Software, and to permit persons to whom the Software is
13+
* furnished to do so, subject to the following conditions:
14+
*
15+
* The above copyright notice and this permission notice shall be included in
16+
* all copies or substantial portions of the Software.
17+
*
18+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24+
* THE SOFTWARE.
25+
*/
26+
27+
#ifndef MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_PROTOMATTER_PROTOMATTER_H
28+
#define MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_PROTOMATTER_PROTOMATTER_H
29+
30+
void *common_hal_protomatter_timer_allocate(void);
31+
void common_hal_protomatter_timer_enable(void*);
32+
void common_hal_protomatter_timer_disable(void*);
33+
void common_hal_protomatter_timer_free(void*);
34+
35+
#endif

ports/atmel-samd/common-hal/_protomatter/__init__.c

Whitespace-only changes.

ports/atmel-samd/common-hal/microcontroller/Pin.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,3 +240,15 @@ bool common_hal_mcu_pin_is_free(const mcu_pin_obj_t* pin) {
240240

241241
return pin_number_is_free(pin->number);
242242
}
243+
244+
uint8_t common_hal_mcu_pin_number(const mcu_pin_obj_t* pin) {
245+
return pin->number;
246+
}
247+
248+
void common_hal_mcu_pin_claim(const mcu_pin_obj_t* pin) {
249+
return claim_pin(pin);
250+
}
251+
252+
void common_hal_mcu_pin_reset_number(uint8_t pin_no) {
253+
reset_pin_number(pin_no);
254+
}

ports/atmel-samd/common-hal/pulseio/PWMOut.c

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,22 +61,31 @@ uint8_t tcc_channels[5]; // Set by pwmout_reset() to {0xc0, 0xf0, 0xf8, 0xfc,
6161

6262
static uint8_t never_reset_tc_or_tcc[TC_INST_NUM + TCC_INST_NUM];
6363

64-
void common_hal_pulseio_pwmout_never_reset(pulseio_pwmout_obj_t *self) {
65-
if (self->timer->is_tc) {
66-
never_reset_tc_or_tcc[self->timer->index] += 1;
64+
STATIC void timer_refcount(int index, bool is_tc, int increment) {
65+
if (is_tc) {
66+
never_reset_tc_or_tcc[index] += increment;
6767
} else {
68-
never_reset_tc_or_tcc[TC_INST_NUM + self->timer->index] += 1;
68+
never_reset_tc_or_tcc[TC_INST_NUM + index] += increment;
6969
}
70+
}
71+
72+
void timer_never_reset(int index, bool is_tc) {
73+
timer_refcount(index, is_tc, 1);
74+
}
75+
76+
void timer_reset_ok(int index, bool is_tc) {
77+
timer_refcount(index, is_tc, -1);
78+
}
79+
80+
81+
void common_hal_pulseio_pwmout_never_reset(pulseio_pwmout_obj_t *self) {
82+
timer_never_reset(self->timer->index, self->timer->is_tc);
7083

7184
never_reset_pin_number(self->pin->number);
7285
}
7386

7487
void common_hal_pulseio_pwmout_reset_ok(pulseio_pwmout_obj_t *self) {
75-
if (self->timer->is_tc) {
76-
never_reset_tc_or_tcc[self->timer->index] -= 1;
77-
} else {
78-
never_reset_tc_or_tcc[TC_INST_NUM + self->timer->index] -= 1;
79-
}
88+
timer_reset_ok(self->timer->index, self->timer->is_tc);
8089
}
8190

8291
void pwmout_reset(void) {

ports/atmel-samd/mpconfigport.mk

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,18 @@ CIRCUITPY_ULAB = 1
7070
endif
7171
endif
7272

73+
ifndef CIRCUITPY_PROTOMATTER
74+
ifneq ($(CIRCUITPY_SMALL_BUILD),1)
75+
CIRCUITPY_PROTOMATTER = 1
76+
endif
77+
endif
78+
79+
ifndef CIRCUITPY_FRAMEBUFFERIO
80+
ifneq ($(CIRCUITPY_SMALL_BUILD),1)
81+
CIRCUITPY_FRAMEBUFFERIO = 1
82+
endif
83+
endif
84+
7385
endif # samd51
7486

7587
INTERNAL_LIBM = 1

ports/atmel-samd/peripherals

ports/atmel-samd/timer_handler.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
#include "shared-module/_pew/PewPew.h"
3434
#include "common-hal/frequencyio/FrequencyIn.h"
3535

36+
extern void _PM_IRQ_HANDLER(void);
37+
3638
static uint8_t tc_handler[TC_INST_NUM];
3739

3840
void set_timer_handler(bool is_tc, uint8_t index, uint8_t timer_handler) {
@@ -62,6 +64,11 @@ void shared_timer_handler(bool is_tc, uint8_t index) {
6264
frequencyin_interrupt_handler(index);
6365
#endif
6466
break;
67+
case TC_HANDLER_PROTOMATTER:
68+
#if CIRCUITPY_PROTOMATTER
69+
_PM_IRQ_HANDLER();
70+
#endif
71+
break;
6572
default:
6673
break;
6774
}

ports/atmel-samd/timer_handler.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,13 @@
3030
#define TC_HANDLER_PULSEOUT 0x1
3131
#define TC_HANDLER_PEW 0x2
3232
#define TC_HANDLER_FREQUENCYIN 0x3
33+
#define TC_HANDLER_PROTOMATTER 0x4
3334

3435
void set_timer_handler(bool is_tc, uint8_t index, uint8_t timer_handler);
3536
void shared_timer_handler(bool is_tc, uint8_t index);
3637

38+
// implementation of these functions is in PWMOut.c
39+
void timer_never_reset(int index, bool is_tc);
40+
void timer_reset_ok(int index, bool is_tc);
41+
3742
#endif // MICROPY_INCLUDED_ATMEL_SAMD_TIMER_HANDLER_H

ports/nrf/boards/clue_nrf52840_express/board.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ void board_init(void) {
7777
false, // Pixels in a byte share a row. Only used for depth < 8
7878
1, // bytes per cell. Only valid for depths < 8
7979
false, // reverse_pixels_in_byte. Only valid for depths < 8
80+
true, // reverse_pixels_in_word
8081
MIPI_COMMAND_SET_COLUMN_ADDRESS, // Set column command
8182
MIPI_COMMAND_SET_PAGE_ADDRESS, // Set row command
8283
MIPI_COMMAND_WRITE_MEMORY_START, // Write memory command

0 commit comments

Comments
 (0)