eeprom.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
- /* credit winbond-840.c
- */
- #include <asm/io.h>
- struct eeprom_ops {
- void (*set_cs)(void *ee);
- void (*clear_cs)(void *ee);
- };
- #define EEPOL_EEDI 0x01
- #define EEPOL_EEDO 0x02
- #define EEPOL_EECLK 0x04
- #define EEPOL_EESEL 0x08
- struct eeprom {
- void *dev;
- struct eeprom_ops *ops;
- long addr;
- unsigned ee_addr_bits;
- unsigned eesel;
- unsigned eeclk;
- unsigned eedo;
- unsigned eedi;
- unsigned polarity;
- unsigned ee_state;
- spinlock_t *lock;
- u32 *cache;
- };
- u8 eeprom_readb(struct eeprom *ee, unsigned address);
- void eeprom_read(struct eeprom *ee, unsigned address, u8 *bytes,
- unsigned count);
- void eeprom_writeb(struct eeprom *ee, unsigned address, u8 data);
- void eeprom_write(struct eeprom *ee, unsigned address, u8 *bytes,
- unsigned count);
- /* The EEPROM commands include the alway-set leading bit. */
- enum EEPROM_Cmds {
- EE_WriteCmd=(5 << 6), EE_ReadCmd=(6 << 6), EE_EraseCmd=(7 << 6),
- };
- void setup_ee_mem_bitbanger(struct eeprom *ee, long memaddr, int eesel_bit, int eeclk_bit, int eedo_bit, int eedi_bit, unsigned polarity)
- {
- ee->addr = memaddr;
- ee->eesel = 1 << eesel_bit;
- ee->eeclk = 1 << eeclk_bit;
- ee->eedo = 1 << eedo_bit;
- ee->eedi = 1 << eedi_bit;
- ee->polarity = polarity;
- *ee->cache = readl(ee->addr);
- }
- /* foo. put this in a .c file */
- static inline void eeprom_update(struct eeprom *ee, u32 mask, int pol)
- {
- long flags;
- u32 data;
- spin_lock_irqsave(ee->lock, flags);
- data = *ee->cache;
- data &= ~mask;
- if (pol)
- data |= mask;
- *ee->cache = data;
- //printk("update: %08xn", data);
- writel(data, ee->addr);
- spin_unlock_irqrestore(ee->lock, flags);
- }
- void eeprom_clk_lo(struct eeprom *ee)
- {
- int pol = !!(ee->polarity & EEPOL_EECLK);
- eeprom_update(ee, ee->eeclk, pol);
- udelay(2);
- }
- void eeprom_clk_hi(struct eeprom *ee)
- {
- int pol = !!(ee->polarity & EEPOL_EECLK);
- eeprom_update(ee, ee->eeclk, !pol);
- udelay(2);
- }
- void eeprom_send_addr(struct eeprom *ee, unsigned address)
- {
- int pol = !!(ee->polarity & EEPOL_EEDI);
- unsigned i;
- address |= 6 << 6;
- /* Shift the read command bits out. */
- for (i=0; i<11; i++) {
- eeprom_update(ee, ee->eedi, ((address >> 10) & 1) ^ pol);
- address <<= 1;
- eeprom_clk_hi(ee);
- eeprom_clk_lo(ee);
- }
- eeprom_update(ee, ee->eedi, pol);
- }
- u16 eeprom_readw(struct eeprom *ee, unsigned address)
- {
- unsigned i;
- u16 res = 0;
- eeprom_clk_lo(ee);
- eeprom_update(ee, ee->eesel, 1 ^ !!(ee->polarity & EEPOL_EESEL));
- eeprom_send_addr(ee, address);
- for (i=0; i<16; i++) {
- u32 data;
- eeprom_clk_hi(ee);
- res <<= 1;
- data = readl(ee->addr);
- //printk("eeprom_readw: %08xn", data);
- res |= !!(data & ee->eedo) ^ !!(ee->polarity & EEPOL_EEDO);
- eeprom_clk_lo(ee);
- }
- eeprom_update(ee, ee->eesel, 0 ^ !!(ee->polarity & EEPOL_EESEL));
- return res;
- }
- void eeprom_writeb(struct eeprom *ee, unsigned address, u8 data)
- {
- }