rk3576--- HDMI CEC唤醒
文章目录
- 一、CEC唤醒的相关概念
- 二、CEC唤醒实现
- (一)内核配置
- (二)设备树dts
- (三)驱动注册中断
- (四)休眠后开启MCU
- (五)验证
一、CEC唤醒的相关概念
CEC 是一种在 HDMI 设备之间进行通信的协议,允许用户通过一个遥控器控制多个设备
- 注:确保设备支持cec功能
二、CEC唤醒实现
(一)内核配置
打开内核下述的配置
CONFIG_DRM_DW_HDMI_CEC=y
检查dw-hdmi-cec.c文件是否被编译生成.o文件
(二)设备树dts
需要配置HDMI CEC引脚:
在休眠状态下设置为GPIO功能,在唤醒状态下设置为休眠状态
设备树示例(根据实际引脚进行修改)
&pinctrl {/* 定义 CEC 功能的引脚配置 */cec_pins: cec-pins {rockchip,pins =/* hdmi_cec */<0 RK_PC2 9 &pcfg_pull_none>;};/* 定义 GPIO 功能的引脚配置 */cec_gpio_pins: cec-gpio-pins {rockchip,pins =/* hdmi_cec */<0 RK_PC2 0 &pcfg_pull_none>;};
};/* 定义 HDMI 节点 */
&hdmi {/* 引脚控制属性 */pinctrl-names = "default","shutdown";pinctrl-0 = <&cec_pins &hdmi_tx_scl &hdmi_tx_sda>;pinctrl-1 = <&cec_gpio_pins>;
};
(三)驱动注册中断
在休眠之前注册CEC引脚的中断,我是在dw_hdmi-rockchip.c文件中注册的中断
- 注:注意辨别在休眠时调用的是dw_hdmi_rockchip_shutdown还是dw_hdmi_rockchip_suspend
此处以dw_hdmi_rockchip_shutdown为例
static void dw_hdmi_rockchip_shutdown(struct platform_device *pdev)
{......hdmi->cec_gpio = devm_gpiod_get(&pdev->dev, "cec", 0);if (IS_ERR(hdmi->cec_gpio)) dev_err(&pdev->dev, "******Failed to get cec_gpio\n");hdmi->irq = gpiod_to_irq(hdmi->cec_gpio);if (hdmi->irq < 0)dev_err(&pdev->dev, "******Failed to register interrupt\n");ret = devm_request_threaded_irq(&pdev->dev, hdmi->irq, NULL, cec_shutdown_threaded_handler,IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT,"hdmi_cec_intp", NULL);if (ret)dev_err(&pdev->dev, "******Failed to request INTP threaded IRQ: %d", ret);.....
}
(四)休眠后开启MCU
修改 ./rkbin/RK3576TRUST.ini 文件(根据具体平台而异)
设置加载的bin文件以及elf文件
(五)验证
重新编译验证
屏幕关机时,开发板进入休眠;
屏幕开机时,开发板唤醒。