All of lore.kernel.org
 help / color / mirror / Atom feed
* Add I2C with PCA9665
@ 2013-06-28 10:26 Elyas Razzaghi
       [not found] ` <51CD64D5.60907-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  0 siblings, 1 reply; 3+ messages in thread
From: Elyas Razzaghi @ 2013-06-28 10:26 UTC (permalink / raw)
  To: linux-i2c-u79uwXL29TY76Z2rM5mHXA

Hi,

I am using the PCA9665 controller in my custom board because the 
internal I2C controller of my processor (AT91RM9200) is not robust. The 
following are my configs:

Hardware:

D0 - D7 --> D0 - D7
Write strobe --> NWR0/NWE/CFWE
Read strobe --> NRD/NOE/CFOE
Chip Enable --> NCS2
A0 --> A0/NBS0
A1 --> A1
Interrupt request --> PB29/IRQ0
Reset --> PB27

Software:

static struct resource i2c_resources[] = {
     [0] = {
         .start    = AT91_CHIPSELECT_2,    /* 0x30000000 */
         .end    = AT91_CHIPSELECT_2 + SZ_16K - 1,
         .flags    = IORESOURCE_MEM,
     },
     [1] = {
         .start    = AT91RM9200_ID_IRQ0,
         .end    = AT91RM9200_ID_IRQ0,
         .flags    = IORESOURCE_IRQ,
     },
};

static struct i2c_pca9564_pf_platform_data pca9665_platform_data = {
     .gpio        = AT91_PIN_PB27,
     .i2c_clock_speed= 0,
     .timeout    = HZ,        /* timeout in jiffies */
};

static struct platform_device pca9665_twi_device = {
     .name        = "i2c-pca-platform",
     .id        = -1,
     .dev        = {
                 .platform_data = &pca9665_platform_data,
             },
     .num_resources    = ARRAY_SIZE(i2c_resources),
     .resource    = i2c_resources,
};

void __init at91_add_device_i2c(struct i2c_board_info *devices, int 
nr_devices)
{
     at91_set_A_periph(AT91_PIN_PB29, 1);        /* IRQ0 interrupt pin */
     i2c_register_board_info(0, devices, nr_devices);
     platform_device_register(&pca9665_twi_device);
}

But the board detects the wrong external I2C controller (PCA9564):

# dmesg | grep PCA
PCA9564/PCA9665 at 0x30000000: PCA9564 detected.
PCA9564/PCA9665 at 0x30000000: Choosing the clock frequency based on 
index is deprecated. Use the nominal frequency.
PCA9564/PCA9665 at 0x30000000: Clock frequency is 330kHz
PCA9564/PCA9665 at 0x30000000 registered.

And, the i2c controller is not functional at all. The i2cdetect command 
of i2c-tools package from lm-sensors, does not detect any devices on my 
i2c bus, while there must be two i2c devices (a RTC and a temperature 
sensor) on my board. There is no i2c clock or data signal either on the 
bus using the oscilloscope probe.

How can I fix this so the board detects the functional and correct 
controller (PCA9665)?

Best regards,
Elyas Razzaghi

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Add I2C with PCA9665
       [not found] ` <51CD64D5.60907-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2013-06-28 10:45   ` Wolfram Sang
  2013-06-28 19:47     ` Elyas Razzaghi
  0 siblings, 1 reply; 3+ messages in thread
From: Wolfram Sang @ 2013-06-28 10:45 UTC (permalink / raw)
  To: Elyas Razzaghi; +Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA

[-- Attachment #1: Type: text/plain, Size: 390 bytes --]

> static struct resource i2c_resources[] = {
>     [0] = {
>         .start    = AT91_CHIPSELECT_2,    /* 0x30000000 */
>         .end    = AT91_CHIPSELECT_2 + SZ_16K - 1,
>         .flags    = IORESOURCE_MEM,

Unless reading 0x30000000 does not return something like 0xf8, you have
a problem with mapping in the register range. Make sure the, 8 bit bus
width works.

Regards,

   Wolfram


[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Add I2C with PCA9665
  2013-06-28 10:45   ` Wolfram Sang
@ 2013-06-28 19:47     ` Elyas Razzaghi
  0 siblings, 0 replies; 3+ messages in thread
From: Elyas Razzaghi @ 2013-06-28 19:47 UTC (permalink / raw)
  To: Wolfram Sang; +Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA

Hi,

Thanks a lot Wolfram for the hint. I have added the mapping configs:

#if defined (CONFIG_I2C_PCA_PLATFORM) || defined(CONFIG_I2C_ALGOPCA)


static struct resource i2c_resources[] = {
    [0] = {
        .start    = AT91_CHIPSELECT_2,    /* 0x30000000 */
        .end    = AT91_CHIPSELECT_2 + SZ_16K - 1,
        .flags    = IORESOURCE_MEM | IORESOURCE_MEM_8BIT,

    },
    [1] = {
        .start    = AT91RM9200_ID_IRQ0,
        .end    = AT91RM9200_ID_IRQ0,
        .flags    = IORESOURCE_IRQ,
    },
};

static struct i2c_pca9564_pf_platform_data pca9665_platform_data = {
    .gpio        = AT91_PIN_PB27,
    .i2c_clock_speed= 400000,

    .timeout    = HZ,        /* timeout in jiffies */
};

static struct platform_device pca9665_twi_device = {
    .name        = "i2c-pca-platform",
    .id        = -1,
    .dev        = {
                .platform_data = &pca9665_platform_data,
            },
    .num_resources    = ARRAY_SIZE(i2c_resources),
    .resource    = i2c_resources,
};

static struct i2c_board_info __initdata ek_i2c_devices[] = {
    {
        I2C_BOARD_INFO("lm75", 0x48),
    },
    {
        I2C_BOARD_INFO("pcf8523", 0x68),
    },
};

void __init at91_add_device_i2c_pca(struct i2c_board_info *devices,
int nr_devices)

{
    at91_set_A_periph(AT91_PIN_PB29, 1);        /* IRQ0 interrupt pin */

    /* Initialization of the Static Memory Controller for Chip Select 2 */
    at91_ramc_write(0, AT91_SMC_CSR(2), AT91_SMC_ACSS_STD
        | AT91_SMC_DBW_8    /* 8 bit */
        | AT91_SMC_WSEN        /* Wait State Enable */
    );

    i2c_register_board_info(0, devices, nr_devices);
    platform_device_register(&pca9665_twi_device);
}

#endif

 And now the correct controller is detected:

# dmesg | grep PCA
PCA9564/PCA9665 at 0x30000000: PCA9665 detected.
PCA9564/PCA9665 at 0x30000000: Clock frequency is 400000Hz
PCA9564/PCA9665 at 0x30000000 registered.

The i2c devices are also detected:

# i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Best regards,
Elyas

On Fri, Jun 28, 2013 at 1:45 PM, Wolfram Sang <wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org> wrote:
>> static struct resource i2c_resources[] = {
>>     [0] = {
>>         .start    = AT91_CHIPSELECT_2,    /* 0x30000000 */
>>         .end    = AT91_CHIPSELECT_2 + SZ_16K - 1,
>>         .flags    = IORESOURCE_MEM,
>
> Unless reading 0x30000000 does not return something like 0xf8, you have
> a problem with mapping in the register range. Make sure the, 8 bit bus
> width works.
>
> Regards,
>
>    Wolfram
>

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2013-06-28 19:47 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-06-28 10:26 Add I2C with PCA9665 Elyas Razzaghi
     [not found] ` <51CD64D5.60907-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-06-28 10:45   ` Wolfram Sang
2013-06-28 19:47     ` Elyas Razzaghi

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.