167 lines
3.6 KiB
C
Executable File
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;
|
|
}
|
|
|
|
|