41
41
#include "esp_hosted_hal.h"
42
42
#include "esp_hosted_wifi.h"
43
43
44
- #ifndef MICROPY_HW_WIFI_IRQ
45
- #define MICROPY_HW_WIFI_IRQ MICROPY_HW_WIFI_HANDSHAKE
46
- #endif
44
+ extern void mod_network_poll_events (void );
47
45
48
46
STATIC mp_obj_t esp_hosted_pin_irq_callback (mp_obj_t self_in ) {
49
- extern void mod_network_poll_events (void );
50
47
mod_network_poll_events ();
51
48
return mp_const_none ;
52
49
}
@@ -64,34 +61,16 @@ MP_WEAK int esp_hosted_hal_init(uint32_t mode) {
64
61
mp_hal_pin_input (MICROPY_HW_WIFI_HANDSHAKE );
65
62
mp_hal_pin_input (MICROPY_HW_WIFI_DATAREADY );
66
63
67
- // Enable Pin-IRQ for the handshake PIN to call esp_hosted_wifi_poll()
68
- mp_obj_t irq_rising_attr [2 ];
69
- mp_load_method_maybe ((mp_obj_t )MICROPY_HW_WIFI_IRQ , MP_QSTR_IRQ_RISING , irq_rising_attr );
70
-
71
- if (irq_rising_attr [0 ] != MP_OBJ_NULL && irq_rising_attr [1 ] == MP_OBJ_NULL ) { // value for IRQ rising found
72
- mp_obj_t pin_args [] = {
73
- NULL , // Method pointer
74
- (mp_obj_t )MICROPY_HW_WIFI_IRQ , // Pin object
75
- (mp_obj_t )& esp_hosted_pin_irq_callback_obj , // Callback function object
76
- NULL , // The Rising edge value is set below.
77
- mp_const_true , // Hard IRQ, since the actual polling is scheduled.
78
- };
79
- pin_args [3 ] = irq_rising_attr [0 ];
80
- mp_load_method_maybe ((mp_obj_t )MICROPY_HW_WIFI_IRQ , MP_QSTR_irq , pin_args );
81
- if (pin_args [0 ] != MP_OBJ_NULL && pin_args [1 ] != MP_OBJ_NULL ) {
82
- mp_call_method_n_kw (3 , 0 , pin_args );
83
- }
84
- }
85
-
86
64
// Initialize SPI.
87
65
mp_obj_t args [] = {
88
66
MP_OBJ_NEW_SMALL_INT (MICROPY_HW_WIFI_SPI_ID ),
89
67
MP_OBJ_NEW_SMALL_INT (MICROPY_HW_WIFI_SPI_BAUDRATE ),
68
+ MP_OBJ_NEW_QSTR (MP_QSTR_phase ), MP_OBJ_NEW_SMALL_INT (0 ),
90
69
MP_OBJ_NEW_QSTR (MP_QSTR_polarity ), MP_OBJ_NEW_SMALL_INT (1 ),
91
70
};
92
71
93
72
MP_STATE_PORT (mp_wifi_spi ) =
94
- MP_OBJ_TYPE_GET_SLOT (& machine_spi_type , make_new )((mp_obj_t )& machine_spi_type , 2 , 1 , args );
73
+ MP_OBJ_TYPE_GET_SLOT (& machine_spi_type , make_new )((mp_obj_t )& machine_spi_type , 2 , 2 , args );
95
74
96
75
// SPI might change the direction/mode of CS pin,
97
76
// set it to GPIO again just in case.
@@ -101,16 +80,8 @@ MP_WEAK int esp_hosted_hal_init(uint32_t mode) {
101
80
}
102
81
103
82
MP_WEAK int esp_hosted_hal_deinit (void ) {
104
- // Disable Pin-IRQ for the handshake PIN
105
- mp_obj_t pin_args [] = {
106
- NULL , // Method pointer
107
- (mp_obj_t )MICROPY_HW_WIFI_IRQ , // Pin object
108
- mp_const_none // Set to None
109
- };
110
- mp_load_method_maybe ((mp_obj_t )MICROPY_HW_WIFI_IRQ , MP_QSTR_irq , pin_args );
111
- if (pin_args [0 ] && pin_args [1 ]) {
112
- mp_call_method_n_kw (1 , 0 , pin_args );
113
- }
83
+ // Disable pin IRQ.
84
+ esp_hosted_hal_irq_enable (false);
114
85
115
86
// Remove all network interfaces and reset wifi state.
116
87
esp_hosted_wifi_deinit ();
@@ -134,6 +105,43 @@ MP_WEAK int esp_hosted_hal_deinit(void) {
134
105
return 0 ;
135
106
}
136
107
108
+ MP_WEAK void esp_hosted_hal_irq_enable (bool enable ) {
109
+ #ifdef MICROPY_HW_WIFI_IRQ_PIN
110
+ // Disable Pin-IRQ for the handshake PIN
111
+ mp_obj_t pin_args [] = {
112
+ NULL , // Method pointer
113
+ (mp_obj_t )MICROPY_HW_WIFI_IRQ_PIN , // Pin object
114
+ mp_const_none // Set to None
115
+ };
116
+ mp_load_method_maybe ((mp_obj_t )MICROPY_HW_WIFI_IRQ_PIN , MP_QSTR_irq , pin_args );
117
+ if (pin_args [0 ] && pin_args [1 ]) {
118
+ mp_call_method_n_kw (1 , 0 , pin_args );
119
+ }
120
+
121
+ if (enable ) {
122
+ // Enable Pin-IRQ for the handshake PIN to call esp_hosted_wifi_poll()
123
+ mp_obj_t irq_rising_attr [2 ];
124
+ mp_load_method_maybe ((mp_obj_t )MICROPY_HW_WIFI_IRQ_PIN , MP_QSTR_IRQ_RISING , irq_rising_attr );
125
+
126
+ if (irq_rising_attr [0 ] != MP_OBJ_NULL && irq_rising_attr [1 ] == MP_OBJ_NULL ) {
127
+ // value for IRQ rising found
128
+ mp_obj_t pin_args [] = {
129
+ NULL , // Method pointer
130
+ (mp_obj_t )MICROPY_HW_WIFI_IRQ_PIN , // Pin object
131
+ (mp_obj_t )& esp_hosted_pin_irq_callback_obj , // Callback function object
132
+ NULL , // The Rising edge value is set below.
133
+ mp_const_true , // Hard IRQ, since the actual polling is scheduled.
134
+ };
135
+ pin_args [3 ] = irq_rising_attr [0 ];
136
+ mp_load_method_maybe ((mp_obj_t )MICROPY_HW_WIFI_IRQ_PIN , MP_QSTR_irq , pin_args );
137
+ if (pin_args [0 ] != MP_OBJ_NULL && pin_args [1 ] != MP_OBJ_NULL ) {
138
+ mp_call_method_n_kw (3 , 0 , pin_args );
139
+ }
140
+ }
141
+ }
142
+ #endif
143
+ }
144
+
137
145
MP_WEAK int esp_hosted_hal_atomic_enter (void ) {
138
146
#if MICROPY_ENABLE_SCHEDULER
139
147
mp_sched_lock ();
@@ -149,7 +157,7 @@ MP_WEAK int esp_hosted_hal_atomic_exit(void) {
149
157
}
150
158
151
159
MP_WEAK bool esp_hosted_hal_data_ready (void ) {
152
- return mp_hal
F438
_pin_read (MICROPY_HW_WIFI_DATAREADY ) && mp_hal_pin_read ( MICROPY_HW_WIFI_HANDSHAKE ) ;
160
+ return mp_hal_pin_read (MICROPY_HW_WIFI_DATAREADY );
153
161
}
154
162
155
163
MP_WEAK int esp_hosted_hal_spi_transfer (const uint8_t * tx_buf , uint8_t * rx_buf , uint32_t size ) {
@@ -158,7 +166,8 @@ MP_WEAK int esp_hosted_hal_spi_transfer(const uint8_t *tx_buf, uint8_t *rx_buf,
158
166
159
167
// Wait for handshake pin to go high.
160
168
for (mp_uint_t start = mp_hal_ticks_ms (); ; mp_hal_delay_ms (1 )) {
161
- if (mp_hal_pin_read (MICROPY_HW_WIFI_HANDSHAKE )) {
169
+ if (mp_hal_pin_read (MICROPY_HW_WIFI_HANDSHAKE ) &&
170
+ (rx_buf == NULL || mp_hal_pin_read (MICROPY_HW_WIFI_DATAREADY ))) {
162
171
break ;
163
172
}
164
173
if ((mp_hal_ticks_ms () - start ) >= 1000 ) {
@@ -171,6 +180,11 @@ MP_WEAK int esp_hosted_hal_spi_transfer(const uint8_t *tx_buf, uint8_t *rx_buf,
171
180
mp_hal_delay_us (10 );
172
181
spi_proto -> transfer (mp_wifi_spi , size , tx_buf , rx_buf );
173
182
mp_hal_pin_write (MICROPY_HW_WIFI_SPI_CS , 1 );
183
+ mp_hal_delay_us (100 );
184
+
185
+ if (esp_hosted_hal_data_ready ()) {
186
+ mod_network_poll_events ();
187
+ }
174
188
return 0 ;
175
189
}
176
190
0 commit comments