zynq_7010/zynq_7010_code/HCamDevice.h

230 lines
7.3 KiB
C
Raw Permalink 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); //设置颜色模式
2023-09-26 09:16:56 +00:00
//设置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);
2023-08-09 07:31:27 +00:00
int HtCamReadCaptureFrame(void **pbuf, int timeout); //读图 <较重要>
int get_width() { return v4lWidth; }
int get_height() { return v4lHeight; }
void set_width_hegith(int , int);
2023-08-31 08:37:05 +00:00
void HtCamSetdivder (bool ); //设置扫描仪传感器使能
2023-08-09 07:31:27 +00:00
void HtCamGetPeriod(uint8_t &reg_value);//获取扫描仪传感器占空比
2023-10-27 03:08:47 +00:00
void HtCamSetPeriod(double reg_value); //设置扫描仪传感器占空比
//void HtCamGetPeriod(double &reg_value); //获取扫描仪传感器占空比
2023-08-31 08:37:05 +00:00
2023-09-14 02:46:04 +00:00
void HtCamGetFrameCnt(uint32_t &val);//获取设置采集的帧数 需要采集的帧数设置为0x05表示采集六帧后停止
void HtCamSetFrameCnt(uint32_t val);//需要采集的帧数设置为0x05表示采集六帧后停止
2023-08-09 07:31:27 +00:00
2023-09-14 02:46:04 +00:00
void HtCamGetFrameNum(uint32_t &val);//采集到的帧数如果为0x0005则表示采集到了5帧
2023-08-09 07:31:27 +00:00
2023-09-14 02:46:04 +00:00
2023-08-11 05:54:42 +00:00
uint32_t HtCamReadFpgaRegs(uint8_t reg_addr); //读取寄存器值
2023-08-31 08:37:05 +00:00
void HtCamSetSpTime(uint32_t reg_value,uint32_t val);//0x03 reg_value //灰度内触发间隔 val读写间隔//影响到图像得拉伸 //2023-8-28 val 改为曝光间隔,
2023-08-11 05:54:42 +00:00
void HtCamGetSpTime(uint32_t &reg_value); //获取当前sptime
2023-08-31 08:37:05 +00:00
void HtCamSetSpTime2(uint32_t reg_value);// reg_value //彩色内触发间隔 至少大于灰度三倍
void HtCamSetStSp(int start_sample);//0x0d //2023 /8/23 灰度彩色默认200 //更具不同的颜色模式设置不同的st_sp //影响到图像的偏移
2023-08-11 05:54:42 +00:00
void HtCamGetStSp(uint32_t &start_sample);
2023-09-04 03:28:08 +00:00
void HtCamSetVsnpTime(int color); //相位
2023-08-09 07:31:27 +00:00
2023-08-15 01:50:06 +00:00
void HtCamChangeExposureValueF(uint32_t* value); //曝光值设置
void HtCamChangeExposureValueB(uint32_t* value); //曝光值设置
2023-08-09 07:31:27 +00:00
2023-08-15 01:50:06 +00:00
//void HtCamWriteADCReg(uint8_t addr,uint8_t data); //写adc寄存器
2023-08-31 08:37:05 +00:00
void HtCamReadADCReg_ALL(uint8_t addr) ; //读adc寄存器
2023-10-09 01:26:25 +00:00
void HtCamSetLowPower(bool val);//低功耗模式
2023-08-15 01:50:06 +00:00
////////////////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
2023-08-09 07:31:27 +00:00
private:
int init_fpga(); //初始化 寄存器基地址
int uninit_fpga();
2023-08-15 01:50:06 +00:00
2023-08-09 07:31:27 +00:00
int HtCamWaitVideoCapture(int msTimeout); //等待图像信号
void HtCamWriteFpgaRegs(uint8_t reg_addr, uint32_t reg_value); //写寄存器
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);
void savePsReg();
void HtCamWriteAllADC();
void HtCamInitADCReg();
void HtCamWriteADCReg(uint8_t addr,uint8_t data);
2023-08-31 08:37:05 +00:00
void HtCamWriteADCReg();
2023-07-17 03:29:37 +00:00
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 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_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);//测试数据
2023-08-11 05:54:42 +00:00
2023-07-17 03:29:37 +00:00
void HtCamExitVideoCapturing();
void HtCamResizeBuffer(int width, int height, int number);
2023-08-09 07:31:27 +00:00
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;
std::shared_ptr<std::thread> thread_auto_duty= nullptr;
//std::condition_variable auto_duty_wait;
//std::mutex auto_duty_lock_;
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