@@ -46,7 +46,7 @@ void pulseout_reset() {
46
46
}
47
47
48
48
void common_hal_pulseio_pulseout_construct (pulseio_pulseout_obj_t * self , const pulseio_pwmout_obj_t * carrier ) {
49
-
49
+ mp_raise_NotImplementedError ( NULL );
50
50
}
51
51
52
52
bool common_hal_pulseio_pulseout_deinited (pulseio_pulseout_obj_t * self ) {
@@ -60,147 +60,3 @@ void common_hal_pulseio_pulseout_deinit(pulseio_pulseout_obj_t* self) {
60
60
void common_hal_pulseio_pulseout_send (pulseio_pulseout_obj_t * self , uint16_t * pulses , uint16_t length ) {
61
61
62
62
}
63
-
64
- #if 0
65
- // This timer is shared amongst all PulseOut objects under the assumption that
66
- // the code is single threaded. Its stored in MICROPY_PORT_ROOT_POINTERS so it
67
- // doesn't get garbage collected.
68
- static uint8_t refcount = 0 ;
69
-
70
- static __IO PORT_PINCFG_Type * active_pincfg = NULL ;
71
- static uint16_t * pulse_buffer = NULL ;
72
- static volatile uint16_t pulse_index = 0 ;
73
- static uint16_t pulse_length ;
74
- static volatile uint32_t current_compare = 0 ;
75
-
76
- static void turn_on (__IO PORT_PINCFG_Type * pincfg ) {
77
- pincfg -> reg = PORT_PINCFG_PMUXEN ;
78
- }
79
-
80
- static void turn_off (__IO PORT_PINCFG_Type * pincfg ) {
81
- pincfg -> reg = PORT_PINCFG_RESETVALUE ;
82
- }
83
-
84
- void pulse_finish (struct tc_module * const module ) {
85
- pulse_index ++ ;
86
-
87
- if (active_pincfg == NULL ) {
88
- return ;
89
- }
90
- // Always turn it off.
91
- turn_off (active_pincfg );
92
- if (pulse_index >= pulse_length ) {
93
- return ;
94
- }
95
- current_compare = (current_compare + pulse_buffer [pulse_index ] * 3 / 4 ) & 0xffff ;
96
- tc_set_compare_value (MP_STATE_VM (pulseout_tc_instance ), TC_COMPARE_CAPTURE_CHANNEL_0 , current_compare );
97
- if (pulse_index % 2 == 0 ) {
98
- turn_on (active_pincfg );
99
- }
100
- }
101
-
102
- void pulseout_reset () {
103
- refcount = 0 ;
104
- MP_STATE_VM (pulseout_tc_instance ) = NULL ;
105
- active_pincfg = NULL ;
106
- }
107
-
108
- void common_hal_pulseio_pulseout_construct (pulseio_pulseout_obj_t * self ,
109
- const pulseio_pwmout_obj_t * carrier ) {
110
- if (refcount == 0 ) {
111
- // Find a spare timer.
112
- Tc * t = NULL ;
113
- Tc * tcs [TC_INST_NUM ] = TC_INSTS ;
114
- for (uint8_t i = TC_INST_NUM ; i > 0 ; i -- ) {
115
- if (tcs [i - 1 ]-> COUNT16 .CTRLA .bit .ENABLE == 0 ) {
116
- t = tcs [i - 1 ];
117
- break ;
118
- }
119
- }
120
- if (t == NULL ) {
121
- mp_raise_RuntimeError ("All timers in use" );
122
- }
123
- MP_STATE_VM (pulseout_tc_instance ) = gc_alloc (sizeof (struct tc_module ), false);
124
- if (t == NULL ) {
125
- mp_raise_msg (& mp_type_MemoryError , "" );
126
- }
127
-
128
- struct tc_config config_tc ;
129
- tc_get_config_defaults (& config_tc );
130
-
131
- config_tc .counter_size = TC_COUNTER_SIZE_16BIT ;
132
- config_tc .clock_prescaler = TC_CTRLA_PRESCALER_DIV64 ;
133
- config_tc .wave_generation = TC_WAVE_GENERATION_NORMAL_FREQ ;
134
-
135
- tc_init (MP_STATE_VM (pulseout_tc_instance ), t , & config_tc );
136
- tc_register_callback (MP_STATE_VM (pulseout_tc_instance ), pulse_finish , TC_CALLBACK_CC_CHANNEL0 );
137
- tc_enable (MP_STATE_VM (pulseout_tc_instance ));
138
- tc_stop_counter (MP_STATE_VM (pulseout_tc_instance ));
139
- }
140
- refcount ++ ;
141
-
142
- self -> pin = carrier -> pin -> pin ;
143
-
144
- PortGroup * const port_base = port_get_group_from_gpio_pin (self -> pin );
145
- self -> pincfg = & port_base -> PINCFG [self -> pin % 32 ];
146
-
147
- // Set the port to output a zero.
148
- port_base -> OUTCLR .reg = 1 << (self -> pin % 32 );
149
- port_base -> DIRSET .reg = 1 << (self -> pin % 32 );
150
-
151
- // Turn off the pinmux which should connect the port output.
152
- turn_off (self -> pincfg );
153
- }
154
-
155
- bool common_hal_pulseio_pulseout_deinited (pulseio_pulseout_obj_t * self ) {
156
- return self -> pin == NO_PIN ;
157
- }
158
-
159
- void common_hal_pulseio_pulseout_deinit (pulseio_pulseout_obj_t * self ) {
160
- if (common_hal_pulseio_pulseout_deinited (self )) {
161
- return ;
162
- }
163
- PortGroup * const port_base = port_get_group_from_gpio_pin (self -> pin );
164
- port_base -> DIRCLR .reg = 1 << (self -> pin % 32 );
165
-
166
- turn_on (self -> pincfg );
167
-
168
- refcount -- ;
169
- if (refcount == 0 ) {
170
- tc_reset (MP_STATE_VM (pulseout_tc_instance ));
171
- gc_free (MP_STATE_VM (pulseout_tc_instance ));
172
- MP_STATE_VM (pulseout_tc_instance ) = NULL ;
173
- }
174
- self -> pin = NO_PIN ;
175
- }
176
-
177
- void common_hal_pulseio_pulseout_send (pulseio_pulseout_obj_t * self , uint16_t * pulses , uint16_t length ) {
178
- if (active_pincfg != NULL ) {
179
- mp_raise_RuntimeError ("Another send is already active" );
180
- }
181
- active_pincfg = self -> pincfg ;
182
- pulse_buffer = pulses ;
183
- pulse_index = 0 ;
184
- pulse_length = length ;
185
-
186
- current_compare = pulses [0 ] * 3 / 4 ;
187
- tc_set_compare_value (MP_STATE_VM (pulseout_tc_instance ), TC_COMPARE_CAPTURE_CHANNEL_0 , current_compare );
188
-
189
- tc_enable_callback (MP_STATE_VM (pulseout_tc_instance ), TC_CALLBACK_CC_CHANNEL0 );
190
- turn_on (active_pincfg );
191
- tc_start_counter (MP_STATE_VM (pulseout_tc_instance ));
192
-
193
- while (pulse_index < length ) {
194
- // Do other things while we wait. The interrupts will handle sending the
195
- // signal.
196
- #ifdef MICROPY_VM_HOOK_LOOP
197
- MICROPY_VM_HOOK_LOOP
198
- #endif
199
- }
200
-
201
- tc_stop_counter (MP_STATE_VM (pulseout_tc_instance ));
202
- tc_disable_callback (MP_STATE_VM (pulseout_tc_instance ), TC_CALLBACK_CC_CHANNEL0 );
203
- active_pincfg = NULL ;
204
- }
205
- #endif
206
-
0 commit comments