]> git.donarmstrong.com Git - tmk_firmware.git/blobdiff - common/timer.c
Merge branch 'rhaberkorn-serial-mouse'
[tmk_firmware.git] / common / timer.c
index 48a38c9b68211116c75b948c21bd9fe3e444a1cc..e0dec6cefcf9d07fef9f25b32f8efcd640e1958e 100644 (file)
@@ -22,7 +22,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
 // counter resolution 1ms
-volatile uint16_t timer_count = 0;
+// NOTE: union { uint32_t timer32; struct { uint16_t dummy; uint16_t timer16; }}
+volatile uint32_t timer_count = 0;
 
 void timer_init(void)
 {
@@ -59,7 +60,20 @@ void timer_clear(void)
 inline
 uint16_t timer_read(void)
 {
-    uint16_t t;
+    uint32_t t;
+
+    uint8_t sreg = SREG;
+    cli();
+    t = timer_count;
+    SREG = sreg;
+
+    return (t & 0xFFFF);
+}
+
+inline
+uint32_t timer_read32(void)
+{
+    uint32_t t;
 
     uint8_t sreg = SREG;
     cli();
@@ -72,14 +86,27 @@ uint16_t timer_read(void)
 inline
 uint16_t timer_elapsed(uint16_t last)
 {
-    uint16_t t;
+    uint32_t t;
+
+    uint8_t sreg = SREG;
+    cli();
+    t = timer_count;
+    SREG = sreg;
+
+    return TIMER_DIFF_16((t & 0xFFFF), last);
+}
+
+inline
+uint32_t timer_elapsed32(uint32_t last)
+{
+    uint32_t t;
 
     uint8_t sreg = SREG;
     cli();
     t = timer_count;
     SREG = sreg;
 
-    return TIMER_DIFF_MS(t, last);
+    return TIMER_DIFF_32(t, last);
 }
 
 // excecuted once per 1ms.(excess for just timer count?)