解析字符串代码

解析如下字符串 {(0x84c,0x33);(0x850,0x3);(0x854,0x3);}

void am335_usr_pinmux(void)
{
        char *pinmux = getenv("pinmux");
        int i;
#if 0
        for(i=0x800;i<0xa38 ;)
        {
                printf("addr:%x is %x\n",i,__raw_readl(i+0x44e10000));
                i+=4;
        }
#endif
        if (!pinmux){
                printf("get pinmux failed\n");
                return;
        }
        char *s,*p,*e;
        s = p = e = pinmux;
        while(1){
                while(*s++ != '(');
                while(*s == ' '){s++;};

                while(*p++ != ',');
                while(*p == ' '){p++;};

                while(*++e != ')' && *e != '}' && *e != '\0');

                if (*e == '}' || *e == '\0')
                        break;

                unsigned int addr = simple_strtoul(s, NULL, 16);
                unsigned int value = simple_strtoul(p, NULL, 16);
                addr +=0x44e10000;
           //     printf("default pinmux  has %x,val %x\n",addr, value);
                __raw_writel(value, addr);
        }
}
unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base)
功能:将一个字符串转换成unsigend long long型数据。
返回:返回转换后数据。

参数:cp指向字符串的开始,endp指向分析的字符串末尾的位置,base为要用的基数(进制数),base为0表示通过cp来自动判断基数,函数自动可识别的基数:‘0x’表示16进制,‘0’表示8进制,其它都认定为10进制。函数可转换成数字的有效字符为:[0,f]。举例:cp = “0x12str”,base = 0,则返回unsigned long long为18,*endp = “str”。

setenv lcdtimings "{(0x0,0x1e0);(0x1,0x320);(0x2,0x27);(0x3,0x15);(0x4,0x3);(0x5,0x58);(0x6,0x70);(0x7,0x30);(0x8,0x2625a00);}"

+enum{
+//        E_LCD_BPP = 0,
+        E_LCD_H=0,
+        E_LCD_W,
+      //  E_PIXEL_CLOCK_FALLING_EDGE,
+      //  E_VSYNC_LEVEL_LOW,
+      //  E_HSYNC_LEVEL_LOW,
+        E_LCD_VBP,
+        E_LCD_VFP,
+        E_LCD_VSW,
+        E_LCD_HBP,
+        E_LCD_HFP,
+        E_LCD_HSW,
+       E_LCD_PXL_CLK,
+        //E_pll_config1,
+        //E_pll_config2,
+        E_LCDEND,
+};

void da8xx_video_init(const struct da8xx_panel *panel,
                      const struct lcd_ctrl_config *lcd_cfg, int bits_pixel)
{
        struct da8xx_panel usr_panel;
        unsigned int lcdtiming[E_LCDEND]={0};
        char *timing = getenv("lcdtimings");
        if (!timing){
                printf("get lcdtimings failed\n");
                lcd_panel = panel;
#if 0
                printf("lcd name is %s\n",lcd_panel->name);
                printf("lcd height is %x\n",lcd_panel->height);
                printf("lcd width is %x\n",lcd_panel->width);
                printf("lcd vbp is %x\n",lcd_panel->vbp);
                printf("lcd vfp is %x\n",lcd_panel->vfp);
                printf("lcd vsw is %x\n",lcd_panel->vsw);
                printf("lcd hbp is %x\n",lcd_panel->hbp);
                printf("lcd hfp is %x\n",lcd_panel->hfp);
                printf("lcd hsw is %x\n",lcd_panel->hsw);
                printf("lcd pxl_clk is %x\n",lcd_panel->pxl_clk);
                printf("lcd invert_pxl_clk is %x\n",lcd_panel->invert_pxl_clk);
#endif
        }
        else{

                char *s,*p,*e;
                s = p = e = timing;
                while(1){
                        while(*s++ != '(');
                        while(*s == ' '){s++;};

                        while(*p++ != ',');
                        while(*p == ' '){p++;};

                        while(*++e != ')' && *e != '}' && *e != '\0');

                        if (*e == '}' || *e == '\0')
                        break;

                        unsigned int index = simple_strtoul(s, NULL, 16);
                        unsigned int value = simple_strtoul(p, NULL, 16);
                        lcdtiming[index] = value;
                       // printf("index is %d ,value is %x\n",index,value);
                }   //LCD_BPP = lcdtiming[E_LCD_BPP];
                //      usr_panel.name="usr_lcd";
                        strcpy(usr_panel.name,"usr_lcd");
                        usr_panel.height= lcdtiming[E_LCD_H];
                        usr_panel.width= lcdtiming[E_LCD_W];
                        usr_panel.vbp= lcdtiming[E_LCD_VBP];
                        usr_panel.vfp= lcdtiming[E_LCD_VFP];
                        usr_panel.vsw= lcdtiming[E_LCD_VSW];
                        usr_panel.hbp= lcdtiming[E_LCD_HBP];
                        usr_panel.hfp= lcdtiming[E_LCD_HFP];
                        usr_panel.hsw= lcdtiming[E_LCD_HSW];
                        usr_panel.pxl_clk=lcdtiming[E_LCD_PXL_CLK];
                        usr_panel.invert_pxl_clk=0;

                lcd_panel = &usr_panel;
                udelay(100000);
#if 0
                printf("lcd name is %s\n",lcd_panel->name);
                printf("lcd height is %x\n",lcd_panel->height);
                printf("lcd width is %x\n",lcd_panel->width);
                printf("lcd vbp is %x\n",lcd_panel->vbp);
                printf("lcd vfp is %x\n",lcd_panel->vfp);
                printf("lcd vsw is %x\n",lcd_panel->vsw);
                printf("lcd hbp is %x\n",lcd_panel->hbp);
                printf("lcd hfp is %x\n",lcd_panel->hfp);
                printf("lcd hsw is %x\n",lcd_panel->hsw);
                printf("lcd pxl_clk is %x\n",lcd_panel->pxl_clk);
                printf("lcd invert_pxl_clk is %x\n",lcd_panel->invert_pxl_clk);
#endif
        }
        da8xx_lcd_cfg = lcd_cfg;
        bits_x_pixel = bits_pixel;
}、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值