diff --git a/source/Core/BSP/Magic/BSP.cpp b/source/Core/BSP/Magic/BSP.cpp index 4b06fae3..275d8788 100644 --- a/source/Core/BSP/Magic/BSP.cpp +++ b/source/Core/BSP/Magic/BSP.cpp @@ -7,7 +7,6 @@ #include "Setup.h" #include "TipThermoModel.h" #include "configuration.h" -#include "gd32vf103_timer.h" #include "history.hpp" #include "main.hpp" @@ -17,7 +16,9 @@ const uint8_t tempMeasureTicks = 14; uint16_t totalPWM; // Total length of the cycle's ticks -void resetWatchdog() { fwdgt_counter_reload(); } +void resetWatchdog() { + //#TODO +} uint16_t getHandleTemperature(uint8_t sample) { #ifdef TEMP_TMP36 @@ -36,9 +37,10 @@ uint16_t getHandleTemperature(uint8_t sample) { result /= 993; return result; #else -#error Pinecil only uses TMP36 +#error only uses TMP36 #endif } + uint16_t getInputVoltageX10(uint16_t divisor, uint8_t sample) { uint32_t res = getADCVin(sample); res *= 4; @@ -48,36 +50,48 @@ uint16_t getInputVoltageX10(uint16_t divisor, uint8_t sample) { void unstick_I2C() { /* configure SDA/SCL for GPIO */ - GPIO_BC(GPIOB) |= SDA_Pin | SCL_Pin; - gpio_init(SDA_GPIO_Port, GPIO_MODE_OUT_OD, GPIO_OSPEED_50MHZ, SDA_Pin | SCL_Pin); - for (int i = 0; i < 8; i++) { - asm("nop"); - asm("nop"); - asm("nop"); - asm("nop"); - asm("nop"); - GPIO_BOP(GPIOB) |= SCL_Pin; - asm("nop"); - asm("nop"); - asm("nop"); - asm("nop"); - asm("nop"); - GPIO_BOP(GPIOB) &= SCL_Pin; - } - /* connect PB6 to I2C0_SCL */ - /* connect PB7 to I2C0_SDA */ - gpio_init(SDA_GPIO_Port, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, SDA_Pin | SCL_Pin); + // GPIO_BC(GPIOB) |= SDA_Pin | SCL_Pin; + // gpio_init(SDA_GPIO_Port, GPIO_MODE_OUT_OD, GPIO_OSPEED_50MHZ, SDA_Pin | SCL_Pin); + // for (int i = 0; i < 8; i++) { + // asm("nop"); + // asm("nop"); + // asm("nop"); + // asm("nop"); + // asm("nop"); + // GPIO_BOP(GPIOB) |= SCL_Pin; + // asm("nop"); + // asm("nop"); + // asm("nop"); + // asm("nop"); + // asm("nop"); + // GPIO_BOP(GPIOB) &= SCL_Pin; + // } + // /* connect PB6 to I2C0_SCL */ + // /* connect PB7 to I2C0_SDA */ + // gpio_init(SDA_GPIO_Port, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, SDA_Pin | SCL_Pin); } -uint8_t getButtonA() { return (gpio_input_bit_get(KEY_A_GPIO_Port, KEY_A_Pin) == SET) ? 1 : 0; } -uint8_t getButtonB() { return (gpio_input_bit_get(KEY_B_GPIO_Port, KEY_B_Pin) == SET) ? 1 : 0; } +uint8_t getButtonA() { + //#TODO + return false; + // return (gpio_input_bit_get(KEY_A_GPIO_Port, KEY_A_Pin) == SET) ? 1 : 0; +} +uint8_t getButtonB() { + //#TODO + return false; + // return (gpio_input_bit_get(KEY_B_GPIO_Port, KEY_B_Pin) == SET) ? 1 : 0; +} void reboot() { // Spin for watchdog for (;;) {} } -void delay_ms(uint16_t count) { delay_1ms(count); } +void delay_ms(uint16_t count) { + // delay_1ms(count); + //#TODO +} + uint32_t __get_IPSR(void) { return 0; // To shut-up CMSIS } @@ -89,4 +103,6 @@ bool isTipDisconnected() { return tipTemp > tipDisconnectedThres; } -void setStatusLED(const enum StatusLED state) {} +void setStatusLED(const enum StatusLED state) { + // Dont have one +} diff --git a/source/Core/BSP/Magic/Debug.cpp b/source/Core/BSP/Magic/Debug.cpp index c9d5d3bf..cb050f94 100644 --- a/source/Core/BSP/Magic/Debug.cpp +++ b/source/Core/BSP/Magic/Debug.cpp @@ -24,38 +24,16 @@ void log_system_state(int32_t PWMWattsx10) { // 3+1+3+1+3+1+3+1+5+2 = 23, so sizing at 32 for now outputLength = snprintf(uartOutputBuffer, uartOutputBufferLength, "%lu,%u,%li,%u,%lu\r\n", // - TipThermoModel::getTipInC(false), // Tip temp in C - getHandleTemperature(0), // Handle temp in C X10 - PWMWattsx10, // Output Wattage - pendingPWM, // PWM - TipThermoModel::convertTipRawADCTouV(getTipRawTemp(0), true) // Tip temp in uV - ); + TipThermoModel::getTipInC(false), // Tip temp in C + getHandleTemperature(0), // Handle temp in C X10 + PWMWattsx10, // Output Wattage + pendingPWM, // PWM + TipThermoModel::convertTipRawADCTouV(getTipRawTemp(0), true) // Tip temp in uV + ); // Now print this out the uart via IRQ (DMA cant be used as oled has it) currentOutputPos = 0; /* enable USART1 Transmit Buffer Empty interrupt */ - usart_interrupt_enable(UART_PERIF, USART_INT_TBE); - } -} -ssize_t _write(int fd, const void *ptr, size_t len) { - if (len > uartOutputBufferLength) { - len = uartOutputBufferLength; - } - outputLength = len; - currentOutputPos = 0; - memcpy(uartOutputBuffer, ptr, len); - /* enable USART1 Transmit Buffer Empty interrupt */ - usart_interrupt_enable(UART_PERIF, USART_INT_TBE); - delay_ms(1); - return len; -} -void USART1_IRQHandler(void) { - if (RESET != usart_interrupt_flag_get(UART_PERIF, USART_INT_FLAG_TBE)) { - /* write one byte to the transmit data register */ - usart_data_transmit(UART_PERIF, uartOutputBuffer[currentOutputPos++]); - if (currentOutputPos >= outputLength) { - currentOutputPos = 0xFF; // Mark done - usart_interrupt_disable(UART_PERIF, USART_INT_TBE); - } + // usart_interrupt_enable(UART_PERIF, USART_INT_TBE); } } diff --git a/source/Core/BSP/Magic/FreeRTOSConfig.h b/source/Core/BSP/Magic/FreeRTOSConfig.h index 91a5e4b6..26ff14c9 100644 --- a/source/Core/BSP/Magic/FreeRTOSConfig.h +++ b/source/Core/BSP/Magic/FreeRTOSConfig.h @@ -1,6 +1,5 @@ #ifndef FREERTOS_CONFIG_H #define FREERTOS_CONFIG_H -#include "nuclei_sdk_soc.h" #include #define configUSE_PREEMPTION 1 #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 diff --git a/source/Core/BSP/Magic/I2C_Wrapper.cpp b/source/Core/BSP/Magic/I2C_Wrapper.cpp index f54e0a42..6aed84d4 100644 --- a/source/Core/BSP/Magic/I2C_Wrapper.cpp +++ b/source/Core/BSP/Magic/I2C_Wrapper.cpp @@ -24,280 +24,10 @@ uint8_t FRToSI2C::I2C_RegisterRead(uint8_t add, uint8_t reg) { return temp; } -enum class i2c_step { - // Write+read steps - Write_start, // Sending start on bus - Write_device_address, // start sent, send device address - Write_device_memory_address, // device address sent, write the memory location - Write_device_data_start, // Write all of the remaining data using DMA - Write_device_data_finish, // Write all of the remaining data using DMA - - Read_start, // second read - Read_device_address, // Send device address again for the read - Read_device_data_start, // read device data via DMA - Read_device_data_finish, // read device data via DMA - Send_stop, // send the stop at the end of the transaction - Wait_stop, // Wait for stop to send and we are done - Done, // Finished - Error_occured, // Error occured on the bus - -}; -struct i2c_state { - i2c_step currentStep; - bool isMemoryWrite; - bool wakePart; - uint8_t deviceAddress; - uint8_t memoryAddress; - uint8_t * buffer; - uint16_t numberOfBytes; - dma_parameter_struct dma_init_struct; -}; -i2c_state currentState; - -void perform_i2c_step() { - // Performs next step of the i2c state machine - if (i2c_flag_get(I2C0, I2C_FLAG_AERR)) { - i2c_flag_clear(I2C0, I2C_FLAG_AERR); - // Arb error - we lost the bus / nacked - currentState.currentStep = i2c_step::Error_occured; - } - switch (currentState.currentStep) { - case i2c_step::Error_occured: - i2c_stop_on_bus(I2C0); - break; - case i2c_step::Write_start: - - /* enable acknowledge */ - i2c_ack_config(I2C0, I2C_ACK_ENABLE); - /* i2c master sends start signal only when the bus is idle */ - if (!i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)) { - /* send the start signal */ - i2c_start_on_bus(I2C0); - currentState.currentStep = i2c_step::Write_device_address; - } - break; - - case i2c_step::Write_device_address: - /* i2c master sends START signal successfully */ - if (i2c_flag_get(I2C0, I2C_FLAG_SBSEND)) { - i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); // Clear sbsend by reading ctrl banks - i2c_master_addressing(I2C0, currentState.deviceAddress, I2C_TRANSMITTER); - currentState.currentStep = i2c_step::Write_device_memory_address; - } - break; - case i2c_step::Write_device_memory_address: - // Send the device memory location - - if (i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)) { // addr sent - i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); - - if (currentState.wakePart) { - // We are stopping here - currentState.currentStep = i2c_step::Send_stop; - return; - } - i2c_flag_clear(I2C0, I2C_FLAG_BTC); - // Write out the 8 byte address - i2c_data_transmit(I2C0, currentState.memoryAddress); - if (currentState.isMemoryWrite) { - currentState.currentStep = i2c_step::Write_device_data_start; - } else { - currentState.currentStep = i2c_step::Read_start; - } - } - - break; - case i2c_step::Write_device_data_start: - /* wait until the transmission data register is empty */ - if (i2c_flag_get(I2C0, I2C_FLAG_BTC)) { - dma_deinit(DMA0, DMA_CH5); - dma_init(DMA0, DMA_CH5, ¤tState.dma_init_struct); - i2c_dma_last_transfer_config(I2C0, I2C_DMALST_ON); - dma_circulation_disable(DMA0, DMA_CH5); - /* enable I2C0 DMA */ - i2c_dma_enable(I2C0, I2C_DMA_ON); - /* enable DMA0 channel5 */ - dma_channel_enable(DMA0, DMA_CH5); - currentState.currentStep = i2c_step::Write_device_data_finish; - } - break; - - case i2c_step::Write_device_data_finish: // Wait for complete then goto stop - /* wait until BTC bit is set */ - if (dma_flag_get(DMA0, DMA_CH5, DMA_FLAG_FTF)) { - /* wait until BTC bit is set */ - if (i2c_flag_get(I2C0, I2C_FLAG_BTC)) { - currentState.currentStep = i2c_step::Send_stop; - } - } - break; - case i2c_step::Read_start: - if (i2c_flag_get(I2C0, I2C_FLAG_BTC)) { - /* wait until BTC bit is set */ - i2c_start_on_bus(I2C0); - currentState.currentStep = i2c_step::Read_device_address; - } - break; - case i2c_step::Read_device_address: - if (i2c_flag_get(I2C0, I2C_FLAG_SBSEND)) { - i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); - if (currentState.numberOfBytes == 1) { - /* disable acknowledge */ - i2c_master_addressing(I2C0, currentState.deviceAddress, I2C_RECEIVER); - while (!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)) {} - i2c_ack_config(I2C0, I2C_ACK_DISABLE); - i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); - /* wait for the byte to be received */ - while (!i2c_flag_get(I2C0, I2C_FLAG_RBNE)) {} - /* read the byte received from the EEPROM */ - *currentState.buffer = i2c_data_receive(I2C0); - while (i2c_flag_get(I2C0, I2C_FLAG_RBNE)) { - i2c_data_receive(I2C0); - } - i2c_stop_on_bus(I2C0); - while ((I2C_CTL0(I2C0) & I2C_CTL0_STOP)) { - asm("nop"); - } - currentState.currentStep = i2c_step::Done; - } else if (currentState.numberOfBytes == 2) { - /* disable acknowledge */ - i2c_master_addressing(I2C0, currentState.deviceAddress, I2C_RECEIVER); - while (!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)) {} - i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); - /* wait for the byte to be received */ - while (!i2c_flag_get(I2C0, I2C_FLAG_RBNE)) {} - i2c_ackpos_config(I2C0, I2C_ACKPOS_CURRENT); - i2c_ack_config(I2C0, I2C_ACK_DISABLE); - - /* read the byte received from the EEPROM */ - *currentState.buffer = i2c_data_receive(I2C0); - currentState.buffer++; - - /* wait for the byte to be received */ - while (!i2c_flag_get(I2C0, I2C_FLAG_RBNE)) {} - /* read the byte received from the EEPROM */ - *currentState.buffer = i2c_data_receive(I2C0); - while (i2c_flag_get(I2C0, I2C_FLAG_RBNE)) { - i2c_data_receive(I2C0); - } - i2c_stop_on_bus(I2C0); - while ((I2C_CTL0(I2C0) & I2C_CTL0_STOP)) { - asm("nop"); - } - currentState.currentStep = i2c_step::Done; - } else { - i2c_master_addressing(I2C0, currentState.deviceAddress, I2C_RECEIVER); - currentState.currentStep = i2c_step::Read_device_data_start; - } - } - break; - case i2c_step::Read_device_data_start: - if (i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)) { // addr sent - i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); - /* one byte master reception procedure (polling) */ - if (currentState.numberOfBytes == 0) { - currentState.currentStep = i2c_step::Send_stop; - } else { /* more than one byte master reception procedure (DMA) */ - - while (currentState.numberOfBytes) { - - if (3 == currentState.numberOfBytes) { - /* wait until BTC bit is set */ - while (!i2c_flag_get(I2C0, I2C_FLAG_BTC)) {} - i2c_ackpos_config(I2C0, I2C_ACKPOS_CURRENT); - /* disable acknowledge */ - i2c_ack_config(I2C0, I2C_ACK_DISABLE); - } else if (2 == currentState.numberOfBytes) { - /* wait until BTC bit is set */ - while (!i2c_flag_get(I2C0, I2C_FLAG_BTC)) {} - /* disable acknowledge */ - i2c_ack_config(I2C0, I2C_ACK_DISABLE); - /* send a stop condition to I2C bus */ - i2c_stop_on_bus(I2C0); - } - /* wait until RBNE bit is set */ - while (!i2c_flag_get(I2C0, I2C_FLAG_RBNE)) {} - /* read a byte from the EEPROM */ - *currentState.buffer = i2c_data_receive(I2C0); - - /* point to the next location where the byte read will be saved */ - currentState.buffer++; - - /* decrement the read bytes counter */ - currentState.numberOfBytes--; - } - currentState.currentStep = i2c_step::Wait_stop; - // currentState.currentStep = i2c_step::Read_device_data_finish; - } - } - break; - case i2c_step::Read_device_data_finish: // Wait for complete then goto stop - /* wait until BTC bit is set */ - - break; - case i2c_step::Send_stop: - /* send a stop condition to I2C bus*/ - i2c_stop_on_bus(I2C0); - currentState.currentStep = i2c_step::Wait_stop; - break; - case i2c_step::Wait_stop: - /* i2c master sends STOP signal successfully */ - if ((I2C_CTL0(I2C0) & I2C_CTL0_STOP) != I2C_CTL0_STOP) { - currentState.currentStep = i2c_step::Done; - } - break; - default: - // If we get here something is amiss - return; - } -} - -bool perform_i2c_transaction(uint16_t DevAddress, uint16_t memory_address, uint8_t *p_buffer, uint16_t number_of_byte, bool isWrite, bool isWakeOnly) { - - currentState.isMemoryWrite = isWrite; - currentState.wakePart = isWakeOnly; - currentState.deviceAddress = DevAddress; - currentState.memoryAddress = memory_address; - currentState.numberOfBytes = number_of_byte; - currentState.buffer = p_buffer; - // Setup DMA - currentState.dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT; - currentState.dma_init_struct.memory_addr = (uint32_t)p_buffer; - currentState.dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; - currentState.dma_init_struct.number = number_of_byte; - currentState.dma_init_struct.periph_addr = (uint32_t)&I2C_DATA(I2C0); - currentState.dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; - currentState.dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT; - currentState.dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH; - - if (currentState.isMemoryWrite) { - currentState.dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL; - } else { - currentState.dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY; - } - // Clear flags - I2C_STAT0(I2C0) = 0; - I2C_STAT1(I2C0) = 0; - i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); - i2c_ackpos_config(I2C0, I2C_ACKPOS_CURRENT); - i2c_data_receive(I2C0); - i2c_data_receive(I2C0); - currentState.currentStep = i2c_step::Write_start; // Always start in write mode - TickType_t timeout = xTaskGetTickCount() + TICKS_100MS; - while ((currentState.currentStep != i2c_step::Done) && (currentState.currentStep != i2c_step::Error_occured)) { - if (xTaskGetTickCount() > timeout) { - i2c_stop_on_bus(I2C0); - return false; - } - perform_i2c_step(); - } - return currentState.currentStep == i2c_step::Done; -} - bool FRToSI2C::Mem_Read(uint16_t DevAddress, uint16_t read_address, uint8_t *p_buffer, uint16_t number_of_byte) { if (!lock()) return false; - bool res = perform_i2c_transaction(DevAddress, read_address, p_buffer, number_of_byte, false, false); + bool res = false; // perform_i2c_transaction(DevAddress, read_address, p_buffer, number_of_byte, false, false); if (!res) { I2C_Unstick(); } @@ -308,7 +38,7 @@ bool FRToSI2C::Mem_Read(uint16_t DevAddress, uint16_t read_address, uint8_t *p_b bool FRToSI2C::Mem_Write(uint16_t DevAddress, uint16_t MemAddress, uint8_t *p_buffer, uint16_t number_of_byte) { if (!lock()) return false; - bool res = perform_i2c_transaction(DevAddress, MemAddress, p_buffer, number_of_byte, true, false); + bool res = false; // perform_i2c_transaction(DevAddress, MemAddress, p_buffer, number_of_byte, true, false); if (!res) { I2C_Unstick(); } @@ -350,15 +80,10 @@ bool FRToSI2C::wakePart(uint16_t DevAddress) { // wakepart is a special case where only the device address is sent if (!lock()) return false; - bool res = perform_i2c_transaction(DevAddress, 0, NULL, 0, false, true); + bool res = false; // perform_i2c_transaction(DevAddress, 0, NULL, 0, false, true); if (!res) { I2C_Unstick(); } unlock(); return res; } - -void I2C_EV_IRQ() {} -void I2C_ER_IRQ() { - // Error callbacks -} diff --git a/source/Core/BSP/Magic/IRQ.cpp b/source/Core/BSP/Magic/IRQ.cpp index 6aa77aef..143a4eb0 100644 --- a/source/Core/BSP/Magic/IRQ.cpp +++ b/source/Core/BSP/Magic/IRQ.cpp @@ -18,12 +18,14 @@ volatile uint16_t i2c_nbytes; volatile uint16_t i2c_write_dress; volatile uint16_t i2c_read_dress; volatile uint8_t i2c_process_flag = 0; -static bool fastPWM; -static void switchToSlowPWM(void); -static void switchToFastPWM(void); -void ADC0_1_IRQHandler(void) { - adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOIC); +static bool fastPWM; +static void switchToSlowPWM(void); +static void switchToFastPWM(void); + +void ADC0_1_IRQHandler(void) { + + // adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOIC); // unblock the PID controller thread if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) { BaseType_t xHigherPriorityTaskWoken = pdFALSE; @@ -34,84 +36,85 @@ void ADC0_1_IRQHandler(void) { } } -volatile uint16_t PWMSafetyTimer = 0; -volatile uint8_t pendingPWM = 0; -void TIMER1_IRQHandler(void) { - static bool lastPeriodWasFast = false; +// volatile uint16_t PWMSafetyTimer = 0; +// volatile uint8_t pendingPWM = 0; +// void TIMER1_IRQHandler(void) { +// static bool lastPeriodWasFast = false; - if (timer_interrupt_flag_get(TIMER1, TIMER_INT_UP) == SET) { - timer_interrupt_flag_clear(TIMER1, TIMER_INT_UP); - // rollover turn on output if required - if (PWMSafetyTimer) { - PWMSafetyTimer--; - if (lastPeriodWasFast != fastPWM) { - if (fastPWM) { - switchToFastPWM(); - } else { - switchToSlowPWM(); - } - } - if (pendingPWM) { - timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_1, pendingPWM); - timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_0, 50); - } else { - timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_0, 0); - } - } - } - if (timer_interrupt_flag_get(TIMER1, TIMER_INT_CH1) == SET) { - timer_interrupt_flag_clear(TIMER1, TIMER_INT_CH1); - timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_0, 0); - } -} +// if (timer_interrupt_flag_get(TIMER1, TIMER_INT_UP) == SET) { +// timer_interrupt_flag_clear(TIMER1, TIMER_INT_UP); +// // rollover turn on output if required +// if (PWMSafetyTimer) { +// PWMSafetyTimer--; +// if (lastPeriodWasFast != fastPWM) { +// if (fastPWM) { +// switchToFastPWM(); +// } else { +// switchToSlowPWM(); +// } +// } +// if (pendingPWM) { +// timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_1, pendingPWM); +// timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_0, 50); +// } else { +// timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_0, 0); +// } +// } +// } +// if (timer_interrupt_flag_get(TIMER1, TIMER_INT_CH1) == SET) { +// timer_interrupt_flag_clear(TIMER1, TIMER_INT_CH1); +// timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_0, 0); +// } +// } void switchToFastPWM(void) { - fastPWM = true; - totalPWM = powerPWM + tempMeasureTicks + holdoffTicks; - TIMER_CAR(TIMER1) = (uint32_t)totalPWM; + // fastPWM = true; + // totalPWM = powerPWM + tempMeasureTicks + holdoffTicks; + // TIMER_CAR(TIMER1) = (uint32_t)totalPWM; - // ~10Hz - TIMER_CH0CV(TIMER1) = powerPWM + holdoffTicks; - // 1 kHz tick rate - TIMER_PSC(TIMER1) = 18000; + // // ~10Hz + // TIMER_CH0CV(TIMER1) = powerPWM + holdoffTicks; + // // 1 kHz tick rate + // TIMER_PSC(TIMER1) = 18000; } void switchToSlowPWM(void) { // 5Hz - fastPWM = false; - totalPWM = powerPWM + tempMeasureTicks / 2 + holdoffTicks / 2; - TIMER_CAR(TIMER1) = (uint32_t)totalPWM; - TIMER_CH0CV(TIMER1) = powerPWM + holdoffTicks / 2; - TIMER_PSC(TIMER1) = 36000; + // fastPWM = false; + // totalPWM = powerPWM + tempMeasureTicks / 2 + holdoffTicks / 2; + // TIMER_CAR(TIMER1) = (uint32_t)totalPWM; + // TIMER_CH0CV(TIMER1) = powerPWM + holdoffTicks / 2; + // TIMER_PSC(TIMER1) = 36000; } void setTipPWM(const uint8_t pulse, const bool shouldUseFastModePWM) { - PWMSafetyTimer = 10; // This is decremented in the handler for PWM so that the tip pwm is - // disabled if the PID task is not scheduled often enough. - pendingPWM = pulse; - fastPWM = shouldUseFastModePWM; + // PWMSafetyTimer = 10; // This is decremented in the handler for PWM so that the tip pwm is + // // disabled if the PID task is not scheduled often enough. + // pendingPWM = pulse; + // fastPWM = shouldUseFastModePWM; } extern osThreadId POWTaskHandle; void EXTI5_9_IRQHandler(void) { -#if POW_PD - if (RESET != exti_interrupt_flag_get(EXTI_5)) { - exti_interrupt_flag_clear(EXTI_5); + // #if POW_PD + // if (RESET != exti_interrupt_flag_get(EXTI_5)) { + // exti_interrupt_flag_clear(EXTI_5); - if (POWTaskHandle != nullptr) { - BaseType_t xHigherPriorityTaskWoken = pdFALSE; - xTaskNotifyFromISR(POWTaskHandle, 1, eSetBits, &xHigherPriorityTaskWoken); - /* Force a context switch if xHigherPriorityTaskWoken is now set to pdTRUE. - The macro used to do this is dependent on the port and may be called - portEND_SWITCHING_ISR. */ - portYIELD_FROM_ISR(xHigherPriorityTaskWoken); - } - } -#endif + // if (POWTaskHandle != nullptr) { + // BaseType_t xHigherPriorityTaskWoken = pdFALSE; + // xTaskNotifyFromISR(POWTaskHandle, 1, eSetBits, &xHigherPriorityTaskWoken); + // /* Force a context switch if xHigherPriorityTaskWoken is now set to pdTRUE. + // The macro used to do this is dependent on the port and may be called + // portEND_SWITCHING_ISR. */ + // portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + // } + // } + // #endif } bool getFUS302IRQLow() { // Return true if the IRQ line is still held low - return (RESET == gpio_input_bit_get(FUSB302_IRQ_GPIO_Port, FUSB302_IRQ_Pin)); + return false; + // return (RESET == gpio_input_bit_get(FUSB302_IRQ_GPIO_Port, FUSB302_IRQ_Pin)); } // These are unused for now void I2C0_EV_IRQHandler(void) {} diff --git a/source/Core/BSP/Magic/QC_GPIO.cpp b/source/Core/BSP/Magic/QC_GPIO.cpp index 11ad5344..32874d9b 100644 --- a/source/Core/BSP/Magic/QC_GPIO.cpp +++ b/source/Core/BSP/Magic/QC_GPIO.cpp @@ -13,36 +13,40 @@ #ifdef POW_QC void QC_DPlusZero_Six() { // pull down D+ - gpio_bit_reset(QC_DP_LOW_GPIO_Port, QC_DP_LOW_Pin); + // #TODO } void QC_DNegZero_Six() { - gpio_bit_set(QC_DM_HIGH_GPIO_Port, QC_DM_HIGH_Pin); - gpio_bit_reset(QC_DM_LOW_GPIO_Port, QC_DM_LOW_Pin); + // gpio_bit_set(QC_DM_HIGH_GPIO_Port, QC_DM_HIGH_Pin); + // gpio_bit_reset(QC_DM_LOW_GPIO_Port, QC_DM_LOW_Pin); } void QC_DPlusThree_Three() { // pull up D+ - gpio_bit_set(QC_DP_LOW_GPIO_Port, QC_DP_LOW_Pin); + // gpio_bit_set(QC_DP_LOW_GPIO_Port, QC_DP_LOW_Pin); } void QC_DNegThree_Three() { - gpio_bit_set(QC_DM_LOW_GPIO_Port, QC_DM_LOW_Pin); - gpio_bit_set(QC_DM_HIGH_GPIO_Port, QC_DM_HIGH_Pin); + // gpio_bit_set(QC_DM_LOW_GPIO_Port, QC_DM_LOW_Pin); + // gpio_bit_set(QC_DM_HIGH_GPIO_Port, QC_DM_HIGH_Pin); +} +void QC_DM_PullDown() { // gpio_init(USB_DM_LOW_GPIO_Port, GPIO_MODE_IPD, GPIO_OSPEED_2MHZ, USB_DM_Pin); +} +void QC_DM_No_PullDown() { // gpio_init(USB_DM_LOW_GPIO_Port, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_2MHZ, USB_DM_Pin); } -void QC_DM_PullDown() { gpio_init(USB_DM_LOW_GPIO_Port, GPIO_MODE_IPD, GPIO_OSPEED_2MHZ, USB_DM_Pin); } -void QC_DM_No_PullDown() { gpio_init(USB_DM_LOW_GPIO_Port, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_2MHZ, USB_DM_Pin); } void QC_Init_GPIO() { // Setup any GPIO into the right states for QC // D+ pulldown as output - gpio_init(QC_DP_LOW_GPIO_Port, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, QC_DP_LOW_Pin); + // gpio_init(QC_DP_LOW_GPIO_Port, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, QC_DP_LOW_Pin); // Make two D- pins floating QC_DM_PullDown(); } void QC_Post_Probe_En() { // Make two D- pins outputs - gpio_init(QC_DM_LOW_GPIO_Port, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, QC_DM_LOW_Pin); - gpio_init(QC_DM_HIGH_GPIO_Port, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, QC_DM_HIGH_Pin); + // gpio_init(QC_DM_LOW_GPIO_Port, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, QC_DM_LOW_Pin); + // gpio_init(QC_DM_HIGH_GPIO_Port, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, QC_DM_HIGH_Pin); } -uint8_t QC_DM_PulledDown() { return gpio_input_bit_get(USB_DM_LOW_GPIO_Port, USB_DM_Pin) == RESET ? 1 : 0; } +uint8_t QC_DM_PulledDown() { + // return gpio_input_bit_get(USB_DM_LOW_GPIO_Port, USB_DM_Pin) == RESET ? 1 : 0; +} #endif void QC_resync() { #ifdef POW_QC diff --git a/source/Core/BSP/Magic/README.md b/source/Core/BSP/Magic/README.md index 944507c4..6400892b 100644 --- a/source/Core/BSP/Magic/README.md +++ b/source/Core/BSP/Magic/README.md @@ -1,3 +1,3 @@ -# BSP section for Pinecil +# BSP section for Magic -This folder contains the hardware abstractions required for the Pinecil. A RISC-V based soldering iron. +This folder contains the hardware abstractions required for the Magic. A RISC-V based soldering iron. diff --git a/source/Core/BSP/Magic/Setup.cpp b/source/Core/BSP/Magic/Setup.cpp index a0b33c63..449a6179 100644 --- a/source/Core/BSP/Magic/Setup.cpp +++ b/source/Core/BSP/Magic/Setup.cpp @@ -16,34 +16,9 @@ uint16_t ADCReadings[ADC_NORM_SAMPLES]; // room for 32 lots of the pair of readings // Functions -void setup_gpio(); -void setup_dma(); -void setup_i2c(); -void setup_adc(); -void setup_timers(); -void setup_iwdg(); -void setup_uart(); void hardware_init() { - // I2C - setup_i2c(); - // GPIO - setup_gpio(); - // DMA - setup_dma(); - // ADC's - setup_adc(); - // Timers - setup_timers(); - // Watchdog - setup_iwdg(); - // ELIC - eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL0_PRIO4); - // uart for debugging - setup_uart(); - /* enable TIMER1 - PWM control timing*/ - timer_enable(TIMER1); - timer_enable(TIMER2); + // #TODO } uint16_t getADCHandleTemp(uint8_t sample) { @@ -72,6 +47,7 @@ uint16_t getADCVin(uint8_t sample) { } return filter.average(); } + // Returns either average or instant value. When sample is set the samples from the injected ADC are copied to the filter and then the raw reading is returned uint16_t getTipRawTemp(uint8_t sample) { static history filter = {{0}, 0, 0}; @@ -89,254 +65,6 @@ uint16_t getTipRawTemp(uint8_t sample) { return filter.average(); } -void setup_uart() { - // Setup the uart pins as a uart with dma - - /* enable USART clock */ - rcu_periph_clock_enable(RCU_USART1); - - /* connect port to USARTx_Tx */ - gpio_init(UART_TX_GPIO_Port, GPIO_MODE_AF_PP, GPIO_OSPEED_10MHZ, UART_TX_Pin); - - /* connect port to USARTx_Rx */ - gpio_init(UART_RX_GPIO_Port, GPIO_MODE_IPU, GPIO_OSPEED_10MHZ, UART_RX_Pin); - - /* USART configure */ - usart_deinit(UART_PERIF); - usart_baudrate_set(UART_PERIF, 1000000); - usart_word_length_set(UART_PERIF, USART_WL_8BIT); - usart_stop_bit_set(UART_PERIF, USART_STB_1BIT); - usart_parity_config(UART_PERIF, USART_PM_NONE); - usart_hardware_flow_rts_config(UART_PERIF, USART_RTS_DISABLE); - usart_hardware_flow_cts_config(UART_PERIF, USART_CTS_DISABLE); - usart_receive_config(UART_PERIF, USART_RECEIVE_DISABLE); // Dont use rx for now - usart_transmit_config(UART_PERIF, USART_TRANSMIT_ENABLE); - eclic_irq_enable(USART1_IRQn, 15, 15); - usart_enable(UART_PERIF); -} - -void setup_gpio() { - /* enable GPIOB clock */ - rcu_periph_clock_enable(RCU_GPIOA); - /* enable GPIOB clock */ - rcu_periph_clock_enable(RCU_GPIOB); - // Alternate function clock enable - rcu_periph_clock_enable(RCU_AF); - // Buttons as input - gpio_init(KEY_A_GPIO_Port, GPIO_MODE_IPD, GPIO_OSPEED_2MHZ, KEY_A_Pin); - gpio_init(KEY_B_GPIO_Port, GPIO_MODE_IPD, GPIO_OSPEED_2MHZ, KEY_B_Pin); - // OLED reset as output - gpio_init(OLED_RESET_GPIO_Port, GPIO_MODE_OUT_PP, GPIO_OSPEED_2MHZ, OLED_RESET_Pin); - // I2C as AF Open Drain - gpio_init(SDA_GPIO_Port, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, SDA_Pin); - gpio_init(SCL_GPIO_Port, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, SCL_Pin); - // PWM output as AF Push Pull - gpio_init(PWM_Out_GPIO_Port, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, PWM_Out_Pin); - // Analog Inputs ... as analog inputs - gpio_init(TMP36_INPUT_GPIO_Port, GPIO_MODE_AIN, GPIO_OSPEED_2MHZ, TMP36_INPUT_Pin); - gpio_init(TIP_TEMP_GPIO_Port, GPIO_MODE_AIN, GPIO_OSPEED_2MHZ, TIP_TEMP_Pin); - gpio_init(VIN_GPIO_Port, GPIO_MODE_AIN, GPIO_OSPEED_2MHZ, VIN_Pin); - - // Remap PB4 away from JTAG NJRST - gpio_pin_remap_config(GPIO_SWJ_NONJTRST_REMAP, ENABLE); - // FUSB interrupt - gpio_init(FUSB302_IRQ_GPIO_Port, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, FUSB302_IRQ_Pin); -} -void setup_dma() { - // Setup DMA for ADC0 - { - /* enable DMA0 clock */ - rcu_periph_clock_enable(RCU_DMA0); - // rcu_periph_clock_enable(RCU_DMA1); - /* ADC_DMA_channel configuration */ - dma_parameter_struct dma_data_parameter; - - /* ADC DMA_channel configuration */ - dma_deinit(DMA0, DMA_CH0); - - /* initialize DMA data mode */ - dma_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA(ADC0)); - dma_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE; - dma_data_parameter.memory_addr = (uint32_t)(ADCReadings); - dma_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE; - dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_16BIT; - dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_16BIT; - dma_data_parameter.direction = DMA_PERIPHERAL_TO_MEMORY; - dma_data_parameter.number = ADC_NORM_SAMPLES; - dma_data_parameter.priority = DMA_PRIORITY_HIGH; - dma_init(DMA0, DMA_CH0, &dma_data_parameter); - - dma_circulation_enable(DMA0, DMA_CH0); - - /* enable DMA channel */ - dma_channel_enable(DMA0, DMA_CH0); - } -} -void setup_i2c() { - /* enable I2C0 clock */ - rcu_periph_clock_enable(RCU_I2C0); - /* enable DMA0 clock */ - rcu_periph_clock_enable(RCU_DMA0); - // Setup I20 at 400kHz - i2c_clock_config(I2C0, 400 * 1000, I2C_DTCY_2); - i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, 0x7F); - i2c_enable(I2C0); - /* enable acknowledge */ - i2c_ack_config(I2C0, I2C_ACK_ENABLE); -} -void setup_adc() { - - // Setup ADC in normal + injected mode - // Want it to sample handle temp and input voltage normally via dma - // Then injected trigger to sample tip temp - memset(ADCReadings, 0, sizeof(ADCReadings)); - rcu_periph_clock_enable(RCU_ADC0); - rcu_periph_clock_enable(RCU_ADC1); - adc_deinit(ADC0); - adc_deinit(ADC1); - /* config ADC clock */ - rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV16); - // Run in normal parallel + inserted parallel - adc_mode_config(ADC_DAUL_INSERTED_PARALLEL); - adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE); - adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE); - adc_special_function_config(ADC1, ADC_CONTINUOUS_MODE, ENABLE); - adc_special_function_config(ADC1, ADC_SCAN_MODE, ENABLE); - // Align right - adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT); - adc_data_alignment_config(ADC1, ADC_DATAALIGN_RIGHT); - // Setup reading the handle temp - adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1); - adc_channel_length_config(ADC1, ADC_REGULAR_CHANNEL, 0); - // Setup the two channels - adc_regular_channel_config(ADC0, 0, TMP36_ADC0_CHANNEL, - ADC_SAMPLETIME_71POINT5); // temp sensor - // Setup that we want all 4 inserted readings to be the tip temp - adc_channel_length_config(ADC0, ADC_INSERTED_CHANNEL, 4); - adc_channel_length_config(ADC1, ADC_INSERTED_CHANNEL, 4); - for (int rank = 0; rank < 4; rank++) { - adc_inserted_channel_config(ADC0, rank, TIP_TEMP_ADC0_CHANNEL, ADC_SAMPLETIME_28POINT5); - adc_inserted_channel_config(ADC1, rank, VIN_ADC1_CHANNEL, ADC_SAMPLETIME_28POINT5); - } - // Setup timer 1 channel 0 to trigger injected measurements - adc_external_trigger_source_config(ADC0, ADC_INSERTED_CHANNEL, ADC0_1_EXTTRIG_INSERTED_T1_TRGO); - adc_external_trigger_source_config(ADC1, ADC_INSERTED_CHANNEL, ADC0_1_EXTTRIG_INSERTED_T1_TRGO); - - adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_NONE); - adc_external_trigger_source_config(ADC1, ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_NONE); - // Enable triggers for the ADC - adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, ENABLE); - adc_external_trigger_config(ADC1, ADC_INSERTED_CHANNEL, ENABLE); - adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE); - adc_external_trigger_config(ADC1, ADC_REGULAR_CHANNEL, ENABLE); - - adc_watchdog_disable(ADC0); - adc_watchdog_disable(ADC1); - adc_resolution_config(ADC0, ADC_RESOLUTION_12B); - adc_resolution_config(ADC1, ADC_RESOLUTION_12B); - /* clear the ADC flag */ - adc_oversample_mode_disable(ADC0); - adc_oversample_mode_disable(ADC1); - adc_enable(ADC0); - adc_calibration_enable(ADC0); - adc_enable(ADC1); - adc_calibration_enable(ADC1); - adc_dma_mode_enable(ADC0); - // Enable interrupt on end of injected readings - adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOC); - adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOIC); - adc_interrupt_enable(ADC0, ADC_INT_EOIC); - eclic_irq_enable(ADC0_1_IRQn, 2, 0); - adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL); - adc_software_trigger_enable(ADC1, ADC_REGULAR_CHANNEL); - adc_tempsensor_vrefint_disable(); -} -void setup_timers() { - // Setup timer 1 to run the actual PWM level - /* enable timer1 clock */ - rcu_periph_clock_enable(RCU_TIMER1); - rcu_periph_clock_enable(RCU_TIMER2); - timer_oc_parameter_struct timer_ocintpara; - timer_parameter_struct timer_initpara; - { - // deinit to reset the timer - timer_deinit(TIMER1); - /* initialize TIMER init parameter struct */ - timer_struct_para_init(&timer_initpara); - /* TIMER1 configuration */ - timer_initpara.prescaler = 30000; - timer_initpara.alignedmode = TIMER_COUNTER_EDGE; - timer_initpara.counterdirection = TIMER_COUNTER_UP; - timer_initpara.period = powerPWM + tempMeasureTicks + holdoffTicks; - timer_initpara.clockdivision = TIMER_CKDIV_DIV4; - timer_initpara.repetitioncounter = 0; - timer_init(TIMER1, &timer_initpara); - - /* CH0 configured to implement the PWM irq's for the output control*/ - timer_channel_output_struct_para_init(&timer_ocintpara); - timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_LOW; - timer_ocintpara.outputstate = TIMER_CCX_ENABLE; - timer_channel_output_config(TIMER1, TIMER_CH_0, &timer_ocintpara); - - timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_0, powerPWM + holdoffTicks); - timer_channel_output_mode_config(TIMER1, TIMER_CH_0, TIMER_OC_MODE_PWM1); - timer_channel_output_shadow_config(TIMER1, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE); - /* CH1 used for irq */ - timer_channel_output_struct_para_init(&timer_ocintpara); - timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH; - timer_ocintpara.outputstate = TIMER_CCX_ENABLE; - timer_channel_output_config(TIMER1, TIMER_CH_1, &timer_ocintpara); - timer_master_output_trigger_source_select(TIMER1, TIMER_TRI_OUT_SRC_CH0); - timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_1, 0); - timer_channel_output_mode_config(TIMER1, TIMER_CH_1, TIMER_OC_MODE_PWM0); - timer_channel_output_shadow_config(TIMER1, TIMER_CH_1, TIMER_OC_SHADOW_DISABLE); - // IRQ - timer_interrupt_enable(TIMER1, TIMER_INT_UP); - timer_interrupt_enable(TIMER1, TIMER_INT_CH1); - } - - eclic_irq_enable(TIMER1_IRQn, 2, 5); - // Setup timer 2 to control the output signal - { - timer_deinit(TIMER2); - /* initialize TIMER init parameter struct */ - timer_struct_para_init(&timer_initpara); - /* TIMER1 configuration */ - timer_initpara.prescaler = 200; - timer_initpara.alignedmode = TIMER_COUNTER_EDGE; - timer_initpara.counterdirection = TIMER_COUNTER_UP; - timer_initpara.period = 100; - timer_initpara.clockdivision = TIMER_CKDIV_DIV4; - timer_initpara.repetitioncounter = 0; - timer_init(TIMER2, &timer_initpara); - - /* CH0 configuration in PWM mode0 */ - timer_channel_output_struct_para_init(&timer_ocintpara); - timer_ocintpara.outputstate = TIMER_CCX_ENABLE; - timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE; - timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH; - timer_ocintpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; - timer_ocintpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW; - timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; - timer_channel_output_config(TIMER2, TIMER_CH_0, &timer_ocintpara); - timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_0, 0); - timer_channel_output_mode_config(TIMER2, TIMER_CH_0, TIMER_OC_MODE_PWM0); - timer_channel_output_shadow_config(TIMER2, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE); - timer_auto_reload_shadow_enable(TIMER2); - timer_enable(TIMER2); - } -} -void setup_iwdg() { - - fwdgt_config(0x0FFF, FWDGT_PSC_DIV256); - fwdgt_enable(); -} - void setupFUSBIRQ() { - eclic_global_interrupt_enable(); - eclic_irq_enable(EXTI5_9_IRQn, 15, 0); - gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_5); - - /* configure key EXTI line */ - exti_init(EXTI_5, EXTI_INTERRUPT, EXTI_TRIG_FALLING); + // #TODO } diff --git a/source/Core/BSP/Magic/bl602_config.h b/source/Core/BSP/Magic/bl602_config.h new file mode 100644 index 00000000..d156281c --- /dev/null +++ b/source/Core/BSP/Magic/bl602_config.h @@ -0,0 +1,39 @@ +/** + * @file bl602_config.h + * @brief + * + * Copyright (c) 2021 Bouffalolab team + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + */ + +#ifndef __BL602_CONFIG_H__ +#define __BL602_CONFIG_H__ + +#if defined(bl602_iot) +#include "bl602_iot/peripheral_config.h" +#include "bl602_iot/clock_config.h" +#include "bl602_iot/pinmux_config.h" +#elif defined(bl602_boot2) +#include "bl602_boot2/peripheral_config.h" +#include "bl602_boot2/clock_config.h" +#include "bl602_boot2/pinmux_config.h" +#else +#error "do not find board,please check your board name" +#endif + +#endif \ No newline at end of file diff --git a/source/Core/BSP/Magic/board.c b/source/Core/BSP/Magic/board.c new file mode 100644 index 00000000..82799579 --- /dev/null +++ b/source/Core/BSP/Magic/board.c @@ -0,0 +1,224 @@ +/** + * @file board.c + * @brief + * + * Copyright (c) 2021 Bouffalolab team + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + */ + +#include "hal_gpio.h" +#include "hal_clock.h" +#include "bl602_glb.h" +#include "bl602_config.h" +#include "bflb_platform.h" + +struct pin_mux_cfg { + uint8_t pin; + uint16_t func; +}; + +static const struct pin_mux_cfg af_pin_table[] = { +#ifdef CONFIG_GPIO0_FUNC + { .pin = GPIO_PIN_0, + .func = CONFIG_GPIO0_FUNC }, +#endif +#ifdef CONFIG_GPIO1_FUNC + { .pin = GPIO_PIN_1, + .func = CONFIG_GPIO1_FUNC }, +#endif +#ifdef CONFIG_GPIO2_FUNC + { .pin = GPIO_PIN_2, + .func = CONFIG_GPIO2_FUNC }, +#endif +#ifdef CONFIG_GPIO3_FUNC + { .pin = GPIO_PIN_3, + .func = CONFIG_GPIO3_FUNC }, +#endif +#ifdef CONFIG_GPIO4_FUNC + { .pin = GPIO_PIN_4, + .func = CONFIG_GPIO4_FUNC }, +#endif +#ifdef CONFIG_GPIO5_FUNC + { .pin = GPIO_PIN_5, + .func = CONFIG_GPIO5_FUNC }, +#endif +#ifdef CONFIG_GPIO6_FUNC + { .pin = GPIO_PIN_6, + .func = CONFIG_GPIO6_FUNC }, +#endif +#ifdef CONFIG_GPIO7_FUNC + { .pin = GPIO_PIN_7, + .func = CONFIG_GPIO7_FUNC }, +#endif +#ifdef CONFIG_GPIO8_FUNC + { .pin = GPIO_PIN_8, + .func = CONFIG_GPIO8_FUNC }, +#endif +#ifdef CONFIG_GPIO9_FUNC + { .pin = GPIO_PIN_9, + .func = CONFIG_GPIO9_FUNC }, +#endif +#ifdef CONFIG_GPIO10_FUNC + { .pin = GPIO_PIN_10, + .func = CONFIG_GPIO10_FUNC }, +#endif +#ifdef CONFIG_GPIO11_FUNC + { .pin = GPIO_PIN_11, + .func = CONFIG_GPIO11_FUNC }, +#endif +#ifdef CONFIG_GPIO12_FUNC + { .pin = GPIO_PIN_12, + .func = CONFIG_GPIO12_FUNC }, +#endif +#ifdef CONFIG_GPIO13_FUNC + { .pin = GPIO_PIN_13, + .func = CONFIG_GPIO13_FUNC }, +#endif +#ifdef CONFIG_GPIO14_FUNC + { .pin = GPIO_PIN_14, + .func = CONFIG_GPIO14_FUNC }, +#endif +#ifdef CONFIG_GPIO15_FUNC + { .pin = GPIO_PIN_15, + .func = CONFIG_GPIO15_FUNC }, +#endif +#ifdef CONFIG_GPIO16_FUNC + { .pin = GPIO_PIN_16, + .func = CONFIG_GPIO16_FUNC }, +#endif +#ifdef CONFIG_GPIO17_FUNC + { .pin = GPIO_PIN_17, + .func = CONFIG_GPIO17_FUNC }, +#endif +#ifdef CONFIG_GPIO18_FUNC + { .pin = GPIO_PIN_18, + .func = CONFIG_GPIO18_FUNC }, +#endif +#ifdef CONFIG_GPIO19_FUNC + { .pin = GPIO_PIN_19, + .func = CONFIG_GPIO19_FUNC }, +#endif +#ifdef CONFIG_GPIO20_FUNC + { .pin = GPIO_PIN_20, + .func = CONFIG_GPIO20_FUNC }, +#endif +#ifdef CONFIG_GPIO21_FUNC + { .pin = GPIO_PIN_21, + .func = CONFIG_GPIO21_FUNC }, +#endif +#ifdef CONFIG_GPIO22_FUNC + { .pin = GPIO_PIN_22, + .func = CONFIG_GPIO22_FUNC }, +#endif +#ifdef CONFIG_GPIO23_FUNC + { .pin = GPIO_PIN_23, + .func = CONFIG_GPIO23_FUNC }, +#endif +#ifdef CONFIG_GPIO24_FUNC + { .pin = GPIO_PIN_24, + .func = CONFIG_GPIO24_FUNC }, +#endif +#ifdef CONFIG_GPIO25_FUNC + { .pin = GPIO_PIN_25, + .func = CONFIG_GPIO25_FUNC }, +#endif +#ifdef CONFIG_GPIO26_FUNC + { .pin = GPIO_PIN_26, + .func = CONFIG_GPIO26_FUNC }, +#endif +#ifdef CONFIG_GPIO27_FUNC + { .pin = GPIO_PIN_27, + .func = CONFIG_GPIO27_FUNC }, +#endif +#ifdef CONFIG_GPIO28_FUNC + { .pin = GPIO_PIN_28, + .func = CONFIG_GPIO28_FUNC }, +#endif +}; + +static void board_pin_mux_init(void) +{ + GLB_GPIO_Cfg_Type gpio_cfg; + + gpio_cfg.drive = 0; + gpio_cfg.smtCtrl = 1; + + for (int i = 0; i < sizeof(af_pin_table) / sizeof(af_pin_table[0]); i++) { + gpio_cfg.gpioMode = GPIO_MODE_AF; + gpio_cfg.pullType = GPIO_PULL_UP; + gpio_cfg.gpioPin = af_pin_table[i].pin; + gpio_cfg.gpioFun = af_pin_table[i].func; + + if (af_pin_table[i].func == GPIO_FUN_UNUSED) { + continue; + } else if (af_pin_table[i].func == GPIO_FUN_PWM) { + gpio_cfg.pullType = GPIO_PULL_DOWN; + } + // else if((af_pin_table[i].func == GPIO_FUN_DAC)|| (af_pin_table[i].func == GPIO_FUN_ADC)) + // { + // gpio_cfg.gpioFun = GPIO_FUN_ANALOG; + // gpio_cfg.gpioMode = GPIO_MODE_ANALOG; + // } + else if ((af_pin_table[i].func & 0x70) == 0x70) { + gpio_cfg.gpioFun = GPIO_FUN_UART; + uint8_t uart_func = af_pin_table[i].func & 0x07; + uint8_t uart_sig = gpio_cfg.gpioPin % 8; + /*link to one uart sig*/ + GLB_UART_Fun_Sel((GLB_UART_SIG_Type)uart_sig, (GLB_UART_SIG_FUN_Type)uart_func); + GLB_UART_Fun_Sel((GLB_UART_SIG_Type)uart_func, (GLB_UART_SIG_FUN_Type)uart_sig); + } + + GLB_GPIO_Init(&gpio_cfg); + } +} + +static void board_clock_init(void) +{ + system_clock_init(); + peripheral_clock_init(); +} + +void bl_show_info(void) +{ + MSG("\r\n"); + MSG(" ____ __ __ _ _ _ \r\n"); + MSG(" | _ \\ / _|/ _| | | | | | | \r\n"); + MSG(" | |_) | ___ _ _| |_| |_ __ _| | ___ | | __ _| |__ \r\n"); + MSG(" | _ < / _ \\| | | | _| _/ _` | |/ _ \\| |/ _` | '_ \\ \r\n"); + MSG(" | |_) | (_) | |_| | | | || (_| | | (_) | | (_| | |_) |\r\n"); + MSG(" |____/ \\___/ \\__,_|_| |_| \\__,_|_|\\___/|_|\\__,_|_.__/ \r\n"); + MSG("\r\n"); + MSG("Build:%s,%s\r\n", __TIME__, __DATE__); + MSG("Copyright (c) 2021 Bouffalolab team\r\n"); + +#if 0 + MSG("root clock:%dM\r\n", system_clock_get(SYSTEM_CLOCK_ROOT_CLOCK) / 1000000); + MSG("fclk clock:%dM\r\n", system_clock_get(SYSTEM_CLOCK_FCLK) / 1000000); + MSG("bclk clock:%dM\r\n", system_clock_get(SYSTEM_CLOCK_BCLK) / 1000000); + + MSG("uart clock:%dM\r\n", peripheral_clock_get(PERIPHERAL_CLOCK_UART) / 1000000); + MSG("spi clock:%dM\r\n", peripheral_clock_get(PERIPHERAL_CLOCK_SPI) / 1000000); + MSG("i2c clock:%dM\r\n", peripheral_clock_get(PERIPHERAL_CLOCK_I2C) / 1000000); +#endif +} + +void board_init(void) +{ + board_clock_init(); + board_pin_mux_init(); +} diff --git a/source/Core/BSP/Magic/clock_config.h b/source/Core/BSP/Magic/clock_config.h new file mode 100644 index 00000000..43bdb391 --- /dev/null +++ b/source/Core/BSP/Magic/clock_config.h @@ -0,0 +1,55 @@ +/** + * @file clock_config.h + * @brief + * + * Copyright (c) 2021 Bouffalolab team + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + */ + +#ifndef _CLOCK_CONFIG_H +#define _CLOCK_CONFIG_H + +#define XTAL_TYPE EXTERNAL_XTAL_40M +#define XTAL_32K_TYPE INTERNAL_RC_32K +#define BSP_ROOT_CLOCK_SOURCE ROOT_CLOCK_SOURCE_PLL_160M + +#define BSP_FCLK_DIV 0 +#define BSP_BCLK_DIV 1 + +#if defined(BSP_USING_UART0) || defined(BSP_USING_UART1) +#define BSP_UART_CLOCK_SOURCE ROOT_CLOCK_SOURCE_PLL_160M +#define BSP_UART_CLOCK_DIV 0 +#endif +#if defined(BSP_USING_I2C0) +#define BSP_I2C_CLOCK_SOURCE ROOT_CLOCK_SOURCE_BCLK +#define BSP_I2C_CLOCK_DIV 0 +#endif +#if defined(BSP_USING_SPI0) +#define BSP_SPI_CLOCK_SOURCE ROOT_CLOCK_SOURCE_BCLK +#define BSP_SPI_CLOCK_DIV 0 +#endif +#if defined(BSP_USING_ADC0) +#define BSP_ADC_CLOCK_SOURCE ROOT_CLOCK_SOURCE_XCLK +#define BSP_ADC_CLOCK_DIV 0 +#endif +#if defined(BSP_USING_DAC0) +#define BSP_DAC_CLOCK_SOURCE ROOT_CLOCK_SOURCE_AUPLL +#define BSP_DAC_CLOCK_DIV 1 +#endif + +#endif \ No newline at end of file diff --git a/source/Core/BSP/Magic/configuration.h b/source/Core/BSP/Magic/configuration.h index 9fc1959b..2445c421 100644 --- a/source/Core/BSP/Magic/configuration.h +++ b/source/Core/BSP/Magic/configuration.h @@ -109,11 +109,11 @@ #define OP_AMP_GAIN_STAGE_PINECIL (1 + (OP_AMP_Rf_Pinecil / OP_AMP_Rin_Pinecil)) -#if defined(MODEL_Pinecil) == 0 +#if defined(MODEL_Magic) == 0 #error "No model defined!" #endif -#ifdef MODEL_Pinecil +#ifdef MODEL_Magic #define SOLDERING_TEMP 320 // Default soldering temp is 320.0 °C #define VOLTAGE_DIV 467 // 467 - Default divider from schematic #define CALIBRATION_OFFSET 900 // 900 - Default adc offset in uV diff --git a/source/Core/BSP/Magic/flash.c b/source/Core/BSP/Magic/flash.c index 8c0ce3f5..14ef55d7 100644 --- a/source/Core/BSP/Magic/flash.c +++ b/source/Core/BSP/Magic/flash.c @@ -7,37 +7,19 @@ #include "BSP.h" #include "BSP_Flash.h" -#include "gd32vf103_libopt.h" #include "string.h" #define FMC_PAGE_SIZE ((uint16_t)0x400U) // static uint16_t settings_page[FMC_PAGE_SIZE] __attribute__ ((section (".settings_page"))); // Linker script doesnt want to play, so for now its hard coded #define SETTINGS_START_PAGE (0x08000000 + (127 * 1024)) uint8_t flash_save_buffer(const uint8_t *buffer, const uint16_t length) { - - /* unlock the flash program/erase controller */ - fmc_unlock(); - - /* clear all pending flags */ - fmc_flag_clear(FMC_FLAG_END); - fmc_flag_clear(FMC_FLAG_WPERR); - fmc_flag_clear(FMC_FLAG_PGERR); - resetWatchdog(); - fmc_page_erase((uint32_t)SETTINGS_START_PAGE); - resetWatchdog(); - uint16_t *data = (uint16_t *)buffer; - for (uint16_t i = 0; i < (length / 2); i++) { - fmc_halfword_program((uint32_t)SETTINGS_START_PAGE + (i * 2), data[i]); - fmc_flag_clear(FMC_FLAG_END); - fmc_flag_clear(FMC_FLAG_WPERR); - fmc_flag_clear(FMC_FLAG_PGERR); - resetWatchdog(); - } - fmc_lock(); + // #TODO return 1; } void flash_read_buffer(uint8_t *buffer, const uint16_t length) { + return; + // #TODO uint32_t *b = (uint32_t *)buffer; uint32_t *b2 = (uint32_t *)SETTINGS_START_PAGE; for (int i = 0; i < length / 4; i++) { diff --git a/source/Core/BSP/Magic/peripheral_config.h b/source/Core/BSP/Magic/peripheral_config.h new file mode 100644 index 00000000..047ad666 --- /dev/null +++ b/source/Core/BSP/Magic/peripheral_config.h @@ -0,0 +1,243 @@ +/** + * @file peripheral_config.h + * @brief + * + * Copyright (c) 2021 Bouffalolab team + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + */ + +#ifndef _PERIPHERAL_CONFIG_H_ +#define _PERIPHERAL_CONFIG_H_ + +/* PERIPHERAL USING LIST */ +#define BSP_USING_UART0 +/* ----------------------*/ + +/* PERIPHERAL With DMA LIST */ +#define BSP_USING_DAC0 +#define BSP_USING_DMA0_CH0 +#define BSP_USING_DMA0_CH1 +#define BSP_USING_DMA0_CH2 +#define BSP_USING_DMA0_CH3 +#define BSP_USING_DMA0_CH4 +#define BSP_USING_DMA0_CH5 +#define BSP_USING_DMA0_CH6 +#define BSP_USING_DMA0_CH7 + +/* PERIPHERAL CONFIG */ + +#if defined(BSP_USING_DAC0) +#ifndef DAC_CONFIG +#define DAC_CONFIG \ + { \ + .channels = DAC_CHANNEL_0, \ + .sample_freq = DAC_SAMPLE_FREQ_500KHZ, \ + .vref = DAC_VREF_INTERNAL, \ + } +#endif +#endif + +#if defined(BSP_USING_UART0) +#ifndef UART0_CONFIG +#define UART0_CONFIG \ + { \ + .id = 0, \ + .baudrate = 2000000, \ + .databits = UART_DATA_LEN_8, \ + .stopbits = UART_STOP_ONE, \ + .parity = UART_PAR_NONE, \ + .fifo_threshold = 0, \ + } +#endif +#endif + +#if defined(BSP_USING_UART1) +#ifndef UART1_CONFIG +#define UART1_CONFIG \ + { \ + .id = 1, \ + .baudrate = 2000000, \ + .databits = UART_DATA_LEN_8, \ + .stopbits = UART_STOP_ONE, \ + .parity = UART_PAR_NONE, \ + .fifo_threshold = 63, \ + } +#endif +#endif + +#if defined(BSP_USING_DMA0_CH0) +#ifndef DMA0_CH0_CONFIG +#define DMA0_CH0_CONFIG \ + { \ + .id = 0, \ + .ch = 0, \ + .direction = DMA_MEMORY_TO_MEMORY, \ + .transfer_mode = DMA_LLI_ONCE_MODE, \ + .src_req = DMA_REQUEST_NONE, \ + .dst_req = DMA_REQUEST_NONE, \ + .src_addr_inc = DMA_ADDR_INCREMENT_ENABLE, \ + .dst_addr_inc = DMA_ADDR_INCREMENT_ENABLE, \ + .src_burst_size = DMA_BURST_1BYTE, \ + .dst_burst_size = DMA_BURST_1BYTE, \ + .src_width = DMA_TRANSFER_WIDTH_32BIT, \ + .dst_width = DMA_TRANSFER_WIDTH_32BIT, \ + } +#endif +#endif + +#if defined(BSP_USING_DMA0_CH1) +#ifndef DMA0_CH1_CONFIG +#define DMA0_CH1_CONFIG \ + { \ + .id = 0, \ + .ch = 1, \ + .direction = DMA_MEMORY_TO_MEMORY, \ + .transfer_mode = DMA_LLI_ONCE_MODE, \ + .src_req = DMA_REQUEST_NONE, \ + .dst_req = DMA_REQUEST_NONE, \ + .src_addr_inc = DMA_ADDR_INCREMENT_ENABLE, \ + .dst_addr_inc = DMA_ADDR_INCREMENT_ENABLE, \ + .src_burst_size = DMA_BURST_1BYTE, \ + .dst_burst_size = DMA_BURST_1BYTE, \ + .src_width = DMA_TRANSFER_WIDTH_16BIT, \ + .dst_width = DMA_TRANSFER_WIDTH_16BIT, \ + } +#endif +#endif + +#if defined(BSP_USING_DMA0_CH2) +#ifndef DMA0_CH2_CONFIG +#define DMA0_CH2_CONFIG \ + { \ + .id = 0, \ + .ch = 2, \ + .direction = DMA_MEMORY_TO_PERIPH, \ + .transfer_mode = DMA_LLI_ONCE_MODE, \ + .src_req = DMA_REQUEST_NONE, \ + .dst_req = DMA_REQUEST_UART1_TX, \ + .src_addr_inc = DMA_ADDR_INCREMENT_ENABLE, \ + .dst_addr_inc = DMA_ADDR_INCREMENT_DISABLE, \ + .src_burst_size = DMA_BURST_1BYTE, \ + .dst_burst_size = DMA_BURST_1BYTE, \ + .src_width = DMA_TRANSFER_WIDTH_8BIT, \ + .dst_width = DMA_TRANSFER_WIDTH_8BIT, \ + } +#endif +#endif + +#if defined(BSP_USING_DMA0_CH3) +#ifndef DMA0_CH3_CONFIG +#define DMA0_CH3_CONFIG \ + { \ + .id = 0, \ + .ch = 3, \ + .direction = DMA_MEMORY_TO_PERIPH, \ + .transfer_mode = DMA_LLI_ONCE_MODE, \ + .src_req = DMA_REQUEST_NONE, \ + .dst_req = DMA_REQUEST_SPI0_TX, \ + .src_addr_inc = DMA_ADDR_INCREMENT_ENABLE, \ + .dst_addr_inc = DMA_ADDR_INCREMENT_DISABLE, \ + .src_burst_size = DMA_BURST_1BYTE, \ + .dst_burst_size = DMA_BURST_1BYTE, \ + .src_width = DMA_TRANSFER_WIDTH_8BIT, \ + .dst_width = DMA_TRANSFER_WIDTH_8BIT, \ + } +#endif +#endif + +#if defined(BSP_USING_DMA0_CH4) +#ifndef DMA0_CH4_CONFIG +#define DMA0_CH4_CONFIG \ + { \ + .id = 0, \ + .ch = 4, \ + .direction = DMA_PERIPH_TO_MEMORY, \ + .transfer_mode = DMA_LLI_ONCE_MODE, \ + .src_req = DMA_REQUEST_SPI0_RX, \ + .dst_req = DMA_REQUEST_NONE, \ + .src_addr_inc = DMA_ADDR_INCREMENT_DISABLE, \ + .dst_addr_inc = DMA_ADDR_INCREMENT_ENABLE, \ + .src_burst_size = DMA_BURST_1BYTE, \ + .dst_burst_size = DMA_BURST_1BYTE, \ + .src_width = DMA_TRANSFER_WIDTH_8BIT, \ + .dst_width = DMA_TRANSFER_WIDTH_8BIT, \ + } +#endif +#endif + +#if defined(BSP_USING_DMA0_CH5) +#ifndef DMA0_CH5_CONFIG +#define DMA0_CH5_CONFIG \ + { \ + .id = 0, \ + .ch = 5, \ + .direction = DMA_MEMORY_TO_PERIPH, \ + .transfer_mode = DMA_LLI_CYCLE_MODE, \ + .src_req = DMA_REQUEST_NONE, \ + .dst_req = DMA_REQUEST_I2S_TX, \ + .src_addr_inc = DMA_ADDR_INCREMENT_ENABLE, \ + .dst_addr_inc = DMA_ADDR_INCREMENT_DISABLE, \ + .src_burst_size = DMA_BURST_1BYTE, \ + .dst_burst_size = DMA_BURST_1BYTE, \ + .src_width = DMA_TRANSFER_WIDTH_16BIT, \ + .dst_width = DMA_TRANSFER_WIDTH_16BIT, \ + } +#endif +#endif + +#if defined(BSP_USING_DMA0_CH6) +#ifndef DMA0_CH6_CONFIG +#define DMA0_CH6_CONFIG \ + { \ + .id = 0, \ + .ch = 6, \ + .direction = DMA_MEMORY_TO_PERIPH, \ + .transfer_mode = DMA_LLI_CYCLE_MODE, \ + .src_req = DMA_REQUEST_NONE, \ + .dst_req = DMA_REQUEST_I2S_TX, \ + .src_addr_inc = DMA_ADDR_INCREMENT_ENABLE, \ + .dst_addr_inc = DMA_ADDR_INCREMENT_DISABLE, \ + .src_burst_size = DMA_BURST_1BYTE, \ + .dst_burst_size = DMA_BURST_1BYTE, \ + .src_width = DMA_TRANSFER_WIDTH_16BIT, \ + .dst_width = DMA_TRANSFER_WIDTH_16BIT, \ + } +#endif +#endif + +#if defined(BSP_USING_DMA0_CH7) +#ifndef DMA0_CH7_CONFIG +#define DMA0_CH7_CONFIG \ + { \ + .id = 0, \ + .ch = 7, \ + .direction = DMA_MEMORY_TO_MEMORY, \ + .transfer_mode = DMA_LLI_ONCE_MODE, \ + .src_req = DMA_REQUEST_NONE, \ + .dst_req = DMA_REQUEST_NONE, \ + .src_addr_inc = DMA_ADDR_INCREMENT_ENABLE, \ + .dst_addr_inc = DMA_ADDR_INCREMENT_ENABLE, \ + .src_burst_size = DMA_BURST_1BYTE, \ + .dst_burst_size = DMA_BURST_1BYTE, \ + .src_width = DMA_TRANSFER_WIDTH_32BIT, \ + .dst_width = DMA_TRANSFER_WIDTH_32BIT, \ + } +#endif +#endif + +#endif diff --git a/source/Core/BSP/Magic/pinmux_config.h b/source/Core/BSP/Magic/pinmux_config.h new file mode 100644 index 00000000..1594564c --- /dev/null +++ b/source/Core/BSP/Magic/pinmux_config.h @@ -0,0 +1,144 @@ +/** + * @file pinmux_config.h + * @brief + * + * Copyright (c) 2021 Bouffalolab team + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + */ +#ifndef _PINMUX_CONFIG_H +#define _PINMUX_CONFIG_H + +// <<< Use Configuration Wizard in Context Menu >>> + +// GPIO0 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_CAM//GPIO_FUN_UART0_RTS//GPIO_FUN_UART1_RTS//GPIO_FUN_ETHER_MAC//GPIO_FUN_QDEC] +// config gpio0 function +#define CONFIG_GPIO0_FUNC GPIO_FUN_UNUSED + +// GPIO1 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_CAM//GPIO_FUN_UART0_CTS//GPIO_FUN_UART1_CTS//GPIO_FUN_ETHER_MAC//GPIO_FUN_QDEC] +// config gpio1 function +#define CONFIG_GPIO1_FUNC GPIO_FUN_UNUSED + +// GPIO2 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_CAM//GPIO_FUN_UART0_TX//GPIO_FUN_UART1_TX//GPIO_FUN_ETHER_MAC//GPIO_FUN_QDEC] +// config gpio2 function +#define CONFIG_GPIO2_FUNC GPIO_FUN_UNUSED + +// GPIO3 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_CAM//GPIO_FUN_UART0_RX//GPIO_FUN_UART1_RX//GPIO_FUN_QDEC] +// config gpio3 function +#define CONFIG_GPIO3_FUNC GPIO_FUN_UNUSED + +// GPIO4 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_CAM//GPIO_FUN_UART0_RTS//GPIO_FUN_UART1_RTS//GPIO_FUN_QDEC] +// config gpio4 function +#define CONFIG_GPIO4_FUNC GPIO_FUN_UNUSED + +// GPIO5 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_CAM//GPIO_FUN_UART0_CTS//GPIO_FUN_UART1_CTS//GPIO_FUN_QDEC] +// config gpio5 function +#define CONFIG_GPIO5_FUNC GPIO_FUN_UNUSED + +// GPIO6 <2> [GPIO_FUN_UNUSED//GPIO_FUN_CLK_OUT//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_CAM//GPIO_FUN_UART0_TX//GPIO_FUN_UART1_TX//GPIO_FUN_QDEC] +// config gpio6 function +#define CONFIG_GPIO6_FUNC GPIO_FUN_UNUSED + +// GPIO7 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_USB//GPIO_FUN_ANALOG//GPIO_FUN_UART0_RX//GPIO_FUN_UART1_RX//GPIO_FUN_ETHER_MAC//GPIO_FUN_QDEC] +// config gpio7 function +#define CONFIG_GPIO7_FUNC GPIO_FUN_UART0_RX + +// GPIO8 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_USB//GPIO_FUN_ANALOG//GPIO_FUN_UART0_RTS//GPIO_FUN_UART1_RTS//GPIO_FUN_ETHER_MAC//GPIO_FUN_QDEC] +// config gpio8 function +#define CONFIG_GPIO8_FUNC GPIO_FUN_UNUSED + +// GPIO9 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_ANALOG//GPIO_FUN_UART0_RTS//GPIO_FUN_UART1_RTS//GPIO_FUN_QDEC] +// config gpio9 function +#define CONFIG_GPIO9_FUNC GPIO_FUN_UNUSED + +// GPIO10 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_ANALOG//GPIO_FUN_UART0_RTS//GPIO_FUN_UART1_RTS//GPIO_FUN_QDEC] +// config gpio10 function +#define CONFIG_GPIO10_FUNC GPIO_FUN_UNUSED + +// GPIO11 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_ANALOG//GPIO_FUN_UART0_RTS//GPIO_FUN_UART1_RTS//GPIO_FUN_QDEC] +// config gpio11 function +#define CONFIG_GPIO11_FUNC GPIO_FUN_UNUSED + +// GPIO12 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_CAM//GPIO_FUN_ANALOG//GPIO_FUN_UART0_RTS//GPIO_FUN_UART1_RTS//GPIO_FUN_QDEC] +// config gpio12 function +#define CONFIG_GPIO12_FUNC GPIO_FUN_UNUSED + +// GPIO13 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_UART0_RTS//GPIO_FUN_UART1_RTS//GPIO_FUN_QDEC] +// config gpio13 function +#define CONFIG_GPIO13_FUNC GPIO_FUN_ANALOG + +// GPIO14 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_ANALOG//GPIO_FUN_UART0_RTS//GPIO_FUN_UART1_RTS//GPIO_FUN_QDEC] +// config gpio14 function +#define CONFIG_GPIO14_FUNC GPIO_FUN_ANALOG + +// GPIO15 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_ANALOG//GPIO_FUN_UART0_RTS//GPIO_FUN_UART1_RTS//GPIO_FUN_QDEC] +// config gpio15 function +#define CONFIG_GPIO15_FUNC GPIO_FUN_UNUSED + +// GPIO16 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_UART0_RTS//GPIO_FUN_UART1_RTS//GPIO_FUN_QDEC] +// config gpio16 function +#define CONFIG_GPIO16_FUNC GPIO_FUN_UART0_TX + +// GPIO17 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_CAM//GPIO_FUN_ANALOG//GPIO_FUN_UART0_RTS//GPIO_FUN_UART1_RTS//GPIO_FUN_QDEC] +// config gpio17 function +#define CONFIG_GPIO17_FUNC GPIO_FUN_UNUSED + +// GPIO18 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_CAM//GPIO_FUN_ANALOG//GPIO_FUN_UART0_RTS//GPIO_FUN_UART1_RTS//GPIO_FUN_ETHER_MAC//GPIO_FUN_QDEC] +// config gpio18 function +#define CONFIG_GPIO18_FUNC GPIO_FUN_UNUSED + +// GPIO19 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_CAM//GPIO_FUN_ANALOG//GPIO_FUN_UART0_RTS//GPIO_FUN_UART1_RTS//GPIO_FUN_ETHER_MAC//GPIO_FUN_QDEC] +// config gpio19 function +#define CONFIG_GPIO19_FUNC GPIO_FUN_UNUSED + +// GPIO20 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_CAM//GPIO_FUN_ANALOG//GPIO_FUN_UART0_RTS//GPIO_FUN_UART1_RTS//GPIO_FUN_ETHER_MAC//GPIO_FUN_QDEC] +// config gpio20 function +#define CONFIG_GPIO20_FUNC GPIO_FUN_UNUSED + +// GPIO21 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_ANALOG//GPIO_FUN_UART0_RTS//GPIO_FUN_UART1_RTS//GPIO_FUN_ETHER_MAC//GPIO_FUN_QDEC] +// config gpio21 function +#define CONFIG_GPIO21_FUNC GPIO_FUN_UNUSED + +// GPIO22 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_ANALOG//GPIO_FUN_UART0_RTS//GPIO_FUN_UART1_RTS//GPIO_FUN_ETHER_MAC//GPIO_FUN_QDEC] +// config gpio22 function +#define CONFIG_GPIO22_FUNC GPIO_FUN_UNUSED + +// GPIO23 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_CAM//GPIO_FUN_ANALOG//GPIO_FUN_UART0_RTS//GPIO_FUN_UART1_RTS//GPIO_FUN_QDEC] +// config gpio23 function +#define CONFIG_GPIO23_FUNC GPIO_FUN_UNUSED + +// GPIO24 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_CAM//GPIO_FUN_UART0_RTS//GPIO_FUN_UART1_RTS//GPIO_FUN_ETHER_MAC//GPIO_FUN_QDEC] +// config gpio24 function +#define CONFIG_GPIO24_FUNC GPIO_FUN_UNUSED + +// GPIO25 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_CAM//GPIO_FUN_UART0_RTS//GPIO_FUN_UART1_RTS//GPIO_FUN_ETHER_MAC//GPIO_FUN_QDEC] +// config gpio25 function +#define CONFIG_GPIO25_FUNC GPIO_FUN_UNUSED + +// GPIO26 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_CAM//GPIO_FUN_UART0_RTS//GPIO_FUN_UART1_RTS//GPIO_FUN_ETHER_MAC//GPIO_FUN_QDEC] +// config gpio26 function +#define CONFIG_GPIO26_FUNC GPIO_FUN_UNUSED + +// GPIO27 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_UART0_RTS//GPIO_FUN_UART1_RTS//GPIO_FUN_ETHER_MAC//GPIO_FUN_QDEC] +// config gpio27 function +#define CONFIG_GPIO27_FUNC GPIO_FUN_UNUSED + +// GPIO28 <2> [GPIO_FUN_UNUSED//GPIO_FUN_I2S//GPIO_FUN_SPI//GPIO_FUN_I2C//GPIO_FUN_PWM//GPIO_FUN_CAM//GPIO_FUN_UART0_RTS//GPIO_FUN_UART1_RTS//GPIO_FUN_ETHER_MAC//GPIO_FUN_QDEC] +// config gpio28 function +#define CONFIG_GPIO28_FUNC GPIO_FUN_UNUSED + +#endif diff --git a/source/Core/BSP/Magic/preRTOS.cpp b/source/Core/BSP/Magic/preRTOS.cpp index 4a013b80..4b38e4d5 100644 --- a/source/Core/BSP/Magic/preRTOS.cpp +++ b/source/Core/BSP/Magic/preRTOS.cpp @@ -12,10 +12,10 @@ #include void preRToSInit() { // Normal system bringup -- GPIO etc - + // #TODO hardware_init(); - gpio_bit_reset(OLED_RESET_GPIO_Port, OLED_RESET_Pin); + // gpio_bit_reset(OLED_RESET_GPIO_Port, OLED_RESET_Pin); delay_ms(5); - gpio_bit_set(OLED_RESET_GPIO_Port, OLED_RESET_Pin); + // gpio_bit_set(OLED_RESET_GPIO_Port, OLED_RESET_Pin); FRToSI2C::FRToSInit(); } diff --git a/source/Core/Src/FreeRTOSHooks.c b/source/Core/Src/FreeRTOSHooks.c index d795f04b..a4fec381 100644 --- a/source/Core/Src/FreeRTOSHooks.c +++ b/source/Core/Src/FreeRTOSHooks.c @@ -20,7 +20,7 @@ void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, StackTyp /* place for user code */ } -void vApplicationStackOverflowHook(TaskHandle_t *pxTask, signed portCHAR *pcTaskName) { +void vApplicationStackOverflowHook(TaskHandle_t *pxTask, signed char *pcTaskName) { (void)pxTask; (void)pcTaskName; diff --git a/source/Makefile b/source/Makefile index 7169ca2d..b2c05edf 100644 --- a/source/Makefile +++ b/source/Makefile @@ -3,9 +3,10 @@ model:=TS100 endif ALL_MINIWARE_MODELS=TS100 TS80 TS80P -ALL_PINE_MODELS=Pinecil +PINECIL_MODELS=Pinecil +ALL_MAGIC_MODELS=Magic ALL_MHP30_MODELS=MHP30 -ALL_MODELS=$(ALL_MINIWARE_MODELS) $(ALL_PINE_MODELS) $(ALL_MHP30_MODELS) +ALL_MODELS=$(ALL_MINIWARE_MODELS) $(PINECIL_MODELS) $(ALL_MHP30_MODELS) $(ALL_MAGIC_MODELS) ifneq ($(model),$(filter $(model),$(ALL_MODELS))) $(error Invalid model '$(model)', valid options are: $(ALL_MODELS)) endif @@ -70,6 +71,57 @@ PINE_VENDOR_USB_INC_DIR = ./Core/BSP/Pine64/Vendor/SoC/gd32vf103/Common/Include/ PINE_NMSIS_INC_DIR = ./Core/BSP/Pine64/Vendor/NMSIS/Core/Include PINE_FREERTOS_PORT_INC_DIR = ./Core/BSP/Pine64/Vendor/OS/FreeRTOS/Source/portable/GCC +MAGIC_DIR = ./Core/BSP/Magic +MAGIC_SDK_DIR = $(MAGIC_DIR)/bl_mcu_sdk +MAGIC_VENDOR_BSP_COMMON_DIR = $(MAGIC_SDK_DIR)/bsp/bsp_common + +MAGIC_VENDOR_EXAMPLES_DIR = $(MAGIC_SDK_DIR)/examples +MAGIC_COMMON_DIR = $(MAGIC_SDK_DIR)/common +MAGIC_COMMON_BL_MATH_DIR = $(MAGIC_COMMON_DIR)/bl_math +MAGIC_COMMON_DEVICE_DIR = $(MAGIC_COMMON_DIR)/device +MAGIC_COMMON_LIST_DIR = $(MAGIC_COMMON_DIR)/list +MAGIC_COMMON_MEMHEAP_DIR = $(MAGIC_COMMON_DIR)/memheap +MAGIC_COMMON_MISC_DIR = $(MAGIC_COMMON_DIR)/misc +MAGIC_COMMON_PARTITION_DIR = $(MAGIC_COMMON_DIR)/partition +MAGIC_COMMON_PID_DIR = $(MAGIC_COMMON_DIR)/pid +MAGIC_COMMON_RING_BUFFERDIR = $(MAGIC_COMMON_DIR)/ring_buffer +MAGIC_COMMON_SOFT_CRC_DIR = $(MAGIC_COMMON_DIR)/soft_crc +MAGIC_COMMON_TIMESTAMP_DIR = $(MAGIC_COMMON_DIR)/timestamp +MAGIC_COMPONENTS_DIR = $(MAGIC_SDK_DIR)/components +MAGIC_COMPONENTS_BLE_DIR = $(MAGIC_COMPONENTS_DIR)/ble +MAGIC_COMPONENTS_FATFS_DIR = $(MAGIC_COMPONENTS_DIR)/fatfs + +MAGIC_COMPONENTS_FREERTOS_DIR = $(MAGIC_COMPONENTS_DIR)/freertos +MAGIC_COMPONENTS_FREERTOS_BL602_DIR = $(MAGIC_COMPONENTS_FREERTOS_DIR)/portable/gcc/risc-v/bl602 +MAGIC_COMPONENTS_FREERTOS_INC_DIR = $(MAGIC_COMPONENTS_FREERTOS_DIR)/include + + +MAGIC_COMPONENTS_LVGL_DIR = $(MAGIC_COMPONENTS_DIR)/lvgl +MAGIC_COMPONENTS_LWIP_DIR = $(MAGIC_COMPONENTS_DIR)/lwip +MAGIC_COMPONENTS_MAC154_DIR = $(MAGIC_COMPONENTS_DIR)/mac154 +MAGIC_COMPONENTS_MBEDTLS_DIR = $(MAGIC_COMPONENTS_DIR)/mbedtls +MAGIC_COMPONENTS_NMSIS_DIR = $(MAGIC_COMPONENTS_DIR)/nmsis +MAGIC_COMPONENTS_PIKASCRIPT_DIR = $(MAGIC_COMPONENTS_DIR)/pikascript +MAGIC_COMPONENTS_ROMFS_DIR = $(MAGIC_COMPONENTS_DIR)/romfs +# Excluded +MAGIC_COMPONENTS_RT_THREAD_DIR = $(MAGIC_COMPONENTS_DIR)/rt-thread + +MAGIC_COMPONENTS_SHELL_DIR = $(MAGIC_COMPONENTS_DIR)/shell +MAGIC_COMPONENTS_TFLITE_DIR = $(MAGIC_COMPONENTS_DIR)/tflite +MAGIC_COMPONENTS_TINY_JPEG_DIR = $(MAGIC_COMPONENTS_DIR)/tiny_jpeg +MAGIC_COMPONENTS_USB_STACK_DIR = $(MAGIC_COMPONENTS_DIR)/usb_stack +MAGIC_COMPONENTS_XZ_DIR = $(MAGIC_COMPONENTS_DIR)/xz +MAGIC_DRIVERS_DIR = $(MAGIC_SDK_DIR)/drivers/bl602_driver +MAGIC_DRIVERS_HAL_DRV_INC_DIR = $(MAGIC_DRIVERS_DIR)/hal_drv/inc +MAGIC_DRIVERS_HAL_DRV_DEF_DIR = $(MAGIC_DRIVERS_DIR)/hal_drv/default_config +MAGIC_DRIVERS_REGS_DIR = $(MAGIC_DRIVERS_DIR)/regs +MAGIC_DRIVERS_RISCV_DIR = $(MAGIC_DRIVERS_DIR)/risc-v +MAGIC_DRIVERS_STARTUP_DIR = $(MAGIC_DRIVERS_DIR)/startup +MAGIC_DRIVERS_STD_DRV_DIR = $(MAGIC_DRIVERS_DIR)/std_drv/inc + + + + SOURCE_MIDDLEWARES_DIR = ./Middlewares FRTOS_CMIS_INC_DIR = ./Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS FRTOS_INC_DIR = ./Middlewares/Third_Party/FreeRTOS/Source/include @@ -84,86 +136,155 @@ SOURCE_DRIVERS_DIR = ./Core/Drivers INC_PD_DRIVERS_DIR = ./Core/Drivers/usb-pd/include PD_DRIVER_TESTS_DIR = ./Core/Drivers/usb-pd/tests PD_DRIVER_DIR = ./Core/Drivers/usb-pd -# Find-all's used for formatting -ALL_INCLUDES = $(shell find ./Core -type d \( -path $(BRIEFLZ_INC_DIR) -o -path $(PD_DRIVER_DIR) \) -prune -false -o \( -type f \( -name '*.h' -o -name '*.hpp' \) \) ) -ALL_SOURCE = $(shell find ./Core -type d \( -path $(SOURCE_BRIEFLZ_DIR) -o -path $(PD_DRIVER_DIR) \) -prune -false -o \( -type f \( -name '*.c' -o -name '*.cpp' \) \) ) + +# Find-all's used for formatting; have to exclude external modules + +ALL_INCLUDES = $(shell find ./Core -type d \( -path $(BRIEFLZ_INC_DIR) -o -path $(PD_DRIVER_DIR) -o -path $(MAGIC_SDK_DIR) \) -prune -false -o \( -type f \( -name '*.h' -o -name '*.hpp' \) \) ) +ALL_SOURCE = $(shell find ./Core -type d \( -path $(SOURCE_BRIEFLZ_DIR) -o -path $(PD_DRIVER_DIR) -o -path $(MAGIC_SDK_DIR) \) -prune -false -o \( -type f \( -name '*.c' -o -name '*.cpp' \) \) ) # Device dependent settings ifeq ($(model),$(filter $(model),$(ALL_MINIWARE_MODELS))) -$(info Building for Miniware ) -DEVICE_INCLUDES = -I$(MINIWARE_INC_DIR) \ - -I$(MINIWARE_INC_CMSIS_DEVICE)\ - -I$(MINIWARE_CMSIS_CORE_INC_DIR) \ - -I$(MINIWARE_HAL_INC_DIR) \ - -I$(MINIWARE_HAL_LEGACY_INC_DIR) -DEVICE_BSP_DIR = ./Core/BSP/Miniware -S_SRCS := $(shell find $(MINIWARE_STARTUP_DIR) -type f -name '*.S') -LDSCRIPT=$(MINIWARE_LD_FILE) -DEV_GLOBAL_DEFS= -D STM32F103T8Ux -D STM32F1 -D STM32 -D USE_HAL_DRIVER -D STM32F103xB -D USE_RTOS_SYSTICK -D GCC_ARMCM3 \ - -D ARM_MATH_CM3 \ - -D STM32F10X_MD -DEV_LDFLAGS= -DEV_AFLAGS= -DEV_CFLAGS= -DEV_CXXFLAGS= -CPUFLAGS= -mcpu=cortex-m3 \ - -mthumb \ - -mfloat-abi=soft -flash_size=64k -bootldr_size=0x4000 -DEVICE_DFU_ADDRESS=0x08004000 -DEVICE_DFU_VID_PID=0x1209:0xDB42 + $(info Building for Miniware ) + DEVICE_INCLUDES = -I$(MINIWARE_INC_DIR) \ + -I$(MINIWARE_INC_CMSIS_DEVICE)\ + -I$(MINIWARE_CMSIS_CORE_INC_DIR) \ + -I$(MINIWARE_HAL_INC_DIR) \ + -I$(MINIWARE_HAL_LEGACY_INC_DIR) + DEVICE_BSP_DIR = ./Core/BSP/Miniware + S_SRCS := $(shell find $(MINIWARE_STARTUP_DIR) -type f -name '*.S') + LDSCRIPT=$(MINIWARE_LD_FILE) + DEV_GLOBAL_DEFS= -D STM32F103T8Ux -D STM32F1 -D STM32 -D USE_HAL_DRIVER -D STM32F103xB -D USE_RTOS_SYSTICK -D GCC_ARMCM3 \ + -D ARM_MATH_CM3 \ + -D STM32F10X_MD + DEV_LDFLAGS= + DEV_AFLAGS= + DEV_CFLAGS= + DEV_CXXFLAGS= + CPUFLAGS= -mcpu=cortex-m3 \ + -mthumb \ + -mfloat-abi=soft + flash_size=64k + bootldr_size=0x4000 + DEVICE_DFU_ADDRESS=0x08004000 + DEVICE_DFU_VID_PID=0x1209:0xDB42 endif ifeq ($(model),$(filter $(model),$(ALL_MHP30_MODELS))) -$(info Building for MHP30 ) -DEVICE_INCLUDES = -I$(MHP30_INC_DIR) \ - -I$(MHP30_INC_CMSIS_DEVICE)\ - -I$(MHP30_CMSIS_CORE_INC_DIR) \ - -I$(MHP30_HAL_INC_DIR) \ - -I$(MHP30_HAL_LEGACY_INC_DIR) -DEVICE_BSP_DIR = ./Core/BSP/MHP30 -S_SRCS := $(shell find $(MHP30_STARTUP_DIR) -type f -name '*.S') -LDSCRIPT=$(MHP30_LD_FILE) -DEV_GLOBAL_DEFS= -D STM32F103T8Ux -D STM32F1 -D STM32 -D USE_HAL_DRIVER -D STM32F103xB -D USE_RTOS_SYSTICK -D GCC_ARMCM3 \ - -D ARM_MATH_CM3 \ - -D STM32F10X_MD -DEV_LDFLAGS= -DEV_AFLAGS= -DEV_CFLAGS= -DEV_CXXFLAGS= -CPUFLAGS= -mcpu=cortex-m3 \ - -mthumb \ - -mfloat-abi=soft -flash_size=128k -bootldr_size=32k -DEVICE_DFU_ADDRESS=0x08008000 -DEVICE_DFU_VID_PID=0x1209:0xDB42 + $(info Building for MHP30 ) + DEVICE_INCLUDES = -I$(MHP30_INC_DIR) \ + -I$(MHP30_INC_CMSIS_DEVICE)\ + -I$(MHP30_CMSIS_CORE_INC_DIR) \ + -I$(MHP30_HAL_INC_DIR) \ + -I$(MHP30_HAL_LEGACY_INC_DIR) + DEVICE_BSP_DIR = ./Core/BSP/MHP30 + S_SRCS := $(shell find $(MHP30_STARTUP_DIR) -type f -name '*.S') + LDSCRIPT=$(MHP30_LD_FILE) + DEV_GLOBAL_DEFS= -D STM32F103T8Ux -D STM32F1 -D STM32 -D USE_HAL_DRIVER -D STM32F103xB -D USE_RTOS_SYSTICK -D GCC_ARMCM3 \ + -D ARM_MATH_CM3 \ + -D STM32F10X_MD + DEV_LDFLAGS= + DEV_AFLAGS= + DEV_CFLAGS= + DEV_CXXFLAGS= + CPUFLAGS= -mcpu=cortex-m3 \ + -mthumb \ + -mfloat-abi=soft + flash_size=128k + bootldr_size=32k + DEVICE_DFU_ADDRESS=0x08008000 + DEVICE_DFU_VID_PID=0x1209:0xDB42 endif -ifeq ($(model),$(ALL_PINE_MODELS)) -$(info Building for Pine64 ) -DEVICE_INCLUDES = -I$(PINE_INC_DIR) \ --I$(PINE_VENDOR_INC_DIR) \ --I$(PINE_VENDOR_USB_INC_DIR) \ --I$(PINE_NMSIS_INC_DIR) \ --I$(PINE_FREERTOS_PORT_INC_DIR) - -DEVICE_BSP_DIR = ./Core/BSP/Pine64 -S_SRCS := $(shell find $(PINE_INC_DIR) -type f -name '*.S') $(info $(S_SRCS) ) -ASM_INC = -I$(PINE_RISCV_INC_DIR) -LDSCRIPT=./Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/pinecil/Source/GCC/gcc_gd32vf103_flashxip.ld -flash_size=128k -bootldr_size=0x0 +ifeq ($(model),$(PINECIL_MODELS)) + $(info Building for Pine64 ) + DEVICE_INCLUDES = -I$(PINE_INC_DIR) \ + -I$(PINE_VENDOR_INC_DIR) \ + -I$(PINE_VENDOR_USB_INC_DIR) \ + -I$(PINE_NMSIS_INC_DIR) \ + -I$(PINE_FREERTOS_PORT_INC_DIR) + + DEVICE_BSP_DIR = ./Core/BSP/Pine64 + S_SRCS := $(shell find $(PINE_INC_DIR) -type f -name '*.S') $(info $(S_SRCS) ) + ASM_INC = -I$(PINE_RISCV_INC_DIR) + LDSCRIPT=./Core/BSP/Pine64/Vendor/SoC/gd32vf103/Board/pinecil/Source/GCC/gcc_gd32vf103_flashxip.ld + flash_size=128k + bootldr_size=0x0 + # Flags + CPUFLAGS= -march=rv32imac \ + -mabi=ilp32 \ + -mcmodel=medany -fsigned-char -fno-builtin -nostartfiles + DEV_LDFLAGS=-nostartfiles --specs=patch.specs + DEV_AFLAGS= + DEV_GLOBAL_DEFS= -DRTOS_FREERTOS -DDOWNLOAD_MODE=DOWNLOAD_MODE_FLASHXIP + DEV_CFLAGS= + DEV_CXXFLAGS= +endif + + + + +ifeq ($(model),$(ALL_MAGIC_MODELS)) +$(info Building for Magic ~~~~~ ^^__^^ ) + + + +DEVICE_INCLUDES = -I$(MAGIC_DIR) \ + -I$(MAGIC_SDK_DIR) \ + -I$(MAGIC_VENDOR_BSP_COMMON_DIR) \ + -I$(MAGIC_VENDOR_EXAMPLES_DIR) \ + -I$(MAGIC_COMMON_DIR) \ + -I$(MAGIC_COMMON_BL_MATH_DIR) \ + -I$(MAGIC_COMMON_DEVICE_DIR) \ + -I$(MAGIC_COMMON_LIST_DIR) \ + -I$(MAGIC_COMMON_MEMHEAP_DIR) \ + -I$(MAGIC_COMMON_MISC_DIR) \ + -I$(MAGIC_COMMON_PARTITION_DIR) \ + -I$(MAGIC_COMMON_PID_DIR) \ + -I$(MAGIC_COMMON_RING_BUFFERDIR) \ + -I$(MAGIC_COMMON_SOFT_CRC_DIR) \ + -I$(MAGIC_COMMON_TIMESTAMP_DIR) \ + -I$(MAGIC_COMPONENTS_DIR) \ + -I$(MAGIC_COMPONENTS_BLE_DIR) \ + -I$(MAGIC_COMPONENTS_FATFS_DIR) \ + -I$(MAGIC_COMPONENTS_FREERTOS_DIR) \ + -I$(MAGIC_COMPONENTS_FREERTOS_BL602_DIR) \ + -I$(MAGIC_COMPONENTS_FREERTOS_INC_DIR) \ + -I$(MAGIC_COMPONENTS_LVGL_DIR) \ + -I$(MAGIC_COMPONENTS_LWIP_DIR) \ + -I$(MAGIC_COMPONENTS_MAC154_DIR) \ + -I$(MAGIC_COMPONENTS_MBEDTLS_DIR) \ + -I$(MAGIC_COMPONENTS_NMSIS_DIR) \ + -I$(MAGIC_COMPONENTS_PIKASCRIPT_DIR) \ + -I$(MAGIC_COMPONENTS_ROMFS_DIR) \ + -I$(MAGIC_COMPONENTS_SHELL_DIR) \ + -I$(MAGIC_COMPONENTS_TFLITE_DIR) \ + -I$(MAGIC_COMPONENTS_TINY_JPEG_DIR) \ + -I$(MAGIC_COMPONENTS_USB_STACK_DIR) \ + -I$(MAGIC_COMPONENTS_XZ_DIR) \ + -I$(MAGIC_DRIVERS_DIR) \ + -I$(MAGIC_DRIVERS_HAL_DRV_INC_DIR) \ + -I$(MAGIC_DRIVERS_HAL_DRV_DEF_DIR) \ + -I$(MAGIC_DRIVERS_REGS_DIR) \ + -I$(MAGIC_DRIVERS_RISCV_DIR) \ + -I$(MAGIC_DRIVERS_STARTUP_DIR) \ + -I$(MAGIC_DRIVERS_STD_DRV_DIR) + + +DEVICE_BSP_DIR = ./Core/BSP/Magic +S_SRCS := $(shell find $(MAGIC_DIR) -type d \( -path $(MAGIC_VENDOR_EXAMPLES_DIR) -o -path $(MAGIC_COMPONENTS_RT_THREAD_DIR) -o -path $(MAGIC_VENDOR_BSP_COMMON_DIR) \) -prune -false -o -type f -name '*.S') $(info $(S_SRCS) ) +ASM_INC = $(DEVICE_INCLUDES) +LDSCRIPT=./Core/BSP/Magic/bl_mcu_sdk/drivers/bl602_driver/bl602_flash.ld + # Flags -CPUFLAGS= -march=rv32imac \ - -mabi=ilp32 \ - -mcmodel=medany -fsigned-char -fno-builtin -nostartfiles +CPUFLAGS= -march=rv32imafc \ + -mabi=ilp32f \ + -mcmodel=medany -fsigned-char -fno-builtin -nostartfiles \ + -DportasmHANDLE_INTERRUPT=FreeRTOS_Interrupt_Handler DEV_LDFLAGS=-nostartfiles --specs=patch.specs DEV_AFLAGS= -DEV_GLOBAL_DEFS= -DRTOS_FREERTOS -DDOWNLOAD_MODE=DOWNLOAD_MODE_FLASHXIP +DEV_GLOBAL_DEFS= DEV_CFLAGS= DEV_CXXFLAGS= endif @@ -181,14 +302,14 @@ INCLUDES = -I$(APP_INC_DIR) \ SOURCE := $(shell find $(SOURCE_THREADS_DIR) -type f -name '*.c') \ $(shell find $(SOURCE_CORE_DIR) -type f -name '*.c') \ $(shell find $(SOURCE_DRIVERS_DIR) -type f -name '*.c') \ -$(shell find $(DEVICE_BSP_DIR) -type f -name '*.c') \ +$(shell find $(DEVICE_BSP_DIR) -type d \( -path $(MAGIC_VENDOR_EXAMPLES_DIR) -o -path $(MAGIC_COMPONENTS_RT_THREAD_DIR) -o -path $(MAGIC_VENDOR_BSP_COMMON_DIR) \) -prune -false -o -type f -name '*.c')\ $(shell find $(SOURCE_MIDDLEWARES_DIR) -type f -name '*.c') \ $(SOURCE_BRIEFLZ_DIR)/depack.c # We exclude the USB-PD stack tests $(PD_DRIVER_TESTS_DIR) SOURCE_CPP := $(shell find $(SOURCE_THREADS_DIR) -type f -name '*.cpp') \ $(shell find $(SOURCE_CORE_DIR) -type f -name '*.cpp') \ $(shell find $(SOURCE_DRIVERS_DIR) -path $(PD_DRIVER_TESTS_DIR) -prune -false -o -type f -name '*.cpp') \ -$(shell find $(DEVICE_BSP_DIR) -type f -name '*.cpp') \ +$(shell find $(DEVICE_BSP_DIR) -type d \( -path $(MAGIC_VENDOR_EXAMPLES_DIR) -o -path $(MAGIC_COMPONENTS_RT_THREAD_DIR) -o -path $(MAGIC_VENDOR_BSP_COMMON_DIR) \) -prune -false -o -type f -name '*.cpp') \ $(shell find $(SOURCE_MIDDLEWARES_DIR) -type f -name '*.cpp') # code optimisation ------------------------------------------------------------ @@ -215,7 +336,7 @@ COMPILER=gcc ifeq ($(model),$(filter $(model),$(ALL_MINIWARE_MODELS) $(ALL_MHP30_MODELS))) COMPILER_PREFIX=arm-none-eabi endif -ifeq ($(model),$(ALL_PINE_MODELS)) +ifeq ($(model),$(filter $(model),$(PINECIL_MODELS) $(ALL_MAGIC_MODELS))) COMPILER_PREFIX=riscv-none-elf endif # programs --------------------------------------------------------------------- @@ -396,6 +517,7 @@ $(HEXFILE_DIR)/$(model)_font_compressed_%.elf : \ $(OUT_OBJS): $(OUTPUT_DIR)/%.o : %.c Makefile @test -d $(@D) || mkdir -p $(@D) @echo Compiling ${<} + @echo $(CFLAGS) @$(CC) -c $(CFLAGS) $< -o $@ $(OUTPUT_DIR)/%.o : %.cpp Makefile