您尚未登录。

楼主 #1 2020-10-22 12:06:56

sjshe3326
会员
注册时间: 2020-10-19
已发帖子: 125
积分: 69.5

F1C100S裸跑实现硬件多图层叠加和Alpha

使用论坛里裸跑 Framebuffer,原始代码只使用了Display Engine种back-end模块的Layer0图层.使用外部2个vbuf作为缓存。
DEbe可以支持4个图层的alpha和叠加等操作。这里测试了下,使用2个图层Layer0 和 Layer1。关闭alpha,只用了叠加(color key)。
效果参考视频。

修改部分主要是 f1c100s_debe_set_mode 函数设置Debe的模式,就可以了。

inline static void f1c100s_debe_set_mode(fb_f1c100s_pdata_t * pdat)
{
	struct f1c100s_debe_reg_t * debe = (struct f1c100s_debe_reg_t *)(pdat->virtdebe);
	uint32_t val;
        
    // F1C200s DEbe模块使用双图层 //
    
    // 是能 DEbe模块 //
	val = read32((virtual_addr_t)&debe->mode);
	val |= (1 << 0);
	write32((virtual_addr_t)&debe->mode, val);
    
    // 显示尺寸 //
	write32((virtual_addr_t)&debe->disp_size, (((pdat->height) - 1) << 16) | (((pdat->width) - 1) << 0));

    // 背景颜色 //
	write32((virtual_addr_t)&debe->backcolor, (0x00503050) );
    
    // 颜色KEY //
	write32((virtual_addr_t)&debe->color_key_max, (0x00FFFFFF) );
	write32((virtual_addr_t)&debe->color_key_min, (0x00303030) );	
	write32((virtual_addr_t)&debe->color_key_config, (0x0000003F) );	
			
	// Layer0 设置 //
	write32((virtual_addr_t)&debe->layer0_size, (((pdat->height) - 1) << 16) | (((pdat->width) - 1) << 0));     // Layer0 尺寸 pos默认0//
	write32((virtual_addr_t)&debe->layer0_stride, ((pdat->width) << 5));                                        // Layer0 帧缓存行尺寸 480*32//
	write32((virtual_addr_t)&debe->layer0_addr_low32b, (uint32_t)(pdat->vram[0]) << 3);                         // Layer0 帧缓存地址 //
	write32((virtual_addr_t)&debe->layer0_addr_high4b, (uint32_t)(pdat->vram[0]) >> 29);
	write32((virtual_addr_t)&debe->layer0_attr1_ctrl, 0x09 << 8);                                               // Layer0 32BPP//
	write32((virtual_addr_t)&debe->layer0_attr0_ctrl, (0x80 << 24) | (0 << 18) | (1 << 15) | (3 << 10) | (0) );// Layer0 Pipe1 优先级3/
	
    // Layer1 设置 //
	write32((virtual_addr_t)&debe->layer1_size, (((pdat->height) - 1) << 16) | (((pdat->width) - 1) << 0));     // Layer1 尺寸 pos默认0//
	write32((virtual_addr_t)&debe->layer1_stride, ((pdat->width) << 5));                                        // Layer1 帧缓存行尺寸 480*32//
	write32((virtual_addr_t)&debe->layer1_addr_low32b, (uint32_t)(pdat->vram[1]) << 3);                         // Layer1 帧缓存地址 //
	write32((virtual_addr_t)&debe->layer1_addr_high4b, (uint32_t)(pdat->vram[1]) >> 29);
	write32((virtual_addr_t)&debe->layer1_attr1_ctrl, 0x09 << 8);                                               // Layer1 32BPP//
	write32((virtual_addr_t)&debe->layer1_attr0_ctrl, (0xF0 << 24) | (1 << 18) | (0 << 15) | (2 << 10) | (0) );// Layer1 Pipe0 优先级2/


		
    // Layer 0/1 使能 //
	val = read32((virtual_addr_t)&debe->mode);
	val |= (1 << 8);        // Layer 0
    val |= (1 << 9);        // Layer 1
	write32((virtual_addr_t)&debe->mode, val);

    // Auto load mode //
	val = read32((virtual_addr_t)&debe->reg_ctrl);
	val |= (1 << 0);
	write32((virtual_addr_t)&debe->reg_ctrl, val);
    
    // start DEbe //
	val = read32((virtual_addr_t)&debe->mode);
	val |= (1 << 1);
	write32((virtual_addr_t)&debe->mode, val);
}

离线

楼主 #2 2020-10-22 12:13:53

sjshe3326
会员
注册时间: 2020-10-19
已发帖子: 125
积分: 69.5

Re: F1C100S裸跑实现硬件多图层叠加和Alpha

离线

楼主 #4 2020-10-22 18:33:07

sjshe3326
会员
注册时间: 2020-10-19
已发帖子: 125
积分: 69.5

Re: F1C100S裸跑实现硬件多图层叠加和Alpha

硬件是 tiny200 r3。
软件是达克罗德大神的裸跑代码:
F1C100S裸奔framebuffer+PWM+GPIO驱动
http://whycan.com/t_1457.html
(出处:哇酷开发者社区【全志 V3S/F1C100s/X3】)

离线

楼主 #7 2020-10-23 09:04:12

sjshe3326
会员
注册时间: 2020-10-19
已发帖子: 125
积分: 69.5

Re: F1C100S裸跑实现硬件多图层叠加和Alpha

看寄存器说明是全图层alpha  公用一个alpha参数。
不过图层可以不和lcd尺寸一样,这样可以利用多个图层设置不同尺寸大小实现局部的alpha效果。

离线

楼主 #10 2020-10-26 13:24:28

sjshe3326
会员
注册时间: 2020-10-19
已发帖子: 125
积分: 69.5

Re: F1C100S裸跑实现硬件多图层叠加和Alpha

花了几天时间,裸机 RGB接口LCD显示、SPI,ADC-key,音频ADC,GPIO。都调通了。I2C / PWM 也简单。
准备把CSI调一下,裸机的外设就基本齐全了。准备把外设代码参考stm的方式 重新改一遍,做一套裸机库。
准备做个产品板,大家一起的看看想做成什么样的东西来玩。

离线

楼主 #23 2023-11-03 18:05:00

sjshe3326
会员
注册时间: 2020-10-19
已发帖子: 125
积分: 69.5

Re: F1C100S裸跑实现硬件多图层叠加和Alpha

nature_hln 说:

请教楼主,colorkey能用吗?

可以用。不过这个代码没有。我在其他代码试过了

离线

页脚

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

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