diff --git a/esp8266/esp_mphal.c b/esp8266/esp_mphal.c index 53c03f62da98ac3b0e494bf530fd7f7af95be816..25f1a9322fac3514d504d2b1acf9f2b21670c732 100644 --- a/esp8266/esp_mphal.c +++ b/esp8266/esp_mphal.c @@ -234,3 +234,25 @@ void mp_hal_pin_config_od(mp_hal_pin_obj_t pin_id) { GPIO_REG_READ(GPIO_ENABLE_ADDRESS) | (1 << pin->phys_port)); ETS_GPIO_INTR_ENABLE(); } + +// Get pointer to esf_buf bookkeeping structure +void *ets_get_esf_buf_ctlblk(void) { + // Get literal ptr before start of esf_rx_buf_alloc func + extern void *esf_rx_buf_alloc(); + return ((void**)esf_rx_buf_alloc)[-1]; +} + +// Get number of esf_buf free buffers of given type, as encoded by index +// idx 0 corresponds to buf types 1, 2; 1 - 4; 2 - 5; 3 - 7; 4 - 8 +// Only following buf types appear to be used: +// 1 - tx buffer, 5 - management frame tx buffer; 8 - rx buffer +int ets_esf_free_bufs(int idx) { + uint32_t *p = ets_get_esf_buf_ctlblk(); + uint32_t *b = (uint32_t*)p[idx]; + int cnt = 0; + while (b) { + b = (uint32_t*)b[0x20 / 4]; + cnt++; + } + return cnt; +} diff --git a/esp8266/esp_mphal.h b/esp8266/esp_mphal.h index 2de5fcc5126a7e39d43479d8611b35840f4fc3eb..13b1c8fdf00b23b41ef8ba13524b5a2a5437f261 100644 --- a/esp8266/esp_mphal.h +++ b/esp8266/esp_mphal.h @@ -77,4 +77,7 @@ void mp_hal_pin_config_od(mp_hal_pin_obj_t pin); #define mp_hal_pin_read(p) pin_get(p) #define mp_hal_pin_write(p, v) pin_set((p), (v)) +void *ets_get_esf_buf_ctlblk(void); +int ets_esf_free_bufs(int idx); + #endif // _INCLUDED_MPHAL_H_