xilinx PL测 DP 点屏 /接收(三)--TX

news2025/8/11 12:13:19

环境:

a)硬件:官方ZCU106开发板 , tb-fmch-vfmc-dp子卡。

b)软件:vivado2021.1,vitis2021.1,裸机程序。

1、例程:

 

 

1、DP TX ip速率:

 

2、框架:

 

3、重要寄存器:

 

 

 

 

 

4、

 

5、时钟

 

6、像素排列:

AXI4_STREAM:

 NATIVE:

 

vitis代码分析:

 

DP TX的初始化:

u32 Dptx_init(void)

{

u32 Status;

XDpTxSs_Config *ConfigPtr_tx;   

xil_printf("config dp tx \n\r");

ConfigPtr_tx = XDpTxSs_LookupConfig(XDPTXSS_DEVICE_ID);

if (!ConfigPtr_tx) {

xil_printf("DPTXSS Lookup Config failed.\r\n");

return XST_FAILURE;

}

xil_printf("DPTXSS Lookup Config done.\r\n");

Status = XDpTxSs_CfgInitialize(&DpTxSsInst, ConfigPtr_tx,ConfigPtr_tx->BaseAddress);

if (Status != XST_SUCCESS) {

xil_printf("DPTXSS config initialization failed.\r\n");

return XST_FAILURE;

}

xil_printf("DPTXSS config initialization done.\r\n");

/* Check for SST/MST support */

if (DpTxSsInst.UsrOpt.MstSupport) {

xil_printf("INFO:DPTXSS is MST enabled. DPTXSS can be "

"switched to SST/MST\r\n");

} else {

xil_printf("INFO:DPTXSS is SST enabled. DPTXSS works "

"only in SST mode.\r\n");

}

return XST_SUCCESS;

}

 

DP TX的中断申请:

u32 DpTxSs_SetupIntrSystem(void)

{

//    u32 Status = XST_SUCCESS;

//    XINTC *IntcInstPtr = &IntcInst;

/* Set custom timer wait */

//    XDpTxSs_SetUserTimerHandler(&DpTxSsInst, &DpPt_CustomWaitUs, &TmrCtr);

XDpTxSs_SetCallBack(&DpTxSsInst, (XDPTXSS_HANDLER_DP_HPD_EVENT),        &DpPt_HpdEventHandler, &DpTxSsInst);

XDpTxSs_SetCallBack(&DpTxSsInst, (XDPTXSS_HANDLER_DP_HPD_PULSE),        &DpPt_HpdPulseHandler, &DpTxSsInst);

XDpTxSs_SetCallBack(&DpTxSsInst, (XDPTXSS_HANDLER_DP_LINK_RATE_CHG),    &DpPt_LinkrateChgHandler, &DpTxSsInst);

// XDpTxSs_SetCallBack(&DpTxSsInst, (XDPTXSS_HANDLER_DP_PE_VS_ADJUST),        &DpPt_pe_vs_adjustHandler, &DpTxSsInst);

// XDpTxSs_SetCallBack(&DpTxSsInst, (XDPTXSS_HANDLER_DP_EXT_PKT_EVENT),    &DpTxSs_ExtPacketHandler, &DpTxSsInst);

// XDpTxSs_SetCallBack(&DpTxSsInst, (XDPTXSS_HANDLER_DP_VSYNC),            &DpTxSs_VsyncHandler, &DpTxSsInst);

return (XST_SUCCESS);

}

 

 

DP TX的发送视频参数获取:

中断,PHY,请看RX的文章

void dp_tx_format()

{

user_config.user_bpc = 8;

//  XVIDC_VM_1920x1080_60_P_RB

user_config.VideoMode_local =XVIDC_VM_3840x2160_30_P ; //  XVIDC_VM_1920x1080_60_P

user_config.user_pattern = 1; /*Color Ramp (Default)*/

user_config.user_format = XVIDC_CSF_RGB;

PixelWidth =4;

u32 freq;

u32 h_total,v_total,frame;

h_total = XVidC_VideoTimingModes[user_config.VideoMode_local].Timing.HTotal;

v_total = XVidC_VideoTimingModes[user_config.VideoMode_local].Timing.F0PVTotal;

frame = XVidC_VideoTimingModes[user_config.VideoMode_local].FrameRate;

freq = h_total * v_total * frame/PixelWidth/1000;

xil_printf(" VideoMode_local = %d \r\n",user_config.VideoMode_local);

xil_printf("h_total = %d , v_total = %d ,frame =%d ,freq = %d ---------------------\r\n",h_total,v_total,frame,freq);

ComputeMandD(freq,CLK_TX_BASE);

}

 

