Commit 172ee7d2 authored by Grzegorz Daniluk's avatar Grzegorz Daniluk

i2c driver for two interfaces in syscon

parent 7597b055
PLATFORM = lm32 PLATFORM = lm32
OBJS_WRC = wrc_main.o dev/uart.o dev/endpoint.o dev/minic.o dev/pps_gen.o dev/syscon.o dev/onewire.o dev/softpll.o lib/mprintf.o monitor/monitor.o dev/ep_pfilter.o dev/dna.o OBJS_WRC = wrc_main.o dev/uart.o dev/endpoint.o dev/minic.o dev/pps_gen.o dev/syscon.o dev/i2c.o dev/onewire.o dev/softpll.o lib/mprintf.o monitor/monitor.o dev/ep_pfilter.o dev/dna.o
D = ptp-noposix D = ptp-noposix
PTPD_CFLAGS = -ffreestanding -DPTPD_FREESTANDING -DWRPC_EXTRA_SLIM -DPTPD_MSBF -DPTPD_DBG PTPD_CFLAGS = -ffreestanding -DPTPD_FREESTANDING -DWRPC_EXTRA_SLIM -DPTPD_MSBF -DPTPD_DBG
......
...@@ -2,99 +2,112 @@ ...@@ -2,99 +2,112 @@
#include "board.h" #include "board.h"
#include "syscon.h" #include "syscon.h"
#define I2C_DELAY 100 #define I2C_DELAY 300
static void mi2c_delay() void mi2c_delay()
{ {
int i; int i;
for(i=0;i<I2C_DELAY;i++) asm volatile ("nop"); for(i=0;i<I2C_DELAY;i++) asm volatile ("nop");
} }
#define M_SDA_OUT(x) { gpio_out(GPIO_SDA, x); mi2c_delay(); } #define M_SDA_OUT(i, x) { gpio_out(i2c_if[i].sda, x); mi2c_delay(); }
#define M_SCL_OUT(x) { gpio_out(GPIO_SCL, x); mi2c_delay(); } #define M_SCL_OUT(i, x) { gpio_out(i2c_if[i].scl, x); mi2c_delay(); }
#define M_SDA_IN gpio_in(GPIO_SDA) #define M_SDA_IN(i) gpio_in(i2c_if[i].sda)
void mi2c_start() void mi2c_start(uint8_t i2cif)
{ {
M_SDA_OUT(0); M_SDA_OUT(i2cif, 0);
M_SCL_OUT(0); M_SCL_OUT(i2cif, 0);
} }
void mi2c_repeat_start() void mi2c_repeat_start(uint8_t i2cif)
{ {
M_SDA_OUT(1); M_SDA_OUT(i2cif, 1);
M_SCL_OUT(1); M_SCL_OUT(i2cif, 1);
M_SDA_OUT(0); M_SDA_OUT(i2cif, 0);
M_SCL_OUT(0); M_SCL_OUT(i2cif, 0);
} }
void mi2c_stop() void mi2c_stop(uint8_t i2cif)
{ {
M_SDA_OUT(0); M_SDA_OUT(i2cif, 0);
M_SCL_OUT(1); M_SCL_OUT(i2cif, 1);
M_SDA_OUT(1); M_SDA_OUT(i2cif, 1);
} }
unsigned char mi2c_put_byte(unsigned char data) unsigned char mi2c_put_byte(uint8_t i2cif, unsigned char data)
{ {
char i; char i;
unsigned char ack; unsigned char ack;
for (i=0;i<8;i++, data<<=1) for (i=0;i<8;i++, data<<=1)
{ {
M_SDA_OUT(data&0x80); M_SDA_OUT(i2cif, data&0x80);
M_SCL_OUT(1); M_SCL_OUT(i2cif, 1);
M_SCL_OUT(0); M_SCL_OUT(i2cif, 0);
} }
M_SDA_OUT(1); M_SDA_OUT(i2cif, 1);
M_SCL_OUT(1); M_SCL_OUT(i2cif, 1);
ack = M_SDA_IN; /* ack: sda is pulled low ->success. */ ack = M_SDA_IN(i2cif); /* ack: sda is pulled low ->success. */
M_SCL_OUT(0); M_SCL_OUT(i2cif, 0);
M_SDA_OUT(0); M_SDA_OUT(i2cif, 0);
return ack!=0; return ack!=0;
} }
void mi2c_get_byte(unsigned char *data) void mi2c_get_byte(uint8_t i2cif, unsigned char *data, uint8_t last)
{ {
int i; int i;
unsigned char indata = 0; unsigned char indata = 0;
M_SDA_OUT(i2cif, 1);
/* assert: scl is low */ /* assert: scl is low */
M_SCL_OUT(0); M_SCL_OUT(i2cif, 0);
for (i=0;i<8;i++) for (i=0;i<8;i++)
{ {
M_SCL_OUT(1); M_SCL_OUT(i2cif, 1);
indata <<= 1; indata <<= 1;
if ( M_SDA_IN ) indata |= 0x01; if ( M_SDA_IN(i2cif) ) indata |= 0x01;
M_SCL_OUT(0); M_SCL_OUT(i2cif, 0);
} }
M_SDA_OUT(1); if(last)
{
M_SDA_OUT(i2cif, 1); //noack
M_SCL_OUT(i2cif, 1);
M_SCL_OUT(i2cif, 0);
}
else
{
M_SDA_OUT(i2cif, 0); //ack
M_SCL_OUT(i2cif, 1);
M_SCL_OUT(i2cif, 0);
}
*data= indata; *data= indata;
} }
void mi2c_init() void mi2c_init(uint8_t i2cif)
{ {
M_SCL_OUT(1); M_SCL_OUT(i2cif, 1);
M_SDA_OUT(1); M_SDA_OUT(i2cif, 1);
} }
void mi2c_scan() void mi2c_scan(uint8_t i2cif)
{ {
int i; int i;
for(i=0;i<0x80;i++) for(i=0;i<0x80;i++)
{ {
mi2c_start(); mi2c_start(i2cif);
mprintf("scan %d\n",i); // mprintf("scan %x\n",i);
if(!mi2c_put_byte(i<<1)) mprintf("found : %x\n", i); if(!mi2c_put_byte(i2cif, i<<1)) mprintf("found : %x\n", i);
mi2c_stop(); mi2c_stop(i2cif);
} }
} }
#include "syscon.h" #include "syscon.h"
struct s_i2c_if i2c_if[2] = { {SYSC_GPSR_FMC_SCL, SYSC_GPSR_FMC_SDA},
{SYSC_GPSR_SFP_SCL, SYSC_GPSR_SFP_SDA} };
/**************************** /****************************
* TIMER * TIMER
***************************/ ***************************/
......
#ifndef __I2C_H
#define __I2C_H
void mi2c_init(uint8_t i2cif);
void mi2c_start(uint8_t i2cif);
void mi2c_repeat_start(uint8_t i2cif);
void mi2c_stop(uint8_t i2cif);
void mi2c_get_byte(uint8_t i2cif, unsigned char *data, uint8_t last);
unsigned char mi2c_put_byte(uint8_t i2cif, unsigned char data);
void mi2c_delay();
void mi2c_scan(uint8_t i2cif);
int eeprom_read(uint8_t i2cif, uint8_t i2c_addr, uint32_t offset, uint8_t *buf, size_t size);
uint16_t eeprom_sfp_section(uint8_t i2cif, uint8_t i2c_addr, size_t size, uint16_t *section_sz);
int eeprom_write(uint8_t i2cif, uint8_t i2c_addr, uint32_t offset, uint8_t *buf, size_t size);
#endif
...@@ -19,10 +19,20 @@ struct SYSCON_WB ...@@ -19,10 +19,20 @@ struct SYSCON_WB
/*GPIO pins*/ /*GPIO pins*/
#define GPIO_LED_LINK SYSC_GPSR_LED_LINK #define GPIO_LED_LINK SYSC_GPSR_LED_LINK
#define GPIO_LED_STAT SYSC_GPSR_LED_STAT #define GPIO_LED_STAT SYSC_GPSR_LED_STAT
#define GPIO_SCL SYSC_GPSR_FMC_SCL
#define GPIO_SDA SYSC_GPSR_FMC_SDA
#define GPIO_BTN1 SYSC_GPSR_BTN1 #define GPIO_BTN1 SYSC_GPSR_BTN1
#define GPIO_BTN2 SYSC_GPSR_BTN2 #define GPIO_BTN2 SYSC_GPSR_BTN2
#define GPIO_SFP_DET SYSC_GPSR_SFP_DET
#define WRPC_FMC_I2C 0
#define WRPC_SFP_I2C 1
struct s_i2c_if
{
uint32_t scl;
uint32_t sda;
};
struct s_i2c_if i2c_if[2];
void timer_init(uint32_t enable); void timer_init(uint32_t enable);
uint32_t timer_get_tics(); uint32_t timer_get_tics();
......
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