使用论坛里裸跑 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】)
离线
不错不错,裸机又完善一步了。
离线
感谢分享!请问双图层支持pixel级别alpha还是全局alpha?
离线
看寄存器说明是全图层alpha 公用一个alpha参数。
不过图层可以不和lcd尺寸一样,这样可以利用多个图层设置不同尺寸大小实现局部的alpha效果。
离线
楼主我看手册上有个yuv输出到layer层显示的,不知道那个你有没有看下。如果这功能可以的话,直接上个摄像头扫描到LCD上显示就很快了。
离线
优秀!我也要移一下学习一下;
离线
花了几天时间,裸机 RGB接口LCD显示、SPI,ADC-key,音频ADC,GPIO。都调通了。I2C / PWM 也简单。
准备把CSI调一下,裸机的外设就基本齐全了。准备把外设代码参考stm的方式 重新改一遍,做一套裸机库。
准备做个产品板,大家一起的看看想做成什么样的东西来玩。
离线
如果能开源就好咯
离线
mark
离线
这个貌似只能跑轻量级的OS。毕竟RAM就64MB。要是IC自带大一点的RAM就好了。例如512MB或者1GMB。那样就可以玩安卓
离线
不过好像一般IC都不会自带大的RAM,要么是自带一个小的,要么是不自带,需要外挂。
离线
全志H3、A33都是不自带,需要外挂。全志V3S、F1CX00S就是都自带一个比较小的。
离线
不知道alpha功能能不能移植到LVGL上?
离线
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/
write32((virtual_addr_t)&debe->layer0_addr_low32b, (uint32_t)(pdat->vram[0]) << 3);
帧缓存地址中的地址是DRAM地址吗?
最近编辑记录 bigbat (2022-02-24 12:05:07)
离线
请教楼主,colorkey能用吗?
离线
楼主,这个是开的双缓冲吗?
离线
请教楼主,colorkey能用吗?
可以用。不过这个代码没有。我在其他代码试过了
离线
4个图层吧,双缓冲也不行了
楼主,这个是开的双缓冲吗?
离线
color key是什么东东
离线