关于wince下I2C控制的参考代码

来源:互联网 发布:北京思学通软件怎么样 编辑:程序博客网 时间:2024/06/01 18:44
/////////////////////////////////////////////////////////////
//title:关于I2C控制的一些注意问题
//descrpit:分析I2C总线工作原理和实现方法
//author:Mercury Xu
//date:2008-09-20
/////////////////////////////////////////////////////////////
阅读本文前请先阅读完I2C协议手册,下载地址如下:
http://download.csdn.net/source/315355

最近的开发一直与I2C有关系。以前写过I2C通讯相关东西。但是用的是别人的封装函数。所以没有怎么仔细看。
这次通过开发MTV335这款芯片自己参考了原厂提供的代码写了一个I2C通讯的程序。没有做成类的形式,也是普通的函数调用。应该比较容易理解和使用。具体的操作如下,另外要提得一点是,在做I2C程序之前一定要硬件工程师帮你检查下或者你自己检查下线路是否通畅,上拉电阻是否使用正确,I2C两线的电压是否正常3.3-5V。检查完这些后,尝试送一组值给芯片,看下波型是否正确,如果正确就放心大胆的写东西吧,多话不说了,大家看参考代码吧。其中我使用了一些伪代码来替代一些操作,不同的芯片用不同的方式去替换就好了。

