www.pudn.com > H265+_C64X_2008.8.rar > evmdm642_eeprom.c
/* * Copyright 2003 by Spectrum Digital Incorporated. * All rights reserved. Property of Spectrum Digital Incorporated. */ /* * ======== evmdm642_eeprom.c ======== * I2C EEPROM module implementation for DM642 EVM */ #include#include #include #include #include static I2C_Config eepromRcvCfg = { 0x0000007f, /* I2COAR - Not used if master */ 0x00000000, /* I2CIER - Disable interrupts, use polling */ 0x0000001b, /* I2CCLKL - Low period for 100KHz operation */ 0x0000001b, /* I2CCLKH - High period for 100KHz operation */ 0x00000002, /* I2CCNT - Data words per transmission */ 0x00000050, /* I2CSAR - Slave address */ 0x000044a0, /* I2CMDR - Mode */ 0x00000019 /* I2CPSC - Prescale 300MHz to 12MHz */ }; static I2C_Config eepromXmtCfg = { 0x0000007f, /* I2COAR - Not used if master */ 0x00000000, /* I2CIER - Disable interrupts, use polling */ 0x0000001b, /* I2CCLKL - Low period for 100KHz operation */ 0x0000001b, /* I2CCLKH - High period for 100KHz operation */ 0x00000002, /* I2CCNT - Data words per transmission */ 0x00000050, /* I2CSAR - Slave address */ 0x000046a0, /* I2CMDR - Mode */ 0x00000019 /* I2CPSC - Prescale 300MHz to 12MHz */ }; /* * ======== EVMDM642_eeprom_read ======== * Read data from an I2C EEPROM */ void EVMDM642_EEPROM_read(Uint32 src, Uint32 dst, Uint32 length) { Uint8 *pdst; Uint32 i; I2C_Config prevI2CCfg; /* Establish destination pointer */ pdst = (Uint8 *)dst; /* Wait until bus is free */ while (I2C_bb(EVMDM642_I2C_hI2C)); /* Save old settings */ I2C_getConfig(EVMDM642_I2C_hI2C, &prevI2CCfg); /* Set address using dummy write */ EVMDM642_EEPROM_write(0, src, 0); /* Configure for receive */ I2C_config(EVMDM642_I2C_hI2C, &eepromRcvCfg); EVMDM642_waitusec(1); /* Generate start condition */ I2C_start(EVMDM642_I2C_hI2C); /* Receive the data */ for (i = 0; i < length; i++) { while(!I2C_rrdy(EVMDM642_I2C_hI2C)); *pdst++ = I2C_readByte(EVMDM642_I2C_hI2C); } /* Generate stop condition */ I2C_sendStop(EVMDM642_I2C_hI2C); /* Need to wait at least 10ms */ EVMDM642_waitusec(10000); /* Wait until bus is free */ while (I2C_bb(EVMDM642_I2C_hI2C)); /* Reconfigure I2C with old settings */ I2C_config(EVMDM642_I2C_hI2C, &prevI2CCfg); } /* * ======== EVMDM642_eeprom_write ======== * Write data to an I2C EEPROM */ void EVMDM642_EEPROM_write(Uint32 src, Uint32 dst, Uint32 length) { Uint8 *psrc; Uint32 i; I2C_Config prevI2CCfg; /* Establish source pointer */ psrc = (Uint8 *)src; /* Wait until bus is free */ while (I2C_bb(EVMDM642_I2C_hI2C)); /* Clear bus busy */ I2C_FSETH(EVMDM642_I2C_hI2C, I2CSTR, BB, 1); /* Save old settings */ I2C_getConfig(EVMDM642_I2C_hI2C, &prevI2CCfg); /* Configure for transmit */ I2C_config(EVMDM642_I2C_hI2C, &eepromXmtCfg); EVMDM642_waitusec(1); /* Submit the high address byte */ I2C_writeByte(EVMDM642_I2C_hI2C, (dst & 0xff00) >> 8); /* Generate start condition */ I2C_start(EVMDM642_I2C_hI2C); while(!I2C_xrdy(EVMDM642_I2C_hI2C)); /* Submit the low address byte */ I2C_writeByte(EVMDM642_I2C_hI2C, dst & 0xff); while(!I2C_xrdy(EVMDM642_I2C_hI2C)); /* Transmit the data */ for (i = 0; i < length; i++) { I2C_writeByte(EVMDM642_I2C_hI2C, *psrc++); while(!I2C_xrdy(EVMDM642_I2C_hI2C)); } /* Generate stop condition */ I2C_sendStop(EVMDM642_I2C_hI2C); /* Need to wait at least 10ms */ EVMDM642_waitusec(10000); /* Wait until bus is free */ while (I2C_bb(EVMDM642_I2C_hI2C)); /* Reconfigure I2C with old settings */ I2C_config(EVMDM642_I2C_hI2C, &prevI2CCfg); }