如何测试来自 TDA4VM 的 pps 信号?
使用外部事件时间戳的示例
设备树可以更改:
×ync_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。
如何解决问题?