Commit 3168c53e authored by broquet's avatar broquet

i2c: add some code to adapt to fmc i2c mux on top

parent ac996c2a
...@@ -57,6 +57,10 @@ ...@@ -57,6 +57,10 @@
* ------------------------------------------------ * ------------------------------------------------
*/ */
//default time out in us to wait for i2c bus unlock
//~3s
#define BUS_TIME_OUT 3000000
uint8_t has_eeprom = 0; uint8_t has_eeprom = 0;
static int i2cif, i2c_addr; /* globals, using the names we always used */ static int i2cif, i2c_addr; /* globals, using the names we always used */
...@@ -67,10 +71,16 @@ void storage_init(int chosen_i2cif, int chosen_i2c_addr) ...@@ -67,10 +71,16 @@ void storage_init(int chosen_i2cif, int chosen_i2c_addr)
i2cif = chosen_i2cif; i2cif = chosen_i2cif;
i2c_addr = chosen_i2c_addr; i2c_addr = chosen_i2c_addr;
if(mi2c_poll(BUS_TIME_OUT))
{
has_eeprom = 1; has_eeprom = 1;
mi2c_lock();
if (!mi2c_devprobe(i2cif, i2c_addr)) if (!mi2c_devprobe(i2cif, i2c_addr))
if (!mi2c_devprobe(i2cif, i2c_addr)) if (!mi2c_devprobe(i2cif, i2c_addr))
has_eeprom = 0; has_eeprom = 0;
mi2c_unlock();
return;
}
return; return;
} }
...@@ -84,6 +94,10 @@ static int eeprom_read(uint8_t i2cif, uint8_t i2c_addr, uint32_t offset, ...@@ -84,6 +94,10 @@ static int eeprom_read(uint8_t i2cif, uint8_t i2c_addr, uint32_t offset,
if (!has_eeprom) if (!has_eeprom)
return -1; return -1;
if(!mi2c_poll(BUS_TIME_OUT))
return -2;
mi2c_lock();
mi2c_start(i2cif); mi2c_start(i2cif);
if (mi2c_put_byte(i2cif, i2c_addr << 1) < 0) { if (mi2c_put_byte(i2cif, i2c_addr << 1) < 0) {
mi2c_stop(i2cif); mi2c_stop(i2cif);
...@@ -100,6 +114,7 @@ static int eeprom_read(uint8_t i2cif, uint8_t i2c_addr, uint32_t offset, ...@@ -100,6 +114,7 @@ static int eeprom_read(uint8_t i2cif, uint8_t i2c_addr, uint32_t offset,
mi2c_get_byte(i2cif, &c, 1); mi2c_get_byte(i2cif, &c, 1);
*buf++ = c; *buf++ = c;
mi2c_stop(i2cif); mi2c_stop(i2cif);
mi2c_unlock();
return size; return size;
} }
...@@ -112,6 +127,10 @@ static int eeprom_write(uint8_t i2cif, uint8_t i2c_addr, uint32_t offset, ...@@ -112,6 +127,10 @@ static int eeprom_write(uint8_t i2cif, uint8_t i2c_addr, uint32_t offset,
if (!has_eeprom) if (!has_eeprom)
return -1; return -1;
if(!mi2c_poll(BUS_TIME_OUT))
return -2;
mi2c_lock();
for (i = 0; i < size; i++) { for (i = 0; i < size; i++) {
mi2c_start(i2cif); mi2c_start(i2cif);
...@@ -132,6 +151,7 @@ static int eeprom_write(uint8_t i2cif, uint8_t i2c_addr, uint32_t offset, ...@@ -132,6 +151,7 @@ static int eeprom_write(uint8_t i2cif, uint8_t i2c_addr, uint32_t offset,
} while (busy); } while (busy);
} }
mi2c_unlock();
return size; return size;
} }
......
...@@ -25,6 +25,37 @@ void mi2c_delay(void) ...@@ -25,6 +25,37 @@ void mi2c_delay(void)
#define M_SCL_OUT(i, x) { gpio_out(i2c_if[i].scl, x); mi2c_delay(); } #define M_SCL_OUT(i, x) { gpio_out(i2c_if[i].scl, x); mi2c_delay(); }
#define M_SDA_IN(i) gpio_in(i2c_if[i].sda) #define M_SDA_IN(i) gpio_in(i2c_if[i].sda)
uint8_t mi2c_poll(uint32_t time_out_us)
{
//mi2c_delay ~= 5us if CPU frequency is 62.5MHz
uint32_t us = (uint32_t)(time_out_us / 5);
uint32_t i;
for(i = 0; i < us; i++)
{
//if FMC I2C bus is locked
if(gpio_in(WRC_FMC_I2C_LCK))
{
mi2c_delay();
}
else
{
return 1;
}
}
return 0;
}
void mi2c_lock(void)
{
gpio_out(WRC_FMC_I2C_SEL,1);
}
void mi2c_unlock(void)
{
gpio_out(WRC_FMC_I2C_SEL,0);
}
void mi2c_start(uint8_t i2cif) void mi2c_start(uint8_t i2cif)
{ {
M_SDA_OUT(i2cif, 0); M_SDA_OUT(i2cif, 0);
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* File : wrc_syscon_regs.h * File : wrc_syscon_regs.h
* Author : auto-generated by wbgen2 from wrc_syscon_wb.wb * Author : auto-generated by wbgen2 from wrc_syscon_wb.wb
* Created : Wed Sep 25 14:35:39 2013 * Created : Mon Jun 6 15:29:37 2016
* Standard : ANSI C * Standard : ANSI C
THIS FILE WAS GENERATED BY wbgen2 FROM SOURCE FILE wrc_syscon_wb.wb THIS FILE WAS GENERATED BY wbgen2 FROM SOURCE FILE wrc_syscon_wb.wb
...@@ -86,6 +86,12 @@ ...@@ -86,6 +86,12 @@
/* definitions for field: SPI bitbanged MISO in reg: GPIO Set/Readback Register */ /* definitions for field: SPI bitbanged MISO in reg: GPIO Set/Readback Register */
#define SYSC_GPSR_SPI_MISO WBGEN2_GEN_MASK(13, 1) #define SYSC_GPSR_SPI_MISO WBGEN2_GEN_MASK(13, 1)
/* definitions for field: Select FMC I2C bus in reg: GPIO Set/Readback Register */
#define SYSC_GPSR_FMC_SEL WBGEN2_GEN_MASK(14, 1)
/* definitions for field: FMC I2C bus locked in reg: GPIO Set/Readback Register */
#define SYSC_GPSR_FMC_LCK WBGEN2_GEN_MASK(15, 1)
/* definitions for register: GPIO Clear Register */ /* definitions for register: GPIO Clear Register */
/* definitions for field: Status LED in reg: GPIO Clear Register */ /* definitions for field: Status LED in reg: GPIO Clear Register */
...@@ -115,6 +121,9 @@ ...@@ -115,6 +121,9 @@
/* definitions for field: SPI bitbanged MOSI in reg: GPIO Clear Register */ /* definitions for field: SPI bitbanged MOSI in reg: GPIO Clear Register */
#define SYSC_GPCR_SPI_MOSI WBGEN2_GEN_MASK(12, 1) #define SYSC_GPCR_SPI_MOSI WBGEN2_GEN_MASK(12, 1)
/* definitions for field: Select FMC I2C bus in reg: GPIO Clear Register */
#define SYSC_GPCR_FMC_SEL WBGEN2_GEN_MASK(14, 1)
/* definitions for register: Hardware Feature Register */ /* definitions for register: Hardware Feature Register */
/* definitions for field: Memory size in reg: Hardware Feature Register */ /* definitions for field: Memory size in reg: Hardware Feature Register */
......
...@@ -7,7 +7,10 @@ ...@@ -7,7 +7,10 @@
#define __I2C_H #define __I2C_H
uint8_t mi2c_devprobe(uint8_t i2cif, uint8_t i2c_addr); uint8_t mi2c_devprobe(uint8_t i2cif, uint8_t i2c_addr);
uint8_t mi2c_poll(uint32_t time_out_ms); //ONLY for fmc i2c
void mi2c_init(uint8_t i2cif); void mi2c_init(uint8_t i2cif);
void mi2c_lock(void); //ONLY for fmc i2c
void mi2c_unlock(void); //ONLY for fmc i2c
void mi2c_start(uint8_t i2cif); void mi2c_start(uint8_t i2cif);
void mi2c_repeat_start(uint8_t i2cif); void mi2c_repeat_start(uint8_t i2cif);
void mi2c_stop(uint8_t i2cif); void mi2c_stop(uint8_t i2cif);
......
...@@ -61,6 +61,8 @@ struct SYSCON_WB { ...@@ -61,6 +61,8 @@ struct SYSCON_WB {
#define GPIO_SPI_NCS SYSC_GPSR_SPI_NCS #define GPIO_SPI_NCS SYSC_GPSR_SPI_NCS
#define GPIO_SPI_MOSI SYSC_GPSR_SPI_MOSI #define GPIO_SPI_MOSI SYSC_GPSR_SPI_MOSI
#define GPIO_SPI_MISO SYSC_GPSR_SPI_MISO #define GPIO_SPI_MISO SYSC_GPSR_SPI_MISO
#define WRC_FMC_I2C_SEL SYSC_GPSR_FMC_SEL
#define WRC_FMC_I2C_LCK SYSC_GPSR_FMC_LCK
#define WRPC_FMC_I2C 0 #define WRPC_FMC_I2C 0
#define WRPC_SFP_I2C 1 #define WRPC_SFP_I2C 1
......
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