root/lm-sensors/trunk/doc/busses/i2c-virtual

Revision 2765, 4.9 kB (checked in by mds, 4 years ago)

baseline checkin of virtual adapter code from Ken Harrenstien

<klh@google.com> received Sept. '04.
No changes by me other than include file path fixups.
Compiles, but will not insmod without i2c-core changes
or stubs to add xxx_nolock() functions.


Here you go. I apologize for the fact this code is not integrated
into the lm_sensors package structure and thus will require you to
make various little updates. But I really wanted to get this out
before I'm yanked away again, and am pretty sure you can do it much
faster than I can figure out what needs to be done!

BTW the kernel files are built against 2.4.x where x varies; 18 and 19
should work.

Feel free to clean up anything.

--Ken

On Sat, 18 Sep 2004, Mark Studebaker wrote:

On Tue, 7 Sep 2004, Mark Studebaker wrote:


sure, send it over.
Sorry for delay, your mail got buried by other mail and just now spotted it.
mds

Ken Harrenstien wrote:


It turned out to be a while before I could get back to this, but
everything's been working for a while now and I'd like to send in the
new pca954x driver.

I was looking at the list in the "new_drivers" file -- it *is* kind of
intimidating. Since some of the changes affect core i2c files, I was
hoping that what I could do to start with is just send you a tar of
the modified files in their entirety, or a patch-diff of the changes
against the 2.8.7 distribution, so you can scope things out and verify
they're on the right track for acceptance. The following files are
the ones I've changed so far:

New:
Documentation/i2c/virtual_i2c
drivers/i2c/i2c-virtual.c
drivers/sensors/pca954x.c
include/linux/i2c-virtual.h
Patched:
Documentation/Configure.help
drivers/i2c/Makefile
drivers/i2c/Config.in
drivers/i2c/i2c-core.c
drivers/sensors/Makefile
drivers/sensors/Config.in
include/linux/i2c-id.h
include/linux/i2c.h


I plan to write some additional doc once I know that the code itself
is acceptable, and you then can tell me what other files need to be
updated.

To answer a couple other issues you raised:

On Thu, 24 Jun 2004, Mark Studebaker wrote:




(copying the mailing list, already forwarded the first mail to the list)

First I want to ask whether you are working on kernel 2.4 or 2.6.




2.4.




Third, you may not have realized that Khali recently did a (2.4 kernel) pca9540 driver.
It is in our sensors package. It however doesn't do any of the bootstrapping or
bus registering either. It may or may not help you.




I saw it in the 2.8.7 distrib, and used parts of it as a template.
The pca954x driver will support that chip, although the external /proc
interface it presents is necessarily different.

--Ken

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1 Virtual i2c bus
2 Brian Kuschak  <bkuschak@xxxxxxxxx>
3
4
5 I2C devices must have a unique 7 bit address on the bus to which they
6 are attached.  Many I2C chips have one or more input lines which can be
7 used to configure one or more of their address bits.  This allows the
8 hardware designer to include multiple chips on a single bus by selecting
9 different addresses for each one.  However, some chips have fixed addresses
10 which present a problem if more than one of them are required on a board.
11 Also, sometimes there are more devices than there are selectable addresses.
12
13 A common solution is to break the i2c bus into disjoint segments, by using
14 a multiplexor or i2c bus switch.  This electrically isolates the individual
15 bus segments.  Then the devices with duplicate addresses are placed on
16 separate bus segments, to prevent address conflicts.
17
18 This seems to be a very common approach in certain types of applications,
19 such as bladed chassis, where many identical 'blades' or cards are inserted
20 into a common backplane.  The I2C bus on each blade is then located behind
21 a mux or i2c bus switch.  This solution works great from the hardware
22 perspective, but presents some complexities for software.
23
24 The 'virtual i2c adapter' driver is an attempt to provide a flexible software
25 abstraction to simiplify these issues, while minimizing the impact on
26 existing code and fitting nicely into the i2c driver framework.
27
28
29 What is a 'virtual i2c adapter'
30 ===============================
31
32 Think of this adapter as a layer above the existing algorithm and adapter
33 drivers.  The virtual i2c adapter is the handle by which you access a
34 specific multiplexed bus segment.  Each disjoint bus segment becomes a new
35 virtual bus.  The virtual adapter is associated with a 'real' adapter and a
36 set of multiplexor control variables.
37
38 For example: you have an i2c-0 bus with one multiplexor or i2c bus switch,
39 and the mux has four outputs which can be electrically connected to the
40 i2c-0 bus.  You would register four virtual i2c busses, one for each position
41 of the mux.  As part of the registration, you provide callback functions to
42 select and deselect the mux as well as the selector values to be passed to
43 these functions.
44
45                      ---------  <-------->  i2c-1  virtual
46                     | i2c mux | <-------->  i2c-2  virtual
47    i2c-0 <------->  |         | <-------->  i2c-3  virtual
48   ibm_ocp           |  0x74   | <-------->  i2c-4  virtual
49                      ---------
50                         ^
51                         |
52                         +---  (or externally controlled)
53
54 The mux may be i2c-controlled, in which case the mux_addr is set to the
55 slave address (0x74) and the mux_val would be the port number to select (0-3). 
56 Alternatively, the mux could be controlled by some fixed memory-mapped register
57 in which case only the mux_val would be needed.  The callback functions
58 are hardware specific and written by the user. 
59
60 Once the virtual busses are registered, you may talk to any devices behind
61 the mux simply the using the i2c-1, i2c-2, i2c-3, etc. adapters instead of
62 the i2c-0 adapter.  This makes the mux essentially transparent to the
63 i2c_client.
64
65 The great advantage of course is that all the existing sensor drivers and
66 other i2c client drivers automatically work, and the mux becomes transparent
67 to them.
68
69
70 Additional capabilities
71 =======================
72
73 This driver also supports multiple levels of muxing, by allowing the
74 user to register a virtual bus which has a different virtual bus as its
75 'real' adapter.  In addition, each virtual bus may have different kinds of
76 multiplexors, with each bus having its own set of callback functions.
77 This allows you to easily support some very complex topologies.
78
79 In addition to multiplexing, some systems require that you obtain hardware
80 access to the bus behind the mux before talking on it.  (Again, bladed chassis
81 typically 'fence' other blades off the bus to prevent a crashed blade from
82 bringing down the whole backplane.)  Before talking on this bus, you have to
83 arbitrate with the other blades to acquire exclusive access to the bus.  This
84 requirement is met by the addition of two new function pointers to the
85 algorithm drivers, acquire_exclusive() and release_exclusive().  Traditional
86 adapters will not use these and they can safely be left NULL.  If they are
87 non-null, the virtual bus driver will call the acquire_exclusive() function
88 before attempting any operations on that virtual bus.  This function may block,
89 and this is done before acquiring the lock on the underlying 'real' bus to
90 allow transactions on the real bus to continue unimpeded while waiting for
91 arbitrartion.  In addition the ownership is only held for as long as it takes
92 to complete the transfer. 
93
94
95 Files
96 =====
97
98 drivers/i2c/i2c-virtual.c:      The 'algorithm' and 'adapter' driver
99 include/linux/i2c-virtual.h:    Header file with the mux control structure
100                                 and callback prototypes.
101
102
Note: See TracBrowser for help on using the browser.