minix/drivers/i2c
Thomas Cort 228e84ad2a i2c: general clean-up
Implement changes based on Kees comments on the code review:
	http://gerrit-minix.few.vu.nl/#/c/676/

Changes:
 - use spin API instead of micro_delay() for busy-wait loops.
 - use read16/write16/set16 from mmio.h to access I2C registers.
 - reduce the timeout for soft reset.
 - in read/write, don't mix variable declaration and initialization.
 - after transfer, wait for access ready instead of blindly delaying.
 - rename constants am335x, dm37xx to AM335X_I2C_BUS, DM37XX_I2C_BUS.
 - rename ADDRESS_MASK to MAX_I2C_SA_MASK for clairity.
 - rename omap_i2c_claim_bus() to omap_i2c_bus_is_free().

Change-Id: Ic221e6134e024ea0a6690f21cff208a728286948
2013-08-13 16:29:22 -04:00
..
arch/earm i2c: general clean-up 2013-08-13 16:29:22 -04:00
i2c.c i2c: initial bus drivers for am335x and dm37xx 2013-07-15 11:11:13 -04:00
Makefile i2c: initial bus drivers for am335x and dm37xx 2013-07-15 11:11:13 -04:00
README.txt i2c: initial bus drivers for am335x and dm37xx 2013-07-15 11:11:13 -04:00

Minix i2c Driver
================

TODO: this probably belongs on the wiki

Overview
--------

This is the driver for the i2c bus. It provides the same /dev interface as
NetBSD and OpenBSD (see dev/i2c/i2c_io.h). It also provides an interface for
other drivers to access the I2C bus using Minix IPC.

Organization and Layout
-----------------------

i2c.c					generic i2c bus driver
arch/					arch specific code
	earm/				earm specific code
		omap_i2c.c		AM335X/DM37XX i2c bus driver	
		omap_i2c.h		AM335X/DM37XX function prototypes
		omap_i2c_registers.h 	AM335X/DM37XX register offsets, etc.

Testing the Code
----------------

Below are the steps needed to start up the i2c driver instances. Though,
now they get started at boot in /usr/etc/rc, it's still useful to know if
you take down the service and need to start it again.

Creating the device files (this is already done automatically, but if not):

cd /dev && MAKEDEV i2c-1 && MAKEDEV i2c-2 && MAKEDEV i2c-3

Starting up the instances:

/bin/service up /usr/sbin/i2c -dev /dev/i2c-1 -label i2c.1 -args instance=1
/bin/service up /usr/sbin/i2c -dev /dev/i2c-2 -label i2c.2 -args instance=2
/bin/service up /usr/sbin/i2c -dev /dev/i2c-3 -label i2c.3 -args instance=3

There is an i2cscan program from NetBSD which can detect devices on the bus:

i2cscan -r /dev/i2c-1
i2cscan -r /dev/i2c-2
i2cscan -r /dev/i2c-3

Limitations
-----------

The i2c controllers used in the am335x and the dm37xx do not support zero
byte transfers. Writing 0 bytes is a common method used to probe the bus
for devices. Most of the address ranges i2cscan scans are done by this
method. Therefore, only a subset of devices on the bus will be detected by
i2cscan (i.e. the devices it detects using the 1 byte read method). See
the register description for I2C_CNT in the technical reference manuals
for details about why 0 byte transfers are not allowed.

Developing I2C Device Drivers
-----------------------------

The driver for the EEPROM (a.k.a. drivers/cat24c256) is the hello world of
Minix i2c device drivers. It shows how to use the i2cdriver library and
how to use the bus for reads and writes. commands/eepromread is another
place to look if you're interested in accessing devices through the /dev
interface.