另,参考程序是基于wince5.0下流设备驱动形式编写,请按照各自不同的芯片进行修改。

  1. #ifndef _DEMO_H_ 
  2. #define _DEMO_H_
  3. #define DELAY_CNT   50         //Delay 50 us
  4. #define DEMO_WriteID  0x4A     //[DEMO] Write address
  5. #define DEMO_ReadID   0x4B     //[DEMO] Read  address
  6. #define   TIMERTICK    (v_pDriverGlobals->sysclk.dwSystemClock/(1000000*2))       //delay basic num
  7. #define   NTSC       1        //set show type
  8. typedef enum OPERA_MODE {
  9.     READ = 1,
  10.     WRITE = 2
  11. } T_OPERA_MODE;
  12. unsigned char DEMOTable[] = {
  13.     
  14.                                 
  15. 0x08,0xC0,0x33,0x00,0x00,0xE9,0x0D,0xB8,0x01,0x80,0x47,0x40,0x00,0x01,0x2A,0x38,
  16.                                 
  17. 0x0C,0xf7,0x01,0x3E,0x00,0x00,0x02,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  18.                                 
  19. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x07,
  20.                                 0x80,0x00
  21.                                 
  22.                              }; 
  23. unsigned char DEMOAddress[] = { 
  24.     
  25.                                  
  26. 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,
  27.                                  
  28. 0x11,0x12,0x13,0x15,0x16,0x17,0x40,0x41,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,
  29.                                  
  30. 0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,
  31.                                  0x5B,0x5E
  32.                                  
  33.                                 };
  34. ////////////////////////////////////////////////////////////////////
  35. // Copyright Mercury's CO.,LTD.2007-2008
  36. // Author : Mercury Xu
  37. // Descript: this file for DEMO chip,it's a dll entry function 
  38. // in this file include the DEMO_XXX function for driver the chip
  39. // as a stream device.At the same time,in the bsp package we define
  40. // other function for make suer that this device can reset.use 
  41. // centrality define function from gpio.h head file.
  42. ////////////////////////////////////////////////////////////////////
  43. //update log
  44. //create by : 2008-03-21 mercury xu 
  45. //add by : 2008-04-03 mercury xu add define into the file change old file struct.
  46. //add by : 2008-04-04 mercury xu add some variables for ioctr function
  47. //modify by : 2008-07-30 mercury xu change it for DEMO
  48. /////////////////////////////////////////////////////////////////////
  49.         //=============================================================================
  50.         //Title : WrToDEMO
  51.         //Detail: Write Data To DEMO
  52.         //Input : addr data
  53.         //Output: none
  54.         //Author: Mercury Xu
  55.         //Data  : 2008-07-30
  56.         //=============================================================================
  57.         void WrToDEMO(unsigned char addr,unsigned char data);
  58.         //=============================================================================
  59.         //Title : initial_DEMO
  60.         //Detail: initial DEMO chip
  61.         //Input : none
  62.         //Output: none
  63.         //Author: Mercury Xu
  64.         //Data  : 2008-07-30
  65.         //=============================================================================
  66.         void initial_DEMO();
  67.         //=============================================================================
  68.         //Title : ReceiveAck
  69.         //Detail: Receive Ack from DEMO chip
  70.         //Input : none
  71.         //Output: int
  72.         //Author: Mercury Xu
  73.         //Data  : 2008-07-30
  74.         //=============================================================================
  75.         int ReceiveAck();
  76.         //=============================================================================
  77.         //Title : StopBit
  78.         //Detail: StopBit  from DEMO chip
  79.         //Input : none
  80.         //Output: none
  81.         //Author: Mercury Xu
  82.         //Data  : 2008-07-30
  83.         //=============================================================================
  84.         void StopBit();
  85.         //=============================================================================
  86.         //Title : StartBit
  87.         //Detail: StartBit  from DEMO chip
  88.         //Input : none
  89.         //Output: none
  90.         //Author: Mercury Xu
  91.         //Data  : 2008-07-30
  92.         //=============================================================================
  93.         void StartBit();
  94.         //=============================================================================
  95.         //Title : WrData
  96.         //Detail: WrData to DEMO chip
  97.         //Input : none
  98.         //Output: none
  99.         //Author: Mercury Xu
  100.         //Data  : 2008-07-30
  101.         //=============================================================================
  102.         void WrData(unsigned char data);
  103.         //=============================================================================
  104.         //Title : DEMO_reset
  105.         //Detail: DEMO_reset to DEMO chip
  106.         //Input : none
  107.         //Output: none
  108.         //Author: Mercury Xu
  109.         //Data  : 2008-07-30
  110.         //=============================================================================
  111.               //  void DEMO_reset();
  112. ///////////////////////////////////////////////////////////////////////////
  113. //modify by mercury xu  Mercury's 20080401
  114. //this segment for define some useful little function.usually use in the program.
  115. //there are including some functions as following words
  116. //sdio_high()
  117. //sdio_low()
  118. //sclk_high()
  119. //sclk_low()
  120. //sdio_output_enable()
  121. //sdio_input_enable()
  122. //sdio_getdata()
  123. ///////////////////////////////////////////////////////////////////////////
  124. //update log
  125. //create by mercury xu  20070401
  126. ///////////////////////////////////////////////////////////////////////////
  127. void sleepGPIO(long usVal);
  128. ///////////////////////////////////////////////////////////////////////////
  129. void sdio_high();
  130. ///////////////////////////////////////////////////////////////////////////
  131. void sdio_low();
  132. ///////////////////////////////////////////////////////////////////////////
  133. void sclk_high();
  134. ///////////////////////////////////////////////////////////////////////////
  135. void sclk_low();
  136. //////////////////////////////////////////////////////////////////////////
  137. void sdio_output_enable();
  138. //////////////////////////////////////////////////////////////////////////
  139. void sdio_input_enable();
  140. //////////////////////////////////////////////////////////////////////////
  141. int sdio_getdata();
  142. //end segment
  143. ///////////////////////////////////////////////////////////////////////////////
  144. void sdio_reset();
  145. extern "C" unsigned char OperationDEMO(T_OPERA_MODE operation, unsigned char *data, unsigned char numBytes);
  146. /////////////////////////////////////////////////////////////////////
  147. extern "C" BOOL CALLBACK DllMain(HANDLE hDLL,DWORD dwReason,LPVOID lpvReserved);
  148. //////////////////////////////////////////////////////////////////////////////////
  149. //------------------------------------------------------------------------------
  150. // @xref                          <nl>
  151. //          <f DEMO_Init>,         <nl>
  152. //          <f DEMO_Deinit>,       <nl>
  153. //          <f DEMO_Open>,         <nl>
  154. //          <f DEMO_Close>,        <nl>
  155. //          <f DEMO_Read>,         <nl>
  156. //          <f DEMO_Write>,        <nl>
  157. //          <f DEMO_Seek>,         <nl>
  158. //          <f DEMO_PowerUp>,      <nl>
  159. //          <f DEMO_PowerDown>,    <nl>
  160. //          <f DEMO_IOControl>     <nl>
  161. //
  162. // -----------------------------------------------------------------------------
  163. extern "C" DWORD DEMO_Init(DWORD Index);
  164. // -----------------------------------------------------------------------------
  165. //
  166. //  @doc    WDEV_EXT
  167. //
  168. //  @func   PVOID | DEMO_Deinit | Device deinitialization routine
  169. //
  170. //  @parm   DWORD | dwData | value returned from DEMO_Init call
  171. //
  172. //  @rdesc  Returns TRUE for success, FALSE for failure.
  173. //
  174. // -----------------------------------------------------------------------------
  175. //extern "C" BOOL DEMO_Deinit(DWORD dwData);
  176. // -----------------------------------------------------------------------------
  177. //
  178. //  @doc    WDEV_EXT
  179. //
  180. //  @func   PVOID | DEMO_Open    | Device open routine
  181. //
  182. //  @parm   DWORD | dwData      | Value returned from DEMO_Init call (ignored)
  183. //
  184. //  @parm   DWORD | dwAccess    | Requested access (combination of GENERIC_READ
  185. //                                and GENERIC_WRITE) (ignored)
  186. //
  187. //  @parm   DWORD | dwShareMode | Requested share mode (combination of
  188. //                                FILE_SHARE_READ and FILE_SHARE_WRITE) (ignored)
  189. //
  190. //  @rdesc  Returns a DWORD which will be passed to Read, Write, etc or NULL if
  191. //          unable to open device.
  192. //
  193. // -----------------------------------------------------------------------------
  194. extern "C" PDWORD DEMO_Open( DWORD dwData,
  195.                            DWORD dwAccess,
  196.                            DWORD dwShareMode);
  197. // -----------------------------------------------------------------------------
  198. //
  199. //  @doc    WDEV_EXT
  200. //
  201. //  @func   BOOL | DEMO_Close | Device close routine
  202. //
  203. //  @parm   DWORD | dwOpenData | Value returned from DEMO_Open call
  204. //
  205. //  @rdesc  Returns TRUE for success, FALSE for failure
  206. //
  207. // -----------------------------------------------------------------------------
  208. //extern "C" BOOL DEMO_Close(PDWORD pdwData);
  209. // -----------------------------------------------------------------------------
  210. //
  211. //  @doc    WDEV_EXT
  212. //
  213. //  @func   DWORD | DEMO_Read | Device read routine
  214. //
  215. //  @parm   DWORD | dwOpenData | Value returned from DEMO_Open call (ignored)
  216. //
  217. //  @parm   LPVOID | pBuf | Buffer to receive data (ignored)
  218. //
  219. //  @parm   DWORD | len | Maximum length to read (ignored)
  220. //
  221. //  @rdesc  Returns 0 always. DEMO_Read should never get called and does
  222. //          nothing. Required DEVICE.EXE function, but all data communication
  223. //          is handled by <f DEMO_IOControl>.
  224. //
  225. // -----------------------------------------------------------------------------
  226. extern "C" DWORD DEMO_Read(DWORD dwData,
  227.                           LPVOID pBuf,
  228.                           DWORD Len);
  229. // -----------------------------------------------------------------------------
  230. //
  231. //  @doc    WDEV_EXT
  232. //
  233. //  @func   DWORD | DEMO_Write | Device write routine
  234. //
  235. //  @parm   DWORD | dwOpenData | Value returned from DEMO_Open call (ignored)
  236. //
  237. //  @parm   LPCVOID | pBuf | Buffer containing data (ignored)
  238. //
  239. //  @parm   DWORD | len | Maximum length to write (ignored)
  240. //
  241. //  @rdesc  Returns 0 always. DEMO_Write should never get called and does
  242. //          nothing. Required DEVICE.EXE function, but all data communication
  243. //          is handled by <f DEMO_IOControl>.
  244. //
  245. // -----------------------------------------------------------------------------
  246. extern "C" DWORD DEMO_Write(DWORD dwData,
  247.                            LPCVOID pBuf,
  248.                            DWORD Len);
  249. // -----------------------------------------------------------------------------
  250. //
  251. //  @doc    WDEV_EXT
  252. //
  253. //  @func   DWORD | DEMO_Seek | Device seek routine
  254. //
  255. //  @parm   DWORD | dwOpenData | Value returned from DEMO_Open call (ignored)
  256. //
  257. //  @parm   long | pos | Position to seek to (relative to type) (ignored)
  258. //
  259. //  @parm   DWORD | type | FILE_BEGIN, FILE_CURRENT, or FILE_END (ignored)
  260. //
  261. //  @rdesc  Returns -1 always. DEMO_Seek should never get called and does
  262. //          nothing. Required DEVICE.EXE function, but all data communication
  263. //          is handled by <f DEMO_IOControl>.
  264. //
  265. // -----------------------------------------------------------------------------
  266. extern "C" DWORD DEMO_Seek(DWORD dwData,
  267.                           long pos,
  268.                           DWORD type);
  269. // -----------------------------------------------------------------------------
  270. //
  271. //  @doc    WDEV_EXT
  272. //
  273. //  @func   void | DEMO_PowerUp | Device powerup routine
  274. //
  275. //  @comm   Called to restore device from suspend mode.  Cannot call any
  276. //          routines aside from those in the dll in this call.
  277. //
  278. // -----------------------------------------------------------------------------
  279. extern "C" VOID DEMO_PowerUp(VOID);
  280. // -----------------------------------------------------------------------------
  281. //
  282. //  @doc    WDEV_EXT
  283. //
  284. //  @func   void | DEMO_PowerDown | Device powerdown routine
  285. //
  286. //  @comm   Called to suspend device.  Cannot call any routines aside from
  287. //          those in the dll in this call.
  288. //
  289. // -----------------------------------------------------------------------------
  290. //extern "C" VOID DEMO_PowerDown(VOID);
  291. // -----------------------------------------------------------------------------
  292. //
  293. //  @doc    WDEV_EXT
  294. //
  295. //  @func   BOOL | DEMO_IOControl | Device IO control routine
  296. //
  297. //  @parm   DWORD | dwOpenData | Value returned from DEMO_Open call
  298. //
  299. //  @parm   DWORD | dwCode |
  300. //          IO control code for the function to be performed. DEMO_IOControl only
  301. //          supports one IOCTL value (IOCTL_DEMO_MESSAGE)
  302. //
  303. //  @parm   PBYTE | pBufIn |
  304. //          Pointer to the input parameter structure (<t MMDRV_MESSAGE_PARAMS>).
  305. //
  306. //  @parm   DWORD | dwLenIn |
  307. //          Size in bytes of input parameter structure (sizeof(<t MMDRV_MESSAGE_PARAMS>)).
  308. //
  309. //  @parm   PBYTE | pBufOut | Pointer to the return value (DWORD).
  310. //
  311. //  @parm   DWORD | dwLenOut | Size of the return value variable (sizeof(DWORD)).
  312. //
  313. //  @parm   PDWORD | pdwActualOut | Unused
  314. //
  315. //  @rdesc  Returns TRUE for success, FALSE for failure
  316. //
  317. //  @xref   <t DEMOe Input Driver Messages> (WIDM_XXX) <nl>
  318. //          <t DEMOe Output Driver Messages> (WODM_XXX)
  319. //
  320. // -----------------------------------------------------------------------------
  321. extern "C" BOOL DEMO_IOControl(PDWORD  pdwOpenData,
  322.                               DWORD  dwCode,
  323.                               PBYTE  pBufIn,
  324.                               DWORD  dwLenIn,
  325.                               PBYTE  pBufOut,
  326.                               DWORD  dwLenOut,
  327.                               PDWORD pdwActualOut);
  328. #endif
