OVMS3/OVMS.V3/main/ovms_peripherals.cpp

193 lines
7.6 KiB
C++

/*
; Project: Open Vehicle Monitor System
; Date: 14th March 2017
;
; Changes:
; 1.0 Initial release
;
; (C) 2011 Michael Stegen / Stegen Electronics
; (C) 2011-2017 Mark Webb-Johnson
; (C) 2011 Sonny Chen @ EPRO/DX
;
; Permission is hereby granted, free of charge, to any person obtaining a copy
; of this software and associated documentation files (the "Software"), to deal
; in the Software without restriction, including without limitation the rights
; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
; copies of the Software, and to permit persons to whom the Software is
; furnished to do so, subject to the following conditions:
;
; The above copyright notice and this permission notice shall be included in
; all copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
; THE SOFTWARE.
*/
#include "ovms_log.h"
static const char *TAG = "peripherals";
#include <stdio.h>
#include <string.h>
#include <cstdio>
#include "ovms_config.h"
#include "ovms_command.h"
#include "esp_intr_alloc.h"
#include "driver/gpio.h"
#include "esp_intr.h"
#include "ovms_peripherals.h"
Peripherals::Peripherals()
{
ESP_LOGI(TAG, "Initialising OVMS Peripherals...");
#if defined(CONFIG_OVMS_COMP_WIFI)||defined(CONFIG_OVMS_COMP_CELLULAR)
if (MyConfig.IsDefined("network","mac"))
{
std::string mac = MyConfig.GetParamValue("network", "mac");
int mac_addr_k[6];
uint8_t mac_addr[8];
memset(mac_addr,0,sizeof(mac_addr));
if (std::sscanf(mac.c_str(),
"%02x:%02x:%02x:%02x:%02x:%02x",
&mac_addr_k[0], &mac_addr_k[1], &mac_addr_k[2],
&mac_addr_k[3], &mac_addr_k[4], &mac_addr_k[5]) == 6)
{
for (int k=0;k<6;k++) mac_addr[k] = mac_addr_k[k];
esp_base_mac_addr_set(mac_addr);
ESP_LOGI(TAG, " Base network MAC address: %02x:%02x:%02x:%02x:%02x:%02x",
mac_addr[0], mac_addr[1], mac_addr[2],
mac_addr[3], mac_addr[4], mac_addr[5]);
}
}
ESP_LOGI(TAG, " TCP/IP Adaptor");
tcpip_adapter_init();
#endif // #if defined(CONFIG_OVMS_COMP_WIFI)||defined(CONFIG_OVMS_COMP_CELLULAR)
gpio_install_isr_service(ESP_INTR_FLAG_IRAM);
gpio_set_direction((gpio_num_t)VSPI_PIN_MISO, GPIO_MODE_INPUT);
gpio_set_direction((gpio_num_t)VSPI_PIN_MOSI, GPIO_MODE_OUTPUT);
gpio_set_direction((gpio_num_t)VSPI_PIN_CLK, GPIO_MODE_OUTPUT);
#ifdef CONFIG_OVMS_COMP_MAX7317
gpio_set_direction((gpio_num_t)VSPI_PIN_MAX7317_CS, GPIO_MODE_OUTPUT);
gpio_set_level((gpio_num_t)VSPI_PIN_MAX7317_CS, 1); // to prevent SPI crosstalk during initialization
#endif // #ifdef CONFIG_OVMS_COMP_MAX7317
#ifdef CONFIG_OVMS_COMP_MCP2515
gpio_set_direction((gpio_num_t)VSPI_PIN_MCP2515_1_CS, GPIO_MODE_OUTPUT);
gpio_set_direction((gpio_num_t)VSPI_PIN_MCP2515_2_CS, GPIO_MODE_OUTPUT);
gpio_set_direction((gpio_num_t)VSPI_PIN_MCP2515_1_INT, GPIO_MODE_INPUT);
gpio_set_direction((gpio_num_t)VSPI_PIN_MCP2515_2_INT, GPIO_MODE_INPUT);
gpio_set_level((gpio_num_t)VSPI_PIN_MCP2515_1_CS, 1); // to prevent SPI crosstalk during initialization
gpio_set_level((gpio_num_t)VSPI_PIN_MCP2515_2_CS, 1); // to prevent SPI crosstalk during initialization
#endif // #ifdef CONFIG_OVMS_COMP_MCP2515
#ifdef CONFIG_OVMS_COMP_EXTERNAL_SWCAN
gpio_set_direction((gpio_num_t)VSPI_PIN_MCP2515_SWCAN_CS, GPIO_MODE_OUTPUT);
gpio_set_direction((gpio_num_t)VSPI_PIN_MCP2515_SWCAN_INT, GPIO_MODE_INPUT);
gpio_set_level((gpio_num_t)VSPI_PIN_MCP2515_SWCAN_CS, 1); // to prevent SPI crosstalk during initialization
#endif // #ifdef CONFIG_OVMS_COMP_EXTERNAL_SWCAN
#ifdef CONFIG_OVMS_COMP_SDCARD
gpio_set_direction((gpio_num_t)SDCARD_PIN_CLK, GPIO_MODE_OUTPUT);
gpio_set_direction((gpio_num_t)SDCARD_PIN_CMD, GPIO_MODE_OUTPUT);
gpio_set_direction((gpio_num_t)SDCARD_PIN_CD, GPIO_MODE_INPUT);
// GPIOs CMD, D0 should have external 10k pull-ups.
// Internal pull-ups are not sufficient. However, enabling internal pull-ups
// does make a difference some boards, so we do that here.
gpio_set_pull_mode((gpio_num_t)SDCARD_PIN_CMD, GPIO_PULLUP_ONLY); // CMD, needed in 4- and 1- line modes
gpio_set_pull_mode((gpio_num_t)SDCARD_PIN_D0, GPIO_PULLUP_ONLY); // D0, needed in 4- and 1-line modes
#endif // #ifdef CONFIG_OVMS_COMP_SDCARD
ESP_LOGI(TAG, " ESP32 system");
m_esp32 = new esp32system("esp32");
ESP_LOGI(TAG, " SPI bus");
m_spibus = new spi("spi", VSPI_PIN_MISO, VSPI_PIN_MOSI, VSPI_PIN_CLK);
#ifdef CONFIG_OVMS_COMP_MAX7317
ESP_LOGI(TAG, " MAX7317 I/O Expander");
m_max7317 = new max7317("egpio", m_spibus, VSPI_HOST, 10000000, VSPI_PIN_MAX7317_CS);
#endif // #ifdef CONFIG_OVMS_COMP_MAX7317
#ifdef CONFIG_OVMS_COMP_ESP32CAN
ESP_LOGI(TAG, " ESP32 CAN");
m_esp32can = new esp32can("can1", ESP32CAN_PIN_TX, ESP32CAN_PIN_RX);
#endif // #ifdef CONFIG_OVMS_COMP_ESP32CAN
#ifdef CONFIG_OVMS_COMP_WIFI
ESP_LOGI(TAG, " ESP32 WIFI");
m_esp32wifi = new esp32wifi("wifi");
#endif // #ifdef CONFIG_OVMS_COMP_WIFI
#ifdef CONFIG_OVMS_COMP_BLUETOOTH
ESP_LOGI(TAG, " ESP32 BLUETOOTH");
m_esp32bluetooth = new esp32bluetooth("bluetooth");
#endif // #ifdef CONFIG_OVMS_COMP_BLUETOOTH
#ifdef CONFIG_OVMS_COMP_ADC
ESP_LOGI(TAG, " ESP32 ADC");
m_esp32adc = new esp32adc("adc", ADC1_CHANNEL_0, ADC_WIDTH_12Bit, ADC_ATTEN_11db);
#endif // #ifdef CONFIG_OVMS_COMP_ADC
#ifdef CONFIG_OVMS_COMP_MCP2515
ESP_LOGI(TAG, " MCP2515 CAN 1/2");
m_mcp2515_1 = new mcp2515("can2", m_spibus, VSPI_HOST, 10000000, VSPI_PIN_MCP2515_1_CS, VSPI_PIN_MCP2515_1_INT);
ESP_LOGI(TAG, " MCP2515 CAN 2/2");
m_mcp2515_2 = new mcp2515("can3", m_spibus, VSPI_HOST, 10000000, VSPI_PIN_MCP2515_2_CS, VSPI_PIN_MCP2515_2_INT);
#endif // #ifdef CONFIG_OVMS_COMP_MCP2515
#ifdef CONFIG_OVMS_COMP_EXTERNAL_SWCAN
ESP_LOGI(TAG, " can4/swcan (MCP2515 + TH8056 DRIVER)");
// External SWCAN module with MCP2515. Here we use software CS (maximum 3 HW CS pins already used)
m_mcp2515_swcan = new swcan("can4", m_spibus, VSPI_NODMA_HOST, 10000000, VSPI_PIN_MCP2515_SWCAN_CS, VSPI_PIN_MCP2515_SWCAN_INT, false);
#endif // #ifdef CONFIG_OVMS_COMP_EXTERNAL_SWCAN
#ifdef CONFIG_OVMS_COMP_SDCARD
ESP_LOGI(TAG, " SD CARD");
m_sdcard = new sdcard("sdcard", true, true, SDCARD_PIN_CD);
#endif // #ifdef CONFIG_OVMS_COMP_SDCARD
#ifdef CONFIG_OVMS_COMP_CELLULAR
ESP_LOGI(TAG, " CELLULAR MODEM");
gpio_config_t gpio_conf =
{
.pin_bit_mask = BIT(MODEM_GPIO_RX),
.mode = GPIO_MODE_OUTPUT ,
.pull_up_en = GPIO_PULLUP_ENABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_DISABLE
};
gpio_config( &gpio_conf );
gpio_conf =
{
.pin_bit_mask = BIT(MODEM_GPIO_TX),
.mode = GPIO_MODE_INPUT ,
.pull_up_en = GPIO_PULLUP_ENABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_DISABLE
};
gpio_config( &gpio_conf );
m_cellular_modem = new modem("cellular", UART_NUM_1, 115200, MODEM_GPIO_RX, MODEM_GPIO_TX, MODEM_EGPIO_PWR, MODEM_EGPIO_DTR);
#endif // #ifdef CONFIG_OVMS_COMP_CELLULAR
#ifdef CONFIG_OVMS_COMP_OBD2ECU
m_obd2ecu = NULL;
#endif // #ifdef CONFIG_OVMS_COMP_OBD2ECU
#ifdef CONFIG_OVMS_COMP_EXT12V
m_ext12v = new ext12v("ext12v");
#endif // #ifdef CONFIG_OVMS_COMP_EXT12V
}
Peripherals::~Peripherals()
{
}