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