背光驱动模型也是基于HDF框架开发的,整个框架如下:
现在以RK3568为例,来看看PWM背光整个驱动,这里使用的是PWM占空比控制的背光,默认基于hdf的pwm驱动已经OK!
需要注意的是:这里是基于HDF实现的PWM和PWM背光,所以Linux内核里面原生的PWM和PWM背光相关配置需要关闭
hcs
device_info
CODE
display :: host {hostName = "display_host";device_pwm_bl :: device {device0 :: deviceNode {policy = 0;priority = 95;preload = 0;moduleName = "PWM_BL";deviceMatchAttr = "pwm_bl_dev";}}device_backlight :: device {device0 :: deviceNode {policy = 2;priority = 90;preload = 0;permission = 0660;moduleName = "HDF_BL";serviceName = "hdf_bl";}}
}
config
lcd_config.hcs
CODE
root {backlightConfig {pwmBacklightConfig {match_attr = "pwm_bl_dev";pwmDevNum = 1;pwmMaxPeriod = 25000;backlightDevName = "hdf_pwm";minBrightness = 0;defBrightness = 127;maxBrightness = 255;}}
}
源码分析
PWM_BL驱动
PWM_BL驱动(pwm_bl.c)加载后在初始化时主要做了如下几个工作:
//初始化相关PWM模块,主要包括打开相应pwm模块,从hcs获取pwm的配置,并更新配置,
//主要调用pwm相关的驱动接口,如PwmOpen,PwmSetConfig等
ret = BlPwmDevInit(object, blPwmDev);//注册Backlight设备,具体实现在后面的HDF_BL驱动,这里最重要的就是注册的操作函数集 g_blDevOps,后面有展开
blDev = RegisterBlDev(blPwmDev->name, &blPwmDev->props, &g_blDevOps, blPwmDev);//更新Backlight状态
if (UpdateBacklightState(blDev, FB_POWER_ON) != HDF_SUCCESS) {HDF_LOGE("%s: UpdateBacklightState fail", __func__);
}//更新Backlight亮度
if (UpdateBrightness(blDev, blPwmDev->props.defBrightness) != HDF_SUCCESS) {HDF_LOGE("%s: UpdateBrightness fail", __func__);
}
g_blDevOps函数集,里面只有一个更新亮度的操作函数,该函数会调用更底层的pwm的HDF驱动接口去更新PWM的占空比,从而控制背光的亮度,具体如下:
static int32_t BlPwmUpdateBrightness(struct BacklightDev *blDev, uint32_t brightness)
{int32_t ret;uint32_t duty;struct BlPwmDev *blPwmDev = NULL;blPwmDev = ToBlDevPriv(blDev);if (blPwmDev == NULL) {HDF_LOGE("%s blPwmDev is null", __func__);return HDF_FAILURE;}if (blPwmDev->props.maxBrightness == 0) {HDF_LOGE("%s maxBrightness is 0", __func__);return HDF_FAILURE;}if (brightness == 0) {return PwmDisable(blPwmDev->pwmHandle);}duty = (brightness * blPwmDev->config.period) / blPwmDev->props.maxBrightness;ret = PwmSetDuty(blPwmDev->pwmHandle, duty);if (ret != HDF_SUCCESS) {HDF_LOGE("%s: PwmSetDuty failed, ret %d", __func__, ret);return HDF_FAILURE;}return PwmEnable(blPwmDev->pwmHandle);
}static struct BacklightOps g_blDevOps = {.updateBrightness = BlPwmUpdateBrightness,
};
HDF_BL驱动
HDF_BL驱动(hdf_bl.c)功能主要有2大块:
对外提供IoService的 Dispatch 接口
主要涉及到一些对外命令的处理,包括:
static BlCmdHandle g_blDevCmdHandle[] = {HdfGetMinBrightness, /*获取最小亮度*/HdfGetCurrBrightness, /*获取当前亮度*/HdfGetDefBrightness, /*获取默认亮度*/HdfGetMaxBrightness, /*获取最大亮度*/HdfGetBlDevList, /*获取背光设备列表*/HdfSetBrightness, /*设置亮度*/};
RegisterBlDev()函数实现
主要是 BlDevManager 和 BacklightDev 的内存分配,赋值等,这里就略过了。
本文主要是对鸿蒙南向开发当中的部分技术解析,更多的鸿蒙OpenHarmony南北向开发技术可以前往主页查找,更多鸿蒙技术分布如下:(略缩图)
高清完整版可前往主页或思信。附文档