Commit 53ff55a4 authored by Oleg Dzhimiev's avatar Oleg Dzhimiev
Browse files

Fixed mux board programming sensors via broadcast address. Testing

parent 3db94829
Loading
Loading
Loading
Loading
+34 −15
Original line number Diff line number Diff line
@@ -436,10 +436,7 @@ static int par2addr_fill(const unsigned short *par2addr, u32 *table){
 *   the specified sensor
 * @return 0
 */
static int par2addr_init(void){

	int port;
	int sub_chn;
int detect_sensors_par2addr_init(int port,int sub_chn){

	const unsigned short *par2addr;
	const unsigned short *pages;
@@ -453,23 +450,43 @@ static int par2addr_init(void){
	};
	*/

	switch (sensorPortConfig[port].sensor[sub_chn]) {
		case SENSOR_MT9P006:
			// get sensor table
			par2addr = mt9x001_par2addr;
			pages    = mt9x001_pages;
			break;
		case SENSOR_MT9F002:
			// get sensor table
			par2addr = mt9f002_par2addr;
			pages    = mt9f002_pages;
			break;
	}
	if (par2addr){
		// convert to key-value
		par2addr_fill(par2addr,sensorPortConfig[port].par2addr[sub_chn]);
		// save pointer to static LUT
		sensorPortConfig[port].pages_ptr[sub_chn] = pages;
	}

	/*
	// all .mux and .sensor are already filled out
	for (port = 0; port < SENSOR_PORTS; port++){
	for (portx = 0; portx < SENSOR_PORTS; portx++){

		// that's from device tree, fpga is not programmed yet
		dev_dbg(g_dev_ptr,"port: %d mux: %d sensors: %d %d %d %d\n",
				port,
				sensorPortConfig[port].mux,
				sensorPortConfig[port].sensor[0],
				sensorPortConfig[port].sensor[1],
				sensorPortConfig[port].sensor[2],
				sensorPortConfig[port].sensor[3]
				portx,
				sensorPortConfig[portx].mux,
				sensorPortConfig[portx].sensor[0],
				sensorPortConfig[portx].sensor[1],
				sensorPortConfig[portx].sensor[2],
				sensorPortConfig[portx].sensor[3]
				);

		// sub_chn = 3 is never used
		for (sub_chn = 0; sub_chn < 4; sub_chn++){
			//sensorPortConfig[port].sensor[sub_chn];
			switch (sensorPortConfig[port].sensor[sub_chn]) {
			switch (sensorPortConfig[portx].sensor[sub_chn]) {
				case SENSOR_MT9P006:
					// get sensor table
					par2addr = mt9x001_par2addr;
@@ -483,12 +500,13 @@ static int par2addr_init(void){
			}
			if (par2addr){
				// convert to key-value
				par2addr_fill(par2addr,sensorPortConfig[port].par2addr[sub_chn]);
				par2addr_fill(par2addr,sensorPortConfig[portx].par2addr[sub_chn]);
				// save pointer to static LUT
				sensorPortConfig[port].pages_ptr[sub_chn] = pages;
				sensorPortConfig[portx].pages_ptr[sub_chn] = pages;
			}
		}
	}
	*/

	return 0;
}
@@ -515,7 +533,8 @@ static int par2addr_init(void){

     detect_sensors_init_of(pdev);

     par2addr_init();
     // move this fucntion to a later stage, right before fpga pages get allocated (pgm_functions.c)
     //detect_sensors_par2addr_init();

     //    dev_dbg(dev, "Registering character device with name "DEV393_NAME(DEV393_DETECT_SENSORS));
     //    res = register_chrdev(DETECT_SENSORS_MAJOR, DEV393_NAME(DEV393_DETECT_SENSORS), &detect_sensors_fops);
+1 −0
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ typedef enum {NONE,PARALLEL12,HISPI4} sens_iface_t; ///< Sensor port interface t
int          get_code_by_name(const char * name, int type);
const char * get_name_by_code(int code, int type);
sens_iface_t get_iface_by_code(int code, int type);
int detect_sensors_par2addr_init(int port, int sub_chn);

int get_detected_mux_code(int port);
int set_broadcast_address(int port,int value);
+3 −0
Original line number Diff line number Diff line
@@ -806,6 +806,7 @@ int mt9x001_pgm_detectsensor (int sensor_port, ///< sensor port
    dc = xi2c_dev_get(name);
    if (dc){
    	dev_dbg(g_dev_ptr,"{%d} setting i2c_addr to 0x%02x\n",sensor_port,dc->slave7);
    	//pr_info("{%d} Setting i2c_addr to 0x%02x\n",sensor_port,dc->slave7);
        psensor->i2c_addr = dc->slave7;
    }

@@ -827,8 +828,10 @@ int mt9x001_pgm_detectsensor (int sensor_port, ///< sensor port
    udelay(50); // is it needed?
    X3X3_I2C_RCV2(sensor_port, psensor->i2c_addr, P_MT9X001_CHIPVER, &i2c_read_dataw);
    dev_dbg(g_dev_ptr,"Read i2c (port = %d, sa7=0x%lx, reg=0x%x) chip ID=%x\n",sensor_port, psensor->i2c_addr, P_MT9X001_CHIPVER, i2c_read_dataw);
    //pr_info("Read i2c (port = %d, sa7=0x%lx, reg=0x%x) chip ID=%x\n",sensor_port, psensor->i2c_addr, P_MT9X001_CHIPVER, i2c_read_dataw);
    if (((i2c_read_dataw ^ MT9P001_PARTID) & MT9X001_PARTIDMASK)==0) {
        dev_dbg(g_dev_ptr,"Found MT9P001 2592x1944 sensor, chip ID=%x\n",i2c_read_dataw);
        //pr_info("Found MT9P001 2592x1944 sensor, chip ID=%x\n",i2c_read_dataw);
        sensor_subtype=MT9P_TYP; //1;
    }
    //  dev_dbg(g_dev_ptr,"sensor id= 0x%x\n",i2c_read_data[0]);
+10 −9
Original line number Diff line number Diff line
@@ -754,19 +754,19 @@ if (GLOBALPARS(sensor_port, G_MULTI_CFG) & (1 <<G_MULTI_CFG_BEFORE)) {
  dev_dbg(g_dev_ptr,"selected=%x, thispars->pars[P_MULTI_SELECTED]=%x composite=%x sequence=%x\n", selected, (int) thispars->pars[P_MULTI_SELECTED], composite, sequence);

  if ((ww-1) != thispars->pars[P_SENSOR_REGS+P_MT9X001_WIDTH]) {
     SET_SENSOR_MBPAR(sensor_port, frame16, sensor->i2c_addr, P_MT9X001_WIDTH, ww-1);
     SET_SENSOR_MBPAR_LUT(sensor_port, frame16, P_MT9X001_WIDTH, ww-1);
     dev_dbg(g_dev_ptr,"SET_SENSOR_MBPAR(0x%x,0x%x, 0x%x, 0x%x)\n", frame16,  (int) sensor->i2c_addr, (int) P_MT9X001_WIDTH, (int) ww-1);
  }
// Program binning/decimation (also common but some older sensors)
  if((styp == MT9T_TYP) || (styp == MT9P_TYP)) { // 3MPix and 5MPix sensors
     v= (thispars->pars[P_SENSOR_REGS+P_MT9X001_RAM] & 0xff88) | ((bv - 1) << 4) | (dv - 1) ;
     if (v != thispars->pars[P_SENSOR_REGS+P_MT9X001_RAM]) {
        SET_SENSOR_PAR(sensor_port, frame16,sensor->i2c_addr, P_MT9X001_RAM, v);
        SET_SENSOR_PAR_LUT(sensor_port, frame16, P_MT9X001_RAM, v);
        dev_dbg(g_dev_ptr,"SET_SENSOR_PAR(0x%x,0x%x, 0x%x, 0x%x)\n", frame16,  (int) sensor->i2c_addr, (int) P_MT9X001_RAM, (int) v);
     }
     v=(thispars->pars[P_SENSOR_REGS+P_MT9X001_CAM] & 0xff88) | ((bh - 1) << 4) | (dh - 1);
     if (v != thispars->pars[P_SENSOR_REGS+P_MT9X001_CAM]) {
        SET_SENSOR_PAR(sensor_port, frame16,sensor->i2c_addr, P_MT9X001_CAM, v);
        SET_SENSOR_PAR_LUT(sensor_port, frame16, P_MT9X001_CAM, v);
        dev_dbg(g_dev_ptr,"SET_SENSOR_PAR(0x%x,0x%x, 0x%x, 0x%x)\n", frame16,  (int) sensor->i2c_addr, (int) P_MT9X001_CAM, (int) v);
     }
  } else { // 1.3 and 2 MPix sensors
@@ -776,7 +776,7 @@ if (GLOBALPARS(sensor_port, G_MULTI_CFG) & (1 <<G_MULTI_CFG_BEFORE)) {
         ((dh == 8) ? (1 << 4) : 0) | // Column skip 8
         ((dv == 8) ? (1 << 5) : 0) ; // Row skip    8
     if (v != thispars->pars[P_SENSOR_REGS+P_MT9X001_RMODE1]) {
        SET_SENSOR_MBPAR(sensor_port,frame16,sensor->i2c_addr, P_MT9X001_RMODE1, v);
        SET_SENSOR_MBPAR_LUT(sensor_port,frame16, P_MT9X001_RMODE1, v);
        dev_dbg(g_dev_ptr,"SET_SENSOR_MBPAR(0x%x,0x%x, 0x%x, 0x%x)\n", frame16,  (int) sensor->i2c_addr, (int) P_MT9X001_RMODE1, (int) v);
     }
   }
@@ -788,24 +788,24 @@ if (GLOBALPARS(sensor_port, G_MULTI_CFG) & (1 <<G_MULTI_CFG_BEFORE)) {
     wt=sensor_wt(wois[(P_MULTI_TOP1-   P_MULTI_WOI)+SENSOR_IN_SEQ(i,sequence)], wh, sFlipY[i], dv,     thispars->pars[P_OVERSIZE], sensor);

// program sensor height
     SET_SENSOR_MIBPAR_COND(sensor_port,frame16,sensor->i2c_addr, i, P_MT9X001_HEIGHT, wh-1);
     SET_SENSOR_MIBPAR_COND_LUT(sensor_port,frame16, i, P_MT9X001_HEIGHT, wh-1);
// Program sensor left margin
     SET_SENSOR_MIBPAR_COND(sensor_port,frame16,sensor->i2c_addr, i, P_MT9X001_COLSTART, wl);
     SET_SENSOR_MIBPAR_COND_LUT(sensor_port,frame16, i, P_MT9X001_COLSTART, wl);
// Program sensor top margin
       SET_SENSOR_MIBPAR_COND(sensor_port,frame16,sensor->i2c_addr, i, P_MT9X001_ROWSTART, wt);
     SET_SENSOR_MIBPAR_COND_LUT(sensor_port,frame16, i, P_MT9X001_ROWSTART, wt);

     if((styp == MT9T_TYP) || (styp == MT9P_TYP)) { // 3MPix and 5MPix sensors
       v= (thispars->pars[P_SENSOR_REGS+P_MT9X001_RMODE2] & 0x3fff) | // preserve other bits from shadows
           (sFlipX[i] ? (1 << 14) : 0) | // FLIPH - will control just alternative rows
           (sFlipY[i] ? (1 << 15) : 0) ; // FLIPV
       SET_SENSOR_MIBPAR_COND(sensor_port,frame16,sensor->i2c_addr, i, P_MT9X001_RMODE2, v);
       SET_SENSOR_MIBPAR_COND_LUT(sensor_port,frame16, i, P_MT9X001_RMODE2, v);
     } else { // 1.3 and 2 MPix sensors
       v=  (thispars->pars[P_SENSOR_REGS+P_MT9X001_RMODE2] & 0x3fe7) | // preserve other bits from shadows
           ((dh == 2) ? (1 << 3) : 0) | // Column skip 2
           ((dv == 2) ? (1 << 4) : 0) | // Row skip    2
           (sFlipX[i] ? (1 << 14) : 0) | // FLIPH - will control just alternative rows
           (sFlipY[i] ? (1 << 15) : 0) ; // FLIPV
       SET_SENSOR_MIBPAR_COND(sensor_port,frame16,sensor->i2c_addr, i, P_MT9X001_RMODE2, v);
       SET_SENSOR_MIBPAR_COND_LUT(sensor_port,frame16, i, P_MT9X001_RMODE2, v);
     }
   }
  if (!(GLOBALPARS(sensor_port, G_MULTI_CFG) & (1 <<G_MULTI_CFG_BEFORE))) {  // try after sensors
@@ -1120,6 +1120,7 @@ int multisensor_pgm_detectsensor (int sensor_port, ///< sensor p
                                &sensor_id[i],
                                2);
#else
    // do not forget when updated read macro
    rslt=  X3X3_I2C_RCV2 (sensor_port,
                          MT9P001_I2C_ADDR + ((i+1) * I2C359_INC),
                          P_MT9X001_CHIPVER,
+2 −2
Original line number Diff line number Diff line
@@ -100,10 +100,10 @@ extern struct sensor_port_config_t *pSensorPortConfig;
 * @param data  value to set (16 bits)
 */
#define SET_SENSOR_PAR_LUT(port,frame,reg,data) {\
	int _I = pSensorPortConfig[(port)].broadcast_addr;\
	int _ADDR = pSensorPortConfig[(port)].par2addr[_I][(reg)];\
	pars_to_update[nupdate  ].num= P_SENSOR_REGS+(reg);\
    pars_to_update[nupdate++].val=(data);\
    int _I = 0;\
    int _ADDR = pSensorPortConfig[(port)].par2addr[_I][(reg)];\
    if (!(_ADDR&0xffff0000)) {\
    	X3X3_I2C_SEND2_LUT((port),(frame), _I, _ADDR, (data));\
    }\
Loading