第一种:会在/sys/bus/platform/drivers/pmic_analog_codec/xxxxxxxx/下创建节点:headset_cur_state。
static DEVICE_ATTR(headset_cur_state, S_IRUGO, headset_cur_state_show, NULL);
static DEVICE_ATTR(pttTest, S_IWUSR|S_IRUGO, pttTest_show, pttTest_store);
static struct device_attribute *wcd_attr_list[] = {
&dev_attr_headset_cur_state,
&dev_attr_pttTest,
};
static int wcd_create_attr(struct device *dev){
int idx, err = 0;
int num = (int)(sizeof(wcd_attr_list)/sizeof(wcd_attr_list[0]));
if (dev == NULL)
return -EINVAL;
for (idx = 0; idx < num; idx++) {
err = device_create_file(dev, wcd_attr_list[idx]);
if (err) {
pr_err("--%s: driver_create_file (%s) = %d\n", __func__, wcd_attr_list[idx]->attr.name, err);
break;
}
}
return err;
}
rc = wcd_create_attr(sdm660_cdc->dev);
if(rc)
pr_err("%s: create attribute failed, rc=%d\n", __func__, rc);
第二种:会在/sys/bus/platform/drivers/pmic_analog_codec/xxxxxxxx/下创建节点:hph_status。
static ssize_t hph_status_show(struct device *dev, struct device_attribute *attr, char *buf)
{
struct sdm660_cdc_priv *pdev = dev_get_drvdata(dev);
pr_debug("--%s: enter pdev->mbhc.hph_status %d \n", __func__,
pdev->mbhc.hph_status);
if(3 == pdev->mbhc.hph_status)
return sprintf(buf, "%d\n", 1);
else
return sprintf(buf, "%d\n", 0);
}
static DEVICE_ATTR(hph_status, 0644, hph_status_show,NULL);
ret = device_create_file(codec->dev, &dev_attr_hph_status);
if (ret != 0) {
dev_err(codec->dev, "Failed to create hph status file: %d\n",
ret);
}
第三种:会在sys/kerne/scanner_led_kobj/下创建节点:scanner_illled。
static struct kobj_attribute foo_attribute =
__ATTR(scanner_illled, 0664, foo_show, foo_store);
static struct attribute *attrs[] = {
&foo_attribute.attr,
NULL,
};
static struct attribute_group attr_group = {
.attrs = attrs,
};
static struct kobject *scanner_led_kobj;
/* Create the files associated with this kobject */
retval = sysfs_create_group(scanner_led_kobj, &attr_group);
if (retval)
kobject_put(scanner_led_kobj);