Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
S
Software for White Rabbit PTP Core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
32
Issues
32
List
Board
Labels
Milestones
Merge Requests
5
Merge Requests
5
CI / CD
CI / CD
Pipelines
Schedules
Wiki
Wiki
image/svg+xml
Discourse
Discourse
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Projects
Software for White Rabbit PTP Core
Commits
d66153d3
Commit
d66153d3
authored
Feb 19, 2024
by
Peter Jansweijer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add main board pca9554 io expander functions
parent
bdb96ef3
Pipeline
#5146
passed with stage
in 3 minutes and 52 seconds
Changes
2
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
115 additions
and
20 deletions
+115
-20
board.c
boards/babywr/board.c
+80
-20
board.h
boards/babywr/board.h
+35
-0
No files found.
boards/babywr/board.c
View file @
d66153d3
...
...
@@ -27,23 +27,13 @@
#include "dev/i2c_eeprom.h"
#include "dev/syscon.h"
#include "dev/endpoint.h"
#include "dev/pps_gen.h"
#include "storage.h"
#include "softpll_ng.h"
#include "hw/sit5359_regs.h"
#include <wrpc.h>
//struct babywr_board board;
struct
wr_sit5359_interface_device
{
void
*
base_addr
;
uint8_t
i2c_addr
;
struct
gpio_pin
pin_scl
;
struct
gpio_pin
pin_sda
;
struct
gpio_device
gpio_i2c
;
struct
i2c_bus
master
;
int
pull_range
,
hsdiv
;
uint64_t
rfreq
;
};
struct
babywr_board
board
;
static
spll_gain_schedule_t
spll_main_ocxo_gain_sched
;
...
...
@@ -58,13 +48,6 @@ static spll_gain_schedule_t spll_main_ocxo_gain_sched;
#define DAC_HALF_SCALE (1<<(BOARD_SPLL_DAC_BITS - 1))
#define DAC_FULL_SCALE (1<<(BOARD_SPLL_DAC_BITS))
struct
{
struct
gpio_device
gpio_aux
;
struct
wr_sit5359_interface_device
sit5359_refclk
;
struct
wr_sit5359_interface_device
sit5359_dmtd
;
}
board
;
static
void
sit5359_gpio_out
(
const
struct
gpio_pin
*
pin
,
int
value
)
{
struct
wr_sit5359_interface_device
*
dev
=
(
struct
wr_sit5359_interface_device
*
)
pin
->
device
->
priv
;
...
...
@@ -216,6 +199,76 @@ void write_sitime (int dev, int val)
sit5359_i2c_write
(
&
board
.
sit5359_dmtd
,
0x00
,
regs
,
6
);
}
// ======================================
// GPIO Control functions
// ======================================
int
gpio_control_poll
()
{
static
int
prev_servo_state
=
0
;
static
int
prev_link_state
=
0
;
int
link_state
=
0
;
uint8_t
io_stat
;
uint64_t
sec
;
uint32_t
nsec
;
extern
struct
pp_instance
ppi_static
;
struct
pp_instance
*
ppi
=
&
ppi_static
;
// struct wr_servo_state *s =
// &((struct wr_data *)ppi->ext_data)->servo_state;
int
curr_servo_state
=
ppi
->
servo
->
state
;
if
(
prev_servo_state
!=
WRH_TRACK_PHASE
&&
curr_servo_state
==
WRH_TRACK_PHASE
)
{
shw_pps_gen_get_time
(
&
sec
,
&
nsec
);
board_dbg
(
"TRACK_PHASE: '%s'
\n
"
,
format_time
(
sec
,
TIME_FORMAT_LEGACY
));
io_stat
=
pca9554_read_reg
(
&
board
.
gpio_main_board
,
PCA9554_REG_IN
);
pca9554_write_reg
(
&
board
.
gpio_main_board
,
PCA9554_REG_OUT
,
io_stat
|
MAIN_BOARD_LED_0
);
}
if
(
prev_servo_state
==
WRH_TRACK_PHASE
&&
curr_servo_state
!=
WRH_TRACK_PHASE
)
{
shw_pps_gen_get_time
(
&
sec
,
&
nsec
);
board_dbg
(
"LOST TRACK_PHASE: '%s'
\n
"
,
format_time
(
sec
,
TIME_FORMAT_LEGACY
));
io_stat
=
pca9554_read_reg
(
&
board
.
gpio_main_board
,
PCA9554_REG_IN
);
pca9554_write_reg
(
&
board
.
gpio_main_board
,
PCA9554_REG_OUT
,
io_stat
&
~
MAIN_BOARD_LED_0
);
}
link_state
=
ep_link_up
(
&
wrc_endpoint_dev
,
NULL
);
if
(
!
prev_link_state
&&
link_state
)
{
shw_pps_gen_get_time
(
&
sec
,
&
nsec
);
board_dbg
(
"Link up: '%s'
\n
"
,
format_time
(
sec
,
TIME_FORMAT_LEGACY
));
io_stat
=
pca9554_read_reg
(
&
board
.
gpio_main_board
,
PCA9554_REG_IN
);
pca9554_write_reg
(
&
board
.
gpio_main_board
,
PCA9554_REG_OUT
,
io_stat
|
MAIN_BOARD_LED_1
);
}
else
if
(
prev_link_state
&&
!
link_state
)
{
shw_pps_gen_get_time
(
&
sec
,
&
nsec
);
board_dbg
(
"Link down: '%s'
\n
"
,
format_time
(
sec
,
TIME_FORMAT_LEGACY
));
io_stat
=
pca9554_read_reg
(
&
board
.
gpio_main_board
,
PCA9554_REG_IN
);
pca9554_write_reg
(
&
board
.
gpio_main_board
,
PCA9554_REG_OUT
,
io_stat
&
~
MAIN_BOARD_LED_1
);
}
prev_servo_state
=
curr_servo_state
;
prev_link_state
=
link_state
;
return
0
;
}
void
gpio_control_init
()
{
int
i
;
uint8_t
io_stat
;
board_dbg
(
"Initializing GPIO control...
\n
"
);
pca9554_write_reg
(
&
board
.
gpio_main_board
,
PCA9554_REG_CONFIG
,
0x00
);
// Configure all IO as output
pca9554_write_reg
(
&
board
.
gpio_main_board
,
PCA9554_REG_OUT
,
0x00
);
// LEDs, SEL_GROUP_0/1 and SEL_IRIG_B all '0'
for
(
i
=
0
;
i
<
5
;
i
++
)
{
io_stat
=
pca9554_read_reg
(
&
board
.
gpio_main_board
,
PCA9554_REG_OUT
);
pca9554_write_reg
(
&
board
.
gpio_main_board
,
PCA9554_REG_OUT
,
io_stat
|
MAIN_BOARD_LED_3
);
timer_delay_ms
(
100
);
pca9554_write_reg
(
&
board
.
gpio_main_board
,
PCA9554_REG_OUT
,
io_stat
&
~
MAIN_BOARD_LED_3
);
timer_delay_ms
(
100
);
}
}
static
void
babywr_spll_setup
(
void
)
{
...
...
@@ -291,6 +344,9 @@ int wrc_board_early_init()
wr_sit5359_interface_init
(
&
board
.
sit5359_refclk
,
BASE_SIT5359_REFCLK
,
SIT5359_I2C_ADDR_A0_1
);
wr_sit5359_interface_init
(
&
board
.
sit5359_dmtd
,
BASE_SIT5359_DMTD
,
SIT5359_I2C_ADDR_A0_0
);
/* Initialize I2C bus multiplexer */
pca9554_gpio_init
(
&
board
.
gpio_main_board
,
&
dev_i2c_aux
,
PCA9554_ADR
);
/* Setup the SoftPLL for the OCXO we have */
babywr_spll_setup
();
...
...
@@ -325,6 +381,9 @@ int wrc_board_init()
ep_set_mac_addr
(
&
wrc_endpoint_dev
,
mac_addr
);
ep_pfilter_init_default
(
&
wrc_endpoint_dev
);
pca9554_write_reg
(
&
board
.
gpio_main_board
,
PCA9554_REG_CONFIG
,
0x00
);
// Configure all IO as output
pca9554_write_reg
(
&
board
.
gpio_main_board
,
PCA9554_REG_OUT
,
0x00
);
// LEDs, SEL_GROUP_0/1 and SEL_IRIG_B all '0'
for
(
i
=
0
;
i
<
5
;
i
++
)
{
gen_gpio_out
(
&
pin_spare0
,
0
);
...
...
@@ -341,5 +400,6 @@ int wrc_board_init()
int
wrc_board_create_tasks
()
{
wrc_task_create
(
"phy-cal"
,
phy_calibration_init
,
phy_calibration_poll
);
wrc_task_create
(
"pgpio_control"
,
gpio_control_init
,
gpio_control_poll
);
return
0
;
}
boards/babywr/board.h
View file @
d66153d3
...
...
@@ -7,6 +7,7 @@
#define __BOARD_BABYWR_H
#include "dev/gpio.h"
#include "dev/pca9554.h"
/*
* This is meant to be automatically included by the Makefile,
...
...
@@ -65,6 +66,15 @@
#define BOARD_CONSOLE_DEVICES 1
#define CONSOLE_UART_BAUDRATE 115200
// Main board LEDs and other IO on I2C GPIO
#define MAIN_BOARD_LED_0 WBGEN2_GEN_MASK(0, 1)
#define MAIN_BOARD_LED_1 WBGEN2_GEN_MASK(1, 1)
#define MAIN_BOARD_LED_2 WBGEN2_GEN_MASK(2, 1)
#define MAIN_BOARD_LED_3 WBGEN2_GEN_MASK(3, 1)
#define MAIN_BOARD_SEL_GROUP_0 WBGEN2_GEN_MASK(4, 1)
#define MAIN_BOARD_SEL_GROUP_1 WBGEN2_GEN_MASK(5, 1)
#define MAIN_BOARD_SEL_IRIG_B WBGEN2_GEN_MASK(6, 1)
/* Maximum number of files in the sdb filesystem.
Need at least 4: ., sfp database, init script and calibration
MAC address could also be written on sdbfs. */
...
...
@@ -76,6 +86,31 @@
#define UID_EEPROM_ADR 0x51
#define UID_OFFSET 0xfa
/* I2C address of the I2C multiplexer */
#define PCA9554_ADR 0x23
struct
wr_sit5359_interface_device
{
void
*
base_addr
;
uint8_t
i2c_addr
;
struct
gpio_pin
pin_scl
;
struct
gpio_pin
pin_sda
;
struct
gpio_device
gpio_i2c
;
struct
i2c_bus
master
;
int
pull_range
,
hsdiv
;
uint64_t
rfreq
;
};
struct
babywr_board
{
struct
gpio_device
gpio_aux
;
struct
wr_sit5359_interface_device
sit5359_refclk
;
struct
wr_sit5359_interface_device
sit5359_dmtd
;
struct
pca9554_gpio_device
gpio_main_board
;
}
typedef
babywr_board
;
void
gpio_control_init
(
void
);
int
gpio_control_poll
(
void
);
int
babywr_init
(
void
);
void
read_sitime
(
void
);
...
...
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