FL-443 Move sd card to second spi (#271)

* sd card spi 2 fix, add spi mgr
This commit is contained in:
DrZlo13 2020-12-19 17:52:17 +10:00 committed by GitHub
parent 73ecc7cde6
commit 8b6e7fd4ae
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 127 additions and 42 deletions

View File

@ -88,6 +88,9 @@ uint8_t u8x8_hw_spi_stm32(u8x8_t* u8x8, uint8_t msg, uint8_t arg_int, void* arg_
fuprintf(log, "[u8g2] start\n");
#endif
// TODO: SPI manager
api_hal_spi_lock(&SPI_D);
// TODO change it to FuriRecord pin
HAL_GPIO_WritePin(DISPLAY_CS_GPIO_Port, DISPLAY_CS_Pin, GPIO_PIN_RESET);
asm("nop");
@ -101,6 +104,10 @@ uint8_t u8x8_hw_spi_stm32(u8x8_t* u8x8, uint8_t msg, uint8_t arg_int, void* arg_
asm("nop");
// TODO change it to FuriRecord pin
HAL_GPIO_WritePin(DISPLAY_CS_GPIO_Port, DISPLAY_CS_Pin, GPIO_PIN_SET);
// TODO: SPI manager
api_hal_spi_unlock(&SPI_D);
break;
default:

View File

@ -14,4 +14,5 @@ template <unsigned int N> struct STOP_EXTERNING_ME {};
#include "api-hal-vcp.h"
#include "api-hal-uid.h"
#include "api-hal-bt.h"
#include "api-hal-spi.h"
#include "api-hal-flash.h"

View File

@ -155,7 +155,7 @@ void Error_Handler(void);
#define SPI_R hspi1
#define SPI_D hspi2
#define SPI_SD_HANDLE SPI_R
#define SPI_SD_HANDLE SPI_D
extern TIM_HandleTypeDef htim1;
extern TIM_HandleTypeDef htim2;

View File

@ -92,6 +92,7 @@
#include "string.h"
#include "stdio.h"
#include "spi.h"
#include "api-hal-spi.h"
/** @addtogroup BSP
* @{
@ -290,6 +291,9 @@ static uint8_t SD_ReadData(void);
* - MSD_OK: Sequence succeed
*/
uint8_t BSP_SD_Init(void) {
// TODO: SPI manager
api_hal_spi_lock(&SPI_SD_HANDLE);
/* Init to maximum slow speed */
SD_SPI_Reconfigure_Slow();
@ -303,6 +307,9 @@ uint8_t BSP_SD_Init(void) {
/* Init to maximum fastest speed */
SD_SPI_Reconfigure_Fast();
// TODO: SPI manager
api_hal_spi_unlock(&SPI_SD_HANDLE);
/* SD initialized and set to SPI mode properly */
return res;
}
@ -323,8 +330,8 @@ uint8_t BSP_SD_GetCardInfo(SD_CardInfo* pCardInfo) {
if(flag_SDHC == 1) {
pCardInfo->LogBlockSize = 512;
pCardInfo->CardBlockSize = 512;
pCardInfo->CardCapacity =
((uint64_t)pCardInfo->Csd.version.v2.DeviceSize + 1UL) * 1024UL * (uint64_t)pCardInfo->LogBlockSize;
pCardInfo->CardCapacity = ((uint64_t)pCardInfo->Csd.version.v2.DeviceSize + 1UL) * 1024UL *
(uint64_t)pCardInfo->LogBlockSize;
pCardInfo->LogBlockNbr = (pCardInfo->CardCapacity) / (pCardInfo->LogBlockSize);
} else {
pCardInfo->CardCapacity = (pCardInfo->Csd.version.v1.DeviceSize + 1);

View File

@ -35,7 +35,8 @@
/* Includes ------------------------------------------------------------------*/
#include "user_diskio.h"
#include "spi.h"
#include "api-hal-spi.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
@ -45,7 +46,6 @@ static volatile DSTATUS Stat = STA_NOINIT;
static DSTATUS User_CheckStatus(BYTE lun) {
Stat = STA_NOINIT;
if(BSP_SD_GetCardState() == MSD_OK) {
Stat &= ~STA_NOINIT;
}
@ -84,10 +84,17 @@ Diskio_drvTypeDef USER_Driver = {
* @param pdrv: Physical drive number (0..)
* @retval DSTATUS: Operation status
*/
DSTATUS USER_initialize(BYTE pdrv /* Physical drive nmuber to identify the drive */
) {
DSTATUS USER_initialize(BYTE pdrv) {
/* USER CODE BEGIN INIT */
return User_CheckStatus(pdrv);
// TODO: SPI manager
api_hal_spi_lock(&SPI_SD_HANDLE);
DSTATUS status = User_CheckStatus(pdrv);
// TODO: SPI manager
api_hal_spi_unlock(&SPI_SD_HANDLE);
return status;
/* USER CODE END INIT */
}
@ -96,8 +103,7 @@ DSTATUS USER_initialize(BYTE pdrv /* Physical drive nmuber to identify the drive
* @param pdrv: Physical drive number (0..)
* @retval DSTATUS: Operation status
*/
DSTATUS USER_status(BYTE pdrv /* Physical drive number to identify the drive */
) {
DSTATUS USER_status(BYTE pdrv) {
/* USER CODE BEGIN STATUS */
return Stat;
/* USER CODE END STATUS */
@ -111,14 +117,13 @@ DSTATUS USER_status(BYTE pdrv /* Physical drive number to identify the drive */
* @param count: Number of sectors to read (1..128)
* @retval DRESULT: Operation result
*/
DRESULT USER_read(
BYTE pdrv, /* Physical drive nmuber to identify the drive */
BYTE* buff, /* Data buffer to store read data */
DWORD sector, /* Sector address in LBA */
UINT count /* Number of sectors to read */
) {
DRESULT USER_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count) {
/* USER CODE BEGIN READ */
DRESULT res = RES_ERROR;
// TODO: SPI manager
api_hal_spi_lock(&SPI_SD_HANDLE);
if(BSP_SD_ReadBlocks((uint32_t*)buff, (uint32_t)(sector), count, SD_DATATIMEOUT) == MSD_OK) {
/* wait until the read operation is finished */
while(BSP_SD_GetCardState() != MSD_OK) {
@ -126,6 +131,9 @@ DRESULT USER_read(
res = RES_OK;
}
// TODO: SPI manager
api_hal_spi_unlock(&SPI_SD_HANDLE);
return res;
/* USER CODE END READ */
}
@ -139,16 +147,14 @@ DRESULT USER_read(
* @retval DRESULT: Operation result
*/
#if _USE_WRITE == 1
DRESULT USER_write(
BYTE pdrv, /* Physical drive nmuber to identify the drive */
const BYTE* buff, /* Data to be written */
DWORD sector, /* Sector address in LBA */
UINT count /* Number of sectors to write */
) {
DRESULT USER_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count) {
/* USER CODE BEGIN WRITE */
/* USER CODE HERE */
DRESULT res = RES_ERROR;
// TODO: SPI manager
api_hal_spi_lock(&SPI_SD_HANDLE);
if(BSP_SD_WriteBlocks((uint32_t*)buff, (uint32_t)(sector), count, SD_DATATIMEOUT) == MSD_OK) {
/* wait until the Write operation is finished */
while(BSP_SD_GetCardState() != MSD_OK) {
@ -156,6 +162,9 @@ DRESULT USER_write(
res = RES_OK;
}
// TODO: SPI manager
api_hal_spi_unlock(&SPI_SD_HANDLE);
return res;
/* USER CODE END WRITE */
}
@ -169,17 +178,16 @@ DRESULT USER_write(
* @retval DRESULT: Operation result
*/
#if _USE_IOCTL == 1
DRESULT USER_ioctl(
BYTE pdrv, /* Physical drive nmuber (0..) */
BYTE cmd, /* Control code */
void* buff /* Buffer to send/receive control data */
) {
DRESULT USER_ioctl(BYTE pdrv, BYTE cmd, void* buff) {
/* USER CODE BEGIN IOCTL */
DRESULT res = RES_ERROR;
BSP_SD_CardInfo CardInfo;
if(Stat & STA_NOINIT) return RES_NOTRDY;
// TODO: SPI manager
api_hal_spi_lock(&SPI_SD_HANDLE);
switch(cmd) {
/* Make sure that no pending write process */
case CTRL_SYNC:
@ -211,6 +219,9 @@ DRESULT USER_ioctl(
res = RES_PARERR;
}
// TODO: SPI manager
api_hal_spi_unlock(&SPI_SD_HANDLE);
return res;
/* USER CODE END IOCTL */
}

View File

@ -121,6 +121,7 @@ int main(void)
MX_FATFS_Init();
delay_us_init_DWT();
api_hal_vcp_init();
api_hal_spi_init();
/* USER CODE END 2 */
/* Init scheduler */

View File

@ -110,10 +110,6 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* USER CODE BEGIN SPI1_MspInit 1 */
// SD Card need faster spi gpio
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* USER CODE END SPI1_MspInit 1 */
}
@ -155,6 +151,28 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
HAL_GPIO_Init(SPI_D_SCK_GPIO_Port, &GPIO_InitStruct);
/* USER CODE BEGIN SPI2_MspInit 1 */
// SD Card need faster spi gpio
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.Pin = SPI_D_MOSI_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
HAL_GPIO_Init(SPI_D_MOSI_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = SPI_D_SCK_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
HAL_GPIO_Init(SPI_D_SCK_GPIO_Port, &GPIO_InitStruct);
/* USER CODE END SPI2_MspInit 1 */
}
@ -272,7 +290,7 @@ void SD_SPI_Reconfigure_Fast(void) {
SPI_SD_HANDLE.Init.CLKPolarity = SPI_POLARITY_LOW;
SPI_SD_HANDLE.Init.CLKPhase = SPI_PHASE_1EDGE;
SPI_SD_HANDLE.Init.NSS = SPI_NSS_SOFT;
SPI_SD_HANDLE.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
SPI_SD_HANDLE.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
SPI_SD_HANDLE.Init.FirstBit = SPI_FIRSTBIT_MSB;
SPI_SD_HANDLE.Init.TIMode = SPI_TIMODE_DISABLE;
SPI_SD_HANDLE.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;

View File

@ -0,0 +1,32 @@
#include "api-hal-spi.h"
osMutexId_t spi_mutex_r;
osMutexId_t spi_mutex_d;
extern SPI_HandleTypeDef SPI_R;
extern SPI_HandleTypeDef SPI_D;
void api_hal_spi_init() {
spi_mutex_r = osMutexNew(NULL);
spi_mutex_d = osMutexNew(NULL);
}
void api_hal_spi_lock(SPI_HandleTypeDef* spi) {
if(spi == &SPI_D) {
osMutexAcquire(spi_mutex_d, osWaitForever);
} else if(spi == &SPI_R) {
osMutexAcquire(spi_mutex_r, osWaitForever);
} else {
Error_Handler();
}
}
void api_hal_spi_unlock(SPI_HandleTypeDef* spi) {
if(spi == &SPI_D) {
osMutexRelease(spi_mutex_d);
} else if(spi == &SPI_R) {
osMutexRelease(spi_mutex_r);
} else {
Error_Handler();
}
}

View File

@ -0,0 +1,7 @@
#pragma once
#include "main.h"
#include <cmsis_os.h>
void api_hal_spi_init();
void api_hal_spi_lock(SPI_HandleTypeDef* spi);
void api_hal_spi_unlock(SPI_HandleTypeDef* spi);

View File

@ -1023,22 +1023,23 @@ static const uint8_t u8x8_d_st7565_erc12864_alt_init_seq[] = {
// U8X8_END() /* end of sequence */
// flipper zero sequence
U8X8_START_TRANSFER(),
U8X8_C(0x0e2), // soft reset
U8X8_C(0x0e2), // soft reset
U8X8_C(0xA3), // ST7565_st7565_command(CMD_SET_BIAS_7);
U8X8_C(0xA3), // ST7565_st7565_command(CMD_SET_BIAS_7);
U8X8_C(0xA0), // ST7565_st7565_command(CMD_SET_ADC_NORMAL);
U8X8_C(0xC8), // ST7565_st7565_command(CMD_SET_COM_REVERSE);
U8X8_C(0x40), // ST7565_st7565_command(CMD_SET_DISP_START_LINE);
U8X8_C(0x28 | 0x4), // ST7565_st7565_command(CMD_SET_POWER_CONTROL | 0x4);
U8X8_C(0xA0), // ST7565_st7565_command(CMD_SET_ADC_NORMAL);
U8X8_C(0xC8), // ST7565_st7565_command(CMD_SET_COM_REVERSE);
U8X8_C(0x40), // ST7565_st7565_command(CMD_SET_DISP_START_LINE);
U8X8_C(0x28 | 0x4), // ST7565_st7565_command(CMD_SET_POWER_CONTROL | 0x4);
U8X8_DLY(50),
U8X8_C(0x28 | 0x6), // ST7565_st7565_command(CMD_SET_POWER_CONTROL | 0x6);
U8X8_C(0x28 | 0x6), // ST7565_st7565_command(CMD_SET_POWER_CONTROL | 0x6);
U8X8_DLY(50),
U8X8_C(0x28 | 0x7), // ST7565_st7565_command(CMD_SET_POWER_CONTROL | 0x7);
U8X8_C(0x28 | 0x7), // ST7565_st7565_command(CMD_SET_POWER_CONTROL | 0x7);
U8X8_DLY(50),
U8X8_C(0x20 | 0x6), // ST7565_st7565_command(CMD_SET_RESISTOR_RATIO | 0x6);
U8X8_C(0x20 | 0x6), // ST7565_st7565_command(CMD_SET_RESISTOR_RATIO | 0x6);
U8X8_END_TRANSFER(), // disable chip
U8X8_END() // end of sequence
};