Hi, please bear with me: I’m a junior embedded developer who has been pouring over various documents for weeks and I need to make some progress, so I need to ask questions.
Background: I am writing a driver for a custom kernel which is not linux, and target environment is the TK1 with this custom kernel.
My situation is that I have developed an I2C driver which I have tested and proven to be working on I2C0 (GEN1_I2C_SCL/SDA). I can connect a logic analyzer to the bus and see my driver driving the bus just fine.
However, when I attempt to use I2C3, I run into the following behaviour:
[*] The I2C controller reports that the SDA line is held low. It reports this by means of the BUS_CLEAR_STATUS register's bit for checking this.
[*] If I ignore the fact that the controller senses the SDA line held low, and attempt to write or read bytes out anyway, the controller will (as expected) lock up, waiting for the SDA line to go high. So I can't ignore this.
[*] When I measure the voltage on the SCL and SDA lines for I2C3, I see that the voltages are held constant at 1.2 volts.
[*] If I manipulate the lines (CAM_I2C_SCL and CAM_I2C_SDA) as GPIOs, then when I set the lines low, they show 1.0 volts, and when I set them high, they show 1.2 volts.
 This is relevant because when I boot L4T on the board instead of our custom kernel, Linux is able to pull these lines (CAM_I2C_SCL and CAM_I2C_SDA) up to 3.3 volts, very early in the boot process – in fact before Linux even begins printing its kernel log it pulls the lines up to 3.3 volts.
 This is also relevant because on our custom kernel, when I am testing with I2C0, which is the controller which “works”, the voltages are 3.3v.
It is my current hypothesis that I need to pull the I2C3 lines up to 3.3v, but I have no idea how to do this. I’m not very strong on electrical engineering.
I would be extremely grateful if you gentlemen and ladies could do one of the following for me:
[*] Tell me the section in the TK1 Reference Manual which describes how to change the voltages of the rails.
[*] Point me to some file in the Linux source which contains the code to perform this voltage change.
[*] Point me to the Device Tree source which contains the description of the voltage configurations.
Or else, somehow give me some pointers on where to start to mimic Linux’s ability to change, in software the voltage of the I2C lines on I2C3.