34
34
35
35
#define MP_HAL_BITSTREAM_NS_OVERHEAD (9)
36
36
37
+ #if PICO_RISCV
38
+
39
+ __attribute__((naked )) void mcycle_init (void ) {
40
+ __asm volatile (
41
+ "li a0, 4\n"
42
+ "csrw mcountinhibit, a0\n"
43
+ "ret\n"
44
+ );
45
+ }
46
+
47
+ __attribute__((naked )) uint32_t mcycle_get (void ) {
48
+ __asm volatile (
49
+ "csrr a0, mcycle\n"
50
+ "ret\n"
51
+ );
52
+ }
53
+
54
+ #endif
55
+
37
56
void __time_critical_func (machine_bitstream_high_low )(mp_hal_pin_obj_t pin , uint32_t * timing_ns , const uint8_t * buf , size_t len ) {
38
57
uint32_t fcpu_mhz = mp_hal_get_cpu_freq () / 1000000 ;
39
58
// Convert ns to clock ticks [high_time_0, period_0, high_time_1, period_1].
@@ -49,14 +68,16 @@ void __time_critical_func(machine_bitstream_high_low)(mp_hal_pin_obj_t pin, uint
49
68
}
50
69
mp_hal_pin_output (pin );
51
70
71
+ uint32_t irq_state = mp_hal_quiet_timing_enter ();
72
+
73
+ #if PICO_ARM
74
+
52
75
// Set systick reset value.
53
76
systick_hw -> rvr = 0x00FFFFFF ;
54
77
55
78
// Enable the systick counter, source CPU clock.
56
79
systick_hw -> csr = 5 ;
57
80
58
- uint32_t irq_state = mp_hal_quiet_timing_enter ();
59
-
60
81
for (size_t i = 0 ; i < len ; ++ i ) {
61
82
uint8_t b = buf [i ];
62
83
for (size_t j = 0 ; j < 8 ; ++ j ) {
@@ -72,6 +93,27 @@ void __time_critical_func(machine_bitstream_high_low)(mp_hal_pin_obj_t pin, uint
72
93
}
73
94
}
74
95
96
+ #elif PICO_RISCV
97
+
98
+ mcycle_init ();
99
+
100
+ for (size_t i = 0 ; i < len ; ++ i ) {
101
+ uint8_t b = buf [i ];
102
+ for (size_t j = 0 ; j < 8 ; ++ j ) {
103
+ uint32_t * t = & timing_ns [b >> 6 & 2 ];
104
+ uint32_t start_ticks = mcycle_get ();
105
+ mp_hal_pin_high (pin );
106
+ while ((mcycle_get () - start_ticks ) < t [0 ]) {
107
+ }
108
+ b <<= 1 ;
109
+ mp_hal_pin_low (pin );
110
+ while ((mcycle_get () - start_ticks ) < t [1 ]) {
111
+ }
112
+ }
113
+ }
114
+
115
+ #endif
116
+
75
117
mp_hal_quiet_timing_exit (irq_state );
76
118
}
77
119
0 commit comments