2828//| :param int num_lanes: the number of data lanes to use (default 2, range 1-4)
2929//| """
3030//|
31+ //
32+ //
33+ // All MCUs we support only have one DSI bus but it can be shared between multiple displays. One
34+ // display may live longer than the VM, so we need to allocate the bus outside the VM. To simplify
35+ // memory tracking, we use a global object for the bus.
36+ //
37+ static mipidsi_bus_obj_t _mipidsi_bus_obj ;
3138
3239static mp_obj_t mipidsi_bus_make_new (const mp_obj_type_t * type , size_t n_args , size_t n_kw , const mp_obj_t * all_args ) {
3340 enum { ARG_frequency , ARG_num_lanes };
@@ -38,7 +45,8 @@ static mp_obj_t mipidsi_bus_make_new(const mp_obj_type_t *type, size_t n_args, s
3845 mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
3946 mp_arg_parse_all_kw_array (n_args , n_kw , all_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
4047
41- mipidsi_bus_obj_t * self = mp_obj_malloc (mipidsi_bus_obj_t , & mipidsi_bus_type );
48+ _mipidsi_bus_obj .base .type = & mipidsi_bus_type ;
49+ mipidsi_bus_obj_t * self = & _mipidsi_bus_obj ;
4250
4351 mp_uint_t frequency = (mp_uint_t )mp_arg_validate_int_min (args [ARG_frequency ].u_int , 1 , MP_QSTR_frequency );
4452 uint8_t num_lanes = (uint8_t )mp_arg_validate_int_range (args [ARG_num_lanes ].u_int , 1 , 4 , MP_QSTR_num_lanes );
@@ -62,28 +70,8 @@ static mp_obj_t mipidsi_bus_deinit(mp_obj_t self_in) {
6270
6371static MP_DEFINE_CONST_FUN_OBJ_1 (mipidsi_bus_deinit_obj , mipidsi_bus_deinit ) ;
6472
65- //| def __enter__(self) -> Bus:
66- //| """No-op used by Context Managers."""
67- //| ...
68- //|
69- // Provided by context manager helper.
70-
71- //| def __exit__(self) -> None:
72- //| """Automatically deinitializes the hardware when exiting a context. See
73- //| :ref:`lifetime-and-contextmanagers` for more info."""
74- //| ...
75- //|
76- static mp_obj_t mipidsi_bus_obj___exit__ (size_t n_args , const mp_obj_t * args ) {
77- (void )n_args ;
78- common_hal_mipidsi_bus_deinit (args [0 ]);
79- return mp_const_none ;
80- }
81- static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (mipidsi_bus___exit___obj , 4 , 4 , mipidsi_bus_obj___exit__ ) ;
82-
8373static const mp_rom_map_elem_t mipidsi_bus_locals_dict_table [] = {
8474 { MP_ROM_QSTR (MP_QSTR_deinit ), MP_ROM_PTR (& mipidsi_bus_deinit_obj ) },
85- { MP_ROM_QSTR (MP_QSTR___enter__ ), MP_ROM_PTR (& default___enter___obj ) },
86- { MP_ROM_QSTR (MP_QSTR___exit__ ), MP_ROM_PTR (& mipidsi_bus___exit___obj ) },
8775};
8876static MP_DEFINE_CONST_DICT (mipidsi_bus_locals_dict , mipidsi_bus_locals_dict_table ) ;
8977
0 commit comments