背光子系统分析笔记(以RK3288-Android7.1 Linux 4.4为例)

当调节设置->显示->亮度时,或者echo xxxx >/sys/class/backlight/backlight/brightness LCD亮度能随着变化,这是怎么实现的呢?
参考:https://blog.csdn.net/weixin_41028621/article/details/103542751
本文记录下分析过程,
设置应用java层操作brightness节点过程,暂不详说,希望能人志士补充.本文重点说驱动层.

brightness节点的生成驱动:kernel/drivers/video/backlight/backlight.c
static int __init backlight_class_init(void)
{
backlight_class = class_create(THIS_MODULE, “backlight”);
backlight_class->dev_groups = bl_device_groups;

}
其中对dev_groups赋值为bl_device_groups,dev_groups是设备的以组 为单位的默认属性,当该设备被添加到内核的时候,会自动添加该默认属性,赋值格式为:设备_groups,因此这里的设备就是bl_device,

接下来必然是为这个组设备指定属性:
static struct attribute *bl_device_attrs[] = {
&dev_attr_bl_power.attr,
&dev_attr_brightness.attr,
&dev_attr_actual_brightness.attr,
&dev_attr_max_brightness.attr,
&dev_attr_type.attr,
NULL,
};
ATTRIBUTE_GROUPS(bl_device);
为/sys/class/backlight/backlight这个设备设备(可以看作为backlight总线)声明了bl_power,brightness,actual_brightness,max_brightness,type这几个属性节点.
这几个节点即/sys/class/backlight/backlight/下的节点.
AT5:/sys/class/backlight/backlight # ls
actual_brightness brightness max_brightness subsystem uevent bl_power device power type
再然后,为每一个属性,定义自己的show和store回调方法,以brightness为例

static ssize_t brightness_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct backlight_device *bd = to_backlight_device(dev);

return sprintf(buf, "%d\n", bd->props.brightness);

}

static ssize_t brightness_store(struct device *dev,
struct device_attribute *attr, const char *buf, size_t count)
{
int rc;
struct backlight_device *bd = to_backlight_device(dev);
unsigned long brightness;
rc = kstrtoul(buf, 0, &brightness);
if (rc)
return rc;
rc = backlight_device_set_brightness(bd, brightness);
return rc ? rc : count;
}
static DEVICE_ATTR_RW(brightness);

DEVICE_ATTR_RW是再DEVICE_ATTR的基础上加了RW,区别与RO,WO,表示可读可写.

echo或者设置java操作brightness节点的时候,会把brightness值传下来,出发这个回调函数执行,然后通告backlight_device_set_brightness()操作具体的硬件控制模块设置背光.这个函数会通过notify,调用时间通知notify注册的回调函数fb_notifier_callback,然后通过backlight_update_status调用具体的硬件驱动的update_status(比如pwm_bl.c里面的pwm_backlight_update_status,这个文件对应于dts中backlight这个硬件驱动)函数更新背光设置.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个可以用于SD卡启动的rk3288-evb-android-act8846-ed.dts示例,仅供参考: ``` /dts-v1/; /include/ "rk3288.dtsi" / { model = "Rockchip RK3288 EVB with act8846 and edp"; chosen { bootargs = "earlyprintk console=ttyS2,115200n8 root=/dev/mmcblk1p2 rw rootwait"; }; memory@60000000 { reg = <0x60000000 0x40000000>; }; reserved-memory { #address-cells = <1>; #size-cells = <1>; ranges; kernel@0 { reg = <0x60000000 0x02000000>; }; reserved@20000000 { reg = <0x20000000 0x20000000>; }; }; aliases { mmc0 = &sdmmc; }; sdmmc: sdmmc@fe310000 { compatible = "rockchip,rk3288-dw-mshc"; reg = <0xfe310000 0x1000>; interrupts = <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cru PCLK_SDMMC0>, <&cru SCLK_SDMMC0>; clock-names = "pclk", "hclk"; dmas = <&pdma 12>, <&pdma 12>; dma-names = "rx", "tx"; pinctrl-0 = <&sdmmc_pins>; pinctrl-names = "default"; status = "okay"; }; sdmmc_pins: sdmmc@0 { rockchip,pins = < RK_GPIO1 1 RK_FUNC_2 RK_GPIO1 2 RK_FUNC_2 RK_GPIO1 3 RK_FUNC_2 RK_GPIO1 4 RK_FUNC_2 RK_GPIO1 5 RK_FUNC_2 RK_GPIO1 6 RK_FUNC_2 RK_GPIO1 7 RK_FUNC_2 RK_GPIO1 8 RK_FUNC_2 >; }; act8846: act8846@5b { compatible = "active-semi,act8846"; reg = <0x5b>; gpio-controller; #gpio-cells = <2>; interrupt-parent = <&gpio1>; interrupts = <14 IRQ_TYPE_EDGE_RISING>; pinctrl-names = "default"; pinctrl-0 = <&act8846_pins>; status = "okay"; }; act8846_pins: act8846@0 { rockchip,pins = < RK_GPIO4 3 RK_FUNC_GPIO RK_GPIO4 4 RK_FUNC_GPIO RK_GPIO4 5 RK_FUNC_GPIO >; }; edp: edp@1c19000 { compatible = "rockchip,rk3288-edp"; reg = <0x01c19000 0x1000>; interrupts = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cru SCLK_EDP>; clock-names = "edp"; status = "okay"; }; backlight: backlight { compatible = "pwm-backlight"; pwms = <&pwm2 0 5000>; brightness-levels = <0 14 28 42 56 70 84 100>; default-brightness-level = <7>; status = "okay"; }; }; ``` 这个示例中,sdmmc节点表示SD卡,act8846节点表示PMIC,edp节点表示eDP显示器接口,backlight节点表示背光控制。其中,bootargs设置了SD卡启动的相关参数。注意,这个示例是根据某个特定的rk3288 EVB开发板进行配置的,如果你的硬件不同,需要进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九月天-深圳专业软硬件开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值