summaryrefslogtreecommitdiff
path: root/common/wmt_display/env_parse.c
diff options
context:
space:
mode:
authorKevin2014-11-15 11:48:36 +0800
committerKevin2014-11-15 11:48:36 +0800
commitd04075478d378d9e15f3e1abfd14b0bd124077d4 (patch)
tree733dd964582f388b9e3e367c249946cd32a2851f /common/wmt_display/env_parse.c
downloadFOSSEE-netbook-uboot-source-d04075478d378d9e15f3e1abfd14b0bd124077d4.tar.gz
FOSSEE-netbook-uboot-source-d04075478d378d9e15f3e1abfd14b0bd124077d4.tar.bz2
FOSSEE-netbook-uboot-source-d04075478d378d9e15f3e1abfd14b0bd124077d4.zip
init commit via android 4.4 uboot
Diffstat (limited to 'common/wmt_display/env_parse.c')
-rwxr-xr-xcommon/wmt_display/env_parse.c398
1 files changed, 398 insertions, 0 deletions
diff --git a/common/wmt_display/env_parse.c b/common/wmt_display/env_parse.c
new file mode 100755
index 0000000..17953b7
--- /dev/null
+++ b/common/wmt_display/env_parse.c
@@ -0,0 +1,398 @@
+/*++
+Copyright (c) 2010 WonderMedia Technologies, Inc.
+
+This program is free software: you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free Software
+Foundation, either version 2 of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+PARTICULAR PURPOSE. See the GNU General Public License for more details. You
+should have received a copy of the GNU General Public License along with this
+program. If not, see http://www.gnu.org/licenses/>.
+
+WonderMedia Technologies, Inc.
+4F, 531, Chung-Cheng Road, Hsin-Tien, Taipei 231, R.O.C.
+--*/
+
+#include <config.h>
+#include <common.h>
+#include <command.h>
+#include <version.h>
+#include <stdarg.h>
+#include <linux/types.h>
+#include <devices.h>
+#include <linux/stddef.h>
+#include <asm/byteorder.h>
+
+#include "lcd.h"
+#include "wmt_display.h"
+
+#if 0
+int parse_display_params(char *name,long *ps)
+{
+ enum
+ {
+ idx_vout,
+ idx_op1,
+ idx_op2,
+ idx_resx,
+ idx_resy,
+ idx_fps_pixclk,
+ idx_max
+ };
+
+ char *p;
+// long ps[idx_max];
+ char * endp;
+ int i = 0;
+
+ p = getenv(name);
+ if (!p) {
+ printf("please set %s\n", name);
+ return -1;
+ } else
+ printf("display param (setting): %s\n", p);
+
+ while (i < idx_max) {
+ ps[i++] = simple_strtoul(p, &endp, 10);
+ if (*endp == '\0')
+ break;
+ p = endp + 1;
+
+ if (*p == '\0')
+ break;
+ }
+
+ if (i != idx_max) {
+ printf("display param Error: need %d arg count, but get %d\n", idx_max, i);
+ return -1;
+ }
+ return 0;
+}
+#endif
+
+int parse_gpio_operation(char *name)
+{
+ enum
+ {
+ idx_id,
+ idx_act,
+ idx_bitmap,
+ idx_ctl,
+ idx_oc,
+ idx_od,
+ idx_max
+ };
+
+ char *p;
+ long ps[idx_max];
+ char * endp;
+ int i = 0;
+
+ p = getenv(name);
+ if (!p) {
+ printf("please set %s , for lcd power control pin\n", name);
+ return -1;
+ } else
+ printf("lcd power control pin (setting): %s\n", p);
+
+ while (i < idx_max) {
+ ps[i++] = simple_strtoul(p, &endp, 16);
+ if (*endp == '\0')
+ break;
+ p = endp + 1;
+
+ if (*p == '\0')
+ break;
+ }
+ g_lcd_pw_pin.id = ps[0];
+ g_lcd_pw_pin.act = ps[1];
+ g_lcd_pw_pin.bitmap = ps[2];
+ g_lcd_pw_pin.ctl = ps[3];
+ g_lcd_pw_pin.oc = ps[4];
+ g_lcd_pw_pin.od = ps[5];
+ return 0;
+}
+
+int parse_gpio_param(const char *name, struct gpio_param_t *p_gpio_pin)
+{
+ enum
+ {
+ idx_flag,
+ idx_gpiono,
+ idx_act,
+ idx_max
+ };
+
+ char *p;
+ long ps[idx_max] = {0};
+ char * endp;
+ int i = 0;
+
+ memset(p_gpio_pin, 0, sizeof(struct gpio_param_t));
+
+ p = getenv(name);
+ if (!p)
+ return -1;
+
+ //printf("parse_gpio_param: %s\n", p);
+
+ while (i < idx_max) {
+ ps[i++] = simple_strtoul(p, &endp, 10);
+
+ if (*endp == '\0')
+ break;
+ p = endp + 1;
+
+ if (*p == '\0')
+ break;
+ }
+ p_gpio_pin->flag = ps[0];
+ p_gpio_pin->gpiono = ps[1];
+ p_gpio_pin->act = ps[2];
+
+ return 0;
+}
+
+#if 0
+int parse_display_tmr(char *name)
+{
+ enum
+ {
+ idx_pixel_clock,
+ idx_option,
+ idx_hsync,
+ idx_hbp,
+ idx_hpixel,
+ idx_hfp,
+ idx_vsync,
+ idx_vbp,
+ idx_vpixel,
+ idx_vfp,
+ idx_max
+ };
+
+ char *p;
+ long ps[idx_max];
+ char * endp;
+ int i = 0;
+
+ p = getenv(name);
+ if (!p) {
+ printf("please set %s , for timing setting\n", name);
+ return -1;
+ } else
+ printf("display tmr (setting): %s\n", p);
+
+ g_display_vaild &= ~TMRFROMENV;
+ while (i < idx_max) {
+ ps[i++] = simple_strtoul(p, &endp, 10);
+ if (*endp == '\0')
+ break;
+ p = endp + 1;
+
+ if (*p == '\0')
+ break;
+ }
+
+ if (i != idx_max) {
+ printf("display tmr Error: need %d arg count, but get %d\n", idx_max, i);
+ return -1;
+ }
+
+ g_display_tmr.pixel_clock = ps[idx_pixel_clock]*1000;
+ g_display_tmr.option = ps[idx_option];
+
+ g_display_tmr.hsync = ps[idx_hsync];
+ g_display_tmr.hbp = ps[idx_hbp];
+ g_display_tmr.hpixel = ps[idx_hpixel];
+ g_display_tmr.hfp = ps[idx_hfp];
+
+ g_display_tmr.vsync = ps[idx_vsync];
+ g_display_tmr.vbp = ps[idx_vbp];
+ g_display_tmr.vpixel = ps[idx_vpixel];
+ g_display_tmr.vfp = ps[idx_vfp];
+
+ g_display_vaild |= TMRFROMENV;
+
+ return 0;
+}
+#endif
+
+#ifdef CONFIG_VPP_SHENZHEN
+int parse_backlight_params(void)
+{
+ enum {
+ idx_pwm_no,
+ idx_invert,
+ idx_gpio, /* switch */
+ idx_active,
+ idx_max,
+ };
+
+ char *p;
+ long ps[idx_max] = { 0, 0, -1, 0 };
+ char *endp;
+ int i = 0;
+ static char env[] = "wmt.backlight.param";
+
+ p = getenv(env);
+ if (!p) {
+ printf("please set %s\n", env);
+ return -1;
+ }
+
+ while (i < idx_max) {
+ ps[i++] = simple_strtoul(p, &endp, 10);
+
+ if (*endp == '\0')
+ break;
+ p = endp + 1;
+
+ if (*p == '\0')
+ break;
+ }
+
+ memset(&g_backlight_param, 0, sizeof(g_backlight_param));
+ g_backlight_param.pwm_no = ps[0];
+ g_backlight_param.invert = ps[1];
+ g_backlight_param.gpio = ps[2];
+ g_backlight_param.active = ps[3];
+
+ printf("backlight: pwmno %d, invert %d, gpio %d, active %d\n",
+ g_backlight_param.pwm_no, g_backlight_param.invert,
+ g_backlight_param.gpio, g_backlight_param.active);
+
+ return 0;
+}
+#endif
+
+/*
+ val is used if setting comes from command , like
+ #display setpwm 0:2000:75
+ otherwise , we get pwm setting from env ("name")
+*/
+int parse_pwm_params(char *name, char *val)
+{
+ //pwmparam: no,scalar,period,duty
+ //comment:
+ // no: PWM no. Range: 0 ~ 3
+ // scalar: PWM scalar. Range: 1 ~ 1024
+ // period: PWM period. Range: 1 ~ 4096
+ // duty: PWM duty. Range: 1 ~ 4096
+ // -- Note: All PWM parameters are denoted using decimal number
+ enum
+ {
+ idx_pwm_no,
+ idx_scalar,
+ idx_period,
+ idx_duty,
+ idx_max
+ };
+
+ long ps[idx_max];
+ char * p;
+ char * p1;
+ char * endp;
+ int i = 0;
+ struct wmt_pwm_setting_t setting;
+
+ g_display_vaild &= ~PWMDEFMASK;
+ g_display_vaild |= PWMDEFTP;
+ g_pwm_setting.pwm_no = 0;
+ g_pwm_setting.scalar = 0;
+ g_pwm_setting.period = 2000;
+ g_pwm_setting.duty = 75;
+
+ if (val == NULL) {
+ p = getenv(name);
+ if (!p) {
+ printf("%s is not found , run PWM param (tp default) = 0:2000:75\n", name);
+ return 0;
+ }
+ } else
+ p = val;
+
+ p1 = p;
+ while (i < idx_max) {
+ if (i == 0)
+ ps[i++] = simple_strtoul(p, &endp, 16);
+ else
+ ps[i++] = simple_strtoul(p, &endp, 10);
+ if (*endp == '\0')
+ break;
+ p = endp + 1;
+
+ if (*p == '\0')
+ break;
+ }
+
+ memset(&setting, 0, sizeof(struct wmt_pwm_setting_t));
+ setting.config = ps[idx_pwm_no];
+ ps[idx_pwm_no] &= 0xf;
+ if (i == idx_duty) { // run as taipei define ( freq , level )
+ //printf("PWM param (tp setting) : freq,level = %s\n", p1);
+ if(ps[idx_pwm_no] >= 0 && ps[idx_pwm_no] <= 3)
+ setting.pwm_no = ps[idx_pwm_no];
+ else {
+ printf("PWM param Error: no = %d, it's range should be 0 ~3\n", ps[idx_pwm_no]);
+ printf("PWM param (tp default) = 0:2000:750\n");
+ return 0;
+ }
+ if (ps[idx_scalar] != 0)
+ setting.period = ps[idx_scalar];
+ else {
+ printf("PWM param error : freq = 0\n");
+ printf("PWM param (tp default) = 0:2000:75\n");
+ return 0;
+ }
+ setting.duty = ps[idx_period];
+ } else if (i == idx_max) {
+ //printf("PWM param (sz setting) : scalar,period,duty = %s\n", p1);
+ g_display_vaild &= ~PWMDEFMASK;
+ g_display_vaild |= PWMDEFSZ;
+ g_pwm_setting.pwm_no = 0;
+ g_pwm_setting.scalar = 319;
+ g_pwm_setting.period = 1000;
+ g_pwm_setting.duty = 750;
+
+ if(ps[idx_pwm_no] >= 0 && ps[idx_pwm_no] <= 3)
+ setting.pwm_no = ps[idx_pwm_no];
+ else {
+ printf("PWM param Error: no = %d, it's range should be 0 ~3\n", ps[idx_pwm_no]);
+ printf("So use defualt PWM param = 0:319:1000:750\n");
+ return 0;
+ }
+
+ if (ps[idx_scalar] > 0 && ps[idx_scalar] <= 1024)
+ setting.scalar = ps[idx_scalar];
+ else {
+ printf("PWM param Error: scalar = %d, it's range should be 1 ~ 1024\n", ps[idx_scalar]);
+ printf("So use defualt PWM param = 0:319:1000:750\n");
+ return 0;
+ }
+
+ if (ps[idx_period] > 0 && ps[idx_period] < 4096)
+ setting.period = ps[idx_period];
+ else {
+ printf("PWM param Error: period = %d, it's range should be 1 ~ 4096\n", ps[idx_period]);
+ printf("So use defualt PWM param = 0:319:1000:750\n");
+ return 0;
+ }
+
+ if (ps[idx_duty] > 0 && ps[idx_duty] < 4096)
+ setting.duty = ps[idx_duty];
+ else {
+ printf("PWM param Error: duty = %d, it's range should be 0 ~ 4096\n", ps[idx_duty]);
+ printf("So use defualt PWM param = 0:319:1000:750\n");
+ return 0;
+ }
+ } else {
+ printf("PWM param Error: need %d arg count, but get %d\n", idx_max, i);
+ printf("PWM param (default) = 0:2000:75 \n");
+ return 0;
+ }
+ memcpy(&g_pwm_setting, &setting, sizeof(struct wmt_pwm_setting_t));
+ return 0;
+}