CONTENT:

   i2c.h
   i2c1.c
   i2c2.s

WHAT ARE THESE FILES:

These files contain MPC8240 (Kahlua) I2C
driver routines. The driver routines are not
written for any specific operating system.
They serves the purpose of code sample, and
jump-start for using the MPC8240 I2C unit.

For the reason of correctness of C language
syntax, these files are compiled by Metaware
C compiler and assembler.

ENDIAN NOTATION:

The algorithm is designed for big-endian mode,
software is responsible for byte swapping.

USAGE:

1. The host system that is running on MPC8240
   shall link the files listed here. The memory
   location of driver routines shall take into
   account of that driver routines need to run
   in supervisor mode and they process I2C
   interrupt.

2. The host system is responsible for configuring
   the MPC8240 including Embedded Utilities Memory
   Block. All I2C driver functions require the
   content of Embedded Utilities Memory Block
   Base Address Register, EUMBBAR, as the first
   parameter.

3. Before I2C unit of MPC8240 can be used,
   initialize I2C unit by calling I2C_Init
   with the corresponding parameters.

   Note that the I2CFDR register shall be written
   once during the initialization. If it is written
   in the midst of transers, or after I2C STOPs or
   REPEAT STATRs, depending on the data written,
   a long reset time may be encountered.

4. After I2C unit has been successfully initialized,
   use the Application level API to send data or
   receive data upon the desired mode, Master or
   Slave.

5. If the host system is also using the EPIC unit
   on MPC8240, the system can register the
   I2C_ISR with the EPIC including other
   desired resources.

   If the host system does not using the EPIC unit
   on MPC8240, I2C_Timer_Event function can
   be called for each desired time interval.

   In both cases, the host system is free to provide
   its own timer event handler and interrupt service
   routine.

6. The I2C driver routines contains a set
   of utilities, Set and Get, for host system
   to query and modify the desired I2C registers.

7. It is the host system's responsibility of
   queueing the I2C I/O request. The host
   system shall check the I2C_ISR return code
   for I2C I/O status. If I2C_ISR returns
   I2CBUFFEMPTY or I2CBUFFFULL, it means
   I2C unit has completed a I/O request
   stated by the Application API.

8. If the host system has more than one master
   mode I2C unit I/O requests but doesn't want
   to be intervented by being addressed as slave,
   the host system can use the master mode
   Application API with stop_flag set to 0 in
   conjunction with is_cnt flag set to 1.
   The first API call sets both stop_flag and
   is_cnt to 0, indicating a START condition
   shall be generated but when the end of
   transaction is reached, do not generate a
   STOP condition. Once the host system is
   informed that the transaction has been
   completed, the next Application API call
   shall set is_cnt flag to 1, indicating a
   repeated START condition shall be generated.
   The last Application API call shall set
   stop_flag
   to 1.

9. The I2C_Timer_Event function containes
   a user defined function pointer. It
   serves the purpose of providing the
   host system a way to use its own event
   handler instead of the I2C_ISR provided
   here.

