sysMotI2c.c
上传用户:dqzhongke1
上传日期:2022-06-26
资源大小:667k
文件大小:42k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* sysMotI2c.c - I2C Driver Source Module */
  2. /*
  3.  * Copyright (c) 2000, 2002, 2005-2006 Wind River Systems, Inc.
  4.  *
  5.  * The right to copy, distribute, modify, or otherwise make use
  6.  * of this software may be licensed only pursuant to the terms
  7.  * of an applicable Wind River license agreement.
  8.  */
  9. /* Copyright 1996-2000 Motorola, Inc. All Rights Reserved */
  10. /*
  11. modification history
  12. --------------------
  13. 01e,27jan06,dtr  Tidy up.
  14. 01d,10nov05,mdo  Documentation fixes for apigen
  15. 01c,21may02,gtf  modified for Raytheon NetFires bsp.
  16. 01b,10mar00,rhk  changed over to use sysCalcBusSpd, removed 100MHz speed.
  17. 01a,28feb00,rhk  created from version 01d, MV2100 BSP.
  18. */
  19. /*
  20. DESCRIPTION
  21. This file contains generic functions to read/write an I2C device.
  22. Currently the file only supports the MPC8548 I2C interface.
  23. However, additional I2C bus controllers can be easily be added
  24. as required. This dirver doesn't support mutiple threads/tasks and
  25. therfore the user should control access to driver via mutex if that
  26. is reqd.
  27. INCLUDE FILES: sysMotI2c.h
  28. */
  29. /* includes */
  30. #include <vxWorks.h> /* vxWorks generics */
  31. #include "config.h"
  32. #include <ioLib.h> /* input/output generics */
  33. #include <blkIo.h> /* block input/output specifics */
  34. #include <semLib.h> /* semaphore operations */
  35. #include <cacheLib.h> /* cache control */
  36. #include <intLib.h> /* interrupt control */
  37. #include <semLib.h>
  38. #include "sysMotI2c.h" /* driver specifics */
  39. #include "sysMpc85xxI2c.h" /* Mpc85xx I2C Driver Header Module */
  40. #include <stdio.h>
  41. #include <logLib.h>
  42. #include <stdlib.h>
  43. /* defines */
  44. #undef I2C_DRIVER_DEBUG
  45. /* externals */
  46. #ifdef I2C_DRIVER_TESTS
  47. IMPORT int printf(); /* formatted print */
  48. #endif
  49. IMPORT int  sysClkRateGet(); /* system clock rate */
  50. IMPORT int  rawFsDevInit(); /* raw file system device init */
  51. IMPORT void sysMpc85xxMsDelay (UINT mSeconds);
  52. /* locals */
  53. LOCAL UINT8 i2cInByte (UINT32);
  54. LOCAL void i2cOutByte (UINT32,UINT8);
  55. /* Driver/controller routines table for the Mpc85xx device. */
  56. i2cDrvRoutines_t i2cDrvRoutinesTableMpc85xx =
  57. {
  58. (int(*)())i2cCycleMpc85xxStart,
  59. (int(*)())i2cCycleMpc85xxStop,
  60. (int(*)())i2cCycleMpc85xxRead,
  61. (int(*)())i2cCycleMpc85xxWrite,
  62. (int(*)())i2cCycleMpc85xxAckIn,
  63. (int(*)())i2cCycleMpc85xxAckOut,
  64. (int(*)())i2cCycleMpc85xxKnownState,
  65. (void(*)())sysMpc85xxMsDelay
  66. };
  67. /* driver/controller routines table, indexed by the "I2C_DRV_TYPE". */
  68. i2cDrvRoutines_t *i2cDrvRoutinesTables[] =
  69. {
  70. (i2cDrvRoutines_t *)&i2cDrvRoutinesTableMpc85xx /* index 0 */
  71. };
  72. I2C_DRV_CTRL i2C1DrvCtrl ;
  73. I2C_DRV_CTRL i2C2DrvCtrl ;
  74. I2C_DRV_CTRL * pI2cDrvCtrl[2] = { NULL, NULL } ;
  75. /**************************************************************************
  76. *
  77. * i2cIoctl - perform I2C read/write operations
  78. *
  79. * The purpose of this function is to perform i2cIn/OutByte operations
  80. * with synchronization.
  81. *
  82. * RETURNS: data written or data read
  83. *
  84. * ERRNO: N/A
  85. */
  86. UINT8 i2cIoctl
  87.     (
  88.     UINT32 ioctlflg,  /* input/output control flag */
  89.       /* 0, write */
  90.       /* 1, read */
  91.       /* 2, read/modify/write (ORing) */
  92.       /* 3, read/modify/write (ANDing) */
  93.       /* 4, read/modify/write (AND/ORing) */
  94.     UINT32  address,   /* address of device register to be operated upon */
  95.     UINT8   bdata1,   /* data item 1 for read/write operation */
  96.     UINT8   bdata2   /* data item 2 for read/write operation */
  97.     )
  98.     {
  99.     UINT8 u8temp;
  100. #ifdef I2C_DRIVER_DEBUG
  101.     logMsg("i2cIoctl: adrs - 0x%x.n", address,2,3,4,5,6);
  102. #endif
  103.     sysMpc85xxMsDelay(1);
  104.     if ( ioctlflg == I2C_IOCTL_WR ) /* write */
  105. {
  106.   i2cOutByte(address, bdata1);
  107.     }
  108.     else if ( ioctlflg == I2C_IOCTL_RD ) /* read */
  109. {
  110. bdata1 = i2cInByte(address);
  111. }
  112.     else if ( ioctlflg == I2C_IOCTL_RMW_OR ) /* ORing */
  113. {
  114. u8temp = i2cInByte(address);
  115. u8temp |= bdata1;
  116. sysMpc85xxMsDelay(1);
  117. i2cOutByte(address, u8temp);
  118. }
  119.     else if ( ioctlflg == I2C_IOCTL_RMW_AND ) /* ANDing */
  120. {
  121. u8temp = i2cInByte(address);
  122. u8temp &= bdata1;
  123. sysMpc85xxMsDelay(1);
  124. i2cOutByte(address, u8temp);
  125. }
  126.     else if ( ioctlflg == I2C_IOCTL_RMW_AND_OR ) /* AND/ORing */
  127. {
  128. u8temp = i2cInByte(address);
  129. u8temp &= bdata1;
  130. u8temp |= bdata2;
  131. sysMpc85xxMsDelay(1);
  132. i2cOutByte(address, u8temp);
  133. }
  134.     sysMpc85xxMsDelay(1);
  135.     return(bdata1);
  136.     }
  137. /***************************************************************************
  138. *
  139. * i2cDrvInit - initialize I2C device controller
  140. *
  141. * This function initializes the I2C device controller device for operation.
  142. * This function should only be executed once during system initialization
  143. * time.
  144. *
  145. * NOTE: no printf or logMsg statements should be called during this routine
  146. * since it is called in sysHwInit(). If output is desired a polled or debug
  147. * dump routine should be used.
  148. *
  149. * RETURNS: OK
  150. *
  151. * ERRNO: N/A
  152. */
  153. STATUS i2cDrvInit
  154.     (
  155.     int unit,
  156.     int i2cControllerType /* I2C controller type */
  157.     )
  158.     {
  159.     /*
  160.      * Check for unknown controller type, and initialize I2C controller
  161.      * for operation (if needed).  Note: a switch statement does not work here if
  162.      * executing from ROM due to branch history table creation.
  163.      */
  164.     if (pI2cDrvCtrl[unit] == NULL)
  165.         {
  166.         if (unit == 0)
  167.             {
  168.             pI2cDrvCtrl[unit] = &i2C1DrvCtrl ;
  169.             pI2cDrvCtrl[unit]->baseAdrs = M85XX_I2C1_BASE ;
  170.             }
  171.         else if (unit == 1)
  172.             {
  173.             pI2cDrvCtrl[unit] = &i2C2DrvCtrl ;
  174.             pI2cDrvCtrl[unit]->baseAdrs = M85XX_I2C2_BASE ;
  175.             }
  176.         pI2cDrvCtrl[unit]->baseAdrs += CCSBAR ;
  177.         }
  178.     /* disable the I2C module, set the device to Master Mode */
  179.     i2cIoctl(I2C_IOCTL_RMW_AND_OR,
  180.      (UINT32)(pI2cDrvCtrl[unit]->baseAdrs + MPC85XX_I2C_CONTROL_REG),
  181.      ((UINT8)~MPC85XX_I2C_CONTROL_REG_MEN),
  182.      MPC85XX_I2C_CONTROL_REG_MSTA);
  183.     /* initialize and enable the I2C interface */
  184.     /*
  185.      * I2C1 - clock = csb_clk / 3. = 111MHz. -> need to get to 100KHz. -> div by 1024.
  186.      *                gives 100+KHz.
  187.      * I2C2 - clock = csb_clk. = SYS_CLK_FREQ. -> div by 3072. gives 100+KHz.
  188.      * The freq div register needs to be set such that the I2C bus is 100KHz...
  189.      */
  190.     {
  191.     UINT8 divider ;
  192.     divider = 0x31; /* 3072 */
  193.     i2cIoctl(I2C_IOCTL_RMW_AND_OR,
  194.      (UINT32)(pI2cDrvCtrl[unit]->baseAdrs + MPC85XX_I2C_FREQ_DIV_REG),
  195.      ((UINT8)~MPC85XX_I2C_FREQ_DIV_REG_MASK),
  196.      divider);
  197.     /* 0x20 - div by 160 (~300KHz), 0x24 - div by 320 (~150KHz)*/
  198.     /* set the slave address */
  199.     i2cIoctl(I2C_IOCTL_RMW_AND_OR,
  200.      (UINT32)(pI2cDrvCtrl[unit]->baseAdrs+MPC85XX_I2C_ADR_REG),
  201.      ((UINT8)~MPC85XX_I2C_ADDRESS_REG_MASK), 1);
  202.     /* enable the interface */
  203.     i2cIoctl(I2C_IOCTL_RMW_OR,
  204.      (UINT32)(pI2cDrvCtrl[unit]->baseAdrs+MPC85XX_I2C_CONTROL_REG),
  205.      MPC85XX_I2C_CONTROL_REG_MEN, 0);
  206.     /*
  207.      * set the device to slave mode.  This is required for
  208.      * clearing a BUS BUSY lockup condition.
  209.      */
  210.     i2cIoctl(I2C_IOCTL_RMW_AND,
  211.      (UINT32)(pI2cDrvCtrl[unit]->baseAdrs+MPC85XX_I2C_CONTROL_REG),
  212.      ((UINT8)~MPC85XX_I2C_CONTROL_REG_MSTA), 0);
  213.     }
  214.     return(OK);
  215.     }
  216. /******************************************************************************
  217. *
  218. * i2cRead - read blocks from I2C
  219. *
  220. * This function's purpose is to read the specified number of
  221. * blocks from the specified device.
  222. *
  223. * RETURNS: OK, or ERROR on a bad request
  224. *
  225. * ERRNO: N/A
  226. */
  227. int i2cRead
  228.     (
  229.     int          unit,
  230.     UINT32       deviceAddress, /* Device's I2C bus address */
  231.     int          deviceType,
  232.     unsigned int startBlk, /* starting block to read or register to read */
  233.     unsigned int numBlks, /* number of blocks to read or single/double byte register */
  234.     char *       pBuf /* pointer to buffer to receive data */
  235.     )
  236.     {
  237.     int localStatus; /* local status variable */
  238.     i2cCmdPckt_t i2cCmdPacket; /* command packet */
  239.     /* Check to see if the driver's been installed */
  240.     if(pI2cDrvCtrl[unit]->baseAdrs == 0)
  241.         {
  242. logMsg("I2C driver for unit %d not initialized.n", unit,2,3,4,5,6);
  243.         return ERROR ;
  244.         }
  245.     /* Check for a bad request. */
  246.     if ( !numBlks )
  247. {
  248. return(ERROR);
  249. }
  250.     /* Build command packet. */
  251.     i2cCmdPacket.command = I2C_READOP;
  252.     i2cCmdPacket.status = 0;
  253.     i2cCmdPacket.memoryAddress = (unsigned int)pBuf;
  254.     i2cCmdPacket.blockNumber = startBlk;
  255.     i2cCmdPacket.nBlocks = numBlks;
  256.     i2cCmdPacket.eCount = numBlks;
  257.     i2cCmdPacket.aCount = 0;
  258.     i2cCmdPacket.deviceType = deviceType ;
  259.     localStatus = i2cDoOp(unit, deviceAddress, (i2cCmdPckt_t *)&i2cCmdPacket);
  260. #ifdef I2C_DRIVER_DEBUG
  261.     logMsg("command          =%08Xrn", i2cCmdPacket.command,2,3,4,5,6);
  262.     logMsg("status           =%08Xrn", i2cCmdPacket.status,2,3,4,5,6);
  263.     logMsg("memory address   =%08Xrn", i2cCmdPacket.memoryAddress,2,3,4,5,6);
  264.     logMsg("block number     =%08Xrn", i2cCmdPacket.blockNumber,2,3,4,5,6);
  265.     logMsg("number of blocks =%08Xrn", i2cCmdPacket.nBlocks,2,3,4,5,6);
  266.     logMsg("expected count   =%08Xrn", i2cCmdPacket.eCount,2,3,4,5,6);
  267.     logMsg("actual count     =%08Xrn", i2cCmdPacket.aCount,2,3,4,5,6);
  268. #endif
  269.     /* Return the appropriate status. */
  270.     if ( i2cCmdPacket.status != 0 )
  271. {
  272. logMsg("i2cCmdPacket.status - 0x%xn",i2cCmdPacket.status,2,3,4,5,6);
  273. localStatus = ERROR ;
  274. }
  275.     else
  276. localStatus = OK ;
  277.     return(localStatus);
  278.     }
  279. /***************************************************************************
  280. *
  281. * i2cWrite - read blocks from I2C
  282. *
  283. * This function purpose is to write the specified number of
  284. * blocks to the specified device.
  285. *
  286. * RETURNS: OK, or ERROR
  287. *
  288. * ERRNO: N/A
  289. */
  290. int i2cWrite
  291.     (
  292.     int          unit,
  293.     UINT32       deviceAddress, /* Device's I2C bus address */
  294.     int          deviceType,
  295.     unsigned int startBlk, /* starting block to write */
  296.     unsigned int numBlks, /* number of blocks to write */
  297.     char *       pBuf /* pointer to buffer of send data */
  298.     )
  299.     {
  300.     int localStatus; /* local status variable */
  301.     i2cCmdPckt_t i2cCmdPacket; /* command packet */
  302.     /* Check to see if the driver's been installed */
  303.     if(pI2cDrvCtrl[unit]->baseAdrs == 0)
  304.         {
  305. logMsg("I2C driver for unit %d not initialized.n", unit,2,3,4,5,6);
  306.         return ERROR ;
  307.         }
  308.     /* Check for a NOP request. */
  309.     if ( !numBlks )
  310. {
  311. return(ERROR);
  312. }
  313.     /* Build command packet. */
  314.     i2cCmdPacket.command = I2C_WRITOP;
  315.     i2cCmdPacket.status = 0;
  316.     i2cCmdPacket.memoryAddress = (unsigned int)pBuf;
  317.     i2cCmdPacket.blockNumber = startBlk;
  318.     i2cCmdPacket.nBlocks = numBlks;
  319.     i2cCmdPacket.eCount = numBlks;
  320.     i2cCmdPacket.aCount = 0;
  321.     i2cCmdPacket.deviceType = deviceType ;
  322.     /* Take ownership, call driver, release ownership. */
  323.     localStatus = i2cDoOp(unit, deviceAddress, (i2cCmdPckt_t *)&i2cCmdPacket);
  324. #ifdef I2C_DRIVER_DEBUG
  325.     logMsg("command          =%08Xrn", i2cCmdPacket.command,2,3,4,5,6);
  326.     logMsg("status           =%08Xrn", i2cCmdPacket.status,2,3,4,5,6);
  327.     logMsg("memory address   =%08Xrn", i2cCmdPacket.memoryAddress,2,3,4,5,6);
  328.     logMsg("block number     =%08Xrn", i2cCmdPacket.blockNumber,2,3,4,5,6);
  329.     logMsg("number of blocks =%08Xrn", i2cCmdPacket.nBlocks,2,3,4,5,6);
  330.     logMsg("expected count   =%08Xrn", i2cCmdPacket.eCount,2,3,4,5,6);
  331.     logMsg("actual count     =%08Xrn", i2cCmdPacket.aCount,2,3,4,5,6);
  332. #endif
  333.     /* Return the appropriate status. */
  334.     if ( i2cCmdPacket.status != 0 )
  335. {
  336. logMsg("i2cCmdPacket.status - 0x%xn",i2cCmdPacket.status,2,3,4,5,6);
  337. localStatus = ERROR ;
  338. }
  339.     else
  340. localStatus = OK ;
  341.     return localStatus ;
  342.     }
  343. /*************************************************************************
  344. *
  345. * i2cDoOpPCA9555 - execute commands to the PCA9555 I2C device
  346. *
  347. * This function executes the command operations specified by the command
  348. * packet.
  349. *
  350. * Writing read contents of register, mask bit positions and OR in data
  351. * and write out. Writes only occur to output ports and config regs.
  352. * Reading only from input ports and config regs.
  353. *
  354. * RETURNS: OK, or ERROR
  355. *
  356. * ERRNO: N/A
  357. */
  358. int i2cDoOpPCA9555
  359.     (
  360.     int             unit,
  361.     UINT32          deviceAddress,    /* device I2C bus address */
  362.     i2cCmdPckt_t *  pI2cCmdPacket     /* pointer to command packet */
  363.     )
  364.     {
  365.     i2cDrvRoutines_t *pRoutine; /* low level routines table pointer */
  366.     int byteCount; /* byte counter */
  367.     int statusVariable; /* local status variable */
  368.     unsigned char *pWriteData; /* pointer to write data buffer */
  369.     /* Initialize pointer to driver routines table. */
  370.     pRoutine = i2cDrvRoutinesTables[I2C_DRV_TYPE];
  371.     /*
  372.      * read operation,
  373.      *
  374.      */
  375.     if ( pI2cCmdPacket->command == I2C_READOP )
  376. {
  377. /* Read the specified number of bytes from the EEPROM. */
  378. /* NOTE: random read has a dummy write first. */
  379. statusVariable = 0;
  380. if ( I2C_KNOWN_STATE(unit) )
  381.     {
  382.             pI2cCmdPacket->status = I2C_ERROR_KNOWN_STATE;
  383.             return ERROR ;
  384.     }
  385.         if ( I2C_CYCLE_START(unit) )
  386.             {
  387.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_START ;
  388.             return ERROR ;
  389.             }
  390.         /* device address - write, R/W bit = 0  */
  391.         if ( I2C_CYCLE_WRITE(unit,i2cAddressMunge(deviceAddress)) )
  392.             {
  393.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_WRITE;
  394.             return ERROR ;
  395.             }
  396.         if ( I2C_CYCLE_ACKIN(unit) )
  397.             {
  398.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_ACKIN ;
  399.             return ERROR ;
  400.             }
  401.         /* command byte (register #) */
  402.         if ( I2C_CYCLE_WRITE( unit, (pI2cCmdPacket->blockNumber&0x7) ) )
  403.             {
  404.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_WRITE;
  405.             return ERROR ;
  406.             }
  407.         if ( I2C_CYCLE_ACKIN(unit) )
  408.             {
  409.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_ACKIN;
  410.             return ERROR ;
  411.             }
  412.         if ( I2C_CYCLE_START(unit) )
  413.             {
  414.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_START;
  415.             return ERROR ;
  416.             }
  417.         /* device address - read, R/W bit = 1 */
  418.         if ( I2C_CYCLE_WRITE(unit,i2cAddressMunge(deviceAddress)|0x1) )
  419.             {
  420.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_WRITE;
  421.             return ERROR ;
  422.             }
  423.         if ( I2C_CYCLE_ACKIN(unit) )
  424.             {
  425.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_ACKIN;
  426.             return ERROR ;
  427.             }
  428.         /* nBlocks should be a power of 2. */
  429. /* generate ack on next to last byte; generate stop on last byte */
  430. for ( byteCount = 0; byteCount < pI2cCmdPacket->nBlocks; byteCount++ )
  431.     {
  432.             if (byteCount == (pI2cCmdPacket->nBlocks-2))
  433.                 {
  434.                 /* Send an ACK on next to last transfer */
  435.                 if ( I2C_CYCLE_READ(unit,(unsigned char *)pI2cCmdPacket->memoryAddress+byteCount,1) )
  436.                     {
  437.                     pI2cCmdPacket->status = I2C_ERROR_CYCLE_READ;
  438.                     return ERROR ;
  439.                     }
  440.                 }
  441.             else
  442.                 {
  443.                 if (byteCount == (pI2cCmdPacket->nBlocks-1))
  444.                     {
  445.                     /* send a STOP on last transfer */
  446.                     if ( I2C_CYCLE_STOP(unit) )
  447.                         {
  448.                         pI2cCmdPacket->status = I2C_ERROR_CYCLE_STOP;
  449.                         return ERROR ;
  450.                         }
  451.                     }
  452.                 /* No acks on all other transfers */
  453.                 if ( I2C_CYCLE_READ(unit,(unsigned char *)pI2cCmdPacket->memoryAddress+byteCount,0) )
  454.                     {
  455.                     pI2cCmdPacket->status = I2C_ERROR_CYCLE_READ;
  456.                     return ERROR ;
  457.                     }
  458.                 }
  459.     /* Increment the actual count of the command packet. */
  460.     pI2cCmdPacket->aCount += 1;
  461. #ifdef I2C_DRIVER_DEBUG
  462.             logMsg("byteCount - 0x%x.n", pI2cCmdPacket->aCount,2,3,4,5,6);
  463. #endif
  464.     }
  465. /*
  466.  * update the caller's command packet with status of
  467.  * the operation
  468.  */
  469. pI2cCmdPacket->status = statusVariable;
  470. }
  471.     /*
  472.      * write operation
  473.      *
  474.      *
  475.      */
  476.     else if ( pI2cCmdPacket->command == I2C_WRITOP )
  477. {
  478. /* Initialize pointer to caller's write data buffer. */
  479. pWriteData = (unsigned char *)pI2cCmdPacket->memoryAddress;
  480. /* Write the specified number of bytes from the EEPROM. */
  481. statusVariable = 0;
  482. if ( I2C_KNOWN_STATE(unit) )
  483.     {
  484.             pI2cCmdPacket->status = I2C_ERROR_KNOWN_STATE;
  485.             return ERROR ;
  486.     }
  487.         if ( I2C_CYCLE_START(unit) )
  488.             {
  489.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_START;
  490.             return ERROR ;
  491.             }
  492.         /* device address - write, R/W bit = 0  */
  493.         if ( I2C_CYCLE_WRITE(unit,i2cAddressMunge(deviceAddress)) )
  494.             {
  495.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_WRITE;
  496.             return ERROR ;
  497.             }
  498.         if ( I2C_CYCLE_ACKIN(unit) )
  499.             {
  500.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_ACKIN;
  501.            return ERROR ;
  502.             }
  503.         /* command byte (register #) */
  504.         if ( I2C_CYCLE_WRITE( unit, (pI2cCmdPacket->blockNumber&0x7) ) )
  505.             {
  506.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_WRITE;
  507.             return ERROR ;
  508.             }
  509.         if ( I2C_CYCLE_ACKIN(unit) )
  510.             {
  511.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_ACKIN;
  512.             return ERROR ;
  513.             }
  514.         /* nBlocks should be a power of 2 */
  515. for ( byteCount = 0; byteCount < pI2cCmdPacket->nBlocks; byteCount++ )
  516.     {
  517.     /* write data */
  518.     if ( I2C_CYCLE_WRITE(unit, pWriteData[byteCount]) )
  519. {
  520.                 pI2cCmdPacket->status = I2C_ERROR_CYCLE_WRITE;
  521.                 return ERROR ;
  522. }
  523.             if ( I2C_CYCLE_ACKIN(unit) )
  524.                 {
  525.                 pI2cCmdPacket->status = I2C_ERROR_CYCLE_ACKIN;
  526.                 return ERROR ;
  527.                 }
  528.     /* Increment the actual count of the command packet. */
  529.     pI2cCmdPacket->aCount += 1;
  530. #ifdef I2C_DRIVER_DEBUG
  531.             logMsg("byteCount - 0x%x.n", pI2cCmdPacket->aCount,2,3,4,5,6);
  532. #endif
  533.     }
  534.         if ( I2C_CYCLE_STOP(unit) )
  535.             {
  536.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_STOP;
  537.             return ERROR ;
  538.             }
  539. }
  540.     else
  541. {
  542. I2C_KNOWN_STATE(unit);
  543. return ERROR ;
  544. }
  545.     /* Leave the I2C bus in a known state. */
  546.     I2C_KNOWN_STATE(unit);
  547.     /*
  548.      * update the caller's command packet with status of
  549.      * the operation
  550.      */
  551.     pI2cCmdPacket->status = statusVariable;
  552.     return OK ;
  553.     }
  554. /******************************************************************************
  555. *
  556. * i2cDoOpAT24C256 - execute commands to the AT24C256 I2C device
  557. *
  558. * This function executes the command operations specified by the command
  559. * packet.
  560. *
  561. * RETURNS: OK, or ERROR
  562. *
  563. * NOTE: This driver only uses random byte reads and writes.
  564. * It can be upgraded to use page mode which is faster.
  565. *
  566. * ERRNO: N/A
  567. */
  568. int i2cDoOpAT24C256
  569.     (
  570.     int    unit,
  571.     UINT32 deviceAddress, /* device I2C bus address */
  572.     i2cCmdPckt_t *pI2cCmdPacket /* pointer to command packet */
  573.     )
  574.     {
  575.     i2cDrvRoutines_t *pRoutine; /* low level routines table pointer */
  576.     int byteCount; /* byte counter */
  577.     int statusVariable; /* local status variable */
  578.     unsigned char *pWriteData; /* pointer to write data buffer */
  579.     /* Initialize pointer to driver routines table. */
  580.     pRoutine = i2cDrvRoutinesTables[I2C_DRV_TYPE];
  581.     /*
  582.      * read operation (EEPROM type devices), for each byte
  583.      * perform the random read operation
  584.      */
  585.     if ( pI2cCmdPacket->command == I2C_READOP )
  586. {
  587. /* Read the specified number of bytes from the EEPROM. */
  588. /* NOTE: random read has a dummy write first. */
  589. statusVariable = 0;
  590. if ( I2C_KNOWN_STATE(unit) )
  591.     {
  592.     statusVariable = I2C_ERROR_KNOWN_STATE;
  593.     byteCount = pI2cCmdPacket->nBlocks;
  594.     }
  595. for ( byteCount = 0; byteCount < pI2cCmdPacket->nBlocks; byteCount++ )
  596.     {
  597.     if ( I2C_CYCLE_START(unit) )
  598. {
  599. statusVariable = I2C_ERROR_CYCLE_START;
  600. break;
  601. }
  602.     /* device address - write */
  603.     if ( I2C_CYCLE_WRITE(unit,i2cAddressMunge(deviceAddress)) )
  604. {
  605. statusVariable = I2C_ERROR_CYCLE_WRITE;
  606. break;
  607. }
  608.     if ( I2C_CYCLE_ACKIN(unit) )
  609. {
  610. statusVariable = I2C_ERROR_CYCLE_ACKIN;
  611. break;
  612. }
  613.     /* 1st word address */
  614.     if ( I2C_CYCLE_WRITE(unit, (((pI2cCmdPacket->blockNumber+byteCount)>>8)&0x7f)) )
  615. {
  616. statusVariable = I2C_ERROR_CYCLE_WRITE;
  617. break;
  618. }
  619.     if ( I2C_CYCLE_ACKIN(unit) )
  620. {
  621. statusVariable = I2C_ERROR_CYCLE_ACKIN;
  622. break;
  623. }
  624.     /* 2nd word address... */
  625.     if ( I2C_CYCLE_WRITE(unit,((pI2cCmdPacket->blockNumber+byteCount)&0xff)) )
  626. {
  627. statusVariable = I2C_ERROR_CYCLE_WRITE;
  628. break;
  629. }
  630.     if ( I2C_CYCLE_ACKIN(unit) )
  631. {
  632. statusVariable = I2C_ERROR_CYCLE_ACKIN;
  633. break;
  634. }
  635.     if ( I2C_CYCLE_START(unit) )
  636. {
  637. statusVariable = I2C_ERROR_CYCLE_START;
  638. break;
  639. }
  640.     /* device address - read */
  641.     if ( I2C_CYCLE_WRITE(unit,i2cAddressMunge(deviceAddress)|0x1) )
  642. {
  643. statusVariable = I2C_ERROR_CYCLE_WRITE;
  644. break;
  645. }
  646.     if ( I2C_CYCLE_ACKIN(unit) )
  647. {
  648. statusVariable = I2C_ERROR_CYCLE_ACKIN;
  649. break;
  650. }
  651.     if ( I2C_CYCLE_READ(unit,(unsigned char *)pI2cCmdPacket->memoryAddress+byteCount,0) )
  652. {
  653. statusVariable = I2C_ERROR_CYCLE_READ;
  654. break;
  655. }
  656.     if ( I2C_CYCLE_STOP(unit) )
  657. {
  658. statusVariable = I2C_ERROR_CYCLE_STOP;
  659. break;
  660. }
  661.     /* Increment the actual count of the command packet. */
  662.     pI2cCmdPacket->aCount += 1;
  663.     }
  664. /*
  665.  * update the caller's command packet with status of
  666.  * the operation
  667.  */
  668. pI2cCmdPacket->status = statusVariable;
  669. }
  670.     /*
  671.      * write operation (EEPROM type devices), for each byte
  672.      * perform the byte write operation, a delay must be
  673.      * exercised following each byte write
  674.      */
  675.     else if ( pI2cCmdPacket->command == I2C_WRITOP )
  676. {
  677. /* Initialize pointer to caller's write data buffer. */
  678. pWriteData = (unsigned char *)pI2cCmdPacket->memoryAddress;
  679. /* Write the specified number of bytes from the EEPROM. */
  680. statusVariable = 0;
  681. if ( I2C_KNOWN_STATE(unit) )
  682.     {
  683.     statusVariable = I2C_ERROR_KNOWN_STATE;
  684.     byteCount = pI2cCmdPacket->nBlocks;
  685.     }
  686. for ( byteCount = 0; byteCount < pI2cCmdPacket->nBlocks; byteCount++ )
  687.     {
  688.     if ( I2C_CYCLE_START(unit) )
  689. {
  690. statusVariable = I2C_ERROR_CYCLE_START;
  691. break;
  692. }
  693.     /* device address */
  694.     if ( I2C_CYCLE_WRITE(unit,i2cAddressMunge(deviceAddress )) )
  695. {
  696. statusVariable = I2C_ERROR_CYCLE_WRITE;
  697. break;
  698. }
  699.     if ( I2C_CYCLE_ACKIN(unit) )
  700. {
  701. statusVariable = I2C_ERROR_CYCLE_ACKIN;
  702. break;
  703. }
  704.     /* 1st word address */
  705.     if ( I2C_CYCLE_WRITE(unit,(((pI2cCmdPacket->blockNumber+byteCount)>>8)&0x7f)) )
  706. {
  707. statusVariable = I2C_ERROR_CYCLE_WRITE;
  708. break;
  709. }
  710.     if ( I2C_CYCLE_ACKIN(unit) )
  711. {
  712. statusVariable = I2C_ERROR_CYCLE_ACKIN;
  713. break;
  714. }
  715.     /* 2nd word address... */
  716.     if ( I2C_CYCLE_WRITE(unit,((pI2cCmdPacket->blockNumber+byteCount)&0xff)) )
  717. {
  718. statusVariable = I2C_ERROR_CYCLE_WRITE;
  719. break;
  720. }
  721.     if ( I2C_CYCLE_ACKIN(unit) )
  722. {
  723. statusVariable = I2C_ERROR_CYCLE_ACKIN;
  724. break;
  725. }
  726.     /* write data */
  727.     if ( I2C_CYCLE_WRITE(unit,*(pWriteData + byteCount)) )
  728. {
  729. statusVariable = I2C_ERROR_CYCLE_WRITE;
  730. break;
  731. }
  732.     if ( I2C_CYCLE_ACKIN(unit) )
  733. {
  734. statusVariable = I2C_ERROR_CYCLE_ACKIN;
  735. break;
  736. }
  737.     if ( I2C_CYCLE_STOP(unit) )
  738. {
  739. statusVariable = I2C_ERROR_CYCLE_STOP;
  740. break;
  741. }
  742.     /* Increment the actual count of the command packet. */
  743.     pI2cCmdPacket->aCount += 1;
  744.     /*
  745.      * delay for at least 10ms to allow EEPROM to complete
  746.      * the write cycle (internal operation)
  747.      */
  748.     I2C_DELAY(10);
  749.     }
  750. }
  751.     else
  752. {
  753. I2C_KNOWN_STATE(unit);
  754. return ERROR ;
  755. }
  756.     /* Leave the I2C bus in a known state. */
  757.     I2C_KNOWN_STATE(unit);
  758.     /*
  759.      * update the caller's command packet with status of
  760.      * the operation
  761.      */
  762.     pI2cCmdPacket->status = statusVariable;
  763.     return OK ;
  764.     }
  765. /******************************************************************************
  766. *
  767. * i2cDoOpAD7417 - execute commands to the AD7417 I2C device
  768. *
  769. * This function executes the command operations specified by the command
  770. * packet.
  771. *
  772. * RETURNS: OK, ERROR if bad request
  773. *
  774. * ERRNO: N/A
  775. */
  776. int i2cDoOpAD7417
  777.     (
  778.     int    unit,
  779.     UINT32 deviceAddress, /* device I2C bus address */
  780.     i2cCmdPckt_t *pI2cCmdPacket /* pointer to command packet */
  781.     )
  782.     {
  783.     i2cDrvRoutines_t *pRoutine; /* low level routines table pointer */
  784.     int byteCount; /* byte counter */
  785.     int statusVariable; /* local status variable */
  786.     unsigned char *pWriteData; /* pointer to write data buffer */
  787.     /*
  788.      * Modes:
  789.      *  0) writing to address pointer register for subsequent read
  790.      *  1) single byte read
  791.      *  2) double byte read (Toti, Thyst, ADC registers)
  792.      *  3) writing to address pointer register then single byte of data
  793.      *  4) writing to address pointer register then 2 bytes of data (Toti, Thyst, ADC registers)
  794.      *
  795.      *  2 1 0
  796.      *  0 0 0 temperature value (ro) - 2 bytes
  797.      *  0 0 1 config register (r/w) - 1 byte
  798.      *  0 1 0 Thyst (r/w) - 2 bytes
  799.      *  0 1 1 Toti (r/w) - 2 bytes
  800.      *  1 0 0 ADC (ro) - 2 byes
  801.      *  1 0 1 Config2 (r/w, msb only) - 1 byte
  802.      *
  803.      *  NOTE: pI2cCmdPacket->nBlocks is used to figure out if it is a single or double byte
  804.      *  read or write.
  805.      */
  806.     if ( (pI2cCmdPacket->blockNumber < 0) || (pI2cCmdPacket->blockNumber > 5) )
  807. {
  808. printf("Invalid register number %dn", pI2cCmdPacket->blockNumber);
  809. return ERROR ;
  810. }
  811.     switch ( pI2cCmdPacket->blockNumber )
  812. {
  813. case 0:
  814. case 2:
  815. case 3:
  816. case 4:
  817.     if ( pI2cCmdPacket->nBlocks != 2 )
  818. {
  819. printf("Invalid register size %d, should be 2.n", pI2cCmdPacket->nBlocks);
  820. return ERROR ;
  821. }
  822.     break;
  823. case 1:
  824. case 5:
  825.     if ( pI2cCmdPacket->nBlocks != 1 )
  826. {
  827. printf("Invalid register size %d, should be 1.n", pI2cCmdPacket->nBlocks);
  828. return ERROR ;
  829. }
  830.     break;
  831. }
  832.     /* Initialize pointer to driver routines table. */
  833.     pRoutine = i2cDrvRoutinesTables[I2C_DRV_TYPE];
  834.     /* single byte read/write */
  835.     if ( pI2cCmdPacket->command == I2C_READOP )
  836. {
  837. statusVariable = 0;
  838. if ( I2C_KNOWN_STATE(unit) )
  839.     {
  840.     statusVariable = I2C_ERROR_KNOWN_STATE;
  841.     byteCount = pI2cCmdPacket->nBlocks;
  842.     goto errorEnd ;
  843.     }
  844. if ( I2C_CYCLE_START(unit) )
  845.     {
  846.     statusVariable = I2C_ERROR_CYCLE_START;
  847.     goto errorEnd ;
  848.     }
  849. /* device address */
  850. if ( I2C_CYCLE_WRITE(unit,i2cAddressMunge(deviceAddress)) )
  851.     {
  852.     statusVariable = I2C_ERROR_CYCLE_WRITE;
  853.     goto errorEnd ;
  854.     }
  855. if ( I2C_CYCLE_ACKIN(unit) )
  856.     {
  857.     statusVariable = I2C_ERROR_CYCLE_ACKIN;
  858.     goto errorEnd ;
  859.     }
  860. /* address register pointer */
  861. if ( I2C_CYCLE_WRITE(unit,pI2cCmdPacket->blockNumber) )
  862.     {
  863.     statusVariable = I2C_ERROR_CYCLE_WRITE;
  864.     goto errorEnd ;
  865.     }
  866. if ( I2C_CYCLE_ACKIN(unit) )
  867.     {
  868.     statusVariable = I2C_ERROR_CYCLE_ACKIN;
  869.     goto errorEnd ;
  870.     }
  871. if ( I2C_CYCLE_STOP(unit) )
  872.     {
  873.     statusVariable = I2C_ERROR_CYCLE_STOP;
  874.     goto errorEnd ;
  875.     }
  876. sysMpc85xxMsDelay (1);
  877. if ( I2C_CYCLE_START(unit) )
  878.     {
  879.     statusVariable = I2C_ERROR_CYCLE_START;
  880.     goto errorEnd ;
  881.     }
  882. /* device address */
  883. if ( I2C_CYCLE_WRITE(unit,i2cAddressMunge(deviceAddress)|0x1) )
  884.     {
  885.     statusVariable = I2C_ERROR_CYCLE_WRITE;
  886.     goto errorEnd ;
  887.     }
  888. if ( I2C_CYCLE_ACKIN(unit) )
  889.     {
  890.     statusVariable = I2C_ERROR_CYCLE_ACKIN;
  891.     goto errorEnd ;
  892.     }
  893. if ( I2C_CYCLE_READ(unit,(unsigned char *)pI2cCmdPacket->memoryAddress+0,0) )
  894.     {
  895.     statusVariable = I2C_ERROR_CYCLE_READ;
  896.     goto errorEnd ;
  897.     }
  898. /* Increment the actual count of the command packet. */
  899. pI2cCmdPacket->aCount += 1;
  900. if ( pI2cCmdPacket->nBlocks == 2 )
  901.     {
  902.     if ( I2C_CYCLE_READ(unit,(unsigned char *)pI2cCmdPacket->memoryAddress+1,0) )
  903. {
  904. statusVariable = I2C_ERROR_CYCLE_READ;
  905. goto errorEnd ;
  906. }
  907.     /* Increment the actual count of the command packet. */
  908.     pI2cCmdPacket->aCount += 1;
  909.     }
  910. if ( I2C_CYCLE_STOP(unit) )
  911.     {
  912.     statusVariable = I2C_ERROR_CYCLE_STOP;
  913.     goto errorEnd ;
  914.     }
  915. /*
  916.  * update the caller's command packet with status of
  917.  * the operation
  918.  */
  919. pI2cCmdPacket->status = statusVariable;
  920. }
  921.     else if ( pI2cCmdPacket->command == I2C_WRITOP )
  922. {
  923. /* Initialize pointer to caller's write data buffer. */
  924. pWriteData = (unsigned char *)pI2cCmdPacket->memoryAddress;
  925. statusVariable = 0;
  926. if ( I2C_KNOWN_STATE(unit) )
  927.     {
  928.     statusVariable = I2C_ERROR_KNOWN_STATE;
  929.     byteCount = pI2cCmdPacket->nBlocks;
  930.     goto errorEnd ;
  931.     }
  932. if ( I2C_CYCLE_START(unit) )
  933.     {
  934.     statusVariable = I2C_ERROR_CYCLE_START;
  935.     goto errorEnd ;
  936.     }
  937. /* device address */
  938. if ( I2C_CYCLE_WRITE(unit,i2cAddressMunge(deviceAddress)) )
  939.     {
  940.     statusVariable = I2C_ERROR_CYCLE_WRITE;
  941.     goto errorEnd ;
  942.     }
  943. if ( I2C_CYCLE_ACKIN(unit) )
  944.     {
  945.     statusVariable = I2C_ERROR_CYCLE_ACKIN;
  946.     goto errorEnd ;
  947.     }
  948. /* address register pointer */
  949. if ( I2C_CYCLE_WRITE(unit,pI2cCmdPacket->blockNumber) )
  950.     {
  951.     statusVariable = I2C_ERROR_CYCLE_WRITE;
  952.     goto errorEnd ;
  953.     }
  954. if ( I2C_CYCLE_ACKIN(unit) )
  955.     {
  956.     statusVariable = I2C_ERROR_CYCLE_ACKIN;
  957.     goto errorEnd ;
  958.     }
  959. if ( I2C_CYCLE_WRITE(unit,*(pWriteData+0)) )
  960.     {
  961.     statusVariable = I2C_ERROR_CYCLE_WRITE ;
  962.     goto errorEnd ;
  963.     }
  964. if ( I2C_CYCLE_ACKIN(unit))
  965.     {
  966.     statusVariable = I2C_ERROR_CYCLE_ACKIN;
  967.     goto errorEnd ;
  968.     }
  969. /* Increment the actual count of the command packet. */
  970. pI2cCmdPacket->aCount += 1;
  971. if ( pI2cCmdPacket->nBlocks == 2 )
  972.     {
  973.     if ( I2C_CYCLE_WRITE(unit,*(pWriteData+1)) )
  974. {
  975. statusVariable = I2C_ERROR_CYCLE_READ;
  976. goto errorEnd ;
  977. }
  978.     if ( I2C_CYCLE_ACKIN(unit) )
  979. {
  980. statusVariable = I2C_ERROR_CYCLE_ACKIN;
  981. goto errorEnd ;
  982. }
  983.     /* Increment the actual count of the command packet. */
  984.     pI2cCmdPacket->aCount += 1;
  985.     }
  986. if ( I2C_CYCLE_STOP(unit))
  987.     {
  988.     statusVariable = I2C_ERROR_CYCLE_STOP;
  989.     goto errorEnd ;
  990.     }
  991. /*
  992.  * update the caller's command packet with status of
  993.  * the operation
  994.  */
  995. pI2cCmdPacket->status = statusVariable;
  996. }
  997.     else
  998. {
  999. I2C_KNOWN_STATE(unit);
  1000. return ERROR ;
  1001. }
  1002.     errorEnd:
  1003.     /* Leave the I2C bus in a known state. */
  1004.     I2C_KNOWN_STATE(unit);
  1005.     /*
  1006.      * update the caller's command packet with status of
  1007.      * the operation
  1008.      */
  1009.     pI2cCmdPacket->status = statusVariable;
  1010.     return OK ;
  1011.     }
  1012. int i2cDoOpM41T48
  1013.     (
  1014.     int             unit,
  1015.     UINT32          deviceAddress,    /* device I2C bus address */
  1016.     i2cCmdPckt_t *  pI2cCmdPacket     /* pointer to command packet */
  1017.     )
  1018. {
  1019.     i2cDrvRoutines_t *pRoutine; /* low level routines table pointer */
  1020.     int byteCount; /* byte counter */
  1021.     int statusVariable; /* local status variable */
  1022.     unsigned char *pWriteData; /* pointer to write data buffer */
  1023.     /* Initialize pointer to driver routines table. */
  1024.     pRoutine = i2cDrvRoutinesTables[I2C_DRV_TYPE];
  1025.     /*
  1026.      * read operation,
  1027.      *
  1028.      */
  1029.     if ( pI2cCmdPacket->command == I2C_READOP )
  1030.     {
  1031.         /* Read the specified number of bytes from the EEPROM. */
  1032.        /* NOTE: random read has a dummy write first. */
  1033.         statusVariable = 0;
  1034.         if ( I2C_KNOWN_STATE(unit) )
  1035.         {
  1036.             pI2cCmdPacket->status = I2C_ERROR_KNOWN_STATE;
  1037.             return ERROR ;
  1038.         }
  1039.         if ( I2C_CYCLE_START(unit) )
  1040.         {
  1041.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_START ;
  1042.             return ERROR ;
  1043.         }
  1044.         /* device address - write, R/W bit = 0  */
  1045.         if ( I2C_CYCLE_WRITE(unit,i2cAddressMunge(deviceAddress)) )
  1046.         {
  1047.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_WRITE;
  1048.             return ERROR ;
  1049.         }
  1050.         if ( I2C_CYCLE_ACKIN(unit) )
  1051.         {
  1052.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_ACKIN ;
  1053.             return ERROR ;
  1054.         }
  1055.         /* command byte (register #) */
  1056.         if ( I2C_CYCLE_WRITE( unit, (pI2cCmdPacket->blockNumber & 0x1f) ) )
  1057.         {
  1058.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_WRITE;
  1059.             return ERROR ;
  1060.         }
  1061.         if ( I2C_CYCLE_ACKIN(unit) )
  1062.         {
  1063.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_ACKIN;
  1064.             return ERROR ;
  1065.         }
  1066.         if ( I2C_CYCLE_START(unit) )
  1067.         {
  1068.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_START;
  1069.             return ERROR ;
  1070.         }
  1071.         /* device address - read, R/W bit = 1 */
  1072.         if ( I2C_CYCLE_WRITE(unit,i2cAddressMunge(deviceAddress)|0x1) )
  1073.         {
  1074.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_WRITE;
  1075.             return ERROR ;
  1076.         }
  1077.         if ( I2C_CYCLE_ACKIN(unit) )
  1078.         {
  1079.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_ACKIN;
  1080.             return ERROR ;
  1081.         }
  1082.        /* generate ack on next to last byte; generate stop on last byte */
  1083.        for ( byteCount = 0; byteCount < pI2cCmdPacket->nBlocks; byteCount++ )
  1084.        {
  1085.             if (byteCount == (pI2cCmdPacket->nBlocks-1))
  1086.             {       
  1087.                 /* No ACK on last byte */
  1088.                 if ( I2C_CYCLE_READ(unit,
  1089.                    (unsigned char *)pI2cCmdPacket->memoryAddress+byteCount,0) )
  1090.                 {
  1091.                     pI2cCmdPacket->status = I2C_ERROR_CYCLE_READ;
  1092.                     return ERROR ;
  1093.                 }
  1094.                 /* send a STOP on last transfer */
  1095.                 if ( I2C_CYCLE_STOP(unit) )
  1096.                 {
  1097.                     pI2cCmdPacket->status = I2C_ERROR_CYCLE_STOP;
  1098.                     return ERROR ;
  1099.                 }
  1100.             } else {
  1101.                 /* Send an ACK on next to last transfer */
  1102.                 if ( I2C_CYCLE_READ(unit,
  1103.                    (unsigned char *)pI2cCmdPacket->memoryAddress+byteCount,1) )
  1104.                 {
  1105.                     pI2cCmdPacket->status = I2C_ERROR_CYCLE_READ;
  1106.                     return ERROR ;
  1107.                 }
  1108.             }
  1109.             /* Increment the actual count of the command packet. */
  1110.             pI2cCmdPacket->aCount += 1;
  1111. #ifdef I2C_DRIVER_DEBUG
  1112.             logMsg("byteCount - 0x%x.n", pI2cCmdPacket->aCount,2,3,4,5,6);
  1113. #endif
  1114.        }
  1115.       /*
  1116.        * update the caller's command packet with status of
  1117.        * the operation
  1118.        */
  1119.        pI2cCmdPacket->status = statusVariable;
  1120.     }
  1121.     /*
  1122.      * write operation
  1123.      *
  1124.      *
  1125.      */
  1126.     else if ( pI2cCmdPacket->command == I2C_WRITOP )
  1127.     {
  1128.         /* Initialize pointer to caller's write data buffer. */
  1129.         pWriteData = (unsigned char *)pI2cCmdPacket->memoryAddress;
  1130.         /* Write the specified number of bytes from the EEPROM. */
  1131.         statusVariable = 0;
  1132.         if ( I2C_KNOWN_STATE(unit) )
  1133.         {
  1134.             pI2cCmdPacket->status = I2C_ERROR_KNOWN_STATE;
  1135.             return ERROR ;
  1136.         }
  1137.         if ( I2C_CYCLE_START(unit) )
  1138.         {
  1139.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_START;
  1140.             return ERROR ;
  1141.         }
  1142.         /* device address - write, R/W bit = 0  */
  1143.         if ( I2C_CYCLE_WRITE(unit,i2cAddressMunge(deviceAddress)) )
  1144.         {
  1145.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_WRITE;
  1146.             return ERROR ;
  1147.         }
  1148.         if ( I2C_CYCLE_ACKIN(unit) )
  1149.         {
  1150.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_ACKIN;
  1151.             return ERROR ;
  1152.         }
  1153.         /* command byte (register #) */
  1154.         if ( I2C_CYCLE_WRITE( unit, (pI2cCmdPacket->blockNumber&0x1f) ) )
  1155.         {
  1156.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_WRITE;
  1157.             return ERROR ;
  1158.         }
  1159.         if ( I2C_CYCLE_ACKIN(unit) )
  1160.         {
  1161.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_ACKIN;
  1162.             return ERROR ;
  1163.         }
  1164.         /* nBlocks should be a power of 2 */
  1165.         for ( byteCount = 0; byteCount < pI2cCmdPacket->nBlocks; byteCount++ )
  1166.         {
  1167.             /* write data */
  1168.             if ( I2C_CYCLE_WRITE(unit, pWriteData[byteCount]) )
  1169.             {
  1170.                 pI2cCmdPacket->status = I2C_ERROR_CYCLE_WRITE;
  1171.                 return ERROR ;
  1172.             }
  1173.             if ( I2C_CYCLE_ACKIN(unit) )
  1174.             {
  1175.                 pI2cCmdPacket->status = I2C_ERROR_CYCLE_ACKIN;
  1176.                 return ERROR ;
  1177.             }
  1178.             /* Increment the actual count of the command packet. */
  1179.             pI2cCmdPacket->aCount += 1;
  1180. #ifdef I2C_DRIVER_DEBUG
  1181.             logMsg("byteCount - 0x%x.n", pI2cCmdPacket->aCount,2,3,4,5,6);
  1182. #endif
  1183.         }
  1184.         if ( I2C_CYCLE_STOP(unit) )
  1185.         {
  1186.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_STOP;
  1187.             return ERROR ;
  1188.         }
  1189.     } else {
  1190.         I2C_KNOWN_STATE(unit);
  1191.         return ERROR ;
  1192.     }
  1193.     /* Leave the I2C bus in a known state. */
  1194.     I2C_KNOWN_STATE(unit);
  1195.     /*
  1196.      * update the caller's command packet with status of
  1197.      * the operation
  1198.      */
  1199.     pI2cCmdPacket->status = statusVariable;
  1200.     return OK ;
  1201. }
  1202. int i2cDoOpPCF8574
  1203.     (
  1204.     int             unit,
  1205.     UINT32          deviceAddress,    /* device I2C bus address */
  1206.     i2cCmdPckt_t *  pI2cCmdPacket     /* pointer to command packet */
  1207.     )
  1208. {
  1209.     i2cDrvRoutines_t *pRoutine; /* low level routines table pointer */
  1210.     int byteCount; /* byte counter */
  1211.     int statusVariable; /* local status variable */
  1212.     /* Initialize pointer to driver routines table. */
  1213.     pRoutine = i2cDrvRoutinesTables[I2C_DRV_TYPE];
  1214.     /*
  1215.      * read operation,
  1216.      *
  1217.      */
  1218.     if ( pI2cCmdPacket->command == I2C_READOP )
  1219.     {
  1220.         /* Read the specified number of bytes from the EEPROM. */
  1221.         /* NOTE: random read has a dummy write first. */
  1222.         statusVariable = 0;
  1223.         if ( I2C_KNOWN_STATE(unit) )
  1224.         {
  1225.             pI2cCmdPacket->status = I2C_ERROR_KNOWN_STATE;
  1226.             return ERROR ;
  1227.         }
  1228.         if ( I2C_CYCLE_START(unit) )
  1229.         {
  1230.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_START ;
  1231.             return ERROR ;
  1232.         }
  1233.         /* device address - write, R/W bit = 0  */
  1234.         if ( I2C_CYCLE_WRITE(unit,i2cAddressMunge(deviceAddress) | 0x41) )
  1235.         {
  1236.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_WRITE;
  1237.             return ERROR ;
  1238.         }
  1239.         if ( I2C_CYCLE_ACKIN(unit) )
  1240.         {
  1241.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_ACKIN ;
  1242.             return ERROR ;
  1243.         }
  1244.         /* generate ack on next to last byte; generate stop on last byte */
  1245.         for ( byteCount = 0; byteCount < pI2cCmdPacket->nBlocks; byteCount++ )
  1246.         {
  1247.            /* Acks on all other transfers */
  1248.             if ( I2C_CYCLE_READ(unit,
  1249.                (unsigned char *)pI2cCmdPacket->memoryAddress+byteCount,1) )
  1250.             {
  1251.                 pI2cCmdPacket->status = I2C_ERROR_CYCLE_READ;
  1252.                 return ERROR ;
  1253.             }
  1254.  
  1255.             /* Increment the actual count of the command packet. */
  1256.             pI2cCmdPacket->aCount += 1;
  1257. #ifdef I2C_DRIVER_DEBUG
  1258.             logMsg("byteCount - 0x%x.n", pI2cCmdPacket->aCount,2,3,4,5,6);
  1259. #endif
  1260.         }
  1261.         /* send a STOP on last transfer */
  1262.         if ( I2C_CYCLE_STOP(unit) )
  1263.         {
  1264.             pI2cCmdPacket->status = I2C_ERROR_CYCLE_STOP;
  1265.             return ERROR ;
  1266.         }
  1267.  
  1268.         /*
  1269.          * update the caller's command packet with status of
  1270.          * the operation
  1271.          */
  1272.         pI2cCmdPacket->status = statusVariable;
  1273.     } else {
  1274.         I2C_KNOWN_STATE(unit);
  1275.         return ERROR ;
  1276.     }
  1277.     /* Leave the I2C bus in a known state. */
  1278.     I2C_KNOWN_STATE(unit);
  1279.     /*
  1280.      * update the caller's command packet with status of
  1281.      * the operation
  1282.      */
  1283.     pI2cCmdPacket->status = statusVariable;
  1284.     return OK;
  1285. }
  1286. /******************************************************************************
  1287. *
  1288. * i2cDoOp - execute I2C do operation
  1289. *
  1290. * This function executes the operation as specified
  1291. * by the passed command packet.  Currently, the only device types
  1292. * that are recognized are the ATMEL AT24C256, Analog Devices AD7417ARU
  1293. * and PCA9555.
  1294. *
  1295. * RETURNS: OK, or ERROR
  1296. *
  1297. * ERRNO: N/A
  1298. */
  1299. int i2cDoOp
  1300.     (
  1301.     int             unit,
  1302.     UINT32          deviceAddress, /* device I2C bus address */
  1303.     i2cCmdPckt_t *  pI2cCmdPacket /* pointer to command packet */
  1304.     )
  1305.     {
  1306. #ifdef I2C_DRIVER_DEBUG
  1307.     logMsg("i2cDoOp: deviceAddress - 0x%x, pI2cCmdPacket - 0x%xn",
  1308.    deviceAddress, pI2cCmdPacket,3,4,5,6);
  1309. #endif
  1310.     /* Command interface to stop.  This is for previous error exits. */
  1311.     I2C_CYCLE_STOP(unit);
  1312.     switch(pI2cCmdPacket->deviceType)
  1313.         {
  1314.         case I2C_DEVICE_TYPE_EEPROM_24LC128:
  1315.         case I2C_DEVICE_TYPE_EEPROM_AT24C256:
  1316.     if ( i2cDoOpAT24C256(unit, deviceAddress, pI2cCmdPacket) != OK )
  1317. return ERROR ;
  1318.             break;
  1319.         case I2C_DEVICE_TYPE_TEMP_SENSOR_AD7417:
  1320.     if ( i2cDoOpAD7417(unit, deviceAddress, pI2cCmdPacket) != OK )
  1321. return ERROR ;
  1322.             break;
  1323.         case I2C_DEVICE_TYPE_IOPORT_PCA9555:
  1324.     if ( i2cDoOpPCA9555(unit, deviceAddress, pI2cCmdPacket) != OK )
  1325. return ERROR ;
  1326.             break;
  1327.         case I2C_DEVICE_TYPE_RTC_M41T48:
  1328.     if ( i2cDoOpM41T48(unit, deviceAddress, pI2cCmdPacket) != OK )
  1329. return ERROR ;
  1330.             break;
  1331.         case I2C_DEVICE_TYPE_IOPORT_PCF8574:
  1332.     if ( i2cDoOpPCF8574(unit, deviceAddress, pI2cCmdPacket) != OK )
  1333. return ERROR ;
  1334.             break;
  1335.         default :
  1336.             return ERROR ;
  1337. }
  1338.     return(OK);
  1339.     }
  1340. /******************************************************************************
  1341. *
  1342. * i2cAddressMunge - initialize the i2c device driver
  1343. *
  1344. * This function's purpose is to munge/modify the I2C device address
  1345. * based upon the byte offset into the device.  This only applies to
  1346. * EEPROM type devices.  Dependent upon the size of the device, A0-A2
  1347. * address lines are utilized as 256 byte size page offsets.
  1348. *
  1349. * RETURNS: munged address
  1350. *
  1351. * ERRNO: N/A
  1352. */
  1353. unsigned int i2cAddressMunge
  1354.     (
  1355.     unsigned int deviceAddress
  1356.     )
  1357.     {
  1358.     return((deviceAddress<<1)&0xfe) ;
  1359.     }
  1360. /* AT24C256 -> 512 pages of 64 bytes each, 15 bits reqd for addressing */
  1361. /* 64 bytes -> address masked with 0xffc0 */
  1362. /* lsb of device address is for 0/1 read/write */
  1363. /*****************************************************************************
  1364. *
  1365. * i2cInByte - reads a byte from I2C Regs
  1366. *
  1367. * This function reads a byte from an I2C register.
  1368. *
  1369. * RETURNS: value of byte read
  1370. *
  1371. * ERRNO: N/A
  1372. */
  1373. LOCAL UINT8 i2cInByte
  1374.     (
  1375.     UINT32 dataPtr
  1376.     )
  1377.     {
  1378.     UINT8 *ptr = (UINT8*)dataPtr ;
  1379.     return(*ptr);
  1380.     }
  1381. /*****************************************************************************
  1382. *
  1383. * i2cOutByte - writes a byte to an I2C register
  1384. *
  1385. * This function writes a byte to an I2C register.
  1386. *
  1387. * RETURNS: N/A
  1388. *
  1389. * ERRNO: N/A
  1390. */
  1391. LOCAL void i2cOutByte
  1392.     (
  1393.     UINT32 dataPtr,
  1394.     UINT8 data
  1395.     )
  1396.     {
  1397.     UINT8 * ptr = (UINT8*)dataPtr ;
  1398.     *ptr = data ;
  1399.     }