您尚未登录。

楼主 # 2022-06-15 11:18:56

jkl
会员
注册时间: 2019-11-18
已发帖子: 269
积分: 152.5

全志tina,display驱动模块中dev_fb.c文件中,Fb_map_kernel_logo函数中:

display驱动模块中dev_fb.c文件中,Fb_map_kernel_logo函数中:
paddr = bootlogo_addr; =====》 这个地址从哪里得到呀,那来的呀??

static int Fb_map_kernel_logo(u32 sel, struct fb_info *info)
{

void *vaddr = NULL;
uintptr_t paddr = 0;
void screen_offset = NULL, image_offset = NULL;
char *tmp_buffer = NULL;
char *bmp_data = NULL;
struct sunxi_bmp_store s_bmp_info;
struct sunxi_bmp_store *bmp_info = &s_bmp_info;
struct bmp_pad_header bmp_pad_header;
struct bmp_header *bmp_header;
int zero_num = 0;
unsigned int x, y, bmp_bpix, fb_width, fb_height;
unsigned int effective_width, effective_height;
uintptr_t offset;
int i = 0;
struct disp_manager *mgr;

mgr = g_disp_drv.mgr[sel];

paddr = bootlogo_addr; =====》 这个地址从哪里得到呀,那来的呀??
if (paddr == 0) {
__inf("Fb_map_kernel_logo failed!");
return Fb_copy_boot_fb(sel, info);
}
printk("%s%d%s\n",__FILE__,__LINE__,__FUNCTION__);
/ parser bmp header /
offset = paddr & ~PAGE_MASK;
vaddr = (void *)Fb_map_kernel(paddr, sizeof(struct bmp_header));
if (vaddr == NULL) {
__wrn("fb_map_kernel failed, paddr=0x%p,size=0x%x\n",
(void *)paddr, (unsigned int)sizeof(struct bmp_header));
return -1;
}

memcpy(&bmp_pad_header.signature[0], vaddr + offset,
sizeof(struct bmp_header));
bmp_header = (struct bmp_header *) &bmp_pad_header.signature[0];
if ((bmp_header->signature[0] != 'B')
|| (bmp_header->signature[1] != 'M')) {
Fb_unmap_kernel(vaddr);
#if defined(CONFIG_DECOMPRESS_LZMA)
return lzma_decode(paddr, info);
#else
__wrn("this is not a bmp picture.\n");
return -1;

#endif
}

bmp_bpix = bmp_header->bit_count / 8;

if ((bmp_bpix != 3) && (bmp_bpix != 4))
return -1;

x = bmp_header->width;
y = (bmp_header->height & 0x80000000) ? (-bmp_header->
height) : (bmp_header->height);

if (bmp_bpix == 3) {
zero_num = (4 - ((3 * x) % 4)) & 3;
#ifndef SUPPORT_ROTATE
/uboot have removed zero for us/
zero_num = 0;
#endif
}
fb_width = info->var.xres;
fb_height = info->var.yres;
if ((paddr <= 0) || x <= 1 || y <= 1) {
__wrn("kernel logo para error!\n");
return -EINVAL;
}

bmp_info->x = x;
bmp_info->y = y;
bmp_info->bit = bmp_header->bit_count;
bmp_info->buffer = (void *__force)(info->screen_base);

if (bmp_bpix == 3)
info->var.bits_per_pixel = 24;
else if (bmp_bpix == 4)
info->var.bits_per_pixel = 32;
else
info->var.bits_per_pixel = 32;

Fb_unmap_kernel(vaddr);
printk("%s%d%s\n",__FILE__,__LINE__,__FUNCTION__);
/ map the total bmp buffer /
vaddr =
(void *)Fb_map_kernel(paddr,
(x bmp_bpix + zero_num) y + sizeof(struct bmp_header));
if (vaddr == NULL) {
__wrn("fb_map_kernel failed, paddr=0x%p,size=0x%x\n",
(void *)paddr,
(unsigned int)(x y bmp_bpix +
sizeof(struct bmp_header)));
return -1;
}

tmp_buffer = (char *)bmp_info->buffer;
screen_offset = (void *)bmp_info->buffer;
bmp_data = (char *)(vaddr + bmp_header->data_offset);
image_offset = (void *)bmp_data;
effective_width = (fb_width < x) ? fb_width : x;
effective_height = (fb_height < y) ? fb_height : y;

if (bmp_header->height & 0x80000000) {
#if defined(SUPPORT_ROTATE)
if (info->var.bits_per_pixel == 24) {
screen_offset =
(void )((void __force)info->screen_base +
(fb_width * (abs(fb_height - y) / 2)

  • abs(fb_width - x) / 2)

  • 4);
    rgb24_to_rgb32(image_offset, bmp_header, info,
    screen_offset, zero_num);
    } else
    #endif
    {
    screen_offset =
    (void )((void __force)info->screen_base +
    (fb_width * (abs(fb_height - y) / 2)

  • abs(fb_width - x) / 2)

  • (info->var.bits_per_pixel >> 3));
    for (i = 0; i < effective_height; i++) {
    memcpy((void *)screen_offset, image_offset,
    effective_width *
    (info->var.bits_per_pixel >> 3));
    screen_offset =
    (void )(screen_offset + fb_width
    (info->var.bits_per_pixel >> 3));
    image_offset =
    (void *)image_offset +
    x * (info->var.bits_per_pixel >> 3);
    }
    }

} else {

#if defined(SUPPORT_ROTATE)
if (info->var.bits_per_pixel == 24) {
screen_offset =
(void )((void __force)info->screen_base +
(fb_width * (abs(fb_height - y) / 2)

  • abs(fb_width - x) / 2)

  • 4);

image_offset =
(void *)bmp_data +
(effective_height - 1) (x 3 + zero_num);
rgb24_to_rgb32(image_offset, bmp_header, info,
screen_offset, zero_num);
} else
#endif
{
screen_offset =
(void )((void __force)info->screen_base +
(fb_width * (abs(fb_height - y) / 2)

  • abs(fb_width - x) / 2)

  • (info->var.bits_per_pixel >> 3));

image_offset =
(void *)bmp_data + (effective_height -
1) x
(info->var.bits_per_pixel >> 3);
for (i = effective_height - 1; i >= 0; i--) {
memcpy((void *)screen_offset, image_offset,
effective_width *
(info->var.bits_per_pixel >> 3));
screen_offset =
(void *)(screen_offset +
fb_width *
(info->var.bits_per_pixel >> 3));
image_offset =
(void *)bmp_data +
i x (info->var.bits_per_pixel >> 3);
}
}
}

Fb_unmap_kernel(vaddr);

return 0;
}

