/* * @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); //设置颜色模式 //设置dpi dpi =0 200dpi ,dpi =1 300dpi,dpi =2 600dpi //注意协议的逻辑 :11号寄存器设置1 12号设置1 200dpi 11号寄存器设置1 12号设置0 300dpi 11号寄存器设置0 12号设置0 600dpi void HtCamSetDpi(int dpi); int HtCamReadCaptureFrame(void **pbuf, int timeout); //读图 <较重要> int get_width() { return v4lWidth; } int get_height() { return v4lHeight; } void set_width_hegith(int , int); void HtCamSetdivder (bool ); //设置扫描仪传感器使能 void HtCamGetPeriod(uint8_t ®_value);//获取扫描仪传感器占空比 void HtCamSetPeriod(double reg_value); //设置扫描仪传感器占空比 //void HtCamGetPeriod(double ®_value); //获取扫描仪传感器占空比 void HtCamGetFrameCnt(uint32_t &val);//获取设置采集的帧数 需要采集的帧数,设置为0x05表示采集六帧后停止 void HtCamSetFrameCnt(uint32_t val);//需要采集的帧数,设置为0x05表示采集六帧后停止 void HtCamGetFrameNum(uint32_t &val);//采集到的帧数,如果为0x0005则表示采集到了5帧 uint32_t HtCamReadFpgaRegs(uint8_t reg_addr); //读取寄存器值 void HtCamSetSpTime(uint32_t reg_value,uint32_t val);//0x03 reg_value //灰度内触发间隔 val读写间隔//影响到图像得拉伸 //2023-8-28 val 改为曝光间隔, void HtCamGetSpTime(uint32_t ®_value); //获取当前sptime void HtCamSetSpTime2(uint32_t reg_value);// reg_value //彩色内触发间隔 至少大于灰度三倍 void HtCamSetStSp(int start_sample);//0x0d //2023 /8/23 灰度彩色默认:200 //更具不同的颜色模式设置不同的st_sp //影响到图像的偏移 void HtCamGetStSp(uint32_t &start_sample); void HtCamSetVsnpTime(int color); //相位 void HtCamChangeExposureValueF(uint32_t* value); //曝光值设置 void HtCamChangeExposureValueB(uint32_t* value); //曝光值设置 //void HtCamWriteADCReg(uint8_t addr,uint8_t data); //写adc寄存器 void HtCamReadADCReg_ALL(uint8_t addr) ; //读adc寄存器 void HtCamSetLowPower(bool val);//低功耗模式 ////////////////ADC 寄存器0x00 - 0x14/////////////////// /////////////// 0x00 - 0xdh暂时只需要写高位,低位不用写 // 1、adc参数配置寄存器分为两个 0x00 和 0x07 // 2、每个adc参数配置又分32位宽 ,前八个位宽为adc值 // is_gain == true 设置增益 // is_gain == false 设置偏移 // is_adc1 == true 设置adc1 // is_adc1 == false 设置adc2 // addr adc 寄存器地址 // adc 寄存器数据 void HtCamWriteADCReg_ALL(bool is_gain,bool is_adc1,uint8_t addr, uint8_t data); void stopFPGAScan();//暂时无用 2023 -8 -2 void startFPGAScan();//暂时无用 2023 -8 -2 private: int init_fpga(); //初始化 寄存器基地址 int uninit_fpga(); int HtCamWaitVideoCapture(int msTimeout); //等待图像信号 void HtCamWriteFpgaRegs(uint8_t reg_addr, uint32_t reg_value); //写寄存器 public: HCamDevice(); ~HCamDevice(); int HtCamReadNextFrame(void **pbuf); int V4LBufferQuery(); void HtCamChangeTriggerInAndEXt(int in_out); void savePsReg(); void HtCamWriteAllADC(); void HtCamInitADCReg(); void HtCamWriteADCReg(uint8_t addr,uint8_t data); void HtCamWriteADCReg(); 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 ChangeScanState(bool state); private: int init_sample(); int init_capture(); int init_video_buffer(); int init_dev(); void init_ps_regs(); void HtCamSwitchSampleModes(unsigned char mode);//测试数据 void HtCamExitVideoCapturing(); void HtCamResizeBuffer(int width, int height, int number); 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; std::shared_ptr thread_auto_duty= nullptr; //std::condition_variable auto_duty_wait; //std::mutex auto_duty_lock_; 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; };