zynq_7010/fpgacontrol.cpp

130 lines
3.7 KiB
C++

#include "fpgacontrol.h"
#include "libmtd.h"
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdint.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include "scanservices_utils.h"
#include <thread>
#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;
}
}