aw2013驱动分析

tech2025-08-22  3

先看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.给芯片上电。

最新回复(0)