【VR9项目】DEVICE_ATTR节点读写操作实例

一、设备树节点添加

sun50iw3p1-y2.dts

添加操作的属性节点,这个节点的作用是调节lcd背光的亮度

bright_set{
        compatible = "pico,bright_set"; //与源文件中的compatible对应 
        status = "okay";
};
二、Config文件修改

arch/arm64/configs/sun50iw3p1smp_android_vr_defconfig

这个文件是全志平台针对vr产品的定义配置文件。

CONFIG_BRIGHT_SET=y
drivers/input/Kconfig    内核定义

config BRIGHT_SET
	tristate "viewer bright set driver"
	help
	 bright set driver
drivers/input/Makefile  ,添加源文件编译

obj-$(CONFIG_BRIGHT_SET)	+= brightness_set.o
三、源文件实现
//added by PICO_driver solen.liu for bug25682:add lcd bright set interface--start--
#include <linux/module.h>
#include <linux/gpio.h>
#include <linux/delay.h>
#include <linux/leds.h>
#include <linux/slab.h>
#include <linux/pm.h>
#include <linux/sys_config.h>
#include <linux/pinctrl/consumer.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/platform_device.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <linux/debugfs.h>
#include "../video/sunxi/disp2/disp/lcd/panels.h"

static int bright_set_value;
static ssize_t bright_set_show(struct device *dev,
				     struct device_attribute *attr, char *buf)
{
	char *bright_value;
	pr_err("show bright value\n");
	switch(bright_set_value)
		{
			case 0:	bright_value = "BrightLevel:not set";break;
			case 1:	bright_value = "BrightLevel:1";break;
			case 2: bright_value = "BrightLevel:2";break;
			case 3: bright_value = "BrightLevel:3";break;
			case 4: bright_value = "BrightLevel:4";break;
			default:break;
		}
	return sprintf(buf, "%s\n", bright_value);
}
					
static u32 sel = 0;
static ssize_t bright_set_store(struct device *dev,
				     struct device_attribute *attr, const char *buf, size_t count)
{
		pr_err("bright_set_store buf value = %s",buf);
		if(buf[0] == 0x31){
					 	sunxi_lcd_gpio_set_value(sel, 3, 0);
						sunxi_lcd_gpio_set_value(sel, 4, 0);
						sunxi_lcd_gpio_set_value(sel, 5, 0);
						bright_set_value = 1;
						pr_err("set bright level 1 \n");
		}else if(buf[0] == 0x32){
					    sunxi_lcd_gpio_set_value(sel, 3, 1);
						sunxi_lcd_gpio_set_value(sel, 4, 0);
						sunxi_lcd_gpio_set_value(sel, 5, 0);
						bright_set_value = 2;
						pr_err("set bright level 2 \n");
		}else if(buf[0] == 0x33){
					 	sunxi_lcd_gpio_set_value(sel, 3, 1);
						sunxi_lcd_gpio_set_value(sel, 4, 1);
						sunxi_lcd_gpio_set_value(sel, 5, 0);
						bright_set_value = 3;
						pr_err("set bright level 3 \n");
		}else if(buf[0] == 0x34){
						sunxi_lcd_gpio_set_value(sel, 3, 1);
						sunxi_lcd_gpio_set_value(sel, 4, 1);
						sunxi_lcd_gpio_set_value(sel, 5, 1);
						bright_set_value = 4;
						pr_err("set bright level 4 \n");
		}else{
						sunxi_lcd_gpio_set_value(sel, 3, 0);
						sunxi_lcd_gpio_set_value(sel, 4, 0);
						sunxi_lcd_gpio_set_value(sel, 5, 0);
						bright_set_value = 1;
						pr_err("set bright level default \n");					
		}
	return count;
}

static DEVICE_ATTR(bright_set,0664, bright_set_show,bright_set_store);

static struct attribute *bright_set_attrs[] = {
	&dev_attr_bright_set.attr,
	NULL,
};

static struct attribute_group bright_set_attr_group = {
	.attrs = bright_set_attrs,
};
static int bright_set_probe(struct platform_device *pdev)
{
    struct device_node *np = pdev->dev.of_node;
    int ret = 0;
	pr_err("pico,bright set probe start !\n");
	int error = sysfs_create_group(&pdev->dev.kobj, &bright_set_attr_group);
	if (error)	{
		pr_err("Unable to start bright set, error: %d\n", error);
	}
	return 0;
}

static int bright_set_remove(struct platform_device *pdev)
{
	pr_err("bright_set remove !\n");
	return 0;
}

static const struct of_device_id bright_set_id[] = {
	{ .compatible "pico,bright_set", },
	{}
};

MODULE_DEVICE_TABLE(of, bright_set_id);

static struct platform_driver bright_set_driver = {
	.probe		= bright_set_probe,
	.remove		= bright_set_remove,
	.driver	    = {
                ,name = "pico,bright_set",
		.owner  = THIS_MODULE,
        .of_match_table = of_match_ptr(bright_set_id),
	},
};

module_platform_driver(bright_set_driver);

MODULE_AUTHOR("solen <[email protected]>");
MODULE_DESCRIPTION("viewer bright set driver");
MODULE_LICENSE("GPL v2");
//added by PICO_driver solen.liu for bug25682:add lcd bright set interface--end--










猜你喜欢

转载自blog.csdn.net/musicalspace/article/details/79074939