dm9000x.c.maceeprom

来自「一个嵌入linux下s3c2410通过i2c读写eerom的驱动程序和应用程序。」· MACEEPROM 代码 · 共 1,550 行 · 第 1/4 页

MACEEPROM
1,550
字号
   0x14015C4FL, 0x63066CD9L, 0xFA0F3D63L, 0x8D080DF5L,   0x3B6E20C8L, 0x4C69105EL, 0xD56041E4L, 0xA2677172L,   0x3C03E4D1L, 0x4B04D447L, 0xD20D85FDL, 0xA50AB56BL,   0x35B5A8FAL, 0x42B2986CL, 0xDBBBC9D6L, 0xACBCF940L,   0x32D86CE3L, 0x45DF5C75L, 0xDCD60DCFL, 0xABD13D59L,   0x26D930ACL, 0x51DE003AL, 0xC8D75180L, 0xBFD06116L,   0x21B4F4B5L, 0x56B3C423L, 0xCFBA9599L, 0xB8BDA50FL,   0x2802B89EL, 0x5F058808L, 0xC60CD9B2L, 0xB10BE924L,   0x2F6F7C87L, 0x58684C11L, 0xC1611DABL, 0xB6662D3DL,   0x76DC4190L, 0x01DB7106L, 0x98D220BCL, 0xEFD5102AL,   0x71B18589L, 0x06B6B51FL, 0x9FBFE4A5L, 0xE8B8D433L,   0x7807C9A2L, 0x0F00F934L, 0x9609A88EL, 0xE10E9818L,   0x7F6A0DBBL, 0x086D3D2DL, 0x91646C97L, 0xE6635C01L,   0x6B6B51F4L, 0x1C6C6162L, 0x856530D8L, 0xF262004EL,   0x6C0695EDL, 0x1B01A57BL, 0x8208F4C1L, 0xF50FC457L,   0x65B0D9C6L, 0x12B7E950L, 0x8BBEB8EAL, 0xFCB9887CL,   0x62DD1DDFL, 0x15DA2D49L, 0x8CD37CF3L, 0xFBD44C65L,   0x4DB26158L, 0x3AB551CEL, 0xA3BC0074L, 0xD4BB30E2L,   0x4ADFA541L, 0x3DD895D7L, 0xA4D1C46DL, 0xD3D6F4FBL,   0x4369E96AL, 0x346ED9FCL, 0xAD678846L, 0xDA60B8D0L,   0x44042D73L, 0x33031DE5L, 0xAA0A4C5FL, 0xDD0D7CC9L,   0x5005713CL, 0x270241AAL, 0xBE0B1010L, 0xC90C2086L,   0x5768B525L, 0x206F85B3L, 0xB966D409L, 0xCE61E49FL,   0x5EDEF90EL, 0x29D9C998L, 0xB0D09822L, 0xC7D7A8B4L,   0x59B33D17L, 0x2EB40D81L, 0xB7BD5C3BL, 0xC0BA6CADL,   0xEDB88320L, 0x9ABFB3B6L, 0x03B6E20CL, 0x74B1D29AL,   0xEAD54739L, 0x9DD277AFL, 0x04DB2615L, 0x73DC1683L,   0xE3630B12L, 0x94643B84L, 0x0D6D6A3EL, 0x7A6A5AA8L,   0xE40ECF0BL, 0x9309FF9DL, 0x0A00AE27L, 0x7D079EB1L,   0xF00F9344L, 0x8708A3D2L, 0x1E01F268L, 0x6906C2FEL,   0xF762575DL, 0x806567CBL, 0x196C3671L, 0x6E6B06E7L,   0xFED41B76L, 0x89D32BE0L, 0x10DA7A5AL, 0x67DD4ACCL,   0xF9B9DF6FL, 0x8EBEEFF9L, 0x17B7BE43L, 0x60B08ED5L,   0xD6D6A3E8L, 0xA1D1937EL, 0x38D8C2C4L, 0x4FDFF252L,   0xD1BB67F1L, 0xA6BC5767L, 0x3FB506DDL, 0x48B2364BL,   0xD80D2BDAL, 0xAF0A1B4CL, 0x36034AF6L, 0x41047A60L,   0xDF60EFC3L, 0xA867DF55L, 0x316E8EEFL, 0x4669BE79L,   0xCB61B38CL, 0xBC66831AL, 0x256FD2A0L, 0x5268E236L,   0xCC0C7795L, 0xBB0B4703L, 0x220216B9L, 0x5505262FL,   0xC5BA3BBEL, 0xB2BD0B28L, 0x2BB45A92L, 0x5CB36A04L,   0xC2D7FFA7L, 0xB5D0CF31L, 0x2CD99E8BL, 0x5BDEAE1DL,   0x9B64C2B0L, 0xEC63F226L, 0x756AA39CL, 0x026D930AL,   0x9C0906A9L, 0xEB0E363FL, 0x72076785L, 0x05005713L,   0x95BF4A82L, 0xE2B87A14L, 0x7BB12BAEL, 0x0CB61B38L,   0x92D28E9BL, 0xE5D5BE0DL, 0x7CDCEFB7L, 0x0BDBDF21L,   0x86D3D2D4L, 0xF1D4E242L, 0x68DDB3F8L, 0x1FDA836EL,   0x81BE16CDL, 0xF6B9265BL, 0x6FB077E1L, 0x18B74777L,   0x88085AE6L, 0xFF0F6A70L, 0x66063BCAL, 0x11010B5CL,   0x8F659EFFL, 0xF862AE69L, 0x616BFFD3L, 0x166CCF45L,   0xA00AE278L, 0xD70DD2EEL, 0x4E048354L, 0x3903B3C2L,   0xA7672661L, 0xD06016F7L, 0x4969474DL, 0x3E6E77DBL,   0xAED16A4AL, 0xD9D65ADCL, 0x40DF0B66L, 0x37D83BF0L,   0xA9BCAE53L, 0xDEBB9EC5L, 0x47B2CF7FL, 0x30B5FFE9L,   0xBDBDF21CL, 0xCABAC28AL, 0x53B39330L, 0x24B4A3A6L,   0xBAD03605L, 0xCDD70693L, 0x54DE5729L, 0x23D967BFL,   0xB3667A2EL, 0xC4614AB8L, 0x5D681B02L, 0x2A6F2B94L,   0xB40BBE37L, 0xC30C8EA1L, 0x5A05DF1BL, 0x2D02EF8DL};/* function declaration ------------------------------------- */int dmfe_probe(struct DEVICE *);static int dmfe_open(struct DEVICE *);static int dmfe_start_xmit(struct sk_buff *, struct DEVICE *);static int dmfe_stop(struct DEVICE *);//static struct enet_statistics * dmfe_get_stats(struct DEVICE *); make by simon 2001.9.4 for kernel 2.4static struct net_device_stats * dmfe_get_stats(struct DEVICE *); // add by simon 2001.94 for kernel 2.4static int dmfe_do_ioctl(struct DEVICE *, struct ifreq *, int);static void dmfe_interrupt(int , void *, struct pt_regs *);static void dmfe_timer(unsigned long);static void dmfe_init_dm9000(struct DEVICE *);static unsigned long cal_CRC(unsigned char *, unsigned int, u8);static u8 ior(board_info_t *, int);static void iow(board_info_t *, int, u8);static u16 phy_read(board_info_t *, int);static void phy_write(board_info_t *, int, u16);static u16 read_srom_word(board_info_t *, int);static void dmfe_packet_receive(struct DEVICE *, board_info_t *);static void dm9000_hash_table(struct DEVICE *);/* DM9000 network baord routine ---------------------------- *//*#define ADDR(addr) for swap upper and low eight bit*///#define DATA(a) ( ( (a&0xff00)>>8 ) | ( (a&0x00ff)<<8 ) )#define DATA(a) (a) //Don't swap Because s3c2410 use little endian//#define DATA(a) (a)//#define DELAY   udelay(1000000)#define SWAP_HARDWARE//inline void outw(unsigned short value, unsigned long addr)inline void outw(unsigned short value, unsigned long addr){#ifndef SWAP_HARDWARE        unsigned char a,b=0;	unsigned short c=DATA(value);        int i,j=7,k=1,m=128;	a=c & 0x00ff;        for(i=1;i<=4;i++)        {                b=b|((a&k)<<j) | ((a&m)>>j);                k*=2;                m/=2;                j--;                j--;        }        *(volatile unsigned short *)(addr)=b|(c&0xff00) ;/*((unsigned short)b)<<8;*/#else	*(volatile unsigned short*)addr =  DATA(value);#endif	}//inline void outb(unsigned char value, unsigned long addr)inline void outb(unsigned char value, unsigned long addr){#ifndef SWAP_HARDWARE        unsigned char a=value,b=0;        int i,j=7,k=1,m=128;        for(i=1;i<=4;i++)        {                b=b|((a&k)<<j) | ((a&m)>>j);                k*=2;                m/=2;                j--;                j--;        }        *(volatile unsigned short *)(addr)=/*DATA((*/b /*) & 0x00ff)*/;/*((unsigned short)b)<<8;*/#else	*(volatile unsigned short*)addr = (value & 0x00ff);#endif	}inline unsigned char inb(unsigned long addr){#ifndef SWAP_HARDWARE        unsigned char b=0,a=(*(volatile unsigned short *)(addr)) &0x00ff;        int i,j=7,k=1,m=128;        for(i=1;i<=4;i++)        {                b=b|((a&k)<<j) | ((a&m)>>j);                k*=2;                m/=2;                j--;                j--;        }        return b;#else//	return (((*(volatile unsigned short *)(p))) &0x00ff);						unsigned short val;	val = *(volatile unsigned short*)addr;	return (unsigned char)( val & 0x00ff );		#endif	}inline unsigned short inw(unsigned long addr){#ifndef SWAP_HARDWARE        unsigned char b=0,a;	unsigned short c=DATA((*(volatile unsigned short *)(addr)));        int i,j=7,k=1,m=128;	a=c & 0x00ff;        for(i=1;i<=4;i++)        {                b=b|((a&k)<<j) | ((a&m)>>j);                k*=2;                m/=2;                j--;                j--;        }        return b|(c&0xff00);#else	unsigned short val;		val = *(volatile unsigned short*)addr; 	return (DATA(val));#endif	}/*  Search DM9000 board, allocate space and register it*/static unsigned char eth1_mac_addr[6] = {0x00, 0x13, 0xf6, 0x6c, 0x87, 0x89};static unsigned char eth2_mac_addr[6] = {0x00, 0x13, 0xf6, 0x6c, 0x87, 0x90};static unsigned char eth3_mac_addr[6] = {0x00, 0x13, 0xf6, 0x6c, 0x87, 0x91};//HHTECH dm9000x.c for driver kernel/driver/net/int __init dmfe_probe(struct DEVICE *dev){	        ////////////////////////////////////////	//i2c_data add by zy	//U32 rd_adr=0x20;	//unsigned int rd_num=0x06;	//unsigned char * get_data;	unsigned char buff[12];	int j;	static char sEthernet[5];	struct board_info *db;    /* Point a board information structure */	u32 id_val;	u32 iobase; // = DM9000_MIN_IO;	u16 i, dm9000_count = 0;	u8  irqline;	//printk("BWSCON=%x\n",BWSCON);	//BANKCON1=0xffff;		BWSCON|=0xc0;	//printk("BWSCON2=%x\n",BWSCON);	GPFCON |= 0x2; //EINT0 from PORT F control register	EXTINT0 |= 0x4; //EINT0 Rising edge triggered	INTMSK &= 0xfff7; //EINT0 Enable	//INTPND |= 0x1;		net_init_iic();	net_iic_read(0xaf,0x20,buff,12);//for(i=0;i<12;i++) {//		printk("receive buff[%d] = %x\n",i,buff[i]);//}		//printk("******** dm9000 probe dev->name=%s\n",dev->name);	if(strcmp(dev->name,sEthernet)!=0)strcpy(sEthernet,dev->name);	else return;	if(strcmp(dev->name,"eth0")==0)	{			//printk("eth0 network interface found ");		iobase = ioremap(DM9000_MIN_IO_ETH1,0x400);		//printk("iobase=%x\n",iobase);		dev->irq = 0;   //EINT0                for (i=0; i<6; i++)		{			j = (i*2) + 1;//HHTECH#define EEPROMMAC#ifdef EEPROMMAC			dev->dev_addr[i] = buff[j];#else	                  dev->dev_addr[i] = eth1_mac_addr[i];//db->srom[i];#endif	          //        printk("%02X:",dev->dev_addr[i]);	        }		//printk("\n");			}else	if(strcmp(dev->name,"eth1")==0)	{			//printk("eth2 network interface found ");		iobase = DM9000_MIN_IO_ETH2;		dev->irq = 90;  //INT5                for (i=0; i<6; i++)		{	                   dev->dev_addr[i] = eth2_mac_addr[i];//db->srom[i];	          //         printk("%02X:",dev->dev_addr[i]);	         }		//printk("\n");			}else		if(strcmp(dev->name,"eth3")==0)	{			//printk("eth3 network interface found ");		iobase = DM9000_MIN_IO_ETH3;		dev->irq = 91;  //INT6                for (i=0; i<6; i++)		{	                dev->dev_addr[i] = eth3_mac_addr[i];//db->srom[i];	          //      printk("%02X:",dev->dev_addr[i]);	        }		//printk("\n");			}else		return 0;	//printk("HHTech <DM9000> I/O: %x, VID:   succ\n", iobase);	//return;	//printk("Device Name=%s,name=%s\n",dev->name,dev->priv);	//DMFE_DBUG(0, "dmfe_probe()",0);	//iow(db, 0xfe, 0x0f); 	/* Clear interrupt status */	//printk("222\n");	/* Disable all interrupt */	//iow(db, 0xff, 0x80);/////////////////////////////////////////////////////////////////////////	/* Search All DM9000 NIC */	//{	//printk("iobase=%x,value=%x\n",iobase,DM9000_VID_L);#define OFFSET	0x100	// use cpu a2 : 0x100	outb(DM9000_VID_L, iobase);	id_val = inb(iobase + OFFSET);	outb(DM9000_VID_H, iobase);	id_val |= inb(iobase + OFFSET) << 8;	outb(DM9000_PID_L, iobase);	id_val |= inb(iobase + OFFSET) << 16;	outb(DM9000_PID_H, iobase);	id_val |= inb(iobase + OFFSET) << 24;	if (id_val == DM9000_ID) {	    printk("HHTech DM9000 %s I/O: %x,VID: %x,MAC: ", dev->name,iobase, id_val);	    dm9000_count++;	    /* Init network device */	    dev = init_etherdev(dev, 0); 	/* Allocated board information structure */	irqline = 3;	db = (void *)(kmalloc(sizeof(*db), GFP_KERNEL|GFP_DMA));	memset(db, 0, sizeof(*db));	dev->priv = db;	/* link device and board info */	db->next_dev = dmfe_root_dev;	dmfe_root_dev = dev;	db->ioaddr = iobase;	db->io_data = iobase + OFFSET;	/* driver system function */	dev->base_addr = iobase;	//dev->irq = 68; //INT4 166;//irqline;	dev->open = &dmfe_open;	dev->hard_start_xmit = &dmfe_start_xmit;	dev->stop = &dmfe_stop;	dev->get_stats = &dmfe_get_stats;	dev->set_multicast_list = &dm9000_hash_table;	dev->do_ioctl = &dmfe_do_ioctl;	/* Read SROM content */	/*for (i=0; i<64; i++)		((u16 *)db->srom)[i] = read_srom_word(db, i);*/		/* Set Node Address */		//add by zy		//i2c_read(0x7a,buff,6);		//we set lan-switch data to first 24 bytes,then put mac data to the last 6 bytes.		//printk("MAC set to ");		for (i=0; i<6; i++){	//	    dev->dev_addr[i] = eth_mac_addr[i];//db->srom[i];		    printk("%02X:",dev->dev_addr[i]);		}		printk("\n");	}	if (dm9000_count) {	//request_irq(db->irq, &dmfe_interrupt,0,"DM9000 device",dev);/* Enable interrupts for GPIO6 *///L-->H//HHTECH//*((volatile unsigned long *) (MCF_MBAR2+MCFSIM2_GPIOINTENABLE)) |=0x00000040;/* Enable interrupt level for GPIO6 - VEC38 *///*((volatile unsigned long *) (MCF_MBAR2+MCFSIM2_INTLEVEL5)) |=0x04000000;	}//printk("**** request_irq=%x\n",dev->irq);//if(request_irq(dev->irq, &dmfe_interrupt,SA_SHIRQ,"DM9000 device",dev))  //              return -EAGAIN;//	printk(" ****** success  rquest_irq\n");	/* Re-enable interrupt mask */	//iow(db, 0xff, 0x83);	return dm9000_count ? 0:-ENODEV;}/*  Open the interface.  The interface is opened whenever "ifconfig" actives it.*/static int dmfe_open(struct DEVICE *dev){	board_info_t * db = (board_info_t *)dev->priv;	DMFE_DBUG(0, "dmfe_open", 0);	//minor = MINOR(dev->priv);	//printk("minor=%x\n",dev->minor);	//if (request_irq(dev->irq, &dmfe_interrupt, SA_SHIRQ, dev->name, dev))	//printk("request_irq,irq=%x\n",dev->irq);	if(request_irq(dev->irq, &dmfe_interrupt,SA_INTERRUPT/*SA_SHIRQ*/,"DM9000 device",dev))		return -EAGAIN;	/* Initilize DM910X board */	dmfe_init_dm9000(dev); //	printk("end init\n");	/* Init driver variable */	db->dbug_cnt = 0;	db->runt_length_counter = 0;	db->long_length_counter = 0;	db->reset_counter = 0;	/* Active System Interface */	//dev->tbusy = 0;	/* Can transmit packet */	//dev->start = 1;	/* interface ready */	//mark above for kernel 2.4	netif_wake_queue(dev);         //add by simon 2001.9.4 for kernel 2.4	MOD_INC_USE_COUNT;//	printk("init timer\n");	/* set and active a timer process */

⌨️ 快捷键说明

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