离线

#1 2022-06-15 13:45:12

jjldc
会员
注册时间: 2022-02-18
已发帖子: 21
积分: 46

Re: 全志tina,display驱动模块中dev_fb.c文件中,Fb_map_kernel_logo函数中:

uboot在bootm还是disp_bmp的时候,会更新fdt里的/soc/disp下面属性,会更新bootargs启动参数,显存地址和大小好像是通过bootargs传递给内核的

离线

楼主 #2 2022-06-15 14:26:22

jkl
会员
注册时间: 2019-11-18
已发帖子: 269
积分: 152.5

Re: 全志tina,display驱动模块中dev_fb.c文件中,Fb_map_kernel_logo函数中:

jjldc wrote:

uboot在bootm还是disp_bmp的时候,会更新fdt里的/soc/disp下面属性,会更新bootargs启动参数,显存地址和大小好像是通过bootargs传递给内核的

这个地址该怎样去确定,就是这个地址的值怎样去确定呢?bmp图片放置的地址
我看display驱动模块里面,logo的显示就是在这一块实现的

最近编辑记录 jkl (2022-06-15 14:30:38)

离线

#3 2022-06-16 08:56:53

jjldc
会员
注册时间: 2022-02-18
已发帖子: 21
积分: 46

Re: 全志tina,display驱动模块中dev_fb.c文件中,Fb_map_kernel_logo函数中:

@jkl
好像是uboot自动分配的地址

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn


东莞哇酷科技有限公司开发