/* * eyetrack_fpga.c * * Issues commands to the attached FGPA * * Created: 12/19/2024 11:43:42 AM * Copyright (c) 2022 Bigscreen, Inc. */ #include #include #include #include "i2c.h" #include "eyetrack_fpga.h" uint8_t len_to_send_i2c; uint8_t data_to_send_i2c[FPGA_I2C_MAX_LEN]; void fpga_init() { ioport_set_pin_level(PIN_FPGA_RESET, false); ioport_set_pin_dir(PIN_FPGA_RESET, IOPORT_DIR_OUTPUT); ioport_set_pin_mode(PIN_FPGA_RESET, 0); ioport_set_pin_level(PIN_FPGA_RECONFIG, true); ioport_set_pin_dir(PIN_FPGA_RECONFIG, IOPORT_DIR_OUTPUT); ioport_set_pin_mode(PIN_FPGA_RECONFIG, 0); } void fpga_reset() { // toggle the reset pin ioport_set_pin_level(PIN_FPGA_RESET, true); vTaskDelay(500); ioport_set_pin_level(PIN_FPGA_RESET, false); } void fpga_reconfig() { // toggle the reconfig_n pin ioport_set_pin_level(PIN_FPGA_RECONFIG, false); vTaskDelay(500); ioport_set_pin_level(PIN_FPGA_RECONFIG, true); } uint8_t set_fpga_command_data(uint8_t len, uint8_t* data) { if(len > FPGA_I2C_MAX_LEN) return pdFAIL; len_to_send_i2c = len; if(NULL != data) { memcpy(data_to_send_i2c, data, len); } return pdPASS; } uint8_t* get_fpga_read_data() { return data_to_send_i2c; } uint8_t get_fpga_read_len() { return len_to_send_i2c; } uint8_t fpga_send_i2c() { if(len_to_send_i2c == 0) return pdFAIL; I2C_Transaction_Request i2ctxn; i2ctxn.cb = NULL; i2ctxn.dev_addr = FPGA_I2C_ADDR; i2ctxn.shift = I2C_Unshifted; i2ctxn.ttype = I2C_SIMPLE_WRITE; i2ctxn.len = len_to_send_i2c; i2ctxn.data = data_to_send_i2c; i2ctxn.internal_addr = 0; // unused i2c_lock(MCU_I2C()); uint8_t i2c_retval = pdFAIL; i2c_retval = i2c_transact_blocking(MCU_I2C(), &i2ctxn, DEFAULT_I2C_WAIT_TIME); i2c_unlock(MCU_I2C()); return i2c_retval; } uint8_t fpga_read_i2c() { if(len_to_send_i2c == 0) return pdFAIL; I2C_Transaction_Request i2ctxn; i2ctxn.cb = NULL; i2ctxn.dev_addr = FPGA_I2C_ADDR; i2ctxn.shift = I2C_Unshifted; i2ctxn.ttype = I2C_INT_ADDR_READ; i2ctxn.len = len_to_send_i2c; i2ctxn.data = data_to_send_i2c; i2ctxn.internal_addr = data_to_send_i2c[0]; i2c_lock(MCU_I2C()); uint8_t i2c_retval = pdFAIL; i2c_retval = i2c_transact_blocking(MCU_I2C(), &i2ctxn, DEFAULT_I2C_WAIT_TIME); i2c_unlock(MCU_I2C()); return i2c_retval; }