内核版本:Linux version 4.9.56
驱动文件:lichee\linux-4.9\drivers\video\backlight\backlight.c
控制背光的来源:应用访问、事件联动、休眠唤醒

一、驱动初始化
/sys/class/backlight/xxx/type
/sys/class/backlight/xxx/bl_power
/sys/class/backlight/xxx/brightness
/sys/class/backlight/xxx/max_brightness
/sys/class/backlight/xxx/actual_brightness
static int __init backlight_class_init(void)
{
// 创建背光设备逻辑类: /sys/class/backlight
backlight_class = class_create(THIS_MODULE, "backlight");
if (IS_ERR(backlight_class)) {
pr_warn("Unable to create backlight class; errno = %ld\n", PTR_ERR(backlight_class));
return PTR_ERR(backlight_class);
}
// 面对应用层提供统一的设备节点入口(预先设置好节点名称和可读写权限)
backlight_class->dev_groups = bl_device_groups;
// 监听系统的休眠唤醒回调
backlight_class->pm = &backlight_class_dev_pm_ops;
// 初始化背光设备链表,用于被外部驱动查询获取
INIT_LIST_HEAD(&backlight_dev_list);
mutex_init(&backlight_dev_list_mutex);
// 初始化内核通知链, 用于通知驱动层背光设备注册或卸载事件
BLOCKING_INIT_NOTIFIER_HEAD(&backlight_notifier);
return 0;
}
直接搜索源码是找不到 bl_device_groups 关键词的,实际该变量是通过宏进行定义
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);
宏定义:include\linux\sysfs.h
#define __ATTRIBUTE_GROUPS(_name) \
static const struct attribute_group *_name##_groups[] = {
\
&_name##_group, \
NULL, \
}
#define ATTRIBUTE_GROUPS(_name) \
static const struct attribute_group _name##_group = {
\
.attrs = _name##_attrs, \
}; \
__ATTRIBUTE_GROUPS(_name)
宏定义展开:ATTRIBUTE_GROUPS(bl_device)
#define __ATTRIBUTE_GROUPS(bl_device) \
static const struct attribute_group *bl_device_groups[] = {
\
&bl_device_group, \
NULL, \
}
#define ATTRIBUTE_GROUPS(bl_device) \
static const struct attribute_group bl_device_group = {
\
.attrs = bl_device_attrs, \
}; \
__ATTRIBUTE_GROUPS(bl_device)
宏替换后的效果
static struct attribute *bl_device_attrs[