This commit is contained in:
modehua 2023-07-19 02:22:07 -07:00
commit c29f703fc9
4 changed files with 130 additions and 98 deletions

View File

@ -16,6 +16,9 @@
//#include "camconfig.h"
#include <iostream>
#include <errno.h>
#include <fstream>
#include "logs_out.h"
@ -112,7 +115,7 @@ HCamDevice::HCamDevice()
v4lBufferCount = 3;
v4l2buftype = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
nplanes = 1; // only use one plane
drivertype = V4L2_CAP_VIDEO_CAPTURE_MPLANE;
drivertype = V4L2_CAP_VIDEO_CAPTURE_MPLANE;//V4L2_BUF_TYPE_VIDEO_CAPTURE;//;
v4l2memtype = V4L2_MEMORY_MMAP;
captureBufers = NULL;
@ -139,8 +142,10 @@ int HCamDevice::open_video(int width,int height)
}
videofd = fd;
camera_dbg("open video succeed\n");
set_size(width,height);
return 0;
}
int HCamDevice::close_video()
@ -150,6 +155,7 @@ int HCamDevice::close_video()
return -1;
}
close(videofd);
HtCamStopSampling();
camera_dbg("close video succeed\n");
return 0;
}
@ -200,75 +206,75 @@ 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()
{
@ -294,7 +300,7 @@ void HCamDevice::HtCamExitVideoCapturing()
}
}
int HCamDevice::HtCamWaitVideoCapture(int msTimeout)
int HCamDevice::wait(int msTimeout)
{
struct pollfd pfd;
pfd.fd = videofd;
@ -306,9 +312,9 @@ int HCamDevice::HtCamWaitVideoCapture(int msTimeout)
return 0;
}
int HCamDevice::HtCamReadCaptureFrame(void **pbuf, int timeout)
int HCamDevice::read_frame(void **pbuf, int timeout)
{
if (!HtCamWaitVideoCapture(timeout))
if (!wait(timeout))
{
camera_err("read frame time out\n");
if ((lastSucceedBufferIndex + 1) >= v4lBufferCount)
@ -344,7 +350,7 @@ int HCamDevice::HtCamReadCaptureFrame(void **pbuf, int timeout)
camera_dbg("************QBUF[%d] FINISH**************", buf.index)
else
{
return -2;
//return -2;
}
lastSucceedBufferIndex = buf.index;
*pbuf = captureBufers[buf.index].start;
@ -353,7 +359,7 @@ int HCamDevice::HtCamReadCaptureFrame(void **pbuf, int timeout)
{
free(buf.m.planes);
}
return buf.index;
return buf.length;
}
void HCamDevice::HtCamChangeAdjustSpTime(uint32_t sp_time_gap, uint32_t sp_time_rw)
@ -387,6 +393,7 @@ void HCamDevice::HtCamChangeAdjustPhase(uint16_t times, uint8_t dir)
// This function is prohibited
int HCamDevice::HtCamStartSampling()
{
printf("设置开始采图寄存器\r\n");
uint32_t *CamReg;
if (virBaseAddr == NULL)
return -1;
@ -404,6 +411,7 @@ int HCamDevice::HtCamStopSampling()
uint32_t *CamReg;
if (virBaseAddr == NULL)
return -1;
printf("设置停止采图寄存器\r\n");
CamReg = (uint32_t *)virBaseAddr;
CamReg[10] |= (HT_CAM_REG_CR_STOPSAMPLE_MASK);
@ -414,8 +422,14 @@ int HCamDevice::HtCamStopSampling()
int HCamDevice::set_size(int width, int height)
{
v4lWidth = width;
v4lHeight = height;
// v4lWidth = width;
// v4lHeight = height;
v4lWidth = 15552;
v4lHeight = 128;
init_device();
HtCamStartVideoCapturing();
HtCamChangeDpi(1);
virBaseAddr[0X0D] = 0x00CE0080;
return 0;
}
@ -475,11 +489,13 @@ int HCamDevice::init_sample()
return ret;
}
int HCamDevice::init_capture()
int HCamDevice::init_device()
{
printf("打开寄存器基地址成功开始初始化设备CIS\r\n");
struct v4l2_format fmt;
struct v4l2_control ctrl;
CLEAR(fmt);
init_sample();
if (drivertype == V4L2_CAP_VIDEO_CAPTURE_MPLANE)
{
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
@ -549,6 +565,7 @@ int HCamDevice::init_capture()
{
camera_err("Fail to set control:%s.", strerror(errno));
}
init_video_buffer();
return 0;
}
@ -637,10 +654,7 @@ int HCamDevice::init_video_buffer()
int HCamDevice::init_dev()
{
init_fd();
init_sample();
init_capture();
init_video_buffer();
// TestPattern 1
HtCamSwitchSampleModes(0);
// HtCamChangeExposureValue(500);
@ -914,8 +928,7 @@ uint32_t HCamDevice::HtCamReadPsRegs(uint8_t reg_addr)
return pPsReg[reg_addr];
}
#include <iostream>
#include <fstream>
void HCamDevice::HtCamWritePsRegs(uint8_t reg_addr, uint32_t reg_value)
{
printf("reg addr %d\r\n" ,reg_addr );
@ -1078,7 +1091,7 @@ void HCamDevice::HtCamResizeBuffer(int width, int height, int number)
HtCamExitVideoCapturing();
init_fd();
init_sample();
init_capture();
init_device();
init_video_buffer();
camera_dbg("v4lWidth = %d, v4lHeight = %d, v4lBufferCount = %d\n", v4lWidth, v4lHeight, v4lBufferCount);

View File

@ -73,10 +73,10 @@ public:
int open_video(int width, int height);
int close_video();
// void HtCamStartVideoCapturing();
//void HtCamStopVideoCapturing();
int HtCamWaitVideoCapture(int msTimeout);
int HtCamReadCaptureFrame(void **pbuf, int timeout);
void HtCamStartVideoCapturing();
void HtCamStopVideoCapturing();
int wait(int msTimeout);
int read_frame(void **pbuf, int timeout);
int width() { return v4lWidth; }
int height() { return v4lHeight; }
@ -110,11 +110,14 @@ public:
// void setConfig(Camconfig* _config){config = _config;}
void HtCamChangeMonoStartSample(int start_sample);
int HtCamStartSampling();
int HtCamStopSampling();
private:
int set_size(int width, int height);
int init_fd();
int init_sample();
int init_capture();
int init_device();
int init_video_buffer();
int init_dev();
void init_ps_regs();
@ -124,8 +127,7 @@ private:
void HtCamResizeBuffer(int width, int height, int number);
void HtCamChangeAdjustSpTime(uint32_t sp_time_gap, uint32_t sp_time_rw);
void HtCamChangeAdjustPhase(uint16_t times, uint8_t dir);
int HtCamStartSampling();
int HtCamStopSampling();
void HtCamChangeDpi(int dpi);
//bool HtCamPsDpiChange(int dpi);
@ -142,7 +144,7 @@ private:
const unsigned int phyBaseAddr = 0x40010000;
const unsigned int AddrMapSize = 0x100;
unsigned int *virBaseAddr;
unsigned int *virBaseAddr; //寄存器基地址
int memfd;
std::string subDeviceName;

View File

@ -179,7 +179,7 @@ void MultiFrameCapture::open()
printf(" getFrame_counter_val %d \n", m_capFpageregs->getFrame_counter_val());
// video->read_frame(,400);
unsigned char *buf = NULL;
video->HtCamReadCaptureFrame((void **)&buf, 400);
video->read_frame((void **)&buf, 400);
// std::this_thread::sleep_for(std::chrono::milliseconds(50));
printf("abort first frame \n");
@ -203,6 +203,7 @@ void MultiFrameCapture::snap()
std::lock_guard<std::mutex> m_lock(m_mtx_snap);
b_stop_snap = b_end_snap = false;
m_capFpageregs->capture();
video->HtCamStartSampling();
snaped_index++;
m_cv_snap.notify_all();
#endif
@ -214,6 +215,7 @@ void MultiFrameCapture::stopsnap(bool autosize)
{
b_stop_snap = true;
}
video->HtCamStopSampling();
}
void MultiFrameCapture::close()
@ -339,7 +341,7 @@ void MultiFrameCapture::waitsnapdone(int state)
#ifdef TEST_SIMCAP
HG_JpegCompressInfo info;
info.DataLength = m_test_pimg_len;
info.pJpegData = m_test_pimg;
info.pJpegData = (unsigned char *)m_test_pimg;
m_glue.m_imageready(info);
#else
@ -363,7 +365,7 @@ void MultiFrameCapture::waitsnapdone(int state)
bool MultiFrameCapture::IsImageQueueEmpty()
{
printf(" m_frameinfos.Size = %d iImageremain = %d bScanning = %d\n", m_frameinfos.Size(), iImageremain.operator int(), bScanning);
//printf(" m_frameinfos.Size = %d iImageremain = %d bScanning = %d\n", m_frameinfos.Size(), iImageremain.operator int(), bScanning);
return (m_frameinfos.Size() == 0 && iImageremain == 0) && !bScanning;
}
@ -536,7 +538,7 @@ void MultiFrameCapture::snaprun()
{
// void *data = video->read_frame(500);
char *data = NULL;
video->HtCamReadCaptureFrame((void **)&data, 400);
video->read_frame((void **)&data, 400);
frame_info.lost_frame = data ? false : true;
frame_info.last_frame = last_frame;
frame_info.frame_index = frame_index;
@ -546,6 +548,7 @@ void MultiFrameCapture::snaprun()
// cv::Mat mat(frame_info.height, frame_info.width, CV_8UC1, data);
frame_info.data = (char *)data;
m_frameinfos.Put(frame_info);
printf("获取数据\r\n");
}
else
{
@ -1118,10 +1121,24 @@ void MultiFrameCapture::openDevice(int dpi, int mode)
.selftest = 0,
.sp = fpgaparam.Sp}; // 600DPI 0x1450 300DPI 0xe10
configFPGAParam(mode, dpi);
// 2023 7-15 屏蔽
// m_capFpageregs->setRegs(0x01, *((int *)(&fpgamod)));
// m_capFpageregs->setSample(startsample);
// m_capFpageregs->setVsp(vsp_A, vsp_B);
// m_capFpageregs->enableLed(true);
// m_capFpageregs->setEnTestCol(false);
// m_capFpageregs->setEnTestBit(false);
// 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(); // 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;
@ -1137,7 +1154,7 @@ void MultiFrameCapture::openDevice(int dpi, int mode)
// video->read_frame(200);
char *buf = NULL;
video->HtCamReadCaptureFrame((void **)&buf, 200);
video->read_frame((void **)&buf, 200);
std::this_thread::sleep_for(std::chrono::milliseconds(100));
printf("abort first frame \n");
}

View File

@ -4,7 +4,7 @@
#include "CorrectParam.h"
#include "IPreproc.h"
#define TEST_SIMCAP
//#define TEST_SIMCAP
class FpgaComm;
class gVideo;