关于wince下SAA7113/Salin8113控制的参考代码

////////////////////////////////////////////////////////////////////////////////////////////
//Date:2008-09-28
//Author:Mercury Xu
//Descrption:saa7113/Salin8113驅動程式編寫注意事項
////////////////////////////////////////////////////////////////////////////////////////////
對于這次調試saa7113/Salin8113程式,主要出錯的地方是寫寄存器地址的時候字符型和整型是需要注意的重點。
關于I2C的操作已經是很成熟的。可以不用考慮錯誤的原因。
重點注意的是saa7113/Salin8113寄存器賦值需要用到整型賦值,用字符型的saa7113/Salin8113無法識別
具體實現代碼如下。代碼基于WINCE開發。I2C部分請參考我的上一篇文章
http://blog.csdn.net/xumercury/archive/2008/09/20/2954449.aspx
以下給出頭文件的定義。

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

你可能感兴趣的:(c,Opera,File,input,WinCE,output)