Commit 6405f029 authored by Andrey Filippov's avatar Andrey Filippov

debugging Boson driver, other warnings cleanup

parent 384c0d4b
......@@ -278,8 +278,8 @@
"sensor_temp 0x18 1 2 100",
"cy22393 0x69 1 1 100",
"lepton35 0x2a 2 2 500",
/*Update elphel393-sensor-i2c to support uart instead of the i2c */
"boson640 0x2a 2 2 500";
/*Update elphel393-sensor-i2c to support uart instead of the i2c. 0x81 - 80 - extif/!i2c, 1 - extif mode,rah:2lsbs - bytes */
"boson640 0x81 2 2 500";
} ;
framepars_operations: elphel393-framepars@0 {
compatible = "elphel,elphel393-framepars-1.00";
......
......@@ -28,6 +28,7 @@ obj-$(CONFIG_ELPHEL393) += pgm_functions.o
obj-$(CONFIG_ELPHEL393) += mt9x001.o
obj-$(CONFIG_ELPHEL393) += mt9f002.o
obj-$(CONFIG_ELPHEL393) += lepton.o
obj-$(CONFIG_ELPHEL393) += boson640.o
obj-$(CONFIG_ELPHEL393) += multi10359.o
obj-$(CONFIG_ELPHEL393) += imu_log393.o
......
This diff is collapsed.
This diff is collapsed.
......@@ -489,9 +489,9 @@ int detect_sensors_par2addr_init(int port,int sub_chn){
break;
case SENSOR_BOSON640: // temporary, set later to actual one
dev_warn(g_dev_ptr,"FIX temporary data in detect_sensors for Boson640\n");
par2addr = lepton_par2addr;
pages = lepton_pages;
atab = lepton_ahead_tab;
par2addr = boson640_par2addr;
pages = boson640_pages;
atab = boson640_ahead_tab;
break;
}
if (par2addr){
......
......@@ -4,6 +4,7 @@
#ifndef _JPEGHEAD
#define _JPEGHEAD
#include <linux/platform_device.h>
struct huffman_fpga_code_t {
unsigned short value; /// code value
......
......@@ -159,6 +159,10 @@ const unsigned long param_depend_tab[]=
P_SENSOR, ONCHANGE_DETECTSENSOR | ONCHANGE_RECALCSEQ | ONCHANGE_INITSENSOR | ONCHANGE_AFTERINIT | ONCHANGE_MULTISENS | \
ONCHANGE_WINDOW | ONCHANGE_EXPOSURE | ONCHANGE_HIST | ONCHANGE_AEXP | ONCHANGE_FOCUSMODE | ONCHANGE_LIMITFPS | ONCHANGE_HIST | \
ONCHANGE_MEMSENSOR | ONCHANGE_MEMCOMPRESSOR | ONCHANGE_COMPMODE | ONCHANGE_COMPSTOP | ONCHANGE_COMPRESTART ,
P_BOOTED, ONCHANGE_RECALCSEQ | ONCHANGE_INITSENSOR | ONCHANGE_AFTERINIT | ONCHANGE_MULTISENS | \
ONCHANGE_WINDOW | ONCHANGE_EXPOSURE | ONCHANGE_HIST | ONCHANGE_AEXP | ONCHANGE_FOCUSMODE | ONCHANGE_LIMITFPS | ONCHANGE_HIST | \
ONCHANGE_MEMSENSOR | ONCHANGE_MEMCOMPRESSOR | ONCHANGE_COMPMODE | ONCHANGE_COMPSTOP | ONCHANGE_COMPRESTART ,
P_BAYER , ONCHANGE_SENSORIN, // | ONCHANGE_COMPMODE , // ONCHANGE_COMPMODE added for NC393
P_CLK_FPGA, ONCHANGE_I2C | ONCHANGE_LIMITFPS | ONCHANGE_HIST | \
ONCHANGE_MEMSENSOR | ONCHANGE_MEMCOMPRESSOR | ONCHANGE_COMPMODE | ONCHANGE_COMPSTOP | ONCHANGE_COMPRESTART ,
......
This diff is collapsed.
......@@ -62,7 +62,7 @@ unsigned long sensor_to_camsync(unsigned long pixel_time, unsigned long sensor_c
* @param p parameter index (all high bits/attributes will be removed, only 12 LSBs preserved)
* @param v parameter value(32 bits) */
#define SETFRAMEPARS_UPDATE_SET(p,v) { pars_to_update[nupdate ].num= (p) ; pars_to_update[nupdate++].val=thispars->pars[(p) & 0xffff]?thispars->pars[(p) & 0xffff]:(v);}
/** Adds new parameter/value pair to the modification queue only if it is different from tghe current
/** Adds new parameter/value pair to the modification queue only if it is different from the current
* @param p parameter index (all high bits/attributes will be removed, only 12 LSBs preserved)
* @param v parameter value(32 bits) */
#define SETFRAMEPARS_COND(p,v) { if (unlikely((v)!=thispars->pars[(p) & 0xffff])) { pars_to_update[nupdate ].num= (p) ; pars_to_update[nupdate++].val=(v);} }
......@@ -99,6 +99,7 @@ extern struct sensor_port_config_t *pSensorPortConfig;
* @param reg sensor register address (8-bit)
* @param data value to set (16 bits)
*/
// is _ADDR&0xffff0000 for Lepton?
#define SET_SENSOR_PAR_LUT(port,frame,reg,data) {\
int _I = pSensorPortConfig[(port)].broadcast_addr;\
int _ADDR = pSensorPortConfig[(port)].par2addr[_I][(reg)];\
......
/// @file quantization_tables.h
#ifndef _QUANTIZATION_TABLES_H
#define _QUANTIZATION_TABLES_H
#include <linux/platform_device.h>
/** @brief Quantization tables cache usage policy */
enum {
// @brief Use common cache for all compressors
......
......@@ -6,6 +6,7 @@
#define _SENSOR_COMMON_H
#include "detect_sensors.h"
#include <linux/platform_device.h>
//extern struct sensor_t sensor; // current sensor (will be copied to by sensor driver), made external for the cc353.c to read/write i2c
extern struct sensorproc_t * asensorproc;
......@@ -98,6 +99,7 @@ long long get_frame_pos(unsigned int chn, unsigned int pos);
#define name_mt9p006 "mt9p006" // Get name from DT (together with port mask)
#define name_mt9f002 "mt9f002" // Get name from DT (together with port mask)
#define name_lepton35 "lepton35" // Get name from DT (together with port mask)
#define name_boson640 "boson640" // Get name from DT (together with port mask)
#define I2C359_INC 2 ///< slave address increment between sensors in 10359A board (broadcast, 1,2,3) (7 bits SA)
......@@ -115,15 +117,15 @@ long long get_frame_pos(unsigned int chn, unsigned int pos);
write_xi2c_reg16_abs_asap((port),(sa7),(frame),(reg),(data));\
}
/** Perform I2C write (8 bits address, 16 bits data in "legacy" mode,
* pages matching slave address should be registered.
/** Perform I2C write (8/16 bits address, 16 bits data in LUT mode,
* pages matching MSB(reg) should be registered.
*
* TODO: Add registering single sensors as in multi10359. Registering twice is OK.
* Slave address is now 7-bit,old was 8-bit, change (10359 already done)
* @param port - sensor port
* @param frame Frame number to apply, <0 - ASAP
* @param si - slave device index (for mux board)
* @param reg sensor register address (16-bit)
* @param reg sensor register address (16-bit, high byte uses tables)
* @param data value to set (16 bits) */
//int _ADDR = pSensorPortConfig[(port)].par2addr[si][(reg)];
......@@ -139,7 +141,7 @@ long long get_frame_pos(unsigned int chn, unsigned int pos);
*
* Slave address is now 7-bit,old was 8-bit, change (10359 already done)
* @param port - sensor port
* @param sa7 I2C slave address, 7 bit
* @param sa7 I2C slave address, 7 bit: NOT used
* @param reg sensor register address (8-bit)
* @param data value to set (16 bits) */
#define X3X3_I2C_SEND2_ASAP(port,sa7,reg,data) {\
......@@ -149,13 +151,13 @@ long long get_frame_pos(unsigned int chn, unsigned int pos);
}
/** Perform I2C write in immediate mode (8 bits address, 16 bits data in "legacy" mode,
* pages matching slave address should be registered.
/** Perform I2C write in immediate mode (16 bits address, 16 bits data in LUT mode,
* pages matching MSB of the address should be registered.
*
* Slave address is now 7-bit,old was 8-bit, change (10359 already done)
* @param port - sensor port
* @param si - slave device index (for mux board)
* @param reg sensor register address (8-bit)
* @param si - slave device index (for mux board, otherwise 0)
* @param reg sensor register address (16-bit)
* @param data value to set (16 bits) */
#define X3X3_I2C_SEND2_LUT_ASAP(port,si,reg,data) {\
int _PAGE = pSensorPortConfig[(port)].haddr2rec[(si)][((reg)>>8)&0xff];\
......
......@@ -392,7 +392,13 @@ void set_xi2c_wrc( x393_i2c_device_t * dc, ///< device class
tb_data.nbwr = dc -> address_bytes + dc -> data_bytes;
tb_data.dly = get_bit_delay(dc -> scl_khz);
tb_data.tbl_mode = 2;
dev_dbg(sdev, "device name %s : port= %d, page = 0x%x, rah = 0x%x\n",dc->name, chn, page,rah);
tb_data.extif_mode = 0;
if (tb_data.sa & 0x80){ // using external interface (currently Boson640 UART)
tb_data.extif_mode = tb_data.sa & 3;
tb_data.sa = (tb_data.rah >> 6) & 3; // number of bytes in uart command (later use (rah >> 8) after changing sensor_port_config_t.pages_ptr to 32 bits)
tb_data.rah &= 0x3f; // later &= 0xff
}
dev_dbg(sdev, "device name %s : port= %d, page = 0x%x, rah = 0x%x, sa = 0x%x, extif_mode=0x%x\n",dc->name, chn, page, tb_data.rah, tb_data.sa, tb_data.extif_mode);
/* Table address and data should not interleave with others */
#ifdef LOCK_BH_SENSORI2C
spin_lock_bh(sensori2c_locks[chn]);
......@@ -408,7 +414,7 @@ void set_xi2c_wrc( x393_i2c_device_t * dc, ///< device class
#endif
// i2c_pages_shadow[(chn << 8) + page] =tb_data.d32;
i2c_pages_shadow[chn][page] =tb_data.d32;
dev_dbg(sdev, "DONE: device name %s : port= %d, page = 0x%x, rah = 0x%x\n",dc->name, chn, page,rah);
dev_dbg(sdev, "DONE: device name %s : port= %d, page = 0x%x, rah = 0x%x, sa = 0x%x, extif_mode=0x%x\n",dc->name, chn, page, tb_data.rah, tb_data.sa, tb_data.extif_mode);
}
EXPORT_SYMBOL_GPL(set_xi2c_wrc);
/** Set i2c table entry for read operation using known devices
......@@ -716,6 +722,10 @@ void read_xi2c (x393_i2c_device_t * dc, ///< device class
int page, ///< Table index (8 bits)
int addr) ///< 8/16 bit register address
{
if ((dc -> slave7) & 0x80){
dev_warn(sdev, "Read not implemented for extif");
return;
}
u32 dw = ((page & 0xff) << 24) | (dc -> slave7 << 17) | (addr & 0xffff);
x393_sensi2c_rel (dw, chn, 0);
dev_dbg(sdev, "chn=%d, page = %d, addr = %d\n",chn,page, addr);
......@@ -732,6 +742,10 @@ void read_xi2c_sa7 (int chn, ///< sensor port
int sa7, ///< 7-bit i2c slave address
int addr) ///< 8/16 bit register address
{
if (sa7 & 0x80){
dev_warn(sdev, "Read not implemented for extif 2");
return;
}
u32 dw = ((page & 0xff) << 24) | (sa7 << 17) | (addr & 0xffff);
dev_dbg(sdev, "read_xi2c_sa7(%d,0x%x,0x%x,0x%x): 0x%08x\n",chn,page,sa7,addr,(int) dw);
x393_sensi2c_rel (dw, chn, 0);
......@@ -865,7 +879,8 @@ int x393_xi2c_read_reg( const char * cname, ///< device class name
/* Initiate i2c read */
read_xi2c_sa7 (chn,
page & 0xff, // page (8 bits)
(dc->slave7 + sa7_offs) & 0x7f, // 7-bit i2c slave address
// (dc->slave7 + sa7_offs) & 0x7f, // 7-bit i2c slave address
(dc->slave7 + sa7_offs) & 0xff, // 7-bit i2c slave address -> 8 bit for extif
reg_addr & 0xffff); // 8/16 bit address
/* Now read required number of bytes with timeout */
......@@ -957,7 +972,8 @@ int legacy_read_i2c_reg( int chn, ///< sensor port number
/* Initiate i2c read */
read_xi2c_sa7 (chn,
page & 0xff, // page (8 bits)
sa7 & 0x7f, // 7-bit i2c slave address
// sa7 & 0x7f, // 7-bit i2c slave address
sa7 & 0xff, // 7-bit i2c slave address -> 8 bits for extif
reg_addr & 0xffff); // 8/16 bit address
/* Now read required number of bytes with timeout */
......@@ -1106,7 +1122,7 @@ static ssize_t i2c_class_store(struct device *dev, ///< Linux kerne
char * dname;
ni = sscanf(buf,"%31s %i %i %i %i", name, &sa7, &num_addr, &num_data, &khz);
if (ni < 5) {
dev_err(dev, "Requires 5 parameters: name, slave addr (7 bit), address width (bytes), data width (bytes), max SCL frequency (kHz)\n");
dev_err(dev, "Requires 5 parameters: name, slave addr (7/8 bit), address width (bytes), data width (bytes), max SCL frequency (kHz)\n");
return -EINVAL;
}
dl = i2c_dev_get(name);
......@@ -1284,9 +1300,14 @@ static ssize_t get_i2c_tbl_human(struct device *dev, ///< Linux ker
if (tb_data.rnw){
return sprintf(buf,"Read entry: chn=%d page=%d(0x%x) two_byte_addr=%d number bytes to read=%d bit_duration=%d\n",
chn, page,page, tb_data.nabrd,tb_data.nbrd, tb_data.dly);
} else {
if (tb_data.extif_mode) {
return sprintf(buf,"Write entry: chn=%d page=%d(0x%x) extif=0x%x extif_byte_mode=%d rah=0x%02x nbw=%d bit_duration=%d\n",
chn, page,page,tb_data.extif_mode, tb_data.sa, (tb_data.rah & 0x3f),tb_data.nbwr, tb_data.dly);
} else {
return sprintf(buf,"Write entry: chn=%d page=%d(0x%x) sa=0x%02x rah=0x%02x nbw=%d bit_duration=%d\n",
chn, page,page,tb_data.sa,tb_data.rah,tb_data.nbwr, tb_data.dly);
chn, page,page, tb_data.sa,tb_data.rah,tb_data.nbwr, tb_data.dly);
}
}
}
......@@ -1320,7 +1341,8 @@ static ssize_t set_i2c_tbl_wr_human(struct device *dev, ///< Linux
}
set_xi2c_wr(chn,
page & 0xff, // index in lookup table
sa7 & 0x7f, // slave address (7 bit)
// sa7 & 0x7f, // slave address (7 bit)
sa7 & 0xff, // slave address (7 bit -> 8 bits for extif)
rah & 0xff, // High byte of the i2c register address
nbwr & 0xf, // Number of bytes to write (1..10)
dly & 0xff); // Bit delay - number of mclk periods in 1/4 of the SCL period
......
......@@ -814,7 +814,7 @@ int membridge_start(int sensor_port, unsigned long target_frame){
width_bursts = (width_marg >> 4) + ((width_marg & 0xf) ? 1 : 0);
pr_debug("VIDEOMEM: frame_num=%d width_marg=%d height_marg=%d width_burts=%d", frame_num, width_marg, height_marg, width_bursts);
pr_debug("VIDEOMEM: frame_num=%ld width_marg=%d height_marg=%d width_burts=%d", frame_num, width_marg, height_marg, width_bursts);
setup_membridge_memory(sensor_port, ///< sensor port number (0..3)
0, ///< 0 - from fpga mem to system mem, 1 - otherwise
......@@ -1165,7 +1165,7 @@ static ssize_t show_frames_in_buffer(struct device *dev, struct device_attribute
static ssize_t get_membridge_status(struct device *dev, struct device_attribute *attr, char *buf)
{
x393_status_membridge_t status = x393_membridge_status();
return sprintf(buf,"0x%08x\n", status);
return sprintf(buf,"0x%08x\n", status.d32);
}
static ssize_t get_video_frame_num(struct device *dev, struct device_attribute *attr, char *buf)
......@@ -1194,7 +1194,7 @@ static ssize_t get_raw_frame_info(struct device *dev, struct device_attribute *a
buf += sprintf(buf,"width = %d\n" ,raw_info.width[sensor_port]);
buf += sprintf(buf,"height = %d\n" ,raw_info.height[sensor_port]);
buf += sprintf(buf,"bits per pixel = %d\n" ,raw_info.bpp[sensor_port]);
buf += sprintf(buf,"buffer offset = 0x%08x\n" ,raw_info.offset[sensor_port]);
buf += sprintf(buf,"buffer offset = 0x%08llx\n" ,raw_info.offset[sensor_port]);
return buf-buf0;
}
......@@ -1212,13 +1212,13 @@ static ssize_t get_mctrl_status_chn(struct device *dev, struct device_attribute
case 4: status = x393_mcntrl_chn4_status(); break;
}
return sprintf(buf,"0x%08x\n", status);
return sprintf(buf,"0x%08x\n", status.d32);
}
static ssize_t get_cmprs_status(struct device *dev, struct device_attribute *attr, char *buf)
{
x393_cmprs_status_t status = x393_cmprs_status(get_channel_from_name(attr));
return sprintf(buf,"0x%08x\n", status);
return sprintf(buf,"0x%08x\n", status.d32);
}
static ssize_t store_frame_start(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
......@@ -1250,8 +1250,7 @@ static ssize_t set_membridge_status_reg(struct device *dev, struct device_attrib
d.d32 = in;
set_x393_membridge_status_cntrl(d);
d = get_x393_membridge_status_cntrl();
pr_info("Set membridge status register to 0x%08x, status: 0x%08x\n",in,d);
pr_info("Set membridge status register to 0x%08x, status: 0x%08x\n",in,d.d32);
return count;
}
......
......@@ -282,7 +282,7 @@
#define SENSORWIDTH_IBIS51300 1280 ///< FillFactory IBIS51300 width
#define SENSORHEIGHT_IBIS51300 1024 ///< FillFactory IBIS51300 height
#define P_TRIG_MASTER 3 ///< Master channel for setting trigger para,eters
#define P_TRIG_MASTER 3 ///< Master channel for setting trigger parameters
#define P_SENSOR_RUN 4 ///< Sensor acquisition mode 0 - stop, 1 - single, 2 - run
#define SENSOR_RUN_STOP 0 ///< Sensor acquisition mode: STOP
#define SENSOR_RUN_SINGLE 1 ///< Sensor acquisition mode: SINGLE FRAME
......@@ -296,7 +296,8 @@
#define COMPRESSOR_RUN_RESET 3 ///< Compressor mode: RESET
#define P_BAYER 6 ///< filter number at (0,0) 0-R, 1-G(R), 2-G(B), 3 - B. Write enabled at first, move to WindowSize later
#define P_TRIGGERED 7 ///< when trigger occured - 4 LSBs - pixel in DMA word, higher bits - number of DMA word OBSOLETE
//#define P_TRIGGERED 7 ///< when trigger occurred - 4 LSBs - pixel in DMA word, higher bits - number of DMA word OBSOLETE
#define P_BOOTED 7 ///< sensor is fully booted (for Boson640) and ready to accept commands
#define P_PERIOD 8 ///< Frame period in pixel clocks (read only)
#define P_FP1000SLIM 9 ///< FPS limit, frames per 1000 sec
#define P_FPSFLAGS 10 //v FPS limit mode - bit 0 - limit fps (not higher than), bit 1 - maintain fps (not lower than)
......@@ -1115,6 +1116,7 @@ struct p_names_t {
P_NAME_ENTRY(ACTUAL_WIDTH), \
P_NAME_ENTRY(ACTUAL_HEIGHT), \
P_NAME_ENTRY(BAYER), \
P_NAME_ENTRY(BOOTED), \
P_NAME_ENTRY(PERIOD), \
P_NAME_ENTRY(FP1000SLIM), \
P_NAME_ENTRY(FRAME), \
......@@ -1738,7 +1740,8 @@ struct __attribute__((__packed__)) sensor_t {
typedef enum FPGA_INTERFACES {
FPGA_PAR12 = 0,
FPGA_HISPI = 1,
FPGA_VOSPI = 2
FPGA_VOSPI = 2,
FPGA_BOSON640 = 3
} fpga_interfaces_t;
......
......@@ -126,6 +126,7 @@
#define DEV393_MT9X001 ("", "elphel393-mt9x001", -1, -1, "0666", "c") ///< Used only in sysfs, no character device (yet?)
#define DEV393_MT9F002 ("", "elphel393-mt9f002", -1, -1, "0666", "c") ///< Used only in sysfs, no character device (yet?)
#define DEV393_LEPTON ("", "elphel393-lepton", -1, -1, "0666", "c") ///< Used only in sysfs, no character device (yet?)
#define DEV393_BOSON640 ("", "elphel393-boson640", -1, -1, "0666", "c") ///< Used only in sysfs, no character device (yet?)
#define DEV393_KLOGGER ("klogger_393", "klogger_393",144, 1, "0666", "c") ///< kernel event logger to memory (no i/o)
#define _DEV393_DEVNAME(n, ...) n
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment