Merge scsi2sd-util GUI changes
[SCSI2SD-V6.git] / software / SCSI2SD / src / time.c
1 //      Copyright (C) 2014 Michael McMaster <michael@codesrc.com>
2 //
3 //      This file is part of SCSI2SD.
4 //
5 //      SCSI2SD is free software: you can redistribute it and/or modify
6 //      it under the terms of the GNU General Public License as published by
7 //      the Free Software Foundation, either version 3 of the License, or
8 //      (at your option) any later version.
9 //
10 //      SCSI2SD is distributed in the hope that it will be useful,
11 //      but WITHOUT ANY WARRANTY; without even the implied warranty of
12 //      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 //      GNU General Public License for more details.
14 //
15 //      You should have received a copy of the GNU General Public License
16 //      along with SCSI2SD.  If not, see <http://www.gnu.org/licenses/>.
17
18 #include "time.h"
19 #include "limits.h"
20
21 static volatile uint32_t counter = 0;
22
23 CY_ISR_PROTO(TickISR);
24 CY_ISR(TickISR)
25 {
26         // Should be atomic at 32bit word size. Limits runtime to 49 days.
27         ++counter;
28 }
29
30 void timeInit()
31 {
32         // Interrupt 15. SysTick_IRQn is -1.
33         // The SysTick timer is integrated into the Arm Cortex M3
34         CyIntSetSysVector((SysTick_IRQn + 16), TickISR);
35
36         // Ensure the cycle count is < 24bit.
37         // At 50MHz bus clock, counter is 50000.
38         SysTick_Config((BCLK__BUS_CLK__HZ + 999u) / 1000u);
39 }
40
41 uint32_t getTime_ms()
42 {
43         return counter;
44 }
45
46 uint32_t diffTime_ms(uint32_t start, uint32_t end)
47 {
48         if (end >= start)
49         {
50                 return  end - start;
51         }
52         else
53         {
54                 return (UINT_MAX - start) + end;
55         }
56 }