//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
以下給出頭文件的定義。
- #ifndef _SAA_H_
- #define _SAA_H_
- #define DELAY_CNT 50 //Delay 50 us
- #define SAA7113_WriteID 0x4A//0x48 //[SAA] Write address
- #define SAA7113_ReadID 0x4B//0x49 //[SAA] Read address
- #define TIMERTICK (v_pDriverGlobals->sysclk.dwSystemClock/(1000000*2)) //delay basic num
- #define NTSC 1 //set show type
- typedef enum OPERA_MODE {
- READ = 1,
- WRITE = 2
- } T_OPERA_MODE;
- unsigned int SAA7113Table[] = {
- 0x08,0x80,0x23,0x00,0x00,0xE9,0x0D,0x88,0x01,0x80,0x47,0x48,0x00,0x01,0x00,0x10,
- 0x1c,0xc8,0x11,0x00,0x00,0x82,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x54,0x07,
- 0x83,0x00
- };
- /*
- 0x08,0x80,0x23,0x00,0x00,0xE9,0x0D,0x88,0x01,0x80,0x47,0x48,0x00,0x01,0x00,0x10,
- 0x1c,0xc8,0x11,0x00,0x00,0x82,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x54,0x07,
- 0x83,0x00
- 0x08,0xC1,0x33,0x00,0x00,0xE9,0x0D,0xB8,0x01,0x80,0x47,0x40,0x00,0x01,0x2A,0x38,
- 0x00,0xf7,0x00,0x3E,0x00,0x00,0x02,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x07,
- 0x80,0x00
- //modify the second 0xc0 to 0xc1 20080920 Mercury Xu
- //modify the 0x11 -> 0x0c to 0x00 20080920 Mercury Xu
- //modify the 0x13 -> 0x01 to 0x00 20080920 Mercury Xu
- */
- unsigned int SAA7113Address[] = {
- 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,
- 0x11,0x12,0x13,0x15,0x16,0x17,0x40,0x41,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,
- 0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,
- 0x5B,0x5E
- };
- /*
- 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,
- 0x11,0x12,0x13,0x15,0x16 ,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,
- 0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,
- 0x5B,0x5E
- 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,
- 0x11,0x12,0x13,0x15,0x16,0x17,0x40,0x41,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,
- 0x4B,0x4C,0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,
- 0x5B,0x5E
- */
- // Copyright Mercury's CO.,LTD.2007-2008
- // Author : Mercury Xu
- // Descript: this file for SAA chip,it's a dll entry function
- // in this file include the SAA_XXX function for driver the chip
- // as a stream device.At the same time,in the bsp package we define
- // other function for make suer that this device can reset.use
- // Mercury's define function from gpio.h head file.
- //update log
- //create by : 2008-03-21 mercury xu
- //add by : 2008-04-03 mercury xu add define into the file change old file struct.
- //add by : 2008-04-04 mercury xu add some variables for ioctr function
- //modify by : 2008-07-30 mercury xu change it for SAA
- /
- //=============================================================================
- //Title : WrToSAA
- //Detail: Write Data To SAA
- //Input : addr data
- //Output: none
- //Author: Mercury Xu
- //Data : 2008-07-30
- //=============================================================================
- void WrToSAA7113(unsigned int addr,unsigned int data);
- //=============================================================================
- //Title : initial_SAA
- //Detail: initial SAA chip
- //Input : none
- //Output: none
- //Author: Mercury Xu
- //Data : 2008-07-30
- //=============================================================================
- void initial_SAA7113();
- //=============================================================================
- //Title : ReceiveAck
- //Detail: Receive Ack from SAA chip
- //Input : none
- //Output: int
- //Author: Mercury Xu
- //Data : 2008-07-30
- //=============================================================================
- int ReceiveAck();
- //=============================================================================
- //Title : StopBit
- //Detail: StopBit from SAA chip
- //Input : none
- //Output: none
- //Author: Mercury Xu
- //Data : 2008-07-30
- //=============================================================================
- void StopBit();
- //=============================================================================
- //Title : StartBit
- //Detail: StartBit from SAA chip
- //Input : none
- //Output: none
- //Author: Mercury Xu
- //Data : 2008-07-30
- //=============================================================================
- void StartBit();
- //=============================================================================
- //Title : WrData
- //Detail: WrData to SAA chip
- //Input : none
- //Output: none
- //Author: Mercury Xu
- //Data : 2008-07-30
- //=============================================================================
- void WrData(unsigned int data);
- //=============================================================================
- //Title : SAA_reset
- //Detail: SAA_reset to SAA chip
- //Input : none
- //Output: none
- //Author: Mercury Xu
- //Data : 2008-07-30
- //=============================================================================
- // void SAA_reset();
- ///
- //modify by mercury xu Mercury's 20080401
- //this segment for define some useful little function.usually use in the program.
- //there are including some functions as following words
- //sdio_high()
- //sdio_low()
- //sclk_high()
- //sclk_low()
- //sdio_output_enable()
- //sdio_input_enable()
- //sdio_getdata()
- ///
- //update log
- //create by mercury xu 20070401
- ///
- void sleepio(long usVal);
- ///
- void sdio_high();
- ///
- void sdio_low();
- ///
- void sclk_high();
- ///
- void sclk_low();
- //
- void sdio_output_enable();
- //
- void sdio_input_enable();
- //
- int sdio_getdata();
- //end segment
- ///
- void sdio_reset();
- extern "C" unsigned char OperationSAA7113(T_OPERA_MODE operation, unsigned int *data, unsigned int numBytes);
- /
- extern "C" BOOL CALLBACK DllMain(HANDLE hDLL,DWORD dwReason,LPVOID lpvReserved);
- //
- //------------------------------------------------------------------------------
- // @xref <nl>
- // <f SAA_Init>, <nl>
- // <f SAA_Deinit>, <nl>
- // <f SAA_Open>, <nl>
- // <f SAA_Close>, <nl>
- // <f SAA_Read>, <nl>
- // <f SAA_Write>, <nl>
- // <f SAA_Seek>, <nl>
- // <f SAA_PowerUp>, <nl>
- // <f SAA_PowerDown>, <nl>
- // <f SAA_IOControl> <nl>
- //
- // -----------------------------------------------------------------------------
- extern "C" DWORD SAA_Init(DWORD Index);
- // -----------------------------------------------------------------------------
- //
- // @doc WDEV_EXT
- //
- // @func PVOID | SAA_Deinit | Device deinitialization routine
- //
- // @parm DWORD | dwData | value returned from SAA_Init call
- //
- // @rdesc Returns TRUE for success, FALSE for failure.
- //
- // -----------------------------------------------------------------------------
- //extern "C" BOOL SAA_Deinit(DWORD dwData);
- // -----------------------------------------------------------------------------
- //
- // @doc WDEV_EXT
- //
- // @func PVOID | SAA_Open | Device open routine
- //
- // @parm DWORD | dwData | Value returned from SAA_Init call (ignored)
- //
- // @parm DWORD | dwAccess | Requested access (combination of GENERIC_READ
- // and GENERIC_WRITE) (ignored)
- //
- // @parm DWORD | dwShareMode | Requested share mode (combination of
- // FILE_SHARE_READ and FILE_SHARE_WRITE) (ignored)
- //
- // @rdesc Returns a DWORD which will be passed to Read, Write, etc or NULL if
- // unable to open device.
- //
- // -----------------------------------------------------------------------------
- extern "C" PDWORD SAA_Open( DWORD dwData,
- DWORD dwAccess,
- DWORD dwShareMode);
- // -----------------------------------------------------------------------------
- //
- // @doc WDEV_EXT
- //
- // @func BOOL | SAA_Close | Device close routine
- //
- // @parm DWORD | dwOpenData | Value returned from SAA_Open call
- //
- // @rdesc Returns TRUE for success, FALSE for failure
- //
- // -----------------------------------------------------------------------------
- //extern "C" BOOL SAA_Close(PDWORD pdwData);
- // -----------------------------------------------------------------------------
- //
- // @doc WDEV_EXT
- //
- // @func DWORD | SAA_Read | Device read routine
- //
- // @parm DWORD | dwOpenData | Value returned from SAA_Open call (ignored)
- //
- // @parm LPVOID | pBuf | Buffer to receive data (ignored)
- //
- // @parm DWORD | len | Maximum length to read (ignored)
- //
- // @rdesc Returns 0 always. SAA_Read should never get called and does
- // nothing. Required DEVICE.EXE function, but all data communication
- // is handled by <f SAA_IOControl>.
- //
- // -----------------------------------------------------------------------------
- extern "C" DWORD SAA_Read(DWORD dwData,
- LPVOID pBuf,
- DWORD Len);
- // -----------------------------------------------------------------------------
- //
- // @doc WDEV_EXT
- //
- // @func DWORD | SAA_Write | Device write routine
- //
- // @parm DWORD | dwOpenData | Value returned from SAA_Open call (ignored)
- //
- // @parm LPCVOID | pBuf | Buffer containing data (ignored)
- //
- // @parm DWORD | len | Maximum length to write (ignored)
- //
- // @rdesc Returns 0 always. SAA_Write should never get called and does
- // nothing. Required DEVICE.EXE function, but all data communication
- // is handled by <f SAA_IOControl>.
- //
- // -----------------------------------------------------------------------------
- extern "C" DWORD SAA_Write(DWORD dwData,
- LPCVOID pBuf,
- DWORD Len);
- // -----------------------------------------------------------------------------
- //
- // @doc WDEV_EXT
- //
- // @func DWORD | SAA_Seek | Device seek routine
- //
- // @parm DWORD | dwOpenData | Value returned from SAA_Open call (ignored)
- //
- // @parm long | pos | Position to seek to (relative to type) (ignored)
- //
- // @parm DWORD | type | FILE_BEGIN, FILE_CURRENT, or FILE_END (ignored)
- //
- // @rdesc Returns -1 always. SAA_Seek should never get called and does
- // nothing. Required DEVICE.EXE function, but all data communication
- // is handled by <f SAA_IOControl>.
- //
- // -----------------------------------------------------------------------------
- extern "C" DWORD SAA_Seek(DWORD dwData,
- long pos,
- DWORD type);
- // -----------------------------------------------------------------------------
- //
- // @doc WDEV_EXT
- //
- // @func void | SAA_PowerUp | Device powerup routine
- //
- // @comm Called to restore device from suspend mode. Cannot call any
- // routines aside from those in the dll in this call.
- //
- // -----------------------------------------------------------------------------
- extern "C" VOID SAA_PowerUp(VOID);
- // -----------------------------------------------------------------------------
- //
- // @doc WDEV_EXT
- //
- // @func void | SAA_PowerDown | Device powerdown routine
- //
- // @comm Called to suspend device. Cannot call any routines aside from
- // those in the dll in this call.
- //
- // -----------------------------------------------------------------------------
- //extern "C" VOID SAA_PowerDown(VOID);
- // -----------------------------------------------------------------------------
- //
- // @doc WDEV_EXT
- //
- // @func BOOL | SAA_IOControl | Device IO control routine
- //
- // @parm DWORD | dwOpenData | Value returned from SAA_Open call
- //
- // @parm DWORD | dwCode |
- // IO control code for the function to be performed. SAA_IOControl only
- // supports one IOCTL value (IOCTL_SAA_MESSAGE)
- //
- // @parm PBYTE | pBufIn |
- // Pointer to the input parameter structure (<t MMDRV_MESSAGE_PARAMS>).
- //
- // @parm DWORD | dwLenIn |
- // Size in bytes of input parameter structure (sizeof(<t MMDRV_MESSAGE_PARAMS>)).
- //
- // @parm PBYTE | pBufOut | Pointer to the return value (DWORD).
- //
- // @parm DWORD | dwLenOut | Size of the return value variable (sizeof(DWORD)).
- //
- // @parm PDWORD | pdwActualOut | Unused
- //
- // @rdesc Returns TRUE for success, FALSE for failure
- //
- // @xref <t SAAe Input Driver Messages> (WIDM_XXX) <nl>
- // <t SAAe Output Driver Messages> (WODM_XXX)
- //
- // -----------------------------------------------------------------------------
- extern "C" BOOL SAA_IOControl(PDWORD pdwOpenData,
- DWORD dwCode,
- PBYTE pBufIn,
- DWORD dwLenIn,
- PBYTE pBufOut,
- DWORD dwLenOut,
- PDWORD pdwActualOut);
- #endif