android中device_attr 设备属性节点 以备后用

1. 在sys下创建一个节点

static ssize_t gsensor_vendor_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{	
	char  val;	
	//val = simple_strtoul(buf, NULL, 10);	
	sscanf(buf, "%d", &val);
	if(val == 0)
	{		
		gpio_set_value(MMA8452_CON_PIN, 0);	
	}
	else
	{		
		gpio_set_value(MMA8452_CON_PIN, 1);	
	}	
	return strlen(buf);
}

static DEVICE_ATTR(vendor, 0777, gsensor_vendor_show, gsensor_vendor_store);

static struct kobject *android_gsensor_kobj;

static int gsensor_sysfs_init(void)
{
	int ret ;

	android_gsensor_kobj = kobject_create_and_add("android_gsensor", NULL);
	if (android_gsensor_kobj == NULL) {
		mmaprintk(KERN_ERR
		       "MMA8452 gsensor_sysfs_init:"\
		       "subsystem_register failed\n");
		ret = -ENOMEM;
		goto err;
	}

	ret = sysfs_create_file(android_gsensor_kobj, &dev_attr_vendor.attr);   // "vendor"
	if (ret) {
		mmaprintk(KERN_ERR
		       "MMA8452 gsensor_sysfs_init:"\
		       "sysfs_create_group failed\n");
		goto err4;
	}

	return 0 ;
err4:
	kobject_del(android_gsensor_kobj);
err:
	return ret ;
}

2.创建一个设备节点

ssize_t led_3g_green_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
	u8 val;
	val = simple_strtoul(buf, NULL, 10);
	if(val == 0){
		gpio_set_value(MX53_HMS_3G_LED_GREEN_EN, 0);
	}else{
		gpio_set_value(MX53_HMS_3G_LED_GREEN_EN, 1);
	}
	return count;
}

ssize_t led_3g_green_show(struct device *dev, struct device_attribute *attr, char *buf)
{
	sprintf(buf, "%d\n", gpio_get_value(MX53_HMS_3G_LED_GREEN_EN));
	return strlen(buf);
}

ssize_t led_3g_amber_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
	u8 val;
	val = simple_strtoul(buf, NULL, 10);
	if(val == 0){
		gpio_set_value(MX53_HMS_3G_LED_AMBER_EN, 0);
	}else{
		gpio_set_value(MX53_HMS_3G_LED_AMBER_EN, 1);
	}
	return count;
}

ssize_t led_3g_amber_show(struct device *dev, struct device_attribute *attr, char *buf)
{
	sprintf(buf, "%d\n", gpio_get_value(MX53_HMS_3G_LED_AMBER_EN));
	return strlen(buf);
}

static DEVICE_ATTR(led_3g_green, S_IRUGO|S_IWUSR, led_3g_green_show, led_3g_green_store);
static DEVICE_ATTR(led_3g_amber, S_IRUGO|S_IWUSR, led_3g_amber_show, led_3g_amber_store);

static struct attribute* leds_mxc_gpio_attrs[] = 
{
	&dev_attr_led_3g_green.attr,
	&dev_attr_led_3g_amber.attr,
	NULL 
};
	
static const struct attribute_group leds_mxc_gpio_group =
{
	.attrs = leds_mxc_gpio_attrs,
};


result = sysfs_create_group(&drv_data->pdev->dev.kobj, &leds_mxc_gpio_group);
	if (result) {
		dev_err(&pdev->dev, "Create device file failed! ERRNO: %d\n",result);
		goto free_drv_data;
	}

以上两种方法创建的节点,通过串口,能够进行读写的操作。


你可能感兴趣的:(android中device_attr 设备属性节点 以备后用)