Commit e7e0c7be authored by Andrey Filippov's avatar Andrey Filippov
Browse files

re-organized trigger behavior

parent a8a661b1
Loading
Loading
Loading
Loading
+82 −14
Original line number Diff line number Diff line
@@ -190,7 +190,18 @@ static DEFINE_SPINLOCK(framepars_lock_3); ///<
/** Define array of pointers to locks - hardware allows concurrent writes to different ports tables */
spinlock_t * framepars_locks[4] = {&framepars_lock_0, &framepars_lock_1, &framepars_lock_2, &framepars_lock_3};


static struct common_pars_t scommon_pars = {
        .master_chn =       0,
        .sensors=           {0,0,0,0}, // maybe not needed (it is whom to notify of
        .updated =          {0,0,0,0}, // set by master, cleared by other channels
        .trig_period =      0,
        .trig_bitlength =   0,
        .extern_timestamp = 0,
        .xmit_timestamp =   0,
        .trig_condition =   0,
        .trig_out =         0
};
struct common_pars_t *common_pars = NULL;
/* Remove after compilation OK */
//struct sensorproc_t * sensorproc = NULL;
//void compressor_interrupts (int on) {}
@@ -244,7 +255,7 @@ void init_framepars_ptr(int sensor_port)
	aglobalPars[sensor_port] =         sFrameParsAll[sensor_port].globalPars;           // parameters that are not frame-related, their changes do not initiate any actions so they can be mmaped for both
	amultiSensIndex[sensor_port] =     sFrameParsAll[sensor_port].multiSensIndex;      // indexes of individual sensor register shadows (first of 3) - now for all parameters, not just sensor ones
	amultiSensRvrsIndex[sensor_port] = sFrameParsAll[sensor_port].multiSensRvrsIndex;  // reverse index (to parent) for the multiSensIndex

	common_pars =                      &scommon_pars;
}

int        framepars_open(struct inode *inode, struct file *filp);
@@ -252,9 +263,11 @@ int framepars_release(struct inode *inode, struct file *filp);
loff_t     framepars_lseek(struct file * file, loff_t offset, int orig);
ssize_t    framepars_write(struct file * file, const char * buf, size_t count, loff_t *off);
int        framepars_mmap(struct file *file, struct vm_area_struct *vma);
void       trigSlaveUpdate(int sensor_port);

/**
 * @brief Reset hardware sequencers (i2c, command) and initialize framepars structure
 * Does not seem to do anything with the sequencers
 */
