Commit d66153d3 authored by Peter Jansweijer's avatar Peter Jansweijer

add main board pca9554 io expander functions

parent bdb96ef3
Pipeline #5146 passed with stage
in 3 minutes and 52 seconds
......@@ -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;
}
......@@ -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);
......
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