Files
castelion_radar_alinx_kintex/vitis/radar/src/main.c

167 lines
3.6 KiB
C
Executable File

#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
//#include "xscugic.h"
#include "xsysmon.h"
#include "xspi.h"
#include "project.h"
#include "ethernet.h"
#include "pl_udp_eth.h"
#include "hmc7044.h"
#include "ad9081_hal_functions.h"
#include "ad9081_app_helper.h"
#include "adi_ad9081.h"
#include "adi_hmc7044.h"
#include "novatel.h"
#include "config_flash.h"
XSysMon SysMonInst;
//extern XScuGic xInterruptController;
void set_fan_pwm(int percent) {
// Set Fan PWM
// Don't try to turn on fan unless percent is above a certain value, fan has minimum turn on percent
int period = 1500000;
int pw = period * percent / 100;
Xil_Out32(0x40050010, period);
Xil_Out32(0x40050014, pw);
}
void update_fan_speed(int fpga_temp) {
int min_temp = 30;
int max_temp = 60;
int delta_temp = max_temp - min_temp;
int min_percent = 50;
int percent = 0;
int temp = fpga_temp - min_temp;
if (temp < 0) {
temp = 0;
set_fan_pwm(0);
}
else {
percent = temp * 100 / delta_temp;
if (percent < min_percent) {
percent = min_percent;
}
set_fan_pwm(percent);
}
// xil_printf("Temp - %d, Fan Percent - %d\r\n", fpga_temp, percent);
}
int setBit(uint32_t addr, uint32_t bit) {
int val = Xil_In32(addr);
val |= (1 << bit);
Xil_Out32(addr, val);
return 0;
}
int clearBit(uint32_t addr, uint32_t bit) {
int val = Xil_In32(addr);
val &= ~(1 << bit);
Xil_Out32(addr, val);
return 0;
}
int toggleBit(uint32_t addr, uint32_t bit) {
int val = Xil_In32(addr);
uint32_t current_bit = val & (1 << bit);
if (current_bit) {
val &= ~(1 << bit);
} else {
val |= (1 << bit);
}
Xil_Out32(addr, val);
return 0;
}
void error_print(int line_number, int err) {
xil_printf("Line %d, Error! %d\r\n", line_number, err);
vTaskDelay(1000);
}
void status_task( void *pvParameters ) {
XSysMon_Config *ConfigPtr;
XSysMon *SysMonInstPtr = &SysMonInst;
// Initialize the SysMon driver.
ConfigPtr = XSysMon_LookupConfig(XPAR_SYSMON_0_DEVICE_ID);
XSysMon_CfgInitialize(SysMonInstPtr, ConfigPtr,
ConfigPtr->BaseAddress);
XSysMon_SelfTest(SysMonInstPtr);
while (1) {
u16 temp_data = XSysMon_GetAdcData(SysMonInstPtr, XSM_CH_TEMP);
int fpga_temp = XSysMon_RawToTemperature(temp_data);
update_fan_speed(fpga_temp);
vTaskDelay(100);
}
}
static void pps_irq_handler(u32 context) {
xil_printf("pps irq %lu\r\n", utc_time);
Xil_Out32(TIMING_ENGINE_ADDR + 0x14, utc_time + 1);
}
void main_task( void *pvParameters ) {
// Connect PPS Interrupt
xPortInstallInterruptHandler(XPAR_MICROBLAZE_0_AXI_INTC_SYSTEM_PPS_INTR, (XInterruptHandler) pps_irq_handler, (void *)0);
vPortEnableInterrupt(XPAR_MICROBLAZE_0_AXI_INTC_SYSTEM_PPS_INTR);
setup_data_converter();
// config_flash_sector_erase(CONFIG_BASE_ADDRESS);
while (1) {
toggleBit(GPO_REG, 0); // Toggle LED
vTaskDelay(100);
}
}
int main(void) {
xil_printf("\n\r\n\r================= Start ====================\n\r\n\r");
Xil_Out32(GPO_REG, 0x11);
config_flash_init();
xTaskCreate( status_task,
( const char * ) "status",
0x1000,
NULL,
TASK_PRIORITY_STATUS,
NULL );
xTaskCreate( main_task,
( const char * ) "main",
0x20000,
NULL,
TASK_PRIORITY_MAIN,
NULL );
#ifndef IBERT_TESTING
xTaskCreate( pl_udp_task,
( const char * ) "pludp",
0x8000,
NULL,
TASK_PRIORITY_MAIN,
NULL );
#endif
// This is the thread that hosts lwip. It must be created using sys_thread_new
sys_thread_new("tcp_server_task", (void(*)(void*))tcp_server_task, 0,
1024,
TASK_PRIORITY_LWIP);
/* Start the tasks and timer running. */
vTaskStartScheduler();
return 0;
}