zynq_7010/FpgaComm.cpp

633 lines
17 KiB
C++
Raw Normal View History

2023-07-17 03:29:37 +00:00
//
// Created by Nick on 2019/4/7.
//
#include <iostream>
#include "FpgaComm.h"
#include <thread>
#define LOG_TAG "FpgaComm"
#define LOGD(...) ((void)printf(__VA_ARGS__))
int FpgaComm::read(int addr)
{
unsigned char *pdata = bufRecv;
pdata[0] = 0x03;
pdata[1] = (unsigned char)addr;
m_serial.Write(bufRecv, 2);
if (m_serial.Read(bufRecv, 5, 300))
{
int ret = 0;
unsigned char *pdata = (unsigned char *)(&ret);
for (int i = 0; i < 4; i++)
{
pdata[i] = bufRecv[4 - i];
}
return ret;
}
return -1;
}
void FpgaComm::write(int addr, int data)
{
unsigned char *pdata = bufSend;
pdata[0] = 0x83;
pdata[1] = (unsigned char)addr;
unsigned char *idata = (unsigned char *)&data;
for (int i = 0; i < 4; i++)
{
pdata[6 - i] = idata[i];
}
m_serial.Write(bufSend, sizeof(bufSend));
}
void FpgaComm::updateRegs(int addr)
{
write(addr, fpgaParams.regs[addr]);
}
void FpgaComm::setFrameHeight(int height)
{
fpgaParams.params.frame.height = height;
write(0x00, fpgaParams.regs[0x00]);
}
int FpgaComm::getFrameHeight()
{
// fpgaParams.params.frame.height = height;
int reg0v = read(0x00);
FrameFpga *frameinfo = (FrameFpga *)&reg0v;
return frameinfo->height;
}
int FpgaComm::getAutoFrameHeight()
{
unsigned int val;
unsigned int reg8 = 0;
reg8 = read(0x08);
val = read(14);
int regv = val;
val &= 0x0000ffff;
write(0x8, reg8 & 0xfffffff7);
std::this_thread::sleep_for(std::chrono::milliseconds(5));
// val = read(14);
// regv = val;
// val &= 0x0000ffff;
// reg8 = read(0x8);
// LOG("TWO height = %d reg[14] = %d \n", val, regv);
std::this_thread::sleep_for(std::chrono::milliseconds(5));
write(0x8, reg8 | 0x8);
return val;
}
void FpgaComm::setFrameNum(int num)
{
fpgaParams.params.frame.num = num;
write(0x00, fpgaParams.regs[0x00]);
}
void FpgaComm::enableLed(bool bEnable)
{
fpgaParams.params.AledR.user_define.led_sample.ledEnable = bEnable;
write(0x05, fpgaParams.regs[0x05]);
#ifdef HAS_UV
fpgaParams.params.BledR.user_define.led_sample.ledEnable = bEnable;
write(0x08, fpgaParams.regs[0x08]);
#else
fpgaParams.params.BledR.user_define.led_sample.ledEnable = 0;
write(0x08, fpgaParams.regs[0x08]);
#endif
}
void FpgaComm::enableUV(bool enable)
{
#ifdef HAS_UV
isUVEnable = enable;
fpgaParams.params.BledR.user_define.led_sample.ledEnable = isUVEnable;
write(0x08, fpgaParams.regs[0x08]);
#endif
}
void FpgaComm::capture()
{ // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʲô<CAB2>أ<EFBFBD>
fpgaParams.params.cmd.cmd = 0;
write(0x02, fpgaParams.regs[0x02]);
fpgaParams.params.cmd.cmd = 1;
write(0x02, fpgaParams.regs[0x02]);
}
int FpgaComm::getRegs(int addr)
{
return fpgaParams.regs[addr];
}
void FpgaComm::setRegs(int addr, int value)
{
fpgaParams.regs[addr] = value;
write(addr, value);
}
FpgaComm::FpgaComm() : fanGpio(FAN_PORT) // <20><>ʼ<EFBFBD><CABC>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ȡ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
{
m_serial.Open(com.c_str(), bauds);
// for(int i = 0; i < MAX_REGS; i++){
// fpgaParams.regs[i] = read(i);
// LOG("reg[%d] = 0x%08x \n", i, fpgaParams.regs[i]);
// }
fpgaParams.params.AledR.user_define.led_sample.sample = 256;
updateRegs(0x05);
enableLed(true);
}
void FpgaComm::updateRegs()
{
for (int i = 0x05; i < MAX_REGS; i++)
{
updateRegs(i);
}
fpgaParams.params.AledR.user_define.led_sample.sample = 256;
updateRegs(0x05);
}
void FpgaComm::setAGain(int indexGain, int value)
{
AdGain adGain;
adGain.value = value;
indexGain++;
fpgaParams.params.Aad.bits.ad0_addr = indexGain * 2;
fpgaParams.params.Aad.bits.ad1_addr = fpgaParams.params.Aad.bits.ad0_addr + 1;
fpgaParams.params.Aad.bits.ad0_value = adGain.gain_value.gain_low8;
fpgaParams.params.Aad.bits.ad1_value = adGain.gain_value.gain_hight;
fpgaParams.params.Aad.bits.ad0_rw = 0;
fpgaParams.params.Aad.bits.ad1_rw = 0;
updateRegs(0x04);
fpgaParams.params.mode.adcA = 1;
updateRegs(0x01);
fpgaParams.params.mode.adcA = 0;
updateRegs(0x01);
}
void FpgaComm::getAGain(int indexGain, int &Avalue, int &Bvalue)
{
AdGain adGain;
CisAdGain adgain;
// adGain.value = value;
indexGain++;
fpgaParams.params.Aad.bits.ad0_addr = indexGain * 2;
fpgaParams.params.Aad.bits.ad1_addr = fpgaParams.params.Aad.bits.ad0_addr + 1;
fpgaParams.params.Aad.bits.ad0_value = 0;
fpgaParams.params.Aad.bits.ad1_value = 0;
fpgaParams.params.Aad.bits.ad0_rw = 0;
fpgaParams.params.Aad.bits.ad1_rw = 0;
updateRegs(0x04);
fpgaParams.params.mode.adcA = 1;
updateRegs(0x01);
fpgaParams.params.mode.adcA = 0;
updateRegs(0x01);
auto ret = read(0x03);
adgain.value = ret;
Avalue = adgain.bits.ad0_value;
Bvalue = adgain.bits.ad1_value;
}
void FpgaComm::setBGain(int indexGain, int value)
{
AdGain adGain;
adGain.value = value;
indexGain++;
fpgaParams.params.Bad.bits.ad0_addr = indexGain * 2;
fpgaParams.params.Bad.bits.ad1_addr = indexGain * 2 + 1;
fpgaParams.params.Bad.bits.ad0_value = adGain.gain_value.gain_low8;
fpgaParams.params.Bad.bits.ad1_value = adGain.gain_value.gain_hight;
fpgaParams.params.Bad.bits.ad0_rw = 0;
fpgaParams.params.Bad.bits.ad1_rw = 0;
updateRegs(0x07);
fpgaParams.params.mode.adcB = 1;
updateRegs(0x01);
fpgaParams.params.mode.adcB = 0;
updateRegs(0x01);
}
void FpgaComm::getBGain(int indexGain, int &Avalue, int &Bvalue)
{
AdGain adGain;
CisAdGain adgain;
// adGain.value = value;
indexGain++;
fpgaParams.params.Bad.bits.ad0_addr = indexGain * 2;
fpgaParams.params.Bad.bits.ad1_addr = indexGain * 2 + 1;
fpgaParams.params.Bad.bits.ad0_value = adGain.gain_value.gain_low8;
fpgaParams.params.Bad.bits.ad1_value = adGain.gain_value.gain_hight;
fpgaParams.params.Bad.bits.ad0_rw = 1;
fpgaParams.params.Bad.bits.ad1_rw = 1;
updateRegs(0x07);
fpgaParams.params.mode.adcB = 1;
updateRegs(0x01);
fpgaParams.params.mode.adcB = 0;
updateRegs(0x01);
auto ret = read(0x03);
adgain.value = ret;
Avalue = adgain.bits.ad0_value;
Bvalue = adgain.bits.ad1_value;
}
void FpgaComm::setAOffset(int indexOffset, int value)
{
fpgaParams.params.Aad.bits.ad0_rw = 0;
fpgaParams.params.Aad.bits.ad1_rw = 0;
fpgaParams.params.Aad.bits.ad0_addr = indexOffset + 0x0e;
fpgaParams.params.Aad.bits.ad1_addr = 0x14;
fpgaParams.params.Aad.bits.ad1_value = 0x50;
fpgaParams.params.Aad.bits.ad0_value = value;
updateRegs(0x04);
fpgaParams.params.mode.adcA = 1;
updateRegs(0x01);
fpgaParams.params.mode.adcA = 0;
updateRegs(0x01);
}
void FpgaComm::getAOffset(int indexGain, int &Avalue, int &Bvalue)
{
fpgaParams.params.Aad.bits.ad0_rw = 1;
fpgaParams.params.Aad.bits.ad1_rw = 1;
fpgaParams.params.Aad.bits.ad0_addr = indexGain + 0x0e;
fpgaParams.params.Aad.bits.ad1_addr = 0x14;
fpgaParams.params.Aad.bits.ad1_value = 0x50;
fpgaParams.params.Aad.bits.ad0_value = 0;
updateRegs(0x04);
fpgaParams.params.mode.adcA = 1;
updateRegs(0x01);
fpgaParams.params.mode.adcA = 0;
updateRegs(0x01);
CisAdGain adgain;
auto ret = read(0x03);
adgain.value = ret;
Avalue = adgain.bits.ad0_value;
Bvalue = adgain.bits.ad1_value;
}
void FpgaComm::setBOffset(int indexOffset, int value)
{
fpgaParams.params.Bad.bits.ad0_rw = 0;
fpgaParams.params.Bad.bits.ad1_rw = 0;
fpgaParams.params.Bad.bits.ad0_addr = indexOffset + 0x0e;
fpgaParams.params.Bad.bits.ad1_addr = 0x14;
fpgaParams.params.Aad.bits.ad1_value = 0x50;
fpgaParams.params.Bad.bits.ad0_value = value;
updateRegs(0x07);
fpgaParams.params.mode.adcB = 1;
updateRegs(0x01);
fpgaParams.params.mode.adcB = 0;
updateRegs(0x01);
}
void FpgaComm::getBOffset(int indexGain, int &Avalue, int &Bvalue)
{
fpgaParams.params.Bad.bits.ad0_rw = 1;
fpgaParams.params.Bad.bits.ad1_rw = 1;
fpgaParams.params.Bad.bits.ad0_addr = indexGain + 0x0e;
fpgaParams.params.Bad.bits.ad1_addr = 0x14;
fpgaParams.params.Aad.bits.ad1_value = 0x50;
fpgaParams.params.Bad.bits.ad0_value = 0;
updateRegs(0x07);
fpgaParams.params.mode.adcB = 1;
updateRegs(0x01);
fpgaParams.params.mode.adcB = 0;
updateRegs(0x01);
CisAdGain adgain;
auto ret = read(0x03);
adgain.value = ret;
Avalue = adgain.bits.ad0_value;
Bvalue = adgain.bits.ad1_value;
}
void FpgaComm::setAExposureR(int value)
{
fpgaParams.params.AledR.ledR = value;
updateRegs(0x05);
fpgaParams.regs[0x05] = read(0x05);
}
void FpgaComm::setAExposureG(int value)
{
fpgaParams.params.AledGB.bits.ledG = value;
updateRegs(0x06);
fpgaParams.regs[0x06] = read(0x06);
}
void FpgaComm::setAExposureB(int value)
{
fpgaParams.params.AledGB.bits.ledB = value;
updateRegs(0x06);
fpgaParams.regs[0x06] = read(0x06);
}
void FpgaComm::setAExposureUV(int value)
{
#ifdef HAS_UV
fpgaParams.params.UVLed.bits.ledASide = value;
updateRegs(0x0d);
fpgaParams.regs[0x0d] = read(0x0d);
#endif
}
void FpgaComm::setBExposureR(int value)
{
fpgaParams.params.BledR.ledR = value;
updateRegs(0x08);
fpgaParams.regs[0x08] = read(0x08);
}
void FpgaComm::setBExposureG(int value)
{
fpgaParams.params.BledGB.bits.ledG = value;
updateRegs(0x09);
fpgaParams.regs[0x09] = read(0x09);
}
void FpgaComm::setBExposureB(int value)
{
fpgaParams.params.BledGB.bits.ledB = value;
updateRegs(0x09);
fpgaParams.regs[0x09] = read(0x09);
}
void FpgaComm::setBExpousreUV(int value)
{
#ifdef HAS_UV
fpgaParams.params.UVLed.bits.ledBSide = value;
updateRegs(0x0d);
fpgaParams.regs[0x0d] = read(0x0d);
#endif
}
void FpgaComm::setEnTestCol(bool en)
{
fpgaParams.params.AledR.user_define.led_sample.en_test_color = en ? 1 : 0;
updateRegs(0x05);
fpgaParams.regs[0x05] = read(0x05);
}
void FpgaComm::setEnTestBit(bool en)
{
fpgaParams.params.AledR.user_define.led_sample.en_test = en ? 1 : 0;
updateRegs(0x05);
fpgaParams.regs[0x05] = read(0x05);
}
void FpgaComm::setFanMode(int mode)
{
fanGpio.setValue(mode == 3 ? Gpio::Low : Gpio::High);
}
void FpgaComm::setSp(int value)
{
setRegs(0x01, value);
}
int FpgaComm::getSp()
{
return fpgaParams.params.mode.sp;
}
void FpgaComm::setColorMode(int mode)
{
fpgaParams.params.mode.colorMode = mode;
updateRegs(0x01);
}
int FpgaComm::getColorMode()
{
return fpgaParams.params.mode.colorMode;
}
void FpgaComm::setSample(int sample)
{
fpgaParams.params.mode.sample = sample;
updateRegs(0x01);
fpgaParams.params.AledR.user_define.led_sample.sample = sample;
updateRegs(0x05);
}
void FpgaComm::EnableTest(bool bTest)
{
fpgaParams.params.mode.selftest = bTest;
updateRegs(0x01);
}
int FpgaComm::IsTest()
{
return fpgaParams.params.mode.selftest;
}
int FpgaComm::getSample()
{
return fpgaParams.params.mode.sample;
}
void FpgaComm::setDpi(int dpi)
{
fpgaParams.params.mode.dpi = dpi;
updateRegs(0x01);
}
int FpgaComm::getDpi()
{
return fpgaParams.params.mode.dpi;
}
void FpgaComm::setSample(int sampleFront, int sampleBack)
{
fpgaParams.params.mode.sample = sampleFront;
updateRegs(0x01);
fpgaParams.params.AledR.user_define.led_sample.sample = sampleBack;
updateRegs(0x05);
}
// 20190626 YHP autoTrig function
void FpgaComm::setTrigMode(bool isArmMode)
{
int tmp = read(0x0b);
if (!isArmMode)
{ // default value+ ARM MODE,bit27 =0;
fpgaParams.params.TrigMode = tmp & 0XFBFFFFFF;
}
else
{
fpgaParams.params.TrigMode = tmp | (1 << 26);
}
updateRegs(0x0b);
}
// void FpgaComm::setDelayTime(int value) {
// // fpgaParams.params.DelayTime = value;
// // updateRegs(0x0C);
// }
void FpgaComm::setFrame_interval_min(int min)
{
fpgaParams.params.FrameInterval.Frame_Interval_min = min;
fpgaParams.params.FrameInterval.reversed = 0;
updateRegs(0xc);
}
int FpgaComm::getFrame_interval_min()
{
fpgaParams.params.FrameInterval.reversed = 0;
auto value = read(0x0c);
fpgaParams.params.FrameInterval = *(CisFrameInterval *)&value;
return fpgaParams.params.FrameInterval.Frame_Interval_min;
}
void FpgaComm::setFrame_interval_max(int max)
{
fpgaParams.params.FrameInterval.Frame_Interval_max = max;
fpgaParams.params.FrameInterval.reversed = 0;
updateRegs(0xc);
}
int FpgaComm::getFrame_interval_max()
{
fpgaParams.params.FrameInterval.reversed = 0;
auto value = read(0x0c);
fpgaParams.params.FrameInterval = *(CisFrameInterval *)&value;
return fpgaParams.params.FrameInterval.Frame_Interval_max;
}
// <20><><EFBFBD>¼Ĵ<C2BC><C4B4><EFBFBD><EFBFBD><EFBFBD>Ϣ
void FpgaComm::update()
{
for (int i = 0; i < MAX_REGS; i++)
{
fpgaParams.regs[i] = read(i);
LOG("reg[%d] = 0x%08x \n", i, fpgaParams.regs[i]);
}
}
void FpgaComm::enableJamCheck(bool b)
{
// fpgaParams.params.BledR.user_define.led_sample.jamEnable = b;
// updateRegs(0x08);
}
void FpgaComm::resetADC()
{
fpgaParams.params.Aad.bits.ad0_rw = 0;
fpgaParams.params.Aad.bits.ad0_addr = 0;
fpgaParams.params.Aad.bits.ad0_value = 0;
fpgaParams.params.Aad.bits.ad1_rw = 0;
fpgaParams.params.Aad.bits.ad1_addr = 0;
fpgaParams.params.Aad.bits.ad1_value = 0;
updateRegs(0x04);
fpgaParams.params.mode.adcA = 1;
updateRegs(0x01);
fpgaParams.params.mode.adcA = 0;
updateRegs(0x01);
fpgaParams.params.Bad.bits.ad0_rw = 0;
fpgaParams.params.Bad.bits.ad0_addr = 0;
fpgaParams.params.Bad.bits.ad0_value = 0;
fpgaParams.params.Bad.bits.ad1_rw = 0;
fpgaParams.params.Bad.bits.ad1_addr = 0;
fpgaParams.params.Bad.bits.ad1_value = 0;
updateRegs(0x07);
fpgaParams.params.mode.adcB = 1;
updateRegs(0x01);
fpgaParams.params.mode.adcB = 0;
updateRegs(0x01);
std::this_thread::sleep_for(std::chrono::milliseconds(100));
fpgaParams.params.Aad.bits.ad0_rw = 0;
fpgaParams.params.Aad.bits.ad0_addr = 0;
fpgaParams.params.Aad.bits.ad0_value = 7;
fpgaParams.params.Aad.bits.ad1_rw = 0;
fpgaParams.params.Aad.bits.ad1_addr = 0;
fpgaParams.params.Aad.bits.ad1_value = 7;
updateRegs(0x04);
fpgaParams.params.mode.adcA = 1;
updateRegs(0x01);
fpgaParams.params.mode.adcA = 0;
updateRegs(0x01);
fpgaParams.params.Bad.bits.ad0_rw = 0;
fpgaParams.params.Bad.bits.ad0_addr = 0;
fpgaParams.params.Bad.bits.ad0_value = 7;
fpgaParams.params.Bad.bits.ad1_rw = 0;
fpgaParams.params.Bad.bits.ad1_addr = 0;
fpgaParams.params.Bad.bits.ad1_value = 7;
updateRegs(0x07);
fpgaParams.params.mode.adcB = 1;
updateRegs(0x01);
fpgaParams.params.mode.adcB = 0;
updateRegs(0x01);
fpgaParams.params.Aad.bits.ad0_rw = 0;
fpgaParams.params.Aad.bits.ad0_addr = 1;
fpgaParams.params.Aad.bits.ad0_value = 0x50;
fpgaParams.params.Aad.bits.ad1_rw = 0;
fpgaParams.params.Aad.bits.ad1_addr = 1;
fpgaParams.params.Aad.bits.ad1_value = 0x50;
updateRegs(0x04);
fpgaParams.params.mode.adcA = 1;
updateRegs(0x01);
fpgaParams.params.mode.adcA = 0;
updateRegs(0x01);
fpgaParams.params.Bad.bits.ad0_rw = 0;
fpgaParams.params.Bad.bits.ad0_addr = 1;
fpgaParams.params.Bad.bits.ad0_value = 0x50;
fpgaParams.params.Bad.bits.ad1_rw = 0;
fpgaParams.params.Bad.bits.ad1_addr = 1;
fpgaParams.params.Bad.bits.ad1_value = 0x50;
updateRegs(0x07);
fpgaParams.params.mode.adcB = 1;
updateRegs(0x01);
fpgaParams.params.mode.adcB = 0;
updateRegs(0x01);
}
void FpgaComm::setVsp(unsigned int Aside, unsigned int BSide)
{
// auto ret = read(13);
CISVSP vsp; // = *(CISVSP*)&ret;
vsp.bits.ASide_VSP = Aside;
vsp.bits.BSide_VSP = BSide;
vsp.bits.reserved = 0;
printf("setVsp A side =%d B side=%d vspint=%08x \n", vsp.bits.ASide_VSP, vsp.bits.BSide_VSP, vsp.value);
write(13, vsp.value);
}
unsigned int FpgaComm::getFrame_counter_val()
{
int crt_frame_count=0;
unsigned int reg8 = 0;
reg8 = read(8);
//write(8,reg8 & 0x8);
std::this_thread::sleep_for(std::chrono::milliseconds(10));
write(8, reg8 & 0xfffffff7);//off stop snap
reg8 = read(8);
std::this_thread::sleep_for(std::chrono::milliseconds(10));
crt_frame_count = read(0x10);
if(crt_frame_count <= 0)//读取失败或帧数为0的情况下多读几次
{
for(int i = 0;i<3;i++)
{
crt_frame_count = read(0x10);
printf("try %d times read frame count,frame_count = %d \n",i,crt_frame_count);
if(crt_frame_count > 0)
break;
}
}
write(8, reg8 | 0x8);// on reset counter
std::this_thread::sleep_for(std::chrono::milliseconds(2));
//printf("TWO height reg[14] = %d reg[16] = %d \n", read(14) & 0xffff,read(16));
return crt_frame_count;
}
int FpgaComm::getFrameNum(){
return fpgaParams.params.frame.num;
}
void FpgaComm::set_cis_type(bool isA3_CIS)
{
fpgaParams.params.AledR.user_define.led_sample.cis_type = isA3_CIS?1:0;
}