mini board PCU9669 (and PCA9665) sample code

Dependencies:   mbed PCU9669 utility PCA9665 I2C_slaves parallel_bus

Fork of mini_board_PCU9669_old by InetrfaceProducts NXP

Sample code for PCU9669 (PCU9661, PCA9663, PCA9661 and PCA9665) evaluation board.

PCU9669 evaluation board: Mini board PCU9669
User manual is available -> http://www.nxp.com/documents/user_manual/UM10580.pdf

Files at this revision

API Documentation at this revision

Comitter:
nxp_ip
Date:
Wed Mar 28 04:32:50 2012 +0000
Parent:
7:87fd13f1faa6
Child:
9:7a7d4292dfe9
Commit message:
correction for comment on header part of each files (date: 26-Mar-2011 --> 26-Mar-2012)

Changed in this revision

config.h Show annotated file Show diff for this revision Revisions of this file
main_PCA9665.c Show annotated file Show diff for this revision Revisions of this file
main_PCU9669.c Show annotated file Show diff for this revision Revisions of this file
mini_board_libs/I2C_slaves/PCA9629_reg.h Show annotated file Show diff for this revision Revisions of this file
mini_board_libs/I2C_slaves/PCx9955_reg.h Show annotated file Show diff for this revision Revisions of this file
mini_board_libs/PCA9665.lib Show diff for this revision Revisions of this file
mini_board_libs/PCA9665/.lib Show annotated file Show diff for this revision Revisions of this file
mini_board_libs/PCA9665/PCA9665_access.c Show annotated file Show diff for this revision Revisions of this file
mini_board_libs/PCA9665/PCA9665_access.h Show annotated file Show diff for this revision Revisions of this file
mini_board_libs/PCU9669.lib Show diff for this revision Revisions of this file
mini_board_libs/PCU9669/.lib Show annotated file Show diff for this revision Revisions of this file
mini_board_libs/PCU9669/PCU9669_access.c Show annotated file Show diff for this revision Revisions of this file
mini_board_libs/PCU9669/PCU9669_access.h Show annotated file Show diff for this revision Revisions of this file
mini_board_libs/PCU9669/transfer_manager.c Show annotated file Show diff for this revision Revisions of this file
mini_board_libs/PCU9669/transfer_manager.h Show annotated file Show diff for this revision Revisions of this file
mini_board_libs/parallel_bus.lib Show diff for this revision Revisions of this file
mini_board_libs/parallel_bus/.lib Show annotated file Show diff for this revision Revisions of this file
mini_board_libs/parallel_bus/hardware_abs.c Show annotated file Show diff for this revision Revisions of this file
mini_board_libs/parallel_bus/hardware_abs.h Show annotated file Show diff for this revision Revisions of this file
mini_board_libs/utility.lib Show diff for this revision Revisions of this file
mini_board_libs/utility/.lib Show annotated file Show diff for this revision Revisions of this file
mini_board_libs/utility/utility.c Show annotated file Show diff for this revision Revisions of this file
mini_board_libs/utility/utility.h Show annotated file Show diff for this revision Revisions of this file
--- a/config.h	Wed Mar 28 04:29:27 2012 +0000
+++ b/config.h	Wed Mar 28 04:32:50 2012 +0000
@@ -1,34 +1,34 @@
-/** A sample code for "mini board PCU9669/PCA9665"
- *
- *  @author  Akifumi (Tedd) OKANO, NXP Semiconductors
- *  @version 1.0
- *  @date    26-Mar-2011
- *
- *  Released under the MIT License: http://mbed.org/license/mit
- *
- *  An operation sample of PCU9669/PCA9665 I2C bus controller.
- *  The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging.
- *  The bit-banging is poerformed by PortInOut function of mbed library.
- *
- *    To make the code porting easier, all codes are partitioned into layers to abstract other parts.
- *    The mbed specific parts are concentrated in lowest layer: "hardware_abs.*".
- *    This module may need to be modified for the porting.
- *
- *    All other upper layers are writen in standard-C.
- *
- *    base code is written from 05-Sep-2011 to 09-Sep-2011.
- *    And demo code has been build on 11-Sep-2011.
- *    Debug and code adjustment has been done on 08-Sep-2011.
- *    Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011
- *    hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012
- *    PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. 
- *    
- *    Before builidng the code, please edit the file mini_board_PCU9669/config.h
- *    Un-comment the target name what you want to target. 
- */
-
-#define     CODE_FOR_PCU9669
-//#define     CODE_FOR_PCA9663
-//#define     CODE_FOR_PCA9665
-
-
+/** A sample code for "mini board PCU9669/PCA9665"
+ *
+ *  @author  Akifumi (Tedd) OKANO, NXP Semiconductors
+ *  @version 1.0
+ *  @date    26-Mar-2012
+ *
+ *  Released under the MIT License: http://mbed.org/license/mit
+ *
+ *  An operation sample of PCU9669/PCA9665 I2C bus controller.
+ *  The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging.
+ *  The bit-banging is poerformed by PortInOut function of mbed library.
+ *
+ *    To make the code porting easier, all codes are partitioned into layers to abstract other parts.
+ *    The mbed specific parts are concentrated in lowest layer: "hardware_abs.*".
+ *    This module may need to be modified for the porting.
+ *
+ *    All other upper layers are writen in standard-C.
+ *
+ *    base code is written from 05-Sep-2011 to 09-Sep-2011.
+ *    And demo code has been build on 11-Sep-2011.
+ *    Debug and code adjustment has been done on 08-Sep-2011.
+ *    Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011
+ *    hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012
+ *    PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. 
+ *    
+ *    Before builidng the code, please edit the file mini_board_PCU9669/config.h
+ *    Un-comment the target name what you want to target. 
+ */
+
+#define     CODE_FOR_PCU9669
+//#define     CODE_FOR_PCA9663
+//#define     CODE_FOR_PCA9665
+
+
--- a/main_PCA9665.c	Wed Mar 28 04:29:27 2012 +0000
+++ b/main_PCA9665.c	Wed Mar 28 04:32:50 2012 +0000
@@ -2,7 +2,7 @@
  *
  *  @author  Akifumi (Tedd) OKANO, NXP Semiconductors
  *  @version 1.0
- *  @date    26-Mar-2011
+ *  @date    26-Mar-2012
  *
  *  Released under the MIT License: http://mbed.org/license/mit
  *
--- a/main_PCU9669.c	Wed Mar 28 04:29:27 2012 +0000
+++ b/main_PCU9669.c	Wed Mar 28 04:32:50 2012 +0000
@@ -2,7 +2,7 @@
  *
  *  @author  Akifumi (Tedd) OKANO, NXP Semiconductors
  *  @version 1.0
- *  @date    26-Mar-2011
+ *  @date    26-Mar-2012
  *
  *  Released under the MIT License: http://mbed.org/license/mit
  *
--- a/mini_board_libs/I2C_slaves/PCA9629_reg.h	Wed Mar 28 04:29:27 2012 +0000
+++ b/mini_board_libs/I2C_slaves/PCA9629_reg.h	Wed Mar 28 04:32:50 2012 +0000
@@ -1,66 +1,66 @@
-/** A sample code for "mini board PCU9669/PCA9665"
- *
- *  @author  Akifumi (Tedd) OKANO, NXP Semiconductors
- *  @version 1.0
- *  @date    26-Mar-2011
- *
- *  Released under the MIT License: http://mbed.org/license/mit
- *
- *  An operation sample of PCU9669/PCA9665 I2C bus controller.
- *  The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging.
- *  The bit-banging is poerformed by PortInOut function of mbed library.
- *
- *    To make the code porting easier, all codes are partitioned into layers to abstract other parts.
- *    The mbed specific parts are concentrated in lowest layer: "hardware_abs.*".
- *    This module may need to be modified for the porting.
- *
- *    All other upper layers are writen in standard-C.
- *
- *    base code is written from 05-Sep-2011 to 09-Sep-2011.
- *    And demo code has been build on 11-Sep-2011.
- *    Debug and code adjustment has been done on 08-Sep-2011.
- *    Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011
- *    hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012
- *    PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. 
- *    
- *    Before builidng the code, please edit the file mini_board_PCU9669/config.h
- *    Un-comment the target name what you want to target. 
- */
-
-
-/** PCA9629 related definitions
- *  
- *  PCA9629's internal register name and address definitions, I2C address difinitions
- */
-
-#ifndef MINIBOARD_PCA9629_REG__
-#define MINIBOARD_PCA9629_REG__
-
-
-/** @var PCA9629 I2C bus addresses
- */
-
-typedef enum {
-    PCA9629_ADDR0   = 0x40,
-    PCA9629_ADDR1   = 0x42,
-    PCA9629_ADDR2   = 0x44,
-    PCA9629_ADDR3   = 0x46,
-    PCA9629_ADDR4   = 0x48,
-    PCA9629_ADDR5   = 0x4A,
-    PCA9629_ADDR6   = 0x4C,
-    PCA9629_ADDR7   = 0x4E,
-    PCA9629_ADDR8   = 0x50,
-    PCA9629_ADDR9   = 0x52,
-    PCA9629_ADDRA   = 0x54,
-    PCA9629_ADDRB   = 0x56,
-    PCA9629_ADDRC   = 0x58,
-    PCA9629_ADDRD   = 0x5A,
-    PCA9629_ADDRE   = 0x5C,
-    PCA9629_ADDRF   = 0x5E,
-}
-pca9629_addr;
-
-
-#endif  //  MINIBOARD_PCA9629_REG__
-
-
+/** A sample code for "mini board PCU9669/PCA9665"
+ *
+ *  @author  Akifumi (Tedd) OKANO, NXP Semiconductors
+ *  @version 1.0
+ *  @date    26-Mar-2012
+ *
+ *  Released under the MIT License: http://mbed.org/license/mit
+ *
+ *  An operation sample of PCU9669/PCA9665 I2C bus controller.
+ *  The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging.
+ *  The bit-banging is poerformed by PortInOut function of mbed library.
+ *
+ *    To make the code porting easier, all codes are partitioned into layers to abstract other parts.
+ *    The mbed specific parts are concentrated in lowest layer: "hardware_abs.*".
+ *    This module may need to be modified for the porting.
+ *
+ *    All other upper layers are writen in standard-C.
+ *
+ *    base code is written from 05-Sep-2011 to 09-Sep-2011.
+ *    And demo code has been build on 11-Sep-2011.
+ *    Debug and code adjustment has been done on 08-Sep-2011.
+ *    Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011
+ *    hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012
+ *    PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. 
+ *    
+ *    Before builidng the code, please edit the file mini_board_PCU9669/config.h
+ *    Un-comment the target name what you want to target. 
+ */
+
+
+/** PCA9629 related definitions
+ *  
+ *  PCA9629's internal register name and address definitions, I2C address difinitions
+ */
+
+#ifndef MINIBOARD_PCA9629_REG__
+#define MINIBOARD_PCA9629_REG__
+
+
+/** @var PCA9629 I2C bus addresses
+ */
+
+typedef enum {
+    PCA9629_ADDR0   = 0x40,
+    PCA9629_ADDR1   = 0x42,
+    PCA9629_ADDR2   = 0x44,
+    PCA9629_ADDR3   = 0x46,
+    PCA9629_ADDR4   = 0x48,
+    PCA9629_ADDR5   = 0x4A,
+    PCA9629_ADDR6   = 0x4C,
+    PCA9629_ADDR7   = 0x4E,
+    PCA9629_ADDR8   = 0x50,
+    PCA9629_ADDR9   = 0x52,
+    PCA9629_ADDRA   = 0x54,
+    PCA9629_ADDRB   = 0x56,
+    PCA9629_ADDRC   = 0x58,
+    PCA9629_ADDRD   = 0x5A,
+    PCA9629_ADDRE   = 0x5C,
+    PCA9629_ADDRF   = 0x5E,
+}
+pca9629_addr;
+
+
+#endif  //  MINIBOARD_PCA9629_REG__
+
+
--- a/mini_board_libs/I2C_slaves/PCx9955_reg.h	Wed Mar 28 04:29:27 2012 +0000
+++ b/mini_board_libs/I2C_slaves/PCx9955_reg.h	Wed Mar 28 04:32:50 2012 +0000
@@ -1,8 +1,8 @@
 /** A sample code for "mini board PCU9669/PCA9665"
  *
  *  @author  Akifumi (Tedd) OKANO, NXP Semiconductors
- *  @version 1.0
- *  @date    26-Mar-2011
+ *  @version 1.01
+ *  @date    26-Mar-2012
  *
  *  Released under the MIT License: http://mbed.org/license/mit
  *
--- a/mini_board_libs/PCA9665.lib	Wed Mar 28 04:29:27 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://mbed.org/users/nxp_ip/libraries/PCA9665/m7gm2b
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mini_board_libs/PCA9665/.lib	Wed Mar 28 04:32:50 2012 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/nxp_ip/libraries/PCA9665/m7gm2b
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mini_board_libs/PCA9665/PCA9665_access.c	Wed Mar 28 04:32:50 2012 +0000
@@ -0,0 +1,414 @@
+/** A sample code for "mini board PCU9669/PCA9665"
+ *
+ *  @author  Akifumi (Tedd) OKANO, NXP Semiconductors
+ *  @version 1.0
+ *  @date    26-Mar-2012
+ *
+ *  Released under the MIT License: http://mbed.org/license/mit
+ *
+ *  An operation sample of PCU9669/PCA9665 I2C bus controller.
+ *  The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging.
+ *  The bit-banging is poerformed by PortInOut function of mbed library.
+ *
+ *    To make the code porting easier, all codes are partitioned into layers to abstract other parts.
+ *    The mbed specific parts are concentrated in lowest layer: "hardware_abs.*".
+ *    This module may need to be modified for the porting.
+ *
+ *    All other upper layers are writen in standard-C.
+ *
+ *    base code is written from 05-Sep-2011 to 09-Sep-2011.
+ *    And demo code has been build on 11-Sep-2011.
+ *    Debug and code adjustment has been done on 08-Sep-2011.
+ *    Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011
+ *    hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012
+ *    PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. 
+ *    
+ *    Before builidng the code, please edit the file mini_board_PCU9669/config.h
+ *    Un-comment the target name what you want to target. 
+ */
+
+#include "PCA9665_access.h"
+#include "hardware_abs.h"
+
+#define     BUS_CONTINUE            0
+#define     BUS_STOP                1
+#define     BUS_RELEASE             2
+
+typedef enum {
+    I2CSTA  = 0x0,
+    INDPTR  = 0x0,
+    I2CDAT,
+    INDIRECT,
+    I2CCON
+}
+pca9665_direct_registers;
+
+typedef enum {
+    I2CCOUNT,
+    I2CADR,
+    I2CSCLL,
+    I2CSCLH,
+    I2CTO,
+    I2CPRESET,
+    I2CMODE
+}
+pca9665_indirect_registers;
+
+typedef enum {
+    ILLEGAL_START_STOP              = 0x00,
+    MASTER_START_TXed               = 0x08,
+    MASTER_RESTART_TXed             = 0x10,
+    MASTER_SLA_W_ACK                = 0x18,
+    MASTER_SLA_W_NAK                = 0x20,
+    MASTER_DATA_W_ACK               = 0x28,
+    MASTER_DATA_W_NAK               = 0x30,
+    MASTER_ARB_LOST                 = 0x38,
+    MASTER_SLA_R_ACK                = 0x40,
+    MASTER_SLA_R_NAK                = 0x48,
+    MASTER_DATA_R_ACK               = 0x50,
+    MASTER_DATA_R_NAK               = 0x58,
+    SLAVE_ADDRESSED_W               = 0x60,
+    SLAVE_AL_ADDRESSED_W            = 0x68,
+    SDA_STUCK                       = 0x70,
+    SCL_STUCK                       = 0x78,
+    SLAVE_DATA_RX_ACK               = 0x80,
+    SLAVE_DATA_RX_NAK               = 0x88,
+    SLAVE_STOP_OR_RESTART           = 0xA0,
+    SLAVE_ADDRESSED_R               = 0xA8,
+    SLAVE_AL_ADDRESSED_R            = 0xB0,
+    SLAVE_DATA_TX_ACK               = 0xB8,
+    SLAVE_DATA_TX_NAK               = 0xC0,
+    SLAVE_LAST_DATA_TX_ACK          = 0xC8,
+    SLAVE_GENERALCALL               = 0xD0,
+    SLAVE_GENERALCALL_AL            = 0xD8,
+    SLAVE_GENERALCALL_DATA_RX_ACK   = 0xE0,
+    SLAVE_GENERALCALL_DATA_RX_NAK   = 0xE8,
+    IDLE                            = 0xF8,
+    ILLEGAL_I2CCOUNT                = 0xFC
+}
+pca9665_status;
+
+typedef struct _speed_mode_st {
+    char    i2cmode;
+    char    i2cscll;
+    char    i2csclh;
+}
+speed_mode_st;
+
+speed_mode_st   speed_mode[ 3 ]     = {
+    { 0x00, 0x9D, 0x86 },
+    { 0x01, 0x2C, 0x14 },
+    { 0x02, 0x011, 0x09 }
+};
+
+int     buffer_mode_enable  = DISABLE;
+char    int_happened        = 0;
+char    op_mode_flag        = OP_MODE_MASTER_ONLY;
+
+void interrupt_handler_PCA9665( void ) {
+    int_happened    = 1;
+}
+
+void PCA9665_init( void ) {
+    write_data( I2CCON, 0x40 );
+    hw_wait_us( 1000 );
+
+    install_ISR( &interrupt_handler_PCA9665 );              //  interrupt service routine install
+
+    //  initialize PCA9955 registers
+}
+
+void set_speed_mode( int mode ) {
+    indirect_write( I2CMODE, speed_mode[ mode ].i2cmode );
+    indirect_write( I2CSCLL, speed_mode[ mode ].i2cscll );
+    indirect_write( I2CSCLH, speed_mode[ mode ].i2csclh );
+}
+
+void set_buffer_mode( int mode ) {
+    buffer_mode_enable  = mode;
+}
+
+int i2c_write( char addr, char *dp, char length, char restart_flag ) {
+    return (
+               buffer_mode_enable ?
+               i2c_write_buffer_mode( addr, dp, length, restart_flag )
+               :
+               i2c_write_byte_mode( addr, dp, length, restart_flag )
+           );
+}
+
+int i2c_read( char addr, char *dp, char length, char restart_flag ) {
+    return (
+               buffer_mode_enable ?
+               i2c_read_buffer_mode( addr, dp, length, restart_flag )
+               :
+               i2c_read_byte_mode( addr, dp, length, restart_flag )
+           );
+}
+
+
+int i2c_write_buffer_mode( char addr, char *dp, char length, char restart_flag ) {
+    int     done            = BUS_CONTINUE;
+    char    state;
+    char    return_value    = 0xFF;
+#ifdef  PCA9665_BURST_DATA_ACCESS
+#else
+    int     i;
+#endif
+
+    if ( 67 < length )
+        return ( 0xFE );
+
+    write_data( I2CCON, 0x61 );
+
+    while ( !done ) {
+        if ( int_happened ) {
+            int_happened    = 0;
+
+            state   = read_data( I2CSTA );
+
+            switch ( state ) {
+                case MASTER_START_TXed   :
+                case MASTER_RESTART_TXed :
+                    indirect_write( I2CCOUNT, length + 1 );
+                    write_data( I2CDAT, addr & 0xFE );
+
+#ifdef  PCA9665_BURST_DATA_ACCESS
+                    write_data_burst( I2CDAT, dp, length );
+#else
+                    for ( i = 0; i < length; i++ )
+                        write_data( I2CDAT, *dp++ );
+#endif
+
+                    write_data( I2CCON, 0x41 );
+                    break;
+                case MASTER_SLA_W_ACK  :  //  SLA+W TXed
+                case MASTER_DATA_W_ACK :  //  DATA TXed
+                    return_value    = 0x00;
+                    done            = BUS_STOP;
+                    break;
+                case MASTER_SLA_W_NAK  :
+                case MASTER_DATA_W_NAK  :
+                    return_value    = 0x01;
+                    done            = BUS_STOP;
+                    break;
+                case MASTER_ARB_LOST :
+                case SLAVE_AL_ADDRESSED_R :
+                case SLAVE_AL_ADDRESSED_W :
+                case SLAVE_GENERALCALL_AL :
+                    /*  bus should be released for other master  */
+                default :
+                    /*  unexpected bus error  */
+                    done    = BUS_RELEASE;
+                    break;
+            }
+        }
+    }
+
+    if ( OP_MODE_MASTER_ONLY == op_mode_flag )
+        done    = BUS_STOP;
+
+    if ( (BUS_STOP == done) && !restart_flag )
+        write_data( I2CCON, 0x50 );
+
+    return ( return_value );
+}
+
+int i2c_read_buffer_mode( char addr, char *dp, char length, char restart_flag ) {
+    int     done    = BUS_CONTINUE;
+    char    state;
+    char    return_value    = 0xFF;
+
+#ifdef  PCA9665_BURST_DATA_ACCESS
+#else
+    int     i;
+#endif
+
+    if ( 68 < length )
+        return ( 0xFE );
+
+    if ( !length )      //  zero byte read may cause invalid STOP to START signal output
+        return ( 0 );
+
+    write_data( I2CCON, 0x61 );
+
+    while ( !done ) {
+        if ( int_happened ) {
+            int_happened    = 0;
+
+            state   = read_data( I2CSTA );
+
+            switch ( state ) {
+                case MASTER_START_TXed   :
+                case MASTER_RESTART_TXed :
+                    write_data( I2CDAT, addr | 0x01 );
+                    indirect_write( I2CCOUNT, length | 0x80 );
+                    write_data( I2CCON, 0x41 );
+                    break;
+                case MASTER_SLA_R_ACK  :  //  SLA+R TXed
+                case MASTER_DATA_R_ACK :  //  DATA RXed
+                    return_value    = 0x00;
+                    done    = BUS_STOP;
+                    break;
+                case MASTER_SLA_R_NAK  :  //  SLA+R TXed
+                    return_value    = 0x01;
+                    done    = BUS_STOP;
+                    break;
+                case MASTER_DATA_R_NAK  :
+                    return_value    = length - (indirect_read( I2CCOUNT ) & 0x7F);
+                    done    = BUS_STOP;
+
+                    break;
+                case MASTER_ARB_LOST :
+                case SLAVE_AL_ADDRESSED_R :
+                case SLAVE_AL_ADDRESSED_W :
+                case SLAVE_GENERALCALL_AL :
+                    /*  bus should be released for other master  */
+                default :
+                    /*  unexpected bus error  */
+                    done    = BUS_RELEASE;
+                    break;
+            }
+        }
+    }
+
+#ifdef  PCA9665_BURST_DATA_ACCESS
+    read_data_burst( I2CDAT, dp, length );
+#else
+    for ( i = 0; i < length; i++ )
+        *dp++   = read_data( I2CDAT );
+#endif
+
+    if ( OP_MODE_MASTER_ONLY == op_mode_flag )
+        done    = BUS_STOP;
+
+    if ( (BUS_STOP == done) && !restart_flag )
+        write_data( I2CCON, 0x50 );
+
+    return ( return_value );
+}
+
+int i2c_write_byte_mode( char addr, char *dp, char length, char restart_flag ) {
+    int     done            = BUS_CONTINUE;
+    char    state;
+
+    write_data( I2CCON, 0x60 );
+
+    while ( !done ) {
+        if ( int_happened ) {
+            int_happened    = 0;
+
+            state   = read_data( I2CSTA );
+
+            switch ( state ) {
+                case MASTER_START_TXed   :
+                case MASTER_RESTART_TXed :
+                    write_data( I2CDAT, addr & 0xFE );
+                    write_data( I2CCON, 0x40 );
+                    break;
+                case MASTER_DATA_W_ACK :  //  DATA TXed
+                    length--;
+                    /*  FALLTHROUGH  */
+                case MASTER_SLA_W_ACK  :  //  SLA+W TXed
+                    if ( !length ) {
+                        done    = BUS_STOP;
+                        break;
+                    }
+                    write_data( I2CDAT, *dp++ );
+                    write_data( I2CCON, 0x40 );
+                    break;
+                case MASTER_SLA_W_NAK  :
+                case MASTER_DATA_W_NAK  :
+                    done    = BUS_STOP;
+                    break;
+                case MASTER_ARB_LOST :
+                case SLAVE_AL_ADDRESSED_R :
+                case SLAVE_AL_ADDRESSED_W :
+                case SLAVE_GENERALCALL_AL :
+                    /*  bus should be released for other master  */
+                default :
+                    /*  unexpected bus error  */
+                    done    = BUS_RELEASE;
+                    break;
+            }
+        }
+    }
+
+    if ( OP_MODE_MASTER_ONLY == op_mode_flag )
+        done    = BUS_STOP;
+
+    if ( (BUS_STOP == done) && !restart_flag )
+        write_data( I2CCON, 0x50 );
+
+    return ( length );
+}
+
+int i2c_read_byte_mode( char addr, char *dp, char length, char restart_flag ) {
+    int     done    = BUS_CONTINUE;
+    char    state;
+
+    if ( !length )      //  zero byte read may cause invalid STOP to START signal output
+        return ( 0 );
+
+    write_data( I2CCON, 0x60 );
+
+    while ( !done ) {
+        if ( int_happened ) {
+            int_happened    = 0;
+
+            state   = read_data( I2CSTA );
+
+            switch ( state ) {
+                case MASTER_START_TXed   :
+                case MASTER_RESTART_TXed :
+                    write_data( I2CDAT, addr | 0x01 );
+                    write_data( I2CCON, 0x40 );
+                    break;
+                case MASTER_DATA_R_NAK  :
+                    done    = BUS_STOP;
+                    /*  FALLTHROUGH  */
+                case MASTER_DATA_R_ACK :  //  DATA RXed
+                    *dp++   = read_data( I2CDAT );
+                    length--;
+                    /*  FALLTHROUGH  */
+                case MASTER_SLA_R_ACK  :  //  SLA+R TXed
+                    if ( !length )
+                        done    = BUS_STOP;
+
+                    if ( !done )
+                        write_data( I2CCON, (length == 1) ? 0x40 : 0xC0 );
+                    break;
+                case MASTER_SLA_R_NAK :
+                    done    = BUS_STOP;
+                    break;
+                case MASTER_ARB_LOST :
+                case SLAVE_AL_ADDRESSED_R :
+                case SLAVE_AL_ADDRESSED_W :
+                case SLAVE_GENERALCALL_AL :
+                    /*  bus should be released for other master  */
+                default :
+                    /*  unexpected bus error  */
+                    done    = BUS_RELEASE;
+                    break;
+            }
+        }
+    }
+
+    if ( OP_MODE_MASTER_ONLY == op_mode_flag )
+        done    = BUS_STOP;
+
+    if ( (BUS_STOP == done) && !restart_flag )
+        write_data( I2CCON, 0x50 );
+
+    return ( length );
+}
+
+void indirect_write( char idaddr, char data ) {
+    write_data( INDPTR, idaddr );
+    write_data( INDIRECT, data );
+}
+
+char indirect_read( char idaddr ) {
+    write_data( INDPTR, idaddr );
+    return ( read_data( INDIRECT ) );
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mini_board_libs/PCA9665/PCA9665_access.h	Wed Mar 28 04:32:50 2012 +0000
@@ -0,0 +1,77 @@
+/** A sample code for "mini board PCU9669/PCA9665"
+ *
+ *  @author  Akifumi (Tedd) OKANO, NXP Semiconductors
+ *  @version 1.0
+ *  @date    26-Mar-2012
+ *
+ *  Released under the MIT License: http://mbed.org/license/mit
+ *
+ *  An operation sample of PCU9669/PCA9665 I2C bus controller.
+ *  The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging.
+ *  The bit-banging is poerformed by PortInOut function of mbed library.
+ *
+ *    To make the code porting easier, all codes are partitioned into layers to abstract other parts.
+ *    The mbed specific parts are concentrated in lowest layer: "hardware_abs.*".
+ *    This module may need to be modified for the porting.
+ *
+ *    All other upper layers are writen in standard-C.
+ *
+ *    base code is written from 05-Sep-2011 to 09-Sep-2011.
+ *    And demo code has been build on 11-Sep-2011.
+ *    Debug and code adjustment has been done on 08-Sep-2011.
+ *    Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011
+ *    hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012
+ *    PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. 
+ *    
+ *    Before builidng the code, please edit the file mini_board_PCU9669/config.h
+ *    Un-comment the target name what you want to target. 
+ */
+
+#ifndef MINIBOARD_PCA9665_ACCESS__
+#define MINIBOARD_PCA9665_ACCESS__
+
+
+#define     OP_MODE_BOTH            0
+#define     OP_MODE_MASTER_ONLY     1
+#define     OP_MODE_SLAVE_ONLY      2
+
+#define     RESTART_DISABLE         0
+#define     STOP                    RESTART_DISABLE
+#define     RESTART_ENABLE          1
+#define     NEXT_RESTART            RESTART_ENABLE
+
+#define     PCA9665_BURST_DATA_ACCESS
+
+
+typedef enum {
+    SPEED_STD_MODE          = 0,
+    SPEED_FAST_MODE         = 1,
+    SPEED_FAST_MODE_PLUS    = 2
+}
+speed_mode_val;
+
+typedef enum {
+    DISABLE = 0,
+    ENABLE  = 1
+}
+buffer_mode_flag;
+
+void set_speed_mode( int mode );
+void set_buffer_mode( int mode );
+
+int i2c_write( char addr, char *dp, char length, char restart_flag );
+int i2c_read( char addr, char *dp, char length, char restart_flag );
+
+int i2c_write_buffer_mode( char addr, char *dp, char length, char restart_flag );
+int i2c_read_buffer_mode( char addr, char *dp, char length, char restart_flag );
+
+int i2c_write_byte_mode( char addr, char *dp, char length, char restart_flag );
+int i2c_read_byte_mode( char addr, char *dp, char length, char restart_flag );
+
+void PCA9665_init( void );
+
+void indirect_write( char idaddr, char data );
+char indirect_read( char idaddr );
+
+#endif  //  MINIBOARD_PCA9665_ACCESS__
+
--- a/mini_board_libs/PCU9669.lib	Wed Mar 28 04:29:27 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://mbed.org/users/nxp_ip/libraries/PCU9669/m7hiuh
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mini_board_libs/PCU9669/.lib	Wed Mar 28 04:32:50 2012 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/nxp_ip/libraries/PCU9669/m7hiuh
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mini_board_libs/PCU9669/PCU9669_access.c	Wed Mar 28 04:32:50 2012 +0000
@@ -0,0 +1,130 @@
+/** A sample code for "mini board PCU9669/PCA9665"
+ *
+ *  @author  Akifumi (Tedd) OKANO, NXP Semiconductors
+ *  @version 1.0
+ *  @date    26-Mar-2012
+ *
+ *  Released under the MIT License: http://mbed.org/license/mit
+ *
+ *  An operation sample of PCU9669/PCA9665 I2C bus controller.
+ *  The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging.
+ *  The bit-banging is poerformed by PortInOut function of mbed library.
+ *
+ *    To make the code porting easier, all codes are partitioned into layers to abstract other parts.
+ *    The mbed specific parts are concentrated in lowest layer: "hardware_abs.*".
+ *    This module may need to be modified for the porting.
+ *
+ *    All other upper layers are writen in standard-C.
+ *
+ *    base code is written from 05-Sep-2011 to 09-Sep-2011.
+ *    And demo code has been build on 11-Sep-2011.
+ *    Debug and code adjustment has been done on 08-Sep-2011.
+ *    Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011
+ *    hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012
+ *    PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. 
+ *    
+ *    Before builidng the code, please edit the file mini_board_PCU9669/config.h
+ *    Un-comment the target name what you want to target. 
+ */
+
+/*
+ *  "PCU9669_access" module abstracts PCU9669 register and data buffer access. 
+ *  This gives simple interface to the bus controller. 
+ *  All this interface works on "hardware_abs" module. 
+ */
+
+#include    "PCU9669_access.h"  //  PCU9669 chip access interface
+#include    "hardware_abs.h"    //  Using hardware abstraction interface
+
+//  
+//  prototypes (module private function prototypes)
+//
+
+int     is_bus_controller_ready( void );
+int     check_device_ID( char target_id );
+void    registers_initialize( void );
+
+//  variables
+
+char    device_id_code;                                         //  keeps CHIP_ID value
+char    ch_ofst[]   = { OFFSET_CH0, OFFSET_CH1, OFFSET_CH2 };   //  Address offsets of channel registers
+
+//  Channel register writing function
+
+void write_ch_register( char ch, char reg, char val ) {
+    write_data( ch_ofst[ ch ] + reg, val );
+}
+
+//  Channel register reading function
+
+char read_ch_register( char ch, char reg ) {
+    return( read_data( ch_ofst[ ch ] + reg ) );
+}
+
+//  Start routine: It checks the bus controller can be accessed, chip-ID value and initializes registers. 
+
+int start_bus_controller( char target_id ) {
+    if ( is_bus_controller_ready() )
+        return 1;
+
+    if ( check_device_ID( target_id ) )
+        return 2;
+
+    registers_initialize();
+    
+    return 0;
+}
+
+//  (module private finction, called by start_bus_controller)
+//  checks if the bus controller can be accessed
+
+int is_bus_controller_ready( void ) {
+    return ( read_data( CTRLRDY ) );
+}
+
+//  (module private finction, called by start_bus_controller)
+//  checks if chip-ID value is same as expected. The "TARGET_BUS_CONTROLLER" value can be modified in "PCU9669_access.h"
+
+int check_device_ID( char target_id ) {
+    device_id_code  = read_data( DEVICE_ID );
+//    printf( "Target chip: PC%c96%02X, ID register value = 0x%02X\r\n", device_id_code & 0x80 ? 'U' : 'A', device_id_code & 0x7F, device_id_code );
+
+    return ( target_id == device_id_code ) ? 0 : -1;
+}
+
+//  (module private finction, called by start_bus_controller)
+//  register initializations.
+
+void registers_initialize( void ) {
+
+    //  The PCU9669 does not require any specical register initializations. 
+    //  It can start data transfer with default register settings. 
+    //
+    //  Or, if you need to have specific settings modify this function like following sample.
+
+#if 0
+    write_ch_register( CH_UFM1, SCLPER, 32 );
+    write_ch_register( CH_UFM1, SDADLY, 2 );
+    write_ch_register( CH_UFM2, SCLPER, 32 );
+    write_ch_register( CH_UFM2, SDADLY, 2 );
+#endif
+}
+
+//  Next functions are option.
+//  if the BURST_DATA_ACCESS is defined in "hardware_abs.h", it is propagated to define "PCU9969_BURST_DATA_ACCESS"
+//  These interface may be useful for table and buffer access
+
+#ifdef  PCU9969_BURST_DATA_ACCESS
+
+void write_ch_register_burst( char ch, char reg, char *vp, char length ) {
+    write_data_burst( ch_ofst[ ch ] + reg, vp, length );
+}
+
+void read_ch_register_burst( char ch, char reg, char *vp, char length ) {
+    read_data_burst( ch_ofst[ ch ] + reg, vp, length );
+}
+
+#endif
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mini_board_libs/PCU9669/PCU9669_access.h	Wed Mar 28 04:32:50 2012 +0000
@@ -0,0 +1,192 @@
+/** A sample code for "mini board PCU9669/PCA9665"
+ *
+ *  @author  Akifumi (Tedd) OKANO, NXP Semiconductors
+ *  @version 1.0
+ *  @date    26-Mar-2012
+ *
+ *  Released under the MIT License: http://mbed.org/license/mit
+ *
+ *  An operation sample of PCU9669/PCA9665 I2C bus controller.
+ *  The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging.
+ *  The bit-banging is poerformed by PortInOut function of mbed library.
+ *
+ *    To make the code porting easier, all codes are partitioned into layers to abstract other parts.
+ *    The mbed specific parts are concentrated in lowest layer: "hardware_abs.*".
+ *    This module may need to be modified for the porting.
+ *
+ *    All other upper layers are writen in standard-C.
+ *
+ *    base code is written from 05-Sep-2011 to 09-Sep-2011.
+ *    And demo code has been build on 11-Sep-2011.
+ *    Debug and code adjustment has been done on 08-Sep-2011.
+ *    Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011
+ *    hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012
+ *    PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. 
+ *    
+ *    Before builidng the code, please edit the file mini_board_PCU9669/config.h
+ *    Un-comment the target name what you want to target. 
+ */
+
+/** PCU9669 abstraction layer module
+ *  
+ *  Common access method is abstracted in this module. 
+ *  Each channel's registers, global registers and buffer access can be through these interface. 
+ *  This module works on top of hardware abstraction layer. 
+ */
+
+#ifndef __PCU9669_ACCESS__
+#define __PCU9669_ACCESS__
+
+#include    "hardware_abs.h"
+
+/** @def PCU9669_ID / PCA9663_ID / TARGET_BUS_CONTROLLER
+ *
+ *  Device IDs which can be read from DEVICE_ID register. 
+ *  This value may need to be checked before the operation start.
+ */
+#define     PCU9669_ID              0xE9
+#define     PCA9663_ID              0x63
+//#define     TARGET_BUS_CONTROLLER   PCA9663_ID
+
+/** @def CH_FM_PLUS / CH_UFM1 / CH_UFM2
+ *
+ *  Channel number abstracted by its characters.  
+ */
+#define     CH_FM_PLUS      0
+#define     CH_UFM1         1
+#define     CH_UFM2         2
+
+#define     CH_0            0
+#define     CH_1            1
+#define     CH_2            2
+
+/** @var Register names
+ *
+ *  PCU9669/9663 internal register name and addesses
+ */
+typedef enum {
+
+    //  channel registers
+
+    CONTROL     = 0x00, //  These are register offsets. offset base CH0=0xC0, CH1=0xD0, CH2=0xE0
+    CHSTATUS,
+    INTMSK,
+    SLATABLE,
+    TRANCONFIG,
+    DATA,
+    TRANSEL,
+    TRANOFS,
+    BYTECOUNT,
+    FRAMECNT,
+    REFRATE,
+    SCLL,
+    SCLH,
+    MODE,
+    TIMEOUT,
+    PRESET,
+
+    SCLPER      = 0x0B,
+    SDADLY      = 0x0C,
+    RESERVED    = 0x0E,
+
+    //  global registers
+
+    CTRLSTATUS  = 0xF0,
+    CTRLINTMSK,
+    DEVICE_ID   = 0xF6,
+    CTRLPRESET,
+    CTRLRDY     = 0xFF,
+
+    OFFSET_CH0  = 0xC0,
+    OFFSET_CH1  = 0xD0,
+    OFFSET_CH2  = 0xE0,
+
+} RegisterName;
+
+
+/** @var Devide ID code
+ *
+ *  Keeps the value which is read from DEVICE_ID register
+ */
+extern char     device_id_code;
+
+
+/** Write channel register
+ *
+ *  Writing 8 bit data into register in specified channel.
+ *  Register address offset of each channels is added in this function.
+ *
+ *  @param ch target of channel: CH_FM_PLUS | CH_UFM1 | CH_UFM2
+ *  @param reg target channel register: RegisterName
+ *  @param val target of channel: 8 bit value
+ *  @see read_ch_register()
+ */
+void    write_ch_register( char ch, char reg, char val );
+
+/** Read channel register
+ *
+ *  Read 8 bit data from register in specified channel.
+ *  Register address offset of each channels is added in this function.
+ *
+ *  @return 8 bit value from the register
+ *  @param ch target of channel: CH_FM_PLUS | CH_UFM1 | CH_UFM2
+ *  @param reg target channel register: RegisterName
+ *  @see write_ch_register()
+ */
+char    read_ch_register( char ch, char reg );
+
+/** Starting the bus controller (i.e. PCU9669)
+ *
+ *  Checks the bus controller get ready, and ChipID is correct
+ *  Then neccesary register initializations are done. 
+ *  In this reference code, no register initialization done. 
+ *  But if user need to do some, edit a module-private function "registers_initialize()" in "PCU9669_access.cpp"
+ *  
+ *  @return ZERO for no error, 1 for PCU9669 couldn't get ready after reset, 2 for ChipID was not match.
+ */
+int     start_bus_controller( char target_id );
+
+
+/** BURST_DATA_ACCESS option code
+ *
+ *  Following code is enabled only when BURST_DATA_ACCESS is defined in "hardware_abs.h"
+ */
+#ifdef  BURST_DATA_ACCESS
+
+/** @def PCU9669_BURST_DATA_ACCESS
+ *
+ *  PCU9669_BURST_DATA_ACCESS is defied to let upper layer know the burst access is available.
+ *  This happens onlny BURST_DATA_ACCESS is defined in "hardware_abs.h"
+ */
+#define     PCU9669_BURST_DATA_ACCESS
+
+/** Write channel register
+ *
+ *  Write multiple bytes into a register in specified channel.
+ *  Register address offset of each channels is added in this function.
+ *
+ *  @param ch target of channel: CH_FM_PLUS | CH_UFM1 | CH_UFM2
+ *  @param reg target channel register: RegisterName
+ *  @param *vp a pointer to char array. The data in the array will be written.
+ *  @param length length of the data (bytes)
+ *  @see read_ch_register_burst()
+ */
+void    write_ch_register_burst( char ch, char reg, char *vp, char length );
+
+/** Read channel register
+ *
+ *  Read multiple bytes from a register in specified channel.
+ *  Register address offset of each channels is added in this function.
+ *
+ *  @param ch target of channel: CH_FM_PLUS | CH_UFM1 | CH_UFM2
+ *  @param reg target channel register: RegisterName
+ *  @param *vp a pointer to char array. The data will be read into this.
+ *  @param length length of the data (bytes)
+ *  @see write_ch_register_burst()
+ */
+void    read_ch_register_burst( char ch, char reg, char *vp, char length );
+
+#endif  //  BURST_DATA_ACCESS
+
+#endif  //   __PCU9669_ACCESS__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mini_board_libs/PCU9669/transfer_manager.c	Wed Mar 28 04:32:50 2012 +0000
@@ -0,0 +1,179 @@
+/** A sample code for "mini board PCU9669/PCA9665"
+ *
+ *  @author  Akifumi (Tedd) OKANO, NXP Semiconductors
+ *  @version 1.0
+ *  @date    26-Mar-2012
+ *
+ *  Released under the MIT License: http://mbed.org/license/mit
+ *
+ *  An operation sample of PCU9669/PCA9665 I2C bus controller.
+ *  The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging.
+ *  The bit-banging is poerformed by PortInOut function of mbed library.
+ *
+ *    To make the code porting easier, all codes are partitioned into layers to abstract other parts.
+ *    The mbed specific parts are concentrated in lowest layer: "hardware_abs.*".
+ *    This module may need to be modified for the porting.
+ *
+ *    All other upper layers are writen in standard-C.
+ *
+ *    base code is written from 05-Sep-2011 to 09-Sep-2011.
+ *    And demo code has been build on 11-Sep-2011.
+ *    Debug and code adjustment has been done on 08-Sep-2011.
+ *    Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011
+ *    hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012
+ *    PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. 
+ *    
+ *    Before builidng the code, please edit the file mini_board_PCU9669/config.h
+ *    Un-comment the target name what you want to target. 
+ */
+
+/*
+ *  "transfer_manager" is a module to manage I2C bus transfers.
+ *  In this sample code, single slave access (from START or RESTART condition to STOP or next RESTART
+ *  condition) is called transaction.
+ *
+ *  In this software, the transaction is a struct (the struct is defined in "transfer_manager.h")
+ *
+ *      typedef struct  transaction_st {
+ *          char    i2c_address     __attribute__((packed));
+ *          char    *data           __attribute__((packed));
+ *          char    length          __attribute__((packed));
+ *      }
+ *      transaction;
+ *
+ *  The transaction has target I2C slave address pointer to the data array and the data length.
+ *  Read/write drection is maneged by LSB of the i2c_address.
+ *
+ *  For the reading, in this version, a dummy data array can be used but it need to have actual data
+ *  because it will be accessed for buffer filling.
+ *  And transfer manager doesn't readback the buffer. So user need to readback by "buffer_read()"
+ *  function after transaction executed.
+ *
+ *  A transfer can be represented by array of transaction, i.e...
+ *
+ *      transaction     a_sample_of_transfer[];
+ *
+ *  This array_of_transaction: "transfer" is used for the setting of the registers and buffers.
+ *
+ *  See "main.cpp" for the actual sample of those transfer/transaction usage
+ */
+
+#include "transfer_manager.h"
+#include "PCU9669_access.h"     //  PCU9669 chip access interface
+
+void setup_transfer( char ch, transaction *t, char n_of_transaction ) {
+    int     i;
+#ifdef  PCU9969_BURST_DATA_ACCESS
+#else
+    int     j;
+#endif
+
+    write_ch_register( ch, CONTROL, 0x02 );  //  AIPTRRST : AutoIncrementPointerReset (for SLATABLE TRANCONFIG and DATA)
+
+    for ( i = 0; i < n_of_transaction; i++ )
+        write_ch_register( ch, SLATABLE, (t + i)->i2c_address ); //
+
+    write_ch_register( ch, TRANCONFIG, n_of_transaction );  //  first byte of TRANCONFIG sets to # of transactions
+    write_ch_register( ch, TRANSEL, 0 );                    //  select #0 transaction
+
+    for ( i = 0; i < n_of_transaction; i++ )
+        write_ch_register( ch, TRANCONFIG, (t + i)->length );
+
+
+#ifdef  PCU9969_BURST_DATA_ACCESS
+    for ( i = 0; i < n_of_transaction; i++ )
+        write_ch_register_burst( ch, DATA, ((t + i)->data), (t + i)->length );
+
+#else
+    for ( i = 0; i < n_of_transaction; i++ )
+        for ( j = 0; j < (t + i)->length; j++ )
+            write_ch_register( ch, DATA, *(((t + i)->data) + j) );
+#endif
+}
+
+
+void set_n_of_transaction( char ch, char n_of_transaction )
+{
+    write_ch_register( ch, CONTROL, 0x02 );  //  AIPTRRST : AutoIncrementPointerReset (for SLATABLE TRANCONFIG and DATA)
+    write_ch_register( ch, TRANCONFIG, n_of_transaction );  //  first byte of TRANCONFIG sets to # of transactions
+}
+
+
+void buffer_overwrite( char ch, char transaction_number, char offset, char *data, char length ) {
+#ifdef  PCU9969_BURST_DATA_ACCESS
+#else
+    int     i;
+#endif
+
+    write_ch_register( ch, TRANSEL, transaction_number );
+    write_ch_register( ch, TRANOFS, offset );
+
+#ifdef  PCU9969_BURST_DATA_ACCESS
+    write_ch_register_burst( ch, DATA, data, length );
+#else
+    for ( i = 0; i < length; i++ )
+        write_ch_register( ch, DATA, *data++ );
+#endif
+}
+
+void buffer_read( char ch, char transaction_number, char offset, char *data, char length ) {
+#ifdef  PCU9969_BURST_DATA_ACCESS
+#else
+    int     i;
+#endif
+
+    write_ch_register( ch, TRANSEL, transaction_number );
+    write_ch_register( ch, TRANOFS, offset );
+
+#ifdef  PCU9969_BURST_DATA_ACCESS
+    read_ch_register_burst( ch, DATA, data, length );
+#else
+    for ( i = 0; i < length; i++ )
+        *data++ = read_ch_register( ch, DATA );
+#endif
+}
+
+void start( char ch ) {
+    write_ch_register( ch, CONTROL, 0x40 );
+}
+
+void start_by_trigger( char ch, char polarity ) {
+    write_ch_register( ch, CONTROL, 0x48 | (polarity ? 0x10 : 0x00 ) );
+}
+
+void stop( char ch ) {
+    write_ch_register( ch, CONTROL, 0x20 ); //  set STO bit
+}
+
+/*  for test of register access order variation */
+/*
+void setup_transfer( char ch, transaction *t, char n_of_transaction ) {
+    int     i;
+    int     j;
+
+    write_ch_register( ch, CONTROL, 0x02 );                 //  AIPTRRST : AutoIncrementPointerReset (for SLATABLE TRANCONFIG and DATA)
+    write_ch_register( ch, TRANCONFIG, n_of_transaction );  //  first byte of TRANCONFIG sets to # of transactions
+    write_ch_register( ch, TRANSEL, 0 );                    //  select #0 transaction
+
+    for ( i = 0; i < n_of_transaction; i++ ) {
+        write_ch_register( ch, SLATABLE, (t + i)->i2c_address ); //
+        write_ch_register( ch, TRANCONFIG, (t + i)->length );
+        write_ch_register_burst( ch, DATA, ((t + i)->data), (t + i)->length );
+    }
+}
+*/
+
+/*
+void single_transaction_buffer_fill( char ch, char slot, transaction *tp ) {
+    int     i;
+
+    write_ch_register( ch, CONTROL, 0x02 );  //  AIPTRRST : AutoIncrementPointerReset (for SLATABLE TRANCONFIG and DATA)
+    write_ch_register( ch, TRANSEL, slot );     //  select #0 transfer
+    write_ch_register( ch, TRANCONFIG, 1 );  //  first byte of TRANCONFIG sets to # of transactions
+    write_ch_register( ch, TRANCONFIG, tp->length ); //  length of first transaction
+    write_ch_register( ch, SLATABLE, tp->i2c_address ); //
+
+    for ( i = 0; i < length; i++ )
+        write_ch_register( ch, DATA, *data++ ); //
+}
+*/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mini_board_libs/PCU9669/transfer_manager.h	Wed Mar 28 04:32:50 2012 +0000
@@ -0,0 +1,132 @@
+/** A sample code for "mini board PCU9669/PCA9665"
+ *
+ *  @author  Akifumi (Tedd) OKANO, NXP Semiconductors
+ *  @version 1.0
+ *  @date    26-Mar-2012
+ *
+ *  Released under the MIT License: http://mbed.org/license/mit
+ *
+ *  An operation sample of PCU9669/PCA9665 I2C bus controller.
+ *  The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging.
+ *  The bit-banging is poerformed by PortInOut function of mbed library.
+ *
+ *    To make the code porting easier, all codes are partitioned into layers to abstract other parts.
+ *    The mbed specific parts are concentrated in lowest layer: "hardware_abs.*".
+ *    This module may need to be modified for the porting.
+ *
+ *    All other upper layers are writen in standard-C.
+ *
+ *    base code is written from 05-Sep-2011 to 09-Sep-2011.
+ *    And demo code has been build on 11-Sep-2011.
+ *    Debug and code adjustment has been done on 08-Sep-2011.
+ *    Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011
+ *    hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012
+ *    PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. 
+ *    
+ *    Before builidng the code, please edit the file mini_board_PCU9669/config.h
+ *    Un-comment the target name what you want to target. 
+ */
+
+/** Data transfer is abstracted on this layer
+ *  
+ *  The transer can be managed by a struct and some functions
+ */
+#ifndef __TRANSFER_MANAGER__
+#define __TRANSFER_MANAGER__
+
+#define     TRIGGER_BY_RISING_EDGE      0
+#define     TRIGGER_BY_FALLING_EDGE     1
+
+/** @typedef transaction
+ *  
+ *  A transaction (single data read/write access to the slave) is managed by this structure
+ *  An array of the transaction makes a transfer. 
+ *  The sample of the transfer management can be found in "main.cpp". 
+ */
+typedef struct  transaction_st {
+    char    i2c_address     __attribute__((packed));
+    char    *data           __attribute__((packed));
+    char    length          __attribute__((packed));
+}
+transaction;
+
+/** Setup transfer
+ *  
+ *  A transfer (consists multiple transactions) will be set into the buffer.
+ *  This function only sets the data. 
+ *
+ *  @param ch target of channel: CH_FM_PLUS | CH_UFM1 | CH_UFM2
+ *  @param *t a pointer to transaction array. This array represents a transfer.
+ *  @param n_of_transaction number of transactions (how many transactions in this transfer)
+ *  @see setup_transfer()
+ *  @see buffer_overwrite()
+ *  @see buffer_read()
+ *  @see start()
+ */
+void setup_transfer( char ch, transaction *t, char n_of_transaction );
+
+/** Set N of transaction
+ *  
+ *  To modify the N_OF_TRANSACTION
+ *  This can be used to ignore transactions after specified transaction 
+ *
+ *  @param ch target of channel: CH_FM_PLUS | CH_UFM1 | CH_UFM2
+ *  @param n_of_transaction number of transactions (how many transactions in this transfer)
+ *  @see setup_transfer()
+ *  @see buffer_overwrite()
+ *  @see buffer_read()
+ *  @see start()
+ */
+void set_n_of_transaction( char ch, char n_of_transaction );
+
+/** Buffer overwrite (in a transaction)
+ *  
+ *  Buffer contents in a transaction can be overwritten. 
+ *
+ *  @param ch target of channel: CH_FM_PLUS | CH_UFM1 | CH_UFM2
+ *  @param transaction_number points the target transaction by number.
+ *  @param offset offset of overwriting start byte
+ *  @param *data pointer to char array, this contents will be written
+ *  @param length number of bytes to overwrite
+ *  @see setup_transfer()
+ *  @see buffer_overwrite()
+ *  @see buffer_read()
+ *  @see start()
+ */
+void buffer_overwrite( char ch, char transaction_number, char offset, char *data, char length );
+
+/** Buffer read (in a transaction)
+ *  
+ *  Buffer read interface. 
+ *
+ *  @param ch target of channel: CH_FM_PLUS | CH_UFM1 | CH_UFM2
+ *  @param transaction_number points the target transaction by number.
+ *  @param offset offset of reading start byte
+ *  @param *data pointer to char array, the data will be written here
+ *  @param length number of bytes to read
+ *  @see setup_transfer()
+ *  @see buffer_overwrite()
+ *  @see buffer_read()
+ *  @see start()
+ */
+void buffer_read( char ch, char transaction_number, char offset, char *data, char length );
+
+/** Start transfer
+ *  
+ *  Starts the transfer of specified channel 
+ *
+ *  @param ch target of channel: CH_FM_PLUS | CH_UFM1 | CH_UFM2
+ *  @see setup_transfer()
+ *  @see buffer_overwrite()
+ *  @see buffer_read()
+ *  @see start()
+ */
+void start( char ch );
+void start_by_trigger( char ch, char polarity );
+void stop( char ch );
+
+//  void    single_transaction_buffer_fill( char ch, char *data, char length );
+
+
+#endif  //  __TRANSFER_MANAGER__
+
--- a/mini_board_libs/parallel_bus.lib	Wed Mar 28 04:29:27 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://mbed.org/users/nxp_ip/libraries/parallel_bus/m7i4uc
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mini_board_libs/parallel_bus/.lib	Wed Mar 28 04:32:50 2012 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/nxp_ip/libraries/parallel_bus/m7i4uc
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mini_board_libs/parallel_bus/hardware_abs.c	Wed Mar 28 04:32:50 2012 +0000
@@ -0,0 +1,220 @@
+/** A sample code for "mini board PCU9669/PCA9665"
+ *
+ *  @author  Akifumi (Tedd) OKANO, NXP Semiconductors
+ *  @version 1.0
+ *  @date    26-Mar-2012
+ *
+ *  Released under the MIT License: http://mbed.org/license/mit
+ *
+ *  An operation sample of PCU9669/PCA9665 I2C bus controller.
+ *  The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging.
+ *  The bit-banging is poerformed by PortInOut function of mbed library.
+ *
+ *    To make the code porting easier, all codes are partitioned into layers to abstract other parts.
+ *    The mbed specific parts are concentrated in lowest layer: "hardware_abs.*".
+ *    This module may need to be modified for the porting.
+ *
+ *    All other upper layers are writen in standard-C.
+ *
+ *    base code is written from 05-Sep-2011 to 09-Sep-2011.
+ *    And demo code has been build on 11-Sep-2011.
+ *    Debug and code adjustment has been done on 08-Sep-2011.
+ *    Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011
+ *    hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012
+ *    PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. 
+ *    
+ *    Before builidng the code, please edit the file mini_board_PCU9669/config.h
+ *    Un-comment the target name what you want to target. 
+ */
+
+/*
+ *  "hardware_abs" module has been made to abstract hardware: Hardware abstract layer
+ *  This is file which will be modified when the porting done for other MCUs. 
+ */
+ 
+/*
+ *  This sample code has been made for mbed. The code emulates parallel SRAM bus using the mbed's GPIO ports. 
+ *  To maximize the port access speed, PortOut and PortInOut libraly used. 
+ */
+
+#include    "mbed.h"
+#include    "hardware_abs.h"
+
+//  GPIO port setting
+
+#define     ADDR_MASK       0x07878000  //  8 bit address mask on PORT0: Address value will be set into this bit position
+#define     DATA_MASK       0x00000FF0  //  8 bit data mask on PORT0: Data value will be appeared on this bit position
+#define     CONTROL_MASK    0x00000038  //  Control signals CS=bit5(pin21), WR=bit4(pin22), RD=bit3(pin23)
+
+PortOut     addr_port( Port0, ADDR_MASK );
+PortInOut   data_port( Port0, DATA_MASK );
+PortOut     ctrl_port( Port2, CONTROL_MASK );
+InterruptIn int_port( p26 );
+
+//  The very early version of PCU9669 mini board has different configuration. 
+//  Following part switches the port configuration for those board versions.
+
+//#define     PROTOTYPE_BREADBOARD
+
+DigitalInOut    reset_port( p20 );
+//DigitalOut      trig_port( p19 );
+
+//  Next two macros defines interface for temporaly interrupt disable/enable functions. 
+//  These macros are used to blocking interrupt until a bus access cycle completed.
+//  Because if the interrupt happened in a cycle, the emulated parallel port state will be disturbed.  
+//  For the mbed, library routine: __disable_irq() / __enable_irq() can be used. 
+
+#define     interrupt_enable()    __enable_irq()
+#define     interrupt_disable()   __disable_irq()
+
+//  "prev_access_was_write" is a variable to keep the previous data directions. 
+//  Using this flag, successive write and read addess overhead can be reduced. 
+//  This mechanism will not be required if the MCU has parallel port
+
+char        prev_access_was_write;
+
+//  ISR routine installer
+
+void install_ISR( void (*fptr)(void) ) {
+    int_port.fall( fptr );
+}
+
+//  Hardware initialize: it defines initial state of the (emulated) parallel bus
+
+void hardware_initialize( void ) {
+    prev_access_was_write   = 0;
+    ctrl_port               = 0x38;     //  CS, WR and RD are deaserted (HIGH)
+    data_port.input();                  //  data bus set to Hi-Z
+    reset_port.output();
+    reset_port.mode( PullUp );
+}
+
+//  Hardware reset for PCU9669: It asserts RESET signal for 4us and waits 650us after deassert (reset recovery time)
+
+void reset( int reset_pulse_width_us, int reset_recovery_us ) {
+    hardware_reset( ASSERT );            //  Minimum pulse width is 4us for PCU9669
+    hw_wait_us( reset_pulse_width_us );
+    hardware_reset( DEASSERT );          //  deassert hardware /RESET sgnal
+    hw_wait_us( reset_recovery_us );
+}
+
+//  Interface to Control hardware RESET signal
+
+void hardware_reset( char signal ) {
+    reset_port  = signal;
+}
+
+//  Interface to Control hardware TRIGGER signal
+
+void hardware_trigger( char signal ) {
+//    trig_port  = signal;
+}
+
+//  Single write cycle on (emulated) parallel bus
+
+void write_data( char addr, char data ) {
+    interrupt_disable();    //  disable interrupt first
+
+    addr_port   = (addr << 19) | (addr << 15);  //  Address output
+    ctrl_port   = 0x08;                         //  Assert CS and WR signals
+
+    if ( !prev_access_was_write )               //  Data bus direction control
+        data_port.output();
+
+    prev_access_was_write  = 1;
+
+    data_port   = data << 4;                    //  Data output
+    ctrl_port   = 0x38;                         //  Deassert CS and WR
+
+    interrupt_enable();    //  enable interrupt again
+}
+
+
+char read_data( char addr ) {
+    volatile char    tmp;
+    interrupt_disable();    //  disable interrupt first
+
+    if ( prev_access_was_write )    //  Data bus direction control
+        data_port.input();
+
+    prev_access_was_write  = 0;
+
+    addr_port   = (addr << 19) | (addr << 15);  //  Address output
+    ctrl_port   = 0x10;                         //  Assert CS and RD signals
+    ctrl_port   = 0x10;                         //  asserting CS and RD pulse twice (but those are kept LOW) to wait short time till actual read timing
+    tmp         = (data_port >> 4) & 0xFF;      //  Read data bus into var
+    ctrl_port   = 0x38;                         //  Deassert CS and RD
+
+    interrupt_enable();    //  enable interrupt again
+
+    return ( tmp );
+}
+
+//  Wait for micro-seconds
+
+void hw_wait_us( int v ) {
+    wait_us( v );
+}
+
+//  Wait for seconds
+
+void wait_sec( float f ) {
+    wait( f );
+}
+
+//  Following part is an optionto accerelate bus access. 
+//  If such trick is not required, undefine the "BURST_DATA_ACCESS" and don't touch it.
+//
+//  Next two functions access single address with repeating read/write. 
+//  The repeating read/write are used often for PCU9669 like SLATABLE, TRANCONFIG and DATA (buffer accesses). 
+//  So this accerelation contributes saving MCU time. 
+//
+//  For the porting, it may be good idea to modify those routines to DMA access. 
+
+#ifdef  BURST_DATA_ACCESS
+
+void write_data_burst( char addr, char *data, char length ) {
+    int     i;
+
+    interrupt_disable();    //  disable interrupt first
+
+    addr_port   = (addr << 19) | (addr << 15);  //  Address output
+
+    if ( !prev_access_was_write )       //  Data bus direction control
+        data_port.output();
+
+    prev_access_was_write  = 1;
+
+    for ( i = 0; i < length; i++ ) {    //  repeat data write access
+        ctrl_port   = 0x08;
+        data_port   = *(data + i) << 4;
+        ctrl_port   = 0x38;
+    }
+
+    interrupt_enable();
+}
+
+void read_data_burst( char addr, char *data, char length ) {
+    int     i;
+
+    interrupt_disable();    //  disable interrupt first
+
+    addr_port   = (addr << 19) | (addr << 15);  //  Address output
+
+    if ( prev_access_was_write )       //  Data bus direction control
+        data_port.input();
+
+    prev_access_was_write  = 0;
+
+    for ( i = 0; i < length; i++ ) {    //  repeat data read access
+        ctrl_port   = 0x10;
+        ctrl_port   = 0x10;
+
+        *(data + i) = (data_port >> 4) & 0xFF;
+        ctrl_port   = 0x38;
+    }
+    interrupt_enable();
+}
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mini_board_libs/parallel_bus/hardware_abs.h	Wed Mar 28 04:32:50 2012 +0000
@@ -0,0 +1,170 @@
+/** A sample code for "mini board PCU9669/PCA9665"
+ *
+ *  @author  Akifumi (Tedd) OKANO, NXP Semiconductors
+ *  @version 1.0
+ *  @date    26-Mar-2012
+ *
+ *  Released under the MIT License: http://mbed.org/license/mit
+ *
+ *  An operation sample of PCU9669/PCA9665 I2C bus controller.
+ *  The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging.
+ *  The bit-banging is poerformed by PortInOut function of mbed library.
+ *
+ *    To make the code porting easier, all codes are partitioned into layers to abstract other parts.
+ *    The mbed specific parts are concentrated in lowest layer: "hardware_abs.*".
+ *    This module may need to be modified for the porting.
+ *
+ *    All other upper layers are writen in standard-C.
+ *
+ *    base code is written from 05-Sep-2011 to 09-Sep-2011.
+ *    And demo code has been build on 11-Sep-2011.
+ *    Debug and code adjustment has been done on 08-Sep-2011.
+ *    Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011
+ *    hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012
+ *    PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. 
+ *    
+ *    Before builidng the code, please edit the file mini_board_PCU9669/config.h
+ *    Un-comment the target name what you want to target. 
+ */
+
+/** Hardware abstraction layer module
+ *
+ *  All MCU hardware related code are defined in this module
+ *  This module may need to be modified when the code is ported to other MCU. 
+ */
+
+#ifndef MINIBOARD_HARDWARE_ABS__
+#define MINIBOARD_HARDWARE_ABS__
+
+/** @def BURST_DATA_ACCESS
+ *
+ *  To accelerate multiple bus access on same addess, use BURST_DATA_ACCESS
+ *  On the mbed emvironment, this burst access enables 3 times faster read/write compare to single access.
+ *  For code porting, the BURST_DATA_ACCESS code part is not neccesary if the hardware is fast enough. 
+ */
+#define     BURST_DATA_ACCESS
+
+
+/** @def ASSERT / DEASSERT
+ *
+ *  Reset signal logic difinition 
+ */
+#define     ASSERT      0   //  for hardware reset
+#define     DEASSERT    1   //  for hardware reset
+
+
+/** Install an ISR
+ *
+ *  Registering function as ISR. 
+ *  The function will be called when the interrupt asserted.
+ *
+ *  @param fptr a pointer to a function
+ */
+void    install_ISR( void (*fptr)(void) );
+
+/** Hardware initialization
+ *
+ *  MCU side initialization should be done in this function. 
+ *  For the mbed, it set the initial state of parallel bus control signal. 
+ */
+void    hardware_initialize( void );
+
+/** Reset signal control
+ *
+ *  This function drives the RESET signal line with given state.  
+ *
+ *  @param signal the state of RESET signal: ASSERT | DEASSERT
+ */
+void    hardware_reset( char signal );
+
+/** Hardware reset
+ *
+ *  Asserts the RESET signal with required pulse width and waits its recovery time
+ *  
+ *  @param reset_pulse_width_us RESET pulse width in micro-seconds
+ *  @param reset_recovery_us RESET  recovery time in micro-seconds (wait time after RESET de-assertion)
+ */
+void reset( int reset_pulse_width_us, int reset_recovery_us );
+
+/** Triger signal control
+ *
+ *  This function drives the TRIGGER signal line with given state.  
+ *
+ *  @param signal the state of TRIGGER signal: ASSERT | DEASSERT
+ */
+void    hardware_trigger( char signal );
+
+/** Write data
+ *
+ *  Writes 1 byte  
+ *
+ *  @param addr 8 bit address where the data should be written to 
+ *  @param data 8 bit data which will be written
+ *  @see read_data()
+ */
+void    write_data( char addr, char data );
+
+/** Read data
+ *
+ *  Reads 1 byte  
+ *
+ *  @return 8 bit data which is read from bus
+ *  @param addr 8 bit address where the data should be read from 
+ *  @see write_data()
+ */
+char    read_data( char addr );
+
+/** Wait micro-seconds
+ *
+ *  Wait function waits given-micro-seconds
+ *
+ *  @param micro-seconds the program should wait (32 bit integer value)
+ *  @see wait_sec()
+ */
+void    hw_wait_us( int v );
+
+/** Wait seconds
+ *
+ *  Wait function waits given-seconds
+ *
+ *  @param seconds the program should wait (float value)
+ *  @see hw_wait_us()
+ */
+void    wait_sec( float );
+
+
+/** BURST_DATA_ACCESS option code
+ *
+ *  This code is option to accelerate the bus access
+ */
+#ifdef  BURST_DATA_ACCESS
+
+/** Write data
+ *
+ *  Writes multiple bytes to same address. 
+ *  This function suitable to use for the registers like SLATABLE, TRANCONFIG and data buffers (through DATA register).
+ *  While this access is going, the interrupt will be tempolary disabled (ISR execution will be postponed)
+ *
+ *  @param addr   8 bit address where the data should be written to 
+ *  @param *data  pointer to char array. The data in this array will be written
+ *  @param length length of the data (bytes)
+ *  @see read_data_burst()
+ */
+void    write_data_burst( char addr, char *data, char length );
+
+/** Read data
+ *
+ *  Reads multiple bytes from same address. 
+ *  This function suitable to use for the registers like SLATABLE, TRANCONFIG and data buffers (through DATA register).
+ *  While this access is going, the interrupt will be tempolary disabled (ISR execution will be postponed)
+ *
+ *  @param addr   8 bit address where the data should be written to 
+ *  @param *data  pointer to char array. The read data will be written to this
+ *  @param length length of the data (bytes)
+ *  @see write_data_burst()
+ */
+void    read_data_burst( char addr, char *data, char length );
+#endif
+
+#endif  //   MINIBOARD_HARDWARE_ABS__
+
--- a/mini_board_libs/utility.lib	Wed Mar 28 04:29:27 2012 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://mbed.org/users/nxp_ip/libraries/utility/m7h57i
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mini_board_libs/utility/.lib	Wed Mar 28 04:32:50 2012 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/nxp_ip/libraries/utility/m7h57i
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mini_board_libs/utility/utility.c	Wed Mar 28 04:32:50 2012 +0000
@@ -0,0 +1,45 @@
+/** A sample code for "mini board PCU9669/PCA9665"
+ *
+ *  @author  Akifumi (Tedd) OKANO, NXP Semiconductors
+ *  @version 1.0
+ *  @date    26-Mar-2012
+ *
+ *  Released under the MIT License: http://mbed.org/license/mit
+ *
+ *  An operation sample of PCU9669/PCA9665 I2C bus controller.
+ *  The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging.
+ *  The bit-banging is poerformed by PortInOut function of mbed library.
+ *
+ *    To make the code porting easier, all codes are partitioned into layers to abstract other parts.
+ *    The mbed specific parts are concentrated in lowest layer: "hardware_abs.*".
+ *    This module may need to be modified for the porting.
+ *
+ *    All other upper layers are writen in standard-C.
+ *
+ *    base code is written from 05-Sep-2011 to 09-Sep-2011.
+ *    And demo code has been build on 11-Sep-2011.
+ *    Debug and code adjustment has been done on 08-Sep-2011.
+ *    Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011
+ *    hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012
+ *    PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. 
+ *    
+ *    Before builidng the code, please edit the file mini_board_PCU9669/config.h
+ *    Un-comment the target name what you want to target. 
+ */
+
+#include    "utility.h"
+#include    "mbed.h"        //  for printf
+
+void dump_read_data( char *data, char length ) {
+    int i;
+    
+    printf( "\r\ndump @ %p for %d bytes", data, length );
+    for ( i = 0; i < length; i++ )
+    {
+        if ( !(i % 8) )
+            printf( "\r\n%08p (%03d, 0x%02X) : 0x", data + i, i, i );
+        
+        printf( "%02X ", data[ i ] );
+    }
+    printf( "\r\n" );
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mini_board_libs/utility/utility.h	Wed Mar 28 04:32:50 2012 +0000
@@ -0,0 +1,36 @@
+/** A sample code for "mini board PCU9669/PCA9665"
+ *
+ *  @author  Akifumi (Tedd) OKANO, NXP Semiconductors
+ *  @version 1.0
+ *  @date    26-Mar-2012
+ *
+ *  Released under the MIT License: http://mbed.org/license/mit
+ *
+ *  An operation sample of PCU9669/PCA9665 I2C bus controller.
+ *  The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging.
+ *  The bit-banging is poerformed by PortInOut function of mbed library.
+ *
+ *    To make the code porting easier, all codes are partitioned into layers to abstract other parts.
+ *    The mbed specific parts are concentrated in lowest layer: "hardware_abs.*".
+ *    This module may need to be modified for the porting.
+ *
+ *    All other upper layers are writen in standard-C.
+ *
+ *    base code is written from 05-Sep-2011 to 09-Sep-2011.
+ *    And demo code has been build on 11-Sep-2011.
+ *    Debug and code adjustment has been done on 08-Sep-2011.
+ *    Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011
+ *    hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012
+ *    PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. 
+ *    
+ *    Before builidng the code, please edit the file mini_board_PCU9669/config.h
+ *    Un-comment the target name what you want to target. 
+ */
+
+
+#ifndef MINIBOARD_UTILITY__
+#define MINIBOARD_UTILITY__
+
+void dump_read_data( char *data, char length );
+
+#endif  //  MINIBOARD_UTILITY__