DP TX 开始training:

u32 DpTx_Setup(void)

{

u8 LineRate_init = DP_LINK_RATE;

u8 LaneCount_init = DP_LANE_COUNT;

u8 Edid_org[128], Edid1_org[128];

u8 connected = 0;

DpTxSs_Setup(&LineRate_init, &LaneCount_init, Edid_org, Edid1_org);   //  获取 rx的信息,比如最大lane数目,最大速率等,和edid,如果知道rx的信息,这里可以不用读取edid的

xil_printf("DpTxSs_Setup done.\r\n");

while (!XDpTxSs_IsConnected(&DpTxSsInst)) {

if (connected == 0) {

xil_printf(    "Please connect a DP Monitor to start the application !!!\r\n");

connected = 1;

}

    }

xil_printf(    "DP Monitor connection detected!!!\r\n");

sink_power_cycle();

//    CustomWaitUs(DpTxSsInst.DpPtr, &TmrCtr);

/* Do not return in order to allow interrupt handling to run. HPD events

 * (connect, disconnect, and pulse) will be detected and handled.

 */

DpTxSsInst.DpPtr->TxInstance.TxSetMsaCallback = NULL;

DpTxSsInst.DpPtr->TxInstance.TxMsaCallbackRef = NULL;

DpTxSsInst.DpPtr->TxInstance.MsaConfig[0].ComponentFormat = 0x0;

xil_printf("LineRate_init=%x  --- LaneCount_init=%x \r\n",LineRate_init,LaneCount_init);

xil_printf("XDP_TX_PHY_STATUS  ---%x  \r\n",XDp_ReadReg(XPAR_DPTXSS_0_BASEADDR, XDP_TX_PHY_STATUS));

xil_printf("dp tx msa: M VID0 = %d\r\n",XDp_ReadReg(XPAR_DPTXSS_0_BASEADDR, XDP_TX_M_VID));

start_tx (LineRate_init, LaneCount_init,user_config);   // 启动DP TX

xil_printf("dp tx msa: M VID2 = %d\r\n",XDp_ReadReg(XPAR_DPTXSS_0_BASEADDR, XDP_TX_M_VID));

dptx_status_report();

return XST_SUCCESS;

}

void DpTxSs_Setup(u8 *LineRate_init, u8 *LaneCount_init,u8 Edid_org[128], u8 Edid1_org[128])

{

u32 Status;

Status = XDp_ReadReg(DpTxSsInst.DpPtr->Config.BaseAddr,XDP_TX_INTERRUPT_STATUS);

xil_printf(    "DpTxSs_Setup XDP_TX_INTERRUPT_STATUS  = %X\r\n",Status);

DpTxSsInst.DpPtr->TxInstance.TxSetMsaCallback = NULL;

DpTxSsInst.DpPtr->TxInstance.TxMsaCallbackRef = NULL;

u8 connected =0 ;

// this is intentional infinite while loop

Status = XDpTxSs_IsConnected(&DpTxSsInst);

    while (!Status) {

        if (connected == 0) {

xil_printf(    "Please connect a DP Monitor to start the application !!!\r\n");

connected = 1;

}

    }

    xil_printf(    "DP Monitor connection detected!!!\r\n");

//Waking up the monitor

    sink_power_cycle();

    Status = XDpTxSs_IsConnected(&DpTxSsInst);

//reading the first block of EDID

if (Status) {

xil_printf("Reading EDID contents of the DP Monitor..\r\n");

Status  = XDp_TxAuxRead(DpTxSsInst.DpPtr,    XDP_DPCD_MAX_LINK_RATE,  1, LineRate_init);

xil_printf ("DpTxSs_Setup XDP_DPCD_MAX_LINK_RATE is %x\r\n", *LineRate_init);

Status |= XDp_TxAuxRead(DpTxSsInst.DpPtr,    XDP_DPCD_MAX_LANE_COUNT, 1, LaneCount_init);

xil_printf ("DpTxSs_Setup XDP_DPCD_MAX_LANE_COUNT is %x\r\n", *LaneCount_init);

u8 rData = 0;

// check the EXTENDED_RECEIVER_CAPABILITY_FIELD_PRESENT bit

XDp_TxAuxRead(DpTxSsInst.DpPtr, XDP_DPCD_TRAIN_AUX_RD_INTERVAL, 1, &rData);

if(rData & 0x80){ // if EXTENDED_RECEIVER_CAPABILITY_FIELD is enabled

XDp_TxAuxRead(DpTxSsInst.DpPtr, 0x2201, 1, &rData); // read maxLineRate

if(rData == XDP_DPCD_LINK_BW_SET_810GBPS){

*LineRate_init = 0x1E;

xil_printf ("Capability is %x\r\n", *LineRate_init);

}

//    xil_printf ("DpTxSs_Setup read maxLineRate is %x\r\n", rData);

}

if (Status != XST_SUCCESS) { // give another chance to monitor.

//Waking up the monitor

sink_power_cycle();

XDp_TxGetEdidBlock(DpTxSsInst.DpPtr, Edid_org, 0);

//reading the second block of EDID

XDp_TxGetEdidBlock(DpTxSsInst.DpPtr, Edid1_org, 1);

xil_printf("Reading EDID contents of the DP Monitor..\r\n");

Status = XDp_TxAuxRead(DpTxSsInst.DpPtr,    XDP_DPCD_MAX_LINK_RATE, 1, LineRate_init);

Status |= XDp_TxAuxRead(DpTxSsInst.DpPtr,    XDP_DPCD_MAX_LANE_COUNT, 1, LaneCount_init);

XDp_TxAuxRead(DpTxSsInst.DpPtr, XDP_DPCD_TRAIN_AUX_RD_INTERVAL, 1, &rData);

if(rData & 0x80){ // if EXTENDED_RECEIVER_CAPABILITY_FIELD is enabled

XDp_TxAuxRead(DpTxSsInst.DpPtr, 0x2201, 1, &rData); // read maxLineRate

if(rData == XDP_DPCD_LINK_BW_SET_810GBPS){

*LineRate_init = 0x1E;

xil_printf ("Capability is %x\r\n", *LineRate_init);

}

xil_printf ("DpTxSs_Setup read maxLineRate is %x\r\n", rData);

}

if (Status != XST_SUCCESS)

xil_printf ("Failed to read sink capabilities\r\n");

}

} else {

xil_printf("Please connect a DP Monitor and try again !!!\r\n");

return;

}

*LineRate_init &= 0xFF;

*LaneCount_init &= 0xF;

     xil_printf("System capabilities set to: LineRate %x, LaneCount %x\r\n", *LineRate_init,*LaneCount_init);

}

u32 start_tx(u8 line_rate, u8 lane_count, user_config_struct user_config)

{

XVidC_VideoMode res_table = user_config.VideoMode_local;

u8 bpc = user_config.user_bpc;

u8 format = user_config.user_format-1;

u32 Status;

XDp_WriteReg(DpTxSsInst.DpPtr->Config.BaseAddr,    XDP_TX_INTERRUPT_MASK, 0xFFF);

//Waking up the monitor

sink_power_cycle();

XDp_WriteReg(DpTxSsInst.DpPtr->Config.BaseAddr, XDP_TX_ENABLE, 0x0);

// Give a bit of time for DP IP after monitor came up and starting Link training

usleep(100000);

XDp_WriteReg(DpTxSsInst.DpPtr->Config.BaseAddr, XDP_TX_ENABLE, 0x1);

    xil_printf ("\r\nTraining TX with: Link rate %x, Lane count %d\r\n",line_rate,lane_count);

XDpTxSs_SetLinkRate(&DpTxSsInst, line_rate);    // 设置速率

xil_printf ("XDpTxSs_SetLinkRate end  line_rate = %x    \r\n",line_rate);

XDpTxSs_SetLaneCount(&DpTxSsInst, lane_count);   // 设置lane的数目

xil_printf ("XDpTxSs_SetLaneCount end lane_count = %x   \r\n",lane_count);

if (res_table !=0) {

Status = XDpTxSs_SetVidMode(&DpTxSsInst, res_table);

if (Status != XST_SUCCESS) {

xil_printf("ERR: Setting resolution failed\r\n");

}

}

if (bpc !=0 ) {

Status = XDpTxSs_SetBpc(&DpTxSsInst, bpc);

if (Status != XST_SUCCESS){

xil_printf("ERR: Setting bpc to %d failed\r\n",bpc);

}

}

XDpTxSs_SetUserPixelWidth(&DpTxSsInst,4,XDP_TX_STREAM_ID1);  // 设置每个时钟的pixel

DpTxSsInst.DpPtr->TxInstance.MsaConfig[XDP_TX_STREAM_ID1-1].OverrideUserPixelWidth =PixelWidth;

XDp_TxCfgSetColorEncode(DpTxSsInst.DpPtr, XDP_TX_STREAM_ID1, format, XVIDC_BT_601, XDP_DR_CEA);

Status = DpTxSubsystem_Start(&DpTxSsInst);

if (Status != XST_SUCCESS) {

xdbg_printf(XDBG_DEBUG_GENERAL,"SS ERR: ""DP SS Start setup failed!\n\r");

}

xil_printf (".\r\n");

xil_printf (".\r\n");

xil_printf (".\r\n");

Status = XDpTxSs_CheckLinkStatus(&DpTxSsInst);   // 检测是否training成功

if (Status != (XST_SUCCESS)) {

xil_printf ("*");

XDpTxSs_SetLinkRate(&DpTxSsInst, line_rate);

XDpTxSs_SetLaneCount(&DpTxSsInst, lane_count);

Status = DpTxSubsystem_Start(&DpTxSsInst);

if (Status != XST_SUCCESS) {

xil_printf("ERR:DPTX SS start failed\r\n");

return (XST_FAILURE);

}

}

/* Mask unsused interrupts

 *

 */

XDp_WriteReg(DpTxSsInst.DpPtr->Config.BaseAddr,    XDP_TX_INTERRUPT_MASK, 0x0);

xil_printf ("..done !\r\n");

//    tx_started = 1;

return XST_SUCCESS;

}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/33805.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 内存溢出(二)使用 MAT 分析 .hprof 内存映像文件

