aw2013驱动分析

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

猜你喜欢

转载自blog.csdn.net/qq_36247447/article/details/108400883