eeprom.h
上传用户:szlgq88
上传日期:2009-04-28
资源大小:48287k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* credit winbond-840.c
  2.  */
  3. #include <asm/io.h>
  4. struct eeprom_ops {
  5. void (*set_cs)(void *ee);
  6. void (*clear_cs)(void *ee);
  7. };
  8. #define EEPOL_EEDI 0x01
  9. #define EEPOL_EEDO 0x02
  10. #define EEPOL_EECLK 0x04
  11. #define EEPOL_EESEL 0x08
  12. struct eeprom {
  13. void *dev;
  14. struct eeprom_ops *ops;
  15. void __iomem * addr;
  16. unsigned ee_addr_bits;
  17. unsigned eesel;
  18. unsigned eeclk;
  19. unsigned eedo;
  20. unsigned eedi;
  21. unsigned polarity;
  22. unsigned ee_state;
  23. spinlock_t *lock;
  24. u32 *cache;
  25. };
  26. u8   eeprom_readb(struct eeprom *ee, unsigned address);
  27. void eeprom_read(struct eeprom *ee, unsigned address, u8 *bytes,
  28. unsigned count);
  29. void eeprom_writeb(struct eeprom *ee, unsigned address, u8 data);
  30. void eeprom_write(struct eeprom *ee, unsigned address, u8 *bytes,
  31. unsigned count);
  32. /* The EEPROM commands include the alway-set leading bit. */
  33. enum EEPROM_Cmds {
  34.         EE_WriteCmd=(5 << 6), EE_ReadCmd=(6 << 6), EE_EraseCmd=(7 << 6),
  35. };
  36. void setup_ee_mem_bitbanger(struct eeprom *ee, void __iomem *memaddr, int eesel_bit, int eeclk_bit, int eedo_bit, int eedi_bit, unsigned polarity)
  37. {
  38. ee->addr = memaddr;
  39. ee->eesel = 1 << eesel_bit;
  40. ee->eeclk = 1 << eeclk_bit;
  41. ee->eedo = 1 << eedo_bit;
  42. ee->eedi = 1 << eedi_bit;
  43. ee->polarity = polarity;
  44. *ee->cache = readl(ee->addr);
  45. }
  46. /* foo. put this in a .c file */
  47. static inline void eeprom_update(struct eeprom *ee, u32 mask, int pol)
  48. {
  49. unsigned long flags;
  50. u32 data;
  51. spin_lock_irqsave(ee->lock, flags);
  52. data = *ee->cache;
  53. data &= ~mask;
  54. if (pol)
  55. data |= mask;
  56. *ee->cache = data;
  57. //printk("update: %08xn", data);
  58. writel(data, ee->addr);
  59. spin_unlock_irqrestore(ee->lock, flags);
  60. }
  61. void eeprom_clk_lo(struct eeprom *ee)
  62. {
  63. int pol = !!(ee->polarity & EEPOL_EECLK);
  64. eeprom_update(ee, ee->eeclk, pol);
  65. udelay(2);
  66. }
  67. void eeprom_clk_hi(struct eeprom *ee)
  68. {
  69. int pol = !!(ee->polarity & EEPOL_EECLK);
  70. eeprom_update(ee, ee->eeclk, !pol);
  71. udelay(2);
  72. }
  73. void eeprom_send_addr(struct eeprom *ee, unsigned address)
  74. {
  75. int pol = !!(ee->polarity & EEPOL_EEDI);
  76. unsigned i;
  77. address |= 6 << 6;
  78.         /* Shift the read command bits out. */
  79.         for (i=0; i<11; i++) {
  80. eeprom_update(ee, ee->eedi, ((address >> 10) & 1) ^ pol);
  81. address <<= 1;
  82. eeprom_clk_hi(ee);
  83. eeprom_clk_lo(ee);
  84.         }
  85. eeprom_update(ee, ee->eedi, pol);
  86. }
  87. u16   eeprom_readw(struct eeprom *ee, unsigned address)
  88. {
  89. unsigned i;
  90. u16 res = 0;
  91. eeprom_clk_lo(ee);
  92. eeprom_update(ee, ee->eesel, 1 ^ !!(ee->polarity & EEPOL_EESEL));
  93. eeprom_send_addr(ee, address);
  94. for (i=0; i<16; i++) {
  95. u32 data;
  96. eeprom_clk_hi(ee);
  97. res <<= 1;
  98. data = readl(ee->addr);
  99. //printk("eeprom_readw: %08xn", data);
  100. res |= !!(data & ee->eedo) ^ !!(ee->polarity & EEPOL_EEDO);
  101. eeprom_clk_lo(ee);
  102. }
  103. eeprom_update(ee, ee->eesel, 0 ^ !!(ee->polarity & EEPOL_EESEL));
  104. return res;
  105. }
  106. void eeprom_writeb(struct eeprom *ee, unsigned address, u8 data)
  107. {
  108. }