使用论坛里裸跑 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);
}
离线
demo视频如下:
双图层叠加平移测试视频
离线
硬件是 tiny200 r3。
软件是达克罗德大神的裸跑代码:
F1C100S裸奔framebuffer+PWM+GPIO驱动
http://whycan.com/t_1457.html
(出处:哇酷开发者社区【全志 V3S/F1C100s/X3】)
离线
看寄存器说明是全图层alpha 公用一个alpha参数。
不过图层可以不和lcd尺寸一样,这样可以利用多个图层设置不同尺寸大小实现局部的alpha效果。
离线
花了几天时间,裸机 RGB接口LCD显示、SPI,ADC-key,音频ADC,GPIO。都调通了。I2C / PWM 也简单。
准备把CSI调一下,裸机的外设就基本齐全了。准备把外设代码参考stm的方式 重新改一遍,做一套裸机库。
准备做个产品板,大家一起的看看想做成什么样的东西来玩。
离线
请教楼主,colorkey能用吗?
可以用。不过这个代码没有。我在其他代码试过了
离线