Commit 66ec8f57 authored by Andrey Filippov's avatar Andrey Filippov
Browse files

merged with framepars

parents 2677b54a cf73e112
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -265,7 +265,10 @@
                elphel393-sensor-i2c,i2c_devices = "mt9f002        0x10 2 2 500",
                                                   "mt9p006        0x48 1 2 500",
                                                   "el10359        0x08 1 2 500",
                                                   "el10359_32     0x08 1 4 500",
                                                   "pca9500_eeprom 0x50 1 1 100",
                                                   "sensor_eeprom  0x50 1 1 100",
                                                   "sensor_temp    0x18 1 2 100",
                                                   "cy22393        0x69 1 1 100";
    } ;

@@ -285,6 +288,10 @@
        compatible = "elphel,elphel393-mt9x001-1.00";
    };

    elphel393_clock10359:elphel393-clock10359@0{
        compatible = "elphel,elphel393_clock10359-1.00";    
    };

    klogger_393: klogger-393@0 {
        compatible = "elphel,klogger-393-1.00";
        klogger-393,buffer_size = <1048576>; 
+42 −18
Original line number Diff line number Diff line
@@ -84,25 +84,25 @@ int calc_pll_params (unsigned int f, t_pll_params * pars) { // f -in Hz
	unsigned int fpmx= CY22393_XTAL * (CY22393_PMAX + 6);
	int divmn, divmx, err1,err, div,q,qmn,qmx,qmx1,fdv,p, e,fdvq;
	pars->rslt=3; // other error
	dev_dbg(sdev, "f0=%d,f=%d, CY22393_OUTMAX=%d\r\n",f0,f,CY22393_OUTMAX);
	dev_dbg(sdev, "f0=%d,f=%d, CY22393_OUTMAX=%d\n",f0,f,CY22393_OUTMAX);

	f/=CY22393_SCALE; // to fit into 32-bit calculations
	dev_dbg(sdev, "f0=%d,f=%d, CY22393_OUTMAX=%d\r\n",f0,f,CY22393_OUTMAX);
	dev_dbg(sdev, "f0=%d,f=%d, CY22393_OUTMAX=%d\n",f0,f,CY22393_OUTMAX);
	if (f>CY22393_OUTMAX) {
	 pars->rslt=2;
		dev_dbg(sdev, "f0=%d,f=%d, CY22393_OUTMAX=%d\r\n",f0,f,CY22393_OUTMAX);
		dev_dbg(sdev, "f0=%d,f=%d, CY22393_OUTMAX=%d\n",f0,f,CY22393_OUTMAX);
	 return pars->rslt;
	}
	if (f <=0 ) {
	 pars->rslt=1;
		dev_dbg(sdev, "f0=%d,f=%d, CY22393_OUTMAX=%d\r\n",f0,f,CY22393_OUTMAX);
		dev_dbg(sdev, "f0=%d,f=%d, CY22393_OUTMAX=%d\n",f0,f,CY22393_OUTMAX);
	 return pars->rslt;
	}
	divmx=CY22393_PLLMAX/f; if (divmx > 127) divmx=127; // could not be <1
	divmn=CY22393_PLLMIN/f; if (divmn < 1)   divmn=1;
	if (divmn >127) {
	 pars->rslt=1;
		dev_dbg(sdev, "f0=%d,f=%d, CY22393_OUTMAX=%d, divmn=%d\r\n",f0,f,CY22393_OUTMAX,divmn);
		dev_dbg(sdev, "f0=%d,f=%d, CY22393_OUTMAX=%d, divmn=%d\n",f0,f,CY22393_OUTMAX,divmn);
	 return pars->rslt;
	}
	err1=f;
@@ -113,7 +113,7 @@ int calc_pll_params (unsigned int f, t_pll_params * pars) { // f -in Hz
		qmn=fpmn/fdv-2; if (qmn < 0) qmn=0;
		qmx=fpmx/fdv-2; if (qmx >255) qmx=255;
		// recalculate qmn to avoid same div*qmn as already tried with lover div
		dev_dbg(sdev, "div=%d,qmn=%d, qmx=%d\r\n",div,qmn,qmx);
		dev_dbg(sdev, "div=%d,qmn=%d, qmx=%d\n",div,qmn,qmx);
		if (div==1) qmx1=qmx;
		else if ((qmn*div) < qmx1) qmn=qmx1/div;
		for (q=qmn+2;q<=qmx+2; q++) {
@@ -127,10 +127,10 @@ int calc_pll_params (unsigned int f, t_pll_params * pars) { // f -in Hz
				pars->dv=div;
				err1=e/q/div;
				err=err1*div;
				dev_dbg(sdev, "f=%d, div=%d, p=%d,q=%d, err1=%d\r\n", (f0*p)/q/div, div,p, q, err1);
				dev_dbg(sdev, "f=%d, div=%d, p=%d,q=%d, err1=%d\n", (f0*p)/q/div, div,p, q, err1);
				if (err1==0) {
					pars->corr=(pars->p<226)?0:((pars->p<621)?1:((pars->p<829)?2:((pars->p<1038)?3:4)));
					dev_dbg(sdev, "f=%d, div=%d, p=%d,q=%d, err1=%d, rslt=%d\r\n",
					dev_dbg(sdev, "f=%d, div=%d, p=%d,q=%d, err1=%d, rslt=%d\n",
									(f0*(pars->p+6))/(pars->q+2)/pars->dv,
									pars->dv,
									(pars->p+6),
@@ -142,7 +142,7 @@ int calc_pll_params (unsigned int f, t_pll_params * pars) { // f -in Hz
			}
		}
	}
	dev_dbg(sdev, "f=%d, div=%d, p=%d,q=%d, err1=%d, rslt=%d\r\n",
	dev_dbg(sdev, "f=%d, div=%d, p=%d,q=%d, err1=%d, rslt=%d\n",
				   (f0*(pars->p+6))/(pars->q+2)/pars->dv,
				   pars->dv,
				   (pars->p+6),
@@ -156,6 +156,7 @@ int calc_pll_params (unsigned int f, t_pll_params * pars) { // f -in Hz
int setCYField (int sensor_port, int reg_addr, int mask, int value) {
	int error;
	int reg_data;
    dev_dbg(sdev,"setCYField(%d, 0x%x, 0x%x,0x%x)\n",sensor_port, reg_addr, mask, value);
	if ((error = x393_xi2c_read_reg(CLOCK_NAME,       // device class name
									sensor_port,      // sensor port number
				                    0,                // slave address (7-bit) offset from the class defined slave address
@@ -165,6 +166,7 @@ int setCYField (int sensor_port, int reg_addr, int mask, int value) {
				sensor_port, reg_addr, mask, value);
		return error;
	}
    dev_dbg(sdev,"setCYField(%d, 0x%x, 0x%x,0x%x)=>0x%x\n",sensor_port, reg_addr, mask, value,reg_data);
	reg_data ^= (reg_data ^ value) & mask;
	if ((error = x393_xi2c_write_reg(CLOCK_NAME,       // device class name
									 sensor_port,      // sensor port number
@@ -181,22 +183,43 @@ int setCYField (int sensor_port, int reg_addr, int mask, int value) {
int x393_getClockFreq(int sensor_port, int nclock) {
    if ((sensor_port < 0) || (sensor_port > 3) || (nclock < 0) || (nclock > 3))return -EINVAL; // bad clock number
    else {
    return clock_frequency[(sensor_port << 2) || nclock];
        dev_dbg(sdev, "clock_frequency[%d]\n",(sensor_port << 2) + nclock);
        return clock_frequency[(sensor_port << 2) + nclock];
    }
}

EXPORT_SYMBOL_GPL(x393_getClockFreq);


int x393_setClockFreq(int sensor_port, int nclock, int freq)
{ // freq now in Hz
    int err=0;
    int i,bp,bq,bdiv,pllc,fact;
    t_pll_params  pll_params;
    sensor_port &= 3;
    nclock &= 3;
    t_pll_params  pll_params;
    int i,bp,bq,bdiv,pllc,fact;
    bp=0; bq=0; bdiv=0; pllc= 0; // just to make gcc happy
    fact=0;
    dev_dbg(sdev, "setClockFreq(%d,%d,%d)\r\n",sensor_port,nclock,freq);
    dev_dbg(sdev, "setClockFreq(%d,%d,%d)\n",sensor_port,nclock,freq);

// Just temporary debug:
#if 1
    for (i = 0; i< 24; i++) {
        int reg_data;
//        dev_dbg(sdev,"setCYField(%d, 0x%x, 0x%x,0x%x)\n",sensor_port, reg_addr, mask, value);
        if ((err = x393_xi2c_read_reg(CLOCK_NAME,       // device class name
                sensor_port,      // sensor port number
                0,                // slave address (7-bit) offset from the class defined slave address
                i,               // register address (width is defined by class)
                &reg_data)) <0) { // pointer to a data receiver (read data width is defined by class)
            dev_err(sdev,"x393_xi2c_read_reg(%d, 0, 0x%x, 0x%x) failed reading i2c register\n", sensor_port, i, reg_data);
            break;
        }
        dev_err(sdev,"CY22393 port %d: [0x%x] => 0x%x\n", sensor_port, i, reg_data);
    }

#endif

    if ((freq!=0) && (nclock!=3) ){
        if ( (i=calc_pll_params (freq, &pll_params)) !=0) {
            dev_err(sdev, "bad frequency for clock %d - %d Hz, err=%d\n",nclock,freq,i);
@@ -255,7 +278,7 @@ int x393_setClockFreq(int sensor_port, int nclock, int freq)
        break;
    case 3:
        if ((freq!=0) && (freq!=CY22393_SCALE*CY22393_XTAL)) {
            dev_err(sdev, "Only frequency 0 (off) and %d Hz (xtal) are allowed for channel 3\r\n",CY22393_SCALE*CY22393_XTAL);
            dev_err(sdev, "Only frequency 0 (off) and %d Hz (xtal) are allowed for channel 3\n",CY22393_SCALE*CY22393_XTAL);
            return -EINVAL;
        } else {
            //  int setCYField (sensor_port,int devfd, int addr, int mask, int value) O_RDWR
@@ -275,6 +298,7 @@ int x393_setClockFreq(int sensor_port, int nclock, int freq)
        return err;
    }
    clock_frequency[(sensor_port << 2) + nclock] = fact;
    dev_dbg(sdev, "clock_frequency[%d]\n",(sensor_port << 2) + nclock);
    return fact;
}
EXPORT_SYMBOL_GPL(x393_setClockFreq);
@@ -400,7 +424,7 @@ static void elphel393_clock10359_init_of(struct platform_device *pdev)
static int elphel393_clock10359_probe(struct platform_device *pdev)
{
	sdev =&pdev->dev;
	dev_dbg(&pdev->dev,"Probing elphel_clock10359\n");
	dev_info(&pdev->dev,"Probing elphel_clock10359\n");

	elphel393_clock10359_sysfs_register(pdev);
	dev_dbg(&pdev->dev,"elphel393_clock10359_sysfs_register() done\n");
+7 −5
Original line number Diff line number Diff line
@@ -837,7 +837,7 @@ inline void _processParsSeq(int sensor_port, ///< sensor port
{
	unsigned long todo, mask, remain;
	int job_ahead;                  // doing job "job_ahead" ahead of needed
	int pars_ahead;                 // considering parameter "pars_ahead" of the (frame16+job_ahead) mod 8
	int pars_ahead;                 // considering parameter "pars_ahead" of the (frame16+job_ahead) mod 16
	int frame_proc;                 // current frame for which parameters are considered
	struct framepars_t * procpars;
	struct framepars_t * prevpars;  // maybe - drop calculation for each function, move it to pgm_* where needed?
@@ -968,7 +968,10 @@ void _processPars(int sensor_port, struct sensorproc_t * sensorproc, int frame16
        dev_dbg(g_devfp_ptr,"port= %d (after second _processParsASAP),  frame16=%d, maxahead=%d\n", sensor_port, frame16, maxahead);
    }
    dev_dbg(g_devfp_ptr,"port= %d (after second _processParsASAP),  frame16=%d, maxahead=%d\n", sensor_port, frame16, maxahead);
    if (debug_flags)    debug_flags--;
    if (debug_flags)   {
        dev_dbg(g_devfp_ptr,"debug_flags= %d \n", debug_flags);
        debug_flags--;
    }

}

@@ -1007,7 +1010,7 @@ int processPars(int sensor_port, struct sensorproc_t * sensorproc, int frame16,
    if (debug_flags) {
        MDP(DBGB_FPPT,sensor_port,"==from tasklet: frame16=%d, maxahead=%d\n",
                frame16, maxahead)
        dev_dbg(g_devfp_ptr,"==from tasklet: port= %d,  frame16=%d, maxahead=%d\n", sensor_port, frame16, maxahead);
        dev_dbg(g_devfp_ptr,"==from tasklet: port= %d,  frame16=%d, maxahead=%d  now=0x%lx\n", sensor_port, frame16, maxahead, getThisFrameNumber(sensor_port));
    }

    dev_dbg(g_devfp_ptr,"port= %d,  frame16=%d, maxahead=%d\n", sensor_port, frame16, maxahead);
@@ -1021,13 +1024,12 @@ int processPars(int sensor_port, struct sensorproc_t * sensorproc, int frame16,
    if (debug_flags) {
        MDP(DBGB_FPPT,sensor_port,"==Done from tasklet: frame16=%d, maxahead=%d\n",
                frame16, maxahead)
        dev_dbg(g_devfp_ptr,"== Done from tasklet: port= %d,  frame16=%d, maxahead=%d\n", sensor_port, frame16, maxahead);
        dev_dbg(g_devfp_ptr,"== Done from tasklet: port= %d,  frame16=%d, maxahead=%d now=0x%lx\n", sensor_port, frame16, maxahead, getThisFrameNumber(sensor_port));
    }
    return 0;
}
#endif


/**
 * @brief schedule pgm_func to be executed for selected frame (frame16)
 * @param sensor_port sensor port number (0..3)
+1 −1
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@ void init_framepars_ptr(int sensor_port);
int  initSequencers    (int sensor_port); ///Move to sensorcommon? currently it is used through frameparsall file (lseek)
void initGlobalPars    (int sensor_port); /// resets all global parameters but debug mask (if ELPHEL_DEBUG)
int  initMultiPars     (int sensor_port); /// initialize structures for individual per-sensor parameters. Now only works for sensor registers using G_MULTI_REGSM. Should be called aftre/during sensor detection
void initFramePars     (int sensor_port); ///initialize all parameters, set thisFrameNumber to frame8 (read from hardware, usually 0 after resetting i2c and cmd_seq)
void initFramePars     (int sensor_port); ///initialize all parameters, set thisFrameNumber to frame16 (read from hardware, usually 0 after resetting i2c and cmd_seq)
void resetFrameNumber  (int sensor_port, u32 aframe, int hreset); /// reset this frame number (called from initFramePars(), also can be used to avoid frame number integer overflow)

unsigned long get_imageParamsFrame(int sensor_port, int n, int frame);
+3 −3
Original line number Diff line number Diff line
@@ -1219,7 +1219,7 @@ int mt9x001_pgm_limitfps (int sensor_port, ///< sensor port numb
{
    struct frameparspair_t pars_to_update[16]; // maximum 7 registers updated (need to recount)
    int nupdate=0;
    int dh=  thispars->pars[P_DCM_HOR];
    int dh=  thispars->pars[P_DCM_HOR]?thispars->pars[P_DCM_HOR]:1;
    int ww=  thispars->pars[P_SENSOR_PIXH] * dh;
    int binning_cost = 0;
    int width,i;
@@ -1989,8 +1989,8 @@ int mt9x001_pgm_triggermode (int sensor_port, ///< sensor p
    dev_dbg(g_dev_ptr,"{%d}  frame16=%d\n",sensor_port,frame16);
    if (frame16 >= PARS_FRAMES) return -1; // wrong frame
    newreg= (thispars->pars[P_SENSOR_REGS+P_MT9X001_RMODE1] & 0xfe7f) | // old value without snamshot and GRR bits
            ((thispars->pars[P_TRIG] & 4)?0x100:0) |                    // snapshot mode for P_TRIG==4 or 5
            ((thispars->pars[P_TRIG] & 1)?0x80:0);                      // GRR mode for P_TRIG==5 (no effect for 1
            ((thispars->pars[P_TRIG] & 4)?0x100:0) |                    // snapshot mode for P_TRIG==4 or 20
            ((thispars->pars[P_TRIG] & 0x10)?0x80:0);                   // GRR mode for P_TRIG==20
    if (newreg != thispars->pars[P_SENSOR_REGS+P_MT9X001_RMODE1]) {
        // turn off triggered mode immediately, turn on later (or should made at least before changing camsync parameters)
        if (!(thispars->pars[P_TRIG] & 4)){
Loading