diff --git a/HCamDevice.cpp b/HCamDevice.cpp index ae70ede..857799e 100644 --- a/HCamDevice.cpp +++ b/HCamDevice.cpp @@ -17,6 +17,9 @@ #include #include + +#include + #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 -#include + 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); diff --git a/HCamDevice.h b/HCamDevice.h index d7b8d9b..f2cdbdf 100644 --- a/HCamDevice.h +++ b/HCamDevice.h @@ -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; diff --git a/MultiFrameCapture.cpp b/MultiFrameCapture.cpp index 686ff23..c91f444 100644 --- a/MultiFrameCapture.cpp +++ b/MultiFrameCapture.cpp @@ -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 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(sp_dst * 4 / (mode ? 1 : 3))); //dpi > 2 ? 7200 : 3600 // m_capFpageregs->setFrame_interval_min(static_cast(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"); } diff --git a/MultiFrameCapture.h b/MultiFrameCapture.h index 03cb401..d0319e8 100644 --- a/MultiFrameCapture.h +++ b/MultiFrameCapture.h @@ -4,7 +4,7 @@ #include "CorrectParam.h" #include "IPreproc.h" -#define TEST_SIMCAP +//#define TEST_SIMCAP class FpgaComm; class gVideo;