x264_scan8分析

x264_scan8分析
? 看到有好几次,有朋友问到x264_scan8这个表格储存的是什么资料。开始的时候,的确让人费解,越看越糊涂。
在很多地方都直接或者间接通过这个表格来保存资料。比如:
h->mb.cache.intra4x4_pred_mode[x264_scan8[0] - 8] = h->mb.intra4x4_pred_mode[i_top_xy][0];
h->mb.cache.intra4x4_pred_mode[x264_scan8[1] - 8] = h->mb.intra4x4_pred_mode[i_top_xy][1];
h->mb.cache.intra4x4_pred_mode[x264_scan8[4] - 8] = h->mb.intra4x4_pred_mode[i_top_xy][2];
h->mb.cache.intra4x4_pred_mode[x264_scan8[5] - 8] = h->mb.intra4x4_pred_mode[i_top_xy][3];
很多地方都是通过x264_scan8找到数组的下标,那么这个x264_scan8表格是如何定义的呢,
我们看
static const int x264_scan8[16+2*4] =
{
     /* Luma */
     4+1*8, 5+1*8, 4+2*8, 5+2*8,
     6+1*8, 7+1*8, 6+2*8, 7+2*8,
     4+3*8, 5+3*8, 4+4*8, 5+4*8,
     6+3*8, 7+3*8, 6+4*8, 7+4*8,      /* Cb */
     1+1*8, 2+1*8,
     1+2*8, 2+2*8,      /* Cr */
     1+4*8, 2+4*8,
     1+5*8, 2+5*8,
};
/*
    0 1 2 3 4 5 6 7
0
1    B B    L L L L
2    B B    L L L L
3          L L L L
4    R R    L L L L
5    R R
*/ 这个注释很好的说明了,这个表格是存储的是4x4块,YUV420得3分量的扫描序号,从图上看
这个扫描共有6X8=48个数据,实际上YUV420只有16+8=244X4块,那么其他的空间用来干什么呢。
事实上,第0行,第0列,第3列,第3行都有空块.这些空块用来存储什么呢,通过分析,用来存储当前宏块
的top宏块,left宏块的4X4子块的扫描,比如x264_scan8[0],代表第一个Luma的扫描,扫描序为12,
位于上图表格的(4,1)处,(5,1)处是第二个Luma,扫描序为13,位于x264_scan8[1],(6,1)处这时候扫描序号是14,位于x264_scan8[4],
(7,1)扫描序号是15位于x264_scan8[5].所以x264_scan8[0],x264_scan8[1],x264_scan8[4],x264_scan8[5],代表整个宏块的
第一行的4X4块的扫描序号,由于我们在帧内亮度,色度预测,帧间运动矢量预测的时候,都要运用top,left侧的子块
做Left,top,或者中值预测.所以上面空出来的扫描序号用来存储top,或者left宏块的边缘子块(4X4)扫描。比如(4,0)~(7,0)存储当前
宏块的top宏块下边缘的扫描(对Luma)。其他的Cb,Cr分量依次类推。
到此x264_scan8表格分析完成,结论:存储的是当前宏块各个分量4X4块在8X6表格中的扫描序号。
<think>好的,用户遇到了phy_bl_scan无法打印的问题,需要找出原因和解决方案。首先,我得分析可能的故障点。 根据引用[1],phy配置与mdio总线和原理图相关。可能phy_bl_scan的初始化配置有误,比如地址或总线配置错误,导致扫描失败。需要检查eth.c中的相关代码,确认phy地址和总线是否正确。 然后,考虑硬件连接问题。phy设备是否正常上电,或存在物理连接问题,比如MDIO/MDC线路接触不良,可能导致通信失败,从而无法打印信息。需要检查硬件连接和电源。 接下来是驱动或固件问题。可能当前使用的U-Boot或驱动版本不支持该phy的扫描功能,需要确认驱动是否完整,并查看是否有必要的补丁未应用。引用[3]提到GPIO组件的位置,可能涉及GPIO配置是否正确,影响phy的复位或使能信号。 打印功能本身的实现也可能有问题。比如,调试输出是否被禁用,或者日志级别设置不当,导致phy_bl_scan的信息未被输出。需要检查代码中的打印语句是否被正确调用,以及日志系统的配置。 此外,引用[2]和[5]提到的UTF-8编码和Wi-Fi配置可能不相关,但如果有日志编码问题,也可能导致打印乱码或失败,不过可能性较低。需要确认系统初始化中是否使能了正确的编码设置,如GUI_UC_SetEncodeUTF8(),但可能与phy调试无关。 综合以上因素,解决方案应包括检查配置、硬件、驱动和打印功能。逐步排查这些方面,应该能定位问题所在。</think>### phy_bl_scan 打印失败原因分析及解决方案 #### 1. 配置问题(硬件/软件) - **可能原因**:`phy_bl_scan` 相关的 PHY 地址、MDIO 总线配置错误,导致无法正确访问 PHY 设备。根据引用[1],PHY 地址需根据原理图配置在对应的 MDIO 总线上。例如,若 PHY 设备连接在第二条 MDIO 总线,但代码中误配置为第一条总线,会导致扫描失败。 - **解决方案**: - 检查硬件原理图,确认 PHY 设备连接的 MDIO 总线编号及 PHY 地址。 - 核对代码中 `eth.c` 的配置(如 `struct phy_device *phy_dev` 初始化部分),确保总线号和 PHY 地址与原理图一致[^1]。 #### 2. 硬件连接异常 - **可能原因**:PHY 设备未上电、MDIO/MDC 信号线接触不良或物理损坏。 - **解决方案**: - 测量 PHY 芯片供电电压是否正常。 - 使用示波器检查 MDIO/MDC 信号波形,确认通信是否正常。 - 检查 PCB 焊接质量,尤其是 PHY 芯片和主控的接口。 #### 3. 驱动或固件缺失 - **可能原因**:当前 U-Boot 或系统驱动未包含对应 PHY 芯片的驱动支持,或驱动未正确初始化。 - **解决方案**: - 确认 `am_gpio.c` 等底层驱动是否包含 PHY 复位或使能相关的 GPIO 配置(参考引用[3])。 - 在 U-Boot 或内核中检查 PHY 驱动是否编译启用(如 `CONFIG_PHYLIB` 配置项)。 #### 4. 打印功能未启用 - **可能原因**:调试打印语句被条件编译屏蔽(如 `#ifdef DEBUG`),或日志级别设置过高。 - **解决方案**: - 在代码中搜索 `phy_bl_scan` 相关函数,确认是否有 `printf` 或 `debug` 语句被禁用。 - 调整系统日志级别(如修改 `loglevel` 参数),确保调试信息可输出。 #### 5. 代码逻辑错误 - **可能原因**:`phy_bl_scan` 函数本身存在逻辑问题,例如超时未正确处理、寄存器读写错误等。 - **解决方案**: - 在函数内部添加分段调试打印,定位具体失败位置。 - 检查 PHY 寄存器读写接口,确保读写操作返回成功状态。 --- ### 操作步骤示例(以 U-Boot 为例) 1. **确认原理图设计**: 查找 PHY 芯片连接的 MDIO 总线编号(例如 MDIO0 或 MDIO1)及 PHY 地址(如 0x01)。 2. **修改 `eth.c` 配置**: 在 `board/freescale/ls1046ardb/eth.c` 中,调整 `struct phy_device` 初始化参数,例如: ```c phy_dev = phy_connect(bus, phy_addr, dev, MDIO_BUS_0); // 根据实际总线号修改 ``` 3. **启用调试输出**: 在代码中添加调试语句: ```c printf("PHY Scan: Bus=%d, Addr=0x%x, Status=%d\n", bus->num, phy_addr, phy_dev->link); ``` 4. **重新编译并测试**: 执行 `make` 重新编译 U-Boot,烧录后观察串口输出。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值