led設備節點添加

說在前面. 最近因爲工作原因,天天在操作和調試led. 是時候寫個總結啦.

在Android機中,一般都會把led設備的節點創建到/sys/class/leds下面. 創建節點的操作通常放在probe函數裏面做.

這個時候需要做的包括:

  • 定義一個struct drvdata(在.h文件中,或者在driver的c文件中都可以),並且在這個結構裏面包含struct led_classdev abc_led;
struct drvdata {
	struct led_classdev abc_led;
};

 

  • 在probe函數中,聲明一個1中的struct drvdata的指針變量drvdata_t,並且把這個變量和driver中的device綁定. 下面是對於i2c設備的操作,其他類型的設備操作類似.
drvdata_t = devm_kzalloc(&client->dev, sizeof(struct drvdata), GFP_KERNEL);
  • 接着就是把這個結構下面的abc_led的成員給填好並且調用函數led_classdev_register.也就是在probe裏面調用下面的函數,當然也可以直接在probe裏面寫函數內容,就是不太好看.
static int abc_led_register(struct device *dev, struct drvdata *data)
{
	data->led.name = "abc_led";

	data->led.brightness = LED_OFF;
	data->led.max_brightness = LED_HALF;
	data->led.default_trigger = "none";
	data->led.brightness_set = abc_led_set;
	data->led.brightness_get = abc_led_get;

	return led_classdev_register(dev, &data->abc_led);
}
  • 之後就是真的節點的註冊了.en,要做好錯誤處理.
err = sysfs_create_group(&drvdata_t->led.dev->kobj, &abc_attr_group);
if (err)
	goto xxx;
  • 接着需要實現的是abc_attr_group結構;
static ssize_t led_on_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
    //TODO: set gpio or send cmd to the device
	return count;
}

static ssize_t led_on_show(struct device *dev, struct device_attribute *attr,char *buf)
{
    //TODO: get gpio value or read from the cmd
	return snprintf(buf, PAGE_SIZE,"%d\n", 0);
}


static DEVICE_ATTR(led_on, 0664, led_on_show, led_on_store);


static struct attribute *abc_attrs[] = {
	&dev_attr_led_on.attr,
	NULL
};

static const struct attribute_group abc_attr_group = {
	.attrs = abc_attrs,
};

上面就可以創建出/sys/class/leds/abc_led/led_on節點了. 當然led_on_show和led_on_store要根據具體情況實現.

另外,需要在remove函數中進行unregister呀.

就是一個簡短的小總結. 邁小步,不停步. 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章