目录一、内存溢出时自动导出 .hprof 文件二、下载安装 MAT三、启动 MAT四、MAT 分析 hprof 文件1.Overview 概览2.Leak Suspects 溢出原因猜测3.Histogram 对象实例数量排序4.Dominator Tree 支配树.hprof 文件: 是 java 项目的 Heap Dump 文件,也叫内存…

手把手教你搭建属于自己的PyQt5-YOLOv5目标检测平台(保姆级教程)

>>>深度学习Tricks,第一时间送达<<< 🚀🚀🚀NEW!!!PyQt5-YOLOv5目标检测平台来啦 ~ 💡💡近期,小海带尝试用Pycharm做可视化界面相关设计,并搭载之前实验训练较好的YOLOv5算法模型,以此成功搭建了属于自己的PyQt5-YOLOv5目标检测平台,平台界面…

前后端分离项目,vue+uni-app+php+mysql在线小说电子书阅读系统设计与实现(H5移动项目)

功能介绍 用户首次登陆系统需要注册一个用户作为账号&#xff0c;用户在登录平台后&#xff0c;可以进行平台的操作。主要模块包括以下几点&#xff1a; 登录功能&#xff1a;注册普通账号登录&#xff1b;登录后可以修改用户的基本信息&#xff0c;也可以退出。 资讯功能&…

stress、mpstat、pidstat

简介 压测命令&#xff1a;stress &#xff0c;一个Linux 系统压力测试工具&#xff0c;这里我们用作异常进程模拟平均负载升高的场景。 监测命令&#xff1a;mpstat 是一个常用的多核CPU 性能分析工具&#xff0c;用来实时查看每个CPU 的性能指标&#xff0c;以及所 有 CPU 的…

(附源码)计算机毕业设计JavaJava毕设项目电脑小白网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven Vue 等等组成&#xff0c;B/…

华为机试 - 勾股数元组

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 如果3个正整数(a,b,c)满足a^2 b^2 c^2的关系&#xff0c;则称(a,b,c)为勾股数&#xff08;著名的勾三股四弦五&#xff09;&#xff0c; 为了探索勾股数的规律&#xff0c;我们定义如果勾股数(a,b,…

Spring Boot 检索定时任务

概述 应用经常需要添加检索功能&#xff0c;开源的 ElasticSearch 是目前全文搜索引擎的首选。他可以快速的存储、搜索和分析海量数据。Spring Boot通过整合Spring Data ElasticSearch为我们提供了非常便捷的检索功能支持。 Elasticsearch是一个分布式搜索服务&#xff0c;提…

iwebsec靶场搭建

iwebsec靶场可以通过两种方法进行渗透。 iwebsec靶场简介 第一种是在线靶场&#xff1a;http://www.iwebsec.com:81/ 第二种是本地搭建&#xff1a;目前可以通过两种方法搭建&#xff0c;一种是虚拟机绿色版解压即用&#xff0c;另外一种则是通过docker安装&#xff0c;也是此…

智慧港口解决方案-最新全套文件

智慧港口解决方案-最新全套文件一、建设背景二、建设思路三、建设方案四、获取 - 智慧**全套最新解决方案合集一、建设背景 智慧港口是随着时代进步发展起来的一种现代港口运输的新业态&#xff0c;它是以现代化基础设施为基础&#xff0c;促使大数据、云计算、物联网、移动互…

