主题 : 【tiny4412 uboot】准备将tiny4412+HD700的uboot修改成上电LCD显示 复制链接 | 浏览器收藏 | 打印
......
级别: 新手上路
UID: 98927
精华: 0
发帖: 19
金钱: 95 两
威望: 19 点
贡献值: 0 点
综合积分: 38 分
注册时间: 2013-12-12
最后登录: 2015-12-20
楼主  发表于: 2014-02-13 13:55

 【tiny4412 uboot】准备将tiny4412+HD700的uboot修改成上电LCD显示

  init_panel_info();
  lcd_setcolreg();
  lcd_ctrl_init();
  lcd_enable();
我觉得需要在driver/video/下面建一个tiny4412_fb.c然后根据exynos和HD700的器件手册来填充这些函数和panel_info结构体,是这样的吗?
不过按照这个:http://blog.chinaunix.net/uid-26119896-id-3198905.html 上面说的只需要根据硬件设置好pGD,并且初始化一个GraphicDevice的设备空间就差不多可以了。
这两种方式有什么区别吗?
专业维修手机、电视机、飞机、拖拉机,价格面议。
......
级别: 新手上路
UID: 98927
精华: 0
发帖: 19
金钱: 95 两
威望: 19 点
贡献值: 0 点
综合积分: 38 分
注册时间: 2013-12-12
最后登录: 2015-12-20
1楼  发表于: 2014-02-13 14:23
查看一下driver/video/ati_radeon_fb.c中的video_hw_init()函数,填充了pGD各参数:

void *video_hw_init(void)
{
    GraphicDevice *pGD = (GraphicDevice *) & ctfb;
    u32 *vm;
    char *penv;
    unsigned long t1, hsynch, vsynch;
    int bits_per_pixel, i, tmp, vesa_idx = 0, videomode;
    struct ctfb_res_modes *res_mode;
    struct ctfb_res_modes var_mode;

    rinfo = malloc(sizeof(struct radeonfb_info));

    printf("Video: ");
    if(radeon_probe(rinfo)) {
        printf("No radeon video card found!\n");
        return NULL;
    }

    tmp = 0;

    videomode = CONFIG_SYS_DEFAULT_VIDEO_MODE;
    /* get video mode via environment */
    if ((penv = getenv ("videomode")) != NULL) {
        /* deceide if it is a string */
        if (penv[0] <= '9') {
            videomode = (int) simple_strtoul (penv, NULL, 16);
            tmp = 1;
        }
    } else {
        tmp = 1;
    }
    if (tmp) {
        /* parameter are vesa modes */
        /* search params */
        for (i = 0; i < VESA_MODES_COUNT; i++) {
            if (vesa_modes.vesanr == videomode)
                break;
        }
        if (i == VESA_MODES_COUNT) {
            printf ("no VESA Mode found, switching to mode 0x%x ", CONFIG_SYS_DEFAULT_VIDEO_MODE);
            i = 0;
        }
        res_mode = (struct ctfb_res_modes *) &res_mode_init[vesa_modes.resindex];
        bits_per_pixel = vesa_modes.bits_per_pixel;
        vesa_idx = vesa_modes.resindex;
    } else {
        res_mode = (struct ctfb_res_modes *) &var_mode;
        bits_per_pixel = video_get_params (res_mode, penv);
    }

    /* calculate hsynch and vsynch freq (info only) */
    t1 = (res_mode->left_margin + res_mode->xres +
          res_mode->right_margin + res_mode->hsync_len) / 8;
    t1 *= 8;
    t1 *= res_mode->pixclock;
    t1 /= 1000;
    hsynch = 1000000000L / t1;
    t1 *= (res_mode->upper_margin + res_mode->yres +
           res_mode->lower_margin + res_mode->vsync_len);
    t1 /= 1000;
    vsynch = 1000000000L / t1;

    /* fill in Graphic device struct */
    sprintf (pGD->modeIdent, "%dx%dx%d %ldkHz %ldHz", res_mode->xres,
         res_mode->yres, bits_per_pixel, (hsynch / 1000),
         (vsynch / 1000));
    printf ("%s\n", pGD->modeIdent);
    pGD->winSizeX = res_mode->xres;
    pGD->winSizeY = res_mode->yres;
    pGD->plnSizeX = res_mode->xres;
    pGD->plnSizeY = res_mode->yres;

    switch (bits_per_pixel) {
    case 24:
        pGD->gdfBytesPP = 4;
        pGD->gdfIndex = GDF_32BIT_X888RGB;
        if (res_mode->xres == 800) {
            pGD->winSizeX = 832;
            pGD->plnSizeX = 832;
        }
        break;
    case 16:
        pGD->gdfBytesPP = 2;
        pGD->gdfIndex = GDF_16BIT_565RGB;
        if (res_mode->xres == 800) {
            pGD->winSizeX = 896;
            pGD->plnSizeX = 896;
        }
        break;
    default:
        if (res_mode->xres == 800) {
            pGD->winSizeX = 1024;
            pGD->plnSizeX = 1024;
        }
        pGD->gdfBytesPP = 1;
        pGD->gdfIndex = GDF__8BIT_INDEX;
        break;
    }

    pGD->isaBase = CONFIG_SYS_ISA_IO_BASE_ADDRESS;
    pGD->pciBase = (unsigned int)rinfo->fb_base;
    pGD->frameAdrs = (unsigned int)rinfo->fb_base;
    pGD->memSize = 64 * 1024 * 1024;

    /* Cursor Start Address */
    pGD->dprBase = (pGD->winSizeX * pGD->winSizeY * pGD->gdfBytesPP) +
        (unsigned int)rinfo->fb_base;
    if ((pGD->dprBase & 0x0fff) != 0) {
        /* allign it */
        pGD->dprBase &= 0xfffff000;
        pGD->dprBase += 0x00001000;
    }
    DPRINT ("Cursor Start %x Pattern Start %x\n", pGD->dprBase,
        PATTERN_ADR);
    pGD->vprBase = (unsigned int)rinfo->fb_base;    /* Dummy */
    pGD->cprBase = (unsigned int)rinfo->fb_base;    /* Dummy */
    /* set up Hardware */

    /* Clear video memory (only visible screen area) */
    i = pGD->winSizeX * pGD->winSizeY * pGD->gdfBytesPP / 4;
    vm = (unsigned int *) pGD->pciBase;
    while (i--)
        *vm++ = 0;
    /*SetDrawingEngine (bits_per_pixel);*/

    if (rinfo->family == CHIP_FAMILY_RV280)
        radeon_setmode_9200(vesa_idx, bits_per_pixel);
    else
        radeon_setmode();

    return ((void *) pGD);
}
专业维修手机、电视机、飞机、拖拉机,价格面议。
级别: 新手上路
UID: 87849
精华: 0
发帖: 30
金钱: 150 两
威望: 30 点
贡献值: 0 点
综合积分: 60 分
注册时间: 2013-02-27
最后登录: 2019-05-06
2楼  发表于: 2014-02-24 11:07
请教下:你能用自己的uboot,而不用自带的superboot.bin,,启动开发板吗????我用uboot for tiny4412的源码也不可以。
级别: 新手上路
UID: 97988
精华: 0
发帖: 13
金钱: 65 两
威望: 13 点
贡献值: 0 点
综合积分: 26 分
注册时间: 2013-11-12
最后登录: 2017-05-30
3楼  发表于: 2014-04-26 17:29
你好!我也想试试,怎么实现uboot中增加LCD的功能,但由于以前是做硬件的,现在一点也不通,不知道你实现了没有,能不能给个指导?非常感谢!
级别: 新手上路
UID: 104488
精华: 0
发帖: 10
金钱: 50 两
威望: 10 点
贡献值: 0 点
综合积分: 20 分
注册时间: 2014-05-26
最后登录: 2017-09-13
4楼  发表于: 2014-06-06 09:32

 回 2楼(460769013) 的帖子

我的也是用光盘里面的uboot启动不了系统啊。
级别: 新手上路
UID: 104488
精华: 0
发帖: 10
金钱: 50 两
威望: 10 点
贡献值: 0 点
综合积分: 20 分
注册时间: 2014-05-26
最后登录: 2017-09-13
5楼  发表于: 2014-06-11 10:15
居然是内核trustzone的问题,把这项的配置去掉之后就OK了。不懂为什么,希望碰见这个问题的朋友可以验证一下,已经可以启动了。但是问题是不知道为什么这个trustzone配置会影响。