一、设备树节点添加
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--