⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eeprom.h

📁 linux得一些常用命令,以及linux环境下的c编程
💻 H
字号:
/* 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	0x08struct 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: %08x\n", 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: %08x\n", 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){}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -