Merge pull request #29 from badgeteam/renze/bsp-submodule

Renze/bsp submodule
This commit is contained in:
Renze Nicolai 2022-05-15 03:03:25 +02:00 committed by GitHub
commit f4f7f236ff
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 5 additions and 309 deletions

3
.gitmodules vendored
View file

@ -31,3 +31,6 @@
[submodule "components/mch2022-efuse"]
path = components/mch2022-efuse
url = https://github.com/badgeteam/esp32-component-mch2022-efuse.git
[submodule "components/mch2022-bsp"]
path = components/mch2022-bsp
url = https://github.com/badgeteam/esp32-component-mch2022-bsp.git

@ -0,0 +1 @@
Subproject commit bfe0cc2bdbebcd7af82dbb58151b6c112e97efce

View file

@ -1,13 +0,0 @@
idf_component_register(
SRCS "hardware.c"
INCLUDE_DIRS "."
REQUIRES
"appfs"
"bus-i2c"
"i2c-bno055"
"pax-graphics"
"sdcard"
"spi-ice40"
"spi-ili9341"
"mch2022-rp2040"
)

View file

@ -1,229 +0,0 @@
#include "hardware.h"
#include <driver/spi_master.h>
#include <esp_log.h>
#include <driver/gpio.h>
#include "managed_i2c.h"
#include "sdcard.h"
#include "rp2040.h"
static const char *TAG = "hardware";
static BNO055 dev_bno055 = {0};
static ILI9341 dev_ili9341 = {0};
static ICE40 dev_ice40 = {0};
static RP2040 dev_rp2040 = {0};
static uint8_t rp2040_fw_version = 0;
static bool bsp_ready = false;
static bool rp2040_ready = false;
static bool ice40_ready = false;
static bool bno055_ready = false;
esp_err_t ice40_get_done_wrapper(bool* done) {
uint16_t buttons;
esp_err_t res = rp2040_read_buttons(&dev_rp2040, &buttons);
if (res != ESP_OK) return res;
*done = !((buttons >> 5) & 0x01);
printf("FPGA done is %u\n", *done);
return ESP_OK;
}
esp_err_t ice40_set_reset_wrapper(bool reset) {
printf("FPGA reset set to %u\n", reset);
esp_err_t res = rp2040_set_fpga(&dev_rp2040, reset);
vTaskDelay(100 / portTICK_PERIOD_MS);
return res;
}
void ili9341_set_lcd_mode(bool mode) {
ESP_LOGI(TAG, "LCD mode switch to %s", mode ? "FPGA" : "ESP32");
esp_err_t res = gpio_set_level(GPIO_LCD_MODE, mode);
if (res != ESP_OK) {
ESP_LOGE(TAG, "Setting LCD mode failed");
}
}
static esp_err_t _bus_init() {
esp_err_t res;
// I2C bus
res = i2c_init(I2C_BUS_SYS, GPIO_I2C_SYS_SDA, GPIO_I2C_SYS_SCL, I2C_SPEED_SYS, false, false);
if (res != ESP_OK) {
ESP_LOGE(TAG, "Initializing system I2C bus failed");
return res;
}
// SPI bus
spi_bus_config_t busConfiguration = {0};
busConfiguration.mosi_io_num = GPIO_SPI_MOSI;
busConfiguration.miso_io_num = GPIO_SPI_MISO;
busConfiguration.sclk_io_num = GPIO_SPI_CLK;
busConfiguration.quadwp_io_num = -1;
busConfiguration.quadhd_io_num = -1;
busConfiguration.max_transfer_sz = SPI_MAX_TRANSFER_SIZE;
res = spi_bus_initialize(SPI_BUS, &busConfiguration, SPI_DMA_CHANNEL);
if (res != ESP_OK) {
ESP_LOGE(TAG, "Initializing SPI bus failed");
return res;
}
return ESP_OK;
}
/* BSP init
*
* This function initializes the interrupt handling service, the SPI and I2C busses and the LCD display.
* After running this function information can be displayed to the user via the display.
*
*/
esp_err_t bsp_init() {
if (bsp_ready) return ESP_OK;
esp_err_t res;
// Interrupts
res = gpio_install_isr_service(0);
if (res != ESP_OK) {
ESP_LOGE(TAG, "Initializing ISR service failed");
return res;
}
// Communication busses
res = _bus_init();
if (res != ESP_OK) return res;
// LCD display
dev_ili9341.spi_bus = SPI_BUS;
dev_ili9341.pin_cs = GPIO_SPI_CS_LCD;
dev_ili9341.pin_dcx = GPIO_SPI_DC_LCD;
dev_ili9341.pin_reset = GPIO_LCD_RESET;
dev_ili9341.rotation = 1;
dev_ili9341.color_mode = true; // Blue and red channels are swapped
dev_ili9341.spi_speed = 60000000; // 60MHz
dev_ili9341.spi_max_transfer_size = SPI_MAX_TRANSFER_SIZE;
dev_ili9341.callback = ili9341_set_lcd_mode; // Callback for changing LCD mode between ESP32 and FPGA
res = gpio_set_direction(GPIO_LCD_MODE, GPIO_MODE_OUTPUT);
if (res != ESP_OK) {
ESP_LOGE(TAG, "Initializing LCD mode GPIO failed");
return res;
}
res = ili9341_init(&dev_ili9341);
if (res != ESP_OK) {
ESP_LOGE(TAG, "Initializing LCD failed");
return res;
}
bsp_ready = true;
return ESP_OK;
}
/* RP2040 init
*
* This function initializes communication with the RP2040 co-processor.
* After running this function the buttons, backlight control and FPGA management functions will be available for use.
*
*/
esp_err_t bsp_rp2040_init() {
if (!bsp_ready) return ESP_FAIL;
if (rp2040_ready) return ESP_OK;
// RP2040 co-processor
dev_rp2040.i2c_bus = I2C_BUS_SYS;
dev_rp2040.i2c_address = RP2040_ADDR;
dev_rp2040.pin_interrupt = GPIO_INT_RP2040;
dev_rp2040.queue = xQueueCreate(8, sizeof(rp2040_input_message_t));
esp_err_t res = rp2040_init(&dev_rp2040);
if (res != ESP_OK) {
ESP_LOGE(TAG, "Initializing RP2040 failed");
return res;
}
if (rp2040_get_firmware_version(&dev_rp2040, &rp2040_fw_version) != ESP_OK) {
ESP_LOGE(TAG, "Initializing RP2040 failed to read firmware version");
return ESP_FAIL;
}
rp2040_ready = true;
return ESP_OK;
}
/* RP2040 init
*
* This function initializes the ICE40 FPGA
* After running this function the FPGA will be kept in reset state until a bitstream is loaded
*
*/
esp_err_t bsp_ice40_init() {
if (!bsp_ready) return ESP_FAIL;
if (!rp2040_ready) return ESP_FAIL;
if (rp2040_fw_version == 0xFF) return ESP_FAIL; // The ICE40 FPGA can only be controlled when the RP2040 is not in bootloader mode
if (ice40_ready) return ESP_OK;
dev_ice40.spi_bus = SPI_BUS;
dev_ice40.pin_cs = GPIO_SPI_CS_FPGA;
dev_ice40.pin_done = -1;
dev_ice40.pin_reset = -1;
dev_ice40.pin_int = GPIO_INT_FPGA;
dev_ice40.spi_speed_full_duplex = 26700000;
dev_ice40.spi_speed_half_duplex = 40000000;
dev_ice40.spi_max_transfer_size = SPI_MAX_TRANSFER_SIZE;
dev_ice40.get_done = ice40_get_done_wrapper;
dev_ice40.set_reset = ice40_set_reset_wrapper;
esp_err_t res = ice40_init(&dev_ice40);
if (res != ESP_OK) {
ESP_LOGE(TAG, "Initializing FPGA failed");
return res;
}
ice40_ready = true;
return ESP_OK;
}
/* BNO055 init
*
* This function initializes the BNO055 position sensor
* After running this function the position sensor can be used
*
*/
esp_err_t bsp_bno055_init() {
if (!bsp_ready) return ESP_FAIL;
if (bno055_ready) return ESP_OK;
esp_err_t res = bno055_init(&dev_bno055, I2C_BUS_SYS, BNO055_ADDR, GPIO_INT_BNO055, true);
if (res != ESP_OK) {
ESP_LOGE(TAG, "Initializing BNO055 failed");
return res;
}
bno055_ready = true;
return ESP_OK;
}
ILI9341* get_ili9341() {
if (!bsp_ready) return NULL;
return &dev_ili9341;
}
RP2040* get_rp2040() {
if (!rp2040_ready) return NULL;
return &dev_rp2040;
}
ICE40* get_ice40() {
if (!ice40_ready) return NULL;
return &dev_ice40;
}
BNO055* get_bno055() {
if (!bno055_ready) return NULL;
return &dev_bno055;
}

