This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TDA4VM:CPSW2G CPTS 输出 PPS

Guru**** 2540720 points
Other Parts Discussed in Thread: TDA4VM

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1068305/tda4vm-cpsw2g-cpts-output-pps

“线程:测试TDA4VM”中讨论的其它部件

如何测试来自 TDA4VM 的 pps 信号?

https://software-dl.ti.com/jacinto7/esd/processor-sdk-linux-rt-jacinto7/08_01_00_02/exports/docs/linux/Foundational_Components/Kernel/Kernel_Drivers/Network/CPSW2g.html#

使用外部事件时间戳的示例

设备树可以更改:

&timesync_router{
   pinctrl-names ="default";
   pinctrl-0 =<&MCU_CPTs_pps>;

   /*时同步路由示例*/
   MCU_CPTs_pps:MCU-CPTS-pps{
      pinctrl-single,pins =<
            /* pps [CPT genF1] in17 -> out29 [CPT HW4_PUSH]*/
            TS_OFFSET (29,17)
            /* pps [CPT genF1] in17 -> out35 [SYNC1_OUT PIN]*/
            TS_OFFSET (35,17)
            >;
   };
};

当启用 pps,且无法生成中断时,SYNC1_OUT 的 PPS 信号输出。

设置了46000000.以太网,并创建了 IRQ。

am65-CPT.c 驱动程序/net/Ethernet/ti

结构 am65_CPT *am65_CPts_create (结构设备*dev,void __iomem *regs,
              结构 device_node *node)

   结构 am65_CPT *CPT;
   国际台,I;

   CPT = devm_kzalloc(dev, sizeof(*CPts),gfp_kernel );
   如果(!CPT)
      返回 ERR_PTR(-ENOMEM);

   CPT->dev = dev;
   cpts->reg =(结构 am65_CPts_regs __iomem *) regs;

   CPT->IRQ = of_IRQ_GET_byname (节点,"CPT");      //生成 IRQ
   如果(CPT->IRQ <= 0)为{
      RET = CPT->IRQ ?:-ENXIO;
      IF (RET !=-EPROBE_RE草案)
         dev_err(dev,“无法获取 IRQ 编号(err=%d)\n",
            RET);
      返回 ERR_PTR(转塔);
   }
    dev_info (dev,"CPT IRQ is %d\n",CPT->IRQ);
   RET = am65_CPts_of_parse (CPts,节点);
   IF (转塔)
      返回 ERR_PTR(转塔);

   互斥锁(&CPT->PTP_clk_lock);
   init_list_head (&CPT->事件);
   init_list_head (&CPT->池);
   spin_lock_init(&CPT->lock);
   skb_queue_head_init(&CPT->TxQ);

   对于(I = 0;I < AM65_CPTS_MAX_Events;I++)
      list_add(&CPT->pool_data[i].list,&CPT-->池);

   CPT->REFCLK = devm_GET_clk_from 子项(dev,node,"CPTs");
   如果(is_ERR (CPT->REFCLK))为{
      RET = PTR_ERR (CPT->REFCLK);
      IF (RET !=-EPROBE_RE草案)
         dev_err(dev,“无法获取 REFCLK %d\n", ret);
      返回 ERR_PTR(转塔);
   }

   RET = clk_preping_enable(CPT->REFCLK);
   如果(转台)为{
      dev_err(dev,“无法启用 REFCLK %d\n", ret);
      返回 ERR_PTR(转塔);
   }

   CPT->REFCLK_FREQ = clk_GET_RATE (CPT->REFCLK);

   am65_PTP_INFO.max_adj = CPT->REFCLK_FREQ / AM65_CPTS_MIN_PPM;
   CPT->PTP_INFO = am65_PTP_INFO;

   IF (CPT->ext_ts_inputs)
      CPts->PTP_INFO.n_ext_ts = CPts->ext_ts_inputs;
   IF (CPT->Genf_num)
      CPT->PTP_INFO.n_Per_out = CPT->Genf_num;
   IF (CPT->pps_present)
      CPT->ptp_info.pps =1;

   am65_CPTs_set_add_val (CPT);

   am65_CPTs_write32 (CPT,AM65_CPTS_control_EN |
          AM65_CPTS_CONTACT_64MODE |
          AM65_CPTS_CONTACT_TX_Genf_CLR_EN,
          控制);    
   
   am65_CPTs_write32 (CPT,AM65_CPTS_INT_ENABLE,TS_PEND_EN,INT_ENABLE);

   /*将时间设置为当前系统时间*/
   am65_CPTs_settime (CPT,ktime_to_ns (ktime_Get_Real()));

   CPT->PTP_clock = PTP_CLOCK_REGISTER (&CPT->PTP_INFO,CPT->DEV);
   如果(is_ERR_OR_NULL (CPT->PTP_clock))为{
      dev_err(dev,“无法注册 PTP clk %ld”,
         PTR_ERR (CPT->PTP_clock));
      RET = CPT->PTP_clock? PTR_ERR (CPT->PTP_clock):-ENODEV;
      转到 REFCLK_DISABLE;
   }
   CPT->PHC_INDEX = PTP_CLOCK_INDEX (CPT->PTP_clock);

   RET = devm_add_action_or_reset (dev,am65_CPts_release,CPT);
   如果(转台)为{
      dev_err(d,“无法添加 ptpclk 重置操作%d”,ret);
      返回 ERR_PTR(转塔);
   }

   RET = devm_request_threaded_irq(开发,CPT->irq, NULL,  //irq.请求
               am65_CPTs_interrupt,
               IRQF_OneShot,dev_name (dev),CPT);
   如果(转台< 0)为{
      dev_err(CPT->dev,“附加 IRQ %d\n, ret 时出错”;
      返回 ERR_PTR(转塔);
   }

   dev_info (dev,"CPTS 版本0x%08x,freq:%u,add_val:%u pps:%d\n",
      am65_CPTs_read32 (CPT,idver),
      CPT->REFCLK_FREQ,CPT->ts_add_val,CPT->pps_present);

   返回 CPT;

REFCLK_DISABLE:
   CLK_DISABLE_UNPREPARE (CPT->REFCLK);
   返回 ERR_PTR(转塔);
}
export_symbol_GPL(am65_CPTs_cree);

604:         0             GICv3 890 Level    46000000.ethernet

启用 pps 时没有任何 IRQ。

如何解决问题?