展讯平台lcd读取id适配流程


sp6820平台:(linux2.6)

kernel:

sprdfb_init(void)
    ---> 1fb_get_options("sprdfb", &option)   // get kernel boot parameters
           2sprdfb_setup(option); // 
                ---> get_opt_int(this_opt, "fb0_id", &panel_id[0]); // 取出uboot中传来的IDget_opt_int(this_opt, "fb1_id", &panel_id[1]);
         3lcdc_hardware_init();
         4platform_driver_register(&sprdfb_driver);
                    ---> .probe = sprdfb_probe,
                        ---> sprdfb_probe(struct platform_device *pdev)
     ---> 1))、dev->device_id = panel_id[pdev->id];
          2))、lcdc_early_init(platform_data, dev)
     ---> lcd_adapt = find_adapt_from_uboot(dev->device_id, platform_data)
          device_id == lcd_panel[i].lcd_id   // 判断cfg->lcd_iduboot中传来的是否一致
          return i;
     ---> | lcd_adapt = FAIL--> find_adapt_from_readid(dev,platform_data) /* can not reach here; get device id from u-boot */
          |
         lcd_adapt = OK
          |
        -->mount_panel(dev, lcd_panel[lcd_adapt].panel) 挂接LCD panel的参数到sprdfb_devicedev->panel = panel;
            panel->info.mcu->ops = dev->ops;
            panel->ops->lcd_reset = panel_reset;
            dev->width = panel->width;
            dev->height = panel->height;
            dev->bpp = panel->bpp = 32;
            dev->timing[0] = lcdc_calculate_lcm_timing(timing);
            dev->timing[1] = lcdc_calculate_lcm_timing(timing);
            dev->fb->fix.reserved[0] = 0x6f76;
            dev->fb->fix.reserved[1] = 0x6572;

u-boot:

sc8810fb_probe

—> find_adapt_from_readid(fb)
—>
|
|

|-->

 1、mount_panel(fb,lcd_panel[i].panel); //first ,try mount
     fb->panel = panel;
  panelnfo.mcu->ops = fb->ops;
panel->ops->lcd_reset = panel_reset;
fb->register_timing = lcdc_calc_lcm_timing(timing);
fb->gram_timing = lcdc_calc_lcm_timing(timing);  

     2、hw_init(fb);                        //hw init to every panel

     3、id = fb->panel->ops->lcd_readid(fb->panel); //read id

     4、save_lcd_id_to_kernel(id)
---> lcd_id_to_kernel = id


----------------------

sp7715平台:(linux3.10)

kernel:

    sprdfb_probe
        --- > sprdfb_panel_get(dev)
        ----> 
        __setup("lcd_id=", lcd_id_get);     
        sscanf(&str[2], "%x", &lcd_id_from_uboot);  // get LCD Panel ID from uboot取出uboot中传来的ID1、panel = adapt_panel_from_uboot(dev->dev_id)
        ----> | panel == 0   read id FAIL
                |
            panel != 0
            |-->  list_for_each_entry(cfg, panel_list, list)  // 使用链表遍历cfg
               lcd_id_from_uboot == cfg->lcd_id  // 判断cfg->lcd_id与uboot中传来的是否一致
               return cfg->panel;               

    2、panel_mount(dev, panel);
               ---> dev->panel = panel;
                dev->panel->ops->panel_reset = panel_reset_dispc;   
                panel->if_ctrl->panel_if_mount(dev);

    3、panel_init(dev);

----------------

sp7731平台:(linux3.10)

u-boot:

sprdfb_panel_probe(struct sprdfb_device *dev)
    --- > adapt_panel_from_readid(dev);
    --- > for(i = 0;i<(sizeof(panel_cfg))/(sizeof(panel_cfg[0]));i++) { // 遍历cfg数组
        ret = panel_mount(dev, panel_cfg[i].panel);
            --- > dev->if_ctrl->panel_if_mount(dev);
        id = dev->panel->ops->panel_readid(dev->panel);         // 跑lcd driver readid函数
        if(id == panel_cfg[i].lcd_id) {     // 比较读出的id与cfg数组注册的id


        if(NULL != dev->panel->ops->panel_init){
                dev->panel->ops->panel_init(dev->panel);    // 若是id一致,就跑lcd driver init code
            }

            save_lcd_id_to_kernel(id);              // 保存lcd id值到开机启动参数 bootargs
                --- > lcd_id_to_kernel = id;
                --- > fdt_fixup_lcdid(void *fdt)
                    sprintf(&buf[str_len], "%x", lcd_id);
                    fdt_chosen_bootargs_append(fdt, buf, 1);
                    ( fdt_chosen_bootargs_append(void *fdt, char *append_args, int force) )
                        --- > path = fdt_getprop(fdt, nodeoffset, "bootargs", NULL);
                            --- > sprintf(strargs, "%s", append_args);
                                  fdt_setprop(fdt, nodeoffset, "bootargs", strargs, strlen(strargs) + 1);               
            panel_ready(dev);
            return panel_cfg[i].panel;              // 返回匹配成功的panel结构体地址
        }

kernel:
sprdfb_probe
— > sprdfb_panel_get(dev);
—-> panel = adapt_panel_from_uboot(dev->dev_id); // 取出uboot中传来的ID号

        --- > list_for_each_entry(cfg, panel_list, list) // 比较注册进panel_list 的 lcd的panel_cfg

            if(lcd_id_from_uboot == cfg->lcd_id) {  // 比较bootargs获取的lcd id值与panel_cfg里注册的lcd id值
                    ---->           
                        static int __init lcd_id_get(char *str) // 从启动参数 bootargs里获取适配的lcd id值
                        {
                            if ((str != NULL) && (str[0] == 'I') && (str[1] == 'D')) {
                                sscanf(&str[2], "%x", &lcd_id_from_uboot);
                            }

                            return 1;
                        }
                        __setup("lcd_id=", lcd_id_get);

                sprd_lcd_name=  cfg->lcd_name;

                return cfg->panel;  // 返回匹配成功的panel结构体地址
            }

    if (panel) {    // 匹配了panel
        panel_mount(dev, panel);
        panel_init(dev);            // 跑lcd driver init code
        return true;
    } 
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
展讯平台是一种以展讯公司开发的芯片为核心的平台,该平台广泛应用于移动通信设备中。在使用展讯平台的设备时,需要通过USB接口与计算机进行连接,并安装相应的USB驱动程序。 USB驱动程序是一种用于操作系统与硬件之间进行通信的软件。展讯平台的USB驱动程序主要有以下几个作用: 1. 设备识别与通信:USB驱动程序能够让操作系统正确识别展讯平台设备,并建立起与设备之间的通信通道。通过该通道,计算机可以向设备发送指令,并接收设备返回的数据。 2. 数据传输控制:USB驱动程序还负责控制数据在计算机和展讯平台设备之间的传输。它确保数据的正确传输,并处理可能出现的错误或中断。同时,USB驱动程序还能够管理数据的缓冲区,以提高传输效率。 3. 设备配置与升级:USB驱动程序支持设备的配置和升级功能。通过USB接口,可以对展讯平台设备进行参数设置和固件更新,以满足不同的需求和修复潜在的问题。 4. 兼容性支持:USB驱动程序提供了对不同操作系统的支持,例如Windows、Linux和Mac OS等。它通过与操作系统的适配,使得展讯平台设备在不同环境下都能够正常工作。 总之,展讯平台USB驱动程序是一种重要的软件组件,它能够确保计算机与展讯平台设备之间的正常通信和数据传输。通过USB驱动程序的安装和配置,用户可以方便地使用和管理展讯平台设备,满足不同的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值