Skip to content
Snippets Groups Projects
pps_gen.c 1.52 KiB
Newer Older
Tomasz Wlostowski's avatar
Tomasz Wlostowski committed
#include "board.h"

#include <inttypes.h>

#include <hw/pps_gen_regs.h>

#define PPS_PULSE_WIDTH 100000

Tomasz Wlostowski's avatar
Tomasz Wlostowski committed
static volatile struct PPSG_WB *PPSG = (volatile struct PPS_GEN_WB *) BASE_PPS_GEN;

Tomasz Wlostowski's avatar
Tomasz Wlostowski committed
void pps_gen_init()
{
	uint32_t cr;
	
	cr = PPSG_CR_CNT_EN | PPSG_CR_PWIDTH_W(PPS_PULSE_WIDTH);
  
Tomasz Wlostowski's avatar
Tomasz Wlostowski committed
   PPSG->CR = cr;
   PPSG->ESCR = 0;
Tomasz Wlostowski's avatar
Tomasz Wlostowski committed
   PPSG->ADJ_UTCLO = 100;
   PPSG->ADJ_UTCHI = 0;
   PPSG->ADJ_NSEC = 0;
Tomasz Wlostowski's avatar
Tomasz Wlostowski committed
   PPSG->CR = cr | PPSG_CR_CNT_SET;
   PPSG->CR = cr;
Tomasz Wlostowski's avatar
Tomasz Wlostowski committed
}

void pps_gen_adjust_nsec(int32_t how_much)
{
Grzegorz Daniluk's avatar
Grzegorz Daniluk committed
  TRACE_DEV("ADJ: nsec %d nanoseconds\n", how_much);
Tomasz Wlostowski's avatar
Tomasz Wlostowski committed
  PPSG->ADJ_UTCLO = 0;
  PPSG->ADJ_UTCHI = 0;
  PPSG->ADJ_NSEC = ( how_much / 8 );
  PPSG->CR =  PPSG_CR_CNT_EN | PPSG_CR_PWIDTH_W(PPS_PULSE_WIDTH) | PPSG_CR_CNT_ADJ;
Grzegorz Daniluk's avatar
Grzegorz Daniluk committed
void pps_gen_adjust_utc(int32_t how_much)
Tomasz Wlostowski's avatar
Tomasz Wlostowski committed
   TRACE_DEV("ADJ: utc %d seconds\n", how_much);
   PPSG->ADJ_UTCLO = how_much;
   PPSG->ADJ_UTCHI = 0;
   PPSG->ADJ_NSEC = 0;
   PPSG->CR = PPSG_CR_CNT_EN | PPSG_CR_PWIDTH_W(PPS_PULSE_WIDTH) | PPSG_CR_CNT_ADJ;
Tomasz Wlostowski's avatar
Tomasz Wlostowski committed
}

int pps_gen_busy()
{
Tomasz Wlostowski's avatar
Tomasz Wlostowski committed
  return PPSG->CR & PPSG_CR_CNT_ADJ ? 0 : 1;
Tomasz Wlostowski's avatar
Tomasz Wlostowski committed
}

void pps_gen_get_time(uint32_t *utc, uint32_t *cntr_nsec)
{
  uint32_t cyc_before, cyc_after;
  uint32_t utc_lo;

  do {
Tomasz Wlostowski's avatar
Tomasz Wlostowski committed
  cyc_before = PPSG->CNTR_NSEC & 0xfffffff;
  utc_lo = PPSG->CNTR_UTCLO ;
  cyc_after = PPSG->CNTR_NSEC & 0xfffffff;
Tomasz Wlostowski's avatar
Tomasz Wlostowski committed
  } while (cyc_after < cyc_before);

Tomasz Wlostowski's avatar
Tomasz Wlostowski committed
//	delay(100000);
Tomasz Wlostowski's avatar
Tomasz Wlostowski committed
  if(utc) *utc = utc_lo;
  if(cntr_nsec) *cntr_nsec = cyc_after;
}


void pps_gen_enable_output(int enable)
{
 	if(enable)
Tomasz Wlostowski's avatar
Tomasz Wlostowski committed
		PPSG->ESCR = PPSG_ESCR_PPS_VALID  | PPSG_ESCR_TM_VALID;
Tomasz Wlostowski's avatar
Tomasz Wlostowski committed
		PPSG->ESCR = 0;