Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-elphel
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
linux-elphel
Commits
53ff55a4
Commit
53ff55a4
authored
Mar 08, 2018
by
Oleg Dzhimiev
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fixed mux board programming sensors via broadcast address. Testing
parent
3db94829
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
85 additions
and
35 deletions
+85
-35
detect_sensors.c
src/drivers/elphel/detect_sensors.c
+34
-15
detect_sensors.h
src/drivers/elphel/detect_sensors.h
+1
-0
mt9x001.c
src/drivers/elphel/mt9x001.c
+3
-0
multi10359.c
src/drivers/elphel/multi10359.c
+10
-9
pgm_functions.h
src/drivers/elphel/pgm_functions.h
+2
-2
sensor_common.c
src/drivers/elphel/sensor_common.c
+35
-9
No files found.
src/drivers/elphel/detect_sensors.c
View file @
53ff55a4
...
...
@@ -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 (port
x = 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
]
port
x
,
sensorPortConfig[port
x
].mux,
sensorPortConfig[port
x
].sensor[0],
sensorPortConfig[port
x
].sensor[1],
sensorPortConfig[port
x
].sensor[2],
sensorPortConfig[port
x
].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[port
x
].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[port
x
].par2addr[sub_chn]);
// save pointer to static LUT
sensorPortConfig
[
port
].
pages_ptr
[
sub_chn
]
=
pages
;
sensorPortConfig[port
x
].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);
...
...
src/drivers/elphel/detect_sensors.h
View file @
53ff55a4
...
...
@@ -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
);
...
...
src/drivers/elphel/mt9x001.c
View file @
53ff55a4
...
...
@@ -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]);
...
...
src/drivers/elphel/multi10359.c
View file @
53ff55a4
...
...
@@ -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
,
...
...
src/drivers/elphel/pgm_functions.h
View file @
53ff55a4
...
...
@@ -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));\
}\
...
...
src/drivers/elphel/sensor_common.c
View file @
53ff55a4
...
...
@@ -1225,6 +1225,7 @@ int register_i2c_sensor(int ports_mask) ///< bitmask of the sensor ports to use
const
char
*
name10359
;
bool
mux
;
bool
broadcast_set
=
false
;
dev_dbg
(
g_dev_ptr
,
"register_i2c_sensor()
\n
"
);
...
...
@@ -1260,20 +1261,45 @@ int register_i2c_sensor(int ports_mask) ///< bitmask of the sensor ports to use
// TODO: request a line# from fpga table and register it (not class_mux->slave7)
i2c_page_register
(
port
,
class_mux
->
slave7
);
set_xi2c_wrc
(
class_mux
,
port
,
class_mux
->
slave7
,
0
);
}
// 'write' recs for sensors
for
(
subchn
=
0
;
subchn
<
4
;
subchn
++
){
// 'write' recs for sensors
for
(
subchn
=
0
;
subchn
<
4
;
subchn
++
){
if
(
pcfg
->
sensor
[
subchn
]
!=
SENSOR_NONE
){
// set the 1st found sensor type to broadcast
if
(
!
broadcast_set
){
broadcast_set
=
true
;
pcfg
->
sensor
[
pcfg
->
broadcast_addr
]
=
pcfg
->
sensor
[
subchn
];
}
// init par2addr and other tables for sensors
detect_sensors_par2addr_init
(
port
,
subchn
);
name
=
get_name_by_code
(
pcfg
->
sensor
[
subchn
],
DETECT_SENSOR
);
class_sensor
=
xi2c_dev_get
(
name
);
// copy reference data
memcpy
(
&
dev_sensor
,
class_sensor
,
sizeof
(
x393_i2c_device_t
));
if
(
subchn
==
pcfg
->
broadcast_addr
){
dev_sensor
.
slave7
=
class_sensor
->
slave7
;
}
else
{
// i2c address increment rule for MUX ports
dev_sensor
.
slave7
=
class_sensor
->
slave7
+
I2C359_INC
*
(
subchn
+
1
);
}
// register line#s for available sensors (w or w/o mux)
fpga_register_i2c_pages
(
port
,
subchn
,
dev_sensor
);
}
}
}
else
{
// single sensor this port, subchn is 0
subchn
=
0
;
if
(
pcfg
->
sensor
[
subchn
]
!=
SENSOR_NONE
){
detect_sensors_par2addr_init
(
port
,
subchn
);
name
=
get_name_by_code
(
pcfg
->
sensor
[
subchn
],
DETECT_SENSOR
);
class_sensor
=
xi2c_dev_get
(
name
);
// copy reference data
memcpy
(
&
dev_sensor
,
class_sensor
,
sizeof
(
x393_i2c_device_t
));
// i2c address rule for MUX ports
dev_sensor
.
slave7
=
class_sensor
->
slave7
+
I2C359_INC
*
subchn
;
// register line#s for available sensors (w or w/o mux)
dev_sensor
.
slave7
=
class_sensor
->
slave7
;
fpga_register_i2c_pages
(
port
,
subchn
,
dev_sensor
);
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment