调整寄存器读写 及出图流程

This commit is contained in:
modehua 2023-07-18 07:29:02 -07:00
parent 355b44018a
commit fbf727e3e9
4 changed files with 125 additions and 107 deletions

View File

@ -17,6 +17,9 @@
#include <iostream>
#include <errno.h>
#include <fstream>
#define ADC_82V48
#define HT_CAM_REG_CR_STARTSAMPLE_MASK 0x00000001
@ -83,7 +86,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;
@ -110,8 +113,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()
@ -121,6 +126,7 @@ int HCamDevice::close_video()
return -1;
}
close(videofd);
HtCamStopSampling();
camera_dbg("close video succeed\n");
return 0;
}
@ -171,75 +177,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()
{
@ -265,7 +271,7 @@ void HCamDevice::HtCamExitVideoCapturing()
}
}
int HCamDevice::HtCamWaitVideoCapture(int msTimeout)
int HCamDevice::wait(int msTimeout)
{
struct pollfd pfd;
pfd.fd = videofd;
@ -277,9 +283,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)
@ -302,20 +308,20 @@ int HCamDevice::HtCamReadCaptureFrame(void **pbuf, int timeout)
buf.length = nplanes;
buf.m.planes = (struct v4l2_plane *)calloc(nplanes, sizeof(struct v4l2_plane));
}
if (ioctl(videofd, VIDIOC_DQBUF, &buf) == 0)
int ret = ioctl(videofd, VIDIOC_DQBUF, &buf);
if ( ret == 0)
camera_dbg("*****DQBUF[%d] FINISH*****\n", buf.index);
else
{
camera_err("****DQBUF FAIL*****\n");
return -2;
camera_err("****DQBUF FAIL %d*****\n",ret);
//return -2;
}
if (ioctl(videofd, VIDIOC_QBUF, &buf) == 0)
camera_dbg("************QBUF[%d] FINISH**************\n", buf.index);
camera_dbg("************QBUF[%d] FINISH buffer size:%d**************\n", buf.index,buf.length);
else
{
return -2;
//return -2;
}
lastSucceedBufferIndex = buf.index;
*pbuf = captureBufers[buf.index].start;
@ -324,7 +330,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)
@ -358,6 +364,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;
@ -375,6 +382,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);
@ -385,8 +393,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;
}
@ -446,11 +460,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;
@ -520,6 +536,7 @@ int HCamDevice::init_capture()
{
camera_err("Fail to set control:%s.\n", strerror(errno));
}
init_video_buffer();
return 0;
}
@ -608,10 +625,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);
@ -885,8 +899,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 );
@ -1049,7 +1062,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

@ -89,7 +89,7 @@ void MultiFrameCapture::SetParent(void *scanner)
{
}
void MultiFrameCapture::open_video()
void MultiFrameCapture::open()
{
// reset_fpga();
m_capFpageregs->resetADC();
@ -179,7 +179,7 @@ void MultiFrameCapture::open_video()
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()
@ -258,7 +260,7 @@ void MultiFrameCapture::UpdateScanParam(HG_ScanConfiguration config)
fseek(f_img, 0, SEEK_END);
m_test_pimg_len = ftell(f_img);
m_test_pimg = malloc(m_test_pimg_len);
printf("!!!!!!!!!! info: reading image len = %d m_test_pimg = %p \r\n", f_len, m_test_pimg);
//printf("!!!!!!!!!! info: reading image len = %d m_test_pimg = %p \r\n", f_len, m_test_pimg);
fclose(f_img);
#endif
}
@ -337,9 +339,9 @@ 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);
m_glue.m_imageready(info);
#else
printf("!!!!!!!!!!!!!!!! m_cv_snapdone wait \n");
V4L2_DATAINFO_Ex info;
@ -361,7 +363,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;
}
@ -534,7 +536,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;
@ -544,6 +546,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
{
@ -1126,14 +1129,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;
@ -1149,7 +1152,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;