text: /**
   * @file tp_spi.c
   *
   */
  
  /*********************
   *      INCLUDES
   *********************/
  #include "tp_spi.h"
  #include "esp_system.h"
  #include "driver/gpio.h"
  #include "driver/spi_master.h"
  #include <string.h>
  
  /*********************
   *      DEFINES
   *********************/
  
  #define SPI_TOUCH_CLOCK_SPEED_HZ 2 * 1000 * 1000
  #define SPI_TOUCH_SPI_MODE 0
  
  /**********************
   *      TYPEDEFS
   **********************/
  
  
  /**********************
   *  STATIC PROTOTYPES
   **********************/
  static spi_device_handle_t spi;
  
  /**********************
   *  STATIC VARIABLES
   **********************/
  
  /**********************
   *      MACROS
   **********************/
  
  /**********************
   *   GLOBAL FUNCTIONS
   **********************/
  void tp_spi_add_device_config(spi_host_device_t host, spi_device_interface_config_t *devcfg)
  {
  	esp_err_t ret=spi_bus_add_device(host, devcfg, &spi);
  	assert(ret==ESP_OK);
  }
  
  void tp_spi_add_device(spi_host_device_t host)
  {
  	spi_device_interface_config_t devcfg={
                  .clock_speed_hz = SPI_TOUCH_CLOCK_SPEED_HZ,
                  .mode = SPI_TOUCH_SPI_MODE,
  		.spics_io_num=CONFIG_LV_TOUCH_SPI_CS,               //CS pin
  		.queue_size=1,
  		.pre_cb=NULL,
  		.post_cb=NULL,
  		.command_bits = 8,
  		.address_bits = 0,
  		.dummy_bits = 0,
  		.flags = SPI_DEVICE_HALFDUPLEX | SPI_DEVICE_NO_DUMMY,
  	};
  	
  	//Attach the Touch controller to the SPI bus
  	tp_spi_add_device_config(host, &devcfg);
  }
  
  void tp_spi_xchg(uint8_t* data_send, uint8_t* data_recv, uint8_t byte_count)
  {
  	spi_transaction_t t = {
  		.length = byte_count * 8, // SPI transaction length is in bits
  		.tx_buffer = data_send,
  		.rx_buffer = data_recv};
  	
  	esp_err_t ret = spi_device_transmit(spi, &t);
  	assert(ret == ESP_OK);
  }
  
  void tp_spi_write_reg(uint8_t* data, uint8_t byte_count)
  {
  	spi_transaction_t t = {
  	    .length = byte_count * 8,
  	    .tx_buffer = data,
  	    .flags = 0
  	};
  	
  	esp_err_t ret = spi_device_transmit(spi, &t);
  	assert(ret == ESP_OK);
  }
  
  void tp_spi_read_reg(uint8_t reg, uint8_t* data, uint8_t byte_count)
  {
  	spi_transaction_t t = {	
  	    .length = (byte_count + sizeof(reg)) * 8,
  	    .rxlength = byte_count * 8,
  	    .cmd = reg,
  	    .rx_buffer = data,
  	    .flags = 0
  	};
  	
  	// Read - send first byte as command
  	esp_err_t ret = spi_device_transmit(spi, &t);
  	assert(ret == ESP_OK);
  }
  
  /**********************
   *   STATIC FUNCTIONS
   **********************/
  