1
+ #include "qspi_panel.h"
2
+ #include "lcd_panel.h"
3
+
4
+
5
+ #if USE_ESP_LCD
6
+ #include "hal/esp32/esp32.h"
7
+ #else
8
+ #include "hal/commom/soft8080.h"
9
+ #endif
10
+
11
+ #include "mphalport.h"
12
+
13
+ #include "py/obj.h"
14
+ #include "py/runtime.h"
15
+ #include "py/gc.h"
16
+
17
+ #include <string.h>
18
+
19
+
20
+ STATIC void lcd_qspi_panel_print (
21
+ const mp_print_t * print ,
22
+ mp_obj_t self_in , mp_print_kind_t kind
23
+ ) {
24
+ (void ) kind ;
25
+ lcd_qspi_panel_obj_t * self = MP_OBJ_TO_PTR (self_in );
26
+ mp_printf (
27
+ print ,
28
+ "<QSPI Panel SPI=%p, dc=%p, write=%pcs=%p, width=%u, height=%u, cmd_bits=%u, param_bits=%u>" ,
29
+ self -> spi_obj ,
30
+ self -> dc ,
31
+ self -> wr ,
32
+ self -> cs ,
33
+ self -> width ,
34
+ self -> height ,
35
+ self -> cmd_bits ,
36
+ self -> param_bits
37
+ );
38
+ }
39
+
40
+
41
+ STATIC mp_obj_t lcd_qspi_panel_make_new (
42
+ const mp_obj_type_t * type ,
43
+ size_t n_args ,
44
+ size_t n_kw ,
45
+ const mp_obj_t * all_args
46
+ ) {
47
+ enum {
48
+ ARG_spi ,
49
+ ARG_data ,
50
+ ARG_command ,
51
+ ARG_cs ,
52
+ ARG_pclk ,
53
+ ARG_width ,
54
+ ARG_height ,
55
+ ARG_swap_color_bytes ,
56
+ ARG_cmd_bits ,
57
+ ARG_param_bits
58
+ };
59
+ const mp_arg_t make_new_args [] = {
60
+ { MP_QSTR_spi , MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED },
61
+ { MP_QSTR_data , MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED },
62
+ { MP_QSTR_command , MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED },
63
+ { MP_QSTR_cs , MP_ARG_OBJ | MP_ARG_KW_ONLY , {.u_obj = MP_OBJ_NULL } },
64
+ { MP_QSTR_pclk , MP_ARG_INT | MP_ARG_KW_ONLY , {.u_int = 10000000 } },
65
+ { MP_QSTR_width , MP_ARG_INT | MP_ARG_KW_ONLY , {.u_int = 240 } },
66
+ { MP_QSTR_height , MP_ARG_INT | MP_ARG_KW_ONLY , {.u_int = 240 } },
67
+ { MP_QSTR_swap_color_bytes , MP_ARG_BOOL | MP_ARG_KW_ONLY , {.u_bool = false } },
68
+ { MP_QSTR_cmd_bits , MP_ARG_INT | MP_ARG_KW_ONLY , {.u_int = 8 } },
69
+ { MP_QSTR_param_bits , MP_ARG_INT | MP_ARG_KW_ONLY , {.u_int = 8 } },
70
+ };
71
+ mp_arg_val_t args [MP_ARRAY_SIZE (make_new_args )];
72
+ mp_arg_parse_all_kw_array (
73
+ n_args ,
74
+ n_kw ,
75
+ all_args ,
76
+ MP_ARRAY_SIZE (make_new_args ),
77
+ make_new_args , args
78
+ );
79
+
80
+ // create new object
81
+ lcd_qspi_panel_obj_t * self = m_new_obj (lcd_qspi_panel_obj_t );
82
+ self -> base .type = & lcd_qspi_panel_type ;
83
+ self -> spi_obj = (mp_obj_base_t * )MP_OBJ_TO_PTR (args [ARG_spi ].u_obj );
84
+ // data bus
85
+ mp_obj_tuple_t * t = MP_OBJ_TO_PTR (args [ARG_data ].u_obj );
86
+ for (size_t i = 0 ; i < t -> len ; i ++ ) {
87
+ if (i < 4 ) {
88
+ self -> databus_pins [i ] = mp_hal_get_pin_obj (t -> items [i ]);
89
+ }
90
+ }
91
+ self -> dc_pin = mp_hal_get_pin_obj (args [ARG_command ].u_obj );
92
+ self -> cs_pin = mp_hal_get_pin_obj (args [ARG_cs ].u_obj );
93
+ self -> pclk = args [ARG_pclk ].u_int ;
94
+ self -> width = args [ARG_width ].u_int ;
95
+ self -> height = args [ARG_height ].u_int ;
96
+ // self->swap_color_bytes = args[ARG_swap_color_bytes].u_bool;
97
+ self -> cmd_bits = args [ARG_cmd_bits ].u_int ;
98
+ self -> param_bits = args [ARG_param_bits ].u_int ;
99
+
100
+ hal_lcd_qspi_panel_construct (& self -> base );
101
+ return MP_OBJ_FROM_PTR (self );
102
+ }
103
+
104
+
105
+ STATIC mp_obj_t lcd_qspi_panel_tx_param (size_t n_args , const mp_obj_t * args_in ){
106
+ mp_obj_base_t * self = (mp_obj_base_t * )MP_OBJ_TO_PTR (args_in [0 ]);
107
+ int cmd = mp_obj_get_int (args_in [1 ]);
108
+ if (n_args == 3 ) {
109
+ mp_buffer_info_t bufinfo ;
110
+ mp_get_buffer_raise (args_in [2 ], & bufinfo , MP_BUFFER_READ );
111
+ hal_lcd_qspi_panel_tx_param (self , cmd , bufinfo .buf , bufinfo .len );
112
+ } else {
113
+ hal_lcd_qspi_panel_tx_param (self , cmd , NULL , 0 );
114
+ }
115
+
116
+ return mp_const_none ;
117
+ }
118
+ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (lcd_qspi_panel_tx_param_obj , 2 , 3 , lcd_qspi_panel_tx_param );
119
+
120
+
121
+ STATIC mp_obj_t lcd_qspi_panel_tx_color (size_t n_args , const mp_obj_t * args_in ) {
122
+ mp_obj_base_t * self = (mp_obj_base_t * )MP_OBJ_TO_PTR (args_in [0 ]);
123
+ int cmd = mp_obj_get_int (args_in [1 ]);
124
+
125
+ if (n_args == 3 ) {
126
+ mp_buffer_info_t bufinfo ;
127
+ mp_get_buffer_raise (args_in [2 ], & bufinfo , MP_BUFFER_READ );
128
+ hal_lcd_qspi_panel_tx_color (self , cmd , bufinfo .buf , bufinfo .len );
129
+ } else {
130
+ hal_lcd_qspi_panel_tx_color (self , cmd , NULL , 0 );
131
+ }
132
+
133
+ gc_collect ();
134
+ return mp_const_none ;
135
+ }
136
+ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (lcd_qspi_panel_tx_color_obj , 2 , 3 , lcd_qspi_panel_tx_color );
137
+
138
+
139
+ STATIC mp_obj_t lcd_qspi_panel_deinit (mp_obj_t self_in ) {
140
+ mp_obj_base_t * self = (mp_obj_base_t * )MP_OBJ_TO_PTR (self_in );
141
+
142
+ hal_lcd_qspi_panel_deinit (self );
143
+ // m_del_obj(lcd_spi_panel_obj_t, self);
144
+ return mp_const_none ;
145
+ }
146
+ STATIC MP_DEFINE_CONST_FUN_OBJ_1 (lcd_qspi_panel_deinit_obj , lcd_qspi_panel_deinit );
147
+
148
+
149
+ STATIC const mp_rom_map_elem_t lcd_qspi_panel_locals_dict_table [] = {
150
+ { MP_ROM_QSTR (MP_QSTR_tx_param ), MP_ROM_PTR (& lcd_qspi_panel_tx_param_obj ) },
151
+ { MP_ROM_QSTR (MP_QSTR_tx_color ), MP_ROM_PTR (& lcd_qspi_panel_tx_color_obj ) },
152
+ { MP_ROM_QSTR (MP_QSTR_deinit ), MP_ROM_PTR (& lcd_qspi_panel_deinit_obj ) },
153
+ { MP_ROM_QSTR (MP_QSTR___del__ ), MP_ROM_PTR (& lcd_qspi_panel_deinit_obj ) },
154
+ };
155
+ STATIC MP_DEFINE_CONST_DICT (lcd_qspi_panel_locals_dict , lcd_qspi_panel_locals_dict_table );
156
+
157
+
158
+ STATIC const mp_lcd_panel_p_t mp_lcd_panel_p = {
159
+ .tx_param = hal_lcd_qspi_panel_tx_param ,
160
+ .tx_color = hal_lcd_qspi_panel_tx_color ,
161
+ .deinit = hal_lcd_qspi_panel_deinit
162
+ };
163
+
164
+
165
+ const mp_obj_type_t lcd_qspi_panel_type = {
166
+ { & mp_type_type },
167
+ .name = MP_QSTR_QSPI_Panel ,
168
+ .print = lcd_qspi_panel_print ,
169
+ .make_new = lcd_qspi_panel_make_new ,
170
+ .protocol = & mp_lcd_panel_p ,
171
+ .locals_dict = (mp_obj_dict_t * )& lcd_qspi_panel_locals_dict ,
172
+ };
0 commit comments