Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
X
x393
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
x393
Commits
b89b815a
Commit
b89b815a
authored
Apr 22, 2019
by
Oleg Dzhimiev
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
i2c fucntions for FLIR Lepton 3.5
parent
8f2f1a21
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
112 additions
and
9 deletions
+112
-9
x393_sensor.py
py393/x393_sensor.py
+112
-9
No files found.
py393/x393_sensor.py
View file @
b89b815a
...
...
@@ -2408,39 +2408,142 @@ input mem mtd4 ram1
i
=
0
for
reg
in
reglist
:
val
=
int
(
self
.
print_sensor_i2c
(
num_sensor
,
reg
,
0xff
,
0x
10
,
0
))
&
0xffff
val
=
int
(
self
.
print_sensor_i2c
(
num_sensor
,
reg
,
0xff
,
0x
2a
,
0
))
&
0xffff
print
(
"{:04x}"
.
format
(
reg
)
+
": "
+
"{:04x}"
.
format
(
val
),
end
=
' '
)
i
+=
1
if
i
%
8
==
0
:
print
(
""
)
# FLIR Lepton 3.5 testing procedures
LEPTON35_REG_POWER_ON
=
0x0000
LEPTON35_REG_STATUS
=
0x0002
LEPTON35_REG_CMD
=
0x0004
LEPTON35_REG_DATA_LEN
=
0x0006
LEPTON35_REG_DATA_FIRST
=
0x0008
LEPTON35_REG_DATA_LAST
=
0x0026
def
lepton35_i2c_w
(
self
,
num_sensor
,
reg
,
val
):
"""
write 16 bit value to an i2c register via sysfs
@param num_sensor - sensor port number (0..3)
@param reg - register address (0x0 - power_on reg, 0x2 - status reg, 0x4 - command reg, 0x6 - data length reg, 0x08-0x26 - data regs)
@param val - value
"""
path
=
"/sys/devices/soc0/elphel393-sensor-i2c@0/i2c"
+
str
(
num_sensor
)
f
=
open
(
path
,
'w'
)
f
.
write
(
"lepton35 0 "
+
str
(
reg
)
+
" "
+
str
(
val
))
f
.
close
()
def
lepton35_i2c_r
(
self
,
num_sensor
,
reg
):
"""
read 16 bit value from an i2c register via sysfs
@param num_sensor - sensor port number (0..3)
@param reg - register address (0x0 - power_on reg, 0x2 - status reg, 0x4 - command reg, 0x6 - data length reg, 0x08-0x26 - data regs)
"""
path
=
"/sys/devices/soc0/elphel393-sensor-i2c@0/i2c"
+
str
(
num_sensor
)
f
=
open
(
path
,
'w'
)
f
.
write
(
"lepton35 0 "
+
str
(
reg
))
f
.
close
()
# now read
# read
f
=
open
(
path
,
'r'
)
res
=
int
(
f
.
read
())
f
.
close
()
return
res
def
lepton35_poll_BUSY
(
self
,
num_sensor
,
ntries
=
10
):
"""
poll BUSY bit of a status reg
@param num_sensor - sensor port number (0..3)
@param ntries - timeout, exit after ntries times
"""
# single cycle in python is usually enough
for
i
in
range
(
ntries
):
res
=
self
.
lepton35_i2c_r
(
num_sensor
,
self
.
LEPTON35_REG_STATUS
)
busy
=
res
&
0x1
if
busy
==
0
:
res_code
=
(
res
>>
8
)
&
0xf
print
(
"Response code: "
+
str
(
res_code
))
break
else
:
print
(
"sensor status: busy("
+
str
(
i
)
+
")"
)
time
.
sleep
(
0.01
)
return
busy
def
lepton35_read
(
self
,
num_sensor
,
cmdreg
,
datalen
):
"""
Read attribute sequence
@param num_sensor - sensor port number (0..3)
@param cmdreg - register base address
@param datalen - number of 16-bit words to read
"""
res
=
[]
busy
=
self
.
lepton35_poll_BUSY
(
num_sensor
)
if
not
busy
:
print
(
"not busy, writing data length and command"
)
self
.
lepton35_i2c_w
(
num_sensor
,
self
.
LEPTON35_REG_DATA_LEN
,
datalen
)
self
.
lepton35_i2c_w
(
num_sensor
,
self
.
LEPTON35_REG_CMD
,
cmdreg
)
busy
=
self
.
lepton35_poll_BUSY
(
num_sensor
)
if
not
busy
:
for
i
in
range
(
datalen
):
tmp
=
self
.
lepton35_i2c_r
(
num_sensor
,
self
.
LEPTON35_REG_DATA_FIRST
+
i
)
res
.
append
(
tmp
)
else
:
print
(
"lepton35_read: sensor busy. timeout."
)
return
res
def
lepton35_write
(
self
,
num_sensor
,
cmdreg
,
cmddata
):
"""
Write sequence
@param num_sensor - sensor port number (0..3)
@param cmdreg - register base address (true addr = cmdreg|0x1)
@param cmddata - string with comma separated values "0,1,2,3,4"
"""
cmdreg
=
cmdreg
|
0x1
cmddata
=
[
int
(
a
)
for
a
in
cmddata
.
split
(
","
)]
datalen
=
len
(
cmddata
)
busy
=
self
.
lepton35_poll_BUSY
(
num_sensor
)
if
not
busy
:
for
i
in
range
(
datalen
):
self
.
lepton35_i2c_w
(
num_sensor
,
self
.
LEPTON35_REG_DATA_FIRST
+
i
,
cmddata
[
i
])
self
.
lepton35_i2c_w
(
num_sensor
,
self
.
LEPTON35_REG_DATA_LEN
,
datalen
)
self
.
lepton35_i2c_w
(
num_sensor
,
self
.
LEPTON35_REG_CMD
,
cmdreg
)
busy
=
self
.
lepton35_poll_BUSY
(
num_sensor
)
if
busy
:
print
(
"lepton35_write: sensor busy. timeout."
)
def
lepton35_run
(
self
,
num_sensor
,
cmdreg
):
"""
Run command sequence
@param num_sensor - sensor port number (0..3)
@param cmdreg - register base address (true addr = cmdreg|0x2)
"""
busy
=
self
.
lepton35_poll_BUSY
(
num_sensor
)
if
not
busy
:
self
.
lepton35_i2c_w
(
num_sensor
,
self
.
LEPTON35_REG_CMD
,
cmdreg
)
busy
=
self
.
lepton35_poll_BUSY
(
num_sensor
)
if
busy
:
print
(
"lepton35_run: sensor busy. timeout."
)
def
lepton35_read_serial
(
self
,
num_sensor
):
"""
Read serial number (read attribute sequence from 0x0208)
@param num_sensor - sensor port number (0..3)
"""
res
=
self
.
lepton35_read
(
num_sensor
,
0x0208
,
4
)
print
(
"_"
.
join
([
"{:04x}"
.
format
(
a
)
for
a
in
res
]))
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