zynq_7010/HCamDevice.h

216 lines
6.0 KiB
C
Raw Normal View History

2023-07-17 03:29:37 +00:00
/*
* @Author: your name
* @Date: 2022-01-11 09:41:39
2023-08-09 07:31:27 +00:00
* @LastEditTime: 2023-02-27 16:38:45
2023-07-17 03:29:37 +00:00
* @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 <string>
#include <linux/videodev2.h>
// #include "../cameraConfig.h"
2023-08-09 07:31:27 +00:00
#include "CameraParams.h"
2023-07-17 03:29:37 +00:00
#include <functional>
#include <memory>
#include <thread>
2023-08-09 07:31:27 +00:00
#include <map>
2023-07-18 01:32:46 +00:00
2023-07-17 03:29:37 +00:00
#define adcRegSize 20
2023-08-09 07:31:27 +00:00
class Camconfig;
2023-07-17 03:29:37 +00:00
class HCamDevice
{
public:
2023-08-09 07:31:27 +00:00
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 &reg_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 &reg_value); //获取当前sptime
2023-07-17 03:29:37 +00:00
2023-08-09 07:31:27 +00:00
void HtCamSetStSp(int color);//0x0d //更具不同的颜色模式设置不同的st_sp //影响到图像的偏移
void HtCamGetStSp(uint32_t &reg_value);
void HtCamSetVsnpTime(int color);
public:
HCamDevice();
2023-07-17 03:29:37 +00:00
~HCamDevice();
2023-08-09 07:31:27 +00:00
int HtCamReadNextFrame(void **pbuf);
int V4LBufferQuery();
2023-07-17 03:29:37 +00:00
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();
2023-08-09 07:31:27 +00:00
void setConfig(Camconfig* _config){config = _config;}
2023-07-17 03:29:37 +00:00
void HtCamChangeMonoStartSample(int start_sample);
2023-08-09 07:31:27 +00:00
void HtCamChangePhase(int phase);
void ChangeScanState(bool state);
2023-07-18 14:29:02 +00:00
2023-07-17 03:29:37 +00:00
private:
2023-08-09 07:31:27 +00:00
2023-07-17 03:29:37 +00:00
int init_fd();
int init_sample();
2023-08-09 07:31:27 +00:00
int init_capture();
2023-07-17 03:29:37 +00:00
int init_video_buffer();
int init_dev();
void init_ps_regs();
2023-08-09 07:31:27 +00:00
void HtCamSwitchSampleModes(unsigned char mode);//测试数据
void HtCamChangeExposureValue(unsigned int value); //曝光值设置
2023-07-17 03:29:37 +00:00
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);
2023-07-18 14:29:02 +00:00
2023-07-17 03:29:37 +00:00
2023-08-09 07:31:27 +00:00
bool HtCamPsDpiChange(int dpi);
void HtCamImageProcessChange();
2023-07-17 03:29:37 +00:00
int HtCamEventWorkThread(void);
struct captureBuffer
{
void *start;
int dmabuf_fd;
uint32_t length;
};
const unsigned int phyBaseAddr = 0x40010000;
const unsigned int AddrMapSize = 0x100;
2023-08-09 07:31:27 +00:00
unsigned int *virBaseAddr;
2023-07-17 03:29:37 +00:00
int memfd;
std::string subDeviceName;
int subDevicefd;
2023-08-09 07:31:27 +00:00
std::string videoDevName;
2023-07-17 03:29:37 +00:00
int videofd;
2023-08-09 07:31:27 +00:00
2023-07-17 03:29:37 +00:00
unsigned int v4lWidth;
unsigned int v4lHeight;
2023-08-09 07:31:27 +00:00
2023-07-17 03:29:37 +00:00
unsigned int v4lBufferCount;
int nplanes;
int drivertype;
enum v4l2_buf_type v4l2buftype;
enum v4l2_memory v4l2memtype;
struct captureBuffer *captureBufers;
int lastSucceedBufferIndex;
2023-08-09 07:31:27 +00:00
uint32_t pPsReg[PSReg::REG_NUM + 1] = {0};
2023-07-17 03:29:37 +00:00
uint8_t pADCReg[adcRegSize];
std::shared_ptr<std::thread> event_thread = nullptr;
2023-08-09 07:31:27 +00:00
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<int, int> _DPI_WIDTH = {{150, 7776}, {300, 5184}, {600, 10368}};
std::map<int, int> _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;
2023-07-17 03:29:37 +00:00
};
2023-08-09 07:31:27 +00:00
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;
};
2023-07-17 03:29:37 +00:00