📄 i557_eep.c
字号:
/* Wait CS setup time */
eeprom_delay (SELECT_SETUP_TIME);
/* Send start/write enable command */
if (((status = eeprom_send_start (pci_base, EEPROM_EWEN)) != OK) ||
/* Send address */
((status = eeprom_send_addr (pci_base, EEPROM_EWEN_OP)) != OK))
return (status);
/* De-Select the serial EEPROM */
DESELECT_557_EEP(pci_base);
/* wait the required de-select time between commands */
eeprom_delay (DESELECT_TIME);
return (OK);
}
/*-------------------------------------------------------------
* Function: int eeprom_write_disable ()
*
* Action: Disable writes to the eeprom
*
* Returns: OK if command sent, EEPROM_NOT_RESPONDING if not.
*
*-------------------------------------------------------------*/
int eeprom_write_disable (unsigned long pci_base)
{
int status; /* result code */
/* Select the serial EEPROM */
SELECT_557_EEP(pci_base);
/* Wait CS setup time */
eeprom_delay (SELECT_SETUP_TIME);
/* Send start/write enable command */
if (((status = eeprom_send_start (pci_base, EEPROM_EWDS)) != OK) ||
/* Send address */
((status = eeprom_send_addr (pci_base, EEPROM_EWDS_OP)) != OK))
return (status);
/* De-Select the serial EEPROM */
DESELECT_557_EEP(pci_base);
/* wait the required de-select time between commands */
eeprom_delay (DESELECT_TIME);
return (OK);
}
/******************************************************************************
*
* eeprom_delay - delay for a specified number of nanoseconds
*
* Note: this routine is a generous approximation as delays for eeproms
* are specified as minimums.
*/
void eeprom_delay (int nsec)
{
extern void polled_delay (int usec);
/* generously delay 1 usec. for each nsec. */
polled_delay (nsec);
}
/******************************************************************************
*
* eeprom_send_start - send a start bit with a read opcode to the '557 serial
* eeprom
*
*/
static int eeprom_send_start (unsigned long pci_base, int command)
{
int op_code[2];
switch (command)
{
case EEPROM_WRITE:
op_code[0] = LOW;
op_code[1] = HIGH;
break;
case EEPROM_READ:
op_code[0] = HIGH;
op_code[1] = LOW;
break;
case EEPROM_ERASE:
op_code[0] = HIGH;
op_code[1] = HIGH;
break;
case EEPROM_EWEN:
case EEPROM_EWDS:
op_code[0] = LOW;
op_code[1] = LOW;
break;
default:
return(EEPROM_INVALID_CMD);
}
set_scl_line (pci_base, LOW);
set_sda_line (pci_base, HIGH); /* start bit */
eeprom_delay (DATA_IN_SETUP_TIME);
set_scl_line (pci_base, HIGH); /* clock high */
eeprom_delay (SK_HIGH_PERIOD);
set_scl_line (pci_base, LOW); /* clock low */
eeprom_delay (SK_LOW_PERIOD);
/* send the opcode */
set_sda_line (pci_base, op_code[0]); /* MSB of opcode */
eeprom_delay (DATA_IN_SETUP_TIME);
set_scl_line (pci_base, HIGH); /* clock high */
eeprom_delay (SK_HIGH_PERIOD);
set_scl_line (pci_base, LOW); /* clock low */
eeprom_delay (SK_LOW_PERIOD);
set_sda_line (pci_base, op_code[1]); /* LSB of opcode */
eeprom_delay (DATA_IN_SETUP_TIME);
set_scl_line (pci_base, HIGH); /* clock high */
eeprom_delay (SK_HIGH_PERIOD);
set_scl_line (pci_base, LOW); /* clock low */
eeprom_delay (SK_LOW_PERIOD);
return (OK);
}
/******************************************************************************
*
* eeprom_send_addr - send the read address to the '557 serial eeprom
*
*/
static int eeprom_send_addr (unsigned long pci_base,
unsigned char eeprom_addr)
{
register int i;
/* Do each address bit, MSB => LSB - after each address bit is
sent, read the EEDO bit on the '557 to check for the "dummy 0 bit"
which when set to 0, indicates that the address field is complete */
for (i = 5; i >= 0; i--)
{
/* If this bit is a 1, set SDA high. If 0, set it low */
if (eeprom_addr & (1 << i))
set_sda_line (pci_base, HIGH);
else
set_sda_line (pci_base, LOW);
eeprom_delay (DATA_IN_SETUP_TIME); /* Data setup before raising clock */
set_scl_line (pci_base, HIGH); /* Clock in this data bit */
eeprom_delay (SK_HIGH_PERIOD);
set_scl_line (pci_base, LOW); /* Prepare for next bit */
eeprom_delay (SK_LOW_PERIOD);
/* check to see if "dummy 0 bit" is set to 0 indicating address
complete */
if (get_sda_line (pci_base) == LOW)
break; /* address complete */
}
return (OK);
}
/******************************************************************************
*
* eeprom_get_word - read a 16 bit word from the '557 serial eeprom
*
* Note: this routine assumes that the start/opcode/address have already
* been set up
*/
static int eeprom_get_word (unsigned long pci_base,
unsigned short *word_addr)
{
register int i;
/* Do each data bit, MSB => LSB */
for (i = 15; i >= 0; i--)
{
set_scl_line (pci_base, HIGH);
eeprom_delay (SK_HIGH_PERIOD);
if (get_sda_line (pci_base) == HIGH)
*word_addr |= (1 << i); /* store bit as a '1' */
else
*word_addr &= ~(1 << i); /* store bit as a '0' */
set_scl_line (pci_base, LOW);
eeprom_delay (SK_LOW_PERIOD);
}
return (OK);
}
/******************************************************************************
*
* eeprom_put_word - write a 16 bit word to the '557 serial eeprom
*
* Note: this routine assumes that the start/opcode/address have already
* been set up
*/
static int eeprom_put_word (unsigned long pci_base,
unsigned short data)
{
register int i;
/* Do each data bit, MSB => LSB */
for (i = 15; i >= 0; i--)
{
if (data & (1 << i))
set_sda_line(pci_base, HIGH);
else
set_sda_line(pci_base, LOW);
eeprom_delay (DATA_IN_SETUP_TIME);
set_scl_line (pci_base, HIGH);
eeprom_delay (SK_HIGH_PERIOD);
set_scl_line (pci_base, LOW);
eeprom_delay (SK_LOW_PERIOD);
}
return (OK);
}
/*-------------------------------------------------------------
* Function: void set_scl_line ()
*
* Action: Sets the value of the eeprom's serial clock line
* to the value HIGH or LOW.
*
* Returns: N/A.
*-------------------------------------------------------------*/
static void set_scl_line (unsigned long pci_base, /* PCI address */
int state) /* HIGH or LOW */
{
if (state == HIGH)
SK_HIGH_557_EEP (pci_base);
else if (state == LOW)
SK_LOW_557_EEP (pci_base);
}
/*-------------------------------------------------------------
* Function: void set_sda_line ()
*
* Action: Sets the value of the eeprom's serial data line
* to the value HIGH or LOW.
*
* Returns: N/A.
*-------------------------------------------------------------*/
static void set_sda_line (unsigned long pci_base, /* PCI address */
int state) /* HIGH or LOW */
{
if (state == HIGH)
EEDI_HIGH_557_EEP (pci_base);
else if (state == LOW)
EEDI_LOW_557_EEP (pci_base);
}
/*-------------------------------------------------------------
* Function: int get_sda_line ()
*
* Action: Returns the value of the eeprom's serial data line
*
* Returns: HIGH or LOW.
*-------------------------------------------------------------*/
static int get_sda_line (unsigned long pci_base) /* PCI address */
{
int ret_val; /* result code */
if (EEDO_557_EEP (pci_base))
ret_val = HIGH;
else
ret_val = LOW;
return (ret_val);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -