Redid i2c upload to work with stm32 client device
This commit is contained in:
parent
8cc1594b96
commit
e9eccf43c1
|
@ -7,8 +7,8 @@ HeaderPath=Drivers/STM32F4xx_HAL_Driver/Inc;Drivers/STM32F4xx_HAL_Driver/Inc/Leg
|
||||||
CDefines=USE_HAL_DRIVER;STM32F407xx;USE_HAL_DRIVER;USE_HAL_DRIVER;
|
CDefines=USE_HAL_DRIVER;STM32F407xx;USE_HAL_DRIVER;USE_HAL_DRIVER;
|
||||||
|
|
||||||
[PreviousGenFiles]
|
[PreviousGenFiles]
|
||||||
HeaderPath=/home/tim/Projects/z80/stm32/Inc
|
HeaderPath=/home/tim/Projects/z80/firmware/controller/Inc
|
||||||
HeaderFiles=ffconf.h;bsp_driver_sd.h;sd_diskio.h;fatfs.h;fatfs_platform.h;usb_device.h;usbd_conf.h;usbd_desc.h;usbd_storage_if.h;stm32f4xx_it.h;stm32f4xx_hal_conf.h;main.h;
|
HeaderFiles=ffconf.h;bsp_driver_sd.h;sd_diskio.h;fatfs.h;fatfs_platform.h;usb_device.h;usbd_conf.h;usbd_desc.h;usbd_storage_if.h;stm32f4xx_it.h;stm32f4xx_hal_conf.h;main.h;
|
||||||
SourcePath=/home/tim/Projects/z80/stm32/Src
|
SourcePath=/home/tim/Projects/z80/firmware/controller/Src
|
||||||
SourceFiles=bsp_driver_sd.c;sd_diskio.c;fatfs.c;fatfs_platform.c;usb_device.c;usbd_conf.c;usbd_desc.c;usbd_storage_if.c;stm32f4xx_it.c;stm32f4xx_hal_msp.c;main.c;
|
SourceFiles=bsp_driver_sd.c;sd_diskio.c;fatfs.c;fatfs_platform.c;usb_device.c;usbd_conf.c;usbd_desc.c;usbd_storage_if.c;stm32f4xx_it.c;stm32f4xx_hal_msp.c;main.c;
|
||||||
|
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -1,5 +1,5 @@
|
||||||
##########################################################################################################################
|
##########################################################################################################################
|
||||||
# File automatically-generated by tool: [projectgenerator] version: [3.11.0-B13] date: [Wed Jan 06 03:22:56 CET 2021]
|
# File automatically-generated by tool: [projectgenerator] version: [3.11.2] date: [Tue Feb 09 19:06:56 CET 2021]
|
||||||
##########################################################################################################################
|
##########################################################################################################################
|
||||||
|
|
||||||
# ------------------------------------------------
|
# ------------------------------------------------
|
||||||
|
|
106
Src/firmware.c
106
Src/firmware.c
|
@ -1,6 +1,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
#include "firmware.h"
|
#include "firmware.h"
|
||||||
#include "control.h"
|
#include "control.h"
|
||||||
|
@ -75,66 +76,74 @@ void firmware_update() {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TARGET_I2C: {
|
case TARGET_I2C: {
|
||||||
|
// Get the I2C address
|
||||||
uint8_t address = 0;
|
uint8_t address = 0;
|
||||||
HAL_UART_Receive(&huart2, &address, 1, 1000);
|
HAL_UART_Receive(&huart2, &address, 1, HAL_MAX_DELAY);
|
||||||
HAL_UART_Transmit(&huart2, &address, sizeof(ack), HAL_MAX_DELAY);
|
HAL_UART_Transmit(&huart2, &address, sizeof(ack), HAL_MAX_DELAY);
|
||||||
|
|
||||||
// Check if we can read the version string
|
// Check if the device is available or if we need to reboot to bootloader
|
||||||
uint8_t version_command[] = {0x01};
|
/* if (HAL_I2C_IsDeviceReady(&hi2c1, address << 1, 10, HAL_MAX_DELAY) != HAL_OK) { */
|
||||||
HAL_I2C_Master_Transmit(&hi2c1, address << 1, version_command, sizeof(version_command), 1000);
|
/* // Reset the device to the bootloader */
|
||||||
uint8_t version_string[16] = {0};
|
/* HAL_UART_Transmit(&huart2, nack, sizeof(nack), HAL_MAX_DELAY); */
|
||||||
HAL_I2C_Master_Receive(&hi2c1, address << 1, version_string, sizeof(version_string), 1000);
|
/* return; */
|
||||||
|
/* } */
|
||||||
|
HAL_UART_Transmit(&huart2, ack, sizeof(ack), HAL_MAX_DELAY);
|
||||||
|
|
||||||
// Check the version string
|
// Wait for the device to be ready
|
||||||
if (version_string[0] == 'T' && version_string[1] == 'W' && version_string[2] == 'I') {
|
/* while (HAL_I2C_IsDeviceReady(&hi2c1, address << 1, 10, HAL_MAX_DELAY) != HAL_OK); */
|
||||||
HAL_UART_Transmit(&huart2, ack, sizeof(ack), HAL_MAX_DELAY);
|
|
||||||
} else {
|
|
||||||
uint8_t reboot_command[] = {0xFF};
|
|
||||||
HAL_I2C_Master_Transmit(&hi2c1, address << 1, reboot_command, sizeof(reboot_command), 1000);
|
|
||||||
|
|
||||||
uint8_t rebooting[] = {0x02};
|
|
||||||
HAL_UART_Transmit(&huart2, rebooting, sizeof(rebooting), HAL_MAX_DELAY);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (HAL_I2C_IsDeviceReady(&hi2c1, address << 1, 10, 1000) != HAL_OK);
|
|
||||||
|
|
||||||
HAL_UART_Transmit(&huart2, ack, sizeof(ack), HAL_MAX_DELAY);
|
HAL_UART_Transmit(&huart2, ack, sizeof(ack), HAL_MAX_DELAY);
|
||||||
|
|
||||||
uint8_t abort_command[] = {0x00};
|
uint8_t command[] = {0xAF};
|
||||||
HAL_I2C_Master_Transmit(&hi2c1, address << 1, abort_command, sizeof(abort_command), 1000);
|
HAL_I2C_Master_Transmit(&hi2c1, address << 1, command, sizeof(command), HAL_MAX_DELAY);
|
||||||
|
|
||||||
// Re-read the version string in case we rebooted
|
HAL_UART_Transmit(&huart2, ack, sizeof(ack), HAL_MAX_DELAY);
|
||||||
HAL_I2C_Master_Transmit(&hi2c1, address << 1, version_command, sizeof(version_command), 1000);
|
|
||||||
HAL_I2C_Master_Receive(&hi2c1, address << 1, version_string, sizeof(version_string), 1000);
|
|
||||||
HAL_UART_Transmit(&huart2, version_string, sizeof(version_string), HAL_MAX_DELAY);
|
|
||||||
|
|
||||||
uint8_t upload_command[4 + 0x80];
|
// Send length to i2c device and confirm
|
||||||
upload_command[0] = 0x02;
|
HAL_I2C_Master_Transmit(&hi2c1, address << 1, length_buffer, sizeof(length_buffer), HAL_MAX_DELAY);
|
||||||
upload_command[1] = 0x01;
|
uint8_t received_length_buffer[2];
|
||||||
|
HAL_I2C_Master_Receive(&hi2c1, address << 1, received_length_buffer, sizeof(received_length_buffer), HAL_MAX_DELAY);
|
||||||
uint16_t remaining = length;
|
if (received_length_buffer[0] == length_buffer[0] && received_length_buffer[1] == length_buffer[1]) {
|
||||||
for (uint8_t offset = 0; remaining > 0; ++offset) {
|
HAL_UART_Transmit(&huart2, ack, sizeof(ack), HAL_MAX_DELAY);
|
||||||
upload_command[2] = ((offset*0x80) >> 8) & 0xFF;
|
HAL_I2C_Master_Transmit(&hi2c1, address << 1, ack, sizeof(ack), HAL_MAX_DELAY);
|
||||||
upload_command[3] = (offset*0x80) & 0xFF;
|
} else {
|
||||||
|
HAL_UART_Transmit(&huart2, nack, sizeof(nack), HAL_MAX_DELAY);
|
||||||
uint8_t amount = remaining > 0x80 ? 0x80 : remaining;
|
HAL_I2C_Master_Transmit(&hi2c1, address << 1, nack, sizeof(nack), HAL_MAX_DELAY);
|
||||||
remaining -= amount;
|
break;
|
||||||
|
|
||||||
// We need to handle the last section properly
|
|
||||||
memcpy(&upload_command[4], &data[offset*0x80], amount);
|
|
||||||
|
|
||||||
HAL_I2C_Master_Transmit(&hi2c1, address << 1, upload_command, sizeof(upload_command), 1000);
|
|
||||||
|
|
||||||
while (HAL_I2C_IsDeviceReady(&hi2c1, address << 1, 10, 1000) != HAL_OK);
|
|
||||||
|
|
||||||
uint8_t progress[] = {(length-remaining) & 0xFF, (length-remaining) >> 8};
|
|
||||||
HAL_UART_Transmit(&huart2, progress, sizeof(progress), HAL_MAX_DELAY);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start application
|
// @todo Put a limit timeout in place
|
||||||
uint8_t start_command[] = {0x01, 0x80};
|
// Wait for the device to be ready to receive
|
||||||
HAL_I2C_Master_Transmit(&hi2c1, address << 1, start_command, sizeof(start_command), 1000);
|
uint8_t status = 0;
|
||||||
|
while (status != 0x01) {
|
||||||
|
HAL_I2C_Master_Receive(&hi2c1, address << 1, &status, 1, HAL_MAX_DELAY);
|
||||||
|
}
|
||||||
|
|
||||||
|
HAL_I2C_Master_Transmit(&hi2c1, address << 1, data, length, HAL_MAX_DELAY);
|
||||||
|
HAL_UART_Transmit(&huart2, ack, sizeof(ack), HAL_MAX_DELAY);
|
||||||
|
|
||||||
|
// Verify the crc32
|
||||||
|
uint8_t received_c[4] = {0};
|
||||||
|
while (received_c[0] == 0 && received_c[1] == 0 && received_c[2] == 0 && received_c[3] == 0) {
|
||||||
|
HAL_I2C_Master_Receive(&hi2c1, address << 1, received_c, sizeof(received_c), HAL_MAX_DELAY);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c[0] == received_c[0] && c[1] == received_c[1] && c[2] == received_c[2] && c[3] == received_c[3]) {
|
||||||
|
HAL_UART_Transmit(&huart2, ack, sizeof(ack), HAL_MAX_DELAY);
|
||||||
|
HAL_I2C_Master_Transmit(&hi2c1, address << 1, ack, sizeof(ack), HAL_MAX_DELAY);
|
||||||
|
} else {
|
||||||
|
HAL_UART_Transmit(&huart2, nack, sizeof(nack), HAL_MAX_DELAY);
|
||||||
|
HAL_I2C_Master_Transmit(&hi2c1, address << 1, nack, sizeof(nack), HAL_MAX_DELAY);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for programming to complete
|
||||||
|
status = 0;
|
||||||
|
while (status != 0x01) {
|
||||||
|
HAL_I2C_Master_Receive(&hi2c1, address << 1, &status, 1, HAL_MAX_DELAY);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Done
|
||||||
HAL_UART_Transmit(&huart2, ack, sizeof(ack), HAL_MAX_DELAY);
|
HAL_UART_Transmit(&huart2, ack, sizeof(ack), HAL_MAX_DELAY);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -147,4 +156,3 @@ void firmware_update() {
|
||||||
|
|
||||||
printf("Complete!\n\r");
|
printf("Complete!\n\r");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -90,13 +90,13 @@ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
|
||||||
request_restart_to_bootloader();
|
request_restart_to_bootloader();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Upload firmware
|
// Upload firmware
|
||||||
case 'u':
|
case 'u':
|
||||||
HAL_UART_Transmit(&huart2, ack, sizeof(ack), HAL_MAX_DELAY);
|
HAL_UART_Transmit(&huart2, ack, sizeof(ack), HAL_MAX_DELAY);
|
||||||
firmware_update();
|
firmware_update();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Send over for bload
|
// Send over for bload
|
||||||
case 'l':
|
case 'l':
|
||||||
// @todo Implement this
|
// @todo Implement this
|
||||||
break;
|
break;
|
||||||
|
@ -110,7 +110,7 @@ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
|
||||||
command_mode = 1;
|
command_mode = 1;
|
||||||
HAL_UART_Transmit(&huart2, ack, sizeof(ack), HAL_MAX_DELAY);
|
HAL_UART_Transmit(&huart2, ack, sizeof(ack), HAL_MAX_DELAY);
|
||||||
} else {
|
} else {
|
||||||
HAL_I2C_Master_Transmit(&hi2c1, 0x29 << 1, &byte, 1, 1000);
|
HAL_I2C_Master_Transmit(&hi2c1, 0x29 << 1, &byte, 1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
HAL_UART_Receive_IT(&huart2, &byte, 1);
|
HAL_UART_Receive_IT(&huart2, &byte, 1);
|
||||||
|
@ -358,7 +358,7 @@ static void MX_I2C1_Init(void)
|
||||||
|
|
||||||
/* USER CODE END I2C1_Init 1 */
|
/* USER CODE END I2C1_Init 1 */
|
||||||
hi2c1.Instance = I2C1;
|
hi2c1.Instance = I2C1;
|
||||||
hi2c1.Init.ClockSpeed = 100000;
|
hi2c1.Init.ClockSpeed = 10000;
|
||||||
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
|
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
|
||||||
hi2c1.Init.OwnAddress1 = 0;
|
hi2c1.Init.OwnAddress1 = 0;
|
||||||
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
|
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
|
||||||
|
|
|
@ -227,7 +227,7 @@ FATFS0.BSP.semaphore=
|
||||||
PD9.GPIOParameters=GPIO_Speed
|
PD9.GPIOParameters=GPIO_Speed
|
||||||
PC10.Signal=SDIO_D2
|
PC10.Signal=SDIO_D2
|
||||||
PC5.Locked=true
|
PC5.Locked=true
|
||||||
ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART2_UART_Init-USART2-false-HAL-true,4-MX_I2C1_Init-I2C1-false-HAL-true,5-MX_SDIO_SD_Init-SDIO-false-HAL-true,6-MX_FATFS_Init-FATFS-false-HAL-false,7-MX_USB_DEVICE_Init-USB_DEVICE-false-HAL-false
|
ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART2_UART_Init-USART2-false-HAL-true,4-MX_I2C1_Init-I2C1-false-HAL-true,5-MX_SDIO_SD_Init-SDIO-false-HAL-true,6-MX_FATFS_Init-FATFS-false-HAL-false,7-MX_USB_DEVICE_Init-USB_DEVICE-false-HAL-false,8-MX_CRC_Init-CRC-false-HAL-true
|
||||||
PA9.GPIOParameters=GPIO_PuPd
|
PA9.GPIOParameters=GPIO_PuPd
|
||||||
PD9.GPIO_Speed=GPIO_SPEED_FREQ_LOW
|
PD9.GPIO_Speed=GPIO_SPEED_FREQ_LOW
|
||||||
PA11.Mode=Device_Only
|
PA11.Mode=Device_Only
|
||||||
|
@ -253,7 +253,7 @@ PE4.GPIOParameters=GPIO_Speed,PinState
|
||||||
Mcu.UserConstants=
|
Mcu.UserConstants=
|
||||||
PE5.GPIO_PuPd=GPIO_PULLUP
|
PE5.GPIO_PuPd=GPIO_PULLUP
|
||||||
PA7.PinState=GPIO_PIN_RESET
|
PA7.PinState=GPIO_PIN_RESET
|
||||||
I2C1.ClockSpeed=100000
|
I2C1.ClockSpeed=10000
|
||||||
PC1.GPIOParameters=GPIO_Speed,PinState
|
PC1.GPIOParameters=GPIO_Speed,PinState
|
||||||
Mcu.ThirdPartyNb=0
|
Mcu.ThirdPartyNb=0
|
||||||
RCC.HCLKFreq_Value=168000000
|
RCC.HCLKFreq_Value=168000000
|
||||||
|
@ -352,7 +352,7 @@ RCC.VCOOutputFreq_Value=336000000
|
||||||
PC13-ANTI_TAMP.Locked=true
|
PC13-ANTI_TAMP.Locked=true
|
||||||
PD11.GPIOParameters=GPIO_Speed
|
PD11.GPIOParameters=GPIO_Speed
|
||||||
RCC.APB2Freq_Value=84000000
|
RCC.APB2Freq_Value=84000000
|
||||||
MxCube.Version=6.1.0
|
MxCube.Version=6.1.1
|
||||||
VP_SYS_VS_Systick.Mode=SysTick
|
VP_SYS_VS_Systick.Mode=SysTick
|
||||||
PA10.GPIOParameters=GPIO_PuPd
|
PA10.GPIOParameters=GPIO_PuPd
|
||||||
PH1-OSC_OUT.Signal=RCC_OSC_OUT
|
PH1-OSC_OUT.Signal=RCC_OSC_OUT
|
||||||
|
@ -361,7 +361,7 @@ PA4.GPIOParameters=GPIO_PuPd
|
||||||
PE5.Locked=true
|
PE5.Locked=true
|
||||||
PE6.Signal=GPIO_Input
|
PE6.Signal=GPIO_Input
|
||||||
RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQ,PLLQCLKFreq_Value,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S
|
RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQ,PLLQCLKFreq_Value,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S
|
||||||
ProjectManager.AskForMigrate=false
|
ProjectManager.AskForMigrate=true
|
||||||
Mcu.Name=STM32F407V(E-G)Tx
|
Mcu.Name=STM32F407V(E-G)Tx
|
||||||
PE0.Signal=GPIO_Input
|
PE0.Signal=GPIO_Input
|
||||||
PA2.Signal=USART2_TX
|
PA2.Signal=USART2_TX
|
||||||
|
|
Loading…
Reference in New Issue
Block a user