zynq_7010/HCamDevice.h

183 lines
5.0 KiB
C++

/*
* @Author: your name
* @Date: 2022-01-11 09:41:39
* @LastEditTime: 2022-11-18 14:09:29
* @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"
//#include "../CameraParams.h"
#include <functional>
#include <memory>
#include <thread>
union CamZ_Reg_4
{
int value;
struct
{
unsigned int unuse_0 : 2;
unsigned int color_mode : 1;
unsigned int unuse_1 : 2;
unsigned int encode_divide : 3;
unsigned int encode_divide_mode : 1;
unsigned int unuse_2 : 5;
unsigned int en_adc_cfg : 1;
unsigned int clr_exp : 1;
unsigned int soft_reset : 1;
unsigned int en_pattern : 1;
unsigned int line_enable : 1; //不使用
unsigned int byte_sync : 1;
unsigned int adc_config_all : 1 ;
unsigned int adc_select : 5 ;
unsigned int test_pattern : 1;
unsigned int gpio1 : 1 ;
unsigned int gpio2 : 1 ;
unsigned int reserved : 3;
}params;
};
union CAM_INFO_REG
{
int value = 0;
struct
{
unsigned int ProjectVersion : 6; //所属项目版本
unsigned int cam_run_status : 1; //相机扫描状态
unsigned int vidio_status : 1; // v4l状态
unsigned int CIS_count : 8; // CIS计数
unsigned int CIS_Width : 16;
/* data */
};
};
#define adcRegSize 20
#define REG_NUM 14
typedef std::function<void(uint32_t)> GetImgProcSize;
typedef std::function<void(uint32_t)> GetImgFormat;
typedef std::function<void(uint32_t)> GetCameraEvents;
typedef std::function<void(int)> ReLoadCorrecEvent;
//class Camconfig;
class HCamDevice
{
public:
HCamDevice();
~HCamDevice();
int open_video(int width, int height);
int close_video();
void HtCamStartVideoCapturing();
void HtCamStopVideoCapturing();
int wait(int msTimeout);
int read_frame(void **pbuf, int timeout);
int width() { return v4lWidth; }
int height() { return v4lHeight; }
uint32_t HtCamReadFpgaRegs(uint8_t reg_addr);
void HtCamWriteFpgaRegs(uint8_t reg_addr, uint32_t reg_value);
void HtCamChangeTriggerInAndEXt(int in_out);
void HtCamSetTriggerMode(int val);
int HtCamGetTriggerMode();
int HtCamGetColorMode();
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 set_get_imgSize_event(GetImgProcSize _getImgProcSize);
void set_get_imgFormat_event(GetImgFormat _getImgFormat);
void set_reload_correct_event(ReLoadCorrecEvent _reLoadCorrectEvent);
void set_get_CameraEvents_event(GetCameraEvents _getCameraEvents);
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);
int HtCamStartSampling();
int HtCamStopSampling();
private:
int set_size(int width, int height);
int init_fd();
int init_sample();
int init_device();
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);
void HtCamChangeDpi(int dpi);
//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 = "/dev/video0";
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[ REG_NUM + 1] = {0};
uint8_t pADCReg[adcRegSize];
GetImgProcSize getImgProcSize;
GetImgFormat getImgFormat;
GetCameraEvents getCameraEvents = nullptr;
ReLoadCorrecEvent reLoadCorrectEvent = nullptr;
std::shared_ptr<std::thread> event_thread = nullptr;
//Camconfig* config = nullptr;
};