You've already forked gitified_old_clb_svn
69 lines
1.4 KiB
C
69 lines
1.4 KiB
C
/*
|
|
* This work is part of the White Rabbit project
|
|
*
|
|
* Copyright (C) 2012 CERN (www.cern.ch)
|
|
* Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
|
|
*
|
|
* Released according to the GNU GPL, version 2 or any later version.
|
|
*/
|
|
/* SFP Detection / managenent functions */
|
|
|
|
#include <stdio.h>
|
|
#include <inttypes.h>
|
|
|
|
#include "syscon.h"
|
|
#include "i2c.h"
|
|
#include "sfp.h"
|
|
|
|
int sfp_present()
|
|
{
|
|
return !gpio_in(GPIO_SFP_DET);
|
|
}
|
|
|
|
/*
|
|
* Select channel 1 on the PCA9548
|
|
*/
|
|
void pca9548_select() {
|
|
|
|
mi2c_init(WRPC_FMC_I2C);
|
|
|
|
mi2c_start(WRPC_FMC_I2C);
|
|
mi2c_put_byte(WRPC_FMC_I2C, (FMC_PCA9548_ADR << 1));
|
|
mi2c_put_byte(WRPC_FMC_I2C, (1 << 1));
|
|
mi2c_stop(WRPC_FMC_I2C);
|
|
|
|
}
|
|
|
|
int sfp_read_part_id(char *part_id)
|
|
{
|
|
int i;
|
|
uint8_t data, sum;
|
|
mi2c_init(WRPC_SFP_I2C);
|
|
|
|
mi2c_start(WRPC_SFP_I2C);
|
|
mi2c_put_byte(WRPC_SFP_I2C, 0xA0);
|
|
mi2c_put_byte(WRPC_SFP_I2C, 0x00);
|
|
mi2c_repeat_start(WRPC_SFP_I2C);
|
|
mi2c_put_byte(WRPC_SFP_I2C, 0xA1);
|
|
mi2c_get_byte(WRPC_SFP_I2C, &data, 1);
|
|
mi2c_stop(WRPC_SFP_I2C);
|
|
|
|
sum = data;
|
|
|
|
mi2c_start(WRPC_SFP_I2C);
|
|
mi2c_put_byte(WRPC_SFP_I2C, 0xA1);
|
|
for (i = 1; i < 63; ++i) {
|
|
mi2c_get_byte(WRPC_SFP_I2C, &data, 0);
|
|
sum = (uint8_t) ((uint16_t) sum + data) & 0xff;
|
|
if (i >= 40 && i <= 55) //Part Number
|
|
part_id[i - 40] = data;
|
|
}
|
|
mi2c_get_byte(WRPC_SFP_I2C, &data, 1); //final word, checksum
|
|
mi2c_stop(WRPC_SFP_I2C);
|
|
|
|
if (sum == data)
|
|
return 0;
|
|
|
|
return -1;
|
|
}
|