1bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "fw_pvt.h"
2bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_fw_parser_ipclib_config.h"
3bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
4bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeextern uint32_t timer;
5bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
6bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/*------------------------------------------------------------------------------
7bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Function:  memcpy
8bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * This is a memory-copy function.
9bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *------------------------------------------------------------------------------
10bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */
11bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* NOTE: we are inventing memcpy since we don't want to include string libs as part of FW Due to size limitations*/
12bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid *memcpy(void *dest, const void *src, uint32_t n)
13bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
14bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t *ptr8_frm, *ptr8_to;
15bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t *ptr32_frm, *ptr32_to;
16bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t bytes_left=n,trail = 0;
17bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t align=0;
18bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
19bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    ptr8_frm = (uint8_t *)src;
20bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    ptr8_to = (uint8_t *)dest;
21bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
22bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    trail = ((uint32_t)ptr8_frm) & 0x3;
23bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if((trail == (((uint32_t)ptr8_to) & 0x3)) && (n > 4))
24bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
25bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /* check to see what's the offset bytes to go to a word alignment */
26bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        bytes_left -= trail;
27bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        while(align > 0){
28bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            *ptr8_to ++ = *ptr8_frm ++;
29bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            trail--;
30bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
31bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /* check to see if rest of bytes is a multiple of 4. */
32bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        trail = bytes_left & 0x3;
33bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        bytes_left = (bytes_left >> 2) << 2;
34bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        ptr32_to = (uint32_t *)ptr8_to;
35bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        ptr32_frm = (uint32_t *)ptr8_frm;
36bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /* copy word by word */
37bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        while(bytes_left > 0){
38bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            *ptr32_to ++ = *ptr32_frm ++;
39bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            bytes_left -= 4;
40bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
41bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /* If there are any trailing bytes do a byte copy */
42bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        ptr8_to = (uint8_t *)ptr32_to;
43bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        ptr8_frm = (uint8_t *)ptr32_frm;
44bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        while(trail > 0){
45bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            *ptr8_to ++ = *ptr8_frm ++;
46bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            trail--;
47bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
48bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
49bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    else
50bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {/* case when src and dest addr are not on same alignment.
51bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        Just do a byte copy */
52bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        while(bytes_left > 0){
53bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            *ptr8_to ++ = *ptr8_frm ++;
54bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            bytes_left -= 1;
55bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
56bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
57bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return dest;
58bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
59bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
60bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/*------------------------------------------------------------------------------
61bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Function:  memset
62bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * This is a function to copy specificed value into memory array.
63bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *------------------------------------------------------------------------------
64bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */
65bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* NOTE: we are inventing memset since we don't want to include string libs as part of FW Due to size limitations*/
66bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid *memset(void *s, int32_t c, uint32_t n)
67bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
68bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint8_t *ptr8 = (uint8_t *)s;
69bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t *ptr32, data;
70bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t mask = 0, bytes_left = n;
71bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
72bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    mask = c & 0xFF;
73bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    mask |= (mask << 8);
74bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    mask |= (mask << 16);
75bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if(n >= 4)
76bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
77bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        uint32_t trail=0;
78bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        trail = 4 - (((uint32_t)ptr8) & 0x3);
79bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if(trail < 4)
80bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
81bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            ptr32 = (uint32_t *)(((uint32_t)ptr8) & ~0x3);
82bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            data = (*ptr32 >> (8*trail)) << (8*trail);
83bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            data |= (mask >> (32 - (8*trail)));
84bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            *ptr32 = data;
85bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            bytes_left -= trail;
86bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            ptr8 += trail;
87bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
88bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        ptr32 = (uint32_t *)((uint32_t)ptr8);
89bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        while(bytes_left >= 4)
90bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
91bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            *ptr32 = mask;
92bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            ptr32++;
93bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            bytes_left -=4;
94bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
95bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        if(bytes_left > 0)
96bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        {
97bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            data = (*ptr32 << (8*bytes_left)) >> (8*bytes_left);
98bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            data |= (mask << (32 - (8*bytes_left)));
99bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            *ptr32=data;
100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        }
101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return s;
104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/*------------------------------------------------------------------------------
107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Function:  cp_using_dma
108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * This is a function to copy data from local memory to/from system memory.
109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Params:
110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *         [in] ddr_addr  : Word aligned ddr address.
111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *         [in] local_addr: Word aligned local address.
112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *         [in] size      : No of bytes to transfer.
113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *         [in] to_ddr    : Direction of copy, if true copy to ddr else copy to local memory.
114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *         [in] swap      : Enable or disable byte swap(endian).
115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *         [out] return   : Actual number of bytes copied, which can be more than what was requested
116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *                          since we can only copy words at a time.
117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Limitations: DMA can transfer Words only, Local addr & DDR addr should be word aligned.
118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *------------------------------------------------------------------------------
119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */
120bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeuint32_t cp_using_dma(uint32_t ddr_addr, uint32_t local_addr, uint32_t size, char to_ddr, char swap)
121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t val=0, wrote = size;
123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    while((reg_read(DMA_CONTROL_STATUS) & DMA_CTRL_STATUS_BUSY) != 0)
125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /* wait if DMA is busy with a transcation Error condition??*/
127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    reg_write(DMA_SYSTEM_ADDRESS, (ddr_addr & ~3) & ~GV_DDR_MEM_MASK);
130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    reg_write(DMA_LOCAL_ADDRESS, (local_addr & 0xfffc));
131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    //wrote += (ddr_addr & 0x3);
132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    wrote = (wrote+3)>>2;/* make number of bytes multiple of 4 */
133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    val=(wrote & 0xffff) << 2;
134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    reg_write(DMA_CONTROL_STATUS, DMA_CTRL_STATUS_DONE);
135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    val |= DMA_CTRL_STATUS_START;
136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* If size > 64 use 128 byte burst speed */
137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if(wrote > 64)
138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        val |= (1<<18);
139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if(swap) /* Endian swap if needed */
140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        val |= DMA_CTRL_STATUS_SWAP;
141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if(to_ddr)
142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        val = val | DMA_CTRL_STATUS_DIRCN;
143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    reg_write(DMA_CONTROL_STATUS, val);
144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    while((reg_read(DMA_CONTROL_STATUS) & DMA_CTRL_STATUS_DONE) == 0)
145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		/* wait till DMA is done */
147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    reg_write(DMA_CONTROL_STATUS, DMA_CTRL_STATUS_DONE);
149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return (wrote << 2);
151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/*------------------------------------------------------------------------------
154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Function:  cp_using_dma
155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * This is a function to copy data from local memory to/from system memory.
156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Params:
157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *         [in] ddr_addr  : Word aligned ddr address.
158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *         [in] local_addr: Word aligned local address.
159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *         [in] size      : No of bytes to transfer.
160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *         [in] to_ddr    : Direction of copy, if true copy to ddr else copy to local memory.
161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *         [in] swap      : Enable or disable byte swap(endian).
162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *         [out] return   : Actual number of bytes copied, which can be more than what was requested
163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *                          since we can only copy words at a time.
164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * Limitations: DMA can transfer Words only, Local addr & DDR addr should be word aligned.
165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *------------------------------------------------------------------------------
166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */
167bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeuint32_t cp_using_dma_phys(uint32_t ddr_addr, uint32_t local_addr, uint32_t size, char to_ddr, char swap)
168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t val=0, wrote = size;
170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    while((reg_read(DMA_CONTROL_STATUS) & DMA_CTRL_STATUS_BUSY) != 0)
172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        /* wait if DMA is busy with a transcation Error condition??*/
174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    reg_write(DMA_SYSTEM_ADDRESS, (ddr_addr & ~3));
177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    reg_write(DMA_LOCAL_ADDRESS, (local_addr & 0xfffc));
178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    //wrote += (ddr_addr & 0x3);
179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    wrote = (wrote+3)>>2;/* make number of bytes multiple of 4 */
180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    val=(wrote & 0xffff) << 2;
181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    reg_write(DMA_CONTROL_STATUS, DMA_CTRL_STATUS_DONE);
182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    val |= DMA_CTRL_STATUS_START;
183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	/* If size > 64 use 128 byte burst speed */
184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if(wrote > 64)
185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        val |= (1<<18);
186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if(swap) /* Endian swap if needed */
187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        val |= DMA_CTRL_STATUS_SWAP;
188bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if(to_ddr)
189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        val = val | DMA_CTRL_STATUS_DIRCN;
190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    reg_write(DMA_CONTROL_STATUS, val);
191bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    while((reg_read(DMA_CONTROL_STATUS) & DMA_CTRL_STATUS_DONE) == 0)
192bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		/* wait till DMA is done */
194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
195bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    reg_write(DMA_CONTROL_STATUS, DMA_CTRL_STATUS_DONE);
196bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return (wrote << 2);
198bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
200bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid update_ctrl_reg(uint8_t enable, uint32_t mask)
201bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
202bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t read_val = 0;
203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    read_val = reg_read(CONFIG_CP_CONTROL_REG);
204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    if(enable)
205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        read_val = read_val | mask;
207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    else
209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    {
210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee        read_val = read_val & ~mask;
211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    }
212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    reg_write(CONFIG_CP_CONTROL_REG, read_val);
213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return;
214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
215bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
217bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeextern uint32_t sven_get_timestamp();
218bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
219bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeuint32_t set_wdog(uint32_t offset)
220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
221bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef B0_TIMER_FIX
222bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    update_ctrl_reg(0, WATCH_DOG_ENABLE);
223bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    reg_write(INT_REG, INT_WDOG_ENABLE);
224bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    reg_write(WATCH_DOG_COUNTER, offset & WATCH_DOG_MASK);
225bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    update_ctrl_reg(1, WATCH_DOG_ENABLE);
226bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return offset & WATCH_DOG_MASK;
227bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else
228bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return sven_get_timestamp();
229bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
230bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
231bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
232bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid get_wdog(uint32_t *value)
233bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
234bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef B0_TIMER_FIX
235bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    *value = reg_read(WATCH_DOG_COUNTER) & WATCH_DOG_MASK;
236bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    reg_write(INT_REG, ~INT_WDOG_ENABLE);
237bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    update_ctrl_reg(0, WATCH_DOG_ENABLE);
238bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else
239bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    *value = sven_get_timestamp();
240bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
241bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
242bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
243bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeuint32_t get_total_ticks(uint32_t start, uint32_t end)
244bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
245bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    uint32_t value;
246bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef B0_TIMER_FIX
247bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    value = (start-end) + (start*timer);
248bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    timer=0;
249bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else
250bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    value = end-start;/* convert to 1 MHz clocks */
251bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
252bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    return value;
253bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
254