先看dtsi
aw2013@45 {
compatible = "awinic,aw2013";
reg = <0x45>;
vdd-supply = <&pm8909_l17>;
vcc-supply = <&pm8909_l6>;
aw2013,red {
aw2013,name = "red";
aw2013,id = <0>;
/*linux,default-trigger = "battery-charging";*/
linux,default-trigger = "none";
aw2013,max-brightness = <20>;
aw2013,max-current = <1>;
aw2013,rise-time-ms = <3>;
aw2013,hold-time-ms = <3>;
aw2013,fall-time-ms = <2>;
aw2013,off-time-ms = <2>;
};
probe函数:
1.ret = aw_2013_check_chipid(led_array);
2.ret = aw2013_led_parse_child_node(led_array, node);
3.ret = aw2013_power_init(led_array, true);
1.检查芯片是否正常,通过一次读写操作 aw2013_write()
2. 解析出子节点,并会添加一个队列,注册设备,创建一个组
INIT_WORK(&led->brightness_work, aw2013_brightness_work);
led->cdev.brightness_set = aw2013_set_brightness;
rc = led_classdev_register(&led->client->dev, &led->cdev);
if (rc) {
dev_err(&led->client->dev,
"unable to register led %d,rc=%d\n",
led->id, rc);
goto free_pdata;
}
rc = sysfs_create_group(&led->cdev.dev->kobj,
&aw2013_led_attr_group);
if (rc) {
dev_err(&led->client->dev, "led sysfs rc: %d\n", rc);
goto free_class;
}
led->cdev.brightness_set会调用到aw2013_set_brightness,得到brightness,并且开始前面的队列函数
aw2013_brightness_work开始写入亮度值。
aw2013_led_attr_group,这个group创建了两个节点blink和led_time,aw2013_led_time_store函数会去调用aw2013_led_blink_set使之闪烁。
static DEVICE_ATTR(blink, 0664, NULL, aw2013_store_blink);
static DEVICE_ATTR(led_time, 0664, aw2013_led_time_show, aw2013_led_time_store);
static struct attribute *aw2013_led_attributes[] = {
&dev_attr_blink.attr,
&dev_attr_led_time.attr,
NULL,
};
3.给芯片上电。