@@ -171,6 +171,10 @@ enum gpio_drive_strength {
171
171
GPIO_DRIVE_STRENGTH_12MA = 3
172
172
};
173
173
174
+ struct fp24_8 {
175
+ uint32_t val ;
176
+ };
177
+
174
178
typedef rp1_pio_sm_config pio_sm_config ;
175
179
176
180
typedef struct rp1_pio_client * PIO ;
@@ -218,6 +222,13 @@ void pio_close(PIO pio);
218
222
int pio_sm_config_xfer (PIO pio , uint sm , uint dir , uint buf_size , uint buf_count );
219
223
int pio_sm_xfer_data (PIO pio , uint sm , uint dir , uint data_bytes , void * data );
220
224
225
+ static inline struct fp24_8 make_fp24_8 (uint mul , uint div )
226
+ {
227
+ struct fp24_8 res = { .val = ((unsigned long long )mul << 8 ) / div };
228
+
229
+ return res ;
230
+ }
231
+
221
232
static inline bool pio_can_add_program (struct rp1_pio_client * client ,
222
233
const pio_program_t * program )
223
234
{
@@ -396,16 +407,18 @@ static inline int pio_sm_clear_fifos(struct rp1_pio_client *client, uint sm)
396
407
return rp1_pio_sm_clear_fifos (client , & args );
397
408
}
398
409
399
- static inline bool pio_calculate_clkdiv_from_float ( float div , uint16_t * div_int ,
410
+ static inline bool pio_calculate_clkdiv_from_fp24_8 ( struct fp24_8 div , uint16_t * div_int ,
400
411
uint8_t * div_frac )
401
412
{
402
- if (bad_params_if (NULL , div < 1 || div > 65536 ))
413
+ uint inum = (div .val >> 8 );
414
+
415
+ if (bad_params_if (NULL , inum < 1 || inum > 65536 ))
403
416
return false;
404
- * div_int = (uint16_t )div ;
417
+ * div_int = (uint16_t )inum ;
405
418
if (* div_int == 0 )
406
419
* div_frac = 0 ;
407
420
else
408
- * div_frac = ( uint8_t )(( div - ( float ) * div_int ) * ( 1u << 8u )) ;
421
+ * div_frac = div . val & 0xff ;
409
422
return true;
410
423
}
411
424
@@ -421,11 +434,11 @@ static inline int pio_sm_set_clkdiv_int_frac(struct rp1_pio_client *client, uint
421
434
return rp1_pio_sm_set_clkdiv (client , & args );
422
435
}
423
436
424
- static inline int pio_sm_set_clkdiv (struct rp1_pio_client * client , uint sm , float div )
437
+ static inline int pio_sm_set_clkdiv (struct rp1_pio_client * client , uint sm , struct fp24_8 div )
425
438
{
426
439
struct rp1_pio_sm_set_clkdiv_args args = { .sm = sm };
427
440
428
- if (!pio_calculate_clkdiv_from_float (div , & args .div_int , & args .div_frac ))
441
+ if (!pio_calculate_clkdiv_from_fp24_8 (div , & args .div_int , & args .div_frac ))
429
442
return - EINVAL ;
430
443
return rp1_pio_sm_set_clkdiv (client , & args );
431
444
}
@@ -745,12 +758,12 @@ static inline void sm_config_set_clkdiv_int_frac(pio_sm_config *c, uint16_t div_
745
758
(((uint )div_int ) << PROC_PIO_SM0_CLKDIV_INT_LSB );
746
759
}
747
760
748
- static inline void sm_config_set_clkdiv (pio_sm_config * c , float div )
761
+ static inline void sm_config_set_clkdiv (pio_sm_config * c , struct fp24_8 div )
749
762
{
750
763
uint16_t div_int ;
751
764
uint8_t div_frac ;
752
765
753
- pio_calculate_clkdiv_from_float (div , & div_int , & div_frac );
766
+ pio_calculate_clkdiv_from_fp24_8 (div , & div_int , & div_frac );
754
767
sm_config_set_clkdiv_int_frac (c , div_int , div_frac );
755
768
}
756
769
0 commit comments