以上为头文件部分

  1. ////////////////////////////////////////////////////////////////////
  2. // Copyright Mercury's CO.,LTD.2007-2008
  3. // Author : Mercury Xu
  4. // Descript: this file for DEMO chip,it's a dll entry function 
  5. // in this file include the DEMO_XXX function for driver the chip
  6. // as a stream device.At the same time,in the bsp package we define
  7. // other function for make suer that this device can reset.use 
  8. // centrality define function from gGPIO.h head file.
  9. ////////////////////////////////////////////////////////////////////
  10. //update log
  11. //create by : 2008-03-21 mercury xu 
  12. //modify  : 2008-04-01 mercury xu add little functions segment.as following
  13. //modify  : 2008-04-01 mercury xu modify the operation functions.
  14. //add       :2008-04-03 mercury xu add some functions and some define
  15. //modify  : 2008-07-30 mercury xu change basic drvier to screen driver
  16. /////////////////////////////////////////////////////////////////////
  17. #include <drvlib.h>
  18. #include <oal_at4x0a.h>
  19. #include <cspregs.h>
  20. #include <nkintr.h>
  21. #include "halio.h"
  22. #include "uhal.h"
  23. #include "drvglob.h"
  24. #include "DEMO.h"
  25. /////////////////////////////////////////////////////////////////////
  26. //=============================================================================
  27. //Title : WrToDEMO
  28. //Detail: Write Data To DEMO
  29. //Input : addr data
  30. //Output: none
  31. //Author: Mercury Xu
  32. //Data  : 2008-07-30
  33. //=============================================================================
  34. void WrToDEMO(unsigned char addr,unsigned char data)
  35. {
  36.         StartBit();
  37.     RETAILMSG(1,(TEXT("WRITE DEMO address/r/n")));
  38.          
  39.         WrData(DEMO_WriteID);
  40.         if  ( !ReceiveAck() ) //continue;
  41.         
  42.             {
  43.             
  44.     RETAILMSG(1,(TEXT("WRITE DEMO address/r/n")));
  45.     
  46.         WrData(addr);
  47.         
  48.             }
  49.         
  50.         if  ( !ReceiveAck() )// continue;
  51.         
  52.             {
  53.             
  54.     RETAILMSG(1,(TEXT("WRITE DEMO data/r/n")));
  55.         WrData(data);
  56.             }
  57.         
  58.         if  ( !ReceiveAck() )// continue;
  59.         
  60.             {
  61.             
  62.     RETAILMSG(1,(TEXT("Stop!/r/n")));
  63.         StopBit();
  64.         }
  65. }
  66. //=============================================================================
  67. //Title : initial_DEMO
  68. //Detail: initial DEMO chip
  69. //Input : none
  70. //Output: none
  71. //Author: Mercury Xu
  72. //Data  : 2008-07-30
  73. //=============================================================================
  74. void initial_DEMO()
  75. {
  76.      int i; 
  77.      unsigned char  address=0x00;
  78.      unsigned char error_ind;
  79.      unsigned char DEMO_reg_data[98] = {};
  80.      unsigned char DEMOdata;
  81.      int loop_counter = 0;
  82.     //DEMO_reset();
  83.     /*
  84.     for(i=0; i<50; i++)      
  85.     {
  86.         if(OperationDEMO(WRITE,&DEMOAddress[i] , 1))
  87.         RETAILMSG(1,(TEXT("address write ok!/r/n")));
  88.     
  89.         if(OperationDEMO(WRITE,&DEMOTable[i] , 1))
  90.             RETAILMSG(1,(TEXT("data write ok!/r/n")));
  91.     }
  92.      */
  93.         for(i=0; i<50; i++)      
  94.        {
  95.         DEMOdata = DEMOTable[i];
  96.         address = DEMOAddress[i];
  97.         
  98.         WrToDEMO(address,DEMOdata);
  99.        }
  100.     RETAILMSG(1,(TEXT("DEMO_Read!/r/n ")));
  101.     do
  102.     {   
  103.         error_ind = OperationDEMO(READ, &(DEMO_reg_data[loop_counter]), 1);
  104.         if(error_ind)
  105.             {
  106.             RETAILMSG(1,(TEXT("power up cts error!/r/n")));
  107.             //return  (FALSE);
  108.             }
  109.         RETAILMSG(1,(TEXT("return val =%d/r/n"),DEMO_reg_data[loop_counter]));
  110.         loop_counter++;
  111.     }
  112.     while(((DEMO_reg_data[0]) != 0x80) && (loop_counter < 0x62));  //loop_counter limit should guarantee at least 300us
  113.     
  114.     if(loop_counter >= 0x62)
  115.     {
  116.         RETAILMSG(1,(TEXT("out...this chip couldn't read any things!!!!/r/n")));
  117.         
  118.     
  119.     }
  120.     else
  121.     {
  122.         RETAILMSG(1,(TEXT("everything is normal....future is beatuiful...!/r/n ")));
  123.     }
  124.     
  125. }
  126. //=============================================================================
  127. //Title : ReceiveAck
  128. //Detail: Receive Ack from DEMO chip
  129. //Input : none
  130. //Output: int
  131. //Author: Mercury Xu
  132. //Data  : 2008-07-30
  133. //=============================================================================
  134. int ReceiveAck()
  135. {
  136.    
  137.     int val;
  138.     
  139.     sdio_input_enable();
  140.     sclk_high();
  141.        sleepGPIO(100);
  142.     val = sdio_getdata();
  143.     RETAILMSG(1,(TEXT("return val =%d/r/n"),val));
  144.     sclk_low();
  145.     sdio_output_enable();
  146.      sdio_low();
  147.      sleepGPIO(500);
  148.      
  149.      return (val);
  150.       
  151. }
  152. //=============================================================================
  153. //Title : StopBit
  154. //Detail: StopBit  from DEMO chip
  155. //Input : none
  156. //Output: none
  157. //Author: Mercury Xu
  158. //Data  : 2008-07-30
  159. //=============================================================================
  160. void StopBit()
  161. {
  162.  
  163.        sdio_high();
  164.        sleepGPIO(500);
  165.     sclk_high();
  166. }
  167. //=============================================================================
  168. //Title : StartBit
  169. //Detail: StartBit  from DEMO chip
  170. //Input : none
  171. //Output: none
  172. //Author: Mercury Xu
  173. //Data  : 2008-07-30
  174. //=============================================================================
  175. void StartBit()
  176. {
  177.     
  178.     
  179.      sdio_low();
  180.      sleepGPIO(500);
  181.      sclk_low();
  182. }
  183. //=============================================================================
  184. //Title : WrData
  185. //Detail: WrData to DEMO chip
  186. //Input : none
  187. //Output: none
  188. //Author: Mercury Xu
  189. //Data  : 2008-07-30
  190. //=============================================================================
  191. void WrData(unsigned char data)
  192. {
  193.     int i; 
  194.     for (i=0; i<8; i++)
  195.     {
  196.         if (data & 0x80)
  197.             sdio_high();
  198.         else
  199.             sdio_low();
  200.         sleepGPIO(500);
  201.  
  202.         sclk_high();
  203.         
  204.         data = (data<<1);
  205.         
  206.         sleepGPIO(500);
  207.         sclk_low();
  208.     }
  209. //  sleepGPIO(5);
  210.  
  211. }
  212. //////////////////////////////////////////////////////////////////////////////////
  213. /*
  214. void DEMO_reset()
  215. {
  216. RETAILMSG(1,(TEXT(" DEMO reset begin")));//add by mercury xu Mercury's 20080909
  217. GPIO_OUTPUT_ZERO (GGPIO, GGPIO_GROUP(5), GGPIO_INDEX(17));
  218. GPIO_OUTPUT_ENABLE (GGPIO, GGPIO_GROUP(5), GGPIO_INDEX(17));
  219.     sleepGPIO(10);
  220.     
  221. GPIO_OUTPUT_ONE (GGPIO, GGPIO_GROUP(5), GGPIO_INDEX(17));
  222.     
  223. GPIO_OUTPUT_ENABLE (GGPIO, GGPIO_GROUP(5), GGPIO_INDEX(17));
  224. RETAILMSG(1,(TEXT(" DEMO reset end")));//add by mercury xu Mercury's 20080909
  225. //DEMO RESET
  226. }
  227. */
  228. ///////////////////////////////////////////////////////////////////////////
  229. //modify by mercury xu  Mercury's 20080401
  230. //this segment for define some useful little function.usually use in the program.
  231. //there are including some functions as following words
  232. //sdio_high()
  233. //sdio_low()
  234. //sclk_high()
  235. //sclk_low()
  236. //sdio_output_enable()
  237. //sdio_input_enable()
  238. //sdio_getdata()
  239. ///////////////////////////////////////////////////////////////////////////
  240. //update log
  241. //create by mercury xu  20070401
  242. ///////////////////////////////////////////////////////////////////////////
  243. void sleepGPIO(long usVal)
  244. {
  245.     DWORD StartLo, StartHi, TickCnt;
  246.     if (usVal != 0)
  247.     
  248.     {   
  249.     
  250.         // Calculate the match tick count first, automatically cut the overflow part of result.
  251.         TickCnt = usVal * TIMERTICK;
  252.         if (TickCnt == MAXDWORD)
  253.         {
  254.             DEBUGMSG(1, (TEXT("ERROR: usWait(usVal) input parameter usVal:0x%x too big!!!"), usVal));
  255.             return;
  256.         }
  257.         v_pOSTRegs->ostlatch = 1;
  258.         StartLo = v_pOSTRegs->ostlatchlo;
  259.         StartHi = v_pOSTRegs->ostlatchhi;
  260.         do 
  261.         {
  262.             v_pOSTRegs->ostlatch = 1;
  263.         }while ((v_pOSTRegs->ostlatchhi-StartHi)?((DWORD)(MAXDWORD-StartLo + v_pOSTRegs->ostlatchlo) < TickCnt):((DWORD)(v_pOSTRegs->ostlatchlo - StartLo) < TickCnt));
  264.     
  265.     }
  266.     //end if
  267. }
  268. ///////////////////////////////////////////////////////////////////////////
  269. void sdio_high()
  270. {
  271.     
  272.     GPIO_OUTPUT_ONE ();
  273.     
  274.     GPIO_OUTPUT_ENABLE ();    
  275.     
  276.     //modify by mercury for cnd620F 20080730 change the control to i2c
  277. }
  278. ///////////////////////////////////////////////////////////////////////////
  279. void sdio_low()
  280. {
  281.     
  282.     GPIO_OUTPUT_ZERO ();
  283.     
  284.     GPIO_OUTPUT_ENABLE ();
  285.     
  286.     //modify by mercury for cnd620F 20080730 change the control to i2c
  287. }
  288. ///////////////////////////////////////////////////////////////////////////
  289. void sclk_high()
  290. {
  291.     
  292.     GPIO_OUTPUT_ONE ();
  293.     
  294.     GPIO_OUTPUT_ENABLE ();
  295.     
  296.     //modify by mercury for cnd620F 20080730 change the control to i2c
  297. }
  298. ///////////////////////////////////////////////////////////////////////////
  299. void sclk_low()
  300. {
  301.     
  302.     GPIO_OUTPUT_ZERO ();
  303.     
  304.     GPIO_OUTPUT_ENABLE ();
  305.     
  306.     //modify by mercury for cnd620F 20080730 change the control to i2c
  307. }
  308. //////////////////////////////////////////////////////////////////////////
  309. void sdio_output_enable()
  310. {
  311.     
  312.     GPIO_OUTPUT_ENABLE (); 
  313.     
  314.     //modify by mercury for cnd620F 20080730 change the control to i2c
  315. }
  316. //////////////////////////////////////////////////////////////////////////
  317. void sdio_input_enable()
  318. {
  319.     
  320.     GPIO_OUTPUT_DISABLE(); 
  321.     
  322.     GPIO_INT_ENABLE(); 
  323.     
  324.     //modify by mercury for cnd620F 20080730 change the control to i2c   
  325. }
  326. //////////////////////////////////////////////////////////////////////////
  327. int sdio_getdata()
  328. {
  329.     
  330.     GPIO_OUTPUT_DISABLE ();
  331.     GPIO_INT_ENABLE();
  332.     
  333.     sleepGPIO(2000);
  334.     
  335.     return (GPIO_READ_INPUT ());
  336.     
  337.     //modify by mercury for cnd620F 20080730 change the control to i2c
  338. }
  339. //end segment
  340. //////////////////////////////////////////////////////////////////////////////////
  341. // si4730_reset
  342. // this function use to make sure the chip reset when we use it first.
  343. // step like follow descript:
  344. // sdio low->reset low->sclk high->delay->reset high->delay->sdio high->delay
  345. //////////////////////////////////////////////////////////////////////////////////
  346. //update log 
  347. //2008-03-29 add by mercury xu Mercury's for chip si4730 reset
  348. //////////////////////////////////////////////////////////////////////////////////
  349. void sdio_reset()
  350. {
  351.     sdio_low();
  352.     GPIO_OUTPUT_ZERO ();
  353.     GPIO_OUTPUT_ENABLE ();
  354.     
  355.     //modify by mercury for cnd620F 20080730 change the control to i2c
  356.     sclk_high();
  357.     
  358.     sleepGPIO(1000);
  359.     
  360.     GPIO_OUTPUT_ONE ();
  361.     
  362.     GPIO_OUTPUT_ENABLE ();
  363.     sleepGPIO(1000);
  364.     
  365.     sdio_high();
  366.     
  367.     sleepGPIO(1000);
  368. }
  369. //end segment
  370. ///////////////////////////////////////////////////////////////////////////////
  371. /////////////////////////////////////////////////////////////////////////////////////////////////
  372. //modify by mercury xu ,add a function for si4730,this function use to operation this chip
  373. //make sure the chip reset,and then,set a command power it up ,if this function can sent 
  374. //command to chip,there will be make out some noises just like radio couldn't get any 
  375. //programs,that means this chip can work.all the applcation use in the application .exe
  376. //Mercury's for car v600 2008-03-27 
  377. //this segment "as is" silicon lab's function.
  378. //Mercury's co,.ltd.
  379. /////////////////////////////////////////////////////////////////////////////////////////////////
  380. extern "C" unsigned char OperationDEMO(T_OPERA_MODE operation, unsigned char *data, unsigned char numBytes)
  381. {
  382. //define some variables for this function
  383. unsigned char controlword;
  384.     unsigned char j;
  385.     unsigned error;
  386.     int i;
  387.     int testNo;
  388.     int testNo1;
  389.     int returndata;
  390.     controlword = 0;
  391.     j = 0;
  392.     error = 0;
  393.     i = 0;
  394.     testNo = 0;
  395.        testNo1 = 0;
  396.     returndata = 0;
  397. //define variable end
  398. //function begin
  399. /***************************************************
  400. START: make sure here SDIO_DIR =OUT, SCLK = 1,  SDIO = 1
  401. ****************************************************/
  402.        
  403.     sdio_low();
  404.     sleepGPIO(500);
  405.     sclk_low();
  406.     sleepGPIO(500);
  407.     RETAILMSG(1,(TEXT("I2C START!/r/n ")));
  408. /***************************************************
  409. WRITE CONTROL DATA: make sure here: SLCK = 0; SDIO = 0
  410. ****************************************************/
  411.     if(operation == READ)
  412.     {
  413.         RETAILMSG(1,(TEXT("0x49 READ!/r/n ")));
  414.         controlword = 0x4A;
  415.         
  416.     }
  417.     else 
  418.     {
  419.         RETAILMSG(1,(TEXT("0x48 WRITE!/r/n ")));
  420.         controlword = 0x4B;
  421.         
  422.     }
  423.     RETAILMSG(3,(TEXT("Write IIC ADDR:  0x%x/r/n"),controlword));
  424.     for(i = 7; i>=0; i--)
  425.     {
  426.         if((controlword >> i) & 0x01)
  427.             
  428.             sdio_high();
  429.         else
  430.             sdio_low();
  431.     
  432.             sleepGPIO(500);
  433.         
  434.             sclk_high();
  435.         
  436.             sleepGPIO(500);
  437.         
  438.             sclk_low();
  439.         
  440.             sleepGPIO(500);
  441.     }
  442.     
  443. /***************************
  444. CHECK ACK for control word
  445. ***************************/
  446.      sdio_input_enable();
  447.     
  448.      sleepGPIO(500);
  449.      sclk_high();
  450.      sleepGPIO(500);
  451.     if(( returndata = sdio_getdata())!= 0)//READ_SDIO
  452.     {
  453.         error = 1;
  454.         
  455.         RETAILMSG(1,(TEXT("Write add ack error!/r/n ")));
  456.         
  457.         RETAILMSG(3,(TEXT("returndata:  %d/r/n"),returndata));
  458.           
  459.         goto STOP;
  460.     }
  461.     RETAILMSG(1,(TEXT("Write add ack OK!/r/n ")));
  462.     sclk_low();
  463.     sleepGPIO(500);
  464. /***************************************
  465. WRITE or READ data
  466. ****************************************/
  467. if(operation == READ)
  468.             RETAILMSG(3,(TEXT("read data show:  ")));
  469.     else
  470.         RETAILMSG(3,(TEXT("write data show:  ")));
  471.     
  472.     for(j = 0; j < numBytes; j++, data++)
  473.     {
  474.         if(operation == WRITE)
  475.             sdio_output_enable();
  476.         else
  477.             sdio_input_enable();
  478.         for(i = 7; i>=0; i--)
  479.         {
  480.             if(operation == WRITE)
  481.                 if((*data >> i) & 0x01)
  482.                     sdio_high();
  483.                 else
  484.                     sdio_low();
  485.                     sleepGPIO(50);
  486.                     sclk_high();
  487.                     sleepGPIO(50);
  488.               if(operation == READ)
  489.                 *data = ((*data << 1) | (sdio_getdata()));//READ_SDIO
  490.               sclk_low();
  491.               sleepGPIO(50);
  492.         }
  493.         
  494.             if(operation == READ)
  495.             RETAILMSG(3,(TEXT("  0x%x"),*data));
  496.         else
  497.             RETAILMSG(3,(TEXT("  0x%x"),*data));
  498.         //modify at 20080331
  499. /******************************
  500. CHECK ACK or SEND ACK=0
  501. *******************************/
  502.         if(operation == WRITE)
  503.             sdio_input_enable();
  504.         else
  505.         {
  506.             sdio_output_enable();
  507.             if(j == (numBytes - 1))
  508.                 sdio_high();
  509.             else
  510.                 sdio_high();
  511.         }
  512.         sleepGPIO(50);
  513.         sclk_high();
  514.         sleepGPIO(50);
  515.         if(operation == WRITE)
  516.             if((sdio_getdata())!= 0)//READ_SDIO
  517.             {
  518.                  RETAILMSG(1,(TEXT("  ACK ERROR,Quit!/r/n")));
  519.                 error = 1;
  520.                 goto STOP;
  521.             }
  522.             RETAILMSG(1,(TEXT("  ACK OK")));
  523.             sclk_low();
  524.             sleepGPIO(50);
  525.         }
  526.     
  527. /****************************
  528. STOP: make sure here: SCLK = 0
  529. *****************************/
  530.     STOP:
  531.     sdio_output_enable();
  532.     sdio_low();
  533.     sleepGPIO(50);
  534.     sclk_high();
  535.     sleepGPIO(50);
  536.     sdio_high();
  537.     return(error);
  538. //function end
  539. }
  540. ///////////////////////////////////////////////////////////////////////////////
  541. //------------------------------------------------------------------------------
  542. // @xref                          <nl>
  543. //          <f DEMO_Init>,         <nl>
  544. //          <f DEMO_Deinit>,       <nl>
  545. //          <f DEMO_Open>,         <nl>
  546. //          <f DEMO_Close>,        <nl>
  547. //          <f DEMO_Read>,         <nl>
  548. //          <f DEMO_Write>,        <nl>
  549. //          <f DEMO_Seek>,         <nl>
  550. //          <f DEMO_PowerUp>,      <nl>
  551. //          <f DEMO_PowerDown>,    <nl>
  552. //          <f DEMO_IOControl>     <nl>
  553. //
  554. // -----------------------------------------------------------------------------
  555. /////////////////////////////////////////////////////////////////////
  556. BOOL CALLBACK DllMain(HANDLE hDLL,
  557.                       DWORD dwReason,
  558.                       LPVOID lpvReserved)
  559. {
  560.     switch (dwReason) 
  561.     {
  562.     case DLL_PROCESS_ATTACH :
  563.         DEBUGREGISTER((HINSTANCE)hDLL);
  564.         DisableThreadLibraryCalls((HMODULE) hDLL);
  565.         break;
  566.     case DLL_PROCESS_DETACH :
  567.         break;
  568.     case DLL_THREAD_DETACH :
  569.         break;
  570.     case DLL_THREAD_ATTACH :
  571.         break;
  572.     default :
  573.         break;
  574.     }
  575.     //end switch
  576.     return TRUE;
  577. }
  578. extern "C" DWORD DEMO_Init(DWORD Index)
  579. {
  580.     RETAILMSG(1,(TEXT("DEMO_Init!/r/n ")));
  581.        //DEMO_reset();
  582.    
  583.        // initial_DEMO();
  584.        
  585.     return TRUE;
  586. }
  587. // -----------------------------------------------------------------------------
  588. //
  589. //  @doc    WDEV_EXT
  590. //
  591. //  @func   PVOID | DEMO_Deinit | Device deinitialization routine
  592. //
  593. //  @parm   DWORD | dwData | value returned from DEMO_Init call
  594. //
  595. //  @rdesc  Returns TRUE for success, FALSE for failure.
  596. //
  597. // -----------------------------------------------------------------------------
  598. extern "C" BOOL DEMO_Deinit(DWORD dwData)
  599. {
  600.     RETAILMSG(1,(TEXT("DEMO_DeInit!/r/n ")));
  601.     return TRUE;
  602. }
  603. // -----------------------------------------------------------------------------
  604. //
  605. //  @doc    WDEV_EXT
  606. //
  607. //  @func   PVOID | DEMO_Open    | Device open routine
  608. //
  609. //  @parm   DWORD | dwData      | Value returned from DEMO_Init call (ignored)
  610. //
  611. //  @parm   DWORD | dwAccess    | Requested access (combination of GENERIC_READ
  612. //                                and GENERIC_WRITE) (ignored)
  613. //
  614. //  @parm   DWORD | dwShareMode | Requested share mode (combination of
  615. //                                FILE_SHARE_READ and FILE_SHARE_WRITE) (ignored)
  616. //
  617. //  @rdesc  Returns a DWORD which will be passed to Read, Write, etc or NULL if
  618. //          unable to open device.
  619. //
  620. // -----------------------------------------------------------------------------
  621. extern "C" PDWORD DEMO_Open( DWORD dwData,
  622.                            DWORD dwAccess,
  623.                            DWORD dwShareMode)
  624. {
  625.     RETAILMSG(1,(TEXT("DEMO_OPEN /r/ndwData=%d;AccessCode=%d /r/n"),dwData, dwAccess));
  626.      initial_DEMO();
  627.    
  628.     return (PDWORD)TRUE;
  629.     //modify by mercury xu Mercury's 2008-04-04
  630. }
  631. // -----------------------------------------------------------------------------
  632. //
  633. //  @doc    WDEV_EXT
  634. //
  635. //  @func   BOOL | DEMO_Close | Device close routine
  636. //
  637. //  @parm   DWORD | dwOpenData | Value returned from DEMO_Open call
  638. //
  639. //  @rdesc  Returns TRUE for success, FALSE for failure
  640. //
  641. // -----------------------------------------------------------------------------
  642. extern "C" BOOL DEMO_Close(PDWORD pdwData)
  643. {
  644.     return(FALSE);
  645. }
  646. // -----------------------------------------------------------------------------
  647. //
  648. //  @doc    WDEV_EXT
  649. //
  650. //  @func   DWORD | DEMO_Read | Device read routine
  651. //
  652. //  @parm   DWORD | dwOpenData | Value returned from DEMO_Open call (ignored)
  653. //
  654. //  @parm   LPVOID | pBuf | Buffer to receive data (ignored)
  655. //
  656. //  @parm   DWORD | len | Maximum length to read (ignored)
  657. //
  658. //  @rdesc  Returns 0 always. DEMO_Read should never get called and does
  659. //          nothing. Required DEVICE.EXE function, but all data communication
  660. //          is handled by <f DEMO_IOControl>.
  661. //
  662. // -----------------------------------------------------------------------------
  663. extern "C" DWORD DEMO_Read(DWORD dwData,
  664.                           LPVOID pBuf,
  665.                           DWORD Len)
  666. {
  667.     return  (FALSE);
  668.     
  669. }
  670. // -----------------------------------------------------------------------------
  671. //
  672. //  @doc    WDEV_EXT
  673. //
  674. //  @func   DWORD | DEMO_Write | Device write routine
  675. //
  676. //  @parm   DWORD | dwOpenData | Value returned from DEMO_Open call (ignored)
  677. //
  678. //  @parm   LPCVOID | pBuf | Buffer containing data (ignored)
  679. //
  680. //  @parm   DWORD | len | Maximum length to write (ignored)
  681. //
  682. //  @rdesc  Returns 0 always. DEMO_Write should never get called and does
  683. //          nothing. Required DEVICE.EXE function, but all data communication
  684. //          is handled by <f DEMO_IOControl>.
  685. //
  686. // -----------------------------------------------------------------------------
  687. extern "C" DWORD DEMO_Write(DWORD dwData,
  688.                            LPCVOID pBuf,
  689.                            DWORD Len)
  690. {      
  691.     unsigned short temp;
  692.     temp = *(unsigned short *) pBuf;
  693.     RETAILMSG(1,(TEXT("DEMO_write!/r/n ")));
  694.     return(TRUE);
  695.     
  696. }
  697. // -----------------------------------------------------------------------------
  698. //
  699. //  @doc    WDEV_EXT
  700. //
  701. //  @func   DWORD | DEMO_Seek | Device seek routine
  702. //
  703. //  @parm   DWORD | dwOpenData | Value returned from DEMO_Open call (ignored)
  704. //
  705. //  @parm   long | pos | Position to seek to (relative to type) (ignored)
  706. //
  707. //  @parm   DWORD | type | FILE_BEGIN, FILE_CURRENT, or FILE_END (ignored)
  708. //
  709. //  @rdesc  Returns -1 always. DEMO_Seek should never get called and does
  710. //          nothing. Required DEVICE.EXE function, but all data communication
  711. //          is handled by <f DEMO_IOControl>.
  712. //
  713. // -----------------------------------------------------------------------------
  714. extern "C" DWORD DEMO_Seek(DWORD dwData,
  715.                           long pos,
  716.                           DWORD type)
  717. {
  718.     RETAILMSG(1,(TEXT("DEMO_Seek!/r/n ")));
  719.     return(TRUE);
  720.     //return((DWORD)DEMO_FM_Tune_DEMO());
  721. }
  722. // -----------------------------------------------------------------------------
  723. //
  724. //  @doc    WDEV_EXT
  725. //
  726. //  @func   void | DEMO_PowerUp | Device powerup routine
  727. //
  728. //  @comm   Called to restore device from suspend mode.  Cannot call any
  729. //          routines aside from those in the dll in this call.
  730. //
  731. // -----------------------------------------------------------------------------
  732. extern "C" VOID DEMO_PowerUp(VOID)
  733. {
  734.     //DEMO_reset();
  735.     RETAILMSG(1,(TEXT("DEMO_PowerUp!/r/n ")));
  736. //  sleepGPIO(800);
  737. }
  738. // -----------------------------------------------------------------------------
  739. //
  740. //  @doc    WDEV_EXT
  741. //
  742. //  @func   void | DEMO_PowerDown | Device powerdown routine
  743. //
  744. //  @comm   Called to suspend device.  Cannot call any routines aside from
  745. //          those in the dll in this call.
  746. //
  747. // -----------------------------------------------------------------------------
  748. extern "C" VOID DEMO_PowerDown(VOID)
  749. {
  750.     RETAILMSG(1,(TEXT("DEMO_PowerDown!/r/n ")));
  751. }
  752. // -----------------------------------------------------------------------------
  753. //
  754. //  @doc    WDEV_EXT
  755. //
  756. //  @func   BOOL | DEMO_IOControl | Device IO control routine
  757. //
  758. //  @parm   DWORD | dwOpenData | Value returned from DEMO_Open call
  759. //
  760. //  @parm   DWORD | dwCode |
  761. //          IO control code for the function to be performed. DEMO_IOControl only
  762. //          supports one IOCTL value (IOCTL_DEMO_MESSAGE)
  763. //
  764. //  @parm   PBYTE | pBufIn |
  765. //          Pointer to the input parameter structure (<t MMDRV_MESSAGE_PARAMS>).
  766. //
  767. //  @parm   DWORD | dwLenIn |
  768. //          Size in bytes of input parameter structure (sizeof(<t MMDRV_MESSAGE_PARAMS>)).
  769. //
  770. //  @parm   PBYTE | pBufOut | Pointer to the return value (DWORD).
  771. //
  772. //  @parm   DWORD | dwLenOut | Size of the return value variable (sizeof(DWORD)).
  773. //
  774. //  @parm   PDWORD | pdwActualOut | Unused
  775. //
  776. //  @rdesc  Returns TRUE for success, FALSE for failure
  777. //
  778. //  @xref   <t DEMOe Input Driver Messages> (WIDM_XXX) <nl>
  779. //          <t DEMOe Output Driver Messages> (WODM_XXX)
  780. //
  781. // -----------------------------------------------------------------------------
  782. extern "C"  BOOL DEMO_IOControl(PDWORD  pdwOpenData,
  783.                                DWORD  dwCode,
  784.                                PBYTE  pBufIn,
  785.                                DWORD  dwLenIn,
  786.                                PBYTE  pBufOut,
  787.                                DWORD  dwLenOut,
  788.                                PDWORD pdwActualOut)
  789. {
  790.     RETAILMSG(1,(TEXT("DEMO/r/n  pdwOpenData=%d;dwCode=%d/r/n"),pdwOpenData,dwCode));
  791.     
  792.     return(FALSE);
  793. }

以上部分为Cpp部分。


原创粉丝点击