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