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