|
|
|
@ -20,25 +20,22 @@ static void |
|
|
|
|
i2c_init(int speed, int slaveaddr) |
|
|
|
|
{ |
|
|
|
|
unsigned int n, m, freq, margin, power; |
|
|
|
|
unsigned int actualFreq, actualN=0, actualM=0; |
|
|
|
|
unsigned int actualFreq, actualN = 0, actualM = 0; |
|
|
|
|
unsigned int control, status; |
|
|
|
|
unsigned int minMargin = 0xffffffff; |
|
|
|
|
unsigned int tclk = 125000000; |
|
|
|
|
|
|
|
|
|
DP(puts("i2c_init\n")); |
|
|
|
|
|
|
|
|
|
for(n = 0 ; n < 8 ; n++) |
|
|
|
|
{ |
|
|
|
|
for(m = 0 ; m < 16 ; m++) |
|
|
|
|
{ |
|
|
|
|
for (n = 0 ; n < 8 ; n++) { |
|
|
|
|
for (m = 0 ; m < 16 ; m++) { |
|
|
|
|
power = 2<<n; /* power = 2^(n+1) */ |
|
|
|
|
freq = tclk/(10*(m+1)*power); |
|
|
|
|
if (speed > freq) |
|
|
|
|
margin = speed - freq; |
|
|
|
|
else |
|
|
|
|
margin = freq - speed; |
|
|
|
|
if(margin < minMargin) |
|
|
|
|
{ |
|
|
|
|
if (margin < minMargin) { |
|
|
|
|
minMargin = margin; |
|
|
|
|
actualFreq = freq; |
|
|
|
|
actualN = n; |
|
|
|
@ -91,13 +88,13 @@ i2c_start(void) |
|
|
|
|
udelay(I2C_DELAY); |
|
|
|
|
if (count > 20) { |
|
|
|
|
GT_REG_WRITE(I2C_CONTROL, (0x1 << 4)); /*stop*/ |
|
|
|
|
return (status); |
|
|
|
|
return status; |
|
|
|
|
} |
|
|
|
|
GT_REG_READ(I2C_STATUS_BAUDE_RATE, &status); |
|
|
|
|
count++; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return (0); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static uchar |
|
|
|
@ -110,9 +107,8 @@ i2c_select_device(uchar dev_addr, uchar read, int ten_bit) |
|
|
|
|
|
|
|
|
|
/* Output slave address */ |
|
|
|
|
|
|
|
|
|
if (ten_bit) { |
|
|
|
|
if (ten_bit) |
|
|
|
|
bits = 10; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
data = (dev_addr << 1); |
|
|
|
|
/* set the read bit */ |
|
|
|
@ -129,7 +125,7 @@ i2c_select_device(uchar dev_addr, uchar read, int ten_bit) |
|
|
|
|
udelay(I2C_DELAY); |
|
|
|
|
if (count > 20) { |
|
|
|
|
GT_REG_WRITE(I2C_CONTROL, (0x1 << 4)); /*stop*/ |
|
|
|
|
return(status); |
|
|
|
|
return status; |
|
|
|
|
} |
|
|
|
|
GT_REG_READ(I2C_STATUS_BAUDE_RATE, &status); |
|
|
|
|
count++; |
|
|
|
@ -137,14 +133,14 @@ i2c_select_device(uchar dev_addr, uchar read, int ten_bit) |
|
|
|
|
|
|
|
|
|
if (bits == 10) { |
|
|
|
|
printf("10 bit I2C addressing not yet implemented\n"); |
|
|
|
|
return (0xff); |
|
|
|
|
return 0xff; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return (0); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static uchar |
|
|
|
|
i2c_get_data(uchar* return_data, int len) { |
|
|
|
|
i2c_get_data(uchar *return_data, int len) { |
|
|
|
|
|
|
|
|
|
unsigned int data, status = 0; |
|
|
|
|
int count = 0; |
|
|
|
@ -163,7 +159,7 @@ i2c_get_data(uchar* return_data, int len) { |
|
|
|
|
count++; |
|
|
|
|
while ((status & 0xff) != 0x50) { |
|
|
|
|
udelay(I2C_DELAY); |
|
|
|
|
if(count > 2) { |
|
|
|
|
if (count > 2) { |
|
|
|
|
GT_REG_WRITE(I2C_CONTROL, (0x1 << 4)); /*stop*/ |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
@ -178,16 +174,16 @@ i2c_get_data(uchar* return_data, int len) { |
|
|
|
|
RESET_REG_BITS(I2C_CONTROL, BIT2|BIT3); |
|
|
|
|
while ((status & 0xff) != 0x58) { |
|
|
|
|
udelay(I2C_DELAY); |
|
|
|
|
if(count > 200) { |
|
|
|
|
if (count > 200) { |
|
|
|
|
GT_REG_WRITE(I2C_CONTROL, (0x1 << 4)); /*stop*/ |
|
|
|
|
return (status); |
|
|
|
|
return status; |
|
|
|
|
} |
|
|
|
|
GT_REG_READ(I2C_STATUS_BAUDE_RATE, &status); |
|
|
|
|
count++; |
|
|
|
|
} |
|
|
|
|
GT_REG_WRITE(I2C_CONTROL, (0x1 << 4)); /* stop */ |
|
|
|
|
|
|
|
|
|
return (0); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static uchar |
|
|
|
@ -213,9 +209,9 @@ i2c_write_data(unsigned int data, int len) |
|
|
|
|
count++; |
|
|
|
|
while ((status & 0xff) != 0x28) { |
|
|
|
|
udelay(I2C_DELAY); |
|
|
|
|
if(count > 20) { |
|
|
|
|
if (count > 20) { |
|
|
|
|
GT_REG_WRITE(I2C_CONTROL, (0x1 << 4)); /*stop*/ |
|
|
|
|
return (status); |
|
|
|
|
return status; |
|
|
|
|
} |
|
|
|
|
GT_REG_READ(I2C_STATUS_BAUDE_RATE, &status); |
|
|
|
|
count++; |
|
|
|
@ -227,7 +223,7 @@ i2c_write_data(unsigned int data, int len) |
|
|
|
|
|
|
|
|
|
udelay(I2C_DELAY * 10); |
|
|
|
|
|
|
|
|
|
return (0); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static uchar |
|
|
|
@ -254,11 +250,11 @@ i2c_set_dev_offset(uchar dev_addr, unsigned int offset, int ten_bit) |
|
|
|
|
return status; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return (0); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uchar |
|
|
|
|
i2c_read(uchar dev_addr, unsigned int offset, int len, uchar* data, |
|
|
|
|
i2c_read(uchar dev_addr, unsigned int offset, int len, uchar *data, |
|
|
|
|
int ten_bit) |
|
|
|
|
{ |
|
|
|
|
uchar status = 0; |
|
|
|
@ -266,7 +262,7 @@ i2c_read(uchar dev_addr, unsigned int offset, int len, uchar* data, |
|
|
|
|
|
|
|
|
|
DP(puts("i2c_read\n")); |
|
|
|
|
|
|
|
|
|
i2c_init(i2cFreq,0); |
|
|
|
|
i2c_init(i2cFreq, 0); |
|
|
|
|
|
|
|
|
|
status = i2c_start(); |
|
|
|
|
|
|
|
|
@ -285,7 +281,7 @@ i2c_read(uchar dev_addr, unsigned int offset, int len, uchar* data, |
|
|
|
|
return status; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
i2c_init(i2cFreq,0); |
|
|
|
|
i2c_init(i2cFreq, 0); |
|
|
|
|
|
|
|
|
|
status = i2c_start(); |
|
|
|
|
if (status) { |
|
|
|
|