View file

@ -1,66 +0,0 @@
#pragma once
#include <sdkconfig.h>
#include <esp_err.h>
#include <driver/spi_master.h>
#include "bno055.h"
#include "ili9341.h"
#include "ice40.h"
#include "rp2040.h"
// Interrupts
#define GPIO_INT_RP2040 34
#define GPIO_INT_BNO055 36
#define GPIO_INT_FPGA 39
// SD card
#define SD_PWR 19 // Also LED power
#define SD_D0 2
#define SD_CLK 14
#define SD_CMD 15
// LEDs
#define GPIO_LED_DATA 5
// I2S audio
#define GPIO_I2S_CLK 14
#define GPIO_I2S_DATA 13
#define GPIO_I2S_LR 4
// I2C bus
#define GPIO_I2C_SYS_SCL 21
#define GPIO_I2C_SYS_SDA 22
#define I2C_BUS_SYS 0
#define I2C_SPEED_SYS 8000 // 8 kHz //20000 // 20 kHz
// RP2040 co-processor
#define RP2040_ADDR 0x17
// BNO055 sensor
#define BNO055_ADDR 0x28
// SPI bus
#define GPIO_SPI_CLK 18
#define GPIO_SPI_MOSI 23
#define GPIO_SPI_MISO 35
#define GPIO_SPI_CS_RP2040 19
#define GPIO_SPI_CS_FPGA 27
#define SPI_BUS VSPI_HOST
#define SPI_MAX_TRANSFER_SIZE 4094
#define SPI_DMA_CHANNEL 2
// LCD display
#define GPIO_LCD_RESET 25
#define GPIO_LCD_MODE 26
#define GPIO_SPI_CS_LCD 32
#define GPIO_SPI_DC_LCD 33
esp_err_t bsp_init();
esp_err_t bsp_rp2040_init();
esp_err_t bsp_ice40_init();
esp_err_t bsp_bno055_init();
ILI9341* get_ili9341();
RP2040* get_rp2040();
ICE40* get_ice40();
BNO055* get_bno055();

View file

@ -708,7 +708,7 @@ void app_main(void) {
}
/* Start SD card filesystem */
res = mount_sd(SD_CMD, SD_CLK, SD_D0, SD_PWR, "/sd", false, 5);
res = mount_sd(GPIO_SD_CMD, GPIO_SD_CLK, GPIO_SD_D0, GPIO_SD_PWR, "/sd", false, 5);
bool sdcard_ready = (res == ESP_OK);
if (sdcard_ready) {
ESP_LOGI(TAG, "SD card filesystem mounted");