int initSequencers(int sensor_port)
{
@@ -268,7 +281,7 @@ int initSequencers(int sensor_port)
    if (!hardware_initialized) {
        dev_dbg(g_devfp_ptr,"Configuring compressor DMA channels\n");
        dev_info(g_devfp_ptr,"Configuring compressor DMA channels\n");
        init_compressor_dma(0xf, // all channels (TODO: NC393 - select channels in DT or use existing for sesnors?
        init_compressor_dma(0xf, // all channels (TODO: NC393 - select channels in DT or use existing for sensors?
                              0); // not to interfere with python setting the same
        // Start RTC by writing 0 to seconds if it was not already set, otherwise preserve current time
        get_fpga_rtc(&sec_usec);
@@ -937,6 +950,8 @@ void _processPars(int sensor_port, struct sensorproc_t * sensorproc, int frame16
        dev_err(g_devfp_ptr,"port=%d frame16=%d sensorproc==NULL !!!! \n", sensor_port,  frame16);
        return;
    }
    // Check if master channel updated trigger parameters, schedule them to be updated
    trigSlaveUpdate(sensor_port); // that will possible schedule more parameters
    //    int spin_trylock(spinlock_t *lock);
    // first - do all ASAP tasks (they should not be done ahead of the corresponding interrupt!)
    //   dev_dbg(g_devfp_ptr,"%s before first _processParsASAP\n",__func__);
@@ -1075,18 +1090,40 @@ unsigned long getThisFrameNumber(int sensor_port)


/**
 * @brief Set parameters that will never change (usually after sensor discovery)
 * @brief Set a single parameter to all frames (during sensor detection)
 * @param sensor_port sensor port number (0..3)
 * @param numPars number of parameters to set
 * @param pars array of parameters (number/value pairs)
 * @return always 0
 */
int setFrameParsStatic(int sensor_port, int numPars, struct frameparspair_t * pars)
int setFrameParStatic(int sensor_port,                     ///< sensor port number (0..3)
                      unsigned long index,                 ///< parameter number
                      unsigned long val)                   ///< parameter value to set
                                                           ///< @return 0 - OK, -ERR_FRAMEPARS_BADINDEX

{
    struct framepars_t *framepars = aframepars[sensor_port];
    int nframe;
    index &= 0xffff;  // get rid of any modifier (not applicable here)
	if (index > P_MAX_PAR) return -ERR_FRAMEPARS_BADINDEX;
    for (nframe = 0; nframe < PARS_FRAMES; nframe++) {
        framepars[nframe].pars[index] = val;
	}
	return 0;
}

/**
 * @brief Set parameters that will never change (usually after sensor discovery), other fields are supposed to be cleared
 */
int setFrameParsStatic(int sensor_port,               ///< sensor_port sensor port number (0..3)
                       int numPars,                   ///< numPars number of parameters to set
                       struct frameparspair_t * pars) ///< pars array of parameters (number/value pairs)
                                                      ///< @return always 0
{
    int npar, nframe, index;
    struct framepars_t *framepars = aframepars[sensor_port];
    for (npar = 0; npar < numPars; npar++) {
		index = pars[npar].num;
        index = pars[npar].num & 0xffff; // get rid of any modifier (not applicable here)
        if (index > P_MAX_PAR) return -ERR_FRAMEPARS_BADINDEX;
        for (nframe = 0; nframe < PARS_FRAMES; nframe++) {
            framepars[nframe].pars[index] = pars[npar].val;
@@ -1095,6 +1132,7 @@ int setFrameParsStatic(int sensor_port, int numPars, struct frameparspair_t * pa
    return 0;
}


/** Set parameters for the specified frame  (atomic, with interrupts off). Used from applications through driver write */
//TODO: Check that writes never to the future or past frame (only 6 of 8 are allowed -> 14 of 16). Have seen just_this to flood all
int setFrameParsAtomic(int sensor_port,               ///< sensor port number (0..3)
@@ -1371,6 +1409,34 @@ int setFrameParLocked(int sensor_port, ///< sensor port numb
    return rslt;
}

void trigSlaveUpdate(int sensor_port)  ///< sensor port number (0..3)
{
    struct framepars_t *framepars =  aframepars[sensor_port];
    struct frameparspair_t pars_to_update[7];
    int nupdate = 0;
    int updated_period = 0;
    while (common_pars->updated[sensor_port]) {
//        int frame16 = (common_pars->updated[sensor_port] < 0)?-1:(common_pars->updated[sensor_port]-1); // 1 was added ta enable frame16=0
//        dev_dbg(g_devfp_ptr,"port= %d,  frame16=%d, thisFrameNumber[%d] = %d\n", sensor_port, frame16, sensor_port, (int) thisFrameNumber(sensor_port));
        dev_dbg(g_devfp_ptr,"port= %d,  thisFrameNumber[%d] = %d\n", sensor_port, sensor_port, (int) thisFrameNumber(sensor_port));
        common_pars->updated[sensor_port] = 0;
        if (pars_to_update[nupdate  ].num != P_TRIG_PERIOD){
            updated_period = FRAMEPAIR_FORCE_PROC;
        }
        pars_to_update[nupdate  ].num= P_TRIG_MASTER ;                  pars_to_update[nupdate++].val = common_pars->master_chn;
        pars_to_update[nupdate  ].num= P_TRIG_PERIOD | updated_period ; pars_to_update[nupdate++].val = common_pars->trig_period;
        pars_to_update[nupdate  ].num= P_TRIG_BITLENGTH ;               pars_to_update[nupdate++].val = common_pars->trig_bitlength;
        pars_to_update[nupdate  ].num= P_EXTERN_TIMESTAMP ;             pars_to_update[nupdate++].val = common_pars->extern_timestamp;
        pars_to_update[nupdate  ].num= P_XMIT_TIMESTAMP ;               pars_to_update[nupdate++].val = common_pars->xmit_timestamp;
        pars_to_update[nupdate  ].num= P_TRIG_CONDITION ;               pars_to_update[nupdate++].val = common_pars->trig_condition;
        pars_to_update[nupdate  ].num= P_TRIG_OUT ;                     pars_to_update[nupdate++].val = common_pars->trig_out;
//        if (nupdate)  setFramePars(sensor_port, &framepars[frame16], nupdate, pars_to_update);  // save changes, schedule functions
        if (nupdate)  setFramePars(sensor_port, &framepars[thisFrameNumber(sensor_port)], nupdate, pars_to_update);  // save changes, schedule functions

    }
}


/** Set multiple output (calculated) parameters for the frame referenced by this_framepars structure.
 * Schedules action only if the FRAMEPAIR_FORCE_PROC modifier bit is set in the particular parameter index
 * Called from tasklets (while executing (*_)pgm_* functions
@@ -1400,7 +1466,7 @@ int setFramePars(int sensor_port, ///< sensor port number (0
		frame16 = (this_framepars->pars[P_FRAME]) & PARS_FRAMES_MASK;
		val = pars[npar].val;
		index = pars[npar].num & 0xffff;
		dev_dbg(g_devfp_ptr, ":    ---   frame16=%d index=%d (0x%x) val=0x%x\n", frame16, index, (int)pars[npar].num, (int)val);
		dev_dbg(g_devfp_ptr, ":    ---   frame16=%d index=%d (0x%x) val=0x%x, findex_future = 0x%x\n", frame16, index, (int)pars[npar].num, (int)val, findex_future);
	    MDP(DBGB_FSFV,sensor_port,"  ---   frame16=%d index=%d (0x%x) val=0x%x\n", frame16, index, (int)pars[npar].num, (int)val)
		// remark: code below looks similar to setFramePar function, call it instead
		if (index > ((index >= FRAMEPAR_GLOBALS) ? (P_MAX_GPAR + FRAMEPAR_GLOBALS) : P_MAX_PAR)) {
@@ -1419,6 +1485,7 @@ int setFramePars(int sensor_port, ///< sensor port number (0
				val = FRAMEPAIR_FRAME_MASK_NEW(pars[npar].num, framepars[frame16].pars[index], val);
			}
//TODO: optimize to use mask several parameters together
	        dev_dbg(g_devfp_ptr, "{%d}:  framepars[%d].pars[0x%x] = 0x%x, val=0x%x\n", sensor_port, frame16, index, (int) framepars[frame16].pars[index], (int)val);
			if ((framepars[frame16].pars[index] != val) || (pars[npar].num & (FRAMEPAIR_FORCE_NEW | FRAMEPAIR_FORCE_PROC))) {
				bmask =   1 << (index & 31);
				bindex = index >> 5;
@@ -1430,6 +1497,7 @@ int setFramePars(int sensor_port, ///< sensor port number (0
				if (pars[npar].num & FRAMEPAIR_FORCE_PROC) {
					framepars[frame16].functions        |= funcs2call[index]; //Mark which functions will be needed to process the parameters
				}
	            dev_dbg(g_devfp_ptr, "{%d}:  framepars[%d].functions=0x%x\n", sensor_port, frame16, (int) framepars[frame16].functions);
// Write parameter to the next frames up to the one that have the same parameter already modified (only if not FRAMEPAIR_JUST_THIS)
				if ((pars[npar].num & FRAMEPAIR_JUST_THIS) == 0) {
//					MDF8(printk(":        ---   setting next frames"));
+2 −1
Original line number Diff line number Diff line
@@ -6,11 +6,11 @@
//extern struct framepars_t (*framepars)[PARS_FRAMES];
extern struct framepars_t      *aframepars[SENSOR_PORTS];
extern struct framepars_past_t *apastpars[SENSOR_PORTS];
extern struct common_pars_t    *common_pars;
extern unsigned long           *aglobalPars[SENSOR_PORTS];
extern unsigned long           *amultiSensIndex[SENSOR_PORTS];
extern unsigned long           *amultiSensRvrsIndex[SENSOR_PORTS];
extern wait_queue_head_t       aframepars_wait_queue[SENSOR_PORTS];

///TODO: init framepars (zero parameters) before initscripts (not when detecting the sensors) - then initscript will be able to overwrite some
void init_framepars_ptr(int sensor_port);
int  initSequencers    (int sensor_port); ///Move to sensorcommon? currently it is used through frameparsall file (lseek)
@@ -35,6 +35,7 @@ void set_imageParamsR_all(int sensor_port, int n, unsigned long d);
//Next 2 called from ISR
void          updateInterFrame(int sensor_port, u32 compressed_frame, struct interframe_params_t * interframe_pars);
void          updateFramePars     (int sensor_port, int frame16);
int           setFrameParStatic   (int sensor_port, unsigned long index, unsigned long val);
int           setFrameParsStatic  (int sensor_port, int numPars, struct frameparspair_t * pars);

unsigned long getThisFrameNumber  (int sensor_port); /// just return current thisFrameNumber
+7 −3
Original line number Diff line number Diff line
@@ -150,17 +150,21 @@ const unsigned long ahead_tab[]=
/// For Micron sensors limitfps should have the same latency as changing window height, otherwise when WOI_HEIGHT 0x3c0->0x790 and next frame VBLANK 0x13e->0x284
/// sensor waits till the counter overflows (>10 seconds) without any frame sync pulses
  onchange_limitfps,      0,    2,    1,    1,    1,   0, /// check compressor will keep up, limit sensor FPS if needed
  onchange_compmode,      0,    0,    1,    1,    1,   0, /// program compressor modes
///  onchange_compmode,      0,    0,    1,    1,    1,   0, /// program compressor modes
  onchange_compmode,      0,    0,    0,    0,    0,   0, /// program compressor modes
  onchange_focusmode,     1,    0,    0,    0,    0,   0, /// program focus modes (through writing the tables, so no sequencer)
//  onchange_trigseq,       0,    0,    0,    0,    0,   0, /// program sequencer (int/ext)
//  onchange_trigseq,       1,    0,    0,    0,    0,   0, /// program sequencer (int/ext) NOTE:needs >24 bit data, too much for sequencer
  onchange_trigseq,       1,    2,    1,    1,    1,   0, /// program sequencer (int/ext) NOTE:needs >24 bit data, too much for sequencer. Should be not later than onchange_triggermode and limitfps
//  onchange_trigseq,       1,    2,    1,    1,    1,   0, /// program sequencer (int/ext) NOTE:needs >24 bit data, too much for sequencer. Should be not later than onchange_triggermode and limitfps
  onchange_trigseq,       0,    2,    1,    1,    1,   0, /// NC393: OK to program through the sequencer (full 32 bits)

  onchange_irq,           0,    0,    0,    0,    0,   0, /// program smart IRQ mode
  onchange_comprestart,   0,    0,    0,    0,    0,   0, /// restart after changing geometry  (recognizes ASAP and programs memory channel 2 then)
/// onchange_compstop should have the same latency as onchange_window
// NC393 - triggered mode wants   onchange_compstop==2, while onchange_window == 1?
//  onchange_compstop,      0,    2,    1,    2,    1,   0, /// stop compressor when changing geometry
  onchange_compstop,      0,    2,    1,    1,    1,   0, /// stop compressor when changing geometry
///  onchange_compstop,      0,    2,    1,    1,    1,   0, /// stop compressor when changing geometry
  onchange_compstop,      0,    2,    2,    2,    2,   0, /// stop compressor when changing geometry
  onchange_compctl,       0,    0,    1,    1,    1,   0, /// only start/stop/single (after explicitly changed, not when geometry was changed)
//  onchange_gammaload,     1,    0,    0,    0,    0,   0, /// write gamma tables (should be prepared). Maybe - just last byte, to activate?
  onchange_gammaload,     1,    1,    1,    1,    1,   0, /// write gamma tables (should be prepared). Maybe - just last byte, to activate?
+19 −85
Original line number Diff line number Diff line
@@ -727,23 +727,6 @@ int mt9x001_pgm_detectsensor (int sensor_port, ///< sensor port
    // try MT9P001 first
    psensor= &mt9p001;

#ifdef NC353
    // set control lines
    CCAM_NEGRST;  ///set negative MRST polarity
    CCAM_TRIG_INT;
    CCAM_MRST_OFF;
    CCAM_ARST_OFF;
    udelay (100);
    local_irq_save(flags); // IRQ Off
    i2c_stop_wait();
    i2c_writeData(0, (psensor->i2c_addr) & 0xfe,  &chipver_reg, 1, 0); // no stop before read  (cxi2c.c)
    i2c_readData (0, (psensor->i2c_addr) | 1,     i2c_read_data, 2, 0); ///restart, not start  (cxi2c.c)
    local_irq_restore(flags); // IRQ restore
    if (((I2C_READ_DATA16(0) ^ MT9P001_PARTID) & MT9X001_PARTIDMASK)==0) {
        dev_dbg(g_dev_ptr,"Found MT9P001 2592x1944 sensor, chip ID=%x\n",(i2c_read_data[0]<<8)+i2c_read_data[1]);
        sensor_subtype=MT9P_TYP; //1;
    }
#else
    // set control lines
    sensio_ctl.mrst = 1;
    sensio_ctl.mrst_set = 1;
@@ -766,34 +749,11 @@ int mt9x001_pgm_detectsensor (int sensor_port, ///< sensor port
        dev_dbg(g_dev_ptr,"Found MT9P001 2592x1944 sensor, chip ID=%x\n",i2c_read_dataw);
        sensor_subtype=MT9P_TYP; //1;
    }
#endif
    //  dev_dbg(g_dev_ptr,"sensor id= 0x%x\n",i2c_read_data[0]);
    //  MDD1(dev_dbg(g_dev_ptr,"sensor=0x%x\n", (int)sensor));
    if (sensor_subtype ==0)  { // not a 5MPix chip
//        CCAM_ARST_ON; // Why was it here
        psensor= &mt9m001; //address the same for all others
#ifdef NC353
        local_irq_save(flags); // IRQ Off
        i2c_stop_wait();
        i2c_writeData(0, (psensor->i2c_addr) & 0xfe, &chipver_reg, 1, 0); // no stop before read
        i2c_readData (0, (psensor->i2c_addr) | 1,    i2c_read_data, 2, 0); //restart, not strart
        local_irq_restore(flags); // IRQ restore
        //    dev_dbg(g_dev_ptr,"-sensor id= 0x%x\n",i2c_read_data[0]);
        if (((I2C_READ_DATA16(0)^MT9M001_PARTID) & MT9X001_PARTIDMASK)==0) {
            dev_dbg(g_dev_ptr,"Found MT9M001 1280x1024 sensor, chip ID=%x\n",I2C_READ_DATA16(0));
            psensor= &mt9m001;
            sensor_subtype=MT9M_TYP; //1;
        } else if (((I2C_READ_DATA16(0)^MT9D001_PARTID) & MT9X001_PARTIDMASK)==0) {
            dev_dbg(g_dev_ptr,"Found MT9D001 1600x1200 sensor, chip ID=%x\n",I2C_READ_DATA16(0));
            psensor= &mt9d001;
            sensor_subtype=MT9D_TYP; //2;
        } else if (((I2C_READ_DATA16(0)^MT9T001_PARTID) & MT9X001_PARTIDMASK)==0) {
            dev_dbg(g_dev_ptr,"Found MT9T001 2048x1536 sensor, chip ID=%x\n",I2C_READ_DATA16(0));
            psensor= &mt9t001;
            sensor_subtype=MT9T_TYP; //3;
            //      if(d[2] == 0x01) - MT9T001 chip rev 01 - color gains had a bug
        }
#else
        X3X3_I2C_RCV2(sensor_port, psensor->i2c_addr, P_MT9X001_CHIPVER, &i2c_read_dataw);
        if (((i2c_read_dataw ^MT9M001_PARTID) & MT9X001_PARTIDMASK)==0) {
            dev_dbg(g_dev_ptr,"Found MT9M001 1280x1024 sensor, chip ID=%x\n",i2c_read_dataw);
@@ -811,7 +771,6 @@ int mt9x001_pgm_detectsensor (int sensor_port, ///< sensor port
        } else {
            dev_dbg(g_dev_ptr,"Found Unknown sensor, chip ID=%x\n",i2c_read_dataw);
        }
#endif
    }
    //  MDD1(dev_dbg(g_dev_ptr,"sensor=0x%x, sensor_subtype=0x%x\n", (int)sensor, (int)sensor_subtype));
    if (sensor_subtype ==0)   return 0;  // no sensor found
@@ -830,7 +789,9 @@ int mt9x001_pgm_detectsensor (int sensor_port, ///< sensor port
    add_sensor_proc(sensor_port,onchange_triggermode, &mt9x001_pgm_triggermode);  // program sensor trigger mode
    add_sensor_proc(sensor_port,onchange_sensorregs,  &mt9x001_pgm_sensorregs);   // write sensor registers (only changed from outside the driver as they may have different latencies)?
    //  MDD1(dev_dbg(g_dev_ptr,"sensor->sensorType=0x%lx\n", sensor->sensorType));
    setFramePar(sensor_port, thispars, P_SENSOR,  sensor->sensorType); // was so
    setFramePar(sensor_port, thispars, P_SENSOR,  sensor->sensorType); // should cause other actions
//    setFrameParStatic   (sensor_port, P_SENSOR,  sensor->sensorType);
    common_pars->sensors[sensor_port] =  sensor->sensorType;
    //  setFramePar(thispars, P_SENSOR  | FRAMEPAIR_FORCE_NEWPROC,  sensor->sensorType); // force actions
    //  MDD1(dev_dbg(g_dev_ptr,"\n"));
    ///TODO: Fill G_MULTI_REGSM+i - which registers need individual values in multi-sensor applications
@@ -888,7 +849,8 @@ int mt9x001_pgm_initsensor (int sensor_port, ///< sensor port
                                                               ///< @return 0 - OK, negative - error
{
//    unsigned long flags; // this function uses software i2c operations - they need to have interrupts (and hardware i2c off)
    struct frameparspair_t pars_to_update[258+(MAX_SENSORS * P_MULTI_NUMREGS )]; // for all the sensor registers. Other P_* values will reuse the same ones
//    struct frameparspair_t pars_to_update[258+(MAX_SENSORS * P_MULTI_NUMREGS )]; // for all the sensor registers. Other P_* values will reuse the same ones
    struct frameparspair_t pars_to_update[262+(MAX_SENSORS * P_MULTI_NUMREGS )]; // for all the sensor registers. Other P_* values will reuse the same ones
    int first_sensor_i2c;
    unsigned short * sensor_register_overwrites;
    x393_sensio_ctl_t sensio_ctl = {.d32=0};
@@ -902,36 +864,6 @@ int mt9x001_pgm_initsensor (int sensor_port, ///< sensor port
    dev_dbg(g_dev_ptr,"{%d}  frame16=%d\n",sensor_port,frame16);
    if (frame16 >= 0) return -1; // should be ASAP
    // reset sensor by applying MRST (low):
#ifdef NC353
    CCAM_MRST_ON;
    udelay (100);
    CCAM_MRST_OFF;
    udelay (100);
    dev_dbg(g_dev_ptr,"Reading sensor registers to the shadows:\n");
    first_sensor_i2c=sensor->i2c_addr;
    if (GLOBALPARS(sensor_port, G_SENS_AVAIL)) {
        first_sensor_i2c+= I2C359_INC * ((GLOBALPARS(sensor_port, G_SENS_AVAIL) & 1)?1:((GLOBALPARS(sensor_port, G_SENS_AVAIL) & 2)?2:3));
    }
    i2c_read_data[0]=0;
    local_irq_save(flags); // IRQ Off (rather long - all 256 registers through i2c, but there is no hurry - sensor is off)
    i2c_stop_wait();
    //G_SENS_AVAIL
    i2c_writeData(0, (first_sensor_i2c) & 0xfe,  i2c_read_data, 1, 0);   // data (register #) is 0. no stop before read  (cxi2c.c)
    i2c_readData (0, (first_sensor_i2c) | 1,     i2c_read_data, 512, 0); // read all 256 registers (512 bytes) restart, not strart  (cxi2c.c)
    local_irq_restore(flags); // IRQ restore
    // save these registers as shadows and propagate

    nupdate=0;
    // For multiple sensors will use shadows from first one. Change?
    for (i=0; i<256; i++) { // possible to modify register range to save (that is why nupdate is separate from i)
        regval=I2C_READ_DATA16(i);
        regnum=P_SENSOR_REGS+i;
        SETFRAMEPARS_SET(regnum,regval);
        if ((mreg=MULTIREG(regnum,0))) for (j=0;j<MAX_SENSORS; j++) {
            SETFRAMEPARS_SET(mreg+j,regval);
        }
    }
#else
//    CCAM_MRST_ON;
    if (debug_delays & 0xff) {
        dev_dbg(g_dev_ptr,"Resetting MT9X001 sensor, port=%d\n",sensor_port);
@@ -970,8 +902,12 @@ int mt9x001_pgm_initsensor (int sensor_port, ///< sensor port
        sensor_reg_copy[sensor_port][i] = i2c_read_data_dw[i];
    }

#endif
    if (nupdate)  setFramePars(sensor_port,thispars, nupdate, pars_to_update);  // save changes to sensor register shadows

//    if (nupdate)  setFramePars(sensor_port,thispars, nupdate, pars_to_update);  // save changes to sensor register shadows
    if (nupdate)  setFrameParsStatic(sensor_port, nupdate, pars_to_update);  // save changes to sensor register shadows for all frames



    dev_dbg(g_dev_ptr,"Initializing MT9X001 registers with default values:\n");
    sensor_subtype=sensor->sensorType  - SENSOR_MT9X001;
    switch (sensor_subtype) {
@@ -995,20 +931,16 @@ int mt9x001_pgm_initsensor (int sensor_port, ///< sensor port
    }
    //  enable hardware i2c - NOTE: the only place where the i2c controller is enabled.
//    dev_dbg(g_dev_ptr,"Starting hardware sequencers\n");
#ifdef NC353
    local_irq_save(flags); // IRQ Off, so both sequencers to be started at the same time
    i2c_run();
    X3X3_SEQ_RUN;
    local_irq_restore(flags); // IRQ restore
#else
#endif
    nupdate=0;  // Second pass over the registers to set
//#define SET_SENSOR_MBPAR(p,f,s,r,v)



    for (i=0; i<sensor_register_overwrites_number;i++ ) { // unconditionally set those registers NOTE: Should be < 63 of them!
        SET_SENSOR_MBPAR(sensor_port,
                         frame16,
                         frame16, // == -1 (immediate)
                         sensor->i2c_addr,
                         sensor_register_overwrites[2*i],\
                         sensor_register_overwrites[2*i],
                         sensor_register_overwrites[2*i+1]);
        dev_dbg(g_dev_ptr,"{%d}   SET_SENSOR_MBPAR(0x%x,0x%x,0x%x, 0x%x, 0x%x)\n",sensor_port, sensor_port, frame16,  (int) sensor->i2c_addr, (int) sensor_register_overwrites[2*i], (int) sensor_register_overwrites[2*i+1]);

@@ -1390,6 +1322,8 @@ int mt9x001_pgm_limitfps (int sensor_port, ///< sensor port numb
        SETFRAMEPARS_SET(P_PERIOD, pix_period);
    }
    // Update period from external trigger (assuming internal/self trigger, we do not know real external trigger period)
    dev_dbg(g_dev_ptr,"{%d} thispars->pars[P_TRIG] = %d, thispars->pars[P_TRIG_PERIOD] =%d(0x%x)\n",
            sensor_port,(int)thispars->pars[P_TRIG], (int)thispars->pars[P_TRIG_PERIOD], (int)thispars->pars[P_TRIG_PERIOD]);
    if (thispars->pars[P_TRIG]!=0){
        trig_period = camsync_to_sensor(thispars->pars[P_TRIG_PERIOD], thispars->pars[P_CLK_SENSOR]);
        if (trig_period > pix_period)  pix_period=trig_period;
@@ -1991,7 +1925,7 @@ int mt9x001_pgm_triggermode (int sensor_port, ///< sensor p
    unsigned long newreg;
    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
    newreg= (thispars->pars[P_SENSOR_REGS+P_MT9X001_RMODE1] & 0xfe7f) | // old value without snapshot and GRR bits
            ((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]) {
+2 −0
Original line number Diff line number Diff line
@@ -1030,6 +1030,7 @@ int multisensor_pgm_detectsensor (int sensor_port, ///< sensor p
  if ((((bitstream_version ^ I2C359_MINVERSION) & 0xffff0000)!=0) || ((bitstream_version & 0xffff) < (I2C359_MINVERSION & 0xffff))) {
      dev_err(g_dev_ptr,"invalid 10359 bitstream version, found 0x%08lx, required >= 0x%08x\n",bitstream_version, I2C359_MINVERSION );
    setFramePar(sensor_port, thispars, P_SENSOR,  sensor->sensorType);
    common_pars->sensors[sensor_port] =  sensor->sensorType;
    return -1;
  }
  dev_dbg(g_dev_ptr,"10359 bitstream version =0x%08lx\n",bitstream_version);
@@ -1129,6 +1130,7 @@ int multisensor_pgm_detectsensor (int sensor_port, ///< sensor p
  if (GLOBALPARS(sensor_port,G_SENS_AVAIL)==0) {
      dev_warn(g_dev_ptr,"No supported sensors connected to 10359A board\n");
    setFramePar(sensor_port, thispars, P_SENSOR,  sensor->sensorType);
    common_pars->sensors[sensor_port] =  sensor->sensorType;
    if (nupdate)  setFramePars(sensor_port,thispars, nupdate, pars_to_update);  // save changes to sensor register shadows
    return 0;
  }
Loading