i2c-EEPROM Access on DragonBoard410c

Hi,
I am new to dragon board 410c.

I have a i2c-eeprom (ATMEL 256 ) connected to my i2c-1 port of the processor. I am using the stock at24 driver available in linux kernel (4.9.27).

I am unable to detect the same. Can anyone help on this ?

The voltage on the i2c-1 port of the 410c is 1.8v. What is the voltage requirement of the i2c-eeprom?

As per the datasheet of EEPROM , it supports 400Khz i2c clock with 1.7 V supply. See the the following snapshot taken from datasheet of EEPROM.

Thanks for sending over the datasheet details. Very helpful. It seems there are two voltage options for the chip. Can you confirm you have the M [1.7v] versus the D [2.5v] option?

image

Yes, I have “M” version eeprom.

How did you configured the at24 driver?

Forget about the driver. The first step is to check if the device is on the bus. Use i2cdetect and see if the device pops up. If it doesn’t, then you need to look at hardware. If it does, then you need to look at driver.

Providing the EEPROM correctly handles SMBus receive byte (which I think it does… looks like SMBus receive byte maps to current address read in the EEPROM) then this is a good plan. Note that the DB410C I2C controller doesn’t support quick writes so the i2cdetect scan needs the -r argument to force the whole probe to be performed using SMBus receive byte.

Following is the snapshot of i2cdetect … It shows device on 0x64 address which is different than EEPROM.
image

Following is my device tree file. (Note: 0x64 is my camera chip driver).

&blsp_i2c6 {
	status = "ok";

	camera_rear@78 {
		// This port isn't really connected to I2C-6
		// This is a hack until CCI driver is a full i2c driver.
		// The device connections listed are for port J3 - MIPI CSI0
		status = "disabled";
		compatible = "ovti,ov5640";
		reg = <0x78>;

		ovti,vflip;
		qcom,use_cci;
		enable-gpios = <&msmgpio 34 GPIO_ACTIVE_LOW>;
		reset-gpios = <&msmgpio 35 GPIO_ACTIVE_LOW>;
		pinctrl-names = "default";
		pinctrl-0 = <&camera_rear_default>;

		clocks = <&gcc GCC_CAMSS_MCLK0_CLK>;
		clock-names = "xclk";
		clock-frequency = <135000000>;

		vdddo-supply = <&camera_vdddo_1v8>;
		vdda-supply = <&camera_vdda_2v8>;
		vddd-supply = <&camera_vddd_1v5>;

		port {
			ov5640_ep: endpoint {
				clock-lanes = <1>;
				data-lanes = <0 2>;
				remote-endpoint = <&csiphy0_ep>;
			};
		};
	};

	/* The camera driver requires all listed ports to have attached devices to bind them
		Set status = "ok" in the camera_front and Camss->ports->port@1 to enable the second camera */

	camera_front@64 {
		// The device connections listed are for port J4 - MIPI CSI1
		status = "ok";
		compatible = "xx,xxxx";
		reg = <0x64>;
    qcom,use_cci;

    reset-gpios = <&msmgpio 36 GPIO_ACTIVE_LOW>;
		pinctrl-names = "default";
		pinctrl-0 = <&camera_front_default>;

		clocks = <&gcc GCC_CAMSS_MCLK1_CLK>;
		clock-names = "xclk";
		clock-frequency = <135000000>;

		port {
			ov564_2_ep: endpoint {
				clock-lanes = <1>;
				data-lanes = <0 2>;
				remote-endpoint = <&csiphy1_ep>;
			};
		};
	};
eeprom@56 {
    status = "ok";
    compatible = "atmel,24c256";
    reg = <0x56>;
  };
};

Just to make sure we understand things…

  1. You are testing with the above device tree clipping present (e.g. 0x64 comes back as UU from the detect because it is in use)
  2. Both devices are attached to the same I2C bus
  3. The eeprom driver failed to probe correctly (otherwise 0x56 would come back as UU) and the device cannot be detected with i2cdetect.

Assuming you can confirm the above I guess there are a couple of questions:

a. How is the device attached to the board? Long wires, short wires, custom board, etc.
b. If you disable both devices in the DT then does i2cdetect see the device at 0x64?
c. Why atmel,24c256? Isn’t the atmel,24c1024 the most similar supported device?

I think its time for schematics and detailed photographs of connections.

I agree with @doitright and @danielt l. Since you failed the i2cdetect I would start looking at the wiring to your eeprom. can you take a picture and post it please.

-Lawrence-
Now working for Irdeto.

Following are my answers to your queries.

  1. Yes, Correct
  2. Yes, Correct
  3. Yes, Correct.
    at24 driver fails during probe.See following sanpshot taken from probe function.

a. How is the device attached to the board? Long wires, short wires, custom board, etc.
We have made custom board which fits to HS and LS connector of Dragonboard410c. It is something similer to D3 camera mezzanine .

b. If you disable both devices in the DT then does i2cdetect see the device at 0x64?
No, i2cdetect doesn’t see 0x64.
c. Why atmel,24c256 ? Isn’t the atmel,24c1024 the most similar supported device?
Yes, I can try that . But I believe that driver fails before verifying the physical device address.

I highly doubt that it is a wiring issue. If I connect the same board to different base board (instead of dragonboard410c) .EEPROM seems to be working.

Only difference between the 2 setups is that dragonboard410c works with 1.8 VCC and 100KHz clock ,other works with 3.3 VCC 400KHz clock.

I have jumper settings on my boards to switch between 2 power supply.

I want to try it with 400KHz with dragon board. Can any one help me to change frequecy on i2c-1 on dragon board?
I have tried changing it from device tree. But it is not getting reflected.

I personally use the mraa library for i2c interaction and allows the setting of the frequency

The library also has a command line utility called mraa-i2c

Frequency chnage with mrr is not working for Dragonboard 410c.

Can anyone help me on this ?

Hi @cchoksi,

You mean different 96Board?

None of our CE boards work with 3.3v I2C clients, unless any level shifter is used externally. Also, DB410c can work with Standard (100KHz)(default), Full speed (400KHz) and Fast mode (1MHz). You need to use clock-frequency property in devicetree for changing the freq.

Can you please share the corresponding DT node? Also, did you observe the frequency change by probing the I2C bus using scope?

Thanks,
Mani

Updated msm8916.dtsi file to change clock frequency of blsp6. See sanp taken from the dtsi file. I have verified in the scope on physical APQ GPIO 29 and 30 pins. I only see 100KHz clock.

	blsp_i2c6: i2c@78ba000 {
		compatible = "qcom,i2c-qup-v2.2.1";
		reg = <0x78ba000 0x1000>;
		interrupts = <GIC_SPI 100 0>;
		clocks = <&gcc GCC_BLSP1_AHB_CLK>,
			<&gcc GCC_BLSP1_QUP6_I2C_APPS_CLK>;
		clock-names = "iface", "core";
		pinctrl-names = "default", "sleep";
		pinctrl-0 = <&i2c6_default>;
		pinctrl-1 = <&i2c6_sleep>;
  clock-frequency = <400000>;
		#address-cells = <1>;
		#size-cells = <0>;
		status = "disabled";
	};

No , Different Vendor.