#include "fpgacontrol.h" #include "libmtd.h" #include #include #include #include #include #include #include #include #include #include #define MTD_NODE "/dev/mtd0" #define FPGAFILEPATH "/etc/fpgaupdatefile.bin" fpgacontrol::fpgacontrol() : m_fpgafile_fd(0), m_updateEnable(false) { //printf("fpga version : %d \n", fpgaversion); } fpgacontrol::~fpgacontrol() { } bool fpgacontrol::ifneedupdatefpga() { if ((access(FPGAFILEPATH, F_OK)) != -1) { m_updateEnable = true; printf("found %s file ,will update fpga later!\n", FPGAFILEPATH); } else { m_updateEnable = false; printf("%s file do not exist!\n", FPGAFILEPATH); } return m_updateEnable; } bool fpgacontrol::updatefpga() { if (!m_updateEnable) { printf("checked don't need to update fpga\n"); return false; } return updatefpgafirmware(FPGAFILEPATH); } bool fpgacontrol::updatefpgafirmware(std::string fpgafirmpath) { system("echo 68 > /sys/class/gpio/export"); system("echo out > /sys/class/gpio/gpio68/direction"); system("echo 0 > /sys/class/gpio/gpio68/value"); if ((m_fpgafile_fd = open(MTD_NODE, O_RDWR)) <= 0) { printf("update fpga error,on open mtd node!\n"); return false; } libmtd_t desc; desc = libmtd_open(); if (NULL == desc) { printf("libmtd_open error...\n"); return false; } mtd_dev_info dev_info; mtd_get_dev_info(desc, MTD_NODE, &dev_info); printf("mtd_num = %x\n", dev_info.mtd_num); printf("major = %x\n", dev_info.major); printf("minor = %x\n", dev_info.minor); printf("type_str = %s\n", dev_info.type_str); printf("name = %s\n", dev_info.name); printf("size = %d\n", dev_info.size); printf("eb_cnt = %d\n", dev_info.eb_cnt); printf("eb_size = %d\n", dev_info.eb_size); printf("min_io_size = %d\n", dev_info.min_io_size); printf("subpage_size = %d\n", dev_info.subpage_size); printf("oob_size = %d\n", dev_info.oob_size); printf("region_cnt = %d\n", dev_info.region_cnt); printf("writable = %d\n", dev_info.writable); printf("bb_allowed = %d\n", dev_info.bb_allowed); for (int i = 0; i < dev_info.eb_cnt; i++) { if (mtd_erase(desc, &dev_info, m_fpgafile_fd, i) != 0) { printf("mtd_erase error...........\n"); if (desc) { libmtd_close(desc); desc = NULL; } if (m_fpgafile_fd) { close(m_fpgafile_fd); m_fpgafile_fd = NULL; } //system("echo 1 > /sys/class/gpio/gpio221/value"); std::this_thread::sleep_for(std::chrono::milliseconds(100)); return false; } } int ret = mtd_write_img(&dev_info, m_fpgafile_fd, 0, 0, fpgafirmpath.c_str()); libmtd_close(desc); if (ret < 0) { printf("mtd_write_img failed...........\n"); return false; } else { printf("mtd_write_img success...........\n"); std::string rmcmd = "rm -f /etc/fpgaupdatefile.bin"; system(rmcmd.c_str()); return true; } }