/* * @Author: your name * @Date: 2022-01-11 09:41:39 * @LastEditTime: 2023-02-27 16:38:45 * @LastEditors: Zhaozhonmin 1656963645@qq.com * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @FilePath: \zynq_MSS\capimage\HCamDevice.h */ #pragma once #include #include // #include "../cameraConfig.h" #include "CameraParams.h" #include #include #include #include #define adcRegSize 20 class Camconfig; class HCamDevice { public: int open_device(int , int); int close_device(); void HtCamStartVideoCapturing(); //开始 摄像头工作 void HtCamStopVideoCapturing(); //停止 摄像头工作 int HtCamStartSampling(); //开始cis摄像头灯寄存器设置 int HtCamStopSampling(); //停止cis摄像头灯寄存器设置 void HtCamSetTriggerMode(int val); //设置触发模式 int HtCamGetTriggerMode(); //获取触发模式 int HtCamGetColorMode(); //获取颜色模式 void HtCamSetClolr(int color); //设置颜色模式 void HtCamSetDpi(int dpi); //设置dpi int HtCamReadCaptureFrame(void **pbuf, int timeout); //读图 <较重要> int get_width() { return v4lWidth; } int get_height() { return v4lHeight; } void set_width_hegith(int , int); void HtCamSetPeriod(uint8_t reg_value); //设置扫描仪传感器占空比 void HtCamGetPeriod(uint8_t ®_value);//获取扫描仪传感器占空比 void HtCamGetFrameCnt(uint32_t &val);//获取设置采集的帧数 void HtCamGetFrameNum(uint32_t &val);//获取当前已经采集到的第几帧 void HtCamSetFrameCnt(uint32_t val);//设置需要采集的帧数 uint32_t HtCamReadFpgaRegs(uint8_t reg_addr); //读取寄存器值 private: int init_fpga(); //初始化 寄存器基地址 int uninit_fpga(); void stopFPGAScan();//暂时无用 2023 -8 -2 void startFPGAScan();//暂时无用 2023 -8 -2 int HtCamWaitVideoCapture(int msTimeout); //等待图像信号 void HtCamWriteFpgaRegs(uint8_t reg_addr, uint32_t reg_value); //写寄存器 void HtCamSetSpTime(uint32_t reg_value);//0x03 //内触发间隔 //影响到图像得拉伸 void HtCamGetSpTime(uint32_t ®_value); //获取当前sptime void HtCamSetStSp(int color);//0x0d //更具不同的颜色模式设置不同的st_sp //影响到图像的偏移 void HtCamGetStSp(uint32_t ®_value); void HtCamSetVsnpTime(int color); public: HCamDevice(); ~HCamDevice(); int HtCamReadNextFrame(void **pbuf); int V4LBufferQuery(); void HtCamChangeTriggerInAndEXt(int in_out); uint32_t HtCamReadPsRegs(uint8_t reg_addr); void HtCamWritePsRegs(uint8_t reg_addr, uint32_t reg_value); void savePsReg(); void HtCamWriteAllADC(); void HtCamInitADCReg(); void HtCamWriteADCReg(uint8_t addr,uint8_t data); void HtCamReadADCReg(uint8_t addr, uint8_t *data); void HtCamOverClockClear(); // 清除切换超频标志位 uint8_t getADCReg(int addr); void setADCReg(int addr , uint8_t value); void saveADCReg(); void setConfig(Camconfig* _config){config = _config;} void HtCamChangeMonoStartSample(int start_sample); void HtCamChangePhase(int phase); void ChangeScanState(bool state); private: int init_fd(); int init_sample(); int init_capture(); int init_video_buffer(); int init_dev(); void init_ps_regs(); void HtCamSwitchSampleModes(unsigned char mode);//测试数据 void HtCamChangeExposureValue(unsigned int value); //曝光值设置 void HtCamExitVideoCapturing(); 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); bool HtCamPsDpiChange(int dpi); void HtCamImageProcessChange(); int HtCamEventWorkThread(void); struct captureBuffer { void *start; int dmabuf_fd; uint32_t length; }; const unsigned int phyBaseAddr = 0x40010000; const unsigned int AddrMapSize = 0x100; unsigned int *virBaseAddr; int memfd; std::string subDeviceName; int subDevicefd; std::string videoDevName; int videofd; unsigned int v4lWidth; unsigned int v4lHeight; unsigned int v4lBufferCount; int nplanes; int drivertype; enum v4l2_buf_type v4l2buftype; enum v4l2_memory v4l2memtype; struct captureBuffer *captureBufers; int lastSucceedBufferIndex; uint32_t pPsReg[PSReg::REG_NUM + 1] = {0}; uint8_t pADCReg[adcRegSize]; std::shared_ptr event_thread = nullptr; Camconfig* config = nullptr; std::string _CAM_TYPE = "PYTHONZ_1200"; int _V4LWIDTH = 15552 / 3; //灰度 int _IMG_BUF_WIDTH = 5184; int _V4LHEIGHT = 128; int _V4LBUFFERCOUNT = 32; std::string _SP_DPI = "150|300|600"; std::string _V4L_DPIS = "300|600"; int _N_DPI = 150; int _CIS_NUM = 6; std::map _DPI_WIDTH = {{150, 7776}, {300, 5184}, {600, 10368}}; std::map _DPI_V4LWIDTH = {{150, 15552}, {300, 15552}, {600, 31104}}; std::string _ADCPATH = "/media/sd-mmcblk1p1/ADC.ini"; int VSNP = 0 ; int ST_SP = 85 ; int ST_SP_VSNP = 0; int _TRIG_SPACING = 2592; }; class FPGA{ int init_fpga(); //初始化 寄存器基地址 int uninit_fpga(); public: FPGA(); ~FPGA(); private: const unsigned int phyBaseAddr = 0x40010000; const unsigned int AddrMapSize = 0x100; unsigned int *virBaseAddr; int memfd; };