Updated ESP-IDF to latest and adapt spi master.

This commit is contained in:
devsaurus 2017-09-02 11:37:48 +02:00
parent 689bad8dae
commit 9f8664b8e6
4 changed files with 29 additions and 18 deletions

View File

@ -6,7 +6,7 @@
#include "lextra.h" #include "lextra.h"
#include "driver/spi_master.h" #include "driver/spi_master.h"
#include "esp_heap_alloc_caps.h" #include "esp_heap_caps.h"
#include "esp_log.h" #include "esp_log.h"
@ -97,8 +97,8 @@ static int lspi_device_transfer( lua_State *L )
const char * const options[] = {"std", "dio", "qio"}; const char * const options[] = {"std", "dio", "qio"};
const uint32_t options_flags[] = {0, SPI_TRANS_MODE_DIO, SPI_TRANS_MODE_QIO}; const uint32_t options_flags[] = {0, SPI_TRANS_MODE_DIO, SPI_TRANS_MODE_QIO};
CONFIG_TRANS_FROM_FIELD(command); CONFIG_TRANS_FROM_FIELD(cmd);
CONFIG_TRANS_FROM_FIELD(address); CONFIG_TRANS_FROM_FIELD(addr);
// //
lua_getfield( L, stack, "rxlen" ); lua_getfield( L, stack, "rxlen" );
rx_len = luaL_optint( L, -1, 0 ); rx_len = luaL_optint( L, -1, 0 );
@ -128,7 +128,7 @@ static int lspi_device_transfer( lua_State *L )
} else { } else {
// use DMA'able buffer // use DMA'able buffer
if ((trans.tx_buffer = pvPortMallocCaps( data_len, MALLOC_CAP_DMA ))) { if ((trans.tx_buffer = heap_caps_malloc( data_len, MALLOC_CAP_DMA ))) {
memcpy( (void *)trans.tx_buffer, data, data_len ); memcpy( (void *)trans.tx_buffer, data, data_len );
} else { } else {
msg = "no memory"; msg = "no memory";
@ -147,7 +147,7 @@ static int lspi_device_transfer( lua_State *L )
} else { } else {
// use DMA'able buffer // use DMA'able buffer
if (!(trans.rx_buffer = pvPortMallocCaps( rx_len, MALLOC_CAP_DMA ))) { if (!(trans.rx_buffer = heap_caps_malloc( rx_len, MALLOC_CAP_DMA ))) {
msg = "no mem"; msg = "no mem";
goto free_mem; goto free_mem;
} }
@ -167,9 +167,9 @@ static int lspi_device_transfer( lua_State *L )
free_mem: free_mem:
if (!(trans.flags & SPI_TRANS_USE_TXDATA) && trans.tx_buffer) if (!(trans.flags & SPI_TRANS_USE_TXDATA) && trans.tx_buffer)
free( (void *)trans.tx_buffer ); heap_caps_free( (void *)trans.tx_buffer );
if (!(trans.flags & SPI_TRANS_USE_RXDATA) && trans.rx_buffer) if (!(trans.flags & SPI_TRANS_USE_RXDATA) && trans.rx_buffer)
free( (void *)trans.rx_buffer ); heap_caps_free( (void *)trans.rx_buffer );
if (msg) if (msg)
return luaL_error( L, msg ); return luaL_error( L, msg );
@ -237,9 +237,12 @@ int lspi_master( lua_State *L )
CONFIG_BUS_PIN_FROM_FIELD(miso); CONFIG_BUS_PIN_FROM_FIELD(miso);
CONFIG_BUS_PIN_FROM_FIELD(quadwp); CONFIG_BUS_PIN_FROM_FIELD(quadwp);
CONFIG_BUS_PIN_FROM_FIELD(quadhd); CONFIG_BUS_PIN_FROM_FIELD(quadhd);
lua_settop( L, stack ); lua_pop( L, 5 );
//
if (no_err( spi_bus_initialize( host, &config, 1 ) )) { int use_dma = luaL_optint( L, ++stack, 1 );
luaL_argcheck( L, use_dma >= 0 && use_dma <= 2, stack, "out of range" );
if (no_err( spi_bus_initialize( host, &config, use_dma ) )) {
lspi_host_t *ud = (lspi_host_t *)lua_newuserdata( L, sizeof( lspi_host_t ) ); lspi_host_t *ud = (lspi_host_t *)lua_newuserdata( L, sizeof( lspi_host_t ) );
luaL_getmetatable( L, UD_HOST_STR ); luaL_getmetatable( L, UD_HOST_STR );
lua_setmetatable( L, -2 ); lua_setmetatable( L, -2 );

View File

@ -10,7 +10,7 @@
#include "u8x8_nodemcu_hal.h" #include "u8x8_nodemcu_hal.h"
#include "esp_heap_alloc_caps.h" #include "esp_heap_caps.h"
uint8_t u8x8_gpio_and_delay_nodemcu(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) uint8_t u8x8_gpio_and_delay_nodemcu(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr)
@ -289,7 +289,7 @@ uint8_t u8x8_byte_nodemcu_spi(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *
case U8X8_MSG_BYTE_START_TRANSFER: case U8X8_MSG_BYTE_START_TRANSFER:
hal->buffer.size = 256; hal->buffer.size = 256;
if (!(hal->buffer.data = (uint8_t *)pvPortMallocCaps( hal->buffer.size, MALLOC_CAP_DMA ))) if (!(hal->buffer.data = (uint8_t *)heap_caps_malloc( hal->buffer.size, MALLOC_CAP_DMA )))
return 0; return 0;
hal->buffer.used = 0; hal->buffer.used = 0;
@ -300,12 +300,13 @@ uint8_t u8x8_byte_nodemcu_spi(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *
while (hal->buffer.size - hal->buffer.used < arg_int) { while (hal->buffer.size - hal->buffer.used < arg_int) {
hal->buffer.size *= 2; hal->buffer.size *= 2;
uint8_t *tmp; uint8_t *tmp;
if (!(tmp = (uint8_t *)pvPortMallocCaps( hal->buffer.size, MALLOC_CAP_DMA ))) { if (!(tmp = (uint8_t *)heap_caps_malloc( hal->buffer.size, MALLOC_CAP_DMA ))) {
free( hal->buffer.data ); heap_caps_free( hal->buffer.data );
hal->buffer.data = NULL;
return 0; return 0;
} }
memcpy( tmp, hal->buffer.data, hal->buffer.used ); memcpy( tmp, hal->buffer.data, hal->buffer.used );
free( hal->buffer.data ); heap_caps_free( hal->buffer.data );
hal->buffer.data = tmp; hal->buffer.data = tmp;
} }
memcpy( hal->buffer.data + hal->buffer.used, arg_ptr, arg_int ); memcpy( hal->buffer.data + hal->buffer.used, arg_ptr, arg_int );
@ -318,7 +319,7 @@ uint8_t u8x8_byte_nodemcu_spi(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *
u8x8_gpio_SetCS( u8x8, u8x8->display_info->chip_disable_level ); u8x8_gpio_SetCS( u8x8, u8x8->display_info->chip_disable_level );
if (hal->buffer.data) if (hal->buffer.data)
free( hal->buffer.data ); heap_caps_free( hal->buffer.data );
break; break;
default: default:

View File

@ -17,7 +17,7 @@ The host signals can be mapped to any suitable GPIO pins.
Initializes a bus in master mode and returns a bus master object. Initializes a bus in master mode and returns a bus master object.
#### Syntax #### Syntax
`spi.master(host, config)` `spi.master(host, config[, dma])`
#### Parameters #### Parameters
- `host` id, one of - `host` id, one of
@ -30,6 +30,9 @@ Initializes a bus in master mode and returns a bus master object.
- `miso` - `miso`
- `quadwp` - `quadwp`
- `quadhd` - `quadhd`
- `dma` set DMA channel (1 or 2) or disable DMA (0), defaults to 1 if omitted.
Enabling DMA allows sending and receiving an unlimited amount of bytes but has restrictions in halfduplex mode (see [`spi.master:device()`](#spimasterdevice)).
Disabling DMA limits a transaction to 32&nbsp;bytes max.
#### Returns #### Returns
SPI bus master object SPI bus master object
@ -61,6 +64,10 @@ none
## spi.master:device() ## spi.master:device()
Adds a device on the given master bus. Up to three devices per bus are supported. Adds a device on the given master bus. Up to three devices per bus are supported.
!!! note
Due to restrictions of the ESP IDF, halfduplex mode does not support DMA with both MOSI and MISO phases. Disable DMA during the call to [`spi.master()`](#spimaster) in this case and ensure that transaction data is not larger than 32&nbsp;bytes.
#### Syntax #### Syntax
`busmaster:device(config)` `busmaster:device(config)`

@ -1 +1 @@
Subproject commit 9b955f4c9f1b32652ea165d3e4cdaad01bba170e Subproject commit 3a1de7dba3565424a12f795b71af45dc3c2072fc