Developing a Linux driver for a chip with I2C registers: Difference between revisions

From RidgeRun Developer Wiki
(Created page with 'In the past I have always hauled around a simple i2c Linux app I wrote so I could read and write I2C registers when I tried to make sense of some confusing datasheet. This was in…')
 
No edit summary
Line 34: Line 34:


There is a series of steps request to read the X and Y locations, so I wrote a simple shell script
There is a series of steps request to read the X and Y locations, so I wrote a simple shell script
 
<pre>
tsc_read ()
tsc_read ()
{
{
    # first parameter is ASCII charcter between 0 .. 7
  # first parameter is ASCII charcter between 0 .. 7
    tsc_mode=$1
  tsc_mode=$1
    # set the tsc mode
  #enable the ADC and set it to use all TSC functions
    i2cset -y 1 0x48 0x08 0x8$tsc_mode
  i2cset -y -f 1 0x48 0x07 0x9E
    # start the conversion on ADC input TSC
  # set the tsc mode
    i2cset -y 1 0x48 0x07 0xCF
  i2cset -y -f 1 0x48 0x08 0x0$tsc_mode
    # verify we are done (shell script should be slow enough)
  # start the conversion on ADC input TSC
    # check that bit 5 is set
  i2cset -y -f 1 0x48 0x07 0xDE
    i2cget -y 1 0x48 0x07
  # verify we are done (shell script should be slow enough)
    # read the A/D converted value
  # check that bit 5 is set
    i2cget -y 1 0x48 0x0A
  i2cget -y -f 1 0x48 0x07
    i2cget -y 1 0x48 0x09
  # read the A/D converted value
}
  i2cget -y -f 1 0x48 0x0A
  i2cget -y -f 1 0x48 0x09
}
</pre>
And now to read the X and Y locations is easy
And now to read the X and Y locations is easy



Revision as of 14:22, 26 August 2011

In the past I have always hauled around a simple i2c Linux app I wrote so I could read and write I2C registers when I tried to make sense of some confusing datasheet. This was in the dark ages before there was a standard I2C sub-system in Linux.

Recently while working on a touch screen driver for the TI TPS65070 chip (the combo analog chip for the way cool OMAP-L138 SoC), I came across i2c-tools from the folks over at lm-sensors. After a quick port to the SDK framework, I ran the i2cdetect tool and got the output:

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

UU means a chip was detects and since the datasheet said my chip had address 0×48, I was seeing a response I expected.

Next, I read the TPS65070 datasheet to see how to configure the chip to post an interrupt when the screen was touched. I needed to set a couple of I2C registers and for this simple test, I poll once a second.

# step 1 - enable the ADC, select TSC input to ADC
i2cset -y 1 0x48 0x07 0x8F

# step 2 - set tsc mode to detect touch
i2cset -y 1 0x48 0x08 0x05

# step 3 - poll tsc interrupt (bit 3) until it is set
while sleep 1 ; do i2cget -y 1 0x48 0x02 ; done

Example output:

0x00
0x00
0x08
0x00
0x00

As soon as I read the I2C interrupt register, the interrupt is cleared.

There is a series of steps request to read the X and Y locations, so I wrote a simple shell script

tsc_read ()
{
   # first parameter is ASCII charcter between 0 .. 7
   tsc_mode=$1
   #enable the ADC and set it to use all TSC functions
   i2cset -y -f 1 0x48 0x07 0x9E
   # set the tsc mode
   i2cset -y -f 1 0x48 0x08 0x0$tsc_mode
   # start the conversion on ADC input TSC
   i2cset -y -f 1 0x48 0x07 0xDE
   # verify we are done (shell script should be slow enough)
   # check that bit 5 is set
   i2cget -y -f 1 0x48 0x07
   # read the A/D converted value
   i2cget -y -f 1 0x48 0x0A
   i2cget -y -f 1 0x48 0x09
}

And now to read the X and Y locations is easy

# step 4 - read X position
tsc_read 0

# step 5 -read Y position
tsc_read 1

Example output:

# tsc_read 0
0xaf
0x01
0xf6
# tsc_read 1
0xaf
0x01
0x83

meaning on a 10 bit A/D scale 0×000 … 0×3FF (x,y) = (0×1F6, 0×183)

Overall, I found the i2c-tools very helpful in validating I understand how to interact with the chip registers properly.