Ansible Automation Platform - 保护 Playbook 中的敏感内容

《OpenShift / RHEL / DevSecOps / Ansible 汇总目录》 文章目录AAP 保护 Playbook 敏感信息的方法使用 ansible-vault 保护 Playbook 中的敏感信息使用AAP的凭证保护访问通用目标的关键信息场景1场景2使用令牌访问 AAPAAP 保护 Playbook 敏感信息的方法 在上一篇《Ansible Au…

【ES笔记01】ElasticSearch数据库之index索引、doc文档、alias别名、mappings映射结构的基本操作

这篇文章&#xff0c;主要介绍ElasticSearch数据库之index索引、doc文档、alias别名、mappings映射结构的基本操作。 目录 一、索引index相关操作 1.1、创建索引 1.2、查询索引 1.3、查询所有索引 1.4、删除索引 二、文档doc相关操作 2.1、创建文档 2.2、更新文档 &am…

基于JSP的敬老院信息管理系统【数据库设计、源码、开题报告】

数据库脚本下载地址&#xff1a; https://download.csdn.net/download/itrjxxs_com/86467170 主要使用技术 ServletJSPCSSJSMysql 功能介绍 系统管理员用户功能介绍&#xff1a; 密码信息管理&#xff1a;修改个人账号密码&#xff1b; 系统用户管理&#xff1a;可以对系统…

【爬虫进阶】易班登录加密逆向

目录前言分析代码过程結果完整代码前言 demo比较简单&#xff0c;逆向难点&#xff1a;rsa加密&#xff0c;图片验证码 分析 我们模拟登录&#xff0c;请求一下 红框内是我们提交的参数&#xff0c;password看上去应该是rsa加密&#xff0c;captcha是验证码&#xff0c;key…

GO面试一定要看看这些面试题

Go核心特性 1.goroutine 协程是用户态轻量级线程&#xff0c;它是线程调度的基本单位。 使用者分配足够多的任务&#xff0c;系统能自动帮助使用者把任务分配到 CPU 上&#xff0c;让这些任务尽量并发运作。这种机制在 Go语言中被称为 goroutine&#xff08;协程&#xff09…

【javaEE】网络原理(网络层)

努力经营当下&#xff0c;直至未来明朗 文章目录前言一、网络层简述【IP协议】THINK前言 一个人最大的痛苦来源于对自己无能的愤怒 Hi&#xff0c;这里是不想秃头的宝贝儿&#xff01; 本文主要介绍【网络层】&#xff0c;其中最关键的就是【IP协议】。&#xff08;同样&…

【天池竞赛】心跳数据挖掘

天池学习赛 心跳数据挖掘 168分攻略 Chapter 1. 赛题解析 就如比赛界面所介绍的一般&#xff0c;这里再复述一遍 本次新人赛是Datawhale与天池联合发起的0基础入门系列赛事 —— 心跳信号分类预测。赛题以心电图心跳信号数据为背景&#xff0c;要求选手根据心电图感应数据预测…

【序列召回推荐】(task4)多兴趣召回实践:MIND(更新中)

note 阿里的序列召回MIND模型&#xff1a;引入了胶囊网络&#xff0c;将胶囊网络的动态路由算法引入到了用户的多兴趣建模上&#xff0c;通过B2I动态路由很好的从用户的原始行为序列中提取出用户的多种兴趣表征。在离线训练阶段&#xff0c;通过提出Label-Aware Attention详细…

Lifecycle 生命周期组件的那些事

引言 在2022的今天&#xff0c;AndroidX 普遍的情况下&#xff0c;JetPack Lifecycle 也早已经成为了开发中的基础设施&#xff0c;小到 View(扩展库) ,大到 Activity&#xff0c;都隐藏着它的身影&#xff0c;而了解 Lifecycle 也正是理解 JetPack 组件系列库生命感知设计的基…

D-013 蜂鸣器硬件电路设计

蜂鸣器硬件电路设计1 简介2 蜂鸣器电路设计1 简介 蜂鸣器是一种一体化结构的电子讯响器&#xff0c;采用直流电压供电&#xff0c;广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中做发声器件。 蜂鸣器的分类&#xff1a;压电…

【ASM】字节码操作 工具类与常用类 AnalyzerAdapter初步介绍

文章目录 1.概述1.1 第一句话1.2 第二句话2. AnalyzerAdapter2.1 class info2.2 fields2.3 constructors2.4 methods2.4.1 execute方法2.4.2 return和throw2.4.3 jump2.4.4 visitFrame方法2.4.5 new和invokespecial1.概述 在上一篇文章: