123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- /**
- * Copyright (c) 2017-2018 Tara Keeling
- *
- * This software is released under the MIT License.
- * https://opensource.org/licenses/MIT
- */
- #include <stdio.h>
- #include <stdint.h>
- #include <stdbool.h>
- #include <string.h>
- #include <driver/spi_master.h>
- #include <driver/gpio.h>
- #include <freertos/task.h>
- #include "gds.h"
- #include "gds_err.h"
- #include "gds_private.h"
- #include "gds_default_if.h"
- static const int GDS_SPI_Command_Mode = 0;
- static const int GDS_SPI_Data_Mode = 1;
- static spi_host_device_t SPIHost;
- static int DCPin;
- static bool SPIDefaultWriteBytes( spi_device_handle_t SPIHandle, int WriteMode, const uint8_t* Data, size_t DataLength );
- static bool SPIDefaultWriteCommand( struct GDS_Device* Device, uint8_t Command );
- static bool SPIDefaultWriteData( struct GDS_Device* Device, const uint8_t* Data, size_t DataLength );
- bool GDS_SPIInit( int SPI, int DC ) {
- SPIHost = SPI;
- DCPin = DC;
- return true;
- }
- bool GDS_SPIAttachDevice( struct GDS_Device* Device, int Width, int Height, int CSPin, int RSTPin, int BackLightPin, int Speed ) {
- spi_device_interface_config_t SPIDeviceConfig;
- spi_device_handle_t SPIDevice;
- NullCheck( Device, return false );
-
- if (CSPin >= 0) {
- ESP_ERROR_CHECK_NONFATAL( gpio_set_direction( CSPin, GPIO_MODE_OUTPUT ), return false );
- ESP_ERROR_CHECK_NONFATAL( gpio_set_level( CSPin, 0 ), return false );
- }
-
- memset( &SPIDeviceConfig, 0, sizeof( spi_device_interface_config_t ) );
- SPIDeviceConfig.clock_speed_hz = Speed > 0 ? Speed : SPI_MASTER_FREQ_8M;
- SPIDeviceConfig.spics_io_num = CSPin;
- SPIDeviceConfig.queue_size = 1;
- SPIDeviceConfig.flags = SPI_DEVICE_NO_DUMMY;
- ESP_ERROR_CHECK_NONFATAL( spi_bus_add_device( SPIHost, &SPIDeviceConfig, &SPIDevice ), return false );
-
- Device->WriteCommand = SPIDefaultWriteCommand;
- Device->WriteData = SPIDefaultWriteData;
- Device->SPIHandle = SPIDevice;
- Device->RSTPin = RSTPin;
- Device->CSPin = CSPin;
- Device->Backlight.Pin = BackLightPin;
- Device->IF = GDS_IF_SPI;
- Device->Width = Width;
- Device->Height = Height;
-
- if ( RSTPin >= 0 ) {
- ESP_ERROR_CHECK_NONFATAL( gpio_set_direction( RSTPin, GPIO_MODE_OUTPUT ), return false );
- ESP_ERROR_CHECK_NONFATAL( gpio_set_level( RSTPin, 0 ), return false );
- GDS_Reset( Device );
- }
-
- return GDS_Init( Device );
- }
- static bool SPIDefaultWriteBytes( spi_device_handle_t SPIHandle, int WriteMode, const uint8_t* Data, size_t DataLength ) {
- spi_transaction_t SPITransaction = { 0 };
- NullCheck( SPIHandle, return false );
- NullCheck( Data, return false );
- if ( DataLength > 0 ) {
- gpio_set_level( DCPin, WriteMode );
-
- SPITransaction.length = DataLength * 8;
- SPITransaction.tx_buffer = Data;
-
- // only do polling as we don't have contention on SPI (otherwise DMA for transfers > 16 bytes)
- ESP_ERROR_CHECK_NONFATAL( spi_device_polling_transmit(SPIHandle, &SPITransaction), return false );
- }
- return true;
- }
- static bool SPIDefaultWriteCommand( struct GDS_Device* Device, uint8_t Command ) {
- static uint8_t CommandByte = 0;
- NullCheck( Device, return false );
- NullCheck( Device->SPIHandle, return false );
- CommandByte = Command;
- return SPIDefaultWriteBytes( Device->SPIHandle, GDS_SPI_Command_Mode, &CommandByte, 1 );
- }
- static bool SPIDefaultWriteData( struct GDS_Device* Device, const uint8_t* Data, size_t DataLength ) {
- NullCheck( Device, return false );
- NullCheck( Device->SPIHandle, return false );
- return SPIDefaultWriteBytes( Device->SPIHandle, GDS_SPI_Data_Mode, Data, DataLength );
- }
|