hi all: thanks for your kind help :) 2011/1/17 Winfred Lu <winfred.lu@xxxxxxxxx>: > 2011/1/16 loody <miloody@xxxxxxxxx> >> >> below is the formula about calculating the delay >> (us * 0x000010c7 * HZ * lpj )) >> 32) >> I cannot figure out why we need to multiply 0x10c7, and what lpj mean? > > 0x10c7 is the rounded up value of (2 ^ 32) / 1,000,000. > > The 1,000,000 comes from that 1 second is equal to 1,000,000 micro seconds. > That the value multiplied by (2 ^ 32) and shifted 32 bit right after is > equal to > that the value multiplied by 1. I found my kernel will compile udelay(xx) as zero no matter what xx I filled in. below are the dis-assemblies: (as you can see the v0 = v1 = zero.) My version is 2.6.30.9: void __udelay(unsigned long us) { unsigned int lpj = current_cpu_data.udelay_val; __delay(((unsigned long long)(us * 0x000010c7 * HZ * lpj)) >> 32); 80306ed0: 00001821 move v1,zero 80306ed4: 00601021 move v0,v1 #include <asm/compiler.h> #include <asm/war.h> inline void __delay(unsigned int loops) { __asm__ __volatile__ ( 80306ed8: 1440ffff bnez v0,80306ed8 <__udelay+0x8> 80306edc: 2442ffff addiu v0,v0,-1 void __udelay(unsigned long us) I have double checked the __delay source code of 2.6.33.4 and the dis-assemblies: void __udelay(unsigned long us) { unsigned int lpj = current_cpu_data.udelay_val; __delay((us * 0x000010c7ull * HZ * lpj) >> 32); 802f7310: 3c02804f lui v0,0x804f 802f7314: 8c429360 lw v0,-27808(v0) 802f7318: 3c050010 lui a1,0x10 802f731c: 34a56256 ori a1,a1,0x6256 802f7320: 00450019 multu v0,a1 802f7324: 00002821 move a1,zero 802f7328: 00001012 mflo v0 802f732c: 00001810 mfhi v1 802f7330: 00a20018 mult a1,v0 802f7334: 70640000 madd v1,a0 802f7338: 00003012 mflo a2 802f733c: 00440019 multu v0,a0 802f7340: 00001810 mfhi v1 802f7344: 00c31021 addu v0,a2,v1 #include <asm/compiler.h> #include <asm/war.h> inline void __delay(unsigned int loops) { __asm__ __volatile__ ( 802f7348: 1440ffff bnez v0,802f7348 <__udelay+0x38> 802f734c: 2442ffff addiu v0,v0,-1 void __udelay(unsigned long us) { unsigned int lpj = current_cpu_data.udelay_val; __delay((us * 0x000010c7ull * HZ * lpj) >> 32); } 802f7350: 03e00008 jr ra Does that mean "unsigned long long" not workable? appreciate your help, miloody