MB1 PMIC I2C commands

Hi,

I am assisting in the design of a custom carrier board for the Orin NX. The PMIC that has been chosen for the SSD requires some configuration via I2C to set correct voltage levels for the SSD prior to being enabled.

From what I can tell from the following documentation, this should be possible: PMIC Configuration — NVIDIA Jetson Linux Developer Guide

I am trying to test this functionality by connecting an I2C device to I2C1 on Jetson development carrier board, and adding some additional configuration to bootloader/generic/BCT/tegra234-mb1-bct-pmic-p3767-0000-a02.dts to send some custom I2C commands to the device I have connected.

When I try to flash the board with these changes, the flashing fails with the following error, and I don’t see the command I’m expecting in logic analyzer captures:

[0047.166] I> Task: Prod config init
[0047.170] I> Task: Pad voltage init
[0047.173] I> Task: Prod init
[0047.176] I> Task: Program rst req config reg
[0047.180] I> Task: Common rail init
[0047.185] W> DEVICE_PROD: module = 13, instance = 4 not found in device prod.
[0047.192] E> I2C: slave not found in slaves.
[0047.196] E> I2C: Could not write 0 bytes to slave: 0x0068 with repeat start true.
[0047.204] E> I2C_DEV: Failed to send register address 0x76.
[0047.210] C> NONE: Failed to update reg address 0x76 of slave 0x68 in i2c block :0 in pad voltage config table.
[0047.220] E> PMIC_CONFIG: Failed to initialize Rail: Thermal config.
[0047.226] C> Task 0x2b failed (err: 0x57573d02)
[0047.230] E> Top caller module: PMIC_CONFIG, error module: PMIC_CONFIG, reason: 0x02, aux_info: 0x3d
[0047.239] C> Boot Info Table status dump :
011111110011100011111111111111111111111111100000000000000000000000000000000000011111

Full log files of the flashing, Jetson serial console output, and MB1 configuration diff are attached:
flash_2025-07-14T15:52+00:00.log (278.7 KB)
tio_usb-FTDI_TTL232R-3V3_FTCKEH1C-if00-port0_2025-07-14T11:52:15.log (28.5 KB)
pmic_custom_i2c_cmds.patch.txt (940 Bytes)

Any help is greatly appreciated. Thanks!

Do you boot to the system to check the I2C communication to confirm the device connection?

Yes, I am able to read registers from the device when the system is booted using i2cget. Reading an ID/whoami register returns the expected value.

Have you confirmed the I2C address is 0x76 for your I2C device?

Could you flash/boot the board if you remove those configurations?

+        ssd {
+            block@3 {
+				i2c-controller;
+				controller-id = <0x4>;
+				slave-addr = <0x68>;
+				reg-data-size = <8>;
+				reg-addr-size = <8>;
+				block-delay = <3>;
+                commands {
+					command@0 {
+						reg-addr = <0x76>;
+						value = <0x0>;
+					};
+                };
+            };
+        };

Yes, I can flash and boot the board without this configuration.

0x68 is the I2C device address of the chip I am trying to talk to. 0x76 is the register address I am attempting to write to. Running the following i2cset command has the intended result:

i2cset -y 1 0x68 0x76 0x00

I think my biggest questions are in regards to the following lines:

[0047.192] E> I2C: slave not found in slaves.
[0047.196] E> I2C: Could not write 0 bytes to slave: 0x0068 with repeat start true.

First, I’m not sure what to make of “I2C: slave not found in slaves”. Is this indicating that the chip is not acking after the slave address is transmitted?

With regards to the second line, “I2C: Could not write 0 bytes to slave: 0x0068 with repeat start true”, my intention is write a single byte. Is this a secondary error caused by the previous error?

Another thing I’d like to confirm is the mapping of the I2C busses in the bootloader vs user-space. Does controller-id = <0x1>; map to I2C bus 1 as enumerated in the Linux kernel and DTB?

I’ve tried a number of different controller-id values, all of which resulted in the same errors, and I didn’t see anything on a logic analyzer I had connected

It seems it can not find slave device from 0x68 address so that i writes failed.

Correct, I would expect you specify controller-id = <0x1>; if you are using I2C1.

May I know why you specify block@3 here?

I had tried controller-id = <0x1> previously, and again today, I still get the same error. Setting controller-id = <0x4> was part of a brute force attempt to find out if the I2C bus some mapped different in the bootloader. I attached an updated patch. I’ve also included a scope capture of what I see on I2C1 when attempting flash with this patch.

pmic_custom_i2c_cmds.patch.txt (709 Bytes)

Originally I had the block inserted into one of the existing rail config blocks (specifically the “core” block), and I copied into it’s own block.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.

Hi cameron50,

0x68(01101000b) is the 8-bits I2C address you specified for slave-addr in device tree, and 0x34(0110100b) is the 7-bits I2C address you found on logic analyzer. It is a write command to this I2C address.

Do you still get above error when you get the I2C waveform?

Have you tried using other I2C mater device to write reg 0x76 of your 0x68 I2C device successfully?
From the waveform you shared, it indicates that the Orin NX has tried to write the expected data you specified in dtsi correctly but your I2C device may not respond.

Ah, I think I see the issue now. 0x68 is the 7-bit address of the chip. The documentation for the slave-addr parameter on the following page had me confused: PMIC Configuration — NVIDIA Jetson Linux Developer Guide It states that slave-addr is the 7-bit slave device address. It makes no mention of the R/W bit. So really I needed to shift the 7-bit address left by 1, and set slave-addr = 0xD0;. Once I set this, it seems to work as intended.

Probably should’ve realized this earlier, but I don’t work with I2C very often.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.