土壤侵蚀强度评估:融合坡度、植被覆盖与土地利用数据的5因子分析模型
2026/7/10 8:07:36
+---------------------+ | 用户空间 | | DRM API (libdrm) | | + HDMI音频控制 | +----------+----------+ | +----------v----------+ | 内核空间 | | DRM核心子系统 | | + 标准HDMI桥接器 | +----------+----------+ | +----------v----------+ | 统一HDMI控制器 | | (drm_bridge) | +----------+----------+ | +----------v----------+ | HDMI物理层 | +---------------------+include/drm/drm_bridge.h定义标准接口drivers/gpu/drm/bridge/下的通用实现drivers/media/cec/标准化CEC处理drivers/gpu/drm/drm_hdcp.c开源HDCP 2.2// drivers/gpu/drm/bridge/adv7511.c static const struct drm_bridge_funcs adv7511_bridge_funcs = { .attach = adv7511_attach, .mode_set = adv7511_mode_set, .enable = adv7511_enable, .disable = adv7511_disable, .atomic_enable = adv7511_atomic_enable, .atomic_disable = adv7511_atomic_disable, }; int adv7511_probe(struct i2c_client *client) { struct drm_bridge *bridge; struct adv7511 *adv7511; bridge = &adv7511->bridge; drm_bridge_init(dev, bridge, &adv7511_bridge_funcs); drm_bridge_add(bridge); return 0; }drm_bridge_init():桥接器初始化drm_bridge_add():添加桥接器到DRMatomic_enable():原子操作支持mode_set():配置显示模式// drivers/gpu/drm/bridge/lt9611uxc.c static void lt9611uxc_set_frl_rate(struct drm_bridge *bridge, u8 frl_rate) { struct lt9611uxc *lt9611uxc = bridge_to_lt9611uxc(bridge); u8 reg_value; /* 配置FRL速率 */ reg_value = lt9611uxc_read(lt9611uxc, LT9611UXC_REG_FRL_CTRL); reg_value &= ~LT9611UXC_FRL_RATE_MASK; reg_value |= (frl_rate << LT9611UXC_FRL_RATE_SHIFT); lt9611uxc_write(lt9611uxc, LT9611UXC_REG_FRL_CTRL, reg_value); /* 等待链路训练完成 */ if (wait_for_frl_training(lt9611uxc)) DRM_ERROR("FRL training failed\n"); }&hdmi { status = "okay"; hdmi-connector { compatible = "hdmi-connector"; #address-cells = <1>; #size-cells = <0>; port@0 { reg = <0>; hdmi_con_in: endpoint { remote-endpoint = <&hdmi_con_out>; }; }; }; }; &dwc_hdmi { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&hdmi_hpd_pin>; ddc-i2c-bus = <&i2c1>; cec-i2c-bus = <&i2c2>; port { hdmi_con_out: endpoint { remote-endpoint = <&hdmi_con_in>; ddr = <0>; }; }; };ddc-i2c-bus:EDID读取使用的I2C总线cec-i2c-bus:CEC通信使用的I2C总线ddr:DDR模式配置// drivers/gpu/drm/drm_edid.c int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid) { int num_modes = 0; int i; /* 添加标准显示模式 */ for (i = 0; i < 4 && edid->standard_timings[i].t; i++) { num_modes += drm_add_standard_modes(connector, edid); } /* 添加CEA扩展块 */ if (drm_edid_is_cea(edid)) { num_modes += drm_add_cea_modes(connector, edid); drm_add_speaker_allocation(connector, edid); drm_add_modes_custom_cea(connector, edid); } return num_modes; }// drivers/media/cec/core/cec-core.c int cec_transmit(struct cec_adapter *adap, u8 attempts, u8 signal_free_time, struct cec_msg *msg) { struct cec_devnode *devnode = adap->devnode; int ret; mutex_lock(&devnode->lock); ret = __cec_transmit(adap, attempts, signal_free_time, msg); mutex_unlock(&devnode->lock); return ret; } static int __cec_transmit(...) { if (adap->ops->adap_transmit) { ret = adap->ops->adap_transmit(adap, attempts, signal_free_time, msg); if (ret == 0) cec_msg_mark_as_replied(msg); } return ret; }// drivers/gpu/drm/drm_hdcp.c int drm_hdcp2_authenticate(struct drm_connector *connector) { struct drm_device *dev = connector->dev; struct hdcp_port_data *data; int ret; /* 启动认证流程 */ ret = drm_hdcp2_msg_send(dev, connector, HDCP_2_2_AKE_INIT); if (ret) return ret; /* 处理认证响应 */ ret = drm_hdcp2_wait_for_msg(dev, connector, HDCP_2_2_AKE_SEND_CERT); if (ret) return ret; /* 完成认证 */ return drm_hdcp2_complete_authentication(dev, connector); }启用FRL:
# 设置HDMI 2.0模式 echo "force" > /sys/class/drm/card0-HDMI-A-1/force_hdmi_20调整EDID读取:
# 增加EDID读取超时 echo 500 > /sys/module/drm/parameters/edid_read_timeout_ms# 启用HDMI 8声道输出 echo "plug:hdmi:CARD=PCH,DEV=0 channels=8" > ~/.asoundrc # 查看HDMI音频能力 cat /sys/class/drm/card0-HDMI-A-1/eld#| 特性 | Linux 4.19 | Linux 5.10 |
|---|---|---|
| HDMI版本 | 1.4/2.0基础 | HDMI 2.0完全 |
| CEC框架 | 实验性 | 标准化 |
| HDCP支持 | 1.x为主 | HDCP 2.2 |
| 设备树支持 | 部分 | 完整 |
| HDR支持 | 无 | 静态HDR |
硬件平台:Rockchip RK3399 EVB
关键代码:
// drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c static const struct dw_hdmi_plat_data rk3399_hdmi_drv_data = { .mode_valid = dw_hdmi_rockchip_mode_valid, .get_eld = dw_hdmi_rockchip_get_eld, .get_hpd = dw_hdmi_rockchip_get_hpd, .phy_data = &rk3399_phy_data, }; static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master, void *data) { struct drm_device *drm = data; struct dw_hdmi_plat_data *plat_data; plat_data = devm_kzalloc(dev, sizeof(*plat_data), GFP_KERNEL); *plat_data = rk3399_hdmi_drv_data; return dw_hdmi_bind(dev, drm, plat_data); }设备树配置:
&dwc_hdmi { status = "okay"; ddc-i2c-bus = <&i2c3>; cec-i2c-bus = <&i2c4>; rockchip,grf = <&grf>; port { hdmi_in: endpoint { remote-endpoint = <&vopb_out_hdmi>; }; }; };现象:无法输出4K@60Hz
原因:
解决方案:
# 强制HDMI 2.0模式 echo "force" > /sys/class/drm/card0-HDMI-A-1/force_hdmi_20 # 检查FRL状态 cat /sys/kernel/debug/dri/0/bridge/hdmi/frl_status现象:电视遥控器无法控制设备
原因:
解决方案:
# 设置CEC物理地址 echo 1.0.0.0 > /sys/class/cec/cec0/phys_addr # 启用CEC监听 echo 1 > /sys/class/cec/cec0/monitor_alldrivers/gpu/drm/bridge/,drivers/media/cec/