00001
00038 #include <assert.h>
00039 #include <delay.h>
00040 #include <types.h>
00041 #include <compiler.h>
00042
00043 static void delay_loop(uint16_t iterations)
00044 {
00045 #ifdef __GNUC__
00046 asm volatile(
00047 "1: sbiw %0, 1\n"
00048 " brne 1b"
00049 : "+w"(iterations));
00050 #else
00051 while (iterations--) {
00052 barrier();
00053 }
00054 #endif
00055 }
00056
00057 static void udelay_internal(unsigned int us)
00058 {
00059 delay_loop(((CONFIG_CPU_HZ / 1000000) * us) / 4);
00060 }
00061
00067 void udelay(unsigned int us)
00068 {
00069 assert(us != 0);
00070
00071 udelay_internal(us);
00072 }
00073
00079 void mdelay(unsigned int ms)
00080 {
00081 assert(ms != 0);
00082
00083 do {
00084 udelay_internal(1000);
00085 ms--;
00086 } while (ms != 0);
00087 }