194 lines
7.6 KiB
C++
194 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()
|
||
|
{
|
||
|
}
|