[linux-cirrus] Re: EP93xx patch against linux-2.6.12 is out!

  • From: "Cory T. Tusar" <ctusar@xxxxxxxxxxxxxxxxxx>
  • To: linux-cirrus@xxxxxxxxxxxxx
  • Date: Fri, 08 Jul 2005 11:00:43 -0400

Michael Burian wrote:

>>ethernet (move MAC address macro from init to open time and code to get
>>mac address from I2C eeprom) to make sure they are right for what you
>>want to do.
> 
> 
> It's OK with me, complaints anybody else?

Woohoo!  Hopefully this will let me get rid of what has to be one of the
most heinous preproccesor abuses I've ever committed - bitbanging
several I2C accesses via macro before the I2C driver layer is
initialized just to determine a board's MAC.

Attached for your amusement... :p

-Cory


-- 
Cory T. Tusar
Embedded Systems Engineer
Videon Central, Inc.
2171 Sandy Drive
State College, PA 16801
(814) 235-1111 x316
(814) 235-1118 fax

"Debugging is twice as hard as writing the code in the first place.
  Therefore, if you write the code as cleverly as possible, you are,
    by definition, not smart enough to debug it."  --Brian W. Kernighan

.EXPORT_ALL_VARIABLES:
############################################################################

LINUXTARGET = uImage
VERSIONPKG = 1.0.0
VERSIONSTR = $(CONFIG_VENDOR)/$(CONFIG_PRODUCT) Version $(VERSIONPKG)

############################################################################

include $(ROOTDIR)/vendors/config/arm/config.arch

############################################################################

############################################################################
#
# Now /here's/ how to abuse cpp...
#
# This particular gem performs a single bit-banged I2C query of the PCA9501
# GPIO interface at I2C address 0x06, reading the single byte board ID value
# strapped thereon, followed by a two-byte I2C query of the PCA9501 EEPROM
# at I2C address 0x46 to determine the board type.  All of this is done in
# order to allow us to set a unique MAC address before the I2C subsystem 
# proper has been initialized.
#
# Woot.
#
export CFLAGS_ep93xx_eth.o := -D"GET_MAC_ADDR(a,b)=do{u32 
x=0x80840038,y=0x8084003C,z=0x808400C8,i;u8 
d,e,f,*p=(u8*)(b);p[0]='v';p[1]='c';p[2]='i';p[3]=7;p[4]=255;p[5]=255;outl(inl(x)|3,x);udelay(5);outl(inl(y)|3,y);outl(inl(z)|3,z);udelay(5);outl(inl(x)&~2,x);udelay(5);outl(inl(x)&~1,x);udelay(5);for(i=8,d=13;i;i--,d*=2){outl(((inl(x)&~2)|((d&128)?2:0)),x);udelay(5);outl(inl(x)|1,x);udelay(5);outl(inl(x)&~1,x);udelay(5);}outl(inl(y)&~2,y);outl(inl(x)|1,x);udelay(5);if(inl(x)&2)break;outl(inl(x)&~1,x);udelay(5);for(i=8,d=0;i;i--){d/=2;outl(inl(x)|1,x);udelay(5);if(inl(x)&2)d|=128;outl(inl(x)&~1,x);udelay(5);}p[5]=d&31;outl(inl(y)|3,y);outl(inl(x)|2,x);udelay(5);outl(inl(x)|1,x);udelay(5);outl(inl(x)&~1,x);udelay(5);outl(inl(x)&~2,x);udelay(5);outl(inl(x)|1,x);udelay(5);outl(inl(x)|2,x);udelay(5);outl(inl(x)&~2,x);udelay(5);outl(inl(x)&~1,x);udelay(5);for(i=8,d=140;i;i--,d*=2){outl(((inl(x)&~2)|((d&128)?2:0)),x);udelay(5);outl(inl(x)|1,x);udelay(5);outl(inl(x)&~1,x);udelay(5);}outl(inl(y)&~2,y);outl(inl(x)|1,x);udelay(5);if(inl(x)&2)break;outl(inl(x)&~1,x);udelay(5);outl(inl(y)|3,y);for(i=8,d=0;i;i--,d*=2){outl(((inl(x)&~2)|((d&128)?2:0)),x);udelay(5);outl(inl(x)|1,x);udelay(5);outl(inl(x)&~1,x);udelay(5);}outl(inl(y)&~2,y);outl(inl(x)|1,x);udelay(5);if(inl(x)&2)break;outl(inl(x)&~1,x);udelay(5);outl(inl(y)|3,y);outl(inl(x)|2,x);udelay(5);outl(inl(x)|1,x);udelay(5);outl(inl(x)&~2,x);udelay(5);outl(inl(x)&~1,x);udelay(5);for(i=8,d=141;i;i--,d*=2){outl(((inl(x)&~2)|((d&128)?2:0)),x);udelay(5);outl(inl(x)|1,x);udelay(5);outl(inl(x)&~1,x);udelay(5);}outl(inl(y)&~2,y);outl(inl(x)|1,x);udelay(5);if(inl(x)&2)break;outl(inl(x)&~1,x);udelay(5);outl(inl(y)&~2,y);for(i=8,e=0;i;i--){e*=2;outl(inl(x)|1,x);udelay(5);if(inl(x)&2)e|=1;outl(inl(x)&~1,x);udelay(5);}outl(inl(x)&~2,x);udelay(5);outl(inl(y)|3,y);outl(inl(x)|1,x);udelay(5);outl(inl(x)&~1,x);udelay(5);outl(inl(y)&~2,y);for(i=8,f=0;i;i--){f*=2;outl(inl(x)|1,x);udelay(5);if(inl(x)&2)f|=1;outl(inl(x)&~1,x);udelay(5);}p[4]=(e==53&&f==49)?10:(e==48&&f==50)?11:(e==48&&f==51)?12:255;outl(inl(y)|3,y);outl(inl(x)|2,x);udelay(5);outl(inl(x)|1,x);udelay(5);outl(inl(x)&~1,x);udelay(5);outl(inl(x)&~2,x);udelay(5);outl(inl(x)|1,x);udelay(5);outl(inl(x)|2,x);udelay(5);}while(0);"

Other related posts: