i2c.c
上传用户:fy98168
上传日期:2015-06-26
资源大小:13771k
文件大小:6k
源码类别:

DVD

开发平台:

C/C++

  1. #include <string.h>
  2. #include "stlite.h"
  3. #include "stdevice.h"
  4. #include "stddefs.h"
  5. #include "sttbx.h"
  6. #include "stcommon.h"
  7. #include "sti2c.h"
  8. #include "errors.h"
  9. #include "i2c.h"
  10. #include "osp.h"
  11. #define I2C_MAX_OPEN 8
  12. #define FRONT_PIO                3
  13. #define BACK_PIO                 3
  14. #define PIO_FOR_SSC0_SDA         PIO_BIT_0
  15. #define PIO_FOR_SSC0_SCL         PIO_BIT_1
  16. #define PIO_FOR_SSC1_SDA         PIO_BIT_2
  17. #define PIO_FOR_SSC1_SCL         PIO_BIT_3
  18. #define I2C_TIMEOUT (20)
  19. extern ST_DeviceName_t PIO_DeviceName[];
  20. extern partition_t *SystemPartition;
  21. static ST_ClockInfo_t ST_ClockInfo;
  22. ST_DeviceName_t I2C_DeviceName[] = { "I2C_BACK", "I2C_FRONT" };
  23. STI2C_Handle_t  I2C_Handle[I2C_DEVICES];
  24. static UINT32  i2c_sem;
  25. static void I2C_Protect(void)
  26. {
  27. KB_OSPSemGet(i2c_sem, KB_Wait, 0);
  28. }
  29. static void I2C_UnProtect(void)
  30. {
  31. KB_OSPSemSet(i2c_sem);
  32. }
  33. INT32 KB_I2CInit(UINT32 bits_per_second)
  34. {
  35. ST_ErrorCode_t     ST_ErrorCode;
  36.     STI2C_InitParams_t STI2C_InitParams;
  37. if( ((bits_per_second != KB_I2C_RATE_100K)
  38.    && (bits_per_second != KB_I2C_RATE_400K)) )
  39. {
  40. return RETFAIL3;
  41. }
  42. KB_OSPSemInit("I2CS", 1, J_OSP_WAIT_FIFO, &i2c_sem);
  43.     memset(&STI2C_InitParams, '', sizeof(STI2C_InitParams_t) );
  44. ST_GetClockInfo(&ST_ClockInfo);
  45.     /* back I2C bus */
  46.     STI2C_InitParams.BaseAddress       = (U32 *)SSC_0_BASE_ADDRESS;
  47.     STI2C_InitParams.InterruptNumber   = SSC_0_INTERRUPT;
  48.     STI2C_InitParams.InterruptLevel    = SSC_0_INTERRUPT_LEVEL;
  49.     STI2C_InitParams.PIOforSDA.BitMask = PIO_FOR_SSC0_SDA;
  50.     STI2C_InitParams.PIOforSCL.BitMask = PIO_FOR_SSC0_SCL;
  51.     STI2C_InitParams.MasterSlave       = STI2C_MASTER;
  52.     STI2C_InitParams.BaudRate          = (U32)bits_per_second;
  53.     STI2C_InitParams.MaxHandles        = I2C_MAX_OPEN;
  54.     STI2C_InitParams.ClockFrequency    = ST_ClockInfo.CommsBlock;
  55.     STI2C_InitParams.DriverPartition   = SystemPartition;
  56.     STI2C_InitParams.GlitchWidth       = 0x05; /* Inclued as a rectification of I2C+399NIM functioning */
  57.     strcpy(STI2C_InitParams.PIOforSDA.PortName, PIO_DeviceName[BACK_PIO]);
  58.     strcpy(STI2C_InitParams.PIOforSCL.PortName, PIO_DeviceName[BACK_PIO]);
  59.     STTBX_Print(("KB_I2CInit(%s)=", I2C_DeviceName[I2C_BACK_BUS] ));
  60.     ST_ErrorCode = STI2C_Init(I2C_DeviceName[I2C_BACK_BUS], &STI2C_InitParams);
  61.     if (ST_ErrorCode != ST_NO_ERROR)
  62.     {
  63.         STTBX_Print(("%sn", DBGError(ST_ErrorCode) ));
  64. return RETFIAL1;
  65.     }
  66.     else
  67.     {
  68.         STTBX_Print(("%sn", STI2C_GetRevision() ));
  69.     }
  70. return RETOK;
  71. }
  72. INT32 KB_I2COpen(UINT32 nSlaveAddress, UINT32 *i2cHandle)
  73. {
  74. ST_ErrorCode_t     ST_ErrorCode;
  75. STI2C_OpenParams_t I2cOpenParams;
  76. memset(&I2cOpenParams, '', sizeof( STI2C_OpenParams_t ));
  77. /* ---------- Open an existing, Initialized I2C driver ---------- */
  78. I2cOpenParams.AddressType      = STI2C_ADDRESS_7_BITS;
  79. I2cOpenParams.BusAccessTimeOut = I2C_TIMEOUT; /* GNBvd07229 */
  80. I2cOpenParams.I2cAddress       = (U16)nSlaveAddress;
  81. I2C_Protect();
  82. ST_ErrorCode = STI2C_Open(I2C_DeviceName[I2C_BACK_BUS], &I2cOpenParams, (STI2C_Handle_t*)i2cHandle);
  83. I2C_UnProtect();
  84. if (ST_ErrorCode != ST_NO_ERROR)
  85.     {
  86.         STTBX_Print(("KB_I2COpen, Error = %sn", DBGError(ST_ErrorCode) ));
  87. return RETFIAL1;
  88.     }
  89. else
  90. {
  91. STTBX_Print(("KB_I2COpen Success, Handle = 0x%X, Addr = 0x%Xn", *i2cHandle, nSlaveAddress));
  92. }
  93. return RETOK;
  94. }
  95. INT32 KB_I2CClose(UINT32 i2cHandle)
  96. {
  97. ST_ErrorCode_t     ST_ErrorCode;
  98. I2C_Protect();
  99. ST_ErrorCode = STI2C_Close((STI2C_Handle_t)i2cHandle);
  100. I2C_UnProtect();
  101. if (ST_ErrorCode != ST_NO_ERROR)
  102.     {
  103.         STTBX_Print(("KB_I2CClose(0x%X), Error = %sn", i2cHandle, DBGError(ST_ErrorCode) ));
  104. return RETFIAL1;
  105.     }
  106. else
  107. {
  108. STTBX_Print(("KB_I2CClose Success, Handle = 0x%Xn", i2cHandle));
  109. }
  110. return RETOK;
  111. }
  112. INT32 KB_I2CReadWithoutStop(UINT32 i2cHandle, UINT32 nBufferLength, UINT8 *pBuffer)
  113. {
  114. ST_ErrorCode_t     ST_ErrorCode;
  115. U32 Size;
  116. if((nBufferLength == 0) || (pBuffer == NULL)) return RETFAIL3;
  117. I2C_Protect();
  118. ST_ErrorCode = STI2C_ReadNoStop((STI2C_Handle_t)i2cHandle, (U8*)pBuffer, (U32)nBufferLength, I2C_TIMEOUT, &Size);
  119. I2C_UnProtect();
  120. if (ST_ErrorCode != ST_NO_ERROR)
  121.     {
  122.         STTBX_Print(("KB_I2CReadWithoutStop, Handle = 0x%X,  Error = %sn", i2cHandle, DBGError(ST_ErrorCode) ));
  123. return RETFIAL1;
  124.     }
  125. return RETOK;
  126. }
  127. INT32 KB_I2CReadWithStop(UINT32 i2cHandle, UINT32 nBufferLength, UINT8 *pBuffer)
  128. {
  129. ST_ErrorCode_t     ST_ErrorCode;
  130. U32 Size;
  131. if((nBufferLength == 0) || (pBuffer == NULL)) return RETFAIL3;
  132. I2C_Protect();
  133. ST_ErrorCode = STI2C_Read((STI2C_Handle_t)i2cHandle, (U8*)pBuffer, (U32)nBufferLength, I2C_TIMEOUT, &Size);
  134. I2C_UnProtect();
  135. if (ST_ErrorCode != ST_NO_ERROR)
  136.     {
  137.         STTBX_Print(("KB_I2CReadWithStop, Handle = 0x%X,  Error = %sn", i2cHandle, DBGError(ST_ErrorCode) ));
  138. return RETFIAL1;
  139.     }
  140. return RETOK;
  141. }
  142. INT32 KB_I2CWriteWithoutStop(UINT32 i2cHandle, UINT32 nBufferLength, UINT8 *pBuffer)
  143. {
  144. ST_ErrorCode_t     ST_ErrorCode;
  145. U32 Size;
  146. if((nBufferLength == 0) || (pBuffer == NULL)) return RETFAIL3;
  147. I2C_Protect();
  148. ST_ErrorCode = STI2C_WriteNoStop((STI2C_Handle_t)i2cHandle, (U8*)pBuffer, (U32)nBufferLength, I2C_TIMEOUT, &Size);
  149. I2C_UnProtect();
  150. if (ST_ErrorCode != ST_NO_ERROR)
  151.     {
  152.         STTBX_Print(("KB_I2CWriteWithoutStop, Handle = 0x%X,  Error = %sn", i2cHandle, DBGError(ST_ErrorCode) ));
  153. return RETFIAL1;
  154.     }
  155. return RETOK;
  156. }
  157. INT32 KB_I2CWriteWithStop(UINT32 i2cHandle, UINT32 nBufferLength, UINT8 *pBuffer)
  158. {
  159. ST_ErrorCode_t     ST_ErrorCode;
  160. U32 Size = 0;
  161. if((nBufferLength == 0) || (pBuffer == NULL)) return RETFAIL3;
  162. I2C_Protect();
  163. ST_ErrorCode = STI2C_Write((STI2C_Handle_t)i2cHandle, (U8*)pBuffer, (U32)nBufferLength, I2C_TIMEOUT, &Size);
  164. I2C_UnProtect();
  165. if (ST_ErrorCode != ST_NO_ERROR)
  166.     {
  167.         STTBX_Print(("KB_I2CWriteWithStop Failure, Handle = 0x%X, %sn", i2cHandle, DBGError(ST_ErrorCode) ));
  168. return RETFIAL1;
  169.     }
  170. //STTBX_Print(("KB_I2CWriteWithStop Success, Handle = 0x%X,  Addr = 0x%Xn", i2cHandle, pBuffer[0]));
  171. return RETOK;
  172. }
  173. /* EOF --------------------------------------------------------------------- */