Loading src/arch/arm/boot/dts/elphel393_eyesis.dts +11 −4 Original line number Diff line number Diff line Loading @@ -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"; } ; Loading @@ -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>; Loading src/drivers/elphel/clock10359.c +42 −18 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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++) { Loading @@ -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), Loading @@ -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), Loading @@ -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 Loading @@ -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 Loading @@ -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) ®_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); Loading Loading @@ -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 Loading @@ -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); Loading Loading @@ -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"); Loading src/drivers/elphel/mt9x001.c +1 −1 Original line number Diff line number Diff line Loading @@ -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; Loading src/drivers/elphel/multi10359.c +276 −217 File changed.Preview size limit exceeded, changes collapsed. Show changes src/drivers/elphel/multi10359.h +1 −1 Original line number Diff line number Diff line Loading @@ -51,7 +51,7 @@ //#define I2C359_I2CMUX 0x07 // #define I2C359_I2CMUX_2MEM 0x1 // #define I2C359_I2CMUX_2SENSORS 0x0 #define I2C359_CLKSRC 0x08 ///< register address: clock source #define I2C359_CLKSRC 0x08 ///< register address: clock source // does not read back #define I2C359_CLKSRC_SYSTEM 0x00 ///< clock source: system (from the system board over) #define I2C359_CLKSRC_LOCAL 0x01 ///< clock source: local (clock generator on the 10359 board #define I2C359_MODE 0x09 ///< register address: mode register Loading Loading
src/arch/arm/boot/dts/elphel393_eyesis.dts +11 −4 Original line number Diff line number Diff line Loading @@ -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"; } ; Loading @@ -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>; Loading
src/drivers/elphel/clock10359.c +42 −18 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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++) { Loading @@ -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), Loading @@ -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), Loading @@ -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 Loading @@ -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 Loading @@ -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) ®_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); Loading Loading @@ -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 Loading @@ -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); Loading Loading @@ -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"); Loading
src/drivers/elphel/mt9x001.c +1 −1 Original line number Diff line number Diff line Loading @@ -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; Loading
src/drivers/elphel/multi10359.c +276 −217 File changed.Preview size limit exceeded, changes collapsed. Show changes
src/drivers/elphel/multi10359.h +1 −1 Original line number Diff line number Diff line Loading @@ -51,7 +51,7 @@ //#define I2C359_I2CMUX 0x07 // #define I2C359_I2CMUX_2MEM 0x1 // #define I2C359_I2CMUX_2SENSORS 0x0 #define I2C359_CLKSRC 0x08 ///< register address: clock source #define I2C359_CLKSRC 0x08 ///< register address: clock source // does not read back #define I2C359_CLKSRC_SYSTEM 0x00 ///< clock source: system (from the system board over) #define I2C359_CLKSRC_LOCAL 0x01 ///< clock source: local (clock generator on the 10359 board #define I2C359_MODE 0x09 ///< register address: mode register Loading