调整寄存器读写

This commit is contained in:
modehua 2023-07-17 18:32:46 -07:00
parent cd5d017147
commit 70354ab6cc
3 changed files with 330 additions and 306 deletions

View File

@ -10,10 +10,10 @@
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <string.h>
#include "../cameraConfig.h"
#include "../CameraParams.h"
//#include "../cameraConfig.h"
//#include "../CameraParams.h"
#include <linux/v4l2-subdev.h>
#include "camconfig.h"
//#include "camconfig.h"
#include <iostream>
#include <errno.h>
@ -78,9 +78,9 @@ HCamDevice::HCamDevice()
subDeviceName = "/dev/v4l-subdev0";
subDevicefd = 0;
videofd = 0;
v4lWidth = CamProperty::_V4LWIDTH;
v4lHeight = CamProperty::_V4LHEIGHT;
v4lBufferCount = CamProperty::_V4LBUFFERCOUNT;
v4lWidth = 3100;
v4lHeight = 3100;
v4lBufferCount = 3;
v4l2buftype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
nplanes = 1; // only use one plane
drivertype = V4L2_CAP_VIDEO_CAPTURE_MPLANE;
@ -100,8 +100,9 @@ HCamDevice::HCamDevice()
this->event_thread.reset(new std::thread(&HCamDevice::HtCamEventWorkThread, this));
}
int HCamDevice::open_video()
int HCamDevice::open_video(int width,int height)
{
int fd = 0;
if ((fd = open(videoDevName.c_str(), O_RDWR, 0)) == -1)
{
camera_dbg("open video fial\n");
@ -109,7 +110,8 @@ int HCamDevice::open_video()
}
videofd = fd;
camera_dbg("open video succeed\n");
set_size(width,height);
return 0;
}
int HCamDevice::close_video()
@ -169,79 +171,79 @@ int HCamDevice::HtCamEventWorkThread(void)
return 0;
}
void HCamDevice::HtCamStartVideoCapturing()
{
uint8_t n_buffers;
struct v4l2_buffer buf;
if (((CAM_INFO_REG *)&pPsReg[CAM_INFO])->cam_run_status)
{
printf("Run the scan multiple times %d\n", ((CAM_INFO_REG *)&pPsReg[CAM_INFO])->cam_run_status);
return ;
}
for (n_buffers = 0; n_buffers < v4lBufferCount; n_buffers++)
{
memset(&buf, 0, sizeof(buf));
if (drivertype == V4L2_CAP_VIDEO_CAPTURE_MPLANE)
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
else
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
buf.index = n_buffers;
if (drivertype == V4L2_CAP_VIDEO_CAPTURE_MPLANE)
{
buf.length = nplanes;
buf.m.planes = (struct v4l2_plane *)calloc(buf.length, sizeof(struct v4l2_plane));
}
// void HCamDevice::HtCamStartVideoCapturing()
// {
// uint8_t n_buffers;
// struct v4l2_buffer buf;
// if (((CAM_INFO_REG *)&pPsReg[CAM_INFO])->cam_run_status)
// {
// printf("Run the scan multiple times %d\n", ((CAM_INFO_REG *)&pPsReg[CAM_INFO])->cam_run_status);
// return ;
// }
// for (n_buffers = 0; n_buffers < v4lBufferCount; n_buffers++)
// {
// memset(&buf, 0, sizeof(buf));
// if (drivertype == V4L2_CAP_VIDEO_CAPTURE_MPLANE)
// buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
// else
// buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
// buf.memory = V4L2_MEMORY_MMAP;
// buf.index = n_buffers;
// if (drivertype == V4L2_CAP_VIDEO_CAPTURE_MPLANE)
// {
// buf.length = nplanes;
// buf.m.planes = (struct v4l2_plane *)calloc(buf.length, sizeof(struct v4l2_plane));
// }
if (ioctl(videofd, VIDIOC_QBUF, &buf) == -1)
{
((CAM_INFO_REG *)&pPsReg[CAM_INFO])->cam_run_status = 0;
camera_err(" VIDIOC_QBUF error\n");
// if (ioctl(videofd, VIDIOC_QBUF, &buf) == -1)
// {
// ((CAM_INFO_REG *)&pPsReg[CAM_INFO])->cam_run_status = 0;
// camera_err(" VIDIOC_QBUF error\n");
if (drivertype == V4L2_CAP_VIDEO_CAPTURE_MPLANE)
free(buf.m.planes);
free(captureBufers);
close(videofd);
return;
}
if (drivertype == V4L2_CAP_VIDEO_CAPTURE_MPLANE)
free(buf.m.planes);
}
// if (drivertype == V4L2_CAP_VIDEO_CAPTURE_MPLANE)
// free(buf.m.planes);
// free(captureBufers);
// close(videofd);
// return;
// }
// if (drivertype == V4L2_CAP_VIDEO_CAPTURE_MPLANE)
// free(buf.m.planes);
// }
enum v4l2_buf_type type;
if (drivertype == V4L2_CAP_VIDEO_CAPTURE_MPLANE)
type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
else
type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (ioctl(videofd, VIDIOC_STREAMON, &type) == -1)
{
((CAM_INFO_REG *)&pPsReg[CAM_INFO])->cam_run_status = 0;
camera_err(" VIDIOC_STREAMON error! %s\n", strerror(errno));
return;
}
else
{
((CAM_INFO_REG *)&pPsReg[CAM_INFO])->cam_run_status = 1;
camera_print(" stream on succeed\n");
}
return;
}
// enum v4l2_buf_type type;
// if (drivertype == V4L2_CAP_VIDEO_CAPTURE_MPLANE)
// type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
// else
// type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
// if (ioctl(videofd, VIDIOC_STREAMON, &type) == -1)
// {
// ((CAM_INFO_REG *)&pPsReg[CAM_INFO])->cam_run_status = 0;
// camera_err(" VIDIOC_STREAMON error! %s\n", strerror(errno));
// return;
// }
// else
// {
// ((CAM_INFO_REG *)&pPsReg[CAM_INFO])->cam_run_status = 1;
// camera_print(" stream on succeed\n");
// }
// return;
// }
void HCamDevice::HtCamStopVideoCapturing()
{
enum v4l2_buf_type type;
((CAM_INFO_REG *)&pPsReg[CAM_INFO])->cam_run_status = 0;
if (drivertype == V4L2_CAP_VIDEO_CAPTURE_MPLANE)
type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
else
type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (ioctl(videofd, VIDIOC_STREAMOFF, &type) == -1)
camera_err(" VIDIOC_STREAMOFF error! %s\n", strerror(errno));
}
// void HCamDevice::HtCamStopVideoCapturing()
// {
// enum v4l2_buf_type type;
// ((CAM_INFO_REG *)&pPsReg[CAM_INFO])->cam_run_status = 0;
// if (drivertype == V4L2_CAP_VIDEO_CAPTURE_MPLANE)
// type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
// else
// type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
// if (ioctl(videofd, VIDIOC_STREAMOFF, &type) == -1)
// camera_err(" VIDIOC_STREAMOFF error! %s\n", strerror(errno));
// }
void HCamDevice::HtCamExitVideoCapturing()
{
HtCamStopVideoCapturing();
//HtCamStopVideoCapturing();
uint8_t i;
for (i = 0; i < v4lBufferCount; ++i)
@ -381,6 +383,13 @@ int HCamDevice::HtCamStopSampling()
return 0;
}
int HCamDevice::set_size(int width, int height)
{
v4lWidth = width;
v4lHeight = height;
return 0;
}
int HCamDevice::init_fd()
{
int fd;
@ -607,15 +616,15 @@ int HCamDevice::init_dev()
HtCamSwitchSampleModes(0);
// HtCamChangeExposureValue(500);
// start sample
camera_dbg("ST SP : %d , VSNP : %d \r\n" ,CamProperty::ST_SP ,CamProperty::VSNP);
if(CamProperty::ST_SP != 0 || CamProperty::ST_SP_VSNP != 0)
HtCamChangeMonoStartSample(CamProperty::ST_SP * 3 + CamProperty::ST_SP_VSNP);
if(CamProperty::VSNP != 0)
{
unsigned int value = HtCamReadFpgaRegs(16);
value = value & 0xffffff00;
HtCamWriteFpgaRegs(16, CamProperty::VSNP | value);
}
// camera_dbg("ST SP : %d , VSNP : %d \r\n" ,CamProperty::ST_SP ,CamProperty::VSNP);
// if(CamProperty::ST_SP != 0 || CamProperty::ST_SP_VSNP != 0)
// HtCamChangeMonoStartSample(CamProperty::ST_SP * 3 + CamProperty::ST_SP_VSNP);
// if(CamProperty::VSNP != 0)
// {
// unsigned int value = HtCamReadFpgaRegs(16);
// value = value & 0xffffff00;
// HtCamWriteFpgaRegs(16, CamProperty::VSNP | value);
// }
// ex_trigger = 0, int_trigger = 1
HtCamChangeTriggerInAndEXt(1);
@ -718,18 +727,18 @@ void HCamDevice::setADCReg(int addr , uint8_t value)
void HCamDevice::saveADCReg()
{
CamADCConfig adcConfig(CamProperty::_ADCPATH);
int size = adcConfig.getSize();
size = adcRegSize < size ? adcRegSize : size ;
std::vector<int> adcValue(size) ;
for(int index =0 ; index < size ; index++)
{
adcValue[index] = pADCReg[index];
}
if(!adcConfig.saveValue(adcValue))
{
std::cout << "Save adc Value Error!" << std::endl ;
}
// CamADCConfig adcConfig(CamProperty::_ADCPATH);
// int size = adcConfig.getSize();
// size = adcRegSize < size ? adcRegSize : size ;
// std::vector<int> adcValue(size) ;
// for(int index =0 ; index < size ; index++)
// {
// adcValue[index] = pADCReg[index];
// }
// if(!adcConfig.saveValue(adcValue))
// {
// std::cout << "Save adc Value Error!" << std::endl ;
// }
}
uint32_t HCamDevice::HtCamReadFpgaRegs(uint8_t reg_addr)
@ -751,18 +760,18 @@ void HCamDevice::HtCamWriteFpgaRegs(uint8_t reg_addr, uint32_t reg_value)
// fp = fopen("/home/root/logW", "a+");
// fprintf(fp , "W reg %d , value : %d\r\n" ,reg_addr , reg_value );
// fclose(fp);
switch (reg_addr)
{
case 0x04:
reg4 = HtCamReadFpgaRegs(0x04);
if (((CamZ_Reg_4 *)&reg4)->color_mode != ((CamZ_Reg_4 *)&reg_value)->color_mode)
{
getImgFormat(((CamZ_Reg_4 *)&reg_value)->color_mode);
}
break;
default:
break;
}
// switch (reg_addr)
// {
// case 0x04:
// reg4 = HtCamReadFpgaRegs(0x04);
// if (((CamZ_Reg_4 *)&reg4)->color_mode != ((CamZ_Reg_4 *)&reg_value)->color_mode)
// {
// getImgFormat(((CamZ_Reg_4 *)&reg_value)->color_mode);
// }
// break;
// default:
// break;
// }
uint32_t *pCamCtrlReg = virBaseAddr;
pCamCtrlReg[reg_addr] = reg_value;
}
@ -807,7 +816,7 @@ void HCamDevice::HtCamSetTriggerMode(int val)
{
uint32_t *pCamCtrlReg = virBaseAddr;
if (val)
pCamCtrlReg[10] |= 0x00000040;
pCamCtrlReg[10] |= 0x00000040; //40是16进制 转换为二进制0100 0000 刚好就是第十个寄存器的第七位
else
pCamCtrlReg[10] &= ~(0x00000040);
}
@ -824,51 +833,51 @@ int HCamDevice::HtCamGetColorMode()
return ((pCamCtrlReg[4] & (0x00000004)) >> 2);
}
PERJECT_VERSION getByName(std::string name)
{
if(name == "PYTHONZ_1200")
return PERJECT_VERSION::PythonZ1200 ;
if(name == "PYTHONZ_1800")
return PERJECT_VERSION::PythonZ1800 ;
if(name == "PYTHONZ_WSS")
return PERJECT_VERSION::PythonZWSS;
if(name == "PYTHONZ_1206" )
return PERJECT_VERSION::PythonZ1206;
if(name == "PYTHONZ_1602" )
return PERJECT_VERSION::PythonZ1602;
return PERJECT_VERSION::PythonZ1200; //return a default var
}
// PERJECT_VERSION getByName(std::string name)
// {
// if(name == "PYTHONZ_1200")
// return PERJECT_VERSION::PythonZ1200 ;
// if(name == "PYTHONZ_1800")
// return PERJECT_VERSION::PythonZ1800 ;
// if(name == "PYTHONZ_WSS")
// return PERJECT_VERSION::PythonZWSS;
// if(name == "PYTHONZ_1206" )
// return PERJECT_VERSION::PythonZ1206;
// if(name == "PYTHONZ_1602" )
// return PERJECT_VERSION::PythonZ1602;
// return PERJECT_VERSION::PythonZ1200; //return a default var
// }
void HCamDevice::init_ps_regs()
{
CamPSConfig psConfig(CONFIG_PATH);
memset(pPsReg, 0, sizeof(pPsReg));
pPsReg[PS_VERSION] = VERSION;
pPsReg[BUF_WIDTH] = v4lWidth;
pPsReg[BUF_HEIGHT] = CamProperty::_V4LHEIGHT;
pPsReg[IMG_WIDTH] = CamProperty::_IMG_BUF_WIDTH;
std::cout << "v4lBufferCount " << v4lBufferCount << std::endl;
pPsReg[BUF_NUM] = v4lBufferCount;
pPsReg[CAM_STATUS] = psConfig.getReg(CAM_STATUS);
CAM_INFO_REG *camInfo = (CAM_INFO_REG *)&pPsReg[CAM_INFO];
camInfo->CIS_Width = pPsReg[IMG_WIDTH] / CamProperty::_CIS_NUM;
camInfo->CIS_count = CamProperty::_CIS_NUM;
camInfo->ProjectVersion = getByName(CamProperty::_CAM_TYPE);
camInfo->vidio_status = 0;
pPsReg[RLS_CHECK_CODE] = Alpha;
pPsReg[DATA_STATUS] = 0;
//CamPSConfig psConfig(CONFIG_PATH);
// memset(pPsReg, 0, sizeof(pPsReg));
// //pPsReg[PS_VERSION] = 100000;
// pPsReg[BUF_WIDTH] = v4lWidth;
// pPsReg[BUF_HEIGHT] = CamProperty::_V4LHEIGHT;
// pPsReg[IMG_WIDTH] = CamProperty::_IMG_BUF_WIDTH;
// std::cout << "v4lBufferCount " << v4lBufferCount << std::endl;
// pPsReg[BUF_NUM] = v4lBufferCount;
// pPsReg[CAM_STATUS] = psConfig.getReg(CAM_STATUS);
// CAM_INFO_REG *camInfo = (CAM_INFO_REG *)&pPsReg[CAM_INFO];
// camInfo->CIS_Width = pPsReg[IMG_WIDTH] / CamProperty::_CIS_NUM;
// camInfo->CIS_count = CamProperty::_CIS_NUM;
// camInfo->ProjectVersion = getByName(CamProperty::_CAM_TYPE);
// camInfo->vidio_status = 0;
// pPsReg[RLS_CHECK_CODE] = Alpha;
// pPsReg[DATA_STATUS] = 0;
// pPsReg[HEARTBAT] = 0x80000001;
// CamPSConfig psConfig(CONFIG_PATH);
// pPsReg[PS_VERSION] = psConfig.getReg(PS_VERSION);
// pPsReg[CAM_STATUS] = psConfig.getReg(CAM_STATUS);
std::cout << "pPsReg[BUF_NUM] " << pPsReg[BUF_NUM] << std::endl;
std::cout << "CAM_STATUS " << pPsReg[CAM_STATUS] << std::endl;
// std::cout << "pPsReg[BUF_NUM] " << pPsReg[BUF_NUM] << std::endl;
// std::cout << "CAM_STATUS " << pPsReg[CAM_STATUS] << std::endl;
// pPsReg[MOTOR_SPEED] = psConfig.getReg(MOTOR_SPEED);
// pPsReg[CAM_DPI] = psConfig.getReg(CAM_DPI);
// pPsReg[RLS_CHECK_CODE] = psConfig.getReg(RLS_CHECK_CODE);
pPsReg[HEARTBAT] = psConfig.getReg(HEARTBAT);
//pPsReg[HEARTBAT] = psConfig.getReg(HEARTBAT);
}
uint32_t HCamDevice::HtCamReadPsRegs(uint8_t reg_addr)
@ -882,25 +891,25 @@ void HCamDevice::HtCamWritePsRegs(uint8_t reg_addr, uint32_t reg_value)
{
printf("reg addr %d\r\n" ,reg_addr );
std::cout << "Write Camera PS reg addr " << reg_addr << "value " << reg_value << std::endl;
if (reg_addr >= PSReg::REG_NUM)
if (reg_addr >= REG_NUM)
return;
pPsReg[reg_addr] = reg_value;
switch (reg_addr)
{
case BUF_WIDTH:
case BUF_HEIGHT:
case BUF_NUM:
HtCamResizeBuffer(pPsReg[BUF_WIDTH], pPsReg[BUF_HEIGHT], pPsReg[BUF_NUM]);
break;
case CAM_DPI:
HtCamPsDpiChange(reg_value);
break;
case CAM_STATUS:
{
HtCamImageProcessChange();
if (getImgProcSize)
getImgProcSize(reg_value);
}
// case BUF_WIDTH:
// case BUF_HEIGHT:
// case BUF_NUM:
// HtCamResizeBuffer(pPsReg[BUF_WIDTH], pPsReg[BUF_HEIGHT], pPsReg[BUF_NUM]);
// break;
// case CAM_DPI:
// HtCamPsDpiChange(reg_value);
// break;
// case CAM_STATUS:
// {
// // HtCamImageProcessChange();
// // if (getImgProcSize)
// // getImgProcSize(reg_value);
// }
break;
default:
break;
@ -909,14 +918,14 @@ void HCamDevice::HtCamWritePsRegs(uint8_t reg_addr, uint32_t reg_value)
void HCamDevice::savePsReg()
{
CamPSConfig psConfig(CONFIG_PATH);
psConfig.setReg(PS_VERSION , pPsReg[PS_VERSION] );
psConfig.setReg(CAM_STATUS , pPsReg[CAM_STATUS] );
psConfig.setReg(MOTOR_SPEED , pPsReg[MOTOR_SPEED]);
psConfig.setReg(CAM_DPI , pPsReg[CAM_DPI] );
psConfig.setReg(HEARTBAT , pPsReg[HEARTBAT] );
psConfig.setReg(RLS_CHECK_CODE, pPsReg[RLS_CHECK_CODE]);
psConfig.save();
// CamPSConfig psConfig(CONFIG_PATH);
// psConfig.setReg(PS_VERSION , pPsReg[PS_VERSION] );
// psConfig.setReg(CAM_STATUS , pPsReg[CAM_STATUS] );
// psConfig.setReg(MOTOR_SPEED , pPsReg[MOTOR_SPEED]);
// psConfig.setReg(CAM_DPI , pPsReg[CAM_DPI] );
// psConfig.setReg(HEARTBAT , pPsReg[HEARTBAT] );
// psConfig.setReg(RLS_CHECK_CODE, pPsReg[RLS_CHECK_CODE]);
// psConfig.save();
}
void HCamDevice::HtCamWriteAllADC()
@ -943,14 +952,14 @@ void HCamDevice::HtCamInitADCReg()
#endif
#ifdef ADC_82V48
CamADCConfig adcConfig(CamProperty::_ADCPATH);
int size = adcConfig.getSize();
std::cout << " read ADC size : " << size << std::endl ;
if (size > 0)
//CamADCConfig adcConfig(CamProperty::_ADCPATH);
//int size = adcConfig.getSize();
//std::cout << " read ADC size : " << size << std::endl ;
//if (size > 0)
{
for (int index = 0; index < size; index++)
//for (int index = 0; index < size; index++)
{
pADCReg[index] = adcConfig.getReg(index);
//pADCReg[index] = adcConfig.getReg(index);
}
return;
}
@ -958,76 +967,76 @@ void HCamDevice::HtCamInitADCReg()
pADCReg[0] = 0x07;
pADCReg[1] = 0x50;
/* 1200 cis */
if (CamProperty::_CAM_TYPE == "PYTHONZ_1200")
{
/* gain */
pADCReg[2] = 0x90;
pADCReg[3] = 0x00;
pADCReg[4] = 0x90;
pADCReg[5] = 0x00;
pADCReg[6] = 0x90;
pADCReg[7] = 0x00;
pADCReg[8] = 0x90;
pADCReg[9] = 0x00;
pADCReg[0xa] = 0x90;
pADCReg[0xb] = 0x00;
pADCReg[0xc] = 0x90;
pADCReg[0xd] = 0x00;
/* offset */
pADCReg[0xe] = 0x58;
pADCReg[0xf] = 0x5b;
pADCReg[0x10] = 0x55;
pADCReg[0x11] = 0x55;
pADCReg[0x12] = 0x50;
pADCReg[0x13] = 0x55;
}
else
{
/* offset */
if (CamProperty::_CAM_TYPE == "PYTHONZ_WSS")
{
pADCReg[2] = 0x55;
pADCReg[3] = 0x00;
pADCReg[4] = 0x4a;
pADCReg[5] = 0x00;
pADCReg[6] = 0x50;
pADCReg[7] = 0x00;
pADCReg[8] = 0x4e;
pADCReg[9] = 0x00;
pADCReg[0xa] = 0x40;
pADCReg[0xb] = 0x00;
pADCReg[0xc] = 0x50;
pADCReg[0xd] = 0x00;
pADCReg[0xe] = 0x65;
pADCReg[0xf] = 0x65;
pADCReg[0x10] = 0x65;
pADCReg[0x11] = 0x65;
pADCReg[0x12] = 0x65;
pADCReg[0x13] = 0x65;
}
else
{
pADCReg[2] = 0xA0;
pADCReg[3] = 0x00;
pADCReg[4] = 0xA0;
pADCReg[5] = 0x00;
pADCReg[6] = 0xA0;
pADCReg[7] = 0x00;
pADCReg[8] = 0xA0;
pADCReg[9] = 0x00;
pADCReg[0xa] = 0xA0;
pADCReg[0xb] = 0x00;
pADCReg[0xc] = 0xA0;
pADCReg[0xd] = 0x00;
pADCReg[0xe] = 0x20;
pADCReg[0xf] = 0x20;
pADCReg[0x10] = 0x20;
pADCReg[0x11] = 0x20;
pADCReg[0x12] = 0x20;
pADCReg[0x13] = 0x20;
}
}
// /* 1200 cis */
// if (CamProperty::_CAM_TYPE == "PYTHONZ_1200")
// {
// /* gain */
// pADCReg[2] = 0x90;
// pADCReg[3] = 0x00;
// pADCReg[4] = 0x90;
// pADCReg[5] = 0x00;
// pADCReg[6] = 0x90;
// pADCReg[7] = 0x00;
// pADCReg[8] = 0x90;
// pADCReg[9] = 0x00;
// pADCReg[0xa] = 0x90;
// pADCReg[0xb] = 0x00;
// pADCReg[0xc] = 0x90;
// pADCReg[0xd] = 0x00;
// /* offset */
// pADCReg[0xe] = 0x58;
// pADCReg[0xf] = 0x5b;
// pADCReg[0x10] = 0x55;
// pADCReg[0x11] = 0x55;
// pADCReg[0x12] = 0x50;
// pADCReg[0x13] = 0x55;
// }
// else
// {
// /* offset */
// if (CamProperty::_CAM_TYPE == "PYTHONZ_WSS")
// {
// pADCReg[2] = 0x55;
// pADCReg[3] = 0x00;
// pADCReg[4] = 0x4a;
// pADCReg[5] = 0x00;
// pADCReg[6] = 0x50;
// pADCReg[7] = 0x00;
// pADCReg[8] = 0x4e;
// pADCReg[9] = 0x00;
// pADCReg[0xa] = 0x40;
// pADCReg[0xb] = 0x00;
// pADCReg[0xc] = 0x50;
// pADCReg[0xd] = 0x00;
// pADCReg[0xe] = 0x65;
// pADCReg[0xf] = 0x65;
// pADCReg[0x10] = 0x65;
// pADCReg[0x11] = 0x65;
// pADCReg[0x12] = 0x65;
// pADCReg[0x13] = 0x65;
// }
// else
// {
// pADCReg[2] = 0xA0;
// pADCReg[3] = 0x00;
// pADCReg[4] = 0xA0;
// pADCReg[5] = 0x00;
// pADCReg[6] = 0xA0;
// pADCReg[7] = 0x00;
// pADCReg[8] = 0xA0;
// pADCReg[9] = 0x00;
// pADCReg[0xa] = 0xA0;
// pADCReg[0xb] = 0x00;
// pADCReg[0xc] = 0xA0;
// pADCReg[0xd] = 0x00;
// pADCReg[0xe] = 0x20;
// pADCReg[0xf] = 0x20;
// pADCReg[0x10] = 0x20;
// pADCReg[0x11] = 0x20;
// pADCReg[0x12] = 0x20;
// pADCReg[0x13] = 0x20;
// }
// }
#endif
}
@ -1066,69 +1075,69 @@ void HCamDevice::set_reload_correct_event(ReLoadCorrecEvent _reLoadCorrectEvent)
this->reLoadCorrectEvent = _reLoadCorrectEvent;
}
void HCamDevice::HtCamImageProcessChange()
{
CAM_STATUS_REG* status = (CAM_STATUS_REG*)&pPsReg[CAM_STATUS];
if(status->doImageProcess)
{
HtCamPsDpiChange(pPsReg[CAM_DPI]);
}else
{
pPsReg[IMG_WIDTH] = pPsReg[BUF_WIDTH];
}
}
// void HCamDevice::HtCamImageProcessChange()
// {
// CAM_STATUS_REG* status = (CAM_STATUS_REG*)&pPsReg[CAM_STATUS];
// if(status->doImageProcess)
// {
// HtCamPsDpiChange(pPsReg[CAM_DPI]);
// }else
// {
// pPsReg[IMG_WIDTH] = pPsReg[BUF_WIDTH];
// }
// }
// DPI切换-暂只适配1200/1800
bool HCamDevice::HtCamPsDpiChange(int dpi)
{
std::cout << "DPI Change for " << dpi <<std::endl;
for (auto i = CamProperty::_DPI_WIDTH.begin(); i != CamProperty::_DPI_WIDTH.end(); i++)
{
if (dpi == i->first)
{
CamProperty::_N_DPI = dpi;
CamProperty::_IMG_BUF_WIDTH = i->second;
// bool HCamDevice::HtCamPsDpiChange(int dpi)
// {
// std::cout << "DPI Change for " << dpi <<std::endl;
// for (auto i = CamProperty::_DPI_WIDTH.begin(); i != CamProperty::_DPI_WIDTH.end(); i++)
// {
// if (dpi == i->first)
// {
// CamProperty::_N_DPI = dpi;
// CamProperty::_IMG_BUF_WIDTH = i->second;
pPsReg[BUF_WIDTH] = CamProperty::_DPI_V4LWIDTH[dpi];
// pPsReg[BUF_WIDTH] = CamProperty::_DPI_V4LWIDTH[dpi];
if (dpi > 300)
{
HtCamChangeDpi(0);
pPsReg[BUF_HEIGHT] = CamProperty::_V4LHEIGHT/2;
}
else
{
HtCamChangeDpi(1);
pPsReg[BUF_HEIGHT] = CamProperty::_V4LHEIGHT;
}
std::cout << "image process " << ((CAM_STATUS_REG*)&pPsReg[CAM_STATUS])->doImageProcess << std::endl ;
if(((CAM_STATUS_REG*)&pPsReg[CAM_STATUS])->doImageProcess)
pPsReg[IMG_WIDTH] = CamProperty::_IMG_BUF_WIDTH ;
else
pPsReg[IMG_WIDTH] = pPsReg[BUF_WIDTH];
((CAM_INFO_REG *)&pPsReg[CAM_INFO])->CIS_Width = pPsReg[IMG_WIDTH] / ((CAM_INFO_REG *)&pPsReg[CAM_INFO])->CIS_count;
// 更改数据缓存区大小
// if (dpi > 300)
// {
// HtCamChangeDpi(0);
// pPsReg[BUF_HEIGHT] = CamProperty::_V4LHEIGHT/2;
// }
// else
// {
// HtCamChangeDpi(1);
// pPsReg[BUF_HEIGHT] = CamProperty::_V4LHEIGHT;
// }
// std::cout << "image process " << ((CAM_STATUS_REG*)&pPsReg[CAM_STATUS])->doImageProcess << std::endl ;
// if(((CAM_STATUS_REG*)&pPsReg[CAM_STATUS])->doImageProcess)
// pPsReg[IMG_WIDTH] = CamProperty::_IMG_BUF_WIDTH ;
// else
// pPsReg[IMG_WIDTH] = pPsReg[BUF_WIDTH];
// ((CAM_INFO_REG *)&pPsReg[CAM_INFO])->CIS_Width = pPsReg[IMG_WIDTH] / ((CAM_INFO_REG *)&pPsReg[CAM_INFO])->CIS_count;
// // 更改数据缓存区大小
std::cout << "LL " << v4lWidth << pPsReg[BUF_WIDTH] << v4lHeight << pPsReg[BUF_HEIGHT] << v4lBufferCount << pPsReg[BUF_NUM] << std::endl ;
if(v4lWidth != pPsReg[BUF_WIDTH] || v4lHeight != pPsReg[BUF_HEIGHT] || v4lBufferCount != pPsReg[BUF_NUM])
{
HtCamResizeBuffer(pPsReg[BUF_WIDTH], pPsReg[BUF_HEIGHT] , pPsReg[BUF_NUM]);
camera_print(" fmt.fmt.pix.width = %d\n", v4lWidth);
camera_print(" fmt.fmt.pix.height = %d\n", v4lHeight);
camera_print(" fmt.fmt.pix.field = %d\n", pPsReg[BUF_NUM]);
if(reLoadCorrectEvent)
reLoadCorrectEvent(CamProperty::_IMG_BUF_WIDTH);
}
if(config != nullptr)
config->saveConfig();
// Camconfig h_config;
// h_config.saveConfig();
return true;
}
}
return false;
}
// std::cout << "LL " << v4lWidth << pPsReg[BUF_WIDTH] << v4lHeight << pPsReg[BUF_HEIGHT] << v4lBufferCount << pPsReg[BUF_NUM] << std::endl ;
// if(v4lWidth != pPsReg[BUF_WIDTH] || v4lHeight != pPsReg[BUF_HEIGHT] || v4lBufferCount != pPsReg[BUF_NUM])
// {
// HtCamResizeBuffer(pPsReg[BUF_WIDTH], pPsReg[BUF_HEIGHT] , pPsReg[BUF_NUM]);
// camera_print(" fmt.fmt.pix.width = %d\n", v4lWidth);
// camera_print(" fmt.fmt.pix.height = %d\n", v4lHeight);
// camera_print(" fmt.fmt.pix.field = %d\n", pPsReg[BUF_NUM]);
// if(reLoadCorrectEvent)
// reLoadCorrectEvent(CamProperty::_IMG_BUF_WIDTH);
// }
// if(config != nullptr)
// config->saveConfig();
// // Camconfig h_config;
// // h_config.saveConfig();
// return true;
// }
// }
// return false;
// }
void HCamDevice::HtCamOverClockClear()
{

View File

@ -40,6 +40,20 @@ union CamZ_Reg_4
}params;
};
union CAM_INFO_REG
{
int value = 0;
struct
{
unsigned int ProjectVersion : 6; //所属项目版本
unsigned int cam_run_status : 1; //相机扫描状态
unsigned int vidio_status : 1; // v4l状态
unsigned int CIS_count : 8; // CIS计数
unsigned int CIS_Width : 16;
/* data */
};
};
#define adcRegSize 20
#define REG_NUM 14
typedef std::function<void(uint32_t)> GetImgProcSize;
@ -56,11 +70,11 @@ public:
~HCamDevice();
int open_video();
int open_video(int width, int height);
int close_video();
void HtCamStartVideoCapturing();
void HtCamStopVideoCapturing();
// void HtCamStartVideoCapturing();
//void HtCamStopVideoCapturing();
int HtCamWaitVideoCapture(int msTimeout);
int HtCamReadCaptureFrame(void **pbuf, int timeout);
int width() { return v4lWidth; }
@ -97,6 +111,7 @@ public:
// void setConfig(Camconfig* _config){config = _config;}
void HtCamChangeMonoStartSample(int start_sample);
private:
int set_size(int width, int height);
int init_fd();
int init_sample();
int init_capture();
@ -112,9 +127,9 @@ private:
int HtCamStartSampling();
int HtCamStopSampling();
void HtCamChangeDpi(int dpi);
bool HtCamPsDpiChange(int dpi);
//bool HtCamPsDpiChange(int dpi);
void HtCamImageProcessChange();
//void HtCamImageProcessChange();
int HtCamEventWorkThread(void);

View File

@ -82,7 +82,7 @@ void MultiFrameCapture::SetParent(void *scanner)
{
}
void MultiFrameCapture::open_video()
void MultiFrameCapture::open()
{
//reset_fpga();
m_capFpageregs->resetADC();
@ -1098,14 +1098,14 @@ void MultiFrameCapture::openDevice(int dpi, int mode)
//m_capFpageregs->setFrame_interval_max(static_cast<int>(sp_dst * 4 / (mode ? 1 : 3))); //dpi > 2 ? 7200 : 3600
//m_capFpageregs->setFrame_interval_min(static_cast<int>(sp_dst * 0.1 / (mode ? 1 : 3) )); //1540
.
// 2023 7-15 屏蔽
// m_capFpageregs->setFrame_interval_max(0x1010); //dpi > 2 ? 7200 : 3600
// m_capFpageregs->setFrame_interval_min(0xa98); //dpi > 2 ? 900 : 1540
configFPGAParam(mode, dpi);
StopWatch swwv4l2open;
//int ret = video->open_video(width, 60 * 2); // 300dpi 7344/2 600dpi 7344 //FRAME_HEIGHT * 2
int ret = video->open_video(); // 300dpi 7344/2 600dpi 7344 //FRAME_HEIGHT * 2
int ret = video->open_video(width, 60 * 2); // 300dpi 7344/2 600dpi 7344 //FRAME_HEIGHT * 2
//int ret = video->open_video(); // 300dpi 7344/2 600dpi 7344 //FRAME_HEIGHT * 2
if (ret < 0)
{
return ;