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
bd61276e
Commit
bd61276e
authored
May 02, 2019
by
Andrey Filippov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
debugging driver for lepton 3.5, works with fpga 0x03930133
parent
dbd6274f
Changes
4
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
223 additions
and
53 deletions
+223
-53
framepars.c
src/drivers/elphel/framepars.c
+5
-0
lepton.c
src/drivers/elphel/lepton.c
+140
-33
lepton.h
src/drivers/elphel/lepton.h
+74
-18
sensor_i2c.c
src/drivers/elphel/sensor_i2c.c
+4
-2
No files found.
src/drivers/elphel/framepars.c
View file @
bd61276e
...
@@ -1499,6 +1499,8 @@ int setFramePars(int sensor_port, ///< sensor port number (0
...
@@ -1499,6 +1499,8 @@ int setFramePars(int sensor_port, ///< sensor port number (0
unsigned
long
*
funcs2call
=
afuncs2call
[
sensor_port
];
unsigned
long
*
funcs2call
=
afuncs2call
[
sensor_port
];
dev_dbg
(
g_devfp_ptr
,
"port= %d, this_framepars=0x%x numPars=%d
\n
"
,
sensor_port
,
(
int
)
this_framepars
,
numPars
);
dev_dbg
(
g_devfp_ptr
,
"port= %d, this_framepars=0x%x numPars=%d
\n
"
,
sensor_port
,
(
int
)
this_framepars
,
numPars
);
// dev_info(g_devfp_ptr, "port= %d, this_framepars=0x%x numPars=%d\n", sensor_port, (int)this_framepars, numPars);
MDP
(
DBGB_FSFP
,
sensor_port
,
"this_framepars=0x%x numPars=%d
\n
"
,
(
int
)
this_framepars
,
numPars
)
MDP
(
DBGB_FSFP
,
sensor_port
,
"this_framepars=0x%x numPars=%d
\n
"
,
(
int
)
this_framepars
,
numPars
)
for
(
npar
=
0
;
npar
<
numPars
;
npar
++
)
{
for
(
npar
=
0
;
npar
<
numPars
;
npar
++
)
{
...
@@ -1506,6 +1508,9 @@ int setFramePars(int sensor_port, ///< sensor port number (0
...
@@ -1506,6 +1508,9 @@ int setFramePars(int sensor_port, ///< sensor port number (0
val
=
pars
[
npar
].
val
;
val
=
pars
[
npar
].
val
;
index
=
pars
[
npar
].
num
&
0xffff
;
index
=
pars
[
npar
].
num
&
0xffff
;
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
);
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
);
// dev_info(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
)
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
// remark: code below looks similar to setFramePar function, call it instead
if
(
index
>
((
index
>=
FRAMEPAR_GLOBALS
)
?
(
P_MAX_GPAR
+
FRAMEPAR_GLOBALS
)
:
P_MAX_PAR
))
{
if
(
index
>
((
index
>=
FRAMEPAR_GLOBALS
)
?
(
P_MAX_GPAR
+
FRAMEPAR_GLOBALS
)
:
P_MAX_PAR
))
{
...
...
src/drivers/elphel/lepton.c
View file @
bd61276e
This diff is collapsed.
Click to expand it.
src/drivers/elphel/lepton.h
View file @
bd61276e
...
@@ -45,14 +45,25 @@
...
@@ -45,14 +45,25 @@
// Data model for Lepton does not match 393 convention (1 page for "important" registers,
// Data model for Lepton does not match 393 convention (1 page for "important" registers,
// so just 1 register of each of the 256-words is registered
// so just 1 register of each of the 256-words is registered
#define P_LEPTON_DATAF8 0xf8 ///< 0xf800 to 0xf8ff
#define P_LEPTON_DATAF8 0x28 ///< 0xf800 to 0xf8ff
#define P_LEPTON_DATAF9 0xf9 ///< 0xf900 to 0xf9ff
#define P_LEPTON_DATAF9 0x29 ///< 0xf900 to 0xf9ff
#define P_LEPTON_DATAFA 0xfa ///< 0xfa00 to 0xfaff
#define P_LEPTON_DATAFA 0x2a ///< 0xfa00 to 0xfaff
#define P_LEPTON_DATAFB 0xfb ///< 0xfb00 to 0xfbff
#define P_LEPTON_DATAFB 0x2b ///< 0xfb00 to 0xfbff
#define P_LEPTON_DATAFC 0xfc ///< 0xfc00 to 0xfcff
#define P_LEPTON_DATAFC 0x2c ///< 0xfc00 to 0xfcff
#define P_LEPTON_DATAFD 0xfd ///< 0xfd00 to 0xfdff
#define P_LEPTON_DATAFD 0x2d ///< 0xfd00 to 0xfdff
#define P_LEPTON_DATAFE 0xfe ///< 0xfe00 to 0xfeff
#define P_LEPTON_DATAFE 0x2e ///< 0xfe00 to 0xfeff
#define P_LEPTON_DATAFF 0xff ///< 0xff00 to 0xffff
#define P_LEPTON_DATAFF 0x2f ///< 0xff00 to 0xffff
// Registers 0x40.. 0xff will be used for non-i2c Lepton internal registers, such as VSYNC, telemetry
#define P_LEPTON_GP3VSYNC 0x40
#define P_LEPTON_TELEN 0x41
#define P_LEPTON_TELLOC 0x42
// actual values for registers (when reading)
#define P_REG_LEPTON_GP3VSYNC 0x0854
#define P_REG_LEPTON_GP3VSYNC_VAL 0x0005
#define P_REG_LEPTON_TELEN 0x0218
#define P_REG_LEPTON_TELLOC 0x021c
// Actual register address ranges (probably, only even are used too?)
// Actual register address ranges (probably, only even are used too?)
#define P_REG_LEPTON_DATAF8 0xf800 ///< 0xf800 to 0xf8ff
#define P_REG_LEPTON_DATAF8 0xf800 ///< 0xf800 to 0xf8ff
...
@@ -64,6 +75,54 @@
...
@@ -64,6 +75,54 @@
#define P_REG_LEPTON_DATAFE 0xfe00 ///< 0xfe00 to 0xfeff
#define P_REG_LEPTON_DATAFE 0xfe00 ///< 0xfe00 to 0xfeff
#define P_REG_LEPTON_DATAFF 0xff00 ///< 0xff00 to 0xffff
#define P_REG_LEPTON_DATAFF 0xff00 ///< 0xff00 to 0xffff
/**
* Just set parameter for the Lepton related register, do not write to sensor
* @param port sensor port number
* @param reg relative register to fit 256 values page
* @param data value to set (16 bits)
*/
#define SET_LEPTON_PAR_DRY(port,reg,data) {\
pars_to_update[nupdate ].num= P_SENSOR_REGS+(reg);\
pars_to_update[nupdate++].val=(data);\
}
/**
* Set parameter for the Lepton related register and send related commands to hardware i2c sequencer in immediate mode
* Only immediate mode allows waiting
* @param port sensor port number
* @param sa7 7-bit i2c slave address
* @param reg relative register to fit 256 values page
* @param data value to set (16 bits)
* @param wait_ms - maximal numer of milliseconds to wait Lepton ready
*/
#define SET_LEPTON_PAR_IMMED(port,sa7,reg,data,wait_ms) {\
int _LEPTONREG = pSensorPortConfig[(port)].par2addr[0][(reg)];\
pars_to_update[nupdate ].num= P_SENSOR_REGS+(reg);\
pars_to_update[nupdate++].val=(data);\
if (!(_LEPTONREG&0xffff0000)) {\
lepton_set_reg((port), (sa7), _LEPTONREG, (wait_ms), (data));\
}\
}
// .pare2addr[0] - 256 of32-bit register addresses, or 0xffffffff for missing ones
/**
* Set parameter for the sensor register and send to hardware i2c sequencer
* @param port sensor port number
* @param frame frame number to apply, <0 - ASAP
* @param reg relative register to fit 256 values page
* @param data value to set (16 bits)
*/
#define SET_LEPTON_PAR_NOWAIT(port, frame, reg, data) {\
int _LEPTONREG = pSensorPortConfig[(port)].par2addr[0][(reg)];\
pars_to_update[nupdate ].num= P_SENSOR_REGS+(reg);\
pars_to_update[nupdate++].val=(data);\
if (!(_LEPTONREG&0xffff0000)) {\
lepton_set_reg_nowait ((port), (frame), _LEPTONREG, (data));\
}\
}
typedef
union
{
typedef
union
{
struct
{
struct
{
u32
busy
:
1
;
// [ 0] BUSY bit (should be zero before issuing commands)
u32
busy
:
1
;
// [ 0] BUSY bit (should be zero before issuing commands)
...
@@ -91,6 +150,9 @@ typedef union {
...
@@ -91,6 +150,9 @@ typedef union {
};
};
}
lepton_command_t
;
}
lepton_command_t
;
#define LEPTON_MODULE(x) (((x) >> 8) & 0x3f)
typedef
enum
LEPTON_MODULES
{
typedef
enum
LEPTON_MODULES
{
LEPTON_AGC
=
1
,
LEPTON_AGC
=
1
,
LEPTON_SYS
=
2
,
LEPTON_SYS
=
2
,
...
@@ -130,16 +192,10 @@ int lepton_pgm_detectsensor (int sensor_port, ///< sensor port
...
@@ -130,16 +192,10 @@ int lepton_pgm_detectsensor (int sensor_port, ///< sensor port
;
;
void
lepton_set_device
(
struct
device
*
dev
);
void
lepton_set_device
(
struct
device
*
dev
);
int
lepton_wait_ready
(
int
sensor_port
,
///< sensor port number (0..3)
int
lepton_wait_ready
(
int
sensor_port
,
int
sa7
,
int
num_retries
);
int
sa7
,
///< I2C slave address
int
lepton_get_reg
(
int
sensor_port
,
int
sa7
,
int
cmd
,
int
wait_ms
);
int
num_retries
);
///< number of retries, 0 - forever
int
lepton_set_reg
(
int
sensor_port
,
int
sa7
,
int
cmd
,
int
wait_ms
,
int
data
);
///< @return > 0 number of retries0 - OK, negative - error
void
lepton_set_reg_nowait
(
int
sensor_port
,
int
frame
,
int
cmd
,
int
data
);
void
lepton_set_reg_nowait
(
int
sensor_port
,
///< sensor port number (0..3)
int
frame
,
///< frame number to apply, <0 - ASAP
lepton_modules_t
cmd_module
,
///< Lepton command module
int
cmd_id
,
///< Lepton command id
int
data
);
///< data to write
...
...
src/drivers/elphel/sensor_i2c.c
View file @
bd61276e
...
@@ -698,8 +698,10 @@ void write_xi2c_reg16_abs_asap (int chn, ///< sensor port
...
@@ -698,8 +698,10 @@ void write_xi2c_reg16_abs_asap (int chn, ///< sensor port
int
addr
,
///< low byte of the register address (high is in the table), 8 bits
int
addr
,
///< low byte of the register address (high is in the table), 8 bits
u32
data
)
///< 16 or 8-bit data (LSB aligned), 16 address only for 16 bit data
u32
data
)
///< 16 or 8-bit data (LSB aligned), 16 address only for 16 bit data
{
{
// u32 dw = ((page & 0xff) << 24) | ((addr & 0xff) << 16) | (data & 0xffff);
u32
dw
=
i2c_combine_page_addr_data8_16
(
chn
,
page
,
addr
,
data
);
u32
dw
=
i2c_combine_page_addr_data8_16
(
chn
,
page
,
addr
,
data
);
// TODO: change to dev_dbg
dev_dbg
(
sdev
,
"write_xi2c_reg16_abs_asap(chn=%d, page=0x%x, frame=0x%x addr=0x%x data=0x%x)
\n
"
,
chn
,
page
,
frame
,
addr
,
data
);
if
(
frame
<
0
)
x393_sensi2c_rel
(
dw
,
chn
,
0
);
if
(
frame
<
0
)
x393_sensi2c_rel
(
dw
,
chn
,
0
);
else
x393_sensi2c_abs
(
dw
,
chn
,
frame
&
PARS_FRAMES_MASK
);
else
x393_sensi2c_abs
(
dw
,
chn
,
frame
&
PARS_FRAMES_MASK
);
}
}
...
...
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