FL-443 Move sd card to second spi (#271)
* sd card spi 2 fix, add spi mgr
This commit is contained in:
		
							parent
							
								
									73ecc7cde6
								
							
						
					
					
						commit
						8b6e7fd4ae
					
				| @ -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: | ||||
|  | ||||
| @ -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" | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -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 */ | ||||
| } | ||||
|  | ||||
| @ -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 */ | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
							
								
								
									
										32
									
								
								firmware/targets/f4/api-hal/api-hal-spi.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								firmware/targets/f4/api-hal/api-hal-spi.c
									
									
									
									
									
										Normal 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(); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										7
									
								
								firmware/targets/f4/api-hal/api-hal-spi.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								firmware/targets/f4/api-hal/api-hal-spi.h
									
									
									
									
									
										Normal 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);  | ||||
| @ -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
 | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 DrZlo13